{"version":3,"sources":["node_modules/browser-pack/_prelude.js","../../../../../node_modules/es6-promise/dist/es6-promise.js","modules/about-community-sources/about-community-sources.js","modules/about-nav/about-nav.js","modules/about-purpose-carousel/about-purpose-carousel.js","modules/about-sources-map/about-sources-map.js","modules/alert/alert.js","modules/back-to-top/back-to-top.js","modules/blog-categories/blog-categories.js","modules/carousel/carousel.js","modules/dom/dom.js","modules/footer/footer.js","modules/header/header.js","modules/home-products-slider/home-products-slider.js","modules/image/image.js","modules/job-content/job-content.js","modules/local-nav/local-nav.js","modules/page-hero-full/page-hero-full.js","modules/page-hero-slider/page-hero-slider.js","modules/page-modal/page-modal.js","modules/page-rich-photo-block/page-rich-photo-block.js","modules/paginate-load-more/paginate-load-more.js","modules/product-info/product-info.js","modules/product-listing/product-listing.js","modules/product-picker/product-picker.js","modules/store-locator/store-locator.js","modules/utils/utils.js","node_modules/array-uniq/index.js","node_modules/debounce/index.js","node_modules/desandro-matches-selector/matches-selector.js","node_modules/ev-emitter/ev-emitter.js","node_modules/fizzy-ui-utils/utils.js","node_modules/flickity/js/add-remove-cell.js","node_modules/flickity/js/animate.js","node_modules/flickity/js/cell.js","node_modules/flickity/js/drag.js","node_modules/flickity/js/flickity.js","node_modules/flickity/js/index.js","node_modules/flickity/js/lazyload.js","node_modules/flickity/js/page-dots.js","node_modules/flickity/js/player.js","node_modules/flickity/js/prev-next-button.js","node_modules/flickity/js/slide.js","node_modules/form-serialize/index.js","node_modules/get-size/get-size.js","node_modules/html5-history-api/history.js","node_modules/layzr.js/dist/layzr.js","node_modules/number-is-nan/index.js","node_modules/process/browser.js","node_modules/srcset/index.js","node_modules/tap-listener/tap-listener.js","node_modules/tweezer.js/dist/tweezer.js","node_modules/ua-parser-js/src/ua-parser.js","node_modules/unidragger/unidragger.js","node_modules/unipointer/unipointer.js","scripts/src/components/hero-slider.js","scripts/src/components/product-type-picker.js","scripts/src/components/scroll-nav.js","scripts/src/lib/device.js","scripts/src/lib/form-error.js","scripts/src/lib/form-tooltip.js","scripts/src/lib/load-images.js","scripts/src/lib/page-history.js","scripts/src/lib/page-modules.js","scripts/src/lib/parallax.js","scripts/src/lib/scroll-events.js","scripts/src/lib/svg-shapes.js","scripts/src/lib/text-effects.js","scripts/src/main.js","scripts/vendor/jquery.fittext.js","scripts/vendor/vein-modified.js"],"names":["global","factory","exports","module","define","amd","ES6Promise","this","objectOrFunction","x","type","isFunction","setScheduler","scheduleFn","customSchedulerFn","setAsap","asapFn","asap","useVertxTimer","vertxNext","flush","useSetTimeout","globalSetTimeout","setTimeout","i","len","callback","queue","undefined","then","onFulfillment","onRejection","_arguments","arguments","parent","child","constructor","noop","PROMISE_ID","makePromise","_state","invokeCallback","_result","subscribe","resolve$1","object","Constructor","promise","resolve","selfFulfillment","TypeError","cannotReturnOwn","getThen","error","GET_THEN_ERROR","tryThen","then$$1","value","fulfillmentHandler","rejectionHandler","call","e","handleForeignThenable","thenable","sealed","fulfill","reason","reject","_label","handleOwnThenable","FULFILLED","REJECTED","handleMaybeThenable","maybeThenable","publishRejection","_onerror","publish","PENDING","_subscribers","length","subscribers","settled","detail","ErrorObject","tryCatch","TRY_CATCH_ERROR","hasCallback","succeeded","failed","initializePromise","resolver","nextId","id","Enumerator$1","input","_instanceConstructor","isArray","_remaining","Array","_enumerate","validationError","Error","all$1","entries","race$1","_","reject$1","needsResolver","needsNew","Promise$2","polyfill$1","local","self","Function","P","Promise","promiseToString","Object","prototype","toString","cast","_isArray","arg","scheduleFlush","browserWindow","window","browserGlobal","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","isNode","process","isWorker","Uint8ClampedArray","importScripts","MessageChannel","nextTick","iterations","observer","node","document","createTextNode","observe","characterData","data","channel","port1","onmessage","port2","postMessage","require","r","vertx","runOnLoop","runOnContext","Math","random","substring","_eachEntry","entry","c","resolve$$1","_then","_settledAt","_willSettleAt","state","enumerator","all","race","_setScheduler","_setAsap","_asap","catch","polyfill","$","HeroSlider","AboutCommunitySources","el","$el","$tabs","find","$slider","slider","on","sizeBackground","bind","introHeight","outerHeight","css","top","AboutNav","$nav","$targets","empty","append","each","index","link","attr","$t","add","scrollNav","ScrollNav","offset","pathArray","location","pathname","split","filter","scrollPos","animate","scrollTop","event","target","sectionBottom","is","showLocalNav","localNavShowing","hasClass","removeClass","trigger","addClass","preventDefault","currentTarget","closest","Device","isDefinitelyMobile","innerWidth","scrollY","scrollTo","$select","val","click","$a","title","PageHistory","replaceState","first","AboutPurposeSlideshow","$slides","Modernizr","csstransforms3d","device","browser","nextSlide","prevSlide","reset","$prevOut","$prev","$active","$next","$nextUp","$nextNextUp","next","updateControls","$nextPrevOut","prev","removeAttr","AboutSourcesMap","$map","modal_content","loadContent","loadSourceModal","content","products","loadSourceContent","loadSourceProducts","ajax","url","SiteVars","success","response","html","Alert","t","body","header","querySelector","main","getElementsByTagName","closeButton","activeClass","init","open","updateOffset","addEventListener","close","classList","remove","style","paddingTop","clientHeight","BackToTop","one","$scroll","console","log","BlogCategories","$picker","href","_flickity","_dom","_utils","PROP_SETTINGS","parseSettings","pipe","getData","string","JSON","parse","returnFalse","defaults","prevNextButtons","pageDots","settings","args","_extends","_flickity2","default","_tweezer","_es6Promise","curry","className","els","map","appendChild","appendHtml","insertAdjacentHTML","createNodes","wrapper","createElement","getChildren","setStyle","k","v","hide","getStyle","getComputedStyle","getHeight","getProp","getScrollTop","documentElement","pageYOffset","contains","_getAttribute","name","getAttribute","setAttribute","_getData","setData","_on","handler","capture","matches","selector","Element","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","apply","partial","onPassive","passive","_domLoaded","attachEvent","readyState","ready","f","whileDo","parentNode","_delegate","matchedElement","delegate","toggleClass","toggle","select","selectAll","makeArray","querySelectorAll","getParent","getTopPosition","_tweezer2","start","end","setProp","begin","triggerReflow","doesSupportObjectFit","keys","reduce","support","prop","test","eventName","CustomEvent","some","createEvent","initCustomEvent","dispatchEvent","tag","createScriptTag","src","async","defer","loadScript","onload","onerror","Footer","pintrk","bg","layers","showLayers","hideLayers","$input","$submit","Email_Merge0","Email_WebSignup","openWindow","fbq","l","TweenLite","fromTo","y","rotation","delay","ease","Back","easeOut","killTweensOf","Header","$body","$bar","children","$search","$searchField","$searchToggle","stopPropagation","focus","initBackground","$bgWrap","$bg","$bgImg","$li","height","transform","position","ProductTypePicker","HomeProductsSlider","picker","_layzr","instance","_layzr2","threshold","disableObjectFit","closestWrapper","setBgImg","objectFit","loaded","img","update","check","handlers","JobContent","$headerBar","infoTop","$target","indexOf","LocalNav","$info","PageHeroFull","$video","$mute","$contentArea","play","fitText","PageHeroSlider","$indicators","PageModal","$modal","$dim","show","resize","sizeModal","PageRichPhotoBlock","PaginateLoadMore","$button","ajaxSelector","anchor","$currentContent","get","$newDoc","parseHTML","$newContent","$newButton","ProductInfo","$this","$content","slideUp","slideDown","ProductListing","$form","$products","$grid","$filteredOut","clearFilters","performFilter","gtmTrackEvent","updateAvailableFilters","clearing","serialize","$results","getFilteredProducts","appendTo","not","checked","testFilter","removeAttribute","filters","hash","filterSelector","tax","join","inputType","tagName","toLowerCase","parentElement","push","ProductPicker","productInfo","initialID","$curProduct","onClickProduct","updateNav","checkProductPosition","$product","showProductInfo","onStateChange","history","replaceProductInfo","replaceWith","$activeTarget","siblings","$activeThumb","text","thumbnailSrc","resourceSection","getElementsByClassName","resourceImage","background-image","replace","$navButtonContainer","$localNavButton","clone","StoreLocator","currentPage","submitted","activateResult","noResults","bounds","google","maps","LatLngBounds","markers","getVisible","extend","getPosition","googlemap","fitBounds","paginate","dir","page","vein","$showResults","slice","initMarkers","moveHeading","inject","$header","$h","clearListeners","addListener","floor","panTo","setIcon","scaledSize","Size","Point","wpsl_locator","mappin","returnTrue","identity","_len","_key","concat","allPass","fs","_len2","_key2","anyPass","_len3","_key3","cond","pairs","_len4","_key4","ifElse","p","fT","fF","when","arr","_len5","_key5","_len6","funcs","_key6","_this","acc","always","obj","lt","b","a","_staggerCallback","initial","step","items","item","staggerCallback","tryer","catcher","_len7","_key7","pred","fn","divide","multiply","inArray","array","nth","last","_add1ToLast","range","from","to","_toConsumableArray","flipArgs","arg1","arg2","count","arrayLike","logWrap","_len8","_key8","logArgs","_len9","_key9","debounce","wait","context","timeout","callbackArgs","later","clearTimeout","uniqNoSet","ret","uniqSet","seen","Set","has","uniqSetWithForEach","forEach","doesForEachActuallyWork","func","immediate","Date","now","timestamp","result","debounced","callNow","clear","matchesMethod","ElemProto","prefixes","prefix","method","elem","EvEmitter","proto","listener","events","_events","listeners","once","onceEvents","_onceEvents","off","splice","emitEvent","onceListeners","allOff","fizzyUIUtils","utils","modulo","num","div","ary","removeFrom","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","timeoutName","docReady","toDashed","str","match","$1","$2","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","dataOptionsAttr","jQuery","options","Flickity","getCellsFragment","cells","fragment","createDocumentFragment","cell","element","insert","_makeCells","isAppend","insertCellElement","insertBefore","endCells","_sizeCells","selectedIndexDelta","selectedIndex","_cellAddedRemoved","prepend","getCells","changedCellIndex","max","min","slides","cellChange","cellSizeChange","getCell","getSize","isPositioningSlider","prevSlideableWidth","slideableWidth","_positionCells","_getWrapShiftCells","setGallerySize","freeScroll","deltaX","cellAlign","positionSlider","positionSliderAtSelected","animatePrototype","requestAnimationFrame","webkitRequestAnimationFrame","lastTime","currTime","getTime","timeToCall","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","settle","transformProperty","wrapAround","shiftWrapCells","cursorPosition","rightToLeft","getPositionValue","firstSlide","positionX","progress","slidesWidth","selectedSlide","percentPosition","round","size","isPointerDown","isFreeScrolling","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","shift","cellShift","wrapShift","outerWidth","_unshiftCells","velocity","getFrictionFactor","applyForce","force","getRestingPosition","dragVelocity","dragX","dragForce","distance","selectedAttraction","Cell","create","destroy","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","width","removeChild","Unidragger","getCanPointerDown","isTouchStart","isTouchPointer","pointerType","isFocusNode","focusNodes","nodeName","getScrollPosition","pageXOffset","draggable","dragThreshold","createMethods","_touchActionValue","isTouch","isTouchmoveScrollCanceled","_createDrag","bindDrag","_uiChangeDrag","_childUIPointerDownDrag","unbindDrag","isDragBound","handles","viewport","bindHandles","unbindHandles","pointerDownFocus","cursorNodes","TEXTAREA","INPUT","OPTION","clickTypes","radio","checkbox","button","submit","image","file","pointerDown","pointer","pointerIdentifier","_dragPointerDown","focused","activeElement","blur","_bindPostStartEvents","pointerDownScroll","canPointerDown","accessibility","prevScrollY","SELECT","canPreventDefaultOnPointerDown","hasDragStarted","moveVector","abs","pointerUp","isTouchScrolling","_dragPointerUp","pointerDone","removeEventListener","dragStart","dragStartPosition","pointerMove","_dragPointerMove","_dragMove","dragMove","previousDragX","direction","originBound","endBound","getLastSlide","dragMoveTime","dragEnd","dragEndRestingSelect","restingX","dragEndBoostSelect","isDragSelect","getSlideDistance","positiveResting","_getClosestResting","negativeResting","increment","minDistance","Infinity","condition","contain","d","md","isWrapAround","slideIndex","slide","wrap","delta","staticClick","clickedCell","getParentCell","cellElem","cellIndex","onscroll","scroll","scrollMoveX","scrollMoveY","_pointerDone","Slide","_Flickity","moveElements","toElem","queryElement","flickityGUID","instances","option","$element","_create","GUID","freeScrollFriction","friction","namespaceJQueryEvents","guid","_createSlider","watchCSS","activate","opts","isActive","_filterFindCellElements","reloadCells","tabIndex","initialIndex","isInitActivated","cellSelector","positionCells","getLastCell","maxCellHeight","cellX","startCell","updateSlides","_containSlides","isOriginLeft","nextMargin","canCellFit","_getCanCellFit","addCell","slideWidth","firstMargin","updateSelectedSlide","groupCells","number","parseInt","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","center","left","right","shorthand","adaptiveHeight","gapX","_getGapCells","isRightToLeft","beginMargin","endMargin","contentWidth","isContentSmaller","beginBound","emitArgs","$event","jQEvent","Event","isWrap","isInstant","_wrapSelect","wrapIndex","backWrapDelta","forewardWrapDelta","previous","unselectSelectedSlide","selectedCells","selectedElements","getCellElements","selectedCell","selectedElement","unselect","selectCell","getAdjacentCellElements","adjCount","cellElems","uiChange","childUIPointerDown","onresize","deactivate","onkeydown","keyCode","leftMethod","rightMethod","removeData","bridget","setJQuery","jq","getCellLazyImages","imgs","LazyLoader","flickity","load","_createLazyload","lazyLoad","lazyImages","lazyCellImages","complete","TapListener","PageDots","holder","dots","onTap","setDots","bindTap","addDots","removeDots","newDots","dot","updateSelected","selectedDot","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","visibilityEvent","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","hiddenProperty","isPageHidden","tick","time","autoPlay","stop","pause","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","PrevNextButton","getArrowMovements","shape","x0","x1","y1","x2","y2","x3","svgURI","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","createElementNS","path","pathMovements","arrowShape","onclick","enable","disabled","lastIndex","boundIndex","_createPrevNextButtons","prevButton","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","lastCell","lastMargin","changeSelectedClass","form","serializer","hash_serializer","str_serialize","elements","radio_store","k_r_success_contrls","k_r_submitter","key","selectOptions","isSelectedOptions","j","selected","is_array_key","has_array_brackets","array_brackets_regex","existing","has_object_brackets","extract_from_brackets","encodeURIComponent","object_brackets_regex","matches_between_brackets","regex","RegExp","exec","brackeks_prefix_regex","matches_between","getStyleSize","parseFloat","isNaN","getZeroSize","innerHeight","measurementsLength","measurements","logError","setup","isSetup","padding","borderStyle","borderWidth","boxSizing","isBoxSizeOuter","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","message","requirejs","rndKey","onError","err","emptyFunction","parseURL","isWindowLocation","isNotAPI","re","windowLocation","isSupportHistoryAPI","protocol","host","current","base","_pathname","_protocol","_host","_search","anchorElement","search","relative","nohash","_href","_hostname","_port","_hash","_relative","_nohash","_special","storageInitialize","sessionStorage","setItem","sessionStorageKey","removeItem","_e_","getItem","cookie","pop","historyObject","stringify","stateStorage","addEvent","eventNamePrefix","redefineProperty","descriptor","onWrapped","testOnly","set","isDefinedSetter","isDefinedGetter","configurable","defineProperty","__defineGetter__","__defineSetter__","originalValue","removeEvent","onpopstate","triggerEventsInWindowAttributes","temp","getPrototypeOf","prepareDescriptorsForObject","locationDescriptors","eventsList","list","eventObject","eventType","props","onhashchange","dispatch","firePopState","o","createEventObject","initEvent","fireInitialState","isFireInitialState","changeState","lastURLValue","lastURL","isUsedHistoryLocationFlag","urlObject","isSupportStateObjectInHistory","onHashChange","fireNow","checkUrlForPopState","oldURLObject","newURLObject","oldURL","newURL","onLoad","noScroll","scrollToAnchorId","locationObject","anchorTarget","onAnchorClick","srcElement","defaultPrevented","returnValue","expect","getElementById","rect","getBoundingClientRect","scrollLeft","clientTop","customOrigin","windowHistory","historyPushState","pushState","historyReplaceState","ua","navigator","userAgent","addEventListenerName","removeEventListenerName","dispatchEventName","basepath","redirect","lastTitle","eventsDescriptors","fastFixChrome","isNeedFix","historyDescriptors","assign","reload","flag","origin","hostname","port","scripts","hasOwnProperty","n","substr","Layzr","source","knot","_once","emit","cache","extended","getLoc","requestScroll","prevLoc","requestFrame","ticking","getOffset","inViewport","viewTop","viewBot","windowHeight","nodeTop","nodeBot","setSource","srcset","hasAttribute","retina","dpr","normal","action","nodes","devicePixelRatio","screen","deviceXDPI","logicalXDPI","Number","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","runClearTimeout","marker","cachedClearTimeout","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","run","Item","env","argv","version","versions","removeListener","removeAllListeners","prependListener","prependOnceListener","binding","cwd","chdir","umask","deepUnique","sort","numberIsNan","arrayUniq","reInt","trim","postfix","intVal","floatVal","density","Unipointer","unbindTap","tapElement","_bindStartEvent","isIgnoringMouseUp","pointerPoint","getPointerPoint","boundingRect","scrollX","bottom","Tweezer","_classCallCheck","_createClass","defineProperties","enumerable","writable","protoProps","staticProps","duration","easing","_defaultEase","frame","isRunning","_tick","cancelAnimationFrame","timeStart","currentTime","lastTick","timeElapsed","_shouldTick","up","down","MODEL","NAME","TYPE","VENDOR","VERSION","MOBILE","TABLET","util","regexes","extensions","margedRegexes","str1","str2","lowerize","major","mapper","rgx","q","getUA","oldsafari","1.0","1.2","1.3","2.0","2.0.2","2.0.3","2.0.4","?","amazon","model","Fire Phone","sprint","Evo Shift 4G","vendor","HTC","Sprint","os","windows","ME","NT 3.11","NT 4.0","2000","XP","Vista","7","8","8.1","10","RT","cpu","engine","UAParser","uastring","getResult","rgxmap","getBrowser","getCPU","getDevice","getEngine","getOS","setUA","BROWSER","MAJOR","CPU","ARCHITECTURE","DEVICE","CONSOLE","SMARTTV","WEARABLE","EMBEDDED","ENGINE","OS","Zepto","parser","_bindHandles","isBind","bindMethod","handle","PointerEvent","touchAction","pointerDownPoint","movePoint","isDragging","_dragStart","_dragEnd","_staticClick","dragStartPoint","isPreventingClicks","bindStartEvent","unbindStartEvent","getTouch","touches","touch","identifier","onmousedown","_pointerDown","ontouchstart","changedTouches","onpointerdown","pointerId","postStartEvents","mousedown","touchstart","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","onmouseup","_pointerUp","onpointerup","ontouchend","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","pageX","pageY","indicators","activeIndex","sliding","previousSlide","$indicator","goTo","slideOut","slideIn","$i","eq","maxHeight","$slide","$slideBackground","Power3","easeIn","onComplete","clearProps","Bounce","eventX","mouseDragStart","mouseDragMove","mouseDragEnd","selected-product","scrollToTab","scrollToSection","clientX","currentLeft","destinationLeft","scrollbehavior","$section","scrollDest","$scrollContainer","shouldScroll","$listItems","parallax","updateMap","checkScroll","scrollToTarget","targetMap","updateLinks","$step","agent","mobile","desktop","isDefinitelyDesktop","isWebkit","addTest","matchMedia","FormError","$error","$formTop","FormTooltip","LoadImages","elementsToLoad","sources","activeSource","widths","smallestWidth","targets","activeSourceImage","Image","updateTitle","getLocation","isEs6Module","_typeof","PageModules","findElements","createModules","modules","Module","Parallax","cssParallax","renderElements","parallaxEl","scrollPercent","perspectiveOrigin","perspectiveStyle","prefixedStyle","ScrollEvents","updateTargets","$scrollable","onScroll","$resetTargets","scrollBottom","targetY","targetEl","SVGShapes","RoughEdgeSVG","mode","mask","color","filterID","svgID","maskID","ns","defs","turbSeed","turbulence","displacement","channels","blend","foreignObject","divStyle","turbFilter","secondRect","active","isSketching","startSketching","stopSketching","RoughEdges","roughEdge","edge","w","h","firstChild","sketchingTimeout","iterateSketch","TextEffects","Callouts","$facts","timer","HeadingAnimation","TimelineLite","finish","headingEl","addHeading","paragraphEl","addParagraph","wrapInner","parts","word","strong","dur","initialScale","pos","opacity","scale","$p","dataLayer","Site","shapes","loadImages","formTooltip","formError","kompressor","compressor","minFontSize","NEGATIVE_INFINITY","maxFontSize","POSITIVE_INFINITY","resizer","definition","out","findOrDeleteBySelector","stylesheet","ri","rl","rules","selectorCompare","selectorText","cssText","deleteRule","cssToString","cssArray","property","getStylesheet","sheet","getRulesFromStylesheet","insertRule","addRule","selectors","si","sl","query","mi","ml","qi","ql","setProperty"],"mappings":"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","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   4.1.1\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nvar _isArray = undefined;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = r('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve$1(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  resolve(promise, object);\n  return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then$$1.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then$$1, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then$$1 === GET_THEN_ERROR) {\n      reject(promise, GET_THEN_ERROR.error);\n      GET_THEN_ERROR.error = null;\n    } else if (then$$1 === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then$$1)) {\n      handleForeignThenable(promise, maybeThenable, then$$1);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value.error = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      resolve(promise, value);\n    } else if (failed) {\n      reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nfunction Enumerator$1(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate(input);\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n}\n\nEnumerator$1.prototype._enumerate = function (input) {\n  for (var i = 0; this._state === PENDING && i < input.length; i++) {\n    this._eachEntry(input[i], i);\n  }\n};\n\nEnumerator$1.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve$$1 = c.resolve;\n\n  if (resolve$$1 === resolve$1) {\n    var _then = getThen(entry);\n\n    if (_then === then && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise$2) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve$$1) {\n        return resolve$$1(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve$$1(entry), i);\n  }\n};\n\nEnumerator$1.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator$1.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all$1(entries) {\n  return new Enumerator$1(this, entries).promise;\n}\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race$1(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  reject(promise, reason);\n  return promise;\n}\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise$2(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise$2 ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise$2.all = all$1;\nPromise$2.race = race$1;\nPromise$2.resolve = resolve$1;\nPromise$2.reject = reject$1;\nPromise$2._setScheduler = setScheduler;\nPromise$2._setAsap = setAsap;\nPromise$2._asap = asap;\n\nPromise$2.prototype = {\n  constructor: Promise$2,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n  \n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n  \n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n  \n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};\n\n/*global self*/\nfunction polyfill$1() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise$2;\n}\n\n// Strange compat..\nPromise$2.polyfill = polyfill$1;\nPromise$2.Promise = Promise$2;\n\nreturn Promise$2;\n\n})));\n\n//# sourceMappingURL=es6-promise.map\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar HeroSlider = require('components/hero-slider');\n\nvar AboutCommunitySources = function(el) {\n  this.$el = $(el);\n  this.$tabs = this.$el.find('.about-community-sources-item');\n  this.$slider = this.$el.find('.about-community-sources-slider');\n  \n  this.slider = new HeroSlider(this.$slider[0], this.$tabs);\n\n  $(window).on('vsc-page-ready vsc-page-resized', this.sizeBackground.bind(this));\n};\n\nAboutCommunitySources.prototype.sizeBackground = function() {\n  var introHeight = this.$el.find('.about-community-sources-intro').outerHeight();\n  this.$el.find('.hero-slide-background').css({\n    top: (introHeight * -1)+'px'\n  });\n}\n\nmodule.exports = AboutCommunitySources;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar ScrollNav = require('components/scroll-nav.js');\nvar PageHistory = require('lib/page-history.js');\nvar Device = require('lib/device.js');\n\nfunction AboutNav(el) {\n  this.$el = $(el);\n\n  this.$nav = this.$el.find('.about-section-nav');\n  this.$targets = $();\n\n  $('.header .local-nav').empty().append(this.$nav);\n\n  this.$nav.find('a').each(function(index, el) {\n    var link = $(el).attr('href');\n    var $t = $('[data-permalink=\"'+link+'\"]');\n    this.$targets = this.$targets.add($t);\n  }.bind(this));\n\n  $(window).on('vsc-page-ready', function() {\n    this.scrollNav = new ScrollNav(this.$nav.find('ul'), this.$targets, {\n      offset: ($('.header-bar').outerHeight() - 1) * -1\n    });\n\n    //Removes empty array elements\n    var pathArray = window.location.pathname.split(\"/\").filter( function(el) {\n      return el\n    });\n\n    var id;\n    if( pathArray.length > 1 && ( id = pathArray[1] ) ) {\n      var scrollPos = $( '#' + id ).offset().top - this.$nav.outerHeight() - 20;\n      if( scrollPos > 0 ) {\n        $('html, body, main').animate({\n          scrollTop: scrollPos\n        }, 450);\n        return false;\n      }\n    }\n\n  }.bind(this));\n\n  $(window).add('main').on('scroll', function(event) {\n    var scrollTop = $(event.target).scrollTop();\n    var sectionBottom = this.$el.offset().top + this.$el.outerHeight();\n\n    if($(event.target).is('main')) {\n      sectionBottom += scrollTop;\n    }\n\n    var showLocalNav = sectionBottom < scrollTop + 70;\n    var localNavShowing = $('body').hasClass('local-nav-visible');\n\n    if(localNavShowing && !showLocalNav) {\n      $('body').removeClass('local-nav-visible');\n      $(window).trigger('vsc-local-nav-hide');\n    } else if(showLocalNav && !localNavShowing) {\n      $('body').addClass('local-nav-visible');\n      $( \"body\").removeClass( \"js-search-bar-active\" );\n      $(window).trigger('vsc-local-nav-show');\n    }\n  }.bind(this))\n\n  this.$el.on('click', 'a', function(event) {\n    event.preventDefault();\n\n    var link = $(event.currentTarget).attr('href');\n    var $navLink = this.$nav.find('a[href=\"'+link+'\"]').closest('li');\n\n    $navLink.trigger('click');\n  }.bind(this));\n\n  \n  this.$nav.find('select').on('focusin focus', function(event) {\n    event.preventDefault();\n\n    if(Device.isDefinitelyMobile && window.innerWidth < 600) {\n      var scrollY = window.scrollY;\n\n      $('html,body').animate({\n        scrollTop: scrollY\n      }, 300, function() {\n        window.scrollTo(0, scrollY);\n      });\n    }\n  });\n\n  this.$nav.find('select').on('change', function(event) {\n    var $select = $(event.currentTarget);\n    var link = $select.val();\n\n    this.$nav.find('a').filter('[href=\"'+link+'\"]').closest('li').click();\n  }.bind(this));\n\n  this.$nav.on('scroll-nav-activate', 'li', function(event) {\n    var $a = $(event.currentTarget).find('a');\n    var link = $a.attr('href');\n    var title = $a.attr('data-post-title');\n    this.$nav.find('select').val(link);\n\n    PageHistory.replaceState(null, title, link);\n  }.bind(this));\n\n  $(window).on('vsc-local-nav-show', function() {\n    var $a = this.$nav.find('a').first();\n    var link = $a.attr('href');\n    var title = $a.attr('data-post-title');\n\n    PageHistory.replaceState(null, title, link);\n  }.bind(this));\n\n  $(window).on('vsc-local-nav-hide', function() {\n    var link = this.$nav.attr('data-post-permalink');\n    var title = this.$nav.attr('data-post-title');\n\n    PageHistory.replaceState(null, title, link);\n  }.bind(this));\n}\n\nmodule.exports = AboutNav;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar device = require('lib/device.js');\n\nfunction AboutPurposeSlideshow(el) {\n  this.$el = $(el);\n  this.$slides = this.$el.find('.carousel-slide');\n\n  if(Modernizr.csstransforms3d && device.browser !== 'ie') {\n    this.$el.addClass('mode-fancy');\n  } else {\n    this.$el.addClass('mode-standard');\n  }\n\n  this.$el\n    .on('click', '.carousel-slide.next, [data-carousel-control=\"next\"]', this.nextSlide.bind(this))\n    .on('click', '.carousel-slide.prev, [data-carousel-control=\"prev\"]', this.prevSlide.bind(this))\n    .on('click', '[data-carousel-control=\"reset\"]', this.reset.bind(this));\n}\n\nAboutPurposeSlideshow.prototype.nextSlide = function() {\n  var $prevOut = this.$slides.filter('.prev-out');\n  var $prev = this.$slides.filter('.prev');\n  var $active = this.$slides.filter('.active');\n  var $next = this.$slides.filter('.next');\n  var $nextUp = this.$slides.filter('.next-up');\n\n  if(!$next.length) {\n    return;\n  }\n\n  if($prevOut.length) {\n    $prevOut.removeClass('prev-out');\n  }\n\n  if($prev.length) {\n    $prev.removeClass('prev').addClass('prev-out');\n  }\n\n  if($active.length) {\n    $active.removeClass('active').addClass('prev');\n  }\n\n  if($next.length) {\n    $next.removeClass('next').addClass('active');\n  }\n\n  if($nextUp.length) {\n    $nextUp.removeClass('next-up').addClass('next');\n  }\n\n  var $nextNextUp = $nextUp.next('.carousel-slide');\n\n  if($nextNextUp.length) {\n    $nextNextUp.addClass('next-up');\n  }\n\n  this.updateControls();\n}\n\n\nAboutPurposeSlideshow.prototype.prevSlide = function() {\n  var $prevOut = this.$slides.filter('.prev-out');\n  var $prev = this.$slides.filter('.prev');\n  var $active = this.$slides.filter('.active');\n  var $next = this.$slides.filter('.next');\n  var $nextUp = this.$slides.filter('.next-up');\n\n  if(!$prev.length) {\n    return;\n  }\n\n  if($nextUp.length) {\n    $nextUp.removeClass('next-up');\n  }\n\n  if($next.length) {\n    $next.removeClass('next').addClass('next-up');\n  }\n\n  if($active.length) {\n    $active.removeClass('active').addClass('next');\n  }\n\n  if($prev.length) {\n    $prev.removeClass('prev').addClass('active');\n  }\n\n  if($prevOut.length) {\n    $prevOut.removeClass('prev-out').addClass('prev');\n  }\n\n  var $nextPrevOut = $prevOut.prev('.carousel-slide');\n\n  if($nextPrevOut.length) {\n    $nextPrevOut.addClass('prev-out');\n  }\n\n  this.updateControls();\n}\n\nAboutPurposeSlideshow.prototype.updateControls = function() {\n  var $active = this.$slides.filter('.active');\n\n  if($active.is(':first-child')) {\n    this.$el.find('[data-carousel-control=\"prev\"]').attr('disabled', true);\n  } else {\n    this.$el.find('[data-carousel-control=\"prev\"]').removeAttr('disabled');\n  }\n\n  if($active.is(':last-child')) {\n    this.$el.find('[data-carousel-control=\"next\"]').attr('disabled', true);\n  } else {\n    this.$el.find('[data-carousel-control=\"next\"]').removeAttr('disabled');\n  }\n}\n\nAboutPurposeSlideshow.prototype.reset = function() {\n  var $active = this.$slides.first();\n\n  this.$slides.removeClass('prev-out prev active next next-up');\n\n  $active.addClass('active')\n    .next('.carousel-slide').addClass('next')\n    .next('.carousel-slide').addClass('next-up');\n\n  this.updateControls();\n}\n\nmodule.exports = AboutPurposeSlideshow;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar AboutSourcesMap = function(el) {\n  this.$el = $(el);\n  this.$map = this.$el.find('.about-sources-map-map');\n  this.modal_content = {};\n\n  // Bind events\n  this.$el\n    .on('click', '.about-sources-map-map li a', this.loadContent.bind(this));\n\n  this.$el.on('change', 'select', function(event) {\n    var val = $(event.currentTarget).val();\n    this.$el.find('.about-sources-map-nav a[href=\"#'+val+'\"]').click();\n  }.bind(this));\n\n  // Trigger first to open\n  this.$el.find('.about-sources-map-nav>ul>li:first-child>a').trigger('click');\n\n};\n\nAboutSourcesMap.prototype = {\n\n  loadSourceModal: function(content, products) {\n  \tif(content !== false) {\n  \t\tthis.modal_content.content = content;\n  \t}\n  \tif(products !== false) {\n  \t\tthis.modal_content.products = products;\n  \t}\n    // Response contains source content HTML\n    if(this.modal_content.content && this.modal_content.products) {\n\t    $( document ).trigger( 'OpenModal', [ this.modal_content.content+this.modal_content.products ] );\n\t    this.modal_content = {};\n    }\n  },\n\n  loadContent: function(event) {\n    event.preventDefault();\n\n    var target = $(event.currentTarget);\n    var id = target.attr('data-post-id');\n\n    // Open modal with loading message\n    $( document ).trigger( 'OpenModal', [ 'loading' ] );\n\n    this.loadSourceContent(id);\n    this.loadSourceProducts(id);\n\n  },\n\n  loadSourceContent: function(id) {\n    var self = this;\n    $.ajax({\n      url: SiteVars['json_url']+'/module/source-content/'+id,\n      type: 'GET',\n      success: function(response) {\n        self.loadSourceModal(response.html, false);\n      }.bind(this)\n    });\n\n  },\n\n  loadSourceProducts: function(id) {\n    var self = this;\n    $.ajax({\n      url: SiteVars['json_url']+'/module/source-products/'+id,\n      type: 'GET',\n      success: function(response) {\n        self.loadSourceModal(false, response.html);\n      }.bind(this)\n    });\n\n  }\n\n};\n\nmodule.exports = AboutSourcesMap;\n","function Alert( el ) {\n\tvar t = this;\n\tt.el = el;\n\tt.body = document.body;\n\tt.header = document.querySelector('.header-bar');\n\tt.main = document.getElementsByTagName('main')[0];\n\tt.closeButton = t.el.querySelector('.js-close');\n\tt.activeClass = 'has-alert';\n\tt.init();\n}\n\nAlert.prototype.init = function() {\n\tvar t = this;\n\tt.open();\n\tt.updateOffset();\n\twindow.addEventListener('resize', t.updateOffset.bind(t));\n\tt.closeButton.addEventListener('click', t.close.bind(t));\n};\n\nAlert.prototype.open = function() {\n\tvar t = this;\n\tt.body.classList.add( t.activeClass );\n};\n\nAlert.prototype.close = function() {\n\tvar t = this;\n\tt.body.classList.remove( t.activeClass );\n\tt.main.style.paddingTop = '';\n};\n\nAlert.prototype.updateOffset = function() {\n\tvar t = this,\n\t\t\toffset = t.header.clientHeight;\n\tt.main.style.paddingTop = offset + 'px';\n};\n\nmodule.exports = Alert;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction BackToTop(el) {\n  this.$el = $(el);\n\n  $(window).one('vsc-page-ready', function() {\n    var $scroll = $('html').hasClass('css-parallax') ? $('main') : $('html, body');\n\n    this.$el.on('click', function(event) {\n      event.preventDefault();\n\n      console.log($scroll);\n\n      $scroll.animate({\n        scrollTop: 0\n      }, 450);\n    });\n  }.bind(this));\n}\n\nmodule.exports = BackToTop;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar BlogCategories = function(el) {\n  var t = this;\n  t.$picker = $( '.blog-menu--mobile' );\n\n  t.$picker.on('change', 'select', function(event) {\n    var url = event.target.value;\n    if (url) {\n      window.location.href = url;\n    }\n  }.bind(this));\n};\n\nmodule.exports = BlogCategories;\n","import Flickity from 'flickity'\nimport { getData } from 'modules/dom'\nimport { identity, pipe, returnFalse, tryCatch } from 'modules/utils'\n\nconst PROP_SETTINGS = 'settings'\n\nconst parseSettings = pipe(\n  getData(PROP_SETTINGS),\n  tryCatch(\n    (string) => JSON.parse(string),\n    returnFalse\n  ),\n)\n\nexport default el => {\n  const defaults = {\n    prevNextButtons: false,\n    pageDots: false,\n  }\n  const settings = parseSettings(el) || {}\n  const args = Object.assign({}, defaults, settings)\n\n  return new Flickity(el, args)\n}\n","/* global Element, getComputedStyle, CustomEvent */\nimport {makeArray, curry, getProp, setProp, partial, pipe, map, whileDo} from 'modules/utils'\nimport Tweezer from 'tweezer.js'\nimport {Promise} from 'es6-promise'\n\n/**\n * Add class to a list of elements. This is a curried function.\n *\n * @param {string} className\n * @param {Array<HTMLElement>} els\n * @return {Array<HTMLElement>} Same elements for chaining\n */\nconst addClass = curry((className, els) =>\n  map(\n    (el) => {\n      el.classList.add(className)\n      return el\n    },\n    els\n  ))\n\nconst append = curry((parent, els) =>\n  map((el) => parent.appendChild(el), els)\n)\n\nconst appendHtml = (el, html) => {\n  el.insertAdjacentHTML('beforeend', html)\n  return el\n}\n\nconst createNodes = (html) => {\n  const wrapper = document.createElement('div')\n  appendHtml(wrapper, html)\n  return getChildren(wrapper)\n}\n\nconst preventDefault = (e) => { e.preventDefault(); return e }\n\n/**\n * Set style for an element.\n *\n * This is a curried function.\n *\n * @param {string} k Style name\n * @param {string} v Style value\n * @param {HTMLElement} el Element\n * @return {HTMLElement}\n */\nconst setStyle = curry((k, v, el) => {\n  el.style[ k ] = v\n  return el\n})\n\nconst hide = setStyle('display', 'none')\n\n/**\n * Get a style for an element.\n *\n * This is a curried function.\n *\n * @param {string} k Style name\n * @param {HTMLElement} el\n * @return {string}\n */\nconst getStyle = curry((k, el) => getComputedStyle(el)[ k ])\n\n/**\n * Get actual height of an element, including padding\n *\n * @param {HTMLElement} el\n * @return {number}\n */\nconst getHeight = getProp('clientHeight')\n\n/**\n * Get scroll top position of an element.\n *\n * Default to getting scrolling position of the viewport\n *\n * @param {HTMLElement} el\n * @return {number}\n */\nconst getScrollTop = (el = document.documentElement) => el === document.documentElement ? (window.pageYOffset || el.scrollTop) : el.scrollTop\n\n/**\n * Check to see if an element has a specified class.\n *\n * @param {string} className\n * @param {HTMLElement} el\n */\nconst hasClass = curry((className, el) => el.classList.contains(className))\n\n/**\n * Get attribute value for an element.\n *\n * @param {string} name\n * @param {HTMLElement} el\n * @return {string}\n * @private\n */\nconst _getAttribute = (name, el) => el.getAttribute(name)\n\n/**\n * Get attribute value for an element.\n *\n * This is a curried function\n *\n * @param {string} name\n * @param {HTMLElement} el\n * @return {string}\n */\nconst getAttribute = curry(_getAttribute)\n\nconst setAttribute = curry((name, value, el) => {\n  el.setAttribute(name, value)\n  return el\n})\n\n/**\n * Get data attribute.\n *\n * @param {string} name\n * @param {HTMLElement} el\n * @return {string} Parsed JSON value or object\n * @private\n */\nconst _getData = (name, el) => _getAttribute('data-' + name, el)\n\n/**\n * Get data attribute.\n *\n * This is a curried function\n *\n * @param {string} name\n * @param {HTMLElement} el\n * @return {string}\n */\nconst getData = curry(_getData)\n\nconst setData = curry((name, value, el) => setAttribute('data-' + name, value, el))\n\n/**\n * Attach event handler for a single event\n *\n * @param {string} event\n * @param {Function} handler\n * @param {Object} capture\n * @param {HTMLElement} el\n * @returns {HTMLElement}\n * @private\n */\nconst _on = (event, handler, capture, el) => {\n  el.addEventListener(event, handler, capture, el)\n  return el\n}\n\nconst matches = (selector, el) => (\n  Element.prototype.matches ||\n  Element.prototype.matchesSelector ||\n  Element.prototype.mozMatchesSelector ||\n  Element.prototype.msMatchesSelector ||\n  Element.prototype.oMatchesSelector ||\n  Element.prototype.webkitMatchesSelector\n).apply(el, [ selector ])\n\n/**\n * Attach event handler for a list of events.\n *\n * This is a curried function\n *\n * @param {Array|Object} els Array or array-like object\n * @param {string} event\n * @param {Function} handler\n * @return {Array<HTMLElement>}\n */\nconst on = curry((event, handler, els) =>\n  map(\n    partial(_on, event, handler, {}),\n    els\n  ))\n\nconst onPassive = curry((event, handler, els) =>\n  map(\n    partial(_on, event, handler, { passive: true }),\n    els\n  ))\n\n/**\n * Check to see if document has loaded\n *\n * @return {boolean}\n * @private\n */\nconst _domLoaded = () => document.attachEvent ? document.readyState === 'complete' : document.readyState !== 'loading'\n\n/**\n * Call function when document is ready\n *\n * @param {Function} f\n */\nconst ready = (f) => _domLoaded() ? f() : on('DOMContentLoaded', f, document)\n\nconst closest = curry((selector, el) =>\n  whileDo(\n    (target) => target && !matches(selector, target) && target.parentNode,\n    (target) => target.parentNode,\n    el.parentNode\n  )\n)\n\nconst _delegate = (event, handler, selector, el) => _on(\n  event,\n  (e) => {\n    const matchedElement = whileDo(\n      (target) => target && target !== document && !matches(selector, target) && target.parentNode,\n      (target) => target.parentNode,\n      e.target\n    )\n\n    if (matchedElement !== document && matches(selector, matchedElement)) {\n      handler.apply(el, [ e ])\n    }\n  },\n  {},\n  el\n)\n\nconst delegate = curry((event, handler, selector, els) => map(\n  partial(_delegate, event, handler, selector),\n  els\n))\n\n/**\n * Remove class from a list of elements. This is a curried function.\n *\n * @param {string} className\n * @param {Array<HTMLElement>} els\n * @return {Array<HTMLElement>} Same elements for chaining\n */\nconst removeClass = curry((className, els) =>\n  map(\n    (el) => { el.classList.remove(className); return el },\n    els\n  ))\n\nconst toggleClass = curry((className, els) =>\n  map(\n    (el) => { el.classList.toggle(className); return el },\n    els\n  ))\n\n/**\n * Select one element matching a selector, which is also decendant of a parent element (defaults to document)\n * @param {string} selector\n * @param {HTMLElement|HTMLDocument=} parent\n * @return {HTMLElement}\n */\nconst select = (selector, parent = document) => parent.querySelector(selector)\n\n/**\n * Select all elements matching a selector, which are also decendant of a parent element (defaults to document)\n * @param {string} selector\n * @param {HTMLElement|HTMLDocument=} parent\n * @return {Array<HTMLElement>}\n */\nconst selectAll = (selector, parent = document) => makeArray(parent.querySelectorAll(selector))\n\nconst getChildren = pipe(\n  getProp('children'),\n  makeArray\n)\n\nconst getParent = getProp('parentNode')\n\nconst getTopPosition = getProp('offsetTop')\n\nconst scrollTop = (offset, callback, el) => {\n  new Tweezer({\n    start: getScrollTop(el),\n    end: offset\n  })\n    .on('tick', (v) => {\n      (typeof el === 'undefined')\n        ? window.scrollTo(0, v)\n        : setProp('scrollTop', v, el)\n    })\n    .on('done', () => {\n      if (typeof callback !== 'undefined') {\n        callback()\n      }\n    })\n    .begin()\n}\n\n/**\n * Trigger reflows so that transition happens after DOM insertion\n */\nconst triggerReflow = (els) => {\n  map(getProp('offsetHeight'), els)\n  return els\n}\n\nconst doesSupportObjectFit = () => Object.keys(document.documentElement.style).reduce((support, prop) => support || /object(?:-f|F)it$/.test(prop), false)\n\nconst trigger = (eventName, el) => {\n  let event\n  if (window.CustomEvent) {\n    event = new CustomEvent(eventName, {detail: {some: 'data'}})\n  } else {\n    event = document.createEvent('CustomEvent')\n    event.initCustomEvent(eventName, true, true, {some: 'data'})\n  }\n  el.dispatchEvent(event)\n  return el\n}\n\nconst createElement = (tag) => document.createElement(tag)\n\nconst createScriptTag = (src, async = true, defer = true) => (\n  pipe(\n    createElement,\n    setProp('src', src),\n    setProp('async', async),\n    setProp('defer', defer)\n  )('script')\n)\n\nconst loadScript = (src, async = true, defer = true) => new Promise((resolve, reject) => {\n  const tag = createScriptTag(src, async, defer)\n  tag.onload = resolve\n  tag.onerror = reject\n  append(document.body, tag)\n})\n\nexport {\n  addClass,\n  append,\n  appendHtml,\n  createElement,\n  createNodes,\n  closest,\n  delegate,\n  doesSupportObjectFit,\n  getAttribute,\n  getChildren,\n  getHeight,\n  getTopPosition,\n  getData,\n  getParent,\n  getScrollTop,\n  getStyle,\n  hasClass,\n  hide,\n  on,\n  onPassive,\n  loadScript,\n  matches,\n  preventDefault,\n  ready,\n  removeClass,\n  scrollTop,\n  select,\n  selectAll,\n  setAttribute,\n  setData,\n  setStyle,\n  toggleClass,\n  triggerReflow,\n  trigger\n}\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Footer(el) {\n\n  var pintrk = window.pintrk;\n\n  this.el = el;\n  this.$el = $(el);\n\n  this.bg = this.el.querySelector('.footer-bg');\n  this.layers = this.el.querySelectorAll('[data-layer]');\n\n  $(this.bg)\n    .on('scroll-in.vsc-scroll', this.showLayers.bind(this))\n    .on('scroll-reset.vsc-scroll', this.hideLayers.bind(this));\n\n  var $input = this.$el.find('.ginput_container');\n  var $submit = this.$el.find('.gform_footer');\n  $input.append($submit);\n\n  // Submit and open a new tab\n  var openWindow = \"http://vermontsmokeandcure.us11.list-manage1.com/subscribe?u=a29385323330d538d4f2148eb&id=48e15ef325\";\n  $('.newsletter .gform_footer').on('click', function(event) {\n      event.preventDefault();\n      var Email_Merge0 = $('.newsletter #MERGE0').val();\n      var Email_WebSignup = $('.newsletter #WEBSIGNUP').val();\n      window.open(openWindow + \"&MERGE0=\" + Email_Merge0 + \"&WEBSIGNUP=\" + Email_WebSignup, '_blank');\n      pintrk('track', 'signup');\n  });\n\n  $(document).on('mailchimp-signedup', function() {\n    $('.newsletter').find('.gforms_confirmation_message').css('display', 'block');\n    $('.newsletter form').remove();\n    if (typeof fbq !== 'undefined') {\n      fbq('track', 'NewsletterSignup')\n    }\n  });\n\n}\n\nFooter.prototype.showLayers = function() {\n  for(var i = 0; i < this.layers.length; i++) {\n    var l = this.layers[i];\n\n    TweenLite.fromTo(l, 1.3, {\n      y: '100%',\n      rotation: (Math.random() * 24) - 12\n    }, {\n      y: '0%',\n      rotation: 0,\n      delay: i * .15,\n      ease: Back.easeOut\n    });\n  }\n};\n\nFooter.prototype.hideLayers = function() {\n  TweenLite.killTweensOf('.footer-bg [data-layer]');\n\n  for(var i = 0; i < this.layers.length; i++) {\n    var l = this.layers[i];\n    l.setAttribute('style', '');\n  }\n};\n\nmodule.exports = Footer;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar Header = function(el) {\n  var t = this,\n      $body = $( 'body');\n\n  this.$el = $(el);\n  this.$bar = this.$el.children( \".header-bar\" );\n  this.$search  = this.$el.find( \".search-bar\" );\n  this.$searchField = this.$search.find( \".search-field\" );\n  this.$searchToggle = this.$el.find( \".header-search-toggle\" );\n\n  this.$el.on('click', '.global-nav *', function(event) {\n    event.stopPropagation();\n  }).find('.header-menu-toggle').on('click', function() {\n    $body.toggleClass('show-menu');\n    $body.removeClass( \"js-search-bar-active\" );\n  }.bind(this));\n\n  $body.on('click', function(event) {\n    if ( !$( event.target ).closest( \".search-bar\").length ) {\n      $body.removeClass('show-menu');\n    }\n  });\n\n  this.$searchField.on( \"focus\", function() {\n    t.$search.addClass( \"js-focused\" );\n  });\n\n  this.$searchField.on( \"blur\", function() {\n    t.$search.removeClass( \"js-focused\" );\n  });\n\n  this.$searchToggle.on( \"click\", function() {\n    $body.removeClass( \"show-menu\" );\n    $body.toggleClass( \"js-search-bar-active\" );\n    if ( $body.hasClass( \"js-search-bar-active\" ) ) {\n      t.$searchField.focus();\n    }\n  });\n\n  this.initBackground();\n};\n\nHeader.prototype = {\n  initBackground: function() {\n    this.$bgWrap = this.$el.find('.header-menu-background');\n    this.$bg = this.$el.find('.header-menu-background-inner');\n    this.$bgImg = this.$el.find('.header-menu-background-image');\n\n    $(window).on('vsc-page-ready vsc-page-resized', function() {\n      this.$bgImg.css('height', this.$bgWrap.outerHeight()+'px');\n    }.bind(this));\n\n    this.$el.on('mouseover', '.header-menu-primary li', function(event) {\n      var $li = $(event.currentTarget);\n\n      this.$bg.css({\n        'height': $li.outerHeight()+'px',\n        'transform': 'translateY('+($li.position().top+20)+'px)'\n      });\n\n      this.$bgImg.css({\n        'transform': 'translateY(-'+($li.position().top+20)+'px)'\n      });\n    }.bind(this));\n\n    this.$el.on('mouseout', '.header-menu-primary', function(event) {\n      this.$bg.css({\n        'height': 0\n      });\n    }.bind(this));\n  }\n}\n\nmodule.exports = Header;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar HeroSlider = require('components/hero-slider');\nvar ProductTypePicker = require('components/product-type-picker.js');\n\nvar HomeProductsSlider = function(el) {\n  this.$el = $(el);\n  this.$tabs = this.$el.find('.product-type-tab');\n  this.$slider = this.$el.find('.page-hero-slider');\n\n  this.$picker = this.$el.find('.product-type-picker');\n  this.picker = new ProductTypePicker(this.$picker[0]);\n  \n  this.slider = new HeroSlider(this.$slider[0], this.$tabs);\n\n  // this.$el.on('slide-in.vsc-slide', function(event, data) {\n  //   if(data && typeof data.index !== 'undefined') {\n  //     this.picker.scrollToTab(this.$picker.find('.product-type-tab').eq(data.index));\n  //   }\n  // }.bind(this));\n\n  \n};\n\nmodule.exports = HomeProductsSlider;","import Layzr from 'layzr.js'\nimport { addClass, doesSupportObjectFit, closest, setStyle, getData } from 'modules/dom'\n\nconst instance = Layzr({\n  threshold: 100\n})\n\nconst disableObjectFit = addClass('no-object-fit')\nconst closestWrapper = closest('.js-wrap')\nconst setBgImg = (url, el) => setStyle('backgroundImage', `url(${url})`, el)\nconst objectFit = doesSupportObjectFit()\nconst loaded = addClass('image--loaded')\n\nif (!objectFit) {\n  disableObjectFit(document.body)\n}\n\ninstance.on('src:after', img => {\n  const wrapper = closestWrapper(img)\n\n  if (!wrapper) {\n    return\n  }\n\n  if (!objectFit) {\n    const src = getData('normal', img)\n    setBgImg(src, wrapper)\n  }\n\n  loaded(wrapper)\n})\n\ninstance.update().check().handlers(true)\n\nexport default (el) => {\n\n}\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar JobContent = function(el) {\n    var t = this;\n    t.$el = $( el );\n    t.$picker = t.$el.prev( '.nav-job-picker' );\n    t.$headerBar = $( '.header-bar' );\n\n    if ( t.$picker.length ) {\n        $('.header .local-nav').empty().append(this.$picker);\n\n        $(window).add('main').on('scroll', function(event) {\n            var infoTop = this.$el.offset().top - t.$headerBar.outerHeight();\n            var scrollTop = $(event.target).scrollTop();\n\n            $('body').toggleClass('local-nav-visible', infoTop < scrollTop);\n        }.bind(this));\n\n        this.$picker.on('change', 'select', function(event) {\n            var id = event.target.value,\n                url = $(event.target).children(\"option:selected\").data( \"href\" );\n\n            window.location.href = url;\n        }.bind(this));\n\n        this.$picker.on('click', '.nav-job-picker__button', function(event) {\n            var $target = $( event.target );\n\n            if ( $target.attr( 'href' ).indexOf('#') !== 0 ) {\n                return true;\n            }\n\n            event.preventDefault();\n\n            var offset = $( $target.attr( 'href' ) ).offset().top - t.$headerBar.outerHeight();\n\n            $('html, body').animate({\n                scrollTop: offset\n            }, 600);\n        }.bind(this));\n    }\n};\n\nmodule.exports = JobContent;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar LocalNav = function(el) {\n  this.$info = $('.product-info .content-width');\n  this.$el = $(el);\n\n  if( this.$info.length ) {\n\n      $(window).add('main').on('scroll', function (event) {\n          var infoTop = this.$info.offset().top - $('.header-bar').outerHeight();\n          var scrollTop = $(event.target).scrollTop();\n\n          $('body').toggleClass('local-nav-visible', infoTop < scrollTop);\n      }.bind(this));\n  }\n\n  this.$el.on('change', 'select', function (event) {\n      location.href = event.target.value;\n  }.bind(this));\n};\n\nmodule.exports = LocalNav;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar device = require( '../../scripts/src/lib/device.js' );\nrequire('fittext');\n\nfunction PageHeroFull(el) {\n  this.$el = $(el);\n  this.$video = this.$el.find('video');\n  this.$mute = this.$el.find('.volume-on-off');\n  var $contentArea = this.$el.find('.content-area');\n\n  if(this.$video.length) {\n    $(window).one('vsc-page-ready', function() {\n      this.$video[0].play();\n    }.bind(this));\n  } else if($contentArea.attr('data-heading-animation') && !$contentArea.data('no-fit-text')) {\n    this.$el.find('h1').fitText(0.5);\n  }\n\n  $('body').on('click', '.scroll-down', function(event) {\n\n    event.preventDefault();\n\n    var $target = $(event.target).closest('.page-hero-full').next();\n\n    var $scroll = $('html').hasClass('css-parallax') ? $('body > main') : $('html,body');\n\n    var top = $target.offset().top-$('.global-nav').height();\n\n    $scroll.animate({\n      'scrollTop': top\n    }, 450);\n  });\n\n  if ( device.isDefinitelyMobile ) {\n    this.$mute.remove();\n  } else {\n    this.$mute.on( \"click\", function() {\n      this.$mute.toggleClass( \"js-volume-on\" );\n      this.$video.prop( \"muted\", function(i, val) {\n        return !val;\n      });\n    }.bind(this));\n  }\n}\n\nmodule.exports = PageHeroFull;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar HeroSlider = require('components/hero-slider');\n\nfunction PageHeroSlider(el) {\n  this.$el = $(el);\n\n  var $parentModule = this.$el.parent().closest('[data-module]');\n\n  if($parentModule.length) {\n    return;\n  }\n\n  this.$indicators = this.$el.find('[data-slide-indicator]');\n  this.slider = new HeroSlider(this.$el[0], this.$indicators);\n}\n\nmodule.exports = PageHeroSlider;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar PageModal = function(el) {\n  var self = this;\n  this.$modal = $(el);\n  this.$dim = $('#ModalDim');\n\n  $( document ).on( 'OpenModal', function( event, content ) {\n    // Show modal\n    self.$modal.show();\n    self.$dim.show();\n\n    $(window).resize(function() {\n      self.sizeModal();\n    }).trigger('resize');\n\n    if(content == 'loading') {\n      // Show loading message\n      self.$modal.find('.modal-content').html('').hide();\n      self.$modal.find('.modal-loading').show();\n    } else {\n      // Populate modal\n      self.$modal.find('.modal-content').html(content).show();\n      self.$modal.find('.modal-loading').hide();\n    }\n    // Dim page\n    $('body').addClass('show-modal');\n  });\n\n  $( document ).on( 'CloseModal', function( event ) {\n    // Hide modal\n    self.$modal.hide();\n    self.$dim.hide();\n    // Un-dim page\n    $('body').removeClass('show-modal');\n  });\n\n  // Bind events\n  this.$modal.on('click', '.modal-close', function(event){\n    event.preventDefault();\n    $( document ).trigger( 'CloseModal' );\n  });\n  this.$dim.on('click', function(event){\n    event.preventDefault();\n    $( document ).trigger( 'CloseModal' );\n  });\n\n  this.$modal.on('click', '.modal-content > * > *', function(event) {\n    event.stopPropagation();\n  });\n\n};\n\nPageModal.prototype = {\n\n  /** Open the source group **/\n  sizeModal: function() {\n\n    /*var top = $(document).scrollTop();\n    this.$modal.css({\n      top: top+'px',\n      height: 'auto',\n    });\n\n    if(this.$modal.height() < window.innerHeight) {\n      this.$modal.css({\n        height: window.innerHeight+'px'\n      });\n    }*/\n\n  }\n\n};\n\nmodule.exports = PageModal;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction PageRichPhotoBlock(el) {\n  this.$el = $(el);\n\n  this.$el.on('click', function() {\n    this.$el.toggleClass('open');\n  }.bind(this));\n}\n\nmodule.exports = PageRichPhotoBlock;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction PaginateLoadMore(el) {\n    var t = this;\n\n    t.$el = $(el);\n    t.$button = t.$el.children(\".paginate-load-more-button\");\n    t.ajaxSelector = t.$button.data(\"ajax\");\n    t.anchor = t.$button.data(\"target\");\n    \n    if (t.ajaxSelector) {\n        t.$currentContent = $(t.ajaxSelector);\n        t.$button.on(\"click\", function (e) {\n            e.preventDefault();\n\n            $.get(\n                t.$button.attr(\"href\"),\n                function (data) {\n                    var $newDoc = $($.parseHTML(data, document)),\n                        $newContent = $newDoc.find(t.ajaxSelector).children(),\n                        // assuming there's only one load more button per page\n                        $newButton = $newDoc.find(\".paginate-load-more-button\");\n\n                    $(t.anchor).append($newContent.html());\n\n                    if ($newButton.length) {\n                        t.$button.attr(\"href\", $newButton.attr(\"href\"));\n                    } else {\n                        t.$button.remove();\n                    }\n                }\n            );\n        });\n    }\n}\n\nmodule.exports = PaginateLoadMore;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar ProductInfo = function(el) {\n  this.$el = $(el);\n\n  // Toggle more info \n  this.$el.on('click', '.more', function(){\n    var $this = $(this);\n    var $content = $this.next('.content-area');\n    if($this.hasClass('open')) {\n      $this.removeClass('open');\n      $content.slideUp();\n    } else {\n      $this.addClass('open');\n      $content.slideDown();\n    }\n  });\n\n};\n\nmodule.exports = ProductInfo;","/**\n * Products listing module.\n * @module modules/products-listing\n */\n\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar serialize = require('form-serialize');\nvar HeroSlider = require('components/hero-slider');\nvar ProductTypePicker = require('components/product-type-picker.js');\n\n/**\n * Initialize the module.\n * @class\n */\nfunction ProductListing(el) {\n  this.$el = $(el);\n  this.$form = this.$el.find('form');\n  this.$products = this.$el.find('li.product');\n\n  this.$grid = this.$el.find('.product-thumbnails');\n  this.$filteredOut = this.$el.find('.filtered-out-products');\n\n  this.$picker = this.$el.find('.product-type-picker');\n  this.picker = new ProductTypePicker(this.$picker[0]);\n\n  // Bind events for form controls\n  this.$el\n    .on('click', '.all-products', this.clearFilters.bind(this))\n    .on('change', 'input[type=\"radio\"]:not(.all-products), input[type=\"checkbox\"], select', this.performFilter.bind(this));\n\n  this.$el.on('change', 'select', function() {\n    gtmTrackEvent({ 'event': 'protein-filter' });\n  });\n  \n  // Check available filters on init\n  this.updateAvailableFilters();\n\n  this.performFilter();\n\n  this.clearing = false;\n}\n\nProductListing.prototype = {\n\n  /** Update the results based on the currently selected filters. */\n  performFilter: function(event) {\n    if(this.clearing) {\n      return;\n    }\n\n    this.$products.attr('data-watch-scroll', '');\n\n    var $results = this.getFilteredProducts();\n\n    $results.appendTo(this.$grid);\n    this.$products.not($results).appendTo(this.$filteredOut);\n\n    $(window).trigger('vsc-page-changed');\n\n    this.updateAvailableFilters();\n  },\n\n  /** Reset all filters to the default state. */\n  clearFilters: function() {\n    this.clearing = true;\n\n    this.$form.find('input[type=\"radio\"][value=\"\"]').each(function() {\n      this.checked = true;\n    });\n\n    this.$form.find('input[type=\"checkbox\"]').each(function() {\n      this.checked = false;\n    });\n\n    this.$form.find('select').each(function() {\n      this.value = '';\n    });\n\n    this.clearing = false;\n\n    this.performFilter();\n  },\n\n  /** Check each possible filter and disable if it would yield no results. */\n  updateAvailableFilters: function() {\n    this.$form.find('input[type=\"radio\"][value!=\"\"], input[type=\"checkbox\"], select option').each(function(index, input) {\n      var canFilter = this.testFilter(input);\n\n      if(canFilter) {\n        input.removeAttribute('disabled');\n      } else {\n        input.setAttribute('disabled', 'disabled');\n      }\n    }.bind(this));\n  },\n\n  /** Get the results for the provided filters. */\n  getFilteredProducts: function(filters) {\n    filters = filters || serialize(this.$form[0], {hash: true});\n\n    var filterSelector = '';\n\n    for(var tax in filters) {\n      if(!Array.isArray(filters[tax])) {\n        filterSelector += '.'+tax+'-'+filters[tax];\n      } else {\n        filterSelector += '.'+tax+'-'+filters[tax].join('.'+tax+'-');\n      }\n    }\n\n    var $results = this.$products;\n\n    if(filterSelector) {\n      $results = $results.filter(filterSelector);\n    }\n\n    return $results;    \n  },\n\n  /** Check if selecting an input would yield no results. */\n  testFilter: function(input) {\n    var inputType = input.getAttribute('type') || input.tagName.toLowerCase();\n    var name = input.getAttribute('name') || input.parentElement.getAttribute('name');\n    var value = input.getAttribute('value');\n\n    var filters = serialize(this.$form[0], {hash: true});\n\n    if(value == '') {\n      return true;\n    }\n\n    if(inputType === 'radio' || inputType === 'option') {\n      filters[name] = value;\n    } else if(inputType === 'checkbox') {\n      if(input.checked) {\n        return true;\n      }\n\n      if(name in filters) {\n        if(Array.isArray(filters[name])) {\n          filters[name].push(value);\n        } else {\n          filters[name] = [ filters[name], value ];\n        }\n      } else {\n        filters[name] = value;\n      }\n    }\n\n    var $results = this.getFilteredProducts(filters);\n\n    return ($results.length > 0);\n  }\n\n};\n\n/** Module constructor. */\nmodule.exports = ProductListing;","/**\n * Product type varieties module.\n * @module modules/product-type-varieties\n */\n\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nrequire('html5-history-api');\nvar PageHistory = require('lib/page-history.js');\n\nvar ProductTypePicker = require('components/product-type-picker.js');\n\n/**\n * Initialize the module.\n * @class\n */\nvar ProductPicker = function(el) {\n  // $el is the product slider.\n  this.$el = $(el);\n\n  this.$targets = this.$el.find('[data-post-id]');\n  this.$prev = this.$el.find('[data-picker-control=\"previous\"]');\n  this.$next = this.$el.find('[data-picker-control=\"next\"]');\n\n  this.$picker = this.$el.find('.product-type-picker');\n  this.picker = new ProductTypePicker(this.$picker[0]);\n\n  // $info is the currently showing product info.\n  this.$info = this.$el.next('.product-info');\n\n  // productInfo is a cache of previously loaded products\n  this.productInfo = {};\n\n  var initialID = this.$info.attr('data-post-id');\n\n  // Add the initial product to in-memory cache.\n  this.productInfo[initialID] = this.$info[0];\n\n  this.$curProduct = this.$targets.filter('[data-post-id=\"'+initialID+'\"]');\n  this.$curProduct.addClass('active');\n\n  this.$el.on('click', '.product', this.onClickProduct.bind(this));\n\n  this.$nav = this.$el.prev('.product-picker-nav');\n\n  if(this.$nav.length) {\n    $('.header .local-nav').empty().append(this.$nav);\n      this.updateNav();\n      this.$targets.filter('.active').trigger('click');\n      $(window).add('main').on('scroll', function(event) {\n        var infoTop = this.$info.offset().top - $('.header-bar').outerHeight();\n        var scrollTop = $(event.target).scrollTop();\n\n        $('body').toggleClass('local-nav-visible', infoTop < scrollTop);\n      }.bind(this))\n\n      this.$nav.on('change', 'select', function(event) {\n        var id = event.target.value;\n        this.$targets.filter('[data-post-id='+id+']').click();\n\n        $('html, body').animate({\n          scrollTop: this.$info.offset().top - $('.header-bar').outerHeight() + 1\n        }, 600);\n      }.bind(this));\n  }\n\n  this.$el.on('click', '[data-picker-control=\"previous\"]:not(:disabled)', function(event) {\n    this.$targets.filter('.active').prev().trigger('click');\n  }.bind(this));\n\n  this.$el.on('click', '[data-picker-control=\"next\"]:not(:disabled)', function(event) {\n    this.$targets.filter('.active').next().trigger('click');\n  }.bind(this));\n\n  this.checkProductPosition(this.$curProduct);\n\n  // $(window).on('popstate', this.onStateChange.bind(this));\n}\n\nProductPicker.prototype = {\n\n  /** Update the current state with the selected product and display info. */\n  onClickProduct: function(event) {\n    event.preventDefault();\n\n    var $product = $(event.currentTarget);\n\n    if($product.hasClass('active')) {\n      return;\n    }\n\n    var id = event.currentTarget.getAttribute('data-post-id');\n    var title = event.currentTarget.getAttribute('data-post-title');\n\n    console.log(title);\n\n    PageHistory.replaceState({\n      id: id\n    }, title, $product.find('a').attr('href'));\n\n    this.showProductInfo(id);\n  },\n\n  /** Show product info based on the current state. */\n  onStateChange: function() {\n    var location = history.location || window.location;\n\n    if(history.state) {\n\n      this.showProductInfo(history.state.id);\n\n    } else {\n\n      var url = location.href;\n\n      var id = this.$el.find('a[href=\"'+url+'\"]').closest('.product').attr('data-post-id');\n\n      this.showProductInfo(id);\n\n    }\n  },\n\n  /** Show the selected product info, loading via AJAX if necessary. */\n  showProductInfo: function(id) {\n    if(this.productInfo[id]) {\n      this.replaceProductInfo(this.productInfo[id]);\n    } else {\n      $.ajax({\n        url: SiteVars['json_url']+'/module/product-info/'+id,\n        type: 'GET',\n        success: function(response) {\n          this.productInfo[id] = $(response.html)[0];\n          this.replaceProductInfo(this.productInfo[id]);\n        }.bind(this)\n      });\n    }\n  },\n\n  /** Replace the product info content and update $info. */\n  replaceProductInfo: function(el) {\n    this.$info.replaceWith(el);\n    this.$info = $(el);\n\n    var id = this.$info.attr('data-post-id');\n\n    var $activeTarget = this.$targets.filter('[data-post-id=\"'+id+'\"]');\n\n    $activeTarget.addClass('active').siblings().removeClass('active');\n\n    this.checkProductPosition($activeTarget);\n    this.updateNav();\n  },\n\n  checkProductPosition: function(el) {\n    if($(el).is(':first-child')) {\n      this.$prev.attr('disabled', '');\n    } else {\n      this.$prev.removeAttr('disabled');\n    }\n\n    if($(el).is(':last-child')) {\n      this.$next.attr('disabled', '');\n    } else {\n      this.$next.removeAttr('disabled');\n    }\n  },\n\n  updateNav: function() {\n    var $activeThumb = this.$targets.filter('.active');\n    var name = $activeThumb.find('.product-name').text();\n    var thumbnailSrc = $activeThumb.find('img').attr('src');\n    var resourceSection = document.getElementsByClassName('product-meat-resource');\n    var resourceImage = document.querySelector( '.product-meat-resource__block img' );\n\n    this.$nav.find('.active-product-image').css({\n      'background-image': 'url('+thumbnailSrc+')'\n    });\n\n    this.$nav.find('.active-product-name').text(name);\n\n    this.$nav.attr('data-product-color', $activeThumb.attr('data-product-color'));\n    this.$nav.find('select').val($activeThumb.attr('data-post-id'));\n\n    if (resourceSection.length) {\n      resourceSection[0].className = resourceSection[0].className.replace(/\\sproduct-color-(.*)/, ' product-color-' + this.$nav.attr('data-product-color'));\n    }\n\n    if (resourceImage) {\n      resourceImage.src = $activeThumb.attr('data-product-map-color');\n    }\n\n    var $navButtonContainer = this.$nav.find('.active-product-button');\n    $navButtonContainer.empty();\n\n    var $button = this.$info.find('.product-description a.vsc-button');\n\n    if($button.length) {\n      var $localNavButton = $button.clone();\n      $navButtonContainer.append($localNavButton);\n    }\n\n    $(window).trigger('vsc-page-changed');\n  },\n\n}\n\n/** Module constructor. */\nmodule.exports = ProductPicker;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar vein = require('veinjs');\n\nfunction StoreLocator(el) {\n  this.$el = $(el);\n\n  var $form = this.$el.find('form');\n  var $addressWrap = this.$el.find('div.address-input');\n  var $locationBtnContainer = this.$el.find('div.geo_button_cont');\n  var $searchBtn = $('.wpslsubmit');\n\n  this.currentPage = 0;\n\n  var submitted = false;\n\n  this.$el.one('click', '.wpslsubmit', function() {\n    submitted = true;\n  });\n\n  this.$el.on('click', 'li', function(event) {\n    var $li = $(event.currentTarget);\n\n    this.activateResult($li.attr('data-result'));\n  }.bind(this));\n\n  $(window).on('vsc-page-resized vsc-page-changed', this.update.bind(this));\n\n  $(window).on('vsc-location-no-results', this.noResults.bind(this));\n\n  $(window).on('vsc-map-rendered', function() {\n    var bounds = new google.maps.LatLngBounds();\n\n    for(var i = 0; i < markers.length; i++) {\n      if(markers[i].getVisible()) {\n        bounds.extend(markers[i].getPosition());\n      }\n    }\n\n    googlemap.fitBounds(bounds);\n\n    this.paginate(0);\n\n    if(submitted) {\n      $('html,body').animate({\n        scrollTop: $('.store-locator-content').offset().top - 69\n      }, 450);\n    }\n  }.bind(this));\n\n  this.$el.on('click', '[data-locator-page]', function(event) {\n    var dir = $(event.currentTarget).attr('data-locator-page');\n    var page = dir == 'prev' ? this.currentPage - 1 : this.currentPage + 1;\n    this.paginate(page);\n  }.bind(this));\n}\n\nStoreLocator.prototype = {\n  noResults: function() {\n    $('.store-locator').removeClass('open');\n    $('.store-locator-content').css('height', '0');\n  },\n  paginate: function(page) {\n    page = page || 0;\n\n    this.currentPage = page;\n\n    var $results = this.$el.find('li');\n    var pageCount = 4;\n\n    $('.store-locator').toggleClass('open', $results.length > 0);\n    $('.store-locator-content').css( \"height\", '' );\n\n    var start = pageCount * page;\n    var end = pageCount * (page+1);\n\n    var $showResults = $results.slice(start, end);\n\n    $results.not($showResults).hide();\n    $showResults.show();\n\n    if(start > 0) {\n      $('[data-locator-page=\"prev\"]').removeAttr('disabled');\n    } else {\n      $('[data-locator-page=\"prev\"]').attr('disabled', true);\n    }\n\n    if($results.length > end) {\n      $('[data-locator-page=\"next\"]').removeAttr('disabled');\n    } else {\n      $('[data-locator-page=\"next\"]').attr('disabled', true);\n    }\n  },\n\n  update: function() {\n    this.initMarkers();\n    this.moveHeading();\n    this.paginate(this.currentPage);\n\n    vein.inject('.store-locator-content', {\n      'height': $('.store-locator-results-container').outerHeight()+'px'\n    });\n\n    setTimeout(function() {\n      google.maps.event.trigger(googlemap, 'resize');\n    }, 10);\n  },\n\n  moveHeading: function() {\n    var $header = $('.store-locator-results-header');\n    var $h = $('.store-locator-results .wpsl-results-header');\n\n    if($h.length) {\n      $header.find('h3').replaceWith($h);\n      // $h.prependTo($header);\n    }\n  },\n\n  initMarkers: function() {\n    var activateResult = this.activateResult.bind(this);\n\n    for(var i = 0; i < markers.length; i++) {\n      google.maps.event.clearListeners(markers[i], 'click');\n\n      google.maps.event.addListener(markers[i], 'click', (function(i) {\n        return function() {\n          activateResult(i);\n        }\n      })(i));\n    }\n  },\n\n  activateResult: function(index) {\n    var $li = $('[data-result=\"'+index+'\"]');\n\n    if(!$li.is(':visible')) {\n      var page = Math.floor(index / 4);\n      this.paginate(page);\n    }\n\n    $('[data-result=\"'+index+'\"]').addClass('active').siblings().removeClass('active');\n    googlemap.panTo(markers[index].getPosition());\n\n    for(var i = 0; i < markers.length; i++) {\n      if(i == index) {\n        markers[i].setIcon({\n          url: SiteVars['template_url']+'/assets/images/map-marker-active.png',\n          scaledSize: new google.maps.Size(37,56),\n          anchor: new google.maps.Point(18.5,56)\n        })\n      } else {\n        markers[i].setIcon(wpsl_locator.mappin);\n      }\n    }\n  }\n}\n\nmodule.exports = StoreLocator;\n","/**\n * Function that always returns True\n */\nconst returnTrue = () => true\n\n/**\n * Function that always returns false\n */\nconst returnFalse = () => false\n\n/**\n * Identity function\n * @param {*} val\n * @return {*}\n */\nconst identity = (val) => val\n\nconst not = (val) => !val\n\n/**\n * Returns a curried function of the provided function, so that:\n *\n * f(a, b, c) = f(a, b)(c) = f(a)(b)(c) = f(a)(b, c)\n *\n * @param {Function} f\n * @param {..*} Initial parameters\n * @return {Function} The curried function\n */\nconst curry = (f, ...args) => args.length >= f.length ? f(...args) : curry.bind(this, f, ...args)\n\nconst allPass = (fs) => (...args) => {\n  for (let i = 0; i < fs.length; i++) {\n    if (!fs[ i ].apply(this, args)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * Takes in a list of predicates and return a function that will\n * pass its arguments through each of the predicates, returning\n * true if any predicate is satisfied.\n *\n * @param {Array<Function>}\n * @return {Function}\n */\nconst anyPass = (fs) => (...args) => {\n  for (let i = 0; i < fs.length; i++) {\n    if (fs[ i ].apply(this, args)) {\n      return true\n    }\n  }\n\n  return false\n}\n\n/**\n * Encapsulates switch/case or if/else logic.\n *\n * Takes a list of [predicate, transformer] pairs.\n *\n * The returned function passes its arguments to predicates, evaluates them, and execute the matched transformer (passing the\n * same arguments). If there's no matched predicate, return undefined.\n *\n * @param pairs Pairs of [predicate, transformer]\n * @return {Function} Encapsulated function\n */\nconst cond = (pairs) => (...args) => {\n  for (let i = 0; i < pairs.length; i++) {\n    if (pairs[ i ][ 0 ].apply(this, args)) {\n      return pairs[ i ][ 1 ].apply(this, args)\n    }\n  }\n\n  return undefined\n}\n\n/**\n * Encapsulate if/else logic. Basically a wrapper of `cond`.\n *\n * @param p Predicate\n * @param {Function} fT Function to call when predicate is true\n * @param {Function} fF Function to call when predicate is false\n * @return {Function} Encapsulated function\n */\nconst ifElse = (p, fT, fF) => cond([ [ p, fT ], [ returnTrue, fF ] ])\n\nconst when = (p, f) => cond([ [ p, f ], [ returnTrue, identity ] ])\n\n/**\n * Functional wrapper for array map function.\n *\n * @param {Function} f\n * @param {*} arr\n */\nconst map = curry((f, arr) => Array.isArray(arr) ? arr.map(f) : f(arr))\n\nconst filter = curry((f, arr) => Array.isArray(arr) ? arr.filter(f) : (f(arr) ? arr : undefined))\n\n/**\n * Partial application\n * @param {Function} f\n * @param {..*} args Initial parameters\n */\nconst partial = (f, ...args) => f.bind(this, ...args)\n\n/**\n * Transform a value by chaining a list of function from left to right\n *\n * @param val\n * @param {..Function} funcs\n * @return {*}\n */\nconst pipe = (...funcs) => function (val) { return funcs.reduce((acc, f) => f.apply(this, [ acc ]), val) }\n\nconst always = (val) => partial(val)\n\n/**\n * Get property of an object.\n *\n * This is a curried function.\n *\n * @param {string} prop\n * @param {Object} obj\n * @return {*}\n */\nconst getProp = curry((prop, obj) => {\n  return obj[prop]\n})\n\nconst lt = curry((b, a) => a < b)\n\nconst setProp = curry((prop, value, obj) => {\n  obj[ prop ] = value\n  return obj\n})\n\n/**\n * Delay execution of callback used on individual items of a list.\n *\n * This function is curried.\n *\n * @param {number} initial Initial timeout\n * @param {number} step Delay per execution\n * @param {Function} callback Callback\n * @param {Array} items\n * @private\n */\nconst _staggerCallback = (initial, step, callback, items) => (\n  items.reduce((delay, item) => {\n    setTimeout(() => callback(item), delay)\n    return delay + step\n  }, initial)\n)\n\n/**\n * Delay execution of callback used on individual items of a list.\n *\n * This function is curried.\n *\n * @param {number} initial Initial timeout\n * @param {number} step Delay per execution\n * @param {Function} callback Callback\n * @param {Array} items\n */\nconst staggerCallback = curry(_staggerCallback)\n\n/**\n * Encapsulate try/catch logic.\n *\n * Takes a pair of tryer and catcher functions. User must ensure tryer and catcher return the same\n * type so that chaining / composing works.\n *\n * Returns a function that can take arguments, which will be passed to both tryer and catcher.\n *\n * @param {Function} tryer\n * @param {Function} catcher\n * @return {Function} Encapsulated function\n */\nconst tryCatch = (tryer, catcher) => (...args) => {\n  try {\n    return tryer(...args)\n  } catch (e) {\n    return catcher(e, ...args)\n  }\n}\n\nconst whileDo = (pred, fn, initial) => pred(initial) ? whileDo(pred, fn, fn(initial)) : initial\n\nconst divide = curry((b, a) => a / b)\nconst multiply = curry((b, a) => a * b)\n\n/**\n * Check if an array contains an item.\n *\n * This is a curried wrapper for Array.prototype.indexOf\n *\n * @param {Array}\n * @param {*}\n * @return {boolean}\n */\nconst inArray = curry((array, item) => array.indexOf(item) !== -1)\n\n/**\n * Get the nth element of an array\n *\n * @param {number}\n * @param {Array}\n * @return {*}\n */\nconst nth = curry((index, array) => index < 0 ? array[ array.length + index ] : array[ index ])\n\n/**\n * Get the nth element of an array\n *\n * @param {Array}\n * @return {*}\n */\nconst first = nth(1)\n\nconst last = nth(-1)\nconst add = curry((b, a) => a + b)\nconst _add1ToLast = pipe(last, add(1))\n\nconst range = (from, to) => whileDo(\n  pipe(_add1ToLast, lt(to)),\n  (array) => [ ...array, _add1ToLast(array) ],\n  [ from ]\n)\n\nconst flipArgs = (f) => curry((arg1, arg2) => f.apply(this, [ arg2, arg1 ]))\n\nconst count = (arr) => arr.length\n\n/**\n * Create an array out of an array-like object\n *\n * @param {Object} Array-like object\n * @return {Array} Array\n */\nconst makeArray = (arrayLike) => Array.prototype.slice.call(arrayLike)\n\n/**\n * Log a value to console\n *\n * @param {*} val\n * @returns {*}\n */\nconst log = (val) => {\n  console.log(val)\n  return val\n}\n\nconst logWrap = (fn) => (...args) => log(fn.apply(this, args))\n\nconst logArgs = (fn) => (...args) => {\n  log(args)\n  return fn.apply(this, args)\n}\n\nconst debounce = (callback, wait, context = this) => {\n  let timeout = null\n  let callbackArgs = null\n\n  const later = () => callback.apply(context, callbackArgs)\n\n  return function () {\n    callbackArgs = arguments\n    clearTimeout(timeout)\n    timeout = setTimeout(later, wait)\n  }\n}\n\nconst then = curry((f, promise) => promise.then(f))\nconst reject = curry((f, promise) => promise.catch(f))\n\nexport {\n  add,\n  allPass,\n  always,\n  anyPass,\n  cond,\n  count,\n  debounce,\n  log,\n  logArgs,\n  logWrap,\n  makeArray,\n  curry,\n  divide,\n  filter,\n  first,\n  flipArgs,\n  getProp,\n  identity,\n  ifElse,\n  inArray,\n  last,\n  lt,\n  map,\n  multiply,\n  not,\n  nth,\n  partial,\n  pipe,\n  range,\n  returnTrue,\n  returnFalse,\n  setProp,\n  staggerCallback,\n  then,\n  reject,\n  tryCatch,\n  when,\n  whileDo\n}\n","'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\n\nmodule.exports = function debounce(func, wait, immediate){\n  var timeout, args, context, timestamp, result;\n  if (null == wait) wait = 100;\n\n  function later() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n    }\n  };\n\n  var debounced = function(){\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n\n  debounced.clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n\n  return debounced;\n};\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/**\n * Fizzy UI utils v2.0.5\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'desandro-matches-selector/matches-selector'\n    ], function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  var ary = [];\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    ary = obj;\n  } else if ( obj && typeof obj == 'object' &&\n    typeof obj.length == 'number' ) {\n    // convert nodeList to array\n    for ( var i=0; i < obj.length; i++ ) {\n      ary.push( obj[i] );\n    }\n  } else {\n    // array of single index\n    ary.push( obj );\n  }\n  return ary;\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    if ( timeout ) {\n      clearTimeout( timeout );\n    }\n    var args = arguments;\n\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold || 100 );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  var fragment = document.createDocumentFragment();\n  cells.forEach( function( cell ) {\n    fragment.appendChild( cell.element );\n  });\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n  var cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  var len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  var fragment = getCellsFragment( cells );\n  // append to slider\n  var isAppend = index == len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    var insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    var endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n\n  var selectedIndexDelta = index > this.selectedIndex ? 0 : cells.length;\n  this._cellAddedRemoved( index, selectedIndexDelta );\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n  var cells = this.getCells( elems );\n  var selectedIndexDelta = 0;\n  var len = cells.length;\n  var i, cell;\n  // calculate selectedIndexDelta, easier if done in seperate loop\n  for ( i=0; i < len; i++ ) {\n    cell = cells[i];\n    var wasBefore = this.cells.indexOf( cell ) < this.selectedIndex;\n    selectedIndexDelta -= wasBefore ? 1 : 0;\n  }\n\n  for ( i=0; i < len; i++ ) {\n    cell = cells[i];\n    cell.remove();\n    // remove item from collection\n    utils.removeFrom( this.cells, cell );\n  }\n\n  if ( cells.length ) {\n    // update stuff\n    this._cellAddedRemoved( 0, selectedIndexDelta );\n  }\n};\n\n// updates when cells are added or removed\nproto._cellAddedRemoved = function( changedCellIndex, selectedIndexDelta ) {\n  // TODO this math isn't perfect with grouped slides\n  selectedIndexDelta = selectedIndexDelta || 0;\n  this.selectedIndex += selectedIndexDelta;\n  this.selectedIndex = Math.max( 0, Math.min( this.slides.length - 1, this.selectedIndex ) );\n\n  this.cellChange( changedCellIndex, true );\n  // backwards compatibility\n  this.emitEvent( 'cellAddedRemoved', [ changedCellIndex, selectedIndexDelta ] );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  var cell = this.getCell( elem );\n  if ( !cell ) {\n    return;\n  }\n  cell.getSize();\n\n  var index = this.cells.indexOf( cell );\n  this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n  var prevSlideableWidth = this.slideableWidth;\n  this._positionCells( changedCellIndex );\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  if ( this.options.freeScroll ) {\n    // shift x by change in slideableWidth\n    // TODO fix position shifts when prepending w/ freeScroll\n    var deltaX = prevSlideableWidth - this.slideableWidth;\n    this.x += deltaX * this.cellAlign;\n    this.positionSlider();\n  } else {\n    // do not position slider after lazy load\n    if ( isPositioningSlider ) {\n      this.positionSliderAtSelected();\n    }\n    this.select( this.selectedIndex );\n  }\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'fizzy-ui-utils/utils'\n    ], function( utils ) {\n      return factory( window, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory(\n      window,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- requestAnimationFrame -------------------------- //\n\n// get rAF, prefixed, if present\nvar requestAnimationFrame = window.requestAnimationFrame ||\n  window.webkitRequestAnimationFrame;\n\n// fallback to setTimeout\nvar lastTime = 0;\nif ( !requestAnimationFrame )  {\n  requestAnimationFrame = function( callback ) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );\n    var id = setTimeout( callback, timeToCall );\n    lastTime = currTime + timeToCall;\n    return id;\n  };\n}\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) {\n    return;\n  }\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  var previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) {\n    var _this = this;\n    requestAnimationFrame( function animateFrame() {\n      _this.animate();\n    });\n  }\n};\n\n\nvar transformProperty = ( function () {\n  var style = document.documentElement.style;\n  if ( typeof style.transform == 'string' ) {\n    return 'transform';\n  }\n  return 'WebkitTransform';\n})();\n\nproto.positionSlider = function() {\n  var x = this.x;\n  // wrap position around\n  if ( this.options.wrapAround && this.cells.length > 1 ) {\n    x = utils.modulo( x, this.slideableWidth );\n    x = x - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  x = x + this.cursorPosition;\n  // reverse if right-to-left and using transform\n  x = this.options.rightToLeft && transformProperty ? -x : x;\n  var value = this.getPositionValue( x );\n  // use 3D tranforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style[ transformProperty ] = this.isAnimating ?\n    'translate3d(' + value + ',0,0)' : 'translateX(' + value + ')';\n\n  // scroll event\n  var firstSlide = this.slides[0];\n  if ( firstSlide ) {\n    var positionX = -this.x - firstSlide.target;\n    var progress = positionX / this.slidesWidth;\n    this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n  }\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) {\n    return;\n  }\n  this.x = -this.selectedSlide.target;\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n    this.restingFrames++;\n  }\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent('settle');\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  var beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  for ( var i=0; i < cells.length; i++ ) {\n    var cell = cells[i];\n    var cellShift = gap > 0 ? shift : 0;\n    cell.wrapShift( cellShift );\n    gap -= cell.size.outerWidth;\n  }\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  for ( var i=0; i < cells.length; i++ ) {\n    cells[i].wrapShift( 0 );\n  }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isPointerDown ) {\n    return;\n  }\n  // change the position to drag position by applying force\n  var dragVelocity = this.dragX - this.x;\n  var dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no cells\n  if ( this.isPointerDown || this.isFreeScrolling || !this.cells.length ) {\n    return;\n  }\n  var distance = this.selectedSlide.target * -1 - this.x;\n  var force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'get-size/get-size'\n    ], function( getSize ) {\n      return factory( window, getSize );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory(\n      window,\n      window.getSize\n    );\n  }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n  this.element = elem;\n  this.parent = parent;\n\n  this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n  this.element.style.position = 'absolute';\n  this.x = 0;\n  this.shift = 0;\n};\n\nproto.destroy = function() {\n  // reset style\n  this.element.style.position = '';\n  var side = this.parent.originSide;\n  this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n  this.x = x;\n  this.updateTarget();\n  this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n  var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n  this.target = this.x + this.size[ marginProperty ] +\n    this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n  // render position of cell with in slider\n  var side = this.parent.originSide;\n  this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n  this.shift = shift;\n  this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n  this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'unidragger/unidragger',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, Unidragger, utils ) {\n      return factory( window, Flickity, Unidragger, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('unidragger'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n      window,\n      window.Flickity,\n      window.Unidragger,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n  draggable: true,\n  dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// --------------------------  -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n  this.on( 'activate', this.bindDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'childUIPointerDown', this._childUIPointerDownDrag );\n  this.on( 'deactivate', this.unbindDrag );\n  // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n  // #457, RubaXa/Sortable#973\n  if ( isTouch && !isTouchmoveScrollCanceled ) {\n    window.addEventListener( 'touchmove', function() {});\n    isTouchmoveScrollCanceled = true;\n  }\n};\n\nproto.bindDrag = function() {\n  if ( !this.options.draggable || this.isDragBound ) {\n    return;\n  }\n  this.element.classList.add('is-draggable');\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.isDragBound = true;\n};\n\nproto.unbindDrag = function() {\n  if ( !this.isDragBound ) {\n    return;\n  }\n  this.element.classList.remove('is-draggable');\n  this.unbindHandles();\n  delete this.isDragBound;\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\nproto._childUIPointerDownDrag = function( event ) {\n  event.preventDefault();\n  this.pointerDownFocus( event );\n};\n\n// -------------------------- pointer events -------------------------- //\n\n// nodes that have text fields\nvar cursorNodes = {\n  TEXTAREA: true,\n  INPUT: true,\n  OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n  radio: true,\n  checkbox: true,\n  button: true,\n  submit: true,\n  image: true,\n  file: true,\n};\n\nproto.pointerDown = function( event, pointer ) {\n  // dismiss inputs with text fields. #403, #404\n  var isCursorInput = cursorNodes[ event.target.nodeName ] &&\n    !clickTypes[ event.target.type ];\n  if ( isCursorInput ) {\n    // reset pointerDown logic\n    this.isPointerDown = false;\n    delete this.pointerIdentifier;\n    return;\n  }\n\n  this._dragPointerDown( event, pointer );\n\n  // kludge to blur focused inputs in dragger\n  var focused = document.activeElement;\n  if ( focused && focused.blur && focused != this.element &&\n    // do not blur body for IE9 & 10, #117\n    focused != document.body ) {\n    focused.blur();\n  }\n  this.pointerDownFocus( event );\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n\n  this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nproto.pointerDownFocus = function( event ) {\n  // focus element, if not touch, and its not an input or select\n  var canPointerDown = getCanPointerDown( event );\n  if ( !this.options.accessibility || canPointerDown ) {\n    return;\n  }\n  var prevScrollY = window.pageYOffset;\n  this.element.focus();\n  // hack to fix scroll jump after focus, #76\n  if ( window.pageYOffset != prevScrollY ) {\n    window.scrollTo( window.pageXOffset, prevScrollY );\n  }\n};\n\nvar focusNodes = {\n  INPUT: true,\n  SELECT: true,\n};\n\nfunction getCanPointerDown( event ) {\n  var isTouchStart = event.type == 'touchstart';\n  var isTouchPointer = event.pointerType == 'touch';\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  return isTouchStart || isTouchPointer || isFocusNode;\n}\n\nproto.canPreventDefaultOnPointerDown = function( event ) {\n  // prevent default, unless touchstart or input\n  var canPointerDown = getCanPointerDown( event );\n  return !canPointerDown;\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n  this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n  this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  var direction = this.options.rightToLeft ? -1 : 1;\n  var dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.options.wrapAround && this.slides.length ) {\n    // slow drag\n    var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n\n  this.dragMoveTime = new Date();\n  this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  if ( this.options.freeScroll ) {\n    this.isFreeScrolling = true;\n  }\n  // set selectedIndex based on where flick will end up\n  var index = this.dragEndRestingSelect();\n\n  if ( this.options.freeScroll && !this.options.wrapAround ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    var restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // TODO refactor this, selecting here feels weird\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.options.wrapAround;\n  this.select( index );\n  delete this.isDragSelect;\n  this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n  var restingX = this.getRestingPosition();\n  // how far away from selected slide\n  var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  var positiveResting = this._getClosestResting( restingX, distance, 1 );\n  var negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  var index = positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n  return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  var index = this.selectedIndex;\n  var minDistance = Infinity;\n  var condition = this.options.contain && !this.options.wrapAround ?\n    // if contain, keep going if distance is equal to minDistance\n    function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) {\n      break;\n    }\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n  var len = this.slides.length;\n  // wrap around if at least 2 slides\n  var isWrapAround = this.options.wrapAround && len > 1;\n  var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  var slide = this.slides[ slideIndex ];\n  if ( !slide ) {\n    return null;\n  }\n  // add distance for wrap-around slides\n  var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  var delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n  // get clickedCell, if cell was clicked\n  var clickedCell = this.getParentCell( event.target );\n  var cellElem = clickedCell && clickedCell.element;\n  var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n  this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  var scroll = getScrollPosition();\n  var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this._pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'get-size/get-size',\n      'fizzy-ui-utils/utils',\n      './cell',\n      './slide',\n      './animate'\n    ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n      return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('ev-emitter'),\n      require('get-size'),\n      require('fizzy-ui-utils'),\n      require('./cell'),\n      require('./slide'),\n      require('./animate')\n    );\n  } else {\n    // browser global\n    var _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n      window,\n      window.EvEmitter,\n      window.getSize,\n      window.fizzyUIUtils,\n      _Flickity.Cell,\n      _Flickity.Slide,\n      _Flickity.animatePrototype\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize,\n  utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n  elems = utils.makeArray( elems );\n  while ( elems.length ) {\n    toElem.appendChild( elems.shift() );\n  }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    var instance = instances[ this.element.flickityGUID ];\n    instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  // add id for Flickity.data\n  var id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.originSide = this.options.rightToLeft ? 'right' : 'left';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n\n  if ( this.options.resize || this.options.watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  Flickity.createMethods.forEach( function( method ) {\n    this[ method ]();\n  }, this );\n\n  if ( this.options.watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) {\n    return;\n  }\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  var cellElems = this._filterFindCellElements( this.element.children );\n  moveElements( cellElems, this.slider );\n  this.viewport.appendChild( this.slider );\n  this.element.appendChild( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n\n  var index;\n  var initialIndex = this.options.initialIndex;\n  if ( this.isInitActivated ) {\n    index = this.selectedIndex;\n  } else if ( initialIndex !== undefined ) {\n    index = this.cells[ initialIndex ] ? initialIndex : 0;\n  } else {\n    index = 0;\n  }\n  // select instantly\n  this.select( index, false, true );\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  var slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  slider.style[ this.originSide ] = 0;\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  var cellElems = this._filterFindCellElements( elems );\n\n  // create new Flickity for collection\n  var cells = cellElems.map( function( cellElem ) {\n    return new Cell( cellElem, this );\n  }, this );\n\n  return cells;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  var cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    var startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n  var len = this.cells.length;\n  for ( var i=index; i < len; i++ ) {\n    var cell = this.cells[i];\n    cell.setPosition( cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  }\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( function( cell ) {\n    cell.getSize();\n  });\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) {\n    return;\n  }\n\n  var slide = new Slide( this );\n  this.slides.push( slide );\n  var isOriginLeft = this.originSide == 'left';\n  var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n  var canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( function( cell, i ) {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n    if ( canCellFit.call( this, i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( this );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  }, this );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  var groupCells = this.options.groupCells;\n  if ( !groupCells ) {\n    return function() {\n      return false;\n    };\n  } else if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    var number = parseInt( groupCells, 10 );\n    return function( i ) {\n      return ( i % number ) !== 0;\n    };\n  }\n  // default, group by width of slide\n  // parse '75%\n  var percentMatch = typeof groupCells == 'string' &&\n    groupCells.match(/^(\\d+)%$/);\n  var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n  return function( i, slideWidth ) {\n    return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n  };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n  // cell align, then based on origin side\n  center: {\n    left: 0.5,\n    right: 0.5\n  },\n  left: {\n    left: 0,\n    right: 1\n  },\n  right: {\n    right: 0,\n    left: 1\n  }\n};\n\nproto.setCellAlign = function() {\n  var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n  this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( this.options.setGallerySize ) {\n    var height = this.options.adaptiveHeight && this.selectedSlide ?\n      this.selectedSlide.height : this.maxCellHeight;\n    this.viewport.style.height = height + 'px';\n  }\n};\n\nproto._getWrapShiftCells = function() {\n  // only for wrap-around\n  if ( !this.options.wrapAround ) {\n    return;\n  }\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  var gapX = this.cursorPosition;\n  var cellIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  gapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  var cells = [];\n  while ( gapX > 0 ) {\n    var cell = this.cells[ cellIndex ];\n    if ( !cell ) {\n      break;\n    }\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n    return;\n  }\n  var isRightToLeft = this.options.rightToLeft;\n  var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n  var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n  var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n  // content is less than gallery size\n  var isContentSmaller = contentWidth < this.size.innerWidth;\n  // bounds\n  var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n  var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n  // contain each cell target\n  this.slides.forEach( function( slide ) {\n    if ( isContentSmaller ) {\n      // all cells fit inside gallery\n      slide.target = contentWidth * this.cellAlign;\n    } else {\n      // contain to bounds\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    }\n  }, this );\n};\n\n// -----  ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    var $event = type;\n    if ( event ) {\n      // create jQuery event\n      var jQEvent = jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) {\n    return;\n  }\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.options.wrapAround || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) {\n    return;\n  }\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n\n  this.dispatchEvent('select');\n  // old v1 event name, remove in v3\n  this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  var len = this.slides.length;\n  var isWrapping = this.options.wrapAround && len > 1;\n  if ( !isWrapping ) {\n    return index;\n  }\n  var wrapIndex = utils.modulo( index, len );\n  // go to shortest\n  var delta = Math.abs( wrapIndex - this.selectedIndex );\n  var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n  var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n  if ( !this.isDragSelect && backWrapDelta < delta ) {\n    index += len;\n  } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n    index -= len;\n  }\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= this.slideableWidth;\n  } else if ( index >= len ) {\n    this.x += this.slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  var slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) {\n    return;\n  }\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  // Remove in v3?\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) {\n    this.selectedSlide.unselect();\n  }\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  var cell;\n  if ( typeof value == 'number' ) {\n    cell = this.cells[ value ];\n  } else {\n    // use string as selector\n    if ( typeof value == 'string' ) {\n      value = this.element.querySelector( value );\n    }\n    // get cell from element\n    cell = this.getCell( value );\n  }\n  // select slide that has cell\n  for ( var i=0; cell && i < this.slides.length; i++ ) {\n    var slide = this.slides[i];\n    var index = slide.cells.indexOf( cell );\n    if ( index != -1 ) {\n      this.select( i, isWrap, isInstant );\n      return;\n    }\n  }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( var i=0; i < this.cells.length; i++ ) {\n    var cell = this.cells[i];\n    if ( cell.element == elem ) {\n      return cell;\n    }\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  var cells = [];\n  elems.forEach( function( elem ) {\n    var cell = this.getCell( elem );\n    if ( cell ) {\n      cells.push( cell );\n    }\n  }, this );\n  return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  var cell = this.getCell( elem );\n  if ( cell ) {\n    return cell;\n  }\n  // try to get parent cell elem\n  elem = utils.getParent( elem, '.flickity-slider > *' );\n  return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) {\n    return this.selectedSlide.getCellElements();\n  }\n  index = index === undefined ? this.selectedIndex : index;\n\n  var len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements();\n  }\n\n  var cellElems = [];\n  for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n    var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n    var slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\nproto.childUIPointerDown = function( event ) {\n  this.emitEvent( 'childUIPointerDown', [ event ] );\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.getSize();\n  // wrap values\n  if ( this.options.wrapAround ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  var selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  var watchOption = this.options.watchCSS;\n  if ( !watchOption ) {\n    return;\n  }\n\n  var afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.indexOf('flickity') != -1 ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  // only work if element is in focus\n  if ( !this.options.accessibility ||\n    ( document.activeElement && document.activeElement != this.element ) ) {\n    return;\n  }\n\n  if ( event.keyCode == 37 ) {\n    // go left\n    var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this.uiChange();\n    this[ leftMethod ]();\n  } else if ( event.keyCode == 39 ) {\n    // go right\n    var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this.uiChange();\n    this[ rightMethod ]();\n  }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  // destroy cells\n  this.cells.forEach( function( cell ) {\n    cell.destroy();\n  });\n  this.unselectSelectedSlide();\n  this.element.removeChild( this.viewport );\n  // move child elements back into element\n  moveElements( this.slider.children, this.element );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.flickityGUID;\n  return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n  jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.0.10\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * http://flickity.metafizzy.co\n * Copyright 2017 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      './drag',\n      './prev-next-button',\n      './page-dots',\n      './player',\n      './add-remove-cell',\n      './lazyload'\n    ], factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('./flickity'),\n      require('./drag'),\n      require('./prev-next-button'),\n      require('./page-dots'),\n      require('./player'),\n      require('./add-remove-cell'),\n      require('./lazyload')\n    );\n  }\n\n})( window, function factory( Flickity ) {\n  /*jshint strict: false*/\n  return Flickity;\n});\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n  this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n  var lazyLoad = this.options.lazyLoad;\n  if ( !lazyLoad ) {\n    return;\n  }\n  // get adjacent cells, use lazyLoad option for adjacent count\n  var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  var cellElems = this.getAdjacentCellElements( adjCount );\n  // get lazy images in those cells\n  var lazyImages = [];\n  cellElems.forEach( function( cellElem ) {\n    var lazyCellImages = getCellLazyImages( cellElem );\n    lazyImages = lazyImages.concat( lazyCellImages );\n  });\n  // load lazy images\n  lazyImages.forEach( function( img ) {\n    new LazyLoader( img, this );\n  }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.nodeName == 'IMG' &&\n    cellElem.getAttribute('data-flickity-lazyload') ) {\n    return [ cellElem ];\n  }\n  // select lazy images in cell\n  var imgs = cellElem.querySelectorAll('img[data-flickity-lazyload]');\n  return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n  this.img = img;\n  this.flickity = flickity;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // load image\n  this.img.src = this.img.getAttribute('data-flickity-lazyload');\n  // remove attr\n  this.img.removeAttribute('data-flickity-lazyload');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n\n  var cell = this.flickity.getParentCell( this.img );\n  var cellElem = cell && cell.element;\n  this.flickity.cellSizeChange( cellElem );\n\n  this.img.classList.add( className );\n  this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'tap-listener/tap-listener',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, TapListener, utils ) {\n      return factory( window, Flickity, TapListener, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('tap-listener'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.TapListener,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, TapListener, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n  this.parent = parent;\n  this._create();\n}\n\nPageDots.prototype = new TapListener();\n\nPageDots.prototype._create = function() {\n  // create holder element\n  this.holder = document.createElement('ol');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n  // events\n  this.on( 'tap', this.onTap );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n  this.setDots();\n  this.bindTap( this.holder );\n  // add to DOM\n  this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.holder );\n  TapListener.prototype.destroy.call( this );\n};\n\nPageDots.prototype.setDots = function() {\n  // get difference between number of slides and number of dots\n  var delta = this.parent.slides.length - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  var fragment = document.createDocumentFragment();\n  var newDots = [];\n  while ( count ) {\n    var dot = document.createElement('li');\n    dot.className = 'dot';\n    fragment.appendChild( dot );\n    newDots.push( dot );\n    count--;\n  }\n  this.holder.appendChild( fragment );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  var removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( function( dot ) {\n    this.holder.removeChild( dot );\n  }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.className = 'dot';\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) {\n    return;\n  }\n  this.selectedDot = this.dots[ this.parent.selectedIndex ];\n  this.selectedDot.className = 'dot is-selected';\n};\n\nPageDots.prototype.onTap = function( event ) {\n  var target = event.target;\n  // only care about dot clicks\n  if ( target.nodeName != 'LI' ) {\n    return;\n  }\n\n  this.parent.uiChange();\n  var index = this.dots.indexOf( target );\n  this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n  this.deactivate();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n  if ( !this.options.pageDots ) {\n    return;\n  }\n  this.pageDots = new PageDots( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n  this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.deactivate();\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'fizzy-ui-utils/utils',\n      './flickity'\n    ], function( EvEmitter, utils, Flickity ) {\n      return factory( EvEmitter, utils, Flickity );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('ev-emitter'),\n      require('fizzy-ui-utils'),\n      require('./flickity')\n    );\n  } else {\n    // browser global\n    factory(\n      window.EvEmitter,\n      window.fizzyUIUtils,\n      window.Flickity\n    );\n  }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Page Visibility -------------------------- //\n// https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API\n\nvar hiddenProperty, visibilityEvent;\nif ( 'hidden' in document ) {\n  hiddenProperty = 'hidden';\n  visibilityEvent = 'visibilitychange';\n} else if ( 'webkitHidden' in document ) {\n  hiddenProperty = 'webkitHidden';\n  visibilityEvent = 'webkitvisibilitychange';\n}\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n  this.parent = parent;\n  this.state = 'stopped';\n  // visibility change event handler\n  if ( visibilityEvent ) {\n    this.onVisibilityChange = function() {\n      this.visibilityChange();\n    }.bind( this );\n    this.onVisibilityPlay = function() {\n      this.visibilityPlay();\n    }.bind( this );\n  }\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state == 'playing' ) {\n    return;\n  }\n  // do not play if page is hidden, start playing when page is visible\n  var isPageHidden = document[ hiddenProperty ];\n  if ( visibilityEvent && isPageHidden ) {\n    document.addEventListener( visibilityEvent, this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  if ( visibilityEvent ) {\n    document.addEventListener( visibilityEvent, this.onVisibilityChange );\n  }\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state != 'playing' ) {\n    return;\n  }\n\n  var time = this.parent.options.autoPlay;\n  // default to 3 seconds\n  time = typeof time == 'number' ? time : 3000;\n  var _this = this;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( function() {\n    _this.parent.next( true );\n    _this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  if ( visibilityEvent ) {\n    document.removeEventListener( visibilityEvent, this.onVisibilityChange );\n  }\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state == 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state == 'paused' ) {\n    this.play();\n  }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  var isPageHidden = document[ hiddenProperty ];\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( visibilityEvent, this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n  this.player = new Player( this );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) {\n    return;\n  }\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) {\n    return;\n  }\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'tap-listener/tap-listener',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, TapListener, utils ) {\n      return factory( window, Flickity, TapListener, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('tap-listener'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.TapListener,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, TapListener, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n  this.direction = direction;\n  this.parent = parent;\n  this._create();\n}\n\nPrevNextButton.prototype = new TapListener();\n\nPrevNextButton.prototype._create = function() {\n  // properties\n  this.isEnabled = true;\n  this.isPrevious = this.direction == -1;\n  var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n  this.isLeft = this.direction == leftDirection;\n\n  var element = this.element = document.createElement('button');\n  element.className = 'flickity-prev-next-button';\n  element.className += this.isPrevious ? ' previous' : ' next';\n  // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  // init as disabled\n  this.disable();\n\n  element.setAttribute( 'aria-label', this.isPrevious ? 'previous' : 'next' );\n\n  // create arrow\n  var svg = this.createSVG();\n  element.appendChild( svg );\n  // events\n  this.on( 'tap', this.onTap );\n  this.parent.on( 'select', this.update.bind( this ) );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n  this.bindTap( this.element );\n  // click events from keyboard\n  this.element.addEventListener( 'click', this );\n  // add to DOM\n  this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.element );\n  // do regular TapListener destroy\n  TapListener.prototype.destroy.call( this );\n  // click events from keyboard\n  this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n  var svg = document.createElementNS( svgURI, 'svg');\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  var path = document.createElementNS( svgURI, 'path');\n  var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n  }\n  svg.appendChild( path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) {\n    return shape;\n  }\n  // create movement string\n  return 'M ' + shape.x0 + ',50' +\n    ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n    ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n    ' L ' + shape.x3 + ',50 ' +\n    ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n    ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n    ' Z';\n}\n\nPrevNextButton.prototype.onTap = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.parent.uiChange();\n  var method = this.isPrevious ? 'previous' : 'next';\n  this.parent[ method ]();\n};\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n  // only allow clicks from keyboard\n  var focused = document.activeElement;\n  if ( focused && focused == this.element ) {\n    this.onTap();\n  }\n};\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  if ( this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = false;\n  this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = true;\n  this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n  // index of first or last slide, if previous or next\n  var slides = this.parent.slides;\n  // enable is wrapAround and at least 2 slides\n  if ( this.parent.options.wrapAround && slides.length > 1 ) {\n    this.enable();\n    return;\n  }\n  var lastIndex = slides.length ? slides.length - 1 : 0;\n  var boundIndex = this.isPrevious ? 0 : lastIndex;\n  var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n  this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n  this.deactivate();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30\n  }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) {\n    return;\n  }\n\n  this.prevButton = new PrevNextButton( -1, this );\n  this.nextButton = new PrevNextButton( 1, this );\n\n  this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.activate();\n  this.nextButton.activate();\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.deactivate();\n  this.nextButton.deactivate();\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n  this.parent = parent;\n  this.isOriginLeft = parent.originSide == 'left';\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length == 1 ) {\n    this.x = cell.x; // x comes from first cell\n    var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n    this.firstMargin = cell.size[ beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n  var lastCell = this.getLastCell();\n  var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n  var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.changeSelectedClass('add');\n};\n\nproto.unselect = function() {\n  this.changeSelectedClass('remove');\n};\n\nproto.changeSelectedClass = function( method ) {\n  this.cells.forEach( function( cell ) {\n    cell.element.classList[ method ]('is-selected');\n  });\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\nreturn Slide;\n\n}));\n","// get successful control from form and assemble into object\n// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2\n\n// types which indicate a submit action and are not successful controls\n// these will be ignored\nvar k_r_submitter = /^(?:submit|button|image|reset|file)$/i;\n\n// node names which could be successful controls\nvar k_r_success_contrls = /^(?:input|select|textarea|keygen)/i;\n\n// keys with brackets for hash keys\nvar object_brackets_regex = /\\[(.+?)\\]/g;\nvar array_brackets_regex = /\\[\\]$/;\nvar brackeks_prefix_regex = /^(.+?)\\[/;\n\n// serializes form fields\n// @param form MUST be an HTMLForm element\n// @param options is an optional argument to configure the serialization. Default output\n// with no options specified is a url encoded string\n//    - hash: [true | false] Configure the output type. If true, the output will\n//    be a js object.\n//    - serializer: [function] Optional serializer function to override the default one.\n//    The function takes 3 arguments (result, key, value) and should return new result\n//    hash and url encoded str serializers are provided with this module\n//    - disabled: [true | false]. If true serialize disabled fields.\n//    - empty: [true | false]. If true serialize empty fields\nfunction serialize(form, options) {\n    if (typeof options != 'object') {\n        options = { hash: !!options };\n    }\n    else if (options.hash === undefined) {\n        options.hash = true;\n    }\n\n    var result = (options.hash) ? {} : '';\n    var serializer = options.serializer || ((options.hash) ? hash_serializer : str_serialize);\n\n    var elements = form.elements || [];\n\n    //Object store each radio and set if it's empty or not\n    var radio_store = Object.create(null);\n\n    for (var i=0 ; i<elements.length ; ++i) {\n        var element = elements[i];\n\n        // ingore disabled fields\n        if ((!options.disabled && element.disabled) || !element.name) {\n            continue;\n        }\n        // ignore anyhting that is not considered a success field\n        if (!k_r_success_contrls.test(element.nodeName) ||\n            k_r_submitter.test(element.type)) {\n            continue;\n        }\n\n        var key = element.name;\n        var val = element.value;\n\n        // we can't just use element.value for checkboxes cause some browsers lie to us\n        // they say \"on\" for value when the box isn't checked\n        if ((element.type === 'checkbox' || element.type === 'radio') && !element.checked) {\n            val = undefined;\n        }\n        \n        // If we want empty elements\n        if (options.empty) {\n            // for checkbox\n            if (element.type === 'checkbox' && !element.checked) {\n                val = '';\n            }\n\n            // for radio\n            if (element.type === 'radio') {\n                if (!radio_store[element.name] && !element.checked) {\n                    radio_store[element.name] = false\n                }\n                else if (element.checked) {\n                    radio_store[element.name] = true\n                }\n            }\n\n            // if options empty is true, continue only if its radio\n            if (!val && element.type == 'radio') {\n                continue;\n            }\n        }\n        else {\n            // value-less fields are ignored unless options.empty is true\n            if (!val) {\n                continue;\n            }\n        }\n\n        // multi select boxes\n        if (element.type === 'select-multiple') {\n            val = [];\n\n            var selectOptions = element.options;\n            var isSelectedOptions = false;\n            for (var j=0 ; j<selectOptions.length ; ++j) {\n                var option = selectOptions[j];\n                if (option.selected) {\n                    isSelectedOptions = true\n                    result = serializer(result, key, option.value);\n                }\n            }\n\n            // Serialize if no selected options and options.empty is true\n            if (!isSelectedOptions && options.empty) {\n                result = serializer(result, key, '');\n            }\n            \n            continue;\n        }\n        result = serializer(result, key, val);\n    }\n\n    // Check for all empty radio buttons and serialize them with key=\"\"\n    if (options.empty) {\n        for (var key in radio_store) {\n            if (!radio_store[key]) {\n                result = serializer(result, key, '');\n            }\n        }\n    }\n\n    return result;\n}\n\n// obj/hash encoding serializer\nfunction hash_serializer(result, key, value) {\n    var is_array_key = has_array_brackets(key);\n    if (is_array_key) {\n        key = key.replace(array_brackets_regex, '');\n    }\n\n    if (key in result) {\n        var existing = result[key];\n        if (!Array.isArray(existing)) {\n            result[key] = [existing];\n        }\n        result[key].push(value);\n    }\n    else {\n        if (has_object_brackets(key)) {\n          extract_from_brackets(result, key, value);\n        }\n        else {\n          result[key] = is_array_key ? [value] : value;\n        }\n    }\n\n    return result;\n};\n\n// urlform encoding serializer\nfunction str_serialize(result, key, value) {\n    // encode newlines as \\r\\n cause the html spec says so\n    value = value.replace(/(\\r)?\\n/g, '\\r\\n');\n    value = encodeURIComponent(value);\n\n    // spaces should be '+' rather than '%20'.\n    value = value.replace(/%20/g, '+');\n    return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + value;\n};\n\nfunction has_object_brackets(string) {\n  return string.match(object_brackets_regex);\n};\n\nfunction has_array_brackets(string) {\n    return string.match(array_brackets_regex);\n}\n\nfunction matches_between_brackets(string) {\n    // Make sure to isolate object_brackets_regex from .exec() calls\n    var regex = new RegExp(object_brackets_regex);\n    var matches = [];\n    var match;\n\n    while (match = regex.exec(string)) {\n      matches.push(match[1]);\n    }\n\n    return matches;\n};\n\nfunction extract_from_brackets(result, key, value) {\n    var prefix = key.match(brackeks_prefix_regex)[1];\n\n    // Set the key if it doesn't exist\n    if (! result[prefix]) result[prefix] = {};\n\n    var parent = result[prefix];\n    var matches_between = matches_between_brackets(key);\n    var length = matches_between.length;\n\n    for (var i = 0; i < length; i++) {\n        var child = matches_between[i];\n        var isLast = (length === i + 1);\n\n        if (isLast) {\n            var existing = parent[child];\n\n            if (existing) {\n                if (! Array.isArray(existing)) {\n                    parent[child] = [ existing ];\n                }\n\n                parent[child].push(value);\n            }\n            else {\n                // Finally make the assignment\n                parent[child] = value;\n            }\n\n        }\n        else {\n            // This is a nested key, set it properly for the next iteration\n            parent[child] = parent[child] || {};\n            parent = parent[child];\n        }\n    }\n\n    parent = value;\n};\n\nmodule.exports = serialize;\n","/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n  'use strict';\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( function() {\n      return factory();\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See http://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * WebKit measures the outer-width on style.width on border-box elems\n   * IE & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n\n  getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n  body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n","/*!\n * History API JavaScript Library v4.2.8\n *\n * Support: IE8+, FF3+, Opera 9+, Safari, Chrome and other\n *\n * Copyright 2011-2017, Dmitrii Pakhtinov ( spb.piksel@gmail.com )\n *\n * http://spb-piksel.ru/\n *\n * MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * Update: 2017-03-01 12:07\n */\n(function(factory) {\n  if (typeof define === 'function' && define['amd']) {\n    if (typeof requirejs !== 'undefined') {\n      // https://github.com/devote/HTML5-History-API/issues/73\n      var r = requirejs,\n          rndKey = '[history' + (new Date()).getTime() + ']';\n      var onError = r['onError'];\n      factory.toString = function() {\n        return rndKey;\n      };\n      r['onError'] = function(err) {\n        if (err.message.indexOf(rndKey) === -1) {\n          onError.call(r, err);\n        }\n      };\n    }\n    define([], factory);\n  }\n  // commonJS support\n  if (typeof exports === \"object\" && typeof module !== \"undefined\") {\n    module['exports'] = factory();\n  } else {\n    // execute anyway\n    return factory();\n  }\n})(function() {\n  // Define global variable\n  var global = (typeof window === 'object' ? window : this) || {};\n  // Prevent the code from running if there is no window.history object or library already loaded\n  if (!global.history || \"emulate\" in global.history) return global.history;\n  // symlink to document\n  var document = global.document;\n  // HTML element\n  var documentElement = document.documentElement;\n  // symlink to constructor of Object\n  var Object = global['Object'];\n  // symlink to JSON Object\n  var JSON = global['JSON'];\n  // symlink to instance object of 'Location'\n  var windowLocation = global.location;\n  // symlink to instance object of 'History'\n  var windowHistory = global.history;\n  // new instance of 'History'. The default is a reference to the original object instance\n  var historyObject = windowHistory;\n  // symlink to method 'history.pushState'\n  var historyPushState = windowHistory.pushState;\n  // symlink to method 'history.replaceState'\n  var historyReplaceState = windowHistory.replaceState;\n  // if the browser supports HTML5-History-API\n  var isSupportHistoryAPI = isSupportHistoryAPIDetect();\n  // verifies the presence of an object 'state' in interface 'History'\n  var isSupportStateObjectInHistory = 'state' in windowHistory;\n  // symlink to method 'Object.defineProperty'\n  var defineProperty = Object.defineProperty;\n  // new instance of 'Location', for IE8 will use the element HTMLAnchorElement, instead of pure object\n  var locationObject = redefineProperty({}, 't') ? {} : document.createElement('a');\n  // prefix for the names of events\n  var eventNamePrefix = '';\n  // String that will contain the name of the method\n  var addEventListenerName = global.addEventListener ? 'addEventListener' : (eventNamePrefix = 'on') && 'attachEvent';\n  // String that will contain the name of the method\n  var removeEventListenerName = global.removeEventListener ? 'removeEventListener' : 'detachEvent';\n  // String that will contain the name of the method\n  var dispatchEventName = global.dispatchEvent ? 'dispatchEvent' : 'fireEvent';\n  // reference native methods for the events\n  var addEvent = global[addEventListenerName];\n  var removeEvent = global[removeEventListenerName];\n  var dispatch = global[dispatchEventName];\n  // default settings\n  var settings = {\"basepath\": '/', \"redirect\": 0, \"type\": '/', \"init\": 0};\n  // key for the sessionStorage\n  var sessionStorageKey = '__historyAPI__';\n  // Anchor Element for parseURL function\n  var anchorElement = document.createElement('a');\n  // last URL before change to new URL\n  var lastURL = windowLocation.href;\n  // Control URL, need to fix the bug in Opera\n  var checkUrlForPopState = '';\n  // for fix on Safari 8\n  var triggerEventsInWindowAttributes = 1;\n  // trigger event 'onpopstate' on page load\n  var isFireInitialState = false;\n  // if used history.location of other code\n  var isUsedHistoryLocationFlag = 0;\n  // store a list of 'state' objects in the current session\n  var stateStorage = {};\n  // in this object will be stored custom handlers\n  var eventsList = {};\n  // stored last title\n  var lastTitle = document.title;\n  // store a custom origin\n  var customOrigin;\n\n  /**\n   * Properties that will be replaced in the global\n   * object 'window', to prevent conflicts\n   *\n   * @type {Object}\n   */\n  var eventsDescriptors = {\n    \"onhashchange\": null,\n    \"onpopstate\": null\n  };\n\n  /**\n   * Fix for Chrome in iOS\n   * See https://github.com/devote/HTML5-History-API/issues/29\n   */\n  var fastFixChrome = function(method, args) {\n    var isNeedFix = global.history !== windowHistory;\n    if (isNeedFix) {\n      global.history = windowHistory;\n    }\n    method.apply(windowHistory, args);\n    if (isNeedFix) {\n      global.history = historyObject;\n    }\n  };\n\n  /**\n   * Properties that will be replaced/added to object\n   * 'window.history', includes the object 'history.location',\n   * for a complete the work with the URL address\n   *\n   * @type {Object}\n   */\n  var historyDescriptors = {\n    /**\n     * Setting library initialization\n     *\n     * @param {null|String} [basepath] The base path to the site; defaults to the root \"/\".\n     * @param {null|String} [type] Substitute the string after the anchor; by default \"/\".\n     * @param {null|Boolean} [redirect] Enable link translation.\n     */\n    \"setup\": function(basepath, type, redirect) {\n      settings[\"basepath\"] = ('' + (basepath == null ? settings[\"basepath\"] : basepath))\n        .replace(/(?:^|\\/)[^\\/]*$/, '/');\n      settings[\"type\"] = type == null ? settings[\"type\"] : type;\n      settings[\"redirect\"] = redirect == null ? settings[\"redirect\"] : !!redirect;\n    },\n    /**\n     * @namespace history\n     * @param {String} [type]\n     * @param {String} [basepath]\n     */\n    \"redirect\": function(type, basepath) {\n      historyObject['setup'](basepath, type);\n      basepath = settings[\"basepath\"];\n      if (global.top == global.self) {\n        var relative = parseURL(null, false, true)._relative;\n        var path = windowLocation.pathname + windowLocation.search;\n        if (isSupportHistoryAPI) {\n          path = path.replace(/([^\\/])$/, '$1/');\n          if (relative != basepath && (new RegExp(\"^\" + basepath + \"$\", \"i\")).test(path)) {\n            windowLocation.replace(relative);\n          }\n        } else if (path != basepath) {\n          path = path.replace(/([^\\/])\\?/, '$1/?');\n          if ((new RegExp(\"^\" + basepath, \"i\")).test(path)) {\n            windowLocation.replace(basepath + '#' + path.\n              replace(new RegExp(\"^\" + basepath, \"i\"), settings[\"type\"]) + windowLocation.hash);\n          }\n        }\n      }\n    },\n    /**\n     * The method adds a state object entry\n     * to the history.\n     *\n     * @namespace history\n     * @param {Object} state\n     * @param {string} title\n     * @param {string} [url]\n     */\n    pushState: function(state, title, url) {\n      var t = document.title;\n      if (lastTitle != null) {\n        document.title = lastTitle;\n      }\n      historyPushState && fastFixChrome(historyPushState, arguments);\n      changeState(state, url);\n      document.title = t;\n      lastTitle = title;\n    },\n    /**\n     * The method updates the state object,\n     * title, and optionally the URL of the\n     * current entry in the history.\n     *\n     * @namespace history\n     * @param {Object} state\n     * @param {string} title\n     * @param {string} [url]\n     */\n    replaceState: function(state, title, url) {\n      var t = document.title;\n      if (lastTitle != null) {\n        document.title = lastTitle;\n      }\n      delete stateStorage[windowLocation.href];\n      historyReplaceState && fastFixChrome(historyReplaceState, arguments);\n      changeState(state, url, true);\n      document.title = t;\n      lastTitle = title;\n    },\n    /**\n     * Object 'history.location' is similar to the\n     * object 'window.location', except that in\n     * HTML4 browsers it will behave a bit differently\n     *\n     * @namespace history\n     */\n    \"location\": {\n      set: function(value) {\n        if (isUsedHistoryLocationFlag === 0) isUsedHistoryLocationFlag = 1;\n        global.location = value;\n      },\n      get: function() {\n        if (isUsedHistoryLocationFlag === 0) isUsedHistoryLocationFlag = 1;\n        return locationObject;\n      }\n    },\n    /**\n     * A state object is an object representing\n     * a user interface state.\n     *\n     * @namespace history\n     */\n    \"state\": {\n      get: function() {\n        if (typeof stateStorage[windowLocation.href] === 'object') {\n          return JSON.parse(JSON.stringify(stateStorage[windowLocation.href]));\n        } else if(typeof stateStorage[windowLocation.href] !== 'undefined') {\n          return stateStorage[windowLocation.href];\n        } else {\n          return null;\n        }\n      }\n    }\n  };\n\n  /**\n   * Properties for object 'history.location'.\n   * Object 'history.location' is similar to the\n   * object 'window.location', except that in\n   * HTML4 browsers it will behave a bit differently\n   *\n   * @type {Object}\n   */\n  var locationDescriptors = {\n    /**\n     * Navigates to the given page.\n     *\n     * @namespace history.location\n     */\n    assign: function(url) {\n      if (!isSupportHistoryAPI && ('' + url).indexOf('#') === 0) {\n        changeState(null, url);\n      } else {\n        windowLocation.assign(url);\n      }\n    },\n    /**\n     * Reloads the current page.\n     *\n     * @namespace history.location\n     */\n    reload: function(flag) {\n      windowLocation.reload(flag);\n    },\n    /**\n     * Removes the current page from\n     * the session history and navigates\n     * to the given page.\n     *\n     * @namespace history.location\n     */\n    replace: function(url) {\n      if (!isSupportHistoryAPI && ('' + url).indexOf('#') === 0) {\n        changeState(null, url, true);\n      } else {\n        windowLocation.replace(url);\n      }\n    },\n    /**\n     * Returns the current page's location.\n     *\n     * @namespace history.location\n     */\n    toString: function() {\n      return this.href;\n    },\n    /**\n     * Returns the current origin.\n     *\n     * @namespace history.location\n     */\n    \"origin\": {\n      get: function() {\n        if (customOrigin !== void 0) {\n          return customOrigin;\n        }\n        if (!windowLocation.origin) {\n          return windowLocation.protocol + \"//\" + windowLocation.hostname + (windowLocation.port ? ':' + windowLocation.port: '');\n        }\n        return windowLocation.origin;\n      },\n      set: function(value) {\n        customOrigin = value;\n      }\n    },\n    /**\n     * Returns the current page's location.\n     * Can be set, to navigate to another page.\n     *\n     * @namespace history.location\n     */\n    \"href\": isSupportHistoryAPI ? null : {\n      get: function() {\n        return parseURL()._href;\n      }\n    },\n    /**\n     * Returns the current page's protocol.\n     *\n     * @namespace history.location\n     */\n    \"protocol\": null,\n    /**\n     * Returns the current page's host and port number.\n     *\n     * @namespace history.location\n     */\n    \"host\": null,\n    /**\n     * Returns the current page's host.\n     *\n     * @namespace history.location\n     */\n    \"hostname\": null,\n    /**\n     * Returns the current page's port number.\n     *\n     * @namespace history.location\n     */\n    \"port\": null,\n    /**\n     * Returns the current page's path only.\n     *\n     * @namespace history.location\n     */\n    \"pathname\": isSupportHistoryAPI ? null : {\n      get: function() {\n        return parseURL()._pathname;\n      }\n    },\n    /**\n     * Returns the current page's search\n     * string, beginning with the character\n     * '?' and to the symbol '#'\n     *\n     * @namespace history.location\n     */\n    \"search\": isSupportHistoryAPI ? null : {\n      get: function() {\n        return parseURL()._search;\n      }\n    },\n    /**\n     * Returns the current page's hash\n     * string, beginning with the character\n     * '#' and to the end line\n     *\n     * @namespace history.location\n     */\n    \"hash\": isSupportHistoryAPI ? null : {\n      set: function(value) {\n        changeState(null, ('' + value).replace(/^(#|)/, '#'), false, lastURL);\n      },\n      get: function() {\n        return parseURL()._hash;\n      }\n    }\n  };\n\n  /**\n   * Just empty function\n   *\n   * @return void\n   */\n  function emptyFunction() {\n    // dummy\n  }\n\n  /**\n   * Prepares a parts of the current or specified reference for later use in the library\n   *\n   * @param {string} [href]\n   * @param {boolean} [isWindowLocation]\n   * @param {boolean} [isNotAPI]\n   * @return {Object}\n   */\n  function parseURL(href, isWindowLocation, isNotAPI) {\n    var re = /(?:([a-zA-Z0-9\\-]+\\:))?(?:\\/\\/(?:[^@]*@)?([^\\/:\\?#]+)(?::([0-9]+))?)?([^\\?#]*)(?:(\\?[^#]+)|\\?)?(?:(#.*))?/;\n    if (href != null && href !== '' && !isWindowLocation) {\n      var current = parseURL(),\n          base = document.getElementsByTagName('base')[0];\n      if (!isNotAPI && base && base.getAttribute('href')) {\n        // Fix for IE ignoring relative base tags.\n        // See http://stackoverflow.com/questions/3926197/html-base-tag-and-local-folder-path-with-internet-explorer\n        base.href = base.href;\n        current = parseURL(base.href, null, true);\n      }\n      var _pathname = current._pathname, _protocol = current._protocol;\n      // convert to type of string\n      href = '' + href;\n      // convert relative link to the absolute\n      href = /^(?:\\w+\\:)?\\/\\//.test(href) ? href.indexOf(\"/\") === 0\n        ? _protocol + href : href : _protocol + \"//\" + current._host + (\n        href.indexOf(\"/\") === 0 ? href : href.indexOf(\"?\") === 0\n          ? _pathname + href : href.indexOf(\"#\") === 0\n          ? _pathname + current._search + href : _pathname.replace(/[^\\/]+$/g, '') + href\n        );\n    } else {\n      href = isWindowLocation ? href : windowLocation.href;\n      // if current browser not support History-API\n      if (!isSupportHistoryAPI || isNotAPI) {\n        // get hash fragment\n        href = href.replace(/^[^#]*/, '') || \"#\";\n        // form the absolute link from the hash\n        // https://github.com/devote/HTML5-History-API/issues/50\n        href = windowLocation.protocol.replace(/:.*$|$/, ':') + '//' + windowLocation.host + settings['basepath']\n          + href.replace(new RegExp(\"^#[\\/]?(?:\" + settings[\"type\"] + \")?\"), \"\");\n      }\n    }\n    // that would get rid of the links of the form: /../../\n    anchorElement.href = href;\n    // decompose the link in parts\n    var result = re.exec(anchorElement.href);\n    // host name with the port number\n    var host = result[2] + (result[3] ? ':' + result[3] : '');\n    // folder\n    var pathname = result[4] || '/';\n    // the query string\n    var search = result[5] || '';\n    // hash\n    var hash = result[6] === '#' ? '' : (result[6] || '');\n    // relative link, no protocol, no host\n    var relative = pathname + search + hash;\n    // special links for set to hash-link, if browser not support History API\n    var nohash = pathname.replace(new RegExp(\"^\" + settings[\"basepath\"], \"i\"), settings[\"type\"]) + search;\n    // result\n    return {\n      _href: result[1] + '//' + host + relative,\n      _protocol: result[1],\n      _host: host,\n      _hostname: result[2],\n      _port: result[3] || '',\n      _pathname: pathname,\n      _search: search,\n      _hash: hash,\n      _relative: relative,\n      _nohash: nohash,\n      _special: nohash + hash\n    }\n  }\n\n  /**\n   * Detect HistoryAPI support while taking into account false positives.\n   * Based on https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n   */\n  function isSupportHistoryAPIDetect(){\n    var ua = global.navigator.userAgent;\n    // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies\n    // itself as 'Mobile Safari' as well, nor Windows Phone (issue #1471).\n    if ((ua.indexOf('Android 2.') !== -1 ||\n      (ua.indexOf('Android 4.0') !== -1)) &&\n      ua.indexOf('Mobile Safari') !== -1 &&\n      ua.indexOf('Chrome') === -1 &&\n      ua.indexOf('Windows Phone') === -1)\n    {\n      return false;\n    }\n    // Return the regular check\n    return !!historyPushState;\n  }\n\n  /**\n   * Initializing storage for the custom state's object\n   */\n  function storageInitialize() {\n    var sessionStorage;\n    /**\n     * sessionStorage throws error when cookies are disabled\n     * Chrome content settings when running the site in a Facebook IFrame.\n     * see: https://github.com/devote/HTML5-History-API/issues/34\n     * and: http://stackoverflow.com/a/12976988/669360\n     */\n    try {\n      sessionStorage = global['sessionStorage'];\n      sessionStorage.setItem(sessionStorageKey + 't', '1');\n      sessionStorage.removeItem(sessionStorageKey + 't');\n    } catch(_e_) {\n      sessionStorage = {\n        getItem: function(key) {\n          var cookie = document.cookie.split(key + \"=\");\n          return cookie.length > 1 && cookie.pop().split(\";\").shift() || 'null';\n        },\n        setItem: function(key, value) {\n          var state = {};\n          // insert one current element to cookie\n          if (state[windowLocation.href] = historyObject.state) {\n            document.cookie = key + '=' + JSON.stringify(state);\n          }\n        }\n      }\n    }\n\n    try {\n      // get cache from the storage in browser\n      stateStorage = JSON.parse(sessionStorage.getItem(sessionStorageKey)) || {};\n    } catch(_e_) {\n      stateStorage = {};\n    }\n\n    // hang up the event handler to event unload page\n    addEvent(eventNamePrefix + 'unload', function() {\n      // save current state's object\n      sessionStorage.setItem(sessionStorageKey, JSON.stringify(stateStorage));\n    }, false);\n  }\n\n  /**\n   * This method is implemented to override the built-in(native)\n   * properties in the browser, unfortunately some browsers are\n   * not allowed to override all the properties and even add.\n   * For this reason, this was written by a method that tries to\n   * do everything necessary to get the desired result.\n   *\n   * @param {Object} object The object in which will be overridden/added property\n   * @param {String} prop The property name to be overridden/added\n   * @param {Object} [descriptor] An object containing properties set/get\n   * @param {Function} [onWrapped] The function to be called when the wrapper is created\n   * @return {Object|Boolean} Returns an object on success, otherwise returns false\n   */\n  function redefineProperty(object, prop, descriptor, onWrapped) {\n    var testOnly = 0;\n    // test only if descriptor is undefined\n    if (!descriptor) {\n      descriptor = {set: emptyFunction};\n      testOnly = 1;\n    }\n    // variable will have a value of true the success of attempts to set descriptors\n    var isDefinedSetter = !descriptor.set;\n    var isDefinedGetter = !descriptor.get;\n    // for tests of attempts to set descriptors\n    var test = {configurable: true, set: function() {\n      isDefinedSetter = 1;\n    }, get: function() {\n      isDefinedGetter = 1;\n    }};\n\n    try {\n      // testing for the possibility of overriding/adding properties\n      defineProperty(object, prop, test);\n      // running the test\n      object[prop] = object[prop];\n      // attempt to override property using the standard method\n      defineProperty(object, prop, descriptor);\n    } catch(_e_) {\n    }\n\n    // If the variable 'isDefined' has a false value, it means that need to try other methods\n    if (!isDefinedSetter || !isDefinedGetter) {\n      // try to override/add the property, using deprecated functions\n      if (object.__defineGetter__) {\n        // testing for the possibility of overriding/adding properties\n        object.__defineGetter__(prop, test.get);\n        object.__defineSetter__(prop, test.set);\n        // running the test\n        object[prop] = object[prop];\n        // attempt to override property using the deprecated functions\n        descriptor.get && object.__defineGetter__(prop, descriptor.get);\n        descriptor.set && object.__defineSetter__(prop, descriptor.set);\n      }\n\n      // Browser refused to override the property, using the standard and deprecated methods\n      if (!isDefinedSetter || !isDefinedGetter) {\n        if (testOnly) {\n          return false;\n        } else if (object === global) {\n          // try override global properties\n          try {\n            // save original value from this property\n            var originalValue = object[prop];\n            // set null to built-in(native) property\n            object[prop] = null;\n          } catch(_e_) {\n          }\n          // This rule for Internet Explorer 8\n          if ('execScript' in global) {\n            /**\n             * to IE8 override the global properties using\n             * VBScript, declaring it in global scope with\n             * the same names.\n             */\n            global['execScript']('Public ' + prop, 'VBScript');\n            global['execScript']('var ' + prop + ';', 'JavaScript');\n          } else {\n            try {\n              /**\n               * This hack allows to override a property\n               * with the set 'configurable: false', working\n               * in the hack 'Safari' to 'Mac'\n               */\n              defineProperty(object, prop, {value: emptyFunction});\n            } catch(_e_) {\n              if (prop === 'onpopstate') {\n                /**\n                 * window.onpopstate fires twice in Safari 8.0.\n                 * Block initial event on window.onpopstate\n                 * See: https://github.com/devote/HTML5-History-API/issues/69\n                 */\n                addEvent('popstate', descriptor = function() {\n                  removeEvent('popstate', descriptor, false);\n                  var onpopstate = object.onpopstate;\n                  // cancel initial event on attribute handler\n                  object.onpopstate = null;\n                  setTimeout(function() {\n                    // restore attribute value after short time\n                    object.onpopstate = onpopstate;\n                  }, 1);\n                }, false);\n                // cancel trigger events on attributes in object the window\n                triggerEventsInWindowAttributes = 0;\n              }\n            }\n          }\n          // set old value to new variable\n          object[prop] = originalValue;\n\n        } else {\n          // the last stage of trying to override the property\n          try {\n            try {\n              // wrap the object in a new empty object\n              var temp = Object.create(object);\n              defineProperty(Object.getPrototypeOf(temp) === object ? temp : object, prop, descriptor);\n              for(var key in object) {\n                // need to bind a function to the original object\n                if (typeof object[key] === 'function') {\n                  temp[key] = object[key].bind(object);\n                }\n              }\n              try {\n                // to run a function that will inform about what the object was to wrapped\n                onWrapped.call(temp, temp, object);\n              } catch(_e_) {\n              }\n              object = temp;\n            } catch(_e_) {\n              // sometimes works override simply by assigning the prototype property of the constructor\n              defineProperty(object.constructor.prototype, prop, descriptor);\n            }\n          } catch(_e_) {\n            // all methods have failed\n            return false;\n          }\n        }\n      }\n    }\n\n    return object;\n  }\n\n  /**\n   * Adds the missing property in descriptor\n   *\n   * @param {Object} object An object that stores values\n   * @param {String} prop Name of the property in the object\n   * @param {Object|null} descriptor Descriptor\n   * @return {Object} Returns the generated descriptor\n   */\n  function prepareDescriptorsForObject(object, prop, descriptor) {\n    descriptor = descriptor || {};\n    // the default for the object 'location' is the standard object 'window.location'\n    object = object === locationDescriptors ? windowLocation : object;\n    // setter for object properties\n    descriptor.set = (descriptor.set || function(value) {\n      object[prop] = value;\n    });\n    // getter for object properties\n    descriptor.get = (descriptor.get || function() {\n      return object[prop];\n    });\n    return descriptor;\n  }\n\n  /**\n   * Wrapper for the methods 'addEventListener/attachEvent' in the context of the 'window'\n   *\n   * @param {String} event The event type for which the user is registering\n   * @param {Function} listener The method to be called when the event occurs.\n   * @param {Boolean} capture If true, capture indicates that the user wishes to initiate capture.\n   * @return void\n   */\n  function addEventListener(event, listener, capture) {\n    if (event in eventsList) {\n      // here stored the event listeners 'popstate/hashchange'\n      eventsList[event].push(listener);\n    } else {\n      // FireFox support non-standart four argument aWantsUntrusted\n      // https://github.com/devote/HTML5-History-API/issues/13\n      if (arguments.length > 3) {\n        addEvent(event, listener, capture, arguments[3]);\n      } else {\n        addEvent(event, listener, capture);\n      }\n    }\n  }\n\n  /**\n   * Wrapper for the methods 'removeEventListener/detachEvent' in the context of the 'window'\n   *\n   * @param {String} event The event type for which the user is registered\n   * @param {Function} listener The parameter indicates the Listener to be removed.\n   * @param {Boolean} capture Was registered as a capturing listener or not.\n   * @return void\n   */\n  function removeEventListener(event, listener, capture) {\n    var list = eventsList[event];\n    if (list) {\n      for(var i = list.length; i--;) {\n        if (list[i] === listener) {\n          list.splice(i, 1);\n          break;\n        }\n      }\n    } else {\n      removeEvent(event, listener, capture);\n    }\n  }\n\n  /**\n   * Wrapper for the methods 'dispatchEvent/fireEvent' in the context of the 'window'\n   *\n   * @param {Event|String} event Instance of Event or event type string if 'eventObject' used\n   * @param {*} [eventObject] For Internet Explorer 8 required event object on this argument\n   * @return {Boolean} If 'preventDefault' was called the value is false, else the value is true.\n   */\n  function dispatchEvent(event, eventObject) {\n    var eventType = ('' + (typeof event === \"string\" ? event : event.type)).replace(/^on/, '');\n    var list = eventsList[eventType];\n    if (list) {\n      // need to understand that there is one object of Event\n      eventObject = typeof event === \"string\" ? eventObject : event;\n      if (eventObject.target == null) {\n        // need to override some of the properties of the Event object\n        for(var props = ['target', 'currentTarget', 'srcElement', 'type']; event = props.pop();) {\n          // use 'redefineProperty' to override the properties\n          eventObject = redefineProperty(eventObject, event, {\n            get: event === 'type' ? function() {\n              return eventType;\n            } : function() {\n              return global;\n            }\n          });\n        }\n      }\n      if (triggerEventsInWindowAttributes) {\n        // run function defined in the attributes 'onpopstate/onhashchange' in the 'window' context\n        ((eventType === 'popstate' ? global.onpopstate : global.onhashchange)\n          || emptyFunction).call(global, eventObject);\n      }\n      // run other functions that are in the list of handlers\n      for(var i = 0, len = list.length; i < len; i++) {\n        list[i].call(global, eventObject);\n      }\n      return true;\n    } else {\n      return dispatch(event, eventObject);\n    }\n  }\n\n  /**\n   * dispatch current state event\n   */\n  function firePopState() {\n    var o = document.createEvent ? document.createEvent('Event') : document.createEventObject();\n    if (o.initEvent) {\n      o.initEvent('popstate', false, false);\n    } else {\n      o.type = 'popstate';\n    }\n    o.state = historyObject.state;\n    // send a newly created events to be processed\n    dispatchEvent(o);\n  }\n\n  /**\n   * fire initial state for non-HTML5 browsers\n   */\n  function fireInitialState() {\n    if (isFireInitialState) {\n      isFireInitialState = false;\n      firePopState();\n    }\n  }\n\n  /**\n   * Change the data of the current history for HTML4 browsers\n   *\n   * @param {Object} state\n   * @param {string} [url]\n   * @param {Boolean} [replace]\n   * @param {string} [lastURLValue]\n   * @return void\n   */\n  function changeState(state, url, replace, lastURLValue) {\n    if (!isSupportHistoryAPI) {\n      // if not used implementation history.location\n      if (isUsedHistoryLocationFlag === 0) isUsedHistoryLocationFlag = 2;\n      // normalization url\n      var urlObject = parseURL(url, isUsedHistoryLocationFlag === 2 && ('' + url).indexOf(\"#\") !== -1);\n      // if current url not equal new url\n      if (urlObject._relative !== parseURL()._relative) {\n        // if empty lastURLValue to skip hash change event\n        lastURL = lastURLValue;\n        if (replace) {\n          // only replace hash, not store to history\n          windowLocation.replace(\"#\" + urlObject._special);\n        } else {\n          // change hash and add new record to history\n          windowLocation.hash = urlObject._special;\n        }\n      }\n    } else {\n      lastURL = windowLocation.href;\n    }\n    if (!isSupportStateObjectInHistory && state) {\n      stateStorage[windowLocation.href] = state;\n    }\n    isFireInitialState = false;\n  }\n\n  /**\n   * Event handler function changes the hash in the address bar\n   *\n   * @param {Event} event\n   * @return void\n   */\n  function onHashChange(event) {\n    // https://github.com/devote/HTML5-History-API/issues/46\n    var fireNow = lastURL;\n    // new value to lastURL\n    lastURL = windowLocation.href;\n    // if not empty fireNow, otherwise skipped the current handler event\n    if (fireNow) {\n      // if checkUrlForPopState equal current url, this means that the event was raised popstate browser\n      if (checkUrlForPopState !== windowLocation.href) {\n        // otherwise,\n        // the browser does not support popstate event or just does not run the event by changing the hash.\n        firePopState();\n      }\n      // current event object\n      event = event || global.event;\n\n      var oldURLObject = parseURL(fireNow, true);\n      var newURLObject = parseURL();\n      // HTML4 browser not support properties oldURL/newURL\n      if (!event.oldURL) {\n        event.oldURL = oldURLObject._href;\n        event.newURL = newURLObject._href;\n      }\n      if (oldURLObject._hash !== newURLObject._hash) {\n        // if current hash not equal previous hash\n        dispatchEvent(event);\n      }\n    }\n  }\n\n  /**\n   * The event handler is fully loaded document\n   *\n   * @param {*} [noScroll]\n   * @return void\n   */\n  function onLoad(noScroll) {\n    // Get rid of the events popstate when the first loading a document in the webkit browsers\n    setTimeout(function() {\n      // hang up the event handler for the built-in popstate event in the browser\n      addEvent('popstate', function(e) {\n        // set the current url, that suppress the creation of the popstate event by changing the hash\n        checkUrlForPopState = windowLocation.href;\n        // for Safari browser in OS Windows not implemented 'state' object in 'History' interface\n        // and not implemented in old HTML4 browsers\n        if (!isSupportStateObjectInHistory) {\n          e = redefineProperty(e, 'state', {get: function() {\n            return historyObject.state;\n          }});\n        }\n        // send events to be processed\n        dispatchEvent(e);\n      }, false);\n    }, 0);\n    // for non-HTML5 browsers\n    if (!isSupportHistoryAPI && noScroll !== true && \"location\" in historyObject) {\n      // scroll window to anchor element\n      scrollToAnchorId(locationObject.hash);\n      // fire initial state for non-HTML5 browser after load page\n      fireInitialState();\n    }\n  }\n\n  /**\n   * Finds the closest ancestor anchor element (including the target itself).\n   *\n   * @param {HTMLElement} target The element to start scanning from.\n   * @return {HTMLElement} An element which is the closest ancestor anchor.\n   */\n  function anchorTarget(target) {\n    while (target) {\n      if (target.nodeName === 'A') return target;\n      target = target.parentNode;\n    }\n  }\n\n  /**\n   * Handles anchor elements with a hash fragment for non-HTML5 browsers\n   *\n   * @param {Event} e\n   */\n  function onAnchorClick(e) {\n    var event = e || global.event;\n    var target = anchorTarget(event.target || event.srcElement);\n    var defaultPrevented = \"defaultPrevented\" in event ? event['defaultPrevented'] : event.returnValue === false;\n    if (target && target.nodeName === \"A\" && !defaultPrevented) {\n      var current = parseURL();\n      var expect = parseURL(target.getAttribute(\"href\", 2));\n      var isEqualBaseURL = current._href.split('#').shift() === expect._href.split('#').shift();\n      if (isEqualBaseURL && expect._hash) {\n        if (current._hash !== expect._hash) {\n          locationObject.hash = expect._hash;\n        }\n        scrollToAnchorId(expect._hash);\n        if (event.preventDefault) {\n          event.preventDefault();\n        } else {\n          event.returnValue = false;\n        }\n      }\n    }\n  }\n\n  /**\n   * Scroll page to current anchor in url-hash\n   *\n   * @param hash\n   */\n  function scrollToAnchorId(hash) {\n    var target = document.getElementById(hash = (hash || '').replace(/^#/, ''));\n    if (target && target.id === hash && target.nodeName === \"A\") {\n      var rect = target.getBoundingClientRect();\n      global.scrollTo((documentElement.scrollLeft || 0), rect.top + (documentElement.scrollTop || 0)\n        - (documentElement.clientTop || 0));\n    }\n  }\n\n  /**\n   * Library initialization\n   *\n   * @return {Boolean} return true if all is well, otherwise return false value\n   */\n  function initialize() {\n    /**\n     * Get custom settings from the query string\n     */\n    var scripts = document.getElementsByTagName('script');\n    var src = (scripts[scripts.length - 1] || {}).src || '';\n    var arg = src.indexOf('?') !== -1 ? src.split('?').pop() : '';\n    arg.replace(/(\\w+)(?:=([^&]*))?/g, function(a, key, value) {\n      settings[key] = (value || '').replace(/^(0|false)$/, '');\n    });\n\n    /**\n     * hang up the event handler to listen to the events hashchange\n     */\n    addEvent(eventNamePrefix + 'hashchange', onHashChange, false);\n\n    // a list of objects with pairs of descriptors/object\n    var data = [locationDescriptors, locationObject, eventsDescriptors, global, historyDescriptors, historyObject];\n\n    // if browser support object 'state' in interface 'History'\n    if (isSupportStateObjectInHistory) {\n      // remove state property from descriptor\n      delete historyDescriptors['state'];\n    }\n\n    // initializing descriptors\n    for(var i = 0; i < data.length; i += 2) {\n      for(var prop in data[i]) {\n        if (data[i].hasOwnProperty(prop)) {\n          if (typeof data[i][prop] !== 'object') {\n            // If the descriptor is a simple function, simply just assign it an object\n            data[i + 1][prop] = data[i][prop];\n          } else {\n            // prepare the descriptor the required format\n            var descriptor = prepareDescriptorsForObject(data[i], prop, data[i][prop]);\n            // try to set the descriptor object\n            if (!redefineProperty(data[i + 1], prop, descriptor, function(n, o) {\n              // is satisfied if the failed override property\n              if (o === historyObject) {\n                // the problem occurs in Safari on the Mac\n                global.history = historyObject = data[i + 1] = n;\n              }\n            })) {\n              // if there is no possibility override.\n              // This browser does not support descriptors, such as IE7\n\n              // remove previously hung event handlers\n              removeEvent(eventNamePrefix + 'hashchange', onHashChange, false);\n\n              // fail to initialize :(\n              return false;\n            }\n\n            // create a repository for custom handlers onpopstate/onhashchange\n            if (data[i + 1] === global) {\n              eventsList[prop] = eventsList[prop.substr(2)] = [];\n            }\n          }\n        }\n      }\n    }\n\n    // check settings\n    historyObject['setup']();\n\n    // redirect if necessary\n    if (settings['redirect']) {\n      historyObject['redirect']();\n    }\n\n    // initialize\n    if (settings[\"init\"]) {\n      // You agree that you will use window.history.location instead window.location\n      isUsedHistoryLocationFlag = 1;\n    }\n\n    // If browser does not support object 'state' in interface 'History'\n    if (!isSupportStateObjectInHistory && JSON) {\n      storageInitialize();\n    }\n\n    // track clicks on anchors\n    if (!isSupportHistoryAPI) {\n      document[addEventListenerName](eventNamePrefix + \"click\", onAnchorClick, false);\n    }\n\n    if (document.readyState === 'complete') {\n      onLoad(true);\n    } else {\n      if (!isSupportHistoryAPI && parseURL()._relative !== settings[\"basepath\"]) {\n        isFireInitialState = true;\n      }\n      /**\n       * Need to avoid triggering events popstate the initial page load.\n       * Hang handler popstate as will be fully loaded document that\n       * would prevent triggering event onpopstate\n       */\n      addEvent(eventNamePrefix + 'load', onLoad, false);\n    }\n\n    // everything went well\n    return true;\n  }\n\n  /**\n   * Starting the library\n   */\n  if (!initialize()) {\n    // if unable to initialize descriptors\n    // therefore quite old browser and there\n    // is no sense to continue to perform\n    return;\n  }\n\n  /**\n   * If the property history.emulate will be true,\n   * this will be talking about what's going on\n   * emulation capabilities HTML5-History-API.\n   * Otherwise there is no emulation, ie the\n   * built-in browser capabilities.\n   *\n   * @type {boolean}\n   * @const\n   */\n  historyObject['emulate'] = !isSupportHistoryAPI;\n\n  /**\n   * Replace the original methods on the wrapper\n   */\n  global[addEventListenerName] = addEventListener;\n  global[removeEventListenerName] = removeEventListener;\n  global[dispatchEventName] = dispatchEvent;\n\n  return historyObject;\n});\n","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global.Layzr = factory());\n}(this, (function () { 'use strict';\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar knot = function knot() {\n  var extended = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var events = Object.create(null);\n\n  function on(name, handler) {\n    events[name] = events[name] || [];\n    events[name].push(handler);\n    return this;\n  }\n\n  function once(name, handler) {\n    handler._once = true;\n    on(name, handler);\n    return this;\n  }\n\n  function off(name) {\n    var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    handler ? events[name].splice(events[name].indexOf(handler), 1) : delete events[name];\n\n    return this;\n  }\n\n  function emit(name) {\n    var _this = this;\n\n    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    // cache the events, to avoid consequences of mutation\n    var cache = events[name] && events[name].slice();\n\n    // only fire handlers if they exist\n    cache && cache.forEach(function (handler) {\n      // remove handlers added with 'once'\n      handler._once && off(name, handler);\n\n      // set 'this' context, pass args to handlers\n      handler.apply(_this, args);\n    });\n\n    return this;\n  }\n\n  return _extends({}, extended, {\n\n    on: on,\n    once: once,\n    off: off,\n    emit: emit\n  });\n};\n\nvar layzr = (function () {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  // private\n\n  var prevLoc = getLoc();\n  var ticking = void 0;\n\n  var nodes = void 0;\n  var windowHeight = void 0;\n\n  // options\n\n  var settings = {\n    normal: options.normal || 'data-normal',\n    retina: options.retina || 'data-retina',\n    srcset: options.srcset || 'data-srcset',\n    threshold: options.threshold || 0\n  };\n\n  // feature detection\n  // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/img/srcset.js\n\n  var srcset = document.body.classList.contains('srcset') || 'srcset' in document.createElement('img');\n\n  // device pixel ratio\n  // not supported in IE10 - https://msdn.microsoft.com/en-us/library/dn265030(v=vs.85).aspx\n\n  var dpr = window.devicePixelRatio || window.screen.deviceXDPI / window.screen.logicalXDPI;\n\n  // instance\n\n  var instance = knot({\n    handlers: handlers,\n    check: check,\n    update: update\n  });\n\n  return instance;\n\n  // location helper\n\n  function getLoc() {\n    return window.scrollY || window.pageYOffset;\n  }\n\n  // debounce helpers\n\n  function requestScroll() {\n    prevLoc = getLoc();\n    requestFrame();\n  }\n\n  function requestFrame() {\n    if (!ticking) {\n      window.requestAnimationFrame(function () {\n        return check();\n      });\n      ticking = true;\n    }\n  }\n\n  // offset helper\n\n  function getOffset(node) {\n    return node.getBoundingClientRect().top + prevLoc;\n  }\n\n  // in viewport helper\n\n  function inViewport(node) {\n    var viewTop = prevLoc;\n    var viewBot = viewTop + windowHeight;\n\n    var nodeTop = getOffset(node);\n    var nodeBot = nodeTop + node.offsetHeight;\n\n    var offset = settings.threshold / 100 * windowHeight;\n\n    return nodeBot >= viewTop - offset && nodeTop <= viewBot + offset;\n  }\n\n  // source helper\n\n  function setSource(node) {\n    instance.emit('src:before', node);\n\n    // prefer srcset, fallback to pixel density\n    if (srcset && node.hasAttribute(settings.srcset)) {\n      node.setAttribute('srcset', node.getAttribute(settings.srcset));\n    } else {\n      var retina = dpr > 1 && node.getAttribute(settings.retina);\n      node.setAttribute('src', retina || node.getAttribute(settings.normal));\n    }\n\n    instance.emit('src:after', node);[settings.normal, settings.retina, settings.srcset].forEach(function (attr) {\n      return node.removeAttribute(attr);\n    });\n\n    update();\n  }\n\n  // API\n\n  function handlers(flag) {\n    var action = flag ? 'addEventListener' : 'removeEventListener';['scroll', 'resize'].forEach(function (event) {\n      return window[action](event, requestScroll);\n    });\n    return this;\n  }\n\n  function check() {\n    windowHeight = window.innerHeight;\n\n    nodes.forEach(function (node) {\n      return inViewport(node) && setSource(node);\n    });\n\n    ticking = false;\n    return this;\n  }\n\n  function update() {\n    nodes = Array.prototype.slice.call(document.querySelectorAll('[' + settings.normal + ']'));\n    return this;\n  }\n});\n\nreturn layzr;\n\n})));\n","'use strict';\nmodule.exports = Number.isNaN || function (x) {\n\treturn x !== x;\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\nvar numberIsNan = require('number-is-nan');\nvar arrayUniq = require('array-uniq');\nvar reInt = /^\\d+$/;\n\nfunction deepUnique(arr) {\n\treturn arr.sort().filter(function (el, i) {\n\t\treturn JSON.stringify(el) !== JSON.stringify(arr[i - 1]);\n\t});\n}\n\nexports.parse = function (str) {\n\treturn deepUnique(str.split(',').map(function (el) {\n\t\tvar ret = {};\n\n\t\tel.trim().split(/\\s+/).forEach(function (el, i) {\n\t\t\tif (i === 0) {\n\t\t\t\treturn ret.url = el;\n\t\t\t}\n\n\t\t\tvar value = el.substring(0, el.length - 1);\n\t\t\tvar postfix = el[el.length - 1];\n\t\t\tvar intVal = parseInt(value, 10);\n\t\t\tvar floatVal = parseFloat(value);\n\n\t\t\tif (postfix === 'w' && reInt.test(value)) {\n\t\t\t\tret.width = intVal;\n\t\t\t} else if (postfix === 'h' && reInt.test(value)) {\n\t\t\t\tret.height = intVal;\n\t\t\t} else if (postfix === 'x' && !numberIsNan(floatVal)) {\n\t\t\t\tret.density = floatVal;\n\t\t\t} else {\n\t\t\t\tthrow new Error('Invalid srcset descriptor: ' + el + '.');\n\t\t\t}\n\t\t});\n\n\t\treturn ret;\n\t}));\n}\n\nexports.stringify = function (arr) {\n\treturn arrayUniq(arr.map(function (el) {\n\t\tif (!el.url) {\n\t\t\tthrow new Error('URL is required.');\n\t\t}\n\n\t\tvar ret = [el.url];\n\n\t\tif (el.width) {\n\t\t\tret.push(el.width + 'w');\n\t\t}\n\n\t\tif (el.height) {\n\t\t\tret.push(el.height + 'h');\n\t\t}\n\n\t\tif (el.density) {\n\t\t\tret.push(el.density + 'x');\n\t\t}\n\n\t\treturn ret.join(' ');\n\t})).join(', ');\n}\n","/*!\n * Tap listener v2.0.0\n * listens to taps\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false*/ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'unipointer/unipointer'\n    ], function( Unipointer ) {\n      return factory( window, Unipointer );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('unipointer')\n    );\n  } else {\n    // browser global\n    window.TapListener = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// --------------------------  TapListener -------------------------- //\n\nfunction TapListener( elem ) {\n  this.bindTap( elem );\n}\n\n// inherit Unipointer & EventEmitter\nvar proto = TapListener.prototype = Object.create( Unipointer.prototype );\n\n/**\n * bind tap event to element\n * @param {Element} elem\n */\nproto.bindTap = function( elem ) {\n  if ( !elem ) {\n    return;\n  }\n  this.unbindTap();\n  this.tapElement = elem;\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindTap = function() {\n  if ( !this.tapElement ) {\n    return;\n  }\n  this._bindStartEvent( this.tapElement, true );\n  delete this.tapElement;\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  var pointerPoint = Unipointer.getPointerPoint( pointer );\n  var boundingRect = this.tapElement.getBoundingClientRect();\n  var scrollX = window.pageXOffset;\n  var scrollY = window.pageYOffset;\n  // calculate if pointer is inside tapElement\n  var isInside = pointerPoint.x >= boundingRect.left + scrollX &&\n    pointerPoint.x <= boundingRect.right + scrollX &&\n    pointerPoint.y >= boundingRect.top + scrollY &&\n    pointerPoint.y <= boundingRect.bottom + scrollY;\n  // trigger callback if pointer is inside element\n  if ( isInside ) {\n    this.emitEvent( 'tap', [ event, pointer ] );\n  }\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    var _this = this;\n    setTimeout( function() {\n      delete _this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\nproto.destroy = function() {\n  this.pointerDone();\n  this.unbindTap();\n};\n\n// -----  ----- //\n\nreturn TapListener;\n\n}));\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.Tweezer = factory());\n}(this, (function () { 'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Tweezer = function () {\n  function Tweezer() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Tweezer);\n\n    this.duration = opts.duration || 1000;\n    this.ease = opts.easing || this._defaultEase;\n    this.start = opts.start;\n    this.end = opts.end;\n\n    this.frame = null;\n    this.next = null;\n    this.isRunning = false;\n    this.events = {};\n    this.direction = this.start < this.end ? 'up' : 'down';\n  }\n\n  _createClass(Tweezer, [{\n    key: 'begin',\n    value: function begin() {\n      if (!this.isRunning && this.next !== this.end) {\n        this.frame = window.requestAnimationFrame(this._tick.bind(this));\n      }\n      return this;\n    }\n  }, {\n    key: 'stop',\n    value: function stop() {\n      window.cancelAnimationFrame(this.frame);\n      this.isRunning = false;\n      this.frame = null;\n      this.timeStart = null;\n      this.next = null;\n      return this;\n    }\n  }, {\n    key: 'on',\n    value: function on(name, handler) {\n      this.events[name] = this.events[name] || [];\n      this.events[name].push(handler);\n      return this;\n    }\n  }, {\n    key: 'emit',\n    value: function emit(name, val) {\n      var _this = this;\n\n      var e = this.events[name];\n      e && e.forEach(function (handler) {\n        return handler.call(_this, val);\n      });\n    }\n  }, {\n    key: '_tick',\n    value: function _tick(currentTime) {\n      this.isRunning = true;\n\n      var lastTick = this.next || this.start;\n\n      if (!this.timeStart) this.timeStart = currentTime;\n      this.timeElapsed = currentTime - this.timeStart;\n      this.next = Math.round(this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration));\n\n      if (this._shouldTick(lastTick)) {\n        this.emit('tick', this.next);\n        this.frame = window.requestAnimationFrame(this._tick.bind(this));\n      } else {\n        this.emit('tick', this.end);\n        this.emit('done', null);\n      }\n    }\n  }, {\n    key: '_shouldTick',\n    value: function _shouldTick(lastTick) {\n      return {\n        up: this.next < this.end && lastTick <= this.next,\n        down: this.next > this.end && lastTick >= this.next\n      }[this.direction];\n    }\n  }, {\n    key: '_defaultEase',\n    value: function _defaultEase(t, b, c, d) {\n      if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n      return -c / 2 * (--t * (t - 2) - 1) + b;\n    }\n  }]);\n\n  return Tweezer;\n}();\n\nreturn Tweezer;\n\n})));\n","/**\n * UAParser.js v0.7.12\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>\n * Dual licensed under GPLv2 & MIT\n */\n\n(function (window, undefined) {\n\n    'use strict';\n\n    //////////////\n    // Constants\n    /////////////\n\n\n    var LIBVERSION  = '0.7.12',\n        EMPTY       = '',\n        UNKNOWN     = '?',\n        FUNC_TYPE   = 'function',\n        UNDEF_TYPE  = 'undefined',\n        OBJ_TYPE    = 'object',\n        STR_TYPE    = 'string',\n        MAJOR       = 'major', // deprecated\n        MODEL       = 'model',\n        NAME        = 'name',\n        TYPE        = 'type',\n        VENDOR      = 'vendor',\n        VERSION     = 'version',\n        ARCHITECTURE= 'architecture',\n        CONSOLE     = 'console',\n        MOBILE      = 'mobile',\n        TABLET      = 'tablet',\n        SMARTTV     = 'smarttv',\n        WEARABLE    = 'wearable',\n        EMBEDDED    = 'embedded';\n\n\n    ///////////\n    // Helper\n    //////////\n\n\n    var util = {\n        extend : function (regexes, extensions) {\n            var margedRegexes = {};\n            for (var i in regexes) {\n                if (extensions[i] && extensions[i].length % 2 === 0) {\n                    margedRegexes[i] = extensions[i].concat(regexes[i]);\n                } else {\n                    margedRegexes[i] = regexes[i];\n                }\n            }\n            return margedRegexes;\n        },\n        has : function (str1, str2) {\n          if (typeof str1 === \"string\") {\n            return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;\n          } else {\n            return false;\n          }\n        },\n        lowerize : function (str) {\n            return str.toLowerCase();\n        },\n        major : function (version) {\n            return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g,'').split(\".\")[0] : undefined;\n        },\n        trim : function (str) {\n          return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n    };\n\n\n    ///////////////\n    // Map helper\n    //////////////\n\n\n    var mapper = {\n\n        rgx : function () {\n\n            var result, i = 0, j, k, p, q, matches, match, args = arguments;\n\n            // loop through all regexes maps\n            while (i < args.length && !matches) {\n\n                var regex = args[i],       // even sequence (0,2,4,..)\n                    props = args[i + 1];   // odd sequence (1,3,5,..)\n\n                // construct object barebones\n                if (typeof result === UNDEF_TYPE) {\n                    result = {};\n                    for (p in props) {\n                        if (props.hasOwnProperty(p)){\n                            q = props[p];\n                            if (typeof q === OBJ_TYPE) {\n                                result[q[0]] = undefined;\n                            } else {\n                                result[q] = undefined;\n                            }\n                        }\n                    }\n                }\n\n                // try matching uastring with regexes\n                j = k = 0;\n                while (j < regex.length && !matches) {\n                    matches = regex[j++].exec(this.getUA());\n                    if (!!matches) {\n                        for (p = 0; p < props.length; p++) {\n                            match = matches[++k];\n                            q = props[p];\n                            // check if given property is actually array\n                            if (typeof q === OBJ_TYPE && q.length > 0) {\n                                if (q.length == 2) {\n                                    if (typeof q[1] == FUNC_TYPE) {\n                                        // assign modified match\n                                        result[q[0]] = q[1].call(this, match);\n                                    } else {\n                                        // assign given value, ignore regex match\n                                        result[q[0]] = q[1];\n                                    }\n                                } else if (q.length == 3) {\n                                    // check whether function or regex\n                                    if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n                                        // call function (usually string mapper)\n                                        result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n                                    } else {\n                                        // sanitize match using given regex\n                                        result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n                                    }\n                                } else if (q.length == 4) {\n                                        result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n                                }\n                            } else {\n                                result[q] = match ? match : undefined;\n                            }\n                        }\n                    }\n                }\n                i += 2;\n            }\n            return result;\n        },\n\n        str : function (str, map) {\n\n            for (var i in map) {\n                // check if array\n                if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n                    for (var j = 0; j < map[i].length; j++) {\n                        if (util.has(map[i][j], str)) {\n                            return (i === UNKNOWN) ? undefined : i;\n                        }\n                    }\n                } else if (util.has(map[i], str)) {\n                    return (i === UNKNOWN) ? undefined : i;\n                }\n            }\n            return str;\n        }\n    };\n\n\n    ///////////////\n    // String map\n    //////////////\n\n\n    var maps = {\n\n        browser : {\n            oldsafari : {\n                version : {\n                    '1.0'   : '/8',\n                    '1.2'   : '/1',\n                    '1.3'   : '/3',\n                    '2.0'   : '/412',\n                    '2.0.2' : '/416',\n                    '2.0.3' : '/417',\n                    '2.0.4' : '/419',\n                    '?'     : '/'\n                }\n            }\n        },\n\n        device : {\n            amazon : {\n                model : {\n                    'Fire Phone' : ['SD', 'KF']\n                }\n            },\n            sprint : {\n                model : {\n                    'Evo Shift 4G' : '7373KT'\n                },\n                vendor : {\n                    'HTC'       : 'APA',\n                    'Sprint'    : 'Sprint'\n                }\n            }\n        },\n\n        os : {\n            windows : {\n                version : {\n                    'ME'        : '4.90',\n                    'NT 3.11'   : 'NT3.51',\n                    'NT 4.0'    : 'NT4.0',\n                    '2000'      : 'NT 5.0',\n                    'XP'        : ['NT 5.1', 'NT 5.2'],\n                    'Vista'     : 'NT 6.0',\n                    '7'         : 'NT 6.1',\n                    '8'         : 'NT 6.2',\n                    '8.1'       : 'NT 6.3',\n                    '10'        : ['NT 6.4', 'NT 10.0'],\n                    'RT'        : 'ARM'\n                }\n            }\n        }\n    };\n\n\n    //////////////\n    // Regex map\n    /////////////\n\n\n    var regexes = {\n\n        browser : [[\n\n            // Presto based\n            /(opera\\smini)\\/([\\w\\.-]+)/i,                                       // Opera Mini\n            /(opera\\s[mobiletab]+).+version\\/([\\w\\.-]+)/i,                      // Opera Mobi/Tablet\n            /(opera).+version\\/([\\w\\.]+)/i,                                     // Opera > 9.80\n            /(opera)[\\/\\s]+([\\w\\.]+)/i                                          // Opera < 9.80\n            ], [NAME, VERSION], [\n\n            /(opios)[\\/\\s]+([\\w\\.]+)/i                                          // Opera mini on iphone >= 8.0\n            ], [[NAME, 'Opera Mini'], VERSION], [\n\n            /\\s(opr)\\/([\\w\\.]+)/i                                               // Opera Webkit\n            ], [[NAME, 'Opera'], VERSION], [\n\n            // Mixed\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]+)*/i,\n                                                                                // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n\n            // Trident based\n            /(avant\\s|iemobile|slim|baidu)(?:browser)?[\\/\\s]?([\\w\\.]*)/i,\n                                                                                // Avant/IEMobile/SlimBrowser/Baidu\n            /(?:ms|\\()(ie)\\s([\\w\\.]+)/i,                                        // Internet Explorer\n\n            // Webkit/KHTML based\n            /(rekonq)\\/([\\w\\.]+)*/i,                                            // Rekonq\n            /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\\/([\\w\\.-]+)/i\n                                                                                // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS\n            ], [NAME, VERSION], [\n\n            /(trident).+rv[:\\s]([\\w\\.]+).+like\\sgecko/i                         // IE11\n            ], [[NAME, 'IE'], VERSION], [\n\n            /(edge)\\/((\\d+)?[\\w\\.]+)/i                                          // Microsoft Edge\n            ], [NAME, VERSION], [\n\n            /(yabrowser)\\/([\\w\\.]+)/i                                           // Yandex\n            ], [[NAME, 'Yandex'], VERSION], [\n\n            /(comodo_dragon)\\/([\\w\\.]+)/i                                       // Comodo Dragon\n            ], [[NAME, /_/g, ' '], VERSION], [\n\n            /(micromessenger)\\/([\\w\\.]+)/i                                      // WeChat\n            ], [[NAME, 'WeChat'], VERSION], [\n\n            /xiaomi\\/miuibrowser\\/([\\w\\.]+)/i                                   // MIUI Browser\n            ], [VERSION, [NAME, 'MIUI Browser']], [\n\n            /\\swv\\).+(chrome)\\/([\\w\\.]+)/i                                      // Chrome WebView\n            ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [\n\n            /android.+samsungbrowser\\/([\\w\\.]+)/i,\n            /android.+version\\/([\\w\\.]+)\\s+(?:mobile\\s?safari|safari)*/i        // Android Browser\n            ], [VERSION, [NAME, 'Android Browser']], [\n\n            /(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i,\n                                                                                // Chrome/OmniWeb/Arora/Tizen/Nokia\n            /(qqbrowser)[\\/\\s]?([\\w\\.]+)/i\n                                                                                // QQBrowser\n            ], [NAME, VERSION], [\n\n            /(uc\\s?browser)[\\/\\s]?([\\w\\.]+)/i,\n            /ucweb.+(ucbrowser)[\\/\\s]?([\\w\\.]+)/i,\n            /juc.+(ucweb)[\\/\\s]?([\\w\\.]+)/i\n                                                                                // UCBrowser\n            ], [[NAME, 'UCBrowser'], VERSION], [\n\n            /(dolfin)\\/([\\w\\.]+)/i                                              // Dolphin\n            ], [[NAME, 'Dolphin'], VERSION], [\n\n            /((?:android.+)crmo|crios)\\/([\\w\\.]+)/i                             // Chrome for Android/iOS\n            ], [[NAME, 'Chrome'], VERSION], [\n\n            /;fbav\\/([\\w\\.]+);/i                                                // Facebook App for iOS\n            ], [VERSION, [NAME, 'Facebook']], [\n\n            /fxios\\/([\\w\\.-]+)/i                                                // Firefox for iOS\n            ], [VERSION, [NAME, 'Firefox']], [\n\n            /version\\/([\\w\\.]+).+?mobile\\/\\w+\\s(safari)/i                       // Mobile Safari\n            ], [VERSION, [NAME, 'Mobile Safari']], [\n\n            /version\\/([\\w\\.]+).+?(mobile\\s?safari|safari)/i                    // Safari & Safari Mobile\n            ], [VERSION, NAME], [\n\n            /webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i                     // Safari < 3.0\n            ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [\n\n            /(konqueror)\\/([\\w\\.]+)/i,                                          // Konqueror\n            /(webkit|khtml)\\/([\\w\\.]+)/i\n            ], [NAME, VERSION], [\n\n            // Gecko based\n            /(navigator|netscape)\\/([\\w\\.-]+)/i                                 // Netscape\n            ], [[NAME, 'Netscape'], VERSION], [\n            /(swiftfox)/i,                                                      // Swiftfox\n            /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i,\n                                                                                // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n            /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\\/([\\w\\.-]+)/i,\n                                                                                // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n            /(mozilla)\\/([\\w\\.]+).+rv\\:.+gecko\\/\\d+/i,                          // Mozilla\n\n            // Other\n            /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i,\n                                                                                // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir\n            /(links)\\s\\(([\\w\\.]+)/i,                                            // Links\n            /(gobrowser)\\/?([\\w\\.]+)*/i,                                        // GoBrowser\n            /(ice\\s?browser)\\/v?([\\w\\._]+)/i,                                   // ICE Browser\n            /(mosaic)[\\/\\s]([\\w\\.]+)/i                                          // Mosaic\n            ], [NAME, VERSION]\n\n            /* /////////////////////\n            // Media players BEGIN\n            ////////////////////////\n\n            , [\n\n            /(apple(?:coremedia|))\\/((\\d+)[\\w\\._]+)/i,                          // Generic Apple CoreMedia\n            /(coremedia) v((\\d+)[\\w\\._]+)/i\n            ], [NAME, VERSION], [\n\n            /(aqualung|lyssna|bsplayer)\\/((\\d+)?[\\w\\.-]+)/i                     // Aqualung/Lyssna/BSPlayer\n            ], [NAME, VERSION], [\n\n            /(ares|ossproxy)\\s((\\d+)[\\w\\.-]+)/i                                 // Ares/OSSProxy\n            ], [NAME, VERSION], [\n\n            /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\\/((\\d+)[\\w\\.-]+)/i,\n                                                                                // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC\n                                                                                // NSPlayer/PSP-InternetRadioPlayer/Videos\n            /(clementine|music player daemon)\\s((\\d+)[\\w\\.-]+)/i,               // Clementine/MPD\n            /(lg player|nexplayer)\\s((\\d+)[\\d\\.]+)/i,\n            /player\\/(nexplayer|lg player)\\s((\\d+)[\\w\\.-]+)/i                   // NexPlayer/LG Player\n            ], [NAME, VERSION], [\n            /(nexplayer)\\s((\\d+)[\\w\\.-]+)/i                                     // Nexplayer\n            ], [NAME, VERSION], [\n\n            /(flrp)\\/((\\d+)[\\w\\.-]+)/i                                          // Flip Player\n            ], [[NAME, 'Flip Player'], VERSION], [\n\n            /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i\n                                                                                // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit\n            ], [NAME], [\n\n            /(gstreamer) souphttpsrc (?:\\([^\\)]+\\)){0,1} libsoup\\/((\\d+)[\\w\\.-]+)/i\n                                                                                // Gstreamer\n            ], [NAME, VERSION], [\n\n            /(htc streaming player)\\s[\\w_]+\\s\\/\\s((\\d+)[\\d\\.]+)/i,              // HTC Streaming Player\n            /(java|python-urllib|python-requests|wget|libcurl)\\/((\\d+)[\\w\\.-_]+)/i,\n                                                                                // Java/urllib/requests/wget/cURL\n            /(lavf)((\\d+)[\\d\\.]+)/i                                             // Lavf (FFMPEG)\n            ], [NAME, VERSION], [\n\n            /(htc_one_s)\\/((\\d+)[\\d\\.]+)/i                                      // HTC One S\n            ], [[NAME, /_/g, ' '], VERSION], [\n\n            /(mplayer)(?:\\s|\\/)(?:(?:sherpya-){0,1}svn)(?:-|\\s)(r\\d+(?:-\\d+[\\w\\.-]+){0,1})/i\n                                                                                // MPlayer SVN\n            ], [NAME, VERSION], [\n\n            /(mplayer)(?:\\s|\\/|[unkow-]+)((\\d+)[\\w\\.-]+)/i                      // MPlayer\n            ], [NAME, VERSION], [\n\n            /(mplayer)/i,                                                       // MPlayer (no other info)\n            /(yourmuze)/i,                                                      // YourMuze\n            /(media player classic|nero showtime)/i                             // Media Player Classic/Nero ShowTime\n            ], [NAME], [\n\n            /(nero (?:home|scout))\\/((\\d+)[\\w\\.-]+)/i                           // Nero Home/Nero Scout\n            ], [NAME, VERSION], [\n\n            /(nokia\\d+)\\/((\\d+)[\\w\\.-]+)/i                                      // Nokia\n            ], [NAME, VERSION], [\n\n            /\\s(songbird)\\/((\\d+)[\\w\\.-]+)/i                                    // Songbird/Philips-Songbird\n            ], [NAME, VERSION], [\n\n            /(winamp)3 version ((\\d+)[\\w\\.-]+)/i,                               // Winamp\n            /(winamp)\\s((\\d+)[\\w\\.-]+)/i,\n            /(winamp)mpeg\\/((\\d+)[\\w\\.-]+)/i\n            ], [NAME, VERSION], [\n\n            /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i  // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)\n                                                                                // inlight radio\n            ], [NAME], [\n\n            /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\\/((\\d+)[\\w\\.-]+)/i\n                                                                                // QuickTime/RealMedia/RadioApp/RadioClientApplication/\n                                                                                // SoundTap/Totem/Stagefright/Streamium\n            ], [NAME, VERSION], [\n\n            /(smp)((\\d+)[\\d\\.]+)/i                                              // SMP\n            ], [NAME, VERSION], [\n\n            /(vlc) media player - version ((\\d+)[\\w\\.]+)/i,                     // VLC Videolan\n            /(vlc)\\/((\\d+)[\\w\\.-]+)/i,\n            /(xbmc|gvfs|xine|xmms|irapp)\\/((\\d+)[\\w\\.-]+)/i,                    // XBMC/gvfs/Xine/XMMS/irapp\n            /(foobar2000)\\/((\\d+)[\\d\\.]+)/i,                                    // Foobar2000\n            /(itunes)\\/((\\d+)[\\d\\.]+)/i                                         // iTunes\n            ], [NAME, VERSION], [\n\n            /(wmplayer)\\/((\\d+)[\\w\\.-]+)/i,                                     // Windows Media Player\n            /(windows-media-player)\\/((\\d+)[\\w\\.-]+)/i\n            ], [[NAME, /-/g, ' '], VERSION], [\n\n            /windows\\/((\\d+)[\\w\\.-]+) upnp\\/[\\d\\.]+ dlnadoc\\/[\\d\\.]+ (home media server)/i\n                                                                                // Windows Media Server\n            ], [VERSION, [NAME, 'Windows']], [\n\n            /(com\\.riseupradioalarm)\\/((\\d+)[\\d\\.]*)/i                          // RiseUP Radio Alarm\n            ], [NAME, VERSION], [\n\n            /(rad.io)\\s((\\d+)[\\d\\.]+)/i,                                        // Rad.io\n            /(radio.(?:de|at|fr))\\s((\\d+)[\\d\\.]+)/i\n            ], [[NAME, 'rad.io'], VERSION]\n\n            //////////////////////\n            // Media players END\n            ////////////////////*/\n\n        ],\n\n        cpu : [[\n\n            /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i                     // AMD64\n            ], [[ARCHITECTURE, 'amd64']], [\n\n            /(ia32(?=;))/i                                                      // IA32 (quicktime)\n            ], [[ARCHITECTURE, util.lowerize]], [\n\n            /((?:i[346]|x)86)[;\\)]/i                                            // IA32\n            ], [[ARCHITECTURE, 'ia32']], [\n\n            // PocketPC mistakenly identified as PowerPC\n            /windows\\s(ce|mobile);\\sppc;/i\n            ], [[ARCHITECTURE, 'arm']], [\n\n            /((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i                           // PowerPC\n            ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [\n\n            /(sun4\\w)[;\\)]/i                                                    // SPARC\n            ], [[ARCHITECTURE, 'sparc']], [\n\n            /((?:avr32|ia64(?=;))|68k(?=\\))|arm(?:64|(?=v\\d+;))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i\n                                                                                // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n            ], [[ARCHITECTURE, util.lowerize]]\n        ],\n\n        device : [[\n\n            /\\((ipad|playbook);[\\w\\s\\);-]+(rim|apple)/i                         // iPad/PlayBook\n            ], [MODEL, VENDOR, [TYPE, TABLET]], [\n\n            /applecoremedia\\/[\\w\\.]+ \\((ipad)/                                  // iPad\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [\n\n            /(apple\\s{0,1}tv)/i                                                 // Apple TV\n            ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [\n\n            /(archos)\\s(gamepad2?)/i,                                           // Archos\n            /(hp).+(touchpad)/i,                                                // HP TouchPad\n            /(hp).+(tablet)/i,                                                  // HP Tablet\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /\\s(nook)[\\w\\s]+build\\/(\\w+)/i,                                     // Nook\n            /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i                                  // Dell Streak\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /(kf[A-z]+)\\sbuild\\/[\\w\\.]+.*silk\\//i                               // Kindle Fire HD\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [\n            /(sd|kf)[0349hijorstuw]+\\sbuild\\/[\\w\\.]+.*silk\\//i                  // Fire Phone\n            ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [\n\n            /\\((ip[honed|\\s\\w*]+);.+(apple)/i                                   // iPod/iPhone\n            ], [MODEL, VENDOR, [TYPE, MOBILE]], [\n            /\\((ip[honed|\\s\\w*]+);/i                                            // iPod/iPhone\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [\n\n            /(blackberry)[\\s-]?(\\w+)/i,                                         // BlackBerry\n            /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\\s_-]?([\\w-]+)*/i,\n                                                                                // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron\n            /(hp)\\s([\\w\\s]+\\w)/i,                                               // HP iPAQ\n            /(asus)-?(\\w+)/i                                                    // Asus\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n            /\\(bb10;\\s(\\w+)/i                                                   // BlackBerry 10\n            ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [\n                                                                                // Asus Tablets\n            /android.+(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus 7|padfone)/i\n            ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [\n\n            /(sony)\\s(tablet\\s[ps])\\sbuild\\//i,                                  // Sony\n            /(sony)?(?:sgp.+)\\sbuild\\//i\n            ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [\n            /(?:sony)?(?:(?:(?:c|d)\\d{4})|(?:so[-l].+))\\sbuild\\//i\n            ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [\n\n            /\\s(ouya)\\s/i,                                                      // Ouya\n            /(nintendo)\\s([wids3u]+)/i                                          // Nintendo\n            ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n\n            /android.+;\\s(shield)\\sbuild/i                                      // Nvidia\n            ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n\n            /(playstation\\s[34portablevi]+)/i                                   // Playstation\n            ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [\n\n            /(sprint\\s(\\w+))/i                                                  // Sprint Phones\n            ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [\n\n            /(lenovo)\\s?(S(?:5000|6000)+(?:[-][\\w+]))/i                         // Lenovo tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /(htc)[;_\\s-]+([\\w\\s]+(?=\\))|\\w+)*/i,                               // HTC\n            /(zte)-(\\w+)*/i,                                                    // ZTE\n            /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]+)*/i\n                                                                                // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony\n            ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n            /(nexus\\s9)/i                                                       // HTC Nexus 9\n            ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n\n            /(nexus\\s6p)/i                                                      // Huawei Nexus 6P\n            ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [\n\n            /(microsoft);\\s(lumia[\\s\\w]+)/i                                     // Microsoft Lumia\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /[\\s\\(;](xbox(?:\\sone)?)[\\s\\);]/i                                   // Microsoft Xbox\n            ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [\n            /(kin\\.[onetw]{3})/i                                                // Microsoft Kin\n            ], [[MODEL, /\\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [\n\n                                                                                // Motorola\n            /\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?(:?\\s4g)?)[\\w\\s]+build\\//i,\n            /mot[\\s-]?(\\w+)*/i,\n            /(XT\\d{3,4}) build\\//i,\n            /(nexus\\s6)/i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [\n            /android.+\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [\n\n            /hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i            // HbbTV devices\n            ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [\n\n            /hbbtv.+maple;(\\d+)/i\n            ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [\n\n            /\\(dtv[\\);].+(aquos)/i                                              // Sharp\n            ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n\n            /android.+((sch-i[89]0\\d|shw-m380s|gt-p\\d{4}|gt-n\\d+|sgh-t8[56]9|nexus 10))/i,\n            /((SM-T\\w+))/i\n            ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [                  // Samsung\n            /smart-tv.+(samsung)/i\n            ], [VENDOR, [TYPE, SMARTTV], MODEL], [\n            /((s[cgp]h-\\w+|gt-\\w+|galaxy\\snexus|sm-\\w[\\w\\d]+))/i,\n            /(sam[sung]*)[\\s-]*(\\w+-?[\\w-]*)*/i,\n            /sec-((sgh\\w+))/i\n            ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [\n\n            /sie-(\\w+)*/i                                                       // Siemens\n            ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n\n            /(maemo|nokia).*(n900|lumia\\s\\d+)/i,                                // Nokia\n            /(nokia)[\\s_-]?([\\w-]+)*/i\n            ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [\n\n            /android\\s3\\.[\\s\\w;-]{10}(a\\d{3})/i                                 // Acer\n            ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n            /android\\s3\\.[\\s\\w;-]{10}(lg?)-([06cv9]{3,4})/i                     // LG Tablet\n            ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [\n            /(lg) netcast\\.tv/i                                                 // LG SmartTV\n            ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n            /(nexus\\s[45])/i,                                                   // LG\n            /lg[e;\\s\\/-]+(\\w+)*/i\n            ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [\n\n            /android.+(ideatab[a-z0-9\\-\\s]+)/i                                  // Lenovo\n            ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n            /linux;.+((jolla));/i                                               // Jolla\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /((pebble))app\\/[\\d\\.]+\\s/i                                         // Pebble\n            ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n\n            /android.+;\\s(glass)\\s\\d/i                                          // Google Glass\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [\n\n            /android.+(\\w+)\\s+build\\/hm\\1/i,                                    // Xiaomi Hongmi 'numeric' models\n            /android.+(hm[\\s\\-_]*note?[\\s_]*(?:\\d\\w)?)\\s+build/i,               // Xiaomi Hongmi\n            /android.+(mi[\\s\\-_]*(?:one|one[\\s_]plus|note lte)?[\\s_]*(?:\\d\\w)?)\\s+build/i    // Xiaomi Mi\n            ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [\n\n            /android.+a000(1)\\s+build/i                                         // OnePlus\n            ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n            /\\s(tablet)[;\\/]/i,                                                 // Unidentifiable Tablet\n            /\\s(mobile)(?:[;\\/]|\\ssafari)/i                                     // Unidentifiable Mobile\n            ], [[TYPE, util.lowerize], VENDOR, MODEL]\n\n            /*//////////////////////////\n            // TODO: move to string map\n            ////////////////////////////\n\n            /(C6603)/i                                                          // Sony Xperia Z C6603\n            ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n            /(C6903)/i                                                          // Sony Xperia Z 1\n            ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n\n            /(SM-G900[F|H])/i                                                   // Samsung Galaxy S5\n            ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G7102)/i                                                       // Samsung Galaxy Grand 2\n            ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G530H)/i                                                       // Samsung Galaxy Grand Prime\n            ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G313HZ)/i                                                      // Samsung Galaxy V\n            ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-T805)/i                                                        // Samsung Galaxy Tab S 10.5\n            ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n            /(SM-G800F)/i                                                       // Samsung Galaxy S5 Mini\n            ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-T311)/i                                                        // Samsung Galaxy Tab 3 8.0\n            ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n\n            /(R1001)/i                                                          // Oppo R1001\n            ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n            /(X9006)/i                                                          // Oppo Find 7a\n            ], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [\n            /(R2001)/i                                                          // Oppo YOYO R2001\n            ], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [\n            /(R815)/i                                                           // Oppo Clover R815\n            ], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [\n             /(U707)/i                                                          // Oppo Find Way S\n            ], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [\n\n            /(T3C)/i                                                            // Advan Vandroid T3C\n            ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [\n            /(ADVAN T1J\\+)/i                                                    // Advan Vandroid T1J+\n            ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [\n            /(ADVAN S4A)/i                                                      // Advan Vandroid S4A\n            ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [\n\n            /(V972M)/i                                                          // ZTE V972M\n            ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n\n            /(i-mobile)\\s(IQ\\s[\\d\\.]+)/i                                        // i-mobile IQ\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n            /(IQ6.3)/i                                                          // i-mobile IQ IQ 6.3\n            ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [\n            /(i-mobile)\\s(i-style\\s[\\d\\.]+)/i                                   // i-mobile i-STYLE\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n            /(i-STYLE2.1)/i                                                     // i-mobile i-STYLE 2.1\n            ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [\n\n            /(mobiistar touch LAI 512)/i                                        // mobiistar touch LAI 512\n            ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [\n\n            /////////////\n            // END TODO\n            ///////////*/\n\n        ],\n\n        engine : [[\n\n            /windows.+\\sedge\\/([\\w\\.]+)/i                                       // EdgeHTML\n            ], [VERSION, [NAME, 'EdgeHTML']], [\n\n            /(presto)\\/([\\w\\.]+)/i,                                             // Presto\n            /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\\/([\\w\\.]+)/i,     // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m\n            /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i,                          // KHTML/Tasman/Links\n            /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i                                      // iCab\n            ], [NAME, VERSION], [\n\n            /rv\\:([\\w\\.]+).*(gecko)/i                                           // Gecko\n            ], [VERSION, NAME]\n        ],\n\n        os : [[\n\n            // Windows based\n            /microsoft\\s(windows)\\s(vista|xp)/i                                 // Windows (iTunes)\n            ], [NAME, VERSION], [\n            /(windows)\\snt\\s6\\.2;\\s(arm)/i,                                     // Windows RT\n            /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s]+\\w)*/i,                  // Windows Phone\n            /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)/i\n            ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [\n            /(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i\n            ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [\n\n            // Mobile/Embedded OS\n            /\\((bb)(10);/i                                                      // BlackBerry 10\n            ], [[NAME, 'BlackBerry'], VERSION], [\n            /(blackberry)\\w*\\/?([\\w\\.]+)*/i,                                    // Blackberry\n            /(tizen)[\\/\\s]([\\w\\.]+)/i,                                          // Tizen\n            /(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|contiki)[\\/\\s-]?([\\w\\.]+)*/i,\n                                                                                // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki\n            /linux;.+(sailfish);/i                                              // Sailfish OS\n            ], [NAME, VERSION], [\n            /(symbian\\s?os|symbos|s60(?=;))[\\/\\s-]?([\\w\\.]+)*/i                 // Symbian\n            ], [[NAME, 'Symbian'], VERSION], [\n            /\\((series40);/i                                                    // Series 40\n            ], [NAME], [\n            /mozilla.+\\(mobile;.+gecko.+firefox/i                               // Firefox OS\n            ], [[NAME, 'Firefox OS'], VERSION], [\n\n            // Console\n            /(nintendo|playstation)\\s([wids34portablevu]+)/i,                   // Nintendo/Playstation\n\n            // GNU/Linux based\n            /(mint)[\\/\\s\\(]?(\\w+)*/i,                                           // Mint\n            /(mageia|vectorlinux)[;\\s]/i,                                       // Mageia/VectorLinux\n            /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\\/\\s-]?(?!chrom)([\\w\\.-]+)*/i,\n                                                                                // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware\n                                                                                // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus\n            /(hurd|linux)\\s?([\\w\\.]+)*/i,                                       // Hurd/Linux\n            /(gnu)\\s?([\\w\\.]+)*/i                                               // GNU\n            ], [NAME, VERSION], [\n\n            /(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i                                       // Chromium OS\n            ], [[NAME, 'Chromium OS'], VERSION],[\n\n            // Solaris\n            /(sunos)\\s?([\\w\\.]+\\d)*/i                                           // Solaris\n            ], [[NAME, 'Solaris'], VERSION], [\n\n            // BSD based\n            /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?([\\w\\.]+)*/i                   // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly\n            ], [NAME, VERSION],[\n\n            /(haiku)\\s(\\w+)/i                                                  // Haiku\n            ], [NAME, VERSION],[\n\n            /(ip[honead]+)(?:.*os\\s([\\w]+)*\\slike\\smac|;\\sopera)/i              // iOS\n            ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [\n\n            /(mac\\sos\\sx)\\s?([\\w\\s\\.]+\\w)*/i,\n            /(macintosh|mac(?=_powerpc)\\s)/i                                    // Mac OS\n            ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n            // Other\n            /((?:open)?solaris)[\\/\\s-]?([\\w\\.]+)*/i,                            // Solaris\n            /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.]*)*/i,                               // AIX\n            /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms)/i,\n                                                                                // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS\n            /(unix)\\s?([\\w\\.]+)*/i                                              // UNIX\n            ], [NAME, VERSION]\n        ]\n    };\n\n\n    /////////////////\n    // Constructor\n    ////////////////\n\n\n    var UAParser = function (uastring, extensions) {\n\n        if (!(this instanceof UAParser)) {\n            return new UAParser(uastring, extensions).getResult();\n        }\n\n        var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n        var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n        this.getBrowser = function () {\n            var browser = mapper.rgx.apply(this, rgxmap.browser);\n            browser.major = util.major(browser.version);\n            return browser;\n        };\n        this.getCPU = function () {\n            return mapper.rgx.apply(this, rgxmap.cpu);\n        };\n        this.getDevice = function () {\n            return mapper.rgx.apply(this, rgxmap.device);\n        };\n        this.getEngine = function () {\n            return mapper.rgx.apply(this, rgxmap.engine);\n        };\n        this.getOS = function () {\n            return mapper.rgx.apply(this, rgxmap.os);\n        };\n        this.getResult = function() {\n            return {\n                ua      : this.getUA(),\n                browser : this.getBrowser(),\n                engine  : this.getEngine(),\n                os      : this.getOS(),\n                device  : this.getDevice(),\n                cpu     : this.getCPU()\n            };\n        };\n        this.getUA = function () {\n            return ua;\n        };\n        this.setUA = function (uastring) {\n            ua = uastring;\n            return this;\n        };\n        return this;\n    };\n\n    UAParser.VERSION = LIBVERSION;\n    UAParser.BROWSER = {\n        NAME    : NAME,\n        MAJOR   : MAJOR, // deprecated\n        VERSION : VERSION\n    };\n    UAParser.CPU = {\n        ARCHITECTURE : ARCHITECTURE\n    };\n    UAParser.DEVICE = {\n        MODEL   : MODEL,\n        VENDOR  : VENDOR,\n        TYPE    : TYPE,\n        CONSOLE : CONSOLE,\n        MOBILE  : MOBILE,\n        SMARTTV : SMARTTV,\n        TABLET  : TABLET,\n        WEARABLE: WEARABLE,\n        EMBEDDED: EMBEDDED\n    };\n    UAParser.ENGINE = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n    UAParser.OS = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n\n\n    ///////////\n    // Export\n    //////////\n\n\n    // check js environment\n    if (typeof(exports) !== UNDEF_TYPE) {\n        // nodejs env\n        if (typeof module !== UNDEF_TYPE && module.exports) {\n            exports = module.exports = UAParser;\n        }\n        exports.UAParser = UAParser;\n    } else {\n        // requirejs env (optional)\n        if (typeof(define) === FUNC_TYPE && define.amd) {\n            define(function () {\n                return UAParser;\n            });\n        } else {\n            // browser env\n            window.UAParser = UAParser;\n        }\n    }\n\n    // jQuery/Zepto specific (optional)\n    // Note:\n    //   In AMD env the global scope should be kept clean, but jQuery is an exception.\n    //   jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n    //   and we should catch that.\n    var $ = window.jQuery || window.Zepto;\n    if (typeof $ !== UNDEF_TYPE) {\n        var parser = new UAParser();\n        $.ua = parser.getResult();\n        $.ua.get = function() {\n            return parser.getUA();\n        };\n        $.ua.set = function (uastring) {\n            parser.setUA(uastring);\n            var result = parser.getResult();\n            for (var prop in result) {\n                $.ua[prop] = result[prop];\n            }\n        };\n    }\n\n})(typeof window === 'object' ? window : this);\n","/*!\n * Unidragger v2.2.3\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'unipointer/unipointer'\n    ], function( Unipointer ) {\n      return factory( window, Unipointer );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('unipointer')\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n  this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( false );\n};\n\n/**\n * works as unbinder, as you can .bindHandles( false ) to unbind\n * @param {Boolean} isBind - will unbind if falsey\n */\nproto._bindHandles = function( isBind ) {\n  // munge isBind, default to true\n  isBind = isBind === undefined ? true : !!isBind;\n  // bind each handle\n  var bindMethod = isBind ? 'addEventListener' : 'removeEventListener';\n  for ( var i=0; i < this.handles.length; i++ ) {\n    var handle = this.handles[i];\n    this._bindStartEvent( handle, isBind );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures\n    // metafizzy/flickity#540\n    if ( window.PointerEvent ) {\n      handle.style.touchAction = isBind ? this._touchActionValue : '';\n    }\n  }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss range sliders\n  if ( event.target.nodeName == 'INPUT' && event.target.type == 'range' ) {\n    // reset pointerDown logic\n    this.isPointerDown = false;\n    delete this.pointerIdentifier;\n    return;\n  }\n\n  this._dragPointerDown( event, pointer );\n  // kludge to blur focused inputs in dragger\n  var focused = document.activeElement;\n  if ( focused && focused.blur ) {\n    focused.blur();\n  }\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// base pointer down logic\nproto._dragPointerDown = function( event, pointer ) {\n  // track to see when dragging starts\n  this.pointerDownPoint = Unipointer.getPointerPoint( pointer );\n\n  var canPreventDefault = this.canPreventDefaultOnPointerDown( event, pointer );\n  if ( canPreventDefault ) {\n    event.preventDefault();\n  }\n};\n\n// overwriteable method so Flickity can prevent for scrolling\nproto.canPreventDefaultOnPointerDown = function( event ) {\n  // prevent default, unless touchstart or <select>\n  return event.target.nodeName != 'SELECT';\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n  var movePoint = Unipointer.getPointerPoint( pointer );\n  var moveVector = {\n    x: movePoint.x - this.pointerDownPoint.x,\n    y: movePoint.y - this.pointerDownPoint.y\n  };\n  // start drag if pointer has moved far enough to start drag\n  if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n    this._dragStart( event, pointer );\n  }\n  return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n  if ( this.isDragging ) {\n    this._dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this._staticClick( event, pointer );\n  }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.dragStartPoint = Unipointer.getPointerPoint( pointer );\n  // prevent clicks\n  this.isPreventingClicks = true;\n\n  this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n  // do not drag if not dragging yet\n  if ( !this.isDragging ) {\n    return;\n  }\n\n  this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n  // set flags\n  this.isDragging = false;\n  // re-enable clicking async\n  setTimeout( function() {\n    delete this.isPreventingClicks;\n  }.bind( this ) );\n\n  this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) {\n    event.preventDefault();\n  }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  // allow click in <input>s and <textarea>s\n  var nodeName = event.target.nodeName;\n  if ( nodeName == 'INPUT' || nodeName == 'TEXTAREA' ) {\n    event.target.focus();\n  }\n  this.staticClick( event, pointer );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    setTimeout( function() {\n      delete this.isIgnoringMouseUp;\n    }.bind( this ), 400 );\n  }\n};\n\nproto.staticClick = function( event, pointer ) {\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// -----  ----- //\n\nreturn Unidragger;\n\n}));\n","/*!\n * Unipointer v2.2.1\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*global define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter'\n    ], function( EvEmitter ) {\n      return factory( window, EvEmitter );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('ev-emitter')\n    );\n  } else {\n    // browser global\n    window.Unipointer = factory(\n      window,\n      window.EvEmitter\n    );\n  }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, false );\n};\n\n/**\n * works as unbinder, as you can ._bindStart( false ) to unbind\n * @param {Boolean} isBind - will unbind if falsey\n */\nproto._bindStartEvent = function( elem, isBind ) {\n  // munge isBind, default to true\n  isBind = isBind === undefined ? true : !!isBind;\n  var bindMethod = isBind ? 'addEventListener' : 'removeEventListener';\n\n  if ( window.PointerEvent ) {\n    // Pointer Events. Chrome 55, IE11, Edge 14\n    elem[ bindMethod ]( 'pointerdown', this );\n  } else {\n    // listen for both, for devices like Chrome Pixel\n    elem[ bindMethod ]( 'mousedown', this );\n    elem[ bindMethod ]( 'touchstart', this );\n  }\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n  for ( var i=0; i < touches.length; i++ ) {\n    var touch = touches[i];\n    if ( touch.identifier == this.pointerIdentifier ) {\n      return touch;\n    }\n  }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  // dismiss clicks from right or middle buttons\n  var button = event.button;\n  if ( button && ( button !== 0 && button !== 1 ) ) {\n    return;\n  }\n  this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n  // dismiss right click and other pointers\n  // button = 0 is okay, 1-4 not\n  if ( event.button || this.isPointerDown ) {\n    return;\n  }\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n\n  this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n  mousedown: [ 'mousemove', 'mouseup' ],\n  touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n  pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n  if ( !event ) {\n    return;\n  }\n  // get proper events to match start event\n  var events = postStartEvents[ event.type ];\n  // bind events to node\n  events.forEach( function( eventName ) {\n    window.addEventListener( eventName, this );\n  }, this );\n  // save these arguments\n  this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n  // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n  if ( !this._boundPointerEvents ) {\n    return;\n  }\n  this._boundPointerEvents.forEach( function( eventName ) {\n    window.removeEventListener( eventName, this );\n  }, this );\n\n  delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n  this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerMove( event, event );\n  }\n};\n\nproto.ontouchmove = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerMove( event, touch );\n  }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n  this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n  this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n  this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerUp( event, event );\n  }\n};\n\nproto.ontouchend = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerUp( event, touch );\n  }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n  // reset properties\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  // remove events\n  this._unbindPostStartEvents();\n  this.pointerDone();\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerCancel( event, event );\n  }\n};\n\nproto.ontouchcancel = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerCancel( event, touch );\n  }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// -----  ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n  return {\n    x: pointer.pageX,\n    y: pointer.pageY\n  };\n};\n\n// -----  ----- //\n\nreturn Unipointer;\n\n}));\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar debounce = require('debounce');\n\nfunction HeroSlider(el, indicators) {\n  this.$el = $(el);\n  this.$indicators = $(indicators);\n  this.$slides = this.$el.children('[data-slide]');\n  this.activeIndex = 0;\n  this.sliding = false;\n\n  $(window).on('vsc-page-resized', this.resize.bind(this));\n  this.resize();\n\n  this.$el.on('click', '[data-slide-control=\"next\"]', this.nextSlide.bind(this));\n  this.$el.on('click', '[data-slide-control=\"previous\"]', this.previousSlide.bind(this));\n\n  if(this.$indicators.length) {\n    this.$indicators.on('click', function(event) {\n      event.preventDefault();\n\n      var $indicator = $(event.currentTarget);\n      var index = $indicator.index();\n\n      var left = (index < this.activeIndex);\n\n      this.goTo(index, left);\n    }.bind(this));\n  }\n\n  this.$el.on('scroll-in.vsc-scroll', function() {\n    this.$el.find('[data-slide].active').trigger('slide-in.vsc-slide');\n  }.bind(this));\n}\n\nHeroSlider.prototype.goTo = function(index, left) {\n  if(this.sliding || index === this.activeIndex) {\n    return;\n  }\n\n  // if(typeof left === 'undefined') {\n  //   left = (index < this.activeIndex);\n  // }\n\n  this.slideOut(this.activeIndex, left);\n  this.slideIn(index, left);\n  this.activeIndex = index;\n\n  if(this.$indicators.length) {\n    var $i = this.$indicators.eq(index);\n    $i.addClass('active');\n    this.$indicators.not($i).removeClass('active');\n  }\n}\n\nHeroSlider.prototype.nextSlide = function() {\n  if(this.sliding) {\n    return;\n  }\n\n  if(this.activeIndex >= this.$slides.length - 1) {\n    this.goTo(0);\n  } else {\n    this.goTo(this.activeIndex+1);\n  }\n}\n\nHeroSlider.prototype.previousSlide = function() {\n  if(this.sliding) {\n    return;\n  }\n\n  if(this.activeIndex == 0) {\n    this.goTo(this.$slides.length - 1, true);\n  } else {\n    this.goTo(this.activeIndex-1, true);\n  }\n}\n\nHeroSlider.prototype.resize = function() {\n  var maxHeight = 0;\n\n  this.$slides.each(function() {\n    maxHeight = Math.max(maxHeight, $(this).find('[data-slide-content]').outerHeight());\n  }).css('height', maxHeight);\n}\n\nHeroSlider.prototype.slideOut = function(index, left) {\n  var $slide = this.$slides.eq(index);\n  var $slideBackground = $slide.find('.hero-slide-background');\n  var $slideContent = $slide.find('.centered-container');\n\n  if(!left) {\n    $slide.addClass('prev').trigger('slide-out.vsc-slide');\n  } else {\n    this.sliding = true;\n\n    $slide.addClass('next');\n\n    TweenLite.fromTo($slideBackground, .35, {\n      y: '0%'\n    }, {\n      y: '-100%',\n      ease: Power3.easeIn,\n      onComplete: function() {\n        this.$slides.removeClass('prev next');\n\n        $slide.trigger('slide-out.vsc-slide');\n\n        this.sliding = false;\n      }.bind(this),\n      clearProps: 'y'\n    });\n  }\n}\n\nHeroSlider.prototype.slideIn = function(index, left) {\n  var $slide = this.$slides.eq(index);\n  var $slideBackground = $slide.find('.hero-slide-background');\n  var $slideContent = $slide.find('.centered-container');\n\n  if(!left) {\n    this.sliding = true;\n\n    $slide.addClass('active next');\n    this.$slides.not($slide).removeClass('active');\n\n    TweenLite.fromTo($slideBackground, .6, {\n      y: '-100%'\n    }, {\n      y: '0%',\n      ease: Bounce.easeOut,\n      delay: .15,\n      onComplete: function() {\n        this.$slides.removeClass('prev next');\n\n        $slide.trigger('slide-in.vsc-slide', {index: $slide.index(this.$slides)});\n\n        this.$slides.not($slide).removeClass('active');\n\n        this.sliding = false;\n      }.bind(this),\n      clearProps: 'y'\n    });\n  } else {\n    $slide.addClass('active prev');\n    this.$slides.not($slide).removeClass('active');\n  }\n}\n\nmodule.exports = HeroSlider;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction ProductTypePicker(el) {\n  this.el = el;\n  this.$el = $(el);\n  this.eventX;\n  this.isDragging = false;\n\n  this.$el.on('mousedown', this.mouseDragStart.bind(this));\n\n  $(window)\n    .on('mousemove', this.mouseDragMove.bind(this))\n    .on('mouseup', this.mouseDragEnd.bind(this))\n\n  this.$el.on('click', '.product-type-tab', function(event) {\n    var $target = $(event.target).closest('.product-type-tab');\n\n    gtmTrackEvent({\n      'event': 'product-select',\n      'selected-product': $.trim($target.text())\n    });\n\n    this.scrollToTab($target);\n    this.scrollToSection();\n  }.bind(this));\n\n  this.$el.find('.product-type-tab[data-active]').trigger('click');\n}\n\nProductTypePicker.prototype = {\n  mouseDragStart: function(event) {\n    event.preventDefault();\n\n    this.$el.one('mousemove', function() {\n      this.isDragging = true;\n    }.bind(this))\n\n    this.eventX = event.clientX;\n\n    this.$el.addClass('dragging');\n  },\n  mouseDragMove: function(event) {\n    if(this.isDragging) {\n      this.el.scrollLeft -= (this.eventX * -1) + event.clientX;\n\n      this.eventX = event.clientX;\n    }\n  },\n  mouseDragEnd: function(event) {\n    this.isDragging = false;\n    this.$el.removeClass('dragging').off('mousemove');\n  },\n  scrollToTab: function($t) {\n    var currentLeft = this.$el.scrollLeft();\n    var destinationLeft = ($t.offset().left + currentLeft - this.$el.offset().left) - (this.$el.outerWidth() / 2) + ($t.outerWidth() / 2);\n\n    if(Modernizr.scrollbehavior) {\n      this.$el.scrollLeft(destinationLeft);\n    } else {\n      this.$el.animate({\n        scrollLeft: destinationLeft\n      }, 200);\n    }\n  },\n  scrollToSection: function() {\n    var $section = this.$el.closest('section');\n    var scrollDest = $section.offset().top + 1;\n\n\n    if($section.is('.product-listing, .home-products-slider')) {\n      scrollDest -= $('.header-bar').outerHeight();\n      scrollDest += 50;\n    }\n\n    if($section.is('.home-products-slider')){\n      scrollDest += $('.home-products-slider h2').outerHeight();\n    }\n\n    if($section.is('.product-listing')){\n      scrollDest += $('.product-types h2').outerHeight();\n    }\n\n    if($('html').hasClass('css-parallax')) {\n      var $scrollContainer = $('main');\n      scrollDest += $scrollContainer.scrollTop();\n      if(!$section.is('.home-products-slider, .product-listing')){\n        var shouldScroll = ($scrollContainer.scrollTop() < scrollDest);\n      }else{\n        var shouldScroll = true;\n      }\n    } else {\n      var $scrollContainer = $('html, body');\n      var shouldScroll = ($(window).scrollTop() < scrollDest);\n    }\n\n    if(shouldScroll) {\n      $scrollContainer.animate({\n        'scrollTop': scrollDest\n      }, 600);\n    }\n  }\n}\n\nmodule.exports = ProductTypePicker;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction ScrollNav($nav, $targets, options) {\n  this.$nav = $nav;\n  this.$listItems = $nav.find('li');\n  this.$targets = $targets;\n  this.options = options;\n\n  this.parallax = $('html').hasClass('css-parallax');\n  this.$scroll = this.parallax ? $('main') : $(window);\n\n  this.updateMap();\n\n  $(window).on('vsc-page-ready vsc-page-changed vsc-page-resized', function() {\n    requestAnimationFrame(this.updateMap.bind(this));\n  }.bind(this));\n\n  this.$scroll.on('scroll.vsc-nav-scroll', this.checkScroll.bind(this));\n\n  this.$listItems.on('click', function(event) {\n    event.preventDefault();\n    var index = $(event.currentTarget).index();\n    this.scrollToTarget(this.targetMap[index]);\n  }.bind(this));\n}\n\nScrollNav.prototype = {\n  updateMap: function() {\n    var targetMap = [];\n\n    this.$targets.each(function(index, target) {\n      var $target = $(target);\n\n      if($target.is(':visible')) {\n        var top = $target.offset().top;\n        var height = window.innerHeight;\n\n        if(this.parallax) {\n          top += this.$scroll.scrollTop();\n        }\n\n        targetMap.push({\n          $el: $target,\n          top: top,\n          height: height,\n          scrollTop: top - (height / 2)\n        });\n      }\n    }.bind(this));\n\n    this.targetMap = targetMap;\n  },\n\n  checkScroll: function() {\n    var activeIndex = 0;\n    var scrollY = this.$scroll.scrollTop();\n\n    for(var i = 0; i < this.targetMap.length; i++) {\n      var target = this.targetMap[i];\n      var $target = target.$el;\n\n      if(!$target.is(':visible')) {\n        break;\n      }\n\n      if(scrollY >= target.scrollTop) {\n        activeIndex = i;\n      }\n    }\n\n    this.updateLinks(activeIndex);\n  },\n\n  updateLinks: function(activeIndex) {\n    var $step = this.$listItems.eq(activeIndex);\n\n    if($step.hasClass('inactive')) {\n      $step.removeClass('inactive');\n    }\n\n    if(!$step.hasClass('current')) {\n      $step.trigger('scroll-nav-activate');\n    }\n\n    $step.addClass('current').siblings().removeClass('current');\n  },\n\n  scrollToTarget: function(t) {\n    var $scroll = this.$scroll[0] == window ? $('html,body') : this.$scroll;\n    var top = t.top;\n\n    if(this.options && this.options.offset) {\n      top += this.options.offset;\n    }\n\n    $scroll.animate({\n      scrollTop: top\n    }, 450);\n  }\n}\n\nmodule.exports = ScrollNav;","var UAParser = require('ua-parser-js');\n\nvar parser = new UAParser(navigator.parser);\nvar userAgent = parser.getResult();\n\nvar Device = {\n  agent: userAgent,\n  browser: userAgent.browser.name.toLowerCase(),\n  engine: userAgent.engine.name.toLowerCase(),\n  os: userAgent.os.name.toLowerCase()\n};\n\nvar mobile = ['ios', 'android', 'windows phone'];\nvar desktop = ['mac os', 'windows'];\n\nDevice.isDefinitelyMobile = mobile.indexOf(Device.os) !== -1;\nDevice.isDefinitelyDesktop = desktop.indexOf(Device.os) !== -1;\n\nDevice.isWebkit = (Device.engine == 'webkit');\n\nModernizr.addTest('scrollsnap', function() {\n  return 'scrollSnapType' in document.documentElement.style || 'webkitScrollSnapType' in document.documentElement.style;\n});\n\nModernizr.addTest('scrollbehavior', function() {\n  return 'scrollBehavior' in document.documentElement.style || 'webkitScrollBehavior' in document.documentElement.style;\n});\n\nModernizr.addTest('retina', function() {\n  var mediaQuery = '(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 1.5dppx)';\n\n  var dpr = window.devicePixelRatio || 1;\n\n  if(dpr > 1) {\n    return true;\n  }\n\n  if(matchMedia && matchMedia(mediaQuery).matches) {\n    return true;\n  }\n\n  return false;\n});\n\nModernizr.addTest('def-desktop', function() {\n  return Device.isDefinitelyDesktop;\n});\n\nModernizr.addTest('def-mobile', function() {\n  return Device.isDefinitelyMobile;\n});\n\nmodule.exports = Device;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction FormError() {\n    this.init = function() {\n        var $error = $( '.page-template-page-contact .validation_error' ),\n            $formTop = $( '.gform_fields .gfield_html:first-child');\n\n        if ( $error.length && $formTop.length ) {\n            $error.appendTo( $formTop );\n        }\n    };\n\n    this.init();\n}\n\nmodule.exports = FormError;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction FormTooltip() {\n    this.init = function() {\n        $(document).on('touchstart', function(e) {\n            var $target = $(e.target);\n\n            if ( $target.is( '.gfield_description--tooltip' ) || $target.closest( '.gfield_description--tooltip' ).length > 0 ) {\n                e.preventDefault();\n                $target.toggleClass( \"js-tooltip-active\" );\n            } else {\n                $(\".js-tooltip-active\").removeClass( \"js-tooltip-active\" );\n            }\n        });\n\n    };\n\n    this.init();\n}\n\nmodule.exports = FormTooltip;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar vein = require('veinjs');\nvar srcset = require('srcset');\n\nfunction LoadImages() {\n  this.init();\n}\n\nLoadImages.prototype = {\n  init: function() {\n    var elementsToLoad = document.querySelectorAll('[data-bg-img]:not(.bg-load)');\n\n    for(var i = 0; i < elementsToLoad.length; i++) {\n      var el = elementsToLoad[i];\n      this.initBackground(el);\n    }\n  },\n  initBackground: function(el) {\n    el.classList.add('bg-load');\n\n    var name = el.getAttribute('data-bg-img');\n    var selector = '[data-bg-img=\"'+name+'\"]';\n\n    var sources = srcset.parse(el.getAttribute('data-bg-srcset'));\n    var activeSource = '';\n\n    var widths = $.map(sources, function(source, index) {\n      return source.width;\n    });\n\n    var smallestWidth = Math.min.apply(this, widths);\n\n    for(var i = 0; i < sources.length; i++) {\n      var source = sources[i];\n\n      if(source.width) {\n        var targets = {};\n        targets['@media (min-width: '+source.width+'px)'] = [selector];\n\n        var target = [targets];\n      } else {\n        var targets = {};\n        targets['@media (max-width: '+(smallestWidth - 1)+'px)'] = [selector];\n\n        var target = [targets];\n      }\n\n      vein.inject(target, {\n        'background-image': 'url('+source.url+')'\n      });\n\n      if((source.width && window.innerWidth > source.width) || !source.width) {\n        activeSource = source.url;\n      }\n    }\n\n    var activeSourceImage = new Image();\n\n    activeSourceImage.src = activeSource;\n\n    if(activeSourceImage.complete) {\n      $(el).addClass('bg-loaded');\n    } else {\n      $(activeSourceImage).one('load', function() {\n        $(el).addClass('bg-loaded');\n      });\n    }\n  }\n}\n\nmodule.exports = LoadImages;","require('html5-history-api');\n\nmodule.exports = {\n\n  replaceState: function(state, title, url) {\n    if(window.history) {\n      history.replaceState(state, title, url);\n\n      if(title) {\n        this.updateTitle(title);\n      }\n    }\n  },\n\n  updateTitle: function(title) {\n    document.title = title;\n\n    if(title.indexOf('|') !== -1) {\n      title = title.substring(0, title.indexOf('|') - 1);\n      SiteVars['page_title'] = title;\n    }\n  },\n\n  getLocation: function() {\n    return history.location || window.location;\n  }\n\n}","function isEs6Module(val) {\n  return typeof val === 'object' && typeof val.default !== 'undefined';\n}\n\nfunction PageModules() {\n  this.init();\n}\n\nPageModules.prototype.init = function() {\n  this.findElements();\n  this.createModules();\n}\n\nPageModules.prototype.findElements = function() {\n  this.elements = document.querySelectorAll('[data-module],[data-module-init]');\n}\n\nPageModules.prototype.createModules = function() {\n  var modules = [];\n\n  for (var i = 0; i < this.elements.length; i++) {\n    var el = this.elements[i];\n\n    if(el.getAttribute('data-module-initialized')) {\n      continue;\n    }\n\n    var name = el.getAttribute('data-module');\n    if (! name) {\n      name = el.getAttribute('data-module-init');\n    }\n\n    try {\n      // Require module script\n      var Module = require('modules/'+name);\n      if (isEs6Module(Module)) {\n        Module = Module.default;\n      }\n    } catch(e) {\n      var Module = false;\n    }\n\n    if(Module) {\n      // Initialize the module\n      modules.push({\n        el: el,\n        module: new Module(el)\n      });\n\n      el.setAttribute('data-module-initialized', true);\n    }\n  }\n\n  this.modules = modules;\n}\n\nmodule.exports = PageModules;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar device = require('../lib/device.js');\n\nfunction Parallax() {\n  if(device.isDefinitelyMobile) {\n    this.disabled = true;\n  }\n\n  this.cssParallax = (device.isWebkit && device.isDefinitelyDesktop && device.browser !== 'safari') && (window.location.search.indexOf('test') == -1);\n\n  this.init();\n}\n\nParallax.prototype.init = function() {\n  if(this.disabled) {\n    return;\n  }\n\n  this.elements = $('[data-parallax-parent]');\n\n  $(window).off('scroll.vsc-parallax');\n\n  if(this.elements.length) {\n    if(this.cssParallax) {\n      $('html').addClass('css-parallax');\n    } else {\n      $(window).on('scroll.vsc-parallax', this.renderElements.bind(this));\n    }\n  } else {\n    $('html').removeClass('css-parallax');\n  }\n}\n\nParallax.prototype.renderElements = function() {\n  var scrollY = window.pageYOffset;\n  \n  for(var i = 0; i < this.elements.length; i++) {\n    var parallaxEl = this.elements[i];\n\n    var scrollPercent = scrollY / parallaxEl.offsetHeight;\n\n    if(scrollPercent <= 1 && scrollPercent >= -1) {\n      var perspectiveOrigin = (scrollPercent + 0.5) * 100;\n      var perspectiveStyle = 'perspective-origin: 50% '+perspectiveOrigin+'%';\n      var prefixedStyle = '-webkit-'+perspectiveStyle+'; '+perspectiveStyle+';';\n      parallaxEl.setAttribute('style', prefixedStyle);\n    }\n  }\n}\n\nmodule.exports = Parallax;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction ScrollEvents() {\n  $(window).on('vsc-page-ready', this.init.bind(this));\n  $(document).on('gform_post_conditional_logic', function() {\n    this.updateTargets();\n  }.bind(this));\n}\n\nScrollEvents.prototype.init = function() {\n  this.updateTargets();\n\n  $(window).on('vsc-page-resized', this.updateTargets.bind(this));\n\n  $(window).add('body > main').off('scroll.vsc-scroll');\n\n  this.$scrollable = $('html').hasClass('css-parallax') ? $('body > main') : $(window);\n\n  this.$scrollable.on('scroll.vsc-scroll', this.onScroll.bind(this));\n  this.onScroll({target: document});\n};\n\nScrollEvents.prototype.updateTargets = function() {\n  var $targets = $('[data-watch-scroll]');\n  var targetMap = {};\n  var resetTargets = [];\n\n  $targets.each(function() {\n    var el = this;\n    var $el = $(el);\n    var top = $el.offset().top;\n    var bottom = top + $el.outerHeight();\n\n    targetMap[top] = targetMap[top] || [];\n\n    targetMap[top].push(el);\n  });\n\n  this.map = targetMap;\n  this.$resetTargets = $('[data-reset-scroll]');\n};\n\nScrollEvents.prototype.onScroll = function(event) {\n  var scrollTop = (event.target == document) ? window.pageYOffset : event.target.scrollTop;\n  var scrollBottom = scrollTop + window.innerHeight;\n\n  if(scrollTop == 0) {\n    this.$resetTargets.filter('[data-watch-scroll=\"in\"]')\n      .trigger('scroll-reset.vsc-scroll')\n      .attr('data-watch-scroll', '');\n  }\n\n  for(var targetY in this.map) {\n    if(scrollBottom > targetY) {\n      var targets = this.map[targetY];\n\n      targets.forEach(function(targetEl, i) {\n        if(targetEl.getAttribute('data-watch-scroll') !== 'in') {\n          setTimeout(function() {\n            targetEl.setAttribute('data-watch-scroll', 'in');\n            $(targetEl).trigger('scroll-in.vsc-scroll');\n          }, 50 * i);\n        }\n      });\n    }\n  }\n\n  if(scrollTop >= window.innerHeight && !$('body').hasClass('show-back-to-top')) {\n    $('body').addClass('show-back-to-top');\n  } else if(scrollTop <= window.innerHeight && $('body').hasClass('show-back-to-top')) {\n    $('body').removeClass('show-back-to-top');\n  }\n}\n\nmodule.exports = ScrollEvents;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar debounce = require('debounce');\nvar device = require('./device.js');\n\nfunction SVGShapes() {\n  this.init();\n}\n\nSVGShapes.prototype.init = function() {\n  var RoughEdges = [];\n\n  // $('.vsc-button.has-rough-edges, .wpslsubmit.has-rough-edges').each(function() {\n  //   $(this).removeClass('has-rough-edges').find('svg').remove();\n  // });\n\n  $('.vsc-button, .wpslsubmit, [data-rough-edge], .acf-form-submit').each(function() {\n    var el = this;\n\n    if(!$(el).hasClass('has-rough-edges')) {\n      var roughEdge = new RoughEdgeSVG(el);\n\n      if(roughEdge.svg) {\n        $(el).data('edgeSVG', roughEdge).append(roughEdge.svg).addClass('has-rough-edges');\n\n        RoughEdges.push(roughEdge);\n      }\n    } else {\n      RoughEdges.push($(this).data('edgeSVG'));\n    }\n  });\n\n  $(window).off('resize.vsc-svg-shapes load.vsc-svg-shapes')\n    .on('resize.vsc-svg-shapes load.vsc-svg-shapes', debounce(function() {\n      RoughEdges.forEach(function(edge) {\n        edge.resize();\n      });\n    }, 200));\n}\n\nmodule.exports = SVGShapes;\n\nvar svgID = 0;\nvar ns = 'http://www.w3.org/2000/svg';\n\nfunction RoughEdgeSVG(element) {\n  this.el = element;\n  this.$el = $(this.el)\n\n  this.className = this.el.getAttribute('data-rough-edge-class');\n  this.mode = this.el.getAttribute('data-rough-edge') || 'all';\n  this.mask = this.el.getAttribute('data-rough-edge-mask');\n\n  if((this.el.offsetWidth <= 0) || (this.mask && device.browser === 'ie')) {\n    return false;\n  }\n\n  if(this.mode === 'all') {\n    this.color = '#DA8B15';\n  } else if(this.mask) {\n    this.color = '#FFFFFF';\n  } else {\n    this.color = '#FEFEFB'\n  }\n\n  var filterID = 'roughEdgeFilter'+svgID;\n  var maskID = 'roughEdgeMask'+svgID;\n\n  var svg = document.createElementNS(ns, 'svg');\n  var defs = document.createElementNS(ns, 'defs');\n  var filter = document.createElementNS(ns, 'filter');\n  var rect = document.createElementNS(ns, 'rect');\n\n  filter.setAttribute('id', filterID);\n\n  this.turbSeed = Math.round(Math.random() * 1000);\n\n  var turbulence = document.createElementNS(ns, 'feTurbulence');\n  turbulence.setAttribute('baseFrequency', '0.006');\n  turbulence.setAttribute('type', 'turbulence');\n  turbulence.setAttribute('seed', this.turbSeed);\n  turbulence.setAttribute('result', 'turbulenceResult');\n\n  var displacement = document.createElementNS(ns, 'feDisplacementMap');\n  displacement.setAttribute('in', 'SourceGraphic');\n  displacement.setAttribute('in2', 'turbulenceResult');\n  var channels = ['R', 'G', 'B', 'A'];\n  var c = Math.floor(Math.random() * 4);\n  displacement.setAttribute('xChannelSelector', channels[c]);\n  displacement.setAttribute('result', 'displacementResult');\n\n  if(!Modernizr.retina) {\n    var blur = document.createElementNS(ns, 'feGaussianBlur');\n    blur.setAttribute('in', 'displacementResult');\n    blur.setAttribute('stdDeviation', '1');\n    blur.setAttribute('result', 'blurResult');\n\n    var blend = document.createElementNS(ns, 'feBlend');\n    blend.setAttribute('in', 'displacementResult');\n    blend.setAttribute('in2', 'blurResult');\n    blend.setAttribute('mode', 'normal');\n  }\n\n  rect.setAttribute('filter', 'url(\"#'+filterID+'\")');\n  rect.setAttribute('fill', this.color);\n  rect.setAttribute('stroke', this.color);\n  rect.setAttribute('stroke-width', '1');\n  rect.setAttribute('stroke-opacity', '0.5');\n\n  if(this.mode === 'top' || this.mode === 'bottom') {\n    turbulence.setAttribute('numOctaves', '4');\n\n    if ( this.mode === 'bottom' ) {\n      displacement.setAttribute('scale', '15');\n    } else {\n      displacement.setAttribute('scale', '25');\n    }\n  } else {\n    turbulence.setAttribute('numOctaves', '10');\n    displacement.setAttribute('scale', '6');\n  }\n\n  filter.appendChild(turbulence);\n  filter.appendChild(displacement);\n\n  if(!Modernizr.retina) {\n    filter.appendChild(blur);\n    filter.appendChild(blend);\n  }\n\n  defs.appendChild(filter);\n  svg.appendChild(defs);\n  svg.setAttribute('preserveAspectRatio', 'none');\n\n  if(this.mask) {\n    var mask = document.createElementNS(ns, 'mask');\n    mask.setAttribute('id', maskID);\n    mask.appendChild(rect);\n\n    var foreignObject = document.createElementNS(ns, 'foreignObject');\n    foreignObject.setAttribute('mask', 'url(#'+maskID+')');\n    foreignObject.setAttribute('x', '0');\n    foreignObject.setAttribute('y', '0');\n\n    var divStyle = '';\n\n    if(this.mask == 'grain') {\n      divStyle = 'height: 100px; background-color: #FCFCF2; background-image: url('+SiteVars['template_url']+'/assets/images/wood-grain-beige.png); background-position: 50% top;';\n    } else {\n      divStyle = 'height: 100%; background-image: url('+this.mask+'); background-size: cover; background-position: 50% 50%;';\n    }\n\n    var div = document.createElement('div');\n    div.setAttribute('style', divStyle);\n\n    foreignObject.appendChild(div);\n\n    defs.appendChild(mask);\n    svg.appendChild(foreignObject);\n  } else {\n    svg.appendChild(rect);\n  }\n\n  if (this.className) {\n    svg.classList.add(this.className);\n  }\n\n  this.svg = svg;\n  this.turbFilter = turbulence;\n  this.rect = rect;\n  this.filter = filter;\n\n  if(foreignObject) {\n    this.foreignObject = foreignObject;\n  }\n\n  if(this.mode === 'bottom' && this.mask) {\n    var secondRect = document.createElementNS(ns, 'rect');\n    secondRect.setAttribute('fill', this.color);\n\n    this.secondRect = secondRect;\n    mask.appendChild(this.secondRect);\n  }\n\n  this.active = true;\n\n  this.resize()\n\n  svgID++;\n\n  if(this.$el.is('.vsc-button, .wpslsubmit, .paginate-load-more-button, .acf-form-submit')) {\n    this.isSketching = false;\n\n    this.$el\n      .on('mouseenter', this.startSketching.bind(this))\n      .on('mouseleave', this.stopSketching.bind(this));\n\n    if(device.browser == 'firefox') {\n      $(window).on('scroll', debounce(function() {\n        this.rect.removeAttribute('filter')\n        requestAnimationFrame(function() {\n          this.rect.setAttribute('filter', 'url(\"#'+filterID+'\")')\n        }.bind(this));\n      }.bind(this), 50));\n    }\n  }\n}\n\nRoughEdgeSVG.prototype.resize = function() {\n  if(!this.active) {\n    return;\n  }\n\n  var w = this.el.offsetWidth;\n  var h = this.el.offsetHeight;\n\n  if(this.mode === 'bottom') {\n    this.svg.setAttribute('viewBox', '0 0 '+w+' '+(h+50));\n    this.rect.setAttribute('width', (w+50));\n    this.rect.setAttribute('height', 100);\n    this.rect.setAttribute('x', '-25');\n    this.rect.setAttribute('y', h-75);\n\n    if(this.secondRect) {\n      this.secondRect.setAttribute('width', w);\n      this.secondRect.setAttribute('height', h-50);\n      this.secondRect.setAttribute('x', '0');\n      this.secondRect.setAttribute('y', '0');\n    }\n\n    if(this.foreignObject) {\n      this.foreignObject.setAttribute('width', w);\n      this.foreignObject.setAttribute('height', h+50);\n      $(this.foreignObject.firstChild).css('height', h+50);\n    }\n\n  } else if(this.mode === 'top') {\n    this.svg.setAttribute('viewBox', '0 0 '+w+' 100');\n    this.rect.setAttribute('width', (w + 50));\n    this.rect.setAttribute('height', '100');\n    this.rect.setAttribute('x', '-25');\n    this.rect.setAttribute('y', '25');\n\n    if(this.foreignObject) {\n      this.foreignObject.setAttribute('width', w);\n      this.foreignObject.setAttribute('height', '100');\n    }\n  } else {\n    this.svg.setAttribute('viewBox', '0 0 '+w+' '+h);\n    this.rect.setAttribute('width', Math.max(w - 8, 0));\n    this.rect.setAttribute('height', Math.max(h - 8, 0));\n    this.rect.setAttribute('x', '4');\n    this.rect.setAttribute('y', '4');\n\n    if(this.foreignObject) {\n      this.foreignObject.setAttribute('width', w);\n      this.foreignObject.setAttribute('height', h);\n      $(this.foreignObject.firstChild).css('height', h+'px');\n    }\n  }\n\n  // if(!Modernizr.retina && device.browser == 'safari') {\n  //   this.filter.setAttribute('filterRes', (w * 4)+' '+(h * 4));\n  //   this.turbFilter.setAttribute('baseFrequency', '0.004');\n  // }\n};\n\nRoughEdgeSVG.prototype.startSketching = function() {\n  clearTimeout(this.sketchingTimeout);\n\n  this.isSketching = true;\n  this.$el.addClass('in');\n\n  this.sketchingTimeout = setTimeout(this.iterateSketch.bind(this), (1000 / 12));\n};\n\nRoughEdgeSVG.prototype.iterateSketch = function() {\n  clearTimeout(this.sketchingTimeout);\n\n  this.turbSeed++;\n\n  this.turbFilter.setAttribute('seed', this.turbSeed);\n\n  if(this.isSketching) {\n    this.sketchingTimeout = setTimeout(this.iterateSketch.bind(this), (1000 / 12));\n  }\n};\n\nRoughEdgeSVG.prototype.stopSketching = function() {\n  clearTimeout(this.sketchingTimeout);\n\n  this.isSketching = false;\n\n  this.$el.removeClass('in');\n};\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar device = require('lib/device.js');\n\nfunction TextEffects() {\n  this.init();\n}\n\nTextEffects.prototype.init = function() {\n  $('.callouts').not('[data-callout-count]').each(function() {\n    var $el = $(this);\n\n    if(!$el.closest('.product-info').length && !$el.attr('data-callout-count')) {\n      new Callouts(this);\n    }\n  });\n\n  $('[data-heading-animation]').not('.heading-animation-on').each(function() {\n    new HeadingAnimation(this);\n  });\n}\n\nmodule.exports = TextEffects;\n\nfunction Callouts(el) {\n  this.$el = $(el);\n  this.$facts = this.$el.children();\n  this.active = 0;\n  this.count = this.$facts.length;\n  this.timer = 0;\n\n  this.$el.attr('data-callout-count', this.count);\n\n  this.timer = setTimeout(this.next.bind(this), 4000);\n}\n\nCallouts.prototype.next = function() {\n  clearTimeout(this.timer);\n  \n  this.active++;\n\n  if(this.active >= this.count) {\n    this.active = 0;\n  }\n\n  this.$el.css('transform', 'translateX(-'+(this.active / this.count * 100)+'%)');\n\n  this.timer = setTimeout(this.next.bind(this), 4000);\n}\n\nfunction HeadingAnimation(el) {\n  if(device.isDefinitelyMobile) {\n    return;\n  }\n\n  this.$el = $(el);\n\n  this.$el.addClass('heading-animation-on');\n  \n  this.t = new TimelineLite({\n    onComplete: this.finish.bind(this)\n  });\n  this.items = [];\n\n  this.t.pause();\n\n  this.$el.find('h1, h2, h3, h4').each(function(index, headingEl) {\n    this.addHeading(headingEl);\n  }.bind(this));\n\n  this.$el.find('p:has(a.vsc-button)').each(function(index, paragraphEl) {\n    this.addParagraph(paragraphEl);\n  }.bind(this));\n\n  this.$el.one('scroll-in.vsc-scroll slide-in.vsc-slide', function() {\n    this.t.play();\n  }.bind(this));\n}\n\nHeadingAnimation.prototype.addHeading = function(headingEl) {\n  var $h = $(headingEl);\n\n  if($h.is('h4')) {\n    $h.wrapInner('<span></span>');\n  } else {\n    var parts = $h.html().split(' ');\n\n    for(var i = 0; i < parts.length; i++) {\n      if(parts[i].indexOf('<') !== 0) {\n        parts[i] = '<span>'+parts[i]+'</span>';\n      }\n    }\n\n    $h.html(parts.join(' '));\n  }\n\n  $h.addClass('heading-split');\n\n  $h.children().each(function(index, word) {\n    var strong = word.tagName.toLowerCase() == 'strong';\n    var dur = strong ? .5 : .3;\n    var initialScale = strong ? .5 : .75;\n    var pos = (index !== 0) ? '-=.05' : null;\n\n    this.t.fromTo(word, dur, {\n      opacity: 0,\n      scale: initialScale\n    }, {\n      opacity: 1,\n      scale: 1,\n      ease: Back.easeOut\n    }, pos);\n  }.bind(this));\n}\n\nHeadingAnimation.prototype.addParagraph = function(paragraphEl) {\n  var $p = $(paragraphEl);\n  $p.addClass('heading-animation-p');\n\n  this.t.fromTo($p[0], .6, {\n    opacity: 0,\n    scale: .75\n  }, {\n    opacity: 1,\n    scale: 1,\n    ease: Back.easeOut\n  });\n}\n\nHeadingAnimation.prototype.finish = function() {\n  this.$el.addClass('heading-animation-done');\n}\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar PageModules = require('./lib/page-modules.js');\nvar Parallax = require('./lib/parallax.js');\nvar SVGShapes = require('./lib/svg-shapes.js');\nvar TextEffects = require('./lib/text-effects.js');\nvar ScrollEvents = require('./lib/scroll-events.js');\nvar LoadImages = require('./lib/load-images.js');\nvar FormTooltip = require('./lib/form-tooltip.js');\nvar FormError = require('./lib/form-error.js');\n// var AJAXLoad = require('./lib/ajax-load.js');\n\n(function() {\n  // $('body').on('click', 'a[href^=\"'+SiteVars['home_url']+'\"]', AJAXLoad);\n\n  window.gtmTrackEvent = function(data) {\n    if(typeof window.dataLayer === 'undefined') {\n      console.log(data);\n    } else {\n      window.dataLayer.push(data);\n    }\n  };\n\n  if ( location.hash ) {\n    var $target = $( location.hash ),\n        offset = $target.position().top - 69;\n\n    $(window).on('load', function() {\n      $('main').scrollTop(offset);\n    });\n  };\n\n  var Site = {\n    modules: new PageModules(),\n    parallax: new Parallax(),\n    scroll: new ScrollEvents(),\n    shapes: new SVGShapes(),\n    text: new TextEffects(),\n    loadImages: new LoadImages(),\n    formTooltip: new FormTooltip(),\n    formError: new FormError()\n  };\n\n  $('.menu-bacon').toggleClass('menu-sausage', Math.random() > 0.5);\n\n  $('body').addClass('ready');\n\n  $(window).on('vsc-page-changed', function() {\n    Site.modules.init();\n    Site.parallax.init();\n    Site.scroll.init();\n    Site.shapes.init();\n    Site.text.init();\n    Site.loadImages.init();\n    Site.formTooltip.init();\n  });\n\n  $(window).trigger('vsc-page-ready');\n\n  var isAtLeastIE11 = !!(navigator.userAgent.match(/Trident/) && !navigator.userAgent.match(/MSIE/));\n\n  if (isAtLeastIE11) {\n    $('html').addClass('ie');\n  }\n\n})();\n","/*global jQuery */\n/*!\n* FitText.js 1.2\n*\n* Copyright 2011, Dave Rupert http://daverupert.com\n* Released under the WTFPL license\n* http://sam.zoy.org/wtfpl/\n*\n* Date: Thu May 05 14:23:00 2011 -0600\n*/\n\n(function( $ ){\n\n  $.fn.fitText = function( kompressor, options ) {\n\n    // Setup options\n    var compressor = kompressor || 1,\n        settings = $.extend({\n          'minFontSize' : Number.NEGATIVE_INFINITY,\n          'maxFontSize' : Number.POSITIVE_INFINITY\n        }, options);\n\n    return this.each(function(){\n\n      // Store the object\n      var $this = $(this);\n\n      // Resizer() resizes items based on the object width divided by the compressor * 10\n      var resizer = function () {\n        $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize)));\n      };\n\n      // Call once to set.\n      resizer();\n\n      // Call on resize. Opera debounces their resize by default.\n      $(window).on('resize.fittext orientationchange.fittext', resizer);\n\n    });\n\n  };\n\n})( jQuery );","/**\n *  vein.js - version 0.3\n *\n *  by Danny Povolotski (dannypovolotski@gmail.com)\n **/\n\n!function (name, definition) {\n    if (typeof module != 'undefined') module.exports = definition()\n    else if (typeof define == 'function' && define.amd) define(name, definition)\n    else this[name] = definition()\n}('vein', function () {\n    var vein = function(){};\n\n    // Kudos to: http://youmightnotneedjquery.com/\n    var extend = function(out) {\n      out = out || {};\n\n      for (var i = 1; i < arguments.length; i++) {\n        if (!arguments[i])\n          continue;\n\n        for (var key in arguments[i]) {\n          if (arguments[i].hasOwnProperty(key))\n            out[key] = arguments[i][key];\n        }\n      }\n\n      return out;\n    };\n\n    var findOrDeleteBySelector = function(selector, stylesheet, css){\n        var matches = [],\n            rules = stylesheet[ document.all ? 'rules' : 'cssRules' ],\n            selectorCompare = selector.replace(/\\s/g,''),\n            ri, rl;\n\n        // Since there could theoretically be multiple versions of the same rule,\n        // we will first iterate\n        for(ri = 0, rl = rules.length; ri < rl; ri++) {\n            if(\n                // regular style selector\n                (rules[ri].selectorText === selector)   ||\n                // for media queries, remove spaces and see if the query matches\n                (rules[ri].type === 4 && rules[ri].cssText.replace(/\\s/g,'').substring(0, selectorCompare.length) == selectorCompare)\n            ) {\n                if(css === null) {\n                    // If we set css to null, let's delete that ruleset altogether\n                    stylesheet.deleteRule(ri);\n                }\n                else {\n                    // Otherwise - we push it into the matches array\n                    matches.push(rules[ri]);\n                }\n            }\n        }\n\n        return matches;\n    };\n\n    var cssToString = function(css){\n        var cssArray = [];\n\n        for(var property in css) {\n            if (css.hasOwnProperty(property)) {\n                cssArray.push(property + ': ' + css[property] + ';');\n            }\n        }\n        var cssText = cssArray.join('');\n        return cssText;\n    };\n\n    // Get the stylesheet we use to inject stuff or create it if it doesn't exist yet\n    vein.getStylesheet = function() {\n        var self = this,\n            si, sl;\n\n        if(!self.element || !document.getElementById('vein')) {\n            self.element = document.createElement(\"style\");\n            self.element.setAttribute('type', 'text/css');\n            self.element.setAttribute('id', 'vein');\n            document.getElementsByTagName(\"head\")[0].appendChild(self.element);\n\n            self.stylesheet = self.element.sheet;\n        }\n\n        return self.stylesheet;\n    };\n\n    var getRulesFromStylesheet = function(stylesheet){\n        return stylesheet[ document.all ? 'rules' : 'cssRules' ];\n    }\n\n    var insertRule = function(selector, cssText, stylesheet){\n        var rules = getRulesFromStylesheet(stylesheet);\n\n        if(stylesheet.insertRule) {\n            // Supported by all modern browsers\n            try{\n                stylesheet.insertRule(selector + '{' + cssText + '}',rules.length);\n            } catch(e){\n                if (e.message === \"IndexSizeError\") stylesheet.insertRule(selector + '{' + cssText + '}',0);\n            }\n        } else {\n            // Old IE compatability\n            stylesheet.addRule(selector, cssText, rules.length);\n        }\n    };\n\n    // Let's inject some CSS. We can supply an array (or string) of selectors, and an object\n    // with CSS value and property pairs.\n    vein.inject = function(selectors, css, options) {\n        options = extend({}, options);\n\n        var self        =   this,\n            stylesheet  =   options.stylesheet || self.getStylesheet(),\n            rules       =   getRulesFromStylesheet(stylesheet),\n            si, sl, query, matches, cssText, property, mi, ml, qi, ql;\n\n        if(typeof selectors === 'string') {\n            selectors = [selectors];\n        }\n\n        for(si = 0, sl = selectors.length; si < sl; si++) {\n            if(typeof selectors[si] === 'object' && stylesheet.insertRule){\n                for(query in selectors[si]) {\n                    matches = findOrDeleteBySelector(query, stylesheet, css);\n\n                    if(matches.length === 0){\n                        cssText = cssToString(css);\n                        for(qi = 0, ql = selectors[si][query].length; qi < ql; qi++) {\n                            insertRule(query, selectors[si][query][qi] + '{' + cssText + '}', stylesheet);\n                        }\n                    } else {\n                        for(mi = 0, ml = matches.length; mi < ml; mi++) {\n                            self.inject(selectors[si][query], css, {stylesheet: matches[mi]});\n                        }\n                    }\n                }\n            } else {\n                matches = findOrDeleteBySelector(selectors[si], stylesheet, css);\n\n                // If all we wanted is to delete that ruleset, we're done here\n                if(css === null) return;\n\n                // If no rulesets have been found for the selector, we will create it below\n                if(matches.length === 0) {\n                    cssText = cssToString(css);\n                    insertRule(selectors[si], cssText, stylesheet);\n                }\n\n                // Otherwise, we're just going to modify the property\n                else {\n                    for(mi = 0, ml = matches.length; mi < ml; mi++) {\n                        for(property in css) {\n                            if (css.hasOwnProperty(property)) {\n                                // TODO: Implement priority\n                                if(matches[mi].style.setProperty) {\n                                    matches[mi].style.setProperty(property, css[property], '');\n                                } else {\n                                    //IE8\n                                    matches[mi].style.setAttribute(property, css[property], '');\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        return self;\n    };\n\n    return vein;\n});\n"]}