{"version":3,"sources":["../../node_modules/browser-pack/_prelude.js","../../modules/accordion/accordion.js","../../modules/addtocalendar/addtocalendar.js","../../modules/all-properties-map/all-properties-map.js","../../modules/card-filters/card-filters.js","../../modules/card-tabs/card-tabs.js","../../modules/cart/cart.js","../../modules/concierge/concierge.js","../../modules/contact-info/contact-info.js","../../modules/custom-filters/custom-filters.js","../../modules/date-picker/date-picker.js","../../modules/directory/directory.js","../../modules/event-filter/event-filter.js","../../modules/exp/exp.js","../../modules/favorite-row/favorite-row.js","../../modules/fields/fields.js","../../modules/filters/filters.js","../../modules/form/form.js","../../modules/gravity-form/gravity-form.js","../../modules/header/header.js","../../modules/hero-image/hero-image.js","../../modules/hero-slider/hero-slider.js","../../modules/intro/intro.js","../../modules/load-more-posts/load-more-posts.js","../../modules/load-more/load-more.js","../../modules/modal/modal.js","../../modules/movie-list/movie-list.js","../../modules/promo-popup/promo-popup.js","../../modules/queue/queue.js","../../modules/reserve/reserve.js","../../modules/rewards-form/rewards-form.js","../../modules/rsvp/rsvp.js","../../modules/search-form/search-form.js","../../modules/search-results/search-results.js","../../modules/select-field/select-field.js","../../modules/sidebar/sidebar.js","../../modules/subscribe/subscribe.js","../../modules/timer/timer.js","../../modules/truncate/truncate.js","../../modules/two-up-rows/two-up-rows.js","../../modules/video/video.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/get-size/get-size.js","../../node_modules/lodash.throttle/index.js","../../node_modules/shave/dist/shave.js","../../node_modules/svg-pan-zoom/src/browserify.js","../../node_modules/svg-pan-zoom/src/control-icons.js","../../node_modules/svg-pan-zoom/src/shadow-viewport.js","../../node_modules/svg-pan-zoom/src/svg-pan-zoom.js","../../node_modules/svg-pan-zoom/src/svg-utilities.js","../../node_modules/svg-pan-zoom/src/uniwheel.js","../../node_modules/svg-pan-zoom/src/utilities.js","../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","../../node_modules/unidragger/unidragger.js","../../node_modules/unipointer/unipointer.js","../../src/js/lib/init-modules.js","../../src/js/main.js"],"names":["Accordion","el","$","find","on","$parent","this","parent","$button","slideToggle","toggleClass","hasClass","attr","window","global","module","exports","AddToCalendar","t","activeClass","list","querySelector","toggle","link","querySelectorAll","addEventListener","activeEl","document","activeElement","documentElement","classList","console","log","parentNode","e","target","contains","remove","tabIndex","timeout","openPopup","clearTimeout","add","closePopup","setTimeout","relatedTarget","forEach","Map","$el","$pins","id","filter","type","CardFilters","selectFieldEl","selectFieldElMobile","selectFieldElCurrent","filterEl","selectComponent","SelectField","filtersComponent","Filters","innerHTML","selectedIndex","filterByValue","value","onChange","bind","require","CardTabs","cards","Array","prototype","slice","call","$mobileFilter","$currentFilter","$items","firstItem","val","text","selectedFilter","addClass","removeClass","elem","event","screen","width","preventDefault","form","closest","submit","Concierge","start","getAttribute","end","closeButton","init","closeModal","load","insertAfter","first","throttle","offsetTop","innerHeight","offset","pageYOffset","ContactInfo","mapContainer","mapLat","mapLng","styles","featureType","elementType","stylers","visibility","mapProp","center","google","maps","LatLng","zoom","mapTypeControl","map","setOptions","Marker","position","$posts","children","$maps","$cards","length","$activePost","$activeMap","$activeCard","activeFilter","filterPost","filterMap","filterCard","split","singleValue","$newMap","$newCard","formatDate","date","getMonth","getDate","getFullYear","DatePicker","settings","isOpen","isEventsBound","dayEl","Date","parseInt","TIMESTAMP_DATA","isDayOfWeek","dateObject","arrayOfWeekdays","indexOf","getDay","filterDates","context","dateClose","days","DAY_SELECTOR","DAY_CLASS","TinyDatePicker","NEXT_CLASS","PREV_CLASS","defaultSettings","format","toLocaleDateString","mode","min","lang","today","clear","close","onOpen","onSelectYear","onSelectMonth","disabled","parse","str","replace","isNaN","onOpenCallback","extend","datepicker","focus","key","which","keyCode","stopPropagation","open","current","selected","parentElement","removeChild","undefined","onClose","alreadyInit","getSelectedDate","selectedDate","Directory","panzoom","options","zoomEnabled","contain","fit","controlIconsEnabled","minZoom","maxZoom","beforePan","oldPan","newPan","currentZoom","getZoom","x","y","sizes","getSizes","rightLimit","bottomLimit","height","Math","max","getBoundingClientRect","style","svgPanZoom","zoomInButton","zoomOutButton","zoomIn","zoomOut","getPoint","pt","createSVGPoint","matrixTransform","getScreenCTM","inverse","keyboardHandlers","panBy","pz","svgIDs","item","push","svgGroups","group","setAttribute","getMonthName","EventFilter","dateLabel","currentPage","calendarTrigger","calendarToggle","calendar","month","getUTCMonth","day","returnDate","location","href","checkFilterDate","url","clickOutside","Exp","FavoriteRow","slider","childElementCount","Flickity","cellAlign","prevNextButtons","pageDots","wrapAround","arrowShape","x0","x1","y1","x2","y2","x3","Fields","formSelects","formListSelect","markupSelect","formNativeSelect","formOptionsSelect","formPlaceholder","placeholderField","i","outerHTML","mobile","getUrlParameter","name","regex","RegExp","results","exec","decodeURIComponent","category","$filters","$active","itemSelector","data","$subFilters","$category","selectFilter","eq","$target","$newTargets","trigger","revertDate","selectAll","selector","disableButton","button","DISABLE_CLASS","enableButton","Form","datePickers","forms","buttons","areFormsEnabled","reserveChangeCheckbox","rewardsFormSubmit","checkbox","checked","args","setSeconds","getSeconds","getTimezoneOffset","unavailable","inRange","dt","GravityForm","$gform_upload_custom","$description_elm","$rules_text_elm","hide","append","Header","headerHeight","$document","$body","$html","$main","$menu","$toggle","$menuItems","$allMenuItems","$activeMenuItems","$searchIcon","$searchCloseIcon","$window","onTop","$link","siblings","$this","hash","substring","openSubmenu","closeSubmenu","each","$index","$item","toggleSubmenu","last","is","has","$page","smoothScroll","element","getElementById","scrollIntoView","click","top","parseFloat","css","animate","scrollTop","toggleFixedHeader","condition","HeroImage","adaptiveHeight","setGallerySize","autoPlay","HeroSlider","slides","videos","flickity","resize","ready","sideLinks","viewport","sideSelectedLink","dots","dot","createElement","buttonText","replaceAll","className","removeAttribute","appendChild","change","index","setHeights","playVideo","removeAttr","reset","cell","maxCellHeight","innerWidth","play","video","pause","Intro","urlFull","checkURLRedirect","includes","$secondaryBrandElm","LoadMorePosts","pageNumber","$loadMoreButton","$excludePost","$list","loadPosts","wp","ajax","dataType","ajaxUrl","excludePost","action","success","html","fadeIn","hasNextPage","error","LoadMore","filterClass","$allItems","update","showItems","PER_PAGE","count","$nextElement","prevObject","not","fadeOut","Modal","triggerSelector","MovieList","$size","size","$start","$loadMore","currentSlide","ceil","slideBreakpoint","groupCells","prevButton","insertBefore","select","PromoPopup","SHOW_POPUP","POPUP_OPEN_TIME","checkPopupClosed","localStorage","getItem","closePromoPopup","setItem","now","visibleTime","dataLayer","promo_popup_visible_time","popupOverlayElm","buttonClosePopup","email","res","result","first_name","last_name","wait_time","xhr","JSON","responseText","$queueModal","message","async","yyyy","toString","mm","dd","Reserve","dateOpen","dataInterval","isResy","input","HOUR_IN_MINS","generateTimeList","selectEls","selectEl","timeSelectComponent","updateTimePicker","datePickerOptions","Object","assign","datePicker","changeTimeRange","time","timeStart","convertTime","timeEnd","intervals","timeRange","getTimeRange","items","string","arr","parseTime","number","hour","floor","minute","interval","range","getMatchingTimeRange","dayIndex","generateSelectFieldDropdown","generateSelectFieldNative","desktopList","mobileList","timeField","selectFirstItem","RewardsRegister","dateField","timeSelect","timeFieldSelect","timeFieldName","populateTimeField","keys","slots","slot","generateFieldData","generateBlankFields","markup","populateMobileFields","populateDesktopFields","destroy","fieldMobile","opt","textContent","required","RSVP","body","content","activeButton","overlay","SearchForm","$closeIcon","$input","SearchResults","resultsEmpty","resultsList","buttonDidYouMean","searchBottom","searchHeader","searchFavoriteGroup","cardSimple","search_message","show","fieldDesktop","fieldCurrent","isRedirect","onClickActive","isActive","activeItem","onSelectDesktop","removeSelectActive","callback","onSelectMobile","currentItem","onClickOutside","hasAttribute","$activeItem","$prevItem","$nextItem","$dropdown","apply","prev","outerHeight","next","dropdownItems","activeState","selectDesktop","selectMobile","keyboardAccessible","getName","selectedItem","otherItem","removeEventListener","off","Sidebar","URL","searchParams","get","main","Subscribe","formEl","msgEl","inputEmail","inputFirstName","inputLastName","thankYouPage","dataset","validity","typeMismatch","valueMissing","reportValidity","headers","Content-Type","contentType","serialize","code","Timer","$timer","TIMER_SELECTOR","expire","setInterval","remaining","seconds","minutes","clearInterval","Truncate","maxHeight","shave","TwoUpRows","inViewPort","rect","Video","$videoInner","$video","$modal","$iconClose","$overlayClose","openModal","factory","define","amd","matchesSelector","matchesMethod","ElemProto","Element","matches","prefixes","prefix","method","EvEmitter","proto","eventName","listener","events","_events","listeners","once","onceEvents","_onceEvents","splice","emitEvent","onceListeners","allOff","fizzyUIUtils","utils","a","b","prop","modulo","num","div","arraySlice","makeArray","obj","isArray","removeFrom","ary","getParent","getQueryElement","handleEvent","filterFindElements","elems","ffElems","HTMLElement","childElems","debounceMethod","_class","methodName","threshold","timeoutName","arguments","_this","docReady","readyState","toDashed","match","$1","$2","toLowerCase","htmlInit","WidgetClass","namespace","dashedNamespace","dataAttr","dataAttrElems","jsDashElems","concat","dataOptionsAttr","jQuery","instance","getCellsFragment","cells","fragment","createDocumentFragment","insert","_makeCells","len","isAppend","insertCellElement","endCells","_sizeCells","cellChange","prepend","getCells","minCellIndex","cellSizeChange","getCell","getSize","changedCellIndex","isPositioningSlider","prevSelectedElem","selectedElement","_positionCells","_getWrapShiftCells","getCellSlideIndex","positionSliderAtSelected","animatePrototype","startAnimation","isAnimating","restingFrames","applyDragForce","applySelectedAttraction","previousX","integratePhysics","positionSlider","settle","requestAnimationFrame","slideableWidth","shiftWrapCells","setTranslateX","dispatchScrollEvent","is3d","cursorPosition","rightToLeft","translateX","getPositionValue","transform","firstSlide","positionX","progress","slidesWidth","dispatchEvent","selectedSlide","velocity","percentPosition","round","isPointerDown","isFreeScrolling","beforeGap","_shiftCells","beforeShiftCells","afterGap","afterShiftCells","gap","shift","cellShift","wrapShift","outerWidth","_unshiftCells","getFrictionFactor","applyForce","force","getRestingPosition","isDraggable","dragVelocity","dragX","dragForce","distance","selectedAttraction","Cell","create","unselect","side","originSide","setPosition","updateTarget","renderPosition","setDefaultTarget","marginProperty","Unidragger","getScrollPosition","pageXOffset","defaults","draggable","dragThreshold","createMethods","_touchActionValue","isTouch","isTouchmoveScrollCanceled","_createDrag","onActivateDrag","_uiChangeDrag","onDeactivateDrag","updateDraggable","handles","bindHandles","unbindHandles","bindDrag","unbindDrag","pointerDown","pointer","_pointerDownDefault","okayPointerDown","_pointerDownPreventDefault","pointerDownFocus","pointerDownBlur","pointerDownScroll","pointerDownPointer","pageX","pageY","_bindPostStartEvents","focusNodes","INPUT","TEXTAREA","SELECT","nodeName","isTouchStart","isTouchPointer","pointerType","isFocusNode","hasDragStarted","moveVector","abs","pointerUp","isTouchScrolling","_dragPointerUp","pointerDone","dragStart","dragStartPosition","pointerMove","_dragPointerMove","_dragMove","dragMove","previousDragX","direction","originBound","endBound","getLastSlide","dragMoveTime","dragEnd","freeScroll","dragEndRestingSelect","restingX","dragEndBoostSelect","isDragSelect","getSlideDistance","positiveResting","_getClosestResting","negativeResting","increment","minDistance","Infinity","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","constructor","_create","getComputedStyle","GUID","accessibility","freeScrollFriction","friction","namespaceJQueryEvents","guid","_createSlider","watchCSS","activate","opts","_filterFindCellElements","reloadCells","selectInitialIndex","isInitActivated","cellSelector","positionCells","getLastCell","cellX","startCell","updateSlides","_containSlides","isOriginLeft","nextMargin","canCellFit","_getCanCellFit","addCell","slideWidth","firstMargin","updateSelectedSlide","percentMatch","percent","_init","reposition","setCellAlign","cellAlignShorthands","left","right","shorthand","gapX","_getGapCells","isRightToLeft","beginMargin","endMargin","contentWidth","isContentSmaller","beginBound","emitArgs","$event","jQEvent","Event","isWrap","isInstant","_wrapSelect","prevIndex","wrapIndex","backWrapDelta","forewardWrapDelta","previous","unselectSelectedSlide","selectedCells","selectedElements","getCellElements","selectedCell","initialIndex","queryCell","selectCell","getAdjacentCellElements","adjCount","cellElems","uiChange","childUIPointerDown","onresize","deactivate","onkeydown","isNotFocused","handler","37","leftMethod","39","rightMethod","prevScrollY","preventScroll","scrollTo","removeData","bridget","setJQuery","jq","getCellLazyImages","lazyloadAttr","srcAttr","srcsetAttr","imgs","LazyLoader","img","_createLazyload","lazyLoad","lazyImages","lazyCellImages","src","srcset","onload","complete","onerror","Unipointer","PageDots","holder","handleClick","onClick","setDots","bindStartEvent","unbindStartEvent","addDots","removeDots","newDots","updateSelected","selectedDot","onTap","_createPageDots","activatePageDots","updateSelectedPageDots","updatePageDots","deactivatePageDots","Player","state","onVisibilityChange","visibilityChange","onVisibilityPlay","visibilityPlay","hidden","tick","stop","unpause","pauseAutoPlayOnHover","_createPlayer","player","activatePlayer","stopPlayer","deactivatePlayer","playPlayer","pausePlayer","unpausePlayer","onmouseenter","onmouseleave","PrevNextButton","getArrowMovements","shape","svgURI","isEnabled","isPrevious","leftDirection","isLeft","disable","svg","createSVG","createElementNS","path","pathMovements","onclick","enable","lastIndex","boundIndex","_createPrevNextButtons","nextButton","activatePrevNextButtons","deactivatePrevNextButtons","lastCell","lastMargin","getStyleSize","noop","getZeroSize","measurementsLength","measurements","getStyle","logError","setup","isSetup","padding","borderStyle","borderWidth","boxSizing","isBoxSizeOuter","nodeType","display","offsetWidth","offsetHeight","isBorderBox","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingTop","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","debounce","func","wait","invokeFunc","lastArgs","thisArg","lastThis","lastInvokeTime","leadingEdge","timerId","timerExpired","leading","remainingWait","timeSinceLastCall","lastCallTime","timeSinceLastInvoke","maxing","nativeMin","maxWait","shouldInvoke","trailingEdge","trailing","cancel","flush","debounced","isInvoking","TypeError","FUNC_ERROR_TEXT","toNumber","isObject","nativeMax","isObjectLike","isSymbol","objectToString","symbolTag","NAN","other","valueOf","reTrim","isBinary","reIsBinary","test","reIsOctal","freeParseInt","reIsBadHex","freeGlobal","freeSelf","self","root","Function","objectProto","Error","els","character","classname","spaces","charHtml","span","textProp","fullText","words","heightStyle","maxHeightStyle","pivot","join","insertAdjacentHTML","diff","shavedText","createTextNode","elWithShavedText","insertAdjacentElement","SvgPanZoom","SvgUtils","defs","svgNS","zoomGroup","_createZoomIn","_createZoomReset","_createZoomOut","controlIcons","getPublicInstance","zoomInBackground","zoomInShape","resetPanZoomControl","resetPanZoomControlBackground","resetPanZoomControlShape1","resetPanZoomControlShape2","zoomOutBackground","zoomOutShape","Utils","ShadowViewport","originalState","updateCTMCached","proxy","updateCTM","createRequestAnimationFrame","refreshRate","viewBox","cacheViewBox","newCTM","processCTM","setCTM","svgViewBox","viewBoxValues","v","updateCTMOnNextFrame","simpleViewBoxCache","bBox","getBBox","getViewBox","getCTM","newScale","f","offsetX","offsetY","getOriginalState","getState","getRelativeZoom","computeRelativeZoom","scale","getPan","safeCTM","createSVGMatrix","c","willZoom","isZoomDifferent","willPan","isPanDifferent","beforeZoom","updateCache","onZoom","preventPan","preventPanX","preventPanY","isNumber","onPan","pendingUpdate","ctm","onUpdatedCTM","Wheel","ControlIcons","optionsDefaults","viewportSelector","panEnabled","dblClickZoomEnabled","mouseWheelZoomEnabled","preventMouseEventsDefault","zoomScaleSensitivity","customEventsHandler","eventsListenerElement","passiveListenerOption","passive","that","setupSvgAttributes","boundingClientRectNormalized","getBoundingClientRectNormalized","getOrCreateViewport","oldScale","oldPoint","newPoint","point","publicInstance","setBeforeZoom","setOnZoom","setBeforePan","setOnPan","setOnUpdatedCTM","lastMouseWheelEventTime","setupHandlers","prevEvt","eventListeners","mousedown","evt","handleMouseDown","touchstart","mouseup","handleMouseUp","touchend","mousemove","handleMouseMove","touchmove","mouseleave","touchleave","touchcancel","svgElement","haltEventListeners","hasOwnProperty","enableMouseWheelZoom","wheelListener","handleMouseWheel","isPassiveListener","disableMouseWheelZoom","returnValue","deltaY","timeDelta","divider","deltaMode","wheelDelta","inversedScreenCTM","relativeMousePoint","getEventPoint","pow","zoomAtPoint","zoomScale","zoomAbsolute","oldCTM","relativePoint","modifier","translate","multiply","absolute","getSvgCenterPoint","publicZoom","computeFromRelativeZoom","publicZoomAtPoint","getType","resetZoom","resetPan","pan","handleDblClick","zoomFactor","shiftKey","mouseAndTouchNormalize","isDblClick","firstEventCTM","stateOrigin","viewportCTM","updateBBox","disableControlIcons","enableControlIcons","instancesStore","pi","enablePan","disablePan","isPanEnabled","fn","enableZoom","disableZoom","isZoomEnabled","isControlIconsEnabled","enableDblClickZoom","disableDblClickZoom","isDblClickZoomEnabled","isMouseWheelZoomEnabled","setZoomScaleSensitivity","setMinZoom","setMaxZoom","zoomBy","zoomAtPointBy","realZoom","elementOrSelector","getSvg","_browser","documentMode","xmlNS","xmlnsNS","xlinkNS","evNS","clientWidth","clientHeight","isElement","childNodes","viewportId","toISOString","svgChildren","classNames","setAttributeNS","internetExplorerRedisplayInterval","refreshDefsGlobal","allDefs","allDefsCount","thisDefs","matrix","s","clientX","clientY","createCallback","originalEvent","srcElement","deltaX","delatZ","support","wheelDeltaX","detail","fns","getCallback","removeCallback","_addWheelListener","cb","_addEventListener","passiveOption","_removeWheelListener","_removeEventListener","addWheelListener","removeWheelListener","onmousewheel","requestTimeout","source","o","SVGElement","SVGSVGElement","n","isFinite","String","tagName","contentDocument","getSVGDocument","touches","timeStampDiff","timeStamp","touchesDistance","sqrt","getTime","later","setHours","datesEq","date1","date2","toDateString","shiftDay","setDate","shiftMonth","dayOfMonth","setMonth","shiftYear","setFullYear","setYear","year","dateOrParse","dropTime","constrainDate","bufferFn","ms","cp","o1","o2","DatePickerOptions","english","makeInRangeFn","hilightedDate","dateClass","dp","render","dayNames","dayOffset","hilightedMonth","months","mapDays","isNotInMonth","isDisabled","isToday","keyDown","shiftBy","Key","up","down","esc","setState","selectToday","showMonthPicker","view","showYearPicker","gotoNextMonth","gotoPrevMonth","selectDay","currentDate","iter","onChooseMonth","render$1","currentMonth","keyDown$1","render$2","currentYear","selectedYear","mapYears","onChooseYear","keyDown$2","shiftedYear","BaseMode","emit","detatchInputEvents","closing","shouldFocusOnBlur","shouldFocusOnRender","updateInput","adjustPosition","containerHTML","attachToDom","CustomEvent","bubbles","simulated","computeSelectedDate","currentView","views","createContainerElement","attachContainerEvents","isVisible","hasFocus","focused","shouldHide","becauseOfBlur","focusInput","firstChild","hadFocus","focusCurrent","attachInputEvents","bufferShow","calEl","ontouchstart","enter","onKeyDown","navigator","userAgent","MSStream","blur","ModalMode","readonly","DropdownMode","defineProperty","autoPosition","inputPos","win","adjustCalY","adjustCalX","cal","scrollLeft","inputLeft","maxRight","calRight","shiftedLeft","inputTop","calHeight","belowTop","aboveTop","isAbove","PermanentMode","Mode","Emitter","onOne","handlers","onMany","arg","h","emitter","me","params","cancelable","createEvent","initCustomEvent","dayPicker","dp-day","dp-next","dp-prev","dp-today","dp-clear","dp-close","dp-cal-month","dp-cal-year","monthPicker","dp-month","yearPicker","dp-year","_bindHandles","isAdd","bindMethod","touchAction","handle","_bindStartEvent","PointerEvent","cursorNodes","OPTION","clickTypes","radio","image","file","isCursorNode","isClickType","isOkay","_pointerReset","isDragging","_dragStart","_dragEnd","_staticClick","isPreventingClicks","isIgnoringMouseUp","getPointerPoint","startEvent","getTouch","touch","identifier","pointerIdentifier","onmousedown","_pointerDown","changedTouches","onpointerdown","pointerId","postStartEvents","pointerdown","_boundPointerEvents","_unbindPostStartEvents","onmousemove","_pointerMove","onpointermove","ontouchmove","onmouseup","_pointerUp","onpointerup","ontouchend","onpointercancel","_pointerCancel","ontouchcancel","pointerCancel","initializeModules","modules","Module","mod"],"mappings":"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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i start && offset < end) {\n\t\t\t\tt.el.classList.add( t.activeClass );\n\t\t\t} else {\n\t\t\t\tt.el.classList.remove( t.activeClass );\n\t\t\t}\n\t\t}, 300));\n\t}\n};\n\nConcierge.prototype.closeModal = function() {\n\tvar t = this;\n\tt.el.classList.remove( t.activeClass );\n\tsetTimeout(function () {\n\t\tt.el.remove();\n\t},300);\n};\n\nmodule.exports = Concierge;\n","function ContactInfo(el) {\n var mapContainer = el.querySelector('[data-map]');\n if( mapContainer ) {\n var mapLat = mapContainer.getAttribute('data-lat'),\n mapLng = mapContainer.getAttribute('data-lng');\n if( mapLat && mapLng ) {\n var styles = [\n {\n featureType: \"poi.business\",\n elementType: \"labels\",\n stylers: [\n { visibility: \"off\" }\n ]\n }\n ];\n var mapProp = {\n center: new google.maps.LatLng(mapLat,mapLng),\n zoom: 15,\n mapTypeControl: false\n };\n var map = new google.maps.Map(mapContainer,mapProp);\n map.setOptions({styles: styles});\n var marker = new google.maps.Marker({\n position: new google.maps.LatLng(mapLat,mapLng),\n map: map,\n });\n }\n }\n}\n\nmodule.exports = ContactInfo;","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Filters(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$posts = $('.js-directory-post-filters').children();\n\tt.$maps = $('.js-directory-map-filters svg').children();\n\tt.$cards = $('.js-card-filters').children();\n\n\tif ( t.$posts.length ) {\n\t\tt.$activePost = t.$posts.filter('.directory__item--active');\n\t}\n\tif ( t.$maps.length ) {\n\t\tt.$activeMap = t.$maps.filter('js-active');\n\t}\n\n\tif ( t.$cards.length ) {\n\t\tt.$activeCard = t.$cards.filter('.small-card--active');\n\t}\n}\n\nFilters.prototype.filterByValue = function(value) {\n\tvar t = this;\n\n\tif( t.activeFilter == value ) {\n\t\treturn;\n\t}\n\n\tif( t.$posts.length ) {\n\t\tt.filterPost(value);\n\t}\n\n\tif( t.$maps.length ) {\n\t\tt.filterMap(value);\n\t}\n\n\tif( t.$cards.length ) {\n\t\tt.filterCard(value);\n\t}\n\n\tt.activeFilter = value;\n};\n\nFilters.prototype.filterPost = function(value) {\n\tvar t = this;\n\tt.$activePost.removeClass('directory__item--active');\n\tt.$posts.removeClass('directory__item--active')\n\tt.$activePost = $(value.split('|').map(function(singleValue) {\n\t\tvar $newPosts = t.$posts.filter( '[data-filter-type*=\"|' + singleValue + '|\"]' );\n\t\t$newPosts.addClass('directory__item--active');\n\t}));\n};\n\nFilters.prototype.filterMap = function(value) {\n\tvar t = this;\n\tt.$maps.removeClass('js-active');\n\tt.$activeMap = $(value.split('|').map(function(singleValue) {\n\t\tvar $newMap = t.$maps.filter( '[data-filter=\"' + singleValue + '\"]' );\n\t\t$newMap.addClass('js-active');\n\t\treturn $newMap;\n\t}));\n};\n\nFilters.prototype.filterCard = function(value) {\n\tvar t = this;\n\n\tif( value == 'all' ) {\n\t\tt.$el.addClass('card-filter-all');\n\t\tt.$cards.addClass('small-card--active');\n\t} else {\n\t\tt.$el.removeClass('card-filter-all');\n\t\tt.$cards.removeClass('small-card--active');\n\t\tt.$newCard = t.$cards.filter( '[data-filter-type*=\"|' + value + '|\"]' );\n\t\tt.$activeCard.removeClass('small-card--active');\n\t\tt.$newCard.addClass('small-card--active');\n\t\tt.$activeCard = t.$newCard;\n\t}\n};\n\nmodule.exports = Filters;\n","var TinyDatePicker = require('tiny-date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar NEXT_CLASS = 'dp-next',\n\tPREV_CLASS = 'dp-prev',\n\tDAY_CLASS = 'dp-day',\n\tDAY_SELECTOR = '.' + DAY_CLASS,\n\tTIMESTAMP_DATA = 'data-date';\n\nfunction formatDate(date) {\n\treturn (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();\n}\n\nfunction DatePicker(el, settings) {\n\tthis.el = el;\n\tthis.isOpen = false;\n\tthis.init(settings);\n\tthis.isEventsBound = false;\n}\n\nDatePicker.prototype.init = function(settings) {\n\tvar t = this,\n\t\tdefaultSettings = {\n\t\t\tformat: function (date) {\n\t\t\t\treturn date.toLocaleDateString();\n\t\t\t},\n\t\t\tmode: 'dp-below',\n\t\t\tmin: formatDate(new Date()),\n lang: {\n days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n today: '',\n clear: '',\n close: ''\n },\n\t\t\tonOpen: t.onOpen.bind(t),\n\t\t\tonSelectYear: t.filter.bind(t),\n\t\t\tonSelectMonth: t.filter.bind(t),\n\t\t\tdisabled: [],\n\t\t\tparse: function(str) {\n\t\t\t\tif (! str) {\n\t\t\t\t\treturn new Date();\n\t\t\t\t}\n\t\t\t\tvar date = new Date(str.replace('-', '/'));\n\t\t\t\treturn isNaN(date) ? new Date() : date;\n\t\t\t}\n\t\t};\n\n\tif (! settings) {\n\t\tsettings = {};\n\t}\n\n\tif (settings.onOpen) {\n\t\tsettings.onOpenCallback = settings.onOpen;\n\t\tsettings.onOpen = defaultSettings.onOpen;\n\t}\n\n\tt.settings = $.extend({}, defaultSettings, settings);\n\n\tt.datepicker = new TinyDatePicker(t.el, t.settings);\n\n\tt.datepicker.on('close', function() {\n t.isOpen = false;\n t.el.focus();\n });\n\n\tt.datepicker.on('open', function(context) {\n document.querySelector('.dp-current').focus();\n document.querySelector('.dp').addEventListener('keydown', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 13) {\n e.stopPropagation();\n e.preventDefault();\n } else if (key === 9) {\n e.stopPropagation();\n t.el.focus();\n }\n });\n\n t.isOpen = true;\n });\n\n\tt.el.addEventListener('keydown', function(e) {\n\t if (!t.isOpen) {\n var key = e.which || e.keyCode;\n\n if (key === 32) {\n t.datepicker.open();\n }\n }\n });\n\n\tt.el.addEventListener('change', function() {\n\t\tvar\n\t\t\tcurrent, selected,\n\t\t\tdate = new Date(t.el.value);\n\n\t\tif (isDayOfWeek(date, t.settings.disabled)) {\n\t\t\tcurrent = t.datepicker.el.querySelector('.dp-current');\n\t\t\tselected = t.datepicker.el.querySelector('.dp-selected');\n\t\t\tif (current) {\n\t\t\t\tcurrent.classList.remove('dp-current');\n\t\t\t}\n\t\t\tif (selected) {\n\t\t\t\tselected.classList.remove('dp-selected');\n\t\t\t}\n\t\t\tt.el.value = '';\n\t\t\tt.filter(t.datepicker);\n\t\t} else {\n\t\t\tt.close();\n\t\t}\n\n\t});\n};\n\nDatePicker.prototype.filter = function(context) {\n\tfilterDates(context, this.settings.disabled);\n};\n\nDatePicker.prototype.toggle = function () {\n\tif (this.datepicker.el) {\n\t\tthis.close();\n\t} else {\n\t\tthis.datepicker.open();\n\t}\n\tvar iconCalendar = document.querySelector('.js-calendar-toggle');\n\ticonCalendar.classList.toggle('card-tabs__calendar--active');\n};\n\nDatePicker.prototype.close = function () {\n\tvar el = this.datepicker.el;\n\tel && el.parentElement.removeChild(el);\n\tthis.datepicker.el = undefined;\n\tif (this.settings.onClose) {\n\t\tthis.settings.onClose();\n\t}\n};\n\nDatePicker.prototype.onOpen = function(context) {\n\tvar t = this;\n\tfilterDates(context, t.settings.disabled);\n\n\tif (t.isEventsBound) {\n\t\treturn;\n\t}\n\n\tcontext.el.addEventListener('click', function(e) {\n\t\tif (e.target.classList.contains(NEXT_CLASS) ||\n\t\t\te.target.classList.contains(PREV_CLASS)) {\n\t\t\tfilterDates(context, t.settings.disabled);\n\t\t}\n\t});\n\n\tcontext.el.addEventListener('keydown', function(e) {\n\t\tthis.filter(context);\n\t}.bind(t));\n\n\tt.alreadyInit = true;\n};\n\nDatePicker.prototype.getSelectedDate = function () {\n\treturn this.datepicker.selectedDate;\n};\n\nfunction getDate(dayEl) {\n\treturn new Date(parseInt(dayEl.getAttribute(TIMESTAMP_DATA)));\n}\n\nfunction isDayOfWeek(dateObject, arrayOfWeekdays) {\n\treturn arrayOfWeekdays.indexOf(dateObject.getDay()) !== -1;\n}\n\nfunction filterDates(context, dateClose) {\n\tvar days = Array.prototype.slice.call(context.el.querySelectorAll(DAY_SELECTOR));\n\tif( dateClose.length && days ) {\n\t\tvar closeDays = days.filter(function(dayEl) {\n\t\t\treturn isDayOfWeek(getDate(dayEl), dateClose);\n\t\t});\n\t\tcloseDays.forEach(function(dayEl) {\n\t\t\tdayEl.classList.add(DAY_CLASS + '-disabled');\n\t\t});\n\t}\n}\n\n\nmodule.exports = DatePicker;\n","var SelectField = require('modules/select-field');\nvar Filters = require('modules/custom-filters');\nvar svgPanZoom = require('svg-pan-zoom');\n\nfunction Directory(el) {\n\tvar t = this,\n\t\tselectFieldEl = el.querySelector('.js-directory-dropdown'),\n\t\tselectFieldElMobile = selectFieldEl.querySelector('[data-field-mobile]'),\n\t\tselectFieldElCurrent = selectFieldEl.querySelector('[data-field-current]'),\n\t\tselectComponent = new SelectField(selectFieldEl),\n\t\tfiltersComponent = new Filters(el);\n\n\tt.el = el;\n\tt.map = t.el.querySelector('.js-directory-map-filters svg');\n\tt.panzoom = null;\n\n\tif( t.map ) {\n\t\tvar options = {\n\t\t\tzoomEnabled: true,\n\t\t\tcontain: true,\n\t\t\tfit: true,\n\t\t\tcontrolIconsEnabled: false,\n\t\t\tminZoom: 1,\n\t\t\tmaxZoom: 10,\n\t\t\tbeforePan: function( oldPan, newPan ){\n\t\t\t\tvar currentZoom = t.panzoom.getZoom();\n\t\t\t\tif (currentZoom <= 1.00001) {\n\t\t\t\t\treturn {x: 0, y:0};\n\t\t\t\t}\n\n\t\t\t\tvar sizes = this.getSizes(),\n\t\t\t\t\tleftLimit = 0,\n\t\t\t\t\trightLimit = -(sizes.width * (currentZoom - 1)),\n\t\t\t\t\ttopLimit = 0,\n\t\t\t\t\tbottomLimit = -(sizes.height * (currentZoom - 1));\n\n\t\t\t\treturn {\n\t\t\t\t\tx: Math.min(leftLimit, Math.max(rightLimit, newPan.x)),\n\t\t\t\t\ty: Math.min(topLimit, Math.max(bottomLimit, newPan.y))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\theight = t.map.getBoundingClientRect().height;\n\n\t\tif( height ) {\n\t\t\tt.map.parentNode.style.height = height + 'px';\n\t\t}\n\t\tt.panzoom = svgPanZoom(t.map, options);\n\t\tt.zoomInButton = t.el.querySelector('[data-zoom-in]');\n\t\tt.zoomOutButton = t.el.querySelector('[data-zoom-out]');\n\n\t\tif( t.zoomInButton ) {\n\t\t\tt.zoomInButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomIn();\n\t\t\t});\n\t\t}\n\n\t\tif( t.zoomOutButton ) {\n\t\t\tt.zoomOutButton.addEventListener('click', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tt.panzoom.zoomOut();\n\t\t\t});\n\t\t}\n\n\t\t// move svg using arrow key.\n\t\tt.getPoint = function(x, y) {\n\t\t\tvar pt = t.map.createSVGPoint();\n\t\t\tpt.x = x;\n\t\t\tpt.y = y;\n\n\t\t\treturn pt.matrixTransform(t.map.getScreenCTM().inverse());\n\t\t};\n\n\t\tt.keyboardHandlers = function(e) {\n\t\t\tvar key = e.which || e.keyCode,\n\t\t\t\tstep = 15;\n\n\t\t\tif (key >= 37 && key <= 40) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\n\t\t\tswitch (key) {\n\t\t\t\tcase 37:\t// left\n\t\t\t\t\tt.panzoom.panBy({x: step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38:\t// up\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: step});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39:\t// right\n\t\t\t\t\tt.panzoom.panBy({x: -step, y: 0});\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 40:\t// down\n\t\t\t\t\tt.panzoom.panBy({x: 0, y: -step});\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tt.zoomInButton.addEventListener('keydown', t.keyboardHandlers);\n\t\tt.zoomOutButton.addEventListener('keydown', t.keyboardHandlers);\n\t}\n\n\twindow.pz = t.panzoom;\n\n\n\n\t// Generate array list for SVG groups\n\tif( selectFieldElMobile ) {\n\t\tt.list = Array.prototype.slice.call( selectFieldElMobile.children );\n\t\tt.svgIDs = [];\n\t\tt.list.forEach( function(item) {\n\t\t\tvar value = item.getAttribute('value');\n\t\t\tif( value ) {\n\t\t\t\tvalue.split('|').map(function(singleValue) {\n\t\t\t\t\tt.svgIDs.push(singleValue);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t// Check and append data filter to matching filter group\n\tif( t.svgIDs && t.map ) {\n\t\tt.svgGroups = Array.prototype.slice.call( t.map.querySelectorAll('g'));\n\t\tif( t.svgGroups ) {\n\t\t\tt.svgGroups.forEach( function(group) {\n\t\t\t\tvar id = group.getAttribute('id');\n\t\t\t\tif( t.svgIDs.indexOf(id) != -1) {\n\t\t\t\t\tgroup.setAttribute('data-filter', id);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tfiltersComponent.filterByValue(selectFieldElMobile.value);\n\tselectComponent.onChange(filtersComponent.filterByValue.bind(filtersComponent));\n}\nmodule.exports = Directory;\n","var DatePicker = require('modules/date-picker');\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getMonthName(date) {\n\tvar monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\treturn monthNames[date.getMonth()];\n}\n\nfunction formatDate(date) {\n\treturn getMonthName(date) + ' ' + date.getDate() + ', ' + date.getFullYear();\n}\n\nfunction EventFilter(el) {\n\tthis.el = el;\n\tthis.toggle = this.el.querySelector('.js-calendar-toggle');\n\tthis.event = Array.prototype.slice.call(this.el.querySelectorAll('[data-date-start]'));\n\tthis.selectedDate = this.el.querySelector('.js-selected-date');\n\tthis.dateLabel = this.el.querySelector('.js-today-date');\n\tthis.currentPage = 0;\n\n\tthis.calendarTrigger();\n\t// this.clickOutside();\n}\n\nEventFilter.prototype.calendarTrigger = function() {\n\tvar t = this;\n\tif ( t.toggle ) {\n\t\tt.calendarToggle();\n\t}\n};\n\nEventFilter.prototype.calendarToggle = function() {\n\tvar t = this;\n\n\tt.calendar = new DatePicker(t.selectedDate, {\n\t\tformat: function(selectedDate) {\n\t\t\treturn formatDate(selectedDate);\n\t\t}\n\t});\n\n\tt.selectedDate.addEventListener('change', function() {\n\t\tvar date = new Date(t.selectedDate.value),\n\t\t\tmonth = date.getUTCMonth() + 1,\n\t\t\tday = date.getDate();\n\n\t\tif (day < 10) {\n\t\t\tday = '0' + day;\n\t\t}\n\n\t\tif (month < 10) {\n\t\t\tmonth = '0' + month;\n\t\t}\n\t\tvar returnDate = month + '/' + day + '/' + date.getFullYear();\n\t\tlocation.href = '?date=' + returnDate;\n\t});\n\n\tt.toggle.addEventListener('click', t.calendar.toggle.bind(t.calendar));\n};\n\nEventFilter.prototype.checkFilterDate = function() {\n\tvar field = 'date',\n\t\turl = window.location.href;\n\tif( url.indexOf('?' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else if( url.indexOf('&' + field + '=') !== -1 ) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nEventFilter.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', function (e) {\n\t\tif ( e.target !== t.toggle.parentNode.querySelector('.dp-below') && e.target != t.calendar ) {\n\t\t\tt.calendar.close();\n\t\t\tt.toggle.classList.remove('card-tabs__calendar--active');\n\t\t}\n\t});\n};\nmodule.exports = EventFilter;\n","function Exp(el) {\n\tel.addEventListener('keyup', function(e) {\n\t\tif (e.keyCode !== 8 && e.keyCode !== 46 && el.value.indexOf('/') === -1 && el.value.length === 2) {\n\t\t\tel.value += '/';\n\t\t}\n\t})\n}\n\nmodule.exports = Exp;\n","var Flickity = require('flickity');\n\nfunction FavoriteRow(el) {\n\tvar t = this;\n\n\tt.slider = el.querySelector('[data-favorite-slider]');\n\tif ( t.slider && t.slider.childElementCount > 3 ) {\n\t\tvar slider = new Flickity( t.slider, {\n\t\t\tcellAlign: 'center',\n\t\t\tcontain: true,\n\t\t\tprevNextButtons: true,\n\t\t\tpageDots: false,\n\t\t\twrapAround: true,\n\t\t\tarrowShape: {\n\t\t\t\tx0: 10,\n\t\t\t\tx1: 55, y1: 50,\n\t\t\t\tx2: 55, y2: 45,\n\t\t\t\tx3: 15\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = FavoriteRow;\n","function Fields(el) {\n\tvar formSelects = Array.prototype.slice.call(el.querySelectorAll('.ginput_container_select'));\n\tif ( formSelects ) {\n\t\t// Create markup for select\n\t\tformSelects.forEach(function(elem) {\n\t\t\tvar formNativeSelect = elem.querySelector('select'),\n\t\t\t\tformOptionsSelect = formNativeSelect.querySelectorAll('option'),\n\t\t\t\tformPlaceholder = formNativeSelect.getAttribute('data-placeholder'),\n\t\t\t\tformListSelect,\n\t\t\t\tmarkupSelect,\n\t\t\t\tplaceholderField = '';\n\t\t\tformNativeSelect.setAttribute('data-field-mobile', '');\n\t\t\tformListSelect = '
';\n\t\t\tif( formPlaceholder ) {\n\t\t\t\tplaceholderField = '' + formPlaceholder + '';\n\t\t\t}\n\t\t\tmarkupSelect = '
' + placeholderField + '
' +\n\t\t\t\tformNativeSelect.outerHTML + '
' + formListSelect;\n\t\t\telem.innerHTML = markupSelect;\n\n\t\t\t// Select first item\n\t\t\tvar current = el.querySelector('[data-field-current]'),\n\t\t\t\t\tmobile = el.querySelector('[data-field-mobile]'),\n\t\t\t\t\tdesktop = el.querySelector('[data-field-desktop]');\n\n\t\t\tcurrent.innerHTML = mobile.querySelector('option').innerHTML;\n\t\t\tmobile.selectedIndex = 0;\n\t\t});\n\t}\n}\n\nmodule.exports = Fields;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction getUrlParameter(name) {\n\tname = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n\tvar regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n\tvar results = regex.exec(window.location.href);\n\treturn results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n}\n\nfunction Filters(el) {\n\tvar t = this,\n\t\t\tcategory = getUrlParameter('category');\n\tt.$el = $(el);\n\tt.$filters = t.$el.find('[data-filter]');\n\tt.$active = t.$filters.filter('.filters__item--active');\n\tt.activeFilter = null;\n\tt.itemSelector = t.$el.data('item-selector');\n\tt.$items = false;\n\n\tif (t.itemSelector) {\n\t\tt.$items = $(t.$el.data('item-selector'));\n\t\tt.$subFilters = t.$items.find('[data-filter]');\n\t}\n\n\tif ( category ) {\n\t\tt.$category = t.$el.find('[data-filter=\"'+ category + '\"]');\n\t\tt.selectFilter(t.$category);\n\t} else {\n\t\tt.selectFilter(t.$filters.eq(0));\n\t}\n\n\tt.$filters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n\t\tif ($target.hasClass('js-filters-button')) {\n\t\t $target = $target.closest('.js-filters-item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n\tt.$subFilters.on('click', function(e) {\n\t\tvar $target = $(e.target);\n\n if ($target.hasClass('filters_button')) {\n $target = $target.closest('.filters_item');\n }\n\n\t\tt.selectFilter($target);\n\t});\n\n}\n\nFilters.prototype.selectFilter = function ($target) {\n\tvar t = this,\n\t\tselectedFilter = $target.data('filter');\n\n\tif (selectedFilter == t.activeFilter) {\n\t\treturn;\n\t}\n\n\tt.$active.removeClass('filters__item--active');\n\t// Find other targets, if possible\n\tvar $newTargets = $('[data-filter=\"' + selectedFilter + '\"]');\n\tif( $newTargets.length ) {\n\t\t$newTargets.addClass('filters__item--active');\n\t}\n\n\tif ( t.$items ) {\n\t\tt.$items.removeClass( 'js-filter-visible' );\n\t\tt.$items.filter( '[data-filter-type*=\"|' + selectedFilter + '|\"]' ).addClass( 'js-filter-visible' );\n\t}\n\n\tt.activeFilter = selectedFilter;\n\tt.$active = $newTargets;\n\n\tt.$el.trigger('change');\n\n\n};\n\nmodule.exports = Filters;\n","var DatePicker = require('modules/date-picker');\nvar DISABLE_CLASS = 'button--disabled';\n\nfunction formatDate(date) {\n\tvar month = date.getMonth() + 1;\n\tif (month < 10) {\n\t\tmonth = '0' + month;\n\t}\n\treturn date.getFullYear() + '-' + month + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate();\n}\n\nfunction revertDate(date) {\n\treturn formatDate(date).replace(/-/g, '/');\n}\n\nfunction selectAll(selector, parent) {\n\treturn Array.prototype.slice.call(parent.querySelectorAll(selector));\n}\n\nfunction disableButton(button) {\n\tbutton.disabled = true;\n\tbutton.classList.add(DISABLE_CLASS);\n}\n\nfunction enableButton(button) {\n\tbutton.disabled = false;\n\tbutton.classList.remove(DISABLE_CLASS);\n}\n\nfunction Form(el) {\n\tvar t = this;\n\tvar datePickers = selectAll('.js-date-picker', el);\n\tvar forms = selectAll('form', el);\n\tvar buttons = selectAll('button, input[type=\"submit\"], a.button, .js-button', el);\n\tvar areFormsEnabled = true;\n\n\tvar reserveChangeCheckbox = selectAll('.js-reserve-change-checkbox', el);\n\tvar rewardsFormSubmit = selectAll('.js-rewards-form-submit', el);\n\tif (rewardsFormSubmit) {\n\t\trewardsFormSubmit.map(disableButton);\n\t}\n\n\tif (reserveChangeCheckbox) {\n\t\treserveChangeCheckbox.map(function (checkbox) {\n\t\t\tcheckbox.addEventListener('change', function(e) {\n\t\t\t\tif (e.target.checked) {\n\t\t\t\t\trewardsFormSubmit.map(enableButton);\n\t\t\t\t} else {\n\t\t\t\t\trewardsFormSubmit.map(disableButton);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tforms.map(function(form) {\n\t\tform.addEventListener('submit', function(e) {\n\t\t\tif (!areFormsEnabled) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tareFormsEnabled = false;\n\t\t\tbuttons.map(disableButton);\n\t\t});\n\t});\n\n\t// Enable Date Picker\n\tif( datePickers ) {\n\t\tdatePickers.forEach( function(elem) {\n\t\t\tvar args = {\n\t\t\t\tformat: formatDate\n\t\t\t};\n\t\t\tvar min = elem.getAttribute('data-min');\n\n\t\t\tif ( ! min ) {\n\t\t\t\tmin = new Date();\n\t\t\t\tvar offset = elem.getAttribute('data-offset') || 0;\n\t\t\t\tmin.setSeconds(min.getSeconds() + min.getTimezoneOffset() * 60 + parseInt(offset));\n\t\t\t\tmin = formatDate(min);\n\t\t\t} else {\n\t\t\t\tmin = min.replace('-', '/');\n\t\t\t}\n\t\t\targs.min = min;\n\t\t\targs.max = elem.getAttribute('data-max');\n\t\t\tif (args.max) {\n\t\t\t\targs.max = args.max.replace('-', '/');\n\t\t\t}\n\n\t\t\tvar unavailable = elem.getAttribute('data-unavailable');\n\n\t\t\tif (unavailable) {\n\t\t\t\tunavailable = unavailable.split(',');\n\t\t\t\targs.inRange = function(dt) {\n\t\t\t\t\treturn unavailable.indexOf(revertDate(dt)) === -1;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tt.calendar = new DatePicker(elem, args);\n });\n }\n}\n\nmodule.exports = Form;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction GravityForm(el) {\n\tvar $el = $(el);\n\tif ($el) {\n\t\tvar $gform_upload_custom = $el.find('.gform_upload_custom_rules');\n\t\tif ($gform_upload_custom) {\n\t\t\tvar $description_elm = $gform_upload_custom.find('div.gfield_description');\n\t\t\tvar $rules_text_elm = $gform_upload_custom.find('span.gform_fileupload_rules');\n\t\t\tif ($rules_text_elm && $description_elm && $description_elm.text() !== '') {\n\t\t\t\t$description_elm.hide();\n\t\t\t\t$rules_text_elm.append($description_elm.text());\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = GravityForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction Header(el) {\n\tvar t = this;\n\n\tt.$el = $(el);\n\tt.headerHeight = 60;\n\tt.$document = $(document);\n\tt.$body = $('body');\n\tt.$html = $('html');\n\tt.$main = $('.main');\n\tt.$menu = t.$el.find('.header__menu');\n\tt.$toggle = t.$el.find('.js-nav-trigger');\n\tt.$menuItems = t.$el.find('.menu-item-has-children > a');\n\tt.$allMenuItems = t.$el.find('.menu-item > a');\n\tt.$activeMenuItems = t.$el.find('.current-menu-item');\n\tt.$searchIcon = t.$el.find('.js-search-enable');\n\tt.$searchCloseIcon = $('.js-search-disable');\n\tt.$window = $(window);\n\n\t// Update fixed header\n\tt.onTop();\n\tt.$document.on('scroll', throttle(t.onTop.bind(t), 200));\n\n\t// Toggle menu active in mobile\n\tif( t.$toggle.length ) {\n\t\tt.$toggle.on('click', function() {\n\t\t\tt.$html.toggleClass('js-menu-active');\n\t\t});\n\t}\n\n\t// Enable dropdown menu\n\tif( t.$menuItems.length ) {\n\t\tt.$menuItems.on('click', function(e) {\n\t\t\tvar $link = $(this);\n\n\t\t\tif (t.$window.width() <= 768) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$link.parent().toggleClass('menu-item--open').siblings().removeClass('menu-item--open');\n\t\t\t}\n\t\t});\n\n\t\tt.$el.find('.menu-item-has-children ul li a').on('click', function() {\n\t\t\t$(this).closest('.menu-item-has-children').toggleClass('menu-item--open');\n\t\t\tvar $this = $(this),\n\t\t\thref = $this.attr('href'),\n\t\t\thash = href.substring(href.indexOf('#')+1);\n\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t$page[0].focus();\n\t\t});\n\n\t\t// Enable press space key to open submenu\n t.openSubmenu = function($parent) {\n var $link = $parent.find('> a');\n\n if ($parent.hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'true');\n $parent.addClass('menu-item--open');\n }\n };\n\n t.closeSubmenu = function($parent) {\n $parent.each(function($index, $item) {\n var $link = $($item).find('> a');\n if ($($item).hasClass('menu-item-has-children')) {\n $link.attr('aria-expanded', 'false');\n $($item).removeClass('menu-item--open');\n }\n });\n };\n\n t.toggleSubmenu = function($parent) {\n if ($parent.hasClass('menu-item--open')) {\n t.closeSubmenu($parent);\n } else {\n t.openSubmenu($parent);\n }\n };\n\n t.$allMenuItems.on('focus', function(e) {\n var $link = $(this);\n\n t.openSubmenu($link.parent());\n t.closeSubmenu($link.parent().siblings());\n });\n\n t.$allMenuItems.last().on('blur', function(e) {\n\t\t\tt.closeSubmenu(t.$el.find('.menu-item'));\n\t\t});\n\n $(document).on('click', function(e) {\n if (!t.$menu.is(e.target) && !t.$menu.has(e.target).length) {\n t.closeSubmenu(t.$el.find('.menu-item-has-children'));\n }\n });\n\t}\n\n\t// Remove active on same link if matching hash\n\tif( t.$activeMenuItems ) {\n\t\tvar link = t.$activeMenuItems.find('> a').attr('href'),\n\t\t\tchildren = t.$activeMenuItems.find('.menu-item a');\n\n\t\tif( link != undefined && children.length ) {\n\t\t\tchildren.each( function() {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\thref = $this.attr('href'),\n\t\t\t\t\thash = href.substring(href.indexOf('#')+1);\n\n\t\t\t\t// Add smooth scroll in current active page\n\t\t\t\tif( hash.length ) {\n\t\t\t\t\t$this.on('click', function(event) {\n\t\t\t\t\t\tvar $page = t.$main.find('[name=\"' + hash + '\"]');\n\t\t\t\t\t\tif( $page.length ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tt.smoothScroll($page);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Enable search\n\tif( t.$searchIcon.length ) {\n\t\tt.$searchIcon.on('click', function() {\n\t\t\tt.$html.addClass('js-search-active').trigger('searchActive');\n\t\t});\n\t}\n\n\tt.$html.on('searchInactive', function() {\n t.$searchIcon.focus();\n });\n\n\t// Find location hash and smooth scroll\n\tif( window.location.hash ) {\n\t\t// Fragment exists\n\t\tvar $target = t.$main.find('[name=\"' + window.location.hash.slice(1) + '\"]');\n\t\tif( $target.length ) {\n\t\t\t$(window).load(function() {\n\t\t\t\tt.smoothScroll($target);\n\t\t\t});\n\t\t}\n\t}\n\n\t$(window).on('load', function () {\n\t\tvar hash = window.location.hash;\n\t\tif (hash !== '') {\n\t\t\tsetTimeout(function () {\n\t\t\t\tvar id = hash.replace('#', '');\n\t\t\t\tvar element = document.getElementById(id);\n\t\t\t\tif (element && element.scrollIntoView) {\n\t\t\t\t\telement.scrollIntoView();\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t}\n\n\t\t$('.js-cancel-modal-trigger').click(function (e) {\n\t\t\t$(this).closest('form').submit(function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t});\n\n\t\t\tif (e.type === 'click') {\n\t\t\t\t$('.js-cancel-modal').addClass('js-active');\n\t\t\t}\n\t\t});\n\t});\n}\n\nHeader.prototype.smoothScroll = function(target) {\n\tvar t = this;\n\tvar offset = target.offset().top - parseFloat(t.$el.css('paddingTop')) - t.$menu.height() - 1;\n\t$('html, body').animate({\n\t\tscrollTop: offset\n\t}, 1000);\n\treturn false;\n};\n\nHeader.prototype.toggleFixedHeader = function(condition) {\n\tthis.$body.toggleClass('fixed-header', condition);\n};\n\nHeader.prototype.onTop = function() {\n\tvar t = this;\n\tt.toggleFixedHeader(t.$document.scrollTop() > t.$el.height());\n};\n\nmodule.exports = Header;\n","var Flickity = require('flickity');\n\nfunction HeroImage(el) {\n var t = this;\n\n t.slider = el.querySelector('.js-slider');\n\n if( t.slider && t.slider.childElementCount > 1 ) {\n var slider = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: true,\n prevNextButtons: false,\n pageDots: false,\n setGallerySize: true,\n autoPlay: 5000\n } );\n }\n\n}\n\nmodule.exports = HeroImage;","var Flickity = require('flickity');\nvar throttle = require('lodash.throttle');\n\nfunction HeroSlider(el) {\n var t = this;\n\n t.slider = el.querySelector('[data-slider]');\n t.slides = Array.prototype.slice.call(el.querySelectorAll('.hero-slider__item'));\n t.videos = Array.prototype.slice.call(el.querySelectorAll('.js-video'));\n\n if ( t.slider && t.slider.childElementCount > 1 ) {\n t.flickity = new Flickity( t.slider, {\n cellAlign: 'center',\n contain: true,\n adaptiveHeight: false,\n prevNextButtons: false,\n pageDots: true,\n\t\t\tresize: false,\n\t\t\t// Improve accessibility for slider\n\t\t\ton: {\n\t\t\t\tready: function() {\n\t\t\t\t\tconst sideLinks = this.viewport.querySelectorAll('.hero-slider__item a');\n\t\t\t\t\tconst sideSelectedLink = this.viewport.querySelector('.hero-slider__item.is-selected a');\n\t\t\t\t\tif (sideLinks.length > 0) {\n\t\t\t\t\t\tsideLinks.forEach(function(item) {\n\t\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (sideSelectedLink) {\n\t\t\t\t\t\tsideSelectedLink.setAttribute('tabindex', 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.pageDots.dots.forEach(function(dot) {\n\t\t\t\t\t\tvar button = document.createElement('button');\n\t\t\t\t\t\tvar buttonText = dot.getAttribute('aria-label').replaceAll('Page', 'Slide');\n\t\t\t\t\t\tbutton.setAttribute('aria-label', buttonText);\n\t\t\t\t\t\tbutton.className = 'dot-button';\n\t\t\t\t\t\tdot.removeAttribute('aria-label');\n\n\t\t\t\t\t\tdot.appendChild(button);\n\n\t\t\t\t\t\tdot.addEventListener('click', function(e) {\n\t\t\t\t\t\t\tdot.click();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tchange: function(index) {\n\t\t\t\t\tthis.viewport.querySelectorAll('.hero-slider__item a').forEach(function(item) {\n\t\t\t\t\t\titem.setAttribute('tabindex', -1);\n\t\t\t\t\t});\n\t\t\t\t\tthis.viewport.querySelector('.hero-slider__item.is-selected a').setAttribute('tabindex', 0);\n\t\t\t\t}\n\t\t\t}\n });\n\n t.setHeights();\n t.playVideo();\n\n window.addEventListener( 'resize', throttle(function() {\n \t\tt.setHeights(true);\n \t\tt.flickity.resize();\n \t\tt.setHeights();\n \t\tt.slider.removeAttr('tabindex');\n\t\t}, 100));\n\n\t\twindow.addEventListener( 'load', function () {\n\t\t\tt.slider.removeAttribute('tabindex');\n\t\t});\n }\n}\n\nHeroSlider.prototype.setHeights = function(reset) {\n\tvar t = this;\n\tt.slides.map( function( cell ) {\n\t\tif (reset) {\n\t\t\tcell.style.height = '';\n\t\t} else {\n\t\t\tcell.style.height = t.flickity.maxCellHeight + 'px';\n\t\t}\n\t} );\n};\n\nHeroSlider.prototype.playVideo = function() {\n\tvar t = this;\n\tif (t.videos.length && window.innerWidth >= 799) {\n\t if (typeof t.videos[0] !== 'undefined') {\n t.videos[0].play();\n }\n\n\t\tt.flickity.on( 'change', function() {\n\t\t\tt.videos.forEach( function(video) {\n\t\t\t\tvideo.pause();\n\t\t\t});\n\t\t\tt.videos[t.flickity.selectedIndex].play();\n\t\t});\n\t}\n};\n\nmodule.exports = HeroSlider;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Intro(el) {\n\tvar urlFull = window.location.href;\n\tvar checkURLRedirect = urlFull && urlFull.includes('#id=');\n\tif ($(el) && $(el).hasClass('intro--reservation') && checkURLRedirect) {\n\t\tvar $secondaryBrandElm = $(el).find('.intro__header');\n\t\tif ($secondaryBrandElm && $secondaryBrandElm.hasClass('intro__header')) {\n\t\t\t$secondaryBrandElm.removeClass('intro__header');\n\t\t}\n\t}\n}\n\nmodule.exports = Intro;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null),\n\twp = (typeof window !== \"undefined\" ? window['wpVars'] : typeof global !== \"undefined\" ? global['wpVars'] : null);\n\nfunction LoadMorePosts( el ) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.pageNumber = 1;\n\t// Collect data\n\tt.$loadMoreButton = t.$el.find('.js-load-more-toggle');\n\tt.$excludePost = t.$el.data('exclude-post');\n\tt.$list = t.$el.find('.js-load-post');\n\tif( t.$loadMoreButton ) {\n\t\tt.$loadMoreButton.on(\"click\", function( e ) {\n\t\t\te.preventDefault();\n\t\t\tt.$loadMoreButton.attr( \"disabled\", true );\n\t\t\tt.loadPosts();\n\t\t});\n\t}\n}\n\nLoadMorePosts.prototype.loadPosts = function() {\n\tvar t = this;\n\tt.pageNumber++;\n\t$.ajax({\n\t\ttype: \"POST\",\n\t\tdataType: \"json\",\n\t\turl: wp.ajaxUrl,\n\t\tdata: {\n\t\t\tpageNumber: t.pageNumber,\n\t\t\texcludePost: t.$excludePost,\n\t\t\taction: 'load_post_ajax'\n\t\t},\n\t\tsuccess: function( data ) {\n\t\t\tif (! data.html) {\n\t\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tt.$loadMoreButton.attr( \"disabled\", false );\n\t\t\tt.$list.append( data.html ).fadeIn( 300 );\n\t\t\tif (! data.hasNextPage) {\n\t\t\t\tt.$loadMoreButton.hide();\n\t\t\t}\n\t\t},\n\t\terror : function() {\n\t\t\tconsole.log( 'An error occurred while getting post items. Please try again or contact site administrator.' );\n\t\t}\n\t});\n\treturn false;\n};\n\nmodule.exports = LoadMorePosts;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nvar PER_PAGE = 5;\n\nfunction LoadMore(el) {\n\tvar itemSelector, filterClass, filterSelector,\n\t\tt = this;\n\n\tt.$el = $(el);\n\tt.currentPage = 0;\n\n\tt.filterClass = t.$el.data('filter-class');\n\titemSelector = t.$el.data('item-selector');\n\tt.$allItems = $(itemSelector);\n\n\tt.update();\n\n\tt.$filters = $(t.$el.data('filters-selector'));\n\n\tt.$el.on('click', t.showItems.bind(t));\n\n\tt.$filters.on('change', t.update.bind(t));\n}\n\nLoadMore.prototype.showItems = function (e) {\n\tvar count,\n\t\tt = this;\n\tt.currentPage ++;\n\tcount = t.currentPage * PER_PAGE;\n\tvar $nextElement = t.$items.slice(0, count).prevObject.not('.js-load-more-visible').first();\n\tt.$items.slice(0, count).addClass('js-load-more-visible');\n\tif (count < t.$items.length) {\n\t\tt.$el.fadeIn(300);\n\t} else {\n\t\tt.$el.fadeOut(300);\n\t}\n\n\tif (e && e.type) {\n\t if ($nextElement.length) {\n\t\t\tsetTimeout(function () {\n\t\t\t\t\t$nextElement.find('a')[0].focus();\n\t\t\t}, 400);\n\t }\n\t}\n\n\treturn count;\n};\n\nLoadMore.prototype.update = function () {\n\tvar t = this;\n\tif (t.$items) {\n\t\tt.$items.removeClass('js-load-more-visible');\n\t}\n\n\tt.$items = t.$allItems.filter('.' + t.filterClass);\n\tt.currentPage = 0;\n\tt.showItems();\n};\n\nmodule.exports = LoadMore;\n","function Modal(el) {\n\tvar trigger,\n\t\ttriggerSelector = el.getAttribute('data-modal-trigger');\n\n\tel.addEventListener('click', function(e) {\n\t\tif (e.target === el) {\n\t\t\tel.classList.remove('js-active');\n\t\t}\n\t});\n\n\t$('.js-close-modal').click(function () {\n\t\t$(this).closest('.modal').removeClass('js-active');\n\t});\n\n\tif (! triggerSelector) {\n\t\treturn;\n\t}\n\n\ttrigger = document.querySelector(triggerSelector);\n\ttrigger.addEventListener('click', function() {\n\t\tel.classList.add('js-active');\n\t});\n}\n\nmodule.exports = Modal;\n","var Flickity = require('flickity'),\n\t$ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction MovieList(el) {\n\tvar t = this,\n\t\t$el = $(el),\n\t\t$size = $el.find(\".movie-list__list .js-movie-item\").size(),\n\t\t$start = 5,\n\t\t$loadMore = $el.find('.js-load-more'),\n\t\tcurrentSlide = Math.ceil($el.find('.js-current-date').index() / 5) - 1;\n\n\tt.slider = el.querySelector('[data-slider]');\n\tt.slideBreakpoint = 768;\n\n\tvar slider = new Flickity(t.slider, {\n\t\tcellAlign: 'left',\n\t\tcontain: true,\n\t\tadaptiveHeight: true,\n\t\tprevNextButtons: true,\n\t\tpageDots: false,\n\t\tsetGallerySize: true,\n\t\tgroupCells: $(window).width() > t.slideBreakpoint ? 5 : 2,\n\t\t// Improve accessibility for slider\n\t\ton: {\n\t\t\tready: function() {\n\t\t\t\t$(this.prevButton.element).insertBefore(this.viewport);\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t},\n\t\t\tchange: function(index) {\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item a').attr('tabindex', '-1');\n\t\t\t\t$(this.viewport).find('.movie-list__nav-item.is-selected a').attr('tabindex', '0');\n\t\t\t}\n\t\t}\n\t});\n\n\tslider.select(currentSlide);\n\n\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t$loadMore.on('click', function () {\n\t\tif ($start + 5 < $size) {\n\t\t\t$start = $start + 5;\n\t\t} else {\n\t\t\t$start = $size;\n\t\t}\n\t\t$el.find('.movie-list__list .js-movie-item:lt(' + $start + ')').addClass('movie-item--show');\n\t\tif ( $start == $size ) {\n\t\t\t$loadMore.hide();\n\t\t}\n\t});\n\n\n}\n\nmodule.exports = MovieList;\n","function PromoPopup(el) {\n\t\tvar HIDDEN_CLASS = 'promo-popup__hidden';\n\t\tvar POPUP_OVERLAY_SELECTOR = '.js-promo-popup-overlay';\n\t\tvar BUTTON_CLOSE_POPUP_SELECTOR = '.js-promo-popup-close';\n\t\tvar SHOW_POPUP = false;\n\t\tvar POPUP_OPEN_TIME = null;\n\n\t\tvar checkPopupClosed = localStorage.getItem('closedPopup');\n\n\t\tif (checkPopupClosed) {\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t}\n\n\t\t// Delay 3 seconds because it's delayed in CSS\n\t\tsetTimeout(function () {\n\t\t\tSHOW_POPUP = checkPopupClosed === null;\n\t\t\tPOPUP_OPEN_TIME = new Date();\n\t\t}, 3000);\n\n\t\tvar closePromoPopup = function () {\n\t\t\tif (!SHOW_POPUP) { return false; }\n\t\t\t\tel.classList.add(HIDDEN_CLASS);\n\t\t\t\tlocalStorage.setItem('closedPopup', true);\n\t\t\t\tvar now = new Date();\n\t\t\t\tvar visibleTime = (now - POPUP_OPEN_TIME) / 1000;\n\t\t\t\tif (SHOW_POPUP && visibleTime) {\n\t\t\t\t\twindow.dataLayer = window.dataLayer || [];\n\t\t\t\t\twindow.dataLayer.push({'promo_popup_visible_time': visibleTime});\n\t\t\t\t}\n\t\t};\n\n\t\tvar popupOverlayElm = document.querySelector(POPUP_OVERLAY_SELECTOR);\n\n\t\tif (popupOverlayElm) {\n\t\t\t\tpopupOverlayElm.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n\t\tvar buttonClosePopup = document.querySelector(BUTTON_CLOSE_POPUP_SELECTOR);\n\t\tif (buttonClosePopup) {\n\t\t\t\tbuttonClosePopup.addEventListener('click', function () {\n\t\t\t\t\t\tclosePromoPopup();\n\t\t\t\t});\n\t\t}\n\n}\n\nmodule.exports = PromoPopup;\n","module.exports = function(el) {\n\tif (location.hash) {\n\t\tvar email = location.hash.replace('#', '');\n\t\treturn $.ajax({\n\t\t\ttype: 'GET',\n\t\t\turl: '/wp-json/crr/v1/queue/' + email,\n\t\t\tsuccess: function (res) {\n\t\t\t\tif (res && res.result) {\n\t\t\t\t\t$('body').addClass('is-queue');\n\t\t\t\t\t$('.js-email').text(email);\n\t\t\t\t\tif (res.result.first_name) {\n\t\t\t\t\t\t$('.js-first-name').text(res.result.first_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.last_name) {\n\t\t\t\t\t\t$('.js-last-name').text(res.result.last_name);\n\t\t\t\t\t}\n\t\t\t\t\tif (res.result.wait_time){\n\t\t\t\t\t\t$('.js-wait').text(res.result.wait_time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(xhr) {\n\t\t\t\ttry {\n\t\t\t\t\tvar res = JSON.parse(xhr.responseText),\n\t\t\t\t\t\t$queueModal = $('.js-queue-modal'),\n\t\t\t\t\t\thtml = $queueModal.html().replace('%%', res.message);\n\n\t\t\t\t\t$queueModal.html(html).addClass('js-active');\n\t\t\t\t} catch (e) {\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataType: 'json',\n\t\t\tasync: true\n\t\t});\n\t}\n};\n","var DatePicker = require('modules/date-picker');\nvar SelectField = require('modules/select-field');\n\nfunction formatDate (date) {\n\tvar yyyy = date.getFullYear().toString();\n\tvar mm = (date.getMonth() + 1).toString(); // getMonth() is zero-based\n\tvar dd = date.getDate().toString();\n\treturn yyyy + '-' + (mm[1] ? mm : '0' + mm[0]) + '-' + (dd[1] ? dd : '0' + dd[0]);\n}\n\nfunction Reserve(el) {\n var t = this,\n\t\t\tselectComponent;\n\n t.el = el;\n t.dateClose = JSON.parse( t.el.getAttribute('data-close') );\n t.dateOpen = JSON.parse( t.el.getAttribute('data-open') );\n t.dataInterval = t.el.getAttribute('data-intervals');\n t.isResy = t.el.getAttribute('data-resy');\n\tt.input = document.querySelector('[data-inputpicker]');\n\tt.alreadyInit = false;\n\tt.HOUR_IN_MINS = 60;\n\n\tif( !t.dataInterval ) {\n\t\tt.dataInterval = 0.5;\n\t} else {\n\t\tt.dataInterval = t.dataInterval;\n\t}\n\n\tif( t.dateOpen ) {\n\t\tt.generateTimeList();\n\t}\n\n\t// Update Select Field components\n\tvar selectEls = Array.prototype.slice.call( el.querySelectorAll('.js-reserve-field') );\n\tif( selectEls ) {\n\t\tselectEls.forEach( function(selectEl) {\n\t\t\tselectComponent = new SelectField( selectEl );\n\t\t\tif (selectEl.classList.contains('js-time-field')) {\n\t\t\t\tt.timeSelectComponent = selectComponent;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (t.input) {\n\t\tt.updateTimePicker();\n\t\tt.input.addEventListener('change', this.updateTimePicker.bind(this));\n\t\tvar datePickerOptions = {\n\t\t\t'disabled': t.dateClose ? t.dateClose : []\n\t\t};\n\t\tif (this.isResy) {\n\t\t\tdatePickerOptions = Object.assign({\n\t\t\t\tformat: function (date) {\n\t\t\t\t\treturn formatDate(date);\n\t\t\t\t},\n\t\t\t\tmin: formatDate(new Date()),\n\t\t\t}, datePickerOptions);\n\t\t}\n\n\t\tt.datePicker = new DatePicker(t.input, datePickerOptions);\n\t}\n}\n\nReserve.prototype.updateTimePicker = function () {\n\tvar t = this;\n\tvar date = new Date(t.input.value);\n\tif ( date ) {\n\t\tt.changeTimeRange( date.getDay() );\n\t}\n};\n\nReserve.prototype.generateTimeList = function() {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tvar time = t.dateOpen[i].time;\n\t\tif( time && time.start && time.end ) {\n\t\t\tvar timeStart = t.convertTime( time.start ),\n\t\t\t\ttimeEnd = t.convertTime( time.end ),\n\t\t\t\tintervals = parseFloat(t.dataInterval) * t.HOUR_IN_MINS;\n\n\t\t\tvar timeRange = t.getTimeRange(timeStart, timeEnd, intervals);\n\t\t\tt.dateOpen[i].items = timeRange;\n\t\t}\n\t}\n};\n\nReserve.prototype.convertTime = function(string) {\n\tvar t = this,\n\t\t\tarr = string.split(':'),\n\t\t\thour = parseInt(arr[0]) * t.HOUR_IN_MINS,\n\t\t\tminute = parseInt(arr[1]);\n\treturn hour + minute;\n};\n\nReserve.prototype.parseTime = function(number) {\n\tvar hour = Math.floor(number / 60),\n\t\t\toffset = 'am',\n\t\t\tminute = number % 60;\n\n\tif (hour % 12 === 0) {\n\t\toffset = hour / 12 === 1 ? 'pm' : 'am';\n\t\thour = 12;\n\t} else if (hour > 12) {\n\t\thour = hour % 12;\n\t\toffset = \"pm\";\n\t}\n\n\tif (hour < 10) {\n\t\thour = '0' + hour;\n\t}\n\n\tif (minute < 10) {\n\t\tminute = '0' + minute;\n\t}\n\n\treturn hour + ':' + minute + offset;\n};\n\nReserve.prototype.getTimeRange = function(start, end, interval) {\n\tvar t = this,\n\t\t\trange = [];\n\twhile( start <= end ) {\n\t\trange.push( t.parseTime(start) );\n\t\tstart += interval;\n\t}\n\treturn range;\n};\n\nReserve.prototype.getMatchingTimeRange = function(dayIndex) {\n\tvar t = this;\n\tfor( var i = 0; i < t.dateOpen.length; i++ ) {\n\t\tif( dayIndex === t.dateOpen[i].day ) {\n\t\t\treturn t.dateOpen[i].items;\n\t\t}\n\t}\n};\n\nReserve.prototype.generateSelectFieldDropdown = function(arr) {\n\tvar list = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\tlist += '
  • ' + arr[i] + '
  • ';\n\t}\n\treturn list ;\n};\n\nReserve.prototype.generateSelectFieldNative = function(arr) {\n\tvar options = '';\n\tfor( var i = 0; i < arr.length; i++ ) {\n\t\toptions += '';\n\t}\n\treturn options;\n};\n\nReserve.prototype.changeTimeRange = function(dayIndex) {\n\tvar t = this,\n\t\ttimeRange = t.getMatchingTimeRange( dayIndex),\n\t\tdesktopList = t.generateSelectFieldDropdown(timeRange),\n\t\tmobileList = t.generateSelectFieldNative(timeRange),\n\t\ttimeField = t.el.querySelector('.js-time-field');\n\n\tif( timeField && timeRange ) {\n\t\t// Append new time range\n\t\ttimeField.querySelector('[data-field-desktop]').innerHTML = desktopList;\n\t\ttimeField.querySelector('[data-field-mobile]').innerHTML = mobileList;\n\n\t\tt.timeSelectComponent.selectFirstItem();\n\t}\n};\n\nmodule.exports = Reserve;\n","var SelectField = require('modules/select-field');\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction RewardsRegister(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.dateField = t.el.querySelector('.js-date');\n\tt.timeSelect = null;\n\n\tif (! t.dateField) {\n\t\treturn;\n\t}\n\tt.timeField = t.el.querySelector('.js-time');\n\n\tif (! t.timeField) {\n\t\treturn;\n\t}\n\n\tt.timeFieldSelect = t.timeField.querySelector('[data-field-mobile]');\n\tt.timeFieldName = t.timeField.querySelector('[data-field-mobile]').name;\n\n\tt.populateTimeField();\n\n\tt.dateField.addEventListener('change', t.populateTimeField.bind(t));\n}\n\nRewardsRegister.prototype.populateTimeField = function () {\n\tvar t = this;\n\tvar date = t.dateField.value;\n\n\t$.ajax({\n\t\ttype: 'GET',\n\t\turl: '/wp-json/crr/v2/slots/' + date,\n\t\tsuccess: function(data) {\n\t\t\tt.timeField.innerHTML = '';\n\n\t\t\tif (data) {\n\t\t\t\tvar list = [];\n\t\t\t\tObject.keys(data.slots).map(function(time) {\n\t\t\t\t\tvar slot = data.slots[time];\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tvalue: time,\n\t\t\t\t\t\ttext: slot\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tt.generateFieldData( list, data.selected );\n\t\t\t}\n\t\t},\n\t\tdataType: 'json'\n\t});\n};\n\nRewardsRegister.prototype.generateBlankFields = function() {\n\tvar t = this;\n\tvar markup = document.createElement('div');\n\tmarkup.className = 'select-field';\n\tmarkup.innerHTML = '
    Time (Select date first)
    ';\n\tt.timeField.appendChild(markup);\n};\n\nRewardsRegister.prototype.generateFieldData = function( arr, selected ) {\n\tvar t = this;\n\n\tt.generateBlankFields();\n\tt.populateMobileFields( arr, t.timeField.querySelector('.select-field__mobile') );\n\tt.populateDesktopFields( arr, t.timeField.querySelector('.select-field__desktop') );\n\n\tvar selectFieldEl = t.timeField.querySelector('.select-field');\n\n\tif (t.timeSelect) {\n\t\tt.timeSelect.destroy();\n\t}\n\n\tt.timeSelect = new SelectField(selectFieldEl);\n\tif (selected) {\n\t\tt.timeSelect.fieldMobile.value = selected;\n\t}\n\n\tif (arr.length) {\n\t\tt.timeSelect.selectFirstItem();\n\t}\n};\n\nRewardsRegister.prototype.populateDesktopFields = function( arr, target) {\n\tvar t = this;\n\tvar list = document.createElement('ul');\n\tlist.className = 'caption c-secondary-brand select-field__dropdown';\n\tlist.setAttribute('data-field-desktop', '');\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('li');\n\t\topt.setAttribute('data-value', item.value);\n\t\topt.textContent = item.text;\n\t\topt.className = 'select-field__dropdown-item';\n\t\tlist.appendChild(opt);\n\t});\n\ttarget.appendChild(list);\n};\n\nRewardsRegister.prototype.populateMobileFields = function( arr, target ) {\n\tvar t = this;\n\tvar select = document.createElement('select');\n\tselect.className = 'caption c-secondary-brand js-field-mobile';\n\tselect.setAttribute('data-field-mobile', '');\n\tselect.name = t.timeFieldName;\n\tselect.required = true;\n\tarr.map( function( item ) {\n\t\tvar opt = document.createElement('option');\n\t\topt.value = item.value;\n\t\topt.textContent = item.text;\n\t\tselect.appendChild(opt);\n\n\t});\n\ttarget.appendChild( select );\n};\n\nmodule.exports = RewardsRegister;\n","function RSVP(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.body = document.body;\n\tt.content = el.querySelector('.js-rsvp-content');\n\tt.activeButton = document.querySelector('.js-rsvp-open');\n\tt.overlay = document.querySelector('.js-rsvp-overlay');\n\n\tif( t.activeButton ) {\n\t\tt.activeButton.addEventListener('click', function() {\n\t\t\tt.body.classList.add('js-rsvp-active');\n\t\t});\n\t}\n\n\tt.overlay.addEventListener('click', function() {\n\t\tt.body.classList.remove('js-rsvp-active');\n\t});\n\n}\nmodule.exports = RSVP;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar throttle = require('lodash.throttle');\n\nfunction SearchForm(el) {\n var t = this;\n\n t.$el = $(el);\n t.$document = $(document);\n t.$html = $('html');\n t.$closeIcon = t.$el.find('.js-search-disable');\n t.$input = t.$el.find('.js-search-form-input');\n\n // Focus to input if search form is active\n t.$html.on('searchActive', function() {\n t.$input.focus();\n });\n\n // Close modal on click to close icon or press escape\n t.$closeIcon.on('click', function() {\n t.close();\n });\n\n t.$document.on('keyup', function(e) {\n var key = e.which || e.keyCode;\n\n if (key === 27) {\n if (t.isOpen()) {\n t.close();\n e.stopPropagation();\n }\n }\n });\n\n\tvar search_message = $('.js-search-message');\n\n\tif (!search_message.length && $('.js-search-form')[0]) {\n\t\t$('.js-search-form')[0].focus();\n\t}\n}\n\nSearchForm.prototype.isOpen = function() {\n return this.$html.hasClass('js-search-active');\n};\n\nSearchForm.prototype.open = function() {\n this.$html.addClass('js-search-active').trigger('searchActive');\n};\n\nSearchForm.prototype.close = function() {\n this.$html.removeClass('js-search-active').trigger('searchInactive');\n};\n\nmodule.exports = SearchForm;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction SearchResults(el) {\n var $el = $(el);\n\n var resultsEmpty = $el.find('.js-search-results-empty');\n var resultsList = $el.find('.js-search-results-list');\n var buttonDidYouMean = $el.find('.js-did-you-mean');\n var searchBottom = $el.find('.js-search-bottom');\n\n var searchHeader = resultsList.find('.js-search-header');\n var searchFavoriteGroup = resultsList.find('.search-results__favorite-group');\n var cardSimple = resultsList.find('.card-simple');\n var search_message = $('.js-search-result');\n\n if (search_message.length && search_message[0]) {\n search_message[0].focus();\n }\n\n if (resultsList) {\n resultsEmpty.hide();\n }\n\n if (buttonDidYouMean.length > 0) {\n searchHeader.hide();\n searchBottom.hide();\n searchFavoriteGroup.hide();\n cardSimple.hide();\n resultsEmpty.show();\n }\n}\n\nmodule.exports = SearchResults;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar TinyDatePicker = require('tiny-date-picker');\n\nfunction SelectField(el) {\n\tvar t = this;\n\tt.el = el;\n\tt.$el = $(el);\n\tt.fieldMobile = t.el.querySelector('[data-field-mobile]');\n\tt.fieldDesktop = t.el.querySelector('[data-field-desktop]');\n\tt.fieldCurrent = t.el.querySelector('[data-field-current]');\n\tt.isRedirect = t.el.getAttribute('data-select-field-redirect');\n\n\tt.onClickActive = function () {\n\t\tif (!t.isActive()) {\n\t\t\tvar data = t.fieldMobile.value;\n\t\t\tvar activeItem = $(t.fieldDesktop).find('[data-value=\"' + data + '\"]');\n\t\t\t$(t.fieldDesktop).find('.select-field__dropdown-item').removeClass('active').removeAttr('id');\n\t\t\tactiveItem.addClass('active').attr('id', 'selected-option');\n\t\t}\n\n\t\tt.el.classList.toggle('select-field--active');\n\t};\n\n\tt.onSelectDesktop = function (e) {\n\t\tif (e.keyCode === 13 || !e.keyCode) {\n\t\t\tvar data = this.getAttribute('data-value');\n\t\t\tt.removeSelectActive();\n\t\t\tthis.classList.add('active');\n\t\t\tthis.setAttribute('id','selected-option');\n\t\t\tt.fieldCurrent.innerHTML = this.innerHTML;\n\t\t\tt.fieldMobile.value = data;\n\t\t\tif (t.callback) {\n\t\t\t\tt.callback(t.fieldMobile.value);\n\t\t\t}\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.onSelectMobile = function () {\n\t\tvar data = this.value,\n\t\t\tcurrentItem = t.fieldMobile.querySelector('[value=\"' + data + '\"]');\n\t\tt.fieldCurrent.innerHTML = currentItem.innerHTML;\n\t\tt.removeSelectActive();\n\t\tt.fieldDesktop.querySelector('[data-value=\"' + data + '\"]').classList.add('active');\n\t\tif (t.callback) {\n\t\t\tt.callback(t.fieldMobile.value);\n\t\t}\n\n\t\tif (t.isRedirect) {\n\t\t\tlocation.href = data;\n\t\t}\n\t};\n\n\tt.onClickOutside = function (e) {\n\t\tif (!e.target.hasAttribute('data-field-current') && e.target != t.fieldMobile || e.target != t.fieldCurrent && e.target != t.fieldMobile) {\n\t\t\tt.el.classList.remove('select-field--active');\n\t\t}\n\t};\n\n\tt.keyboardHandlers = function (e) {\n\t\tvar key = e.which || e.keyCode,\n\t\t\tactiveItem, $activeItem, $prevItem, $nextItem, $dropdown, index, add;\n\n\t\tswitch (key) {\n\t\t\tcase (32 || 13): // space\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\n\t\t\t\tbreak;\n\t\t\tcase 27: // escape\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 38: // up\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$prevItem = $activeItem.prev();\n\n\t\t\t\t\tif ($prevItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$prevItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($prevItem);\n\t\t\t\t\t\tadd = ($prevItem.outerHeight(true) - $prevItem.outerHeight()) / 2 * index;\n\n\t\t\t\t\t\tif ($dropdown.scrollTop() > $prevItem.position().top + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($prevItem.position().top + add);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase (40): // down\n\t\t\t\tif (!t.isActive()) {\n\t\t\t\t\tt.onClickActive();\n\t\t\t\t} else {\n\t\t\t\t\t$activeItem = t.$el.find('.select-field__dropdown-item.active');\n\t\t\t\t\t$nextItem = $activeItem.next();\n\n\t\t\t\t\tif ($nextItem.length) {\n\t\t\t\t\t\t$activeItem.removeClass('active').removeAttr('id');\n\t\t\t\t\t\t$nextItem.addClass('active').attr('id', 'selected-option');\n\n\t\t\t\t\t\t$dropdown = t.$el.find('.select-field__dropdown');\n\t\t\t\t\t\tindex = t.$el.find('.select-field__dropdown-item').index($nextItem);\n\t\t\t\t\t\tadd = ($nextItem.outerHeight(true) - $nextItem.outerHeight()) * index;\n\n\t\t\t\t\t\tif ($dropdown.height() < $nextItem.position().top + $nextItem.outerHeight(true) + add) {\n\t\t\t\t\t\t\t$dropdown.scrollTop($nextItem.position().top + $nextItem.outerHeight(true) + add - $dropdown.outerHeight(true));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase 13: // enter\n\t\t\t\tif (t.isActive()) {\n\t\t\t\t\tactiveItem = t.fieldDesktop.querySelector('.select-field__dropdown-item.active');\n\t\t\t\t\tt.onSelectDesktop.apply(activeItem);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tif (t.fieldMobile && t.fieldDesktop && t.fieldCurrent) {\n\t\tt.dropdownItems = Array.prototype.slice.call(t.fieldDesktop.querySelectorAll('li'));\n\t\t// If not placeholder then select first item\n\t\tif (t.fieldCurrent.innerHTML === '') {\n\t\t\tt.selectFirstItem();\n\t\t}\n\n\t\t// Add active state to field group\n\t\tt.activeState();\n\n\t\t// Close Drop down when click outside\n\t\tt.clickOutside();\n\n\t\t// If select on desktop\n\t\tt.selectDesktop();\n\n\t\t// If select on mobile\n\t\tt.selectMobile();\n\n\t\t// Keyboard accessibility\n\t\tt.keyboardAccessible();\n\t}\n}\n\nSelectField.prototype.getName = function() {\n\treturn this.fieldMobile.name;\n};\n\nSelectField.prototype.selectFirstItem = function() {\n\tvar t = this,\n\t\tselectedItem = t.fieldDesktop.querySelector('li:first-child');\n\n\tif (t.fieldMobile.value) {\n\t\tselectedItem = t.fieldDesktop.querySelector('li[data-value=\"' + t.fieldMobile.value + '\"]');\n\t} else if (selectedItem) {\n\t\tt.fieldMobile.value = selectedItem.getAttribute('data-value');\n\t}\n\n\tif (selectedItem) {\n\t\tt.fieldCurrent.innerHTML = selectedItem.innerHTML;\n\t}\n};\n\nSelectField.prototype.activeState = function() {\n\tvar t = this;\n\tt.fieldCurrent.addEventListener('click', t.onClickActive);\n};\n\nSelectField.prototype.selectDesktop = function() {\n\tvar t = this;\n\tt.$el.on('click keydown', '.select-field__dropdown-item', t.onSelectDesktop);\n};\n\nSelectField.prototype.selectMobile = function() {\n\tvar t = this;\n\tt.fieldMobile.addEventListener('change', t.onSelectMobile);\n};\n\nSelectField.prototype.removeSelectActive = function() {\n\tvar t = this;\n\tt.dropdownItems.forEach(function (otherItem) {\n\t\totherItem.classList.remove('active');\n\t\totherItem.removeAttribute('id');\n\t});\n};\n\nSelectField.prototype.clickOutside = function() {\n\tvar t = this;\n\tdocument.addEventListener('click', t.onClickOutside);\n};\n\nSelectField.prototype.onChange = function(callback) {\n\tthis.callback = callback;\n};\n\nSelectField.prototype.isActive = function() {\n\treturn this.$el.hasClass('select-field--active');\n};\n\nSelectField.prototype.keyboardAccessible = function() {\n\tthis.fieldCurrent.addEventListener('keydown', this.keyboardHandlers);\n};\n\nSelectField.prototype.destroy = function () {\n\tvar t = this;\n\tt.fieldCurrent.removeEventListener('click', t.onClickActive);\n\tt.$el.off('click', '.select-field__dropdown-item', t.onSelectDesktop);\n\tt.fieldMobile.removeEventListener('change', t.onSelectMobile);\n\tdocument.removeEventListener('click', t.onClickOutside);\n\n\tt.el = null;\n\tt.$el = null;\n\tt.fieldMobile = null;\n\tt.fieldDesktop = null;\n\tt.fieldCurrent = null;\n\tt.callback = null;\n\tt.dropdownItems = null;\n};\n\nmodule.exports = SelectField;\n","function Sidebar(el) {\n var location = window.location.href;\n var url = new URL(location);\n var ref = url.searchParams.get('ref');\n\n if (ref === 'sidebar') {\n var main = document.querySelector('.blog-wrapper__main');\n\n if (main) {\n main.scrollIntoView();\n }\n }\n}\n\nmodule.exports = Sidebar;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null)\n\nfunction Subscribe (el) {\n\tvar formEl = $('.js-subscribe-form')\n\tvar msgEl = $('.js-subscribe-form-msg')\n\tvar inputEmail = el.querySelector('input[type=\"email\"]')\n\tvar inputFirstName = el.querySelector('input[name=\"first_name\"]')\n\tvar inputLastName = el.querySelector('input[name=\"last_name\"]')\n\tvar thankYouPage = el.dataset.thankYouPage\n\n\tformEl.on('submit', function (e) {\n\t\te.preventDefault()\n\n\t\tif (inputEmail.validity.typeMismatch || inputEmail.validity.valueMissing) {\n\t\t\tinputEmail.reportValidity()\n\t\t}\n\n\t\tif (inputFirstName.validity.typeMismatch || inputFirstName.validity.valueMissing) {\n\t\t\tinputFirstName.reportValidity()\n\t\t}\n\n\t\tif (inputLastName.validity.typeMismatch || inputLastName.validity.valueMissing) {\n\t\t\tinputLastName.reportValidity()\n\t\t}\n\n\t\tmsgEl.removeClass('is-error')\n\t\tmsgEl.removeClass('is-success')\n\n\t\tvar ajaxUrl = formEl.attr('action')\n\n\t\tif (inputEmail) {\n\t\t\t$.ajax({\n\t\t\t\ttype: 'POST',\n\t\t\t\theaders: {'Content-Type': 'application/x-www-form-urlencoded'},\n\t\t\t\tcontentType: 'application/x-www-form-urlencoded; charset=utf-8',\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: ajaxUrl,\n\t\t\t\tdata: formEl.serialize(),\n\t\t\t\tsuccess: function (res) {\n\t\t\t\t\tif (res.code == 4001 || res.code == 4002 || res.code == 4400) {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (res.success) {\n\t\t\t\t\t\tif (thankYouPage) {\n\t\t\t\t\t\t\tlocation.href = thankYouPage\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmsgEl.addClass('is-success')\n\t\t\t\t\t\t\tmsgEl.html('Subscribe success.')\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmsgEl.addClass('is-error')\n\t\t\t\t\t\tmsgEl.html(res.message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn false\n\t\t}\n\t})\n}\n\nmodule.exports = Subscribe\n","var TIMER_SELECTOR = '.js-timer';\nvar $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Timer(el) {\n\tvar $el = $(el);\n\tvar $timer = $el.find(TIMER_SELECTOR);\n\tvar expire = $el.data('timer');\n\tvar interval = null\n\n\tif (expire) {\n\t\tinterval = setInterval(function() {\n\t\t\tvar now = Math.ceil(Date.now() / 1000);\n\t\t\tvar remaining = expire - now;\n\t\t\tvar seconds = remaining % 60;\n\t\t\tvar minutes = Math.floor(remaining / 60);\n\n\t\t\tif (seconds < 10) {\n\t\t\t\tseconds = '0' + seconds;\n\t\t\t}\n\n\t\t\tif ( minutes < 10) {\n\t\t\t\tminutes = '0' + minutes;\n\t\t\t}\n\n\t\t\t$timer.text(minutes + ':' + seconds);\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tinterval = null;\n\t\t\t\twindow.location = window.location.href;\n\t\t\t}\n\t\t}, 1000);\n\t}\n}\n\nmodule.exports = Timer;\n","var shave = require('shave');\n\nfunction Truncate( el ) {\n\tvar maxHeight = el.getAttribute('data-max-height');\n\tvar maxHeightNumber = ( maxHeight ) ? maxHeight : 60;\n\tshave( el, maxHeightNumber );\n}\n\nmodule.exports = Truncate;\n","function TwoUpRows(el) {\n function inViewPort() {\n var rect = el.getBoundingClientRect();\n return ( rect.top - innerHeight < 0 ) && ( ( rect.top + rect.height ) > 0 );\n }\n window.addEventListener('scroll', function () {\n if( inViewPort() ) {\n el.classList.add('two-up-rows--animate');\n }\n })\n}\n\nmodule.exports = TwoUpRows;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\n\nfunction Video(el) {\n\tvar t = this;\n\tt.$el = $(el);\n\tt.$videoInner = t.$el.find('.js-video-inner');\n\tt.$video = t.$el.find('.js-video-modal-video iframe');\n\tt.$modal = t.$el.find('.js-video-modal');\n\tt.$iconClose = t.$el.find('.js-video-modal-close');\n\tt.$overlayClose = t.$el.find('.js-video-modal-overlay');\n\n\tt.$videoInner.on('click', function () {\n\t\tt.openModal();\n\t});\n\n\tt.$iconClose.on('click', function () {\n\t\tt.closeModal();\n\t});\n\n\tt.$overlayClose.on('click', function () {\n\t\tt.closeModal();\n\t});\n}\n\n\nVideo.prototype.openModal = function () {\n\tvar t = this;\n\tt.$modal.addClass('video-modal--active');\n};\n\nVideo.prototype.closeModal = function () {\n\tvar t = this;\n\tt.$modal.removeClass('video-modal--active');\n\tt.$video.attr('src', t.$video.attr('src'));\n};\n\nmodule.exports = Video;\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.7\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\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n if ( Array.isArray( obj ) ) {\n // use object if already an array\n return obj;\n }\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) {\n return [];\n }\n\n var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n if ( isArrayLike ) {\n // convert nodeList to array\n return arraySlice.call( obj );\n }\n\n // array of single index\n return [ obj ];\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 threshold = threshold || 100;\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 clearTimeout( timeout );\n\n var args = arguments;\n var _this = this;\n this[ timeoutName ] = setTimeout( function() {\n method.apply( _this, args );\n delete _this[ timeoutName ];\n }, threshold );\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 this.cellChange( index, true );\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 if ( !cells || !cells.length ) {\n return;\n }\n\n var minCellIndex = this.cells.length - 1;\n // remove cells from collection & DOM\n cells.forEach( function( cell ) {\n cell.remove();\n var index = this.cells.indexOf( cell );\n minCellIndex = Math.min( index, minCellIndex );\n utils.removeFrom( this.cells, cell );\n }, this );\n\n this.cellChange( minCellIndex, true );\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 prevSelectedElem = this.selectedElement;\n this._positionCells( changedCellIndex );\n this._getWrapShiftCells();\n this.setGallerySize();\n // update selectedIndex\n // try to maintain position & select previous selected element\n var cell = this.getCell( prevSelectedElem );\n if ( cell ) {\n this.selectedIndex = this.getCellSlideIndex( cell );\n }\n this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n this.emitEvent( 'cellChange', [ changedCellIndex ] );\n // position slider\n this.select( this.selectedIndex );\n // do not position slider after lazy load\n if ( isPositioningSlider ) {\n this.positionSliderAtSelected();\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// -------------------------- 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\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 this.setTranslateX( x, this.isAnimating );\n this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n x += this.cursorPosition;\n // reverse if right-to-left and using transform\n x = this.options.rightToLeft ? -x : x;\n var translateX = 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.transform = is3d ?\n 'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n var firstSlide = this.slides[0];\n if ( !firstSlide ) {\n return;\n }\n var positionX = -this.x - firstSlide.target;\n var progress = positionX / this.slidesWidth;\n this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n if ( !this.cells.length ) {\n return;\n }\n this.x = -this.selectedSlide.target;\n this.velocity = 0; // stop wobble\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', null, [ this.selectedIndex ] );\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.isDraggable || !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 slides\n var dragDown = this.isDraggable && this.isPointerDown;\n if ( dragDown || this.isFreeScrolling || !this.slides.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.element.setAttribute( 'aria-hidden', 'true' );\n this.x = 0;\n this.shift = 0;\n};\n\nproto.destroy = function() {\n // reset style\n this.unselect();\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\nproto.select = function() {\n this.element.classList.add('is-selected');\n this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n this.element.classList.remove('is-selected');\n this.element.setAttribute( 'aria-hidden', 'true' );\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: '>1',\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.onActivateDrag );\n this.on( 'uiChange', this._uiChangeDrag );\n this.on( 'deactivate', this.onDeactivateDrag );\n this.on( 'cellChange', this.updateDraggable );\n // TODO updateDraggable on resize? if groupCells & slides change\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.onActivateDrag = function() {\n this.handles = [ this.viewport ];\n this.bindHandles();\n this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n this.unbindHandles();\n this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n // disable dragging if less than 2 slides. #278\n if ( this.options.draggable == '>1' ) {\n this.isDraggable = this.slides.length > 1;\n } else {\n this.isDraggable = this.options.draggable;\n }\n if ( this.isDraggable ) {\n this.element.classList.add('is-draggable');\n } else {\n this.element.classList.remove('is-draggable');\n }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n this.options.draggable = true;\n this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n this.options.draggable = false;\n this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n if ( !this.isDraggable ) {\n this._pointerDownDefault( event, pointer );\n return;\n }\n var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n\n this._pointerDownPreventDefault( event );\n this.pointerDownFocus( event );\n // blur\n if ( document.activeElement != this.element ) {\n // do not blur if already focused\n this.pointerDownBlur();\n }\n\n // stop if it was moving\n this.dragX = this.x;\n this.viewport.classList.add('is-pointer-down');\n // track scrolling\n this.pointerDownScroll = getScrollPosition();\n window.addEventListener( 'scroll', this );\n\n this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n // track start event position\n // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n this.pointerDownPointer = {\n pageX: pointer.pageX,\n pageY: pointer.pageY,\n };\n // bind move and end events\n this._bindPostStartEvents( event );\n this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n INPUT: true,\n TEXTAREA: true,\n SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isFocusNode ) {\n this.focus();\n }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n var isTouchStart = event.type == 'touchstart';\n var isTouchPointer = event.pointerType == 'touch';\n var isFocusNode = focusNodes[ event.target.nodeName ];\n if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n event.preventDefault();\n }\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 if ( !this.isDraggable ) {\n return;\n }\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 if ( !this.isDraggable ) {\n return;\n }\n event.preventDefault();\n\n this.previousDragX = this.dragX;\n // reverse if right-to-left\n var direction = this.options.rightToLeft ? -1 : 1;\n if ( this.options.wrapAround ) {\n // wrap around move. #589\n moveVector.x = moveVector.x % this.slideableWidth;\n }\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.isDraggable ) {\n return;\n }\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 // add listeners from on option\n for ( var eventName in this.options.on ) {\n var listener = this.options.on[ eventName ];\n this.on( eventName, listener );\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 this.selectInitialIndex();\n // flag for initial activation, for using initialIndex\n this.isInitActivated = true;\n // ready event. #493\n this.dispatchEvent('ready');\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 var prevIndex = this.selectedIndex;\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 // events\n this.dispatchEvent( 'select', null, [ index ] );\n // change event if new index\n if ( index != prevIndex ) {\n this.dispatchEvent( 'change', null, [ index ] );\n }\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\nproto.selectInitialIndex = function() {\n var initialIndex = this.options.initialIndex;\n // already activated, select previous selectedIndex\n if ( this.isInitActivated ) {\n this.select( this.selectedIndex, false, true );\n return;\n }\n // select with selector string\n if ( initialIndex && typeof initialIndex == 'string' ) {\n var cell = this.queryCell( initialIndex );\n if ( cell ) {\n this.selectCell( initialIndex, false, true );\n return;\n }\n }\n\n var index = 0;\n // select with number\n if ( initialIndex && this.slides[ initialIndex ] ) {\n index = initialIndex;\n }\n // select instantly\n this.select( index, false, true );\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 = this.queryCell( value );\n if ( !cell ) {\n return;\n }\n\n var index = this.getCellSlideIndex( cell );\n this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n // get index of slides that has cell\n for ( var i=0; i < this.slides.length; i++ ) {\n var slide = this.slides[i];\n var index = slide.cells.indexOf( cell );\n if ( index != -1 ) {\n return i;\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/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n if ( typeof selector == 'number' ) {\n // use number as index\n return this.cells[ selector ];\n }\n if ( typeof selector == 'string' ) {\n // do not select invalid selectors from hash: #123, #/. #791\n if ( selector.match(/^[#\\.]?[\\d\\/]/) ) {\n return;\n }\n // use string as selector, get element\n selector = this.element.querySelector( selector );\n }\n // get cell from element\n return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n // HACK iOS does not allow touch events to bubble up?!\n if ( event.type != 'touchstart' ) {\n event.preventDefault();\n }\n this.focus();\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 var isNotFocused = document.activeElement && document.activeElement != this.element;\n if ( !this.options.accessibility ||isNotFocused ) {\n return;\n }\n\n var handler = Flickity.keyboardHandlers[ event.keyCode ];\n if ( handler ) {\n handler.call( this );\n }\n};\n\nFlickity.keyboardHandlers = {\n // left arrow\n 37: function() {\n var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n this.uiChange();\n this[ leftMethod ]();\n },\n // right arrow\n 39: function() {\n var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n this.uiChange();\n this[ rightMethod ]();\n },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n // TODO remove scrollTo once focus options gets more support\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#Browser_compatibility\n var prevScrollY = window.pageYOffset;\n this.element.focus({ preventScroll: true });\n // hack to fix scroll jump after focus, #76\n if ( window.pageYOffset != prevScrollY ) {\n window.scrollTo( window.pageXOffset, prevScrollY );\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 this.unselectSelectedSlide();\n // destroy cells\n this.cells.forEach( function( cell ) {\n cell.destroy();\n });\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.allOff();\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;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.2.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2019 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 var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n return [ cellElem ];\n }\n }\n // select lazy images in cell\n var lazySelector = 'img[data-flickity-lazyload], ' +\n 'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n var imgs = cellElem.querySelectorAll( lazySelector );\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 // get src & srcset\n var src = this.img.getAttribute('data-flickity-lazyload') ||\n this.img.getAttribute('data-flickity-lazyload-src');\n var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n // set src & serset\n this.img.src = src;\n if ( srcset ) {\n this.img.setAttribute( 'srcset', srcset );\n }\n // remove attr\n this.img.removeAttribute('data-flickity-lazyload');\n this.img.removeAttribute('data-flickity-lazyload-src');\n this.img.removeAttribute('data-flickity-lazyload-srcset');\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 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n this.parent = parent;\n this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\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.handleClick = this.onClick.bind( this );\n this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n this.setDots();\n this.holder.addEventListener( 'click', this.handleClick );\n this.bindStartEvent( this.holder );\n // add to DOM\n this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n this.holder.removeEventListener( 'click', this.handleClick );\n this.unbindStartEvent( this.holder );\n // remove from DOM\n this.parent.element.removeChild( this.holder );\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 var length = this.dots.length;\n var max = length + count;\n\n for ( var i = length; i < max; i++ ) {\n var dot = document.createElement('li');\n dot.className = 'dot';\n dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n fragment.appendChild( dot );\n newDots.push( dot );\n }\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 this.selectedDot.removeAttribute('aria-current');\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 this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = 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 this.allOff();\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// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n this.parent = parent;\n this.state = 'stopped';\n // visibility change event handler\n this.onVisibilityChange = this.visibilityChange.bind( this );\n this.onVisibilityPlay = this.visibilityPlay.bind( this );\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.hidden;\n if ( isPageHidden ) {\n document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n return;\n }\n\n this.state = 'playing';\n // listen to visibility change\n document.addEventListener( 'visibilitychange', this.onVisibilityChange );\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 document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\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.hidden;\n this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n this.play();\n document.removeEventListener( 'visibilitychange', 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 'unipointer/unipointer',\n 'fizzy-ui-utils/utils'\n ], function( Flickity, Unipointer, utils ) {\n return factory( window, Flickity, Unipointer, utils );\n });\n } else if ( typeof module == 'object' && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n require('./flickity'),\n require('unipointer'),\n require('fizzy-ui-utils')\n );\n } else {\n // browser global\n factory(\n window,\n window.Flickity,\n window.Unipointer,\n window.fizzyUIUtils\n );\n }\n\n}( window, function factory( window, Flickity, Unipointer, 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 = Object.create( Unipointer.prototype );\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-button 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.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.bindStartEvent( this.element );\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 // click events\n this.unbindStartEvent( this.element );\n this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n var svg = document.createElementNS( svgURI, 'svg');\n svg.setAttribute( 'class', 'flickity-button-icon' );\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.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = 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\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 this.allOff();\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.cells.forEach( function( cell ) {\n cell.select();\n });\n};\n\nproto.unselect = function() {\n this.cells.forEach( function( cell ) {\n cell.unselect();\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","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n /* jshint strict: false */ /* globals define, module */\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.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 https://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 * Chrome & Safari measure the outer-width on style.width on border-box elems\n * IE11 & 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 // round value for browser zoom. desandro/masonry#928\n isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n body.removeChild( div );\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 * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n","/**\n shave - Shave is a javascript plugin that truncates multi-line text within a html element based on set max height\n @version v2.5.4\n @link https://github.com/dollarshaveclub/shave#readme\n @author Jeff Wainwright (jeffry.in)\n @license MIT\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 = global || self, global.shave = factory());\n}(this, function () { 'use strict';\n\n function shave(target, maxHeight) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!maxHeight) throw Error('maxHeight is required');\n var els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!els) return;\n var character = opts.character || '…';\n var classname = opts.classname || 'js-shave';\n var spaces = typeof opts.spaces === 'boolean' ? opts.spaces : true;\n var charHtml = \"\".concat(character, \"\");\n if (!('length' in els)) els = [els];\n\n for (var i = 0; i < els.length; i += 1) {\n var el = els[i];\n var styles = el.style;\n var span = el.querySelector(\".\".concat(classname));\n var textProp = el.textContent === undefined ? 'innerText' : 'textContent'; // If element text has already been shaved\n\n if (span) {\n // Remove the ellipsis to recapture the original text\n el.removeChild(el.querySelector('.js-shave-char'));\n el[textProp] = el[textProp]; // eslint-disable-line\n // nuke span, recombine text\n }\n\n var fullText = el[textProp];\n var words = spaces ? fullText.split(' ') : fullText; // If 0 or 1 words, we're done\n\n if (words.length < 2) continue; // Temporarily remove any CSS height for text height calculation\n\n var heightStyle = styles.height;\n styles.height = 'auto';\n var maxHeightStyle = styles.maxHeight;\n styles.maxHeight = 'none'; // If already short enough, we're done\n\n if (el.offsetHeight <= maxHeight) {\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n continue;\n } // Binary search for number of words which can fit in allotted height\n\n\n var max = words.length - 1;\n var min = 0;\n var pivot = void 0;\n\n while (min < max) {\n pivot = min + max + 1 >> 1; // eslint-disable-line no-bitwise\n\n el[textProp] = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);\n el.insertAdjacentHTML('beforeend', charHtml);\n if (el.offsetHeight > maxHeight) max = spaces ? pivot - 1 : pivot - 2;else min = pivot;\n }\n\n el[textProp] = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);\n el.insertAdjacentHTML('beforeend', charHtml);\n var diff = spaces ? \" \".concat(words.slice(max).join(' ')) : words.slice(max);\n var shavedText = document.createTextNode(diff);\n var elWithShavedText = document.createElement('span');\n elWithShavedText.classList.add(classname);\n elWithShavedText.style.display = 'none';\n elWithShavedText.appendChild(shavedText);\n el.insertAdjacentElement('beforeend', elWithShavedText);\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n }\n }\n\n return shave;\n\n}));\n","var SvgPanZoom = require(\"./svg-pan-zoom.js\");\n\nmodule.exports = SvgPanZoom;\n","var SvgUtils = require(\"./svg-utilities\");\n\nmodule.exports = {\n enable: function(instance) {\n // Select (and create if necessary) defs\n var defs = instance.svg.querySelector(\"defs\");\n if (!defs) {\n defs = document.createElementNS(SvgUtils.svgNS, \"defs\");\n instance.svg.appendChild(defs);\n }\n\n // Check for style element, and create it if it doesn't exist\n var styleEl = defs.querySelector(\"style#svg-pan-zoom-controls-styles\");\n if (!styleEl) {\n var style = document.createElementNS(SvgUtils.svgNS, \"style\");\n style.setAttribute(\"id\", \"svg-pan-zoom-controls-styles\");\n style.setAttribute(\"type\", \"text/css\");\n style.textContent =\n \".svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }\";\n defs.appendChild(style);\n }\n\n // Zoom Group\n var zoomGroup = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomGroup.setAttribute(\"id\", \"svg-pan-zoom-controls\");\n zoomGroup.setAttribute(\n \"transform\",\n \"translate(\" +\n (instance.width - 70) +\n \" \" +\n (instance.height - 76) +\n \") scale(0.75)\"\n );\n zoomGroup.setAttribute(\"class\", \"svg-pan-zoom-control\");\n\n // Control elements\n zoomGroup.appendChild(this._createZoomIn(instance));\n zoomGroup.appendChild(this._createZoomReset(instance));\n zoomGroup.appendChild(this._createZoomOut(instance));\n\n // Finally append created element\n instance.svg.appendChild(zoomGroup);\n\n // Cache control instance\n instance.controlIcons = zoomGroup;\n },\n\n _createZoomIn: function(instance) {\n var zoomIn = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomIn.setAttribute(\"id\", \"svg-pan-zoom-zoom-in\");\n zoomIn.setAttribute(\"transform\", \"translate(30.5 5) scale(0.015)\");\n zoomIn.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomIn.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n zoomIn.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n\n var zoomInBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomInBackground.setAttribute(\"x\", \"0\");\n zoomInBackground.setAttribute(\"y\", \"0\");\n zoomInBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomInBackground.setAttribute(\"height\", \"1400\");\n zoomInBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomIn.appendChild(zoomInBackground);\n\n var zoomInShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomInShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z\"\n );\n zoomInShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomIn.appendChild(zoomInShape);\n\n return zoomIn;\n },\n\n _createZoomReset: function(instance) {\n // reset\n var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, \"g\");\n resetPanZoomControl.setAttribute(\"id\", \"svg-pan-zoom-reset-pan-zoom\");\n resetPanZoomControl.setAttribute(\"transform\", \"translate(5 35) scale(0.4)\");\n resetPanZoomControl.setAttribute(\"class\", \"svg-pan-zoom-control\");\n resetPanZoomControl.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n resetPanZoomControl.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n\n var resetPanZoomControlBackground = document.createElementNS(\n SvgUtils.svgNS,\n \"rect\"\n ); // TODO change these background space fillers to rounded rectangles so they look prettier\n resetPanZoomControlBackground.setAttribute(\"x\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"y\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"width\", \"182\"); // larger than expected because the whole group is transformed to scale down\n resetPanZoomControlBackground.setAttribute(\"height\", \"58\");\n resetPanZoomControlBackground.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-background\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlBackground);\n\n var resetPanZoomControlShape1 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"d\",\n \"M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape1);\n\n var resetPanZoomControlShape2 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"d\",\n \"M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape2);\n\n return resetPanZoomControl;\n },\n\n _createZoomOut: function(instance) {\n // zoom out\n var zoomOut = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomOut.setAttribute(\"id\", \"svg-pan-zoom-zoom-out\");\n zoomOut.setAttribute(\"transform\", \"translate(30.5 70) scale(0.015)\");\n zoomOut.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomOut.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n zoomOut.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n\n var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomOutBackground.setAttribute(\"x\", \"0\");\n zoomOutBackground.setAttribute(\"y\", \"0\");\n zoomOutBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomOutBackground.setAttribute(\"height\", \"1400\");\n zoomOutBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomOut.appendChild(zoomOutBackground);\n\n var zoomOutShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomOutShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z\"\n );\n zoomOutShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomOut.appendChild(zoomOutShape);\n\n return zoomOut;\n },\n\n disable: function(instance) {\n if (instance.controlIcons) {\n instance.controlIcons.parentNode.removeChild(instance.controlIcons);\n instance.controlIcons = null;\n }\n }\n};\n","var SvgUtils = require(\"./svg-utilities\"),\n Utils = require(\"./utilities\");\n\nvar ShadowViewport = function(viewport, options) {\n this.init(viewport, options);\n};\n\n/**\n * Initialization\n *\n * @param {SVGElement} viewport\n * @param {Object} options\n */\nShadowViewport.prototype.init = function(viewport, options) {\n // DOM Elements\n this.viewport = viewport;\n this.options = options;\n\n // State cache\n this.originalState = { zoom: 1, x: 0, y: 0 };\n this.activeState = { zoom: 1, x: 0, y: 0 };\n\n this.updateCTMCached = Utils.proxy(this.updateCTM, this);\n\n // Create a custom requestAnimationFrame taking in account refreshRate\n this.requestAnimationFrame = Utils.createRequestAnimationFrame(\n this.options.refreshRate\n );\n\n // ViewBox\n this.viewBox = { x: 0, y: 0, width: 0, height: 0 };\n this.cacheViewBox();\n\n // Process CTM\n var newCTM = this.processCTM();\n\n // Update viewport CTM and cache zoom and pan\n this.setCTM(newCTM);\n\n // Update CTM in this frame\n this.updateCTM();\n};\n\n/**\n * Cache initial viewBox value\n * If no viewBox is defined, then use viewport size/position instead for viewBox values\n */\nShadowViewport.prototype.cacheViewBox = function() {\n var svgViewBox = this.options.svg.getAttribute(\"viewBox\");\n\n if (svgViewBox) {\n var viewBoxValues = svgViewBox\n .split(/[\\s\\,]/)\n .filter(function(v) {\n return v;\n })\n .map(parseFloat);\n\n // Cache viewbox x and y offset\n this.viewBox.x = viewBoxValues[0];\n this.viewBox.y = viewBoxValues[1];\n this.viewBox.width = viewBoxValues[2];\n this.viewBox.height = viewBoxValues[3];\n\n var zoom = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n\n // Update active state\n this.activeState.zoom = zoom;\n this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2;\n this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2;\n\n // Force updating CTM\n this.updateCTMOnNextFrame();\n\n this.options.svg.removeAttribute(\"viewBox\");\n } else {\n this.simpleViewBoxCache();\n }\n};\n\n/**\n * Recalculate viewport sizes and update viewBox cache\n */\nShadowViewport.prototype.simpleViewBoxCache = function() {\n var bBox = this.viewport.getBBox();\n\n this.viewBox.x = bBox.x;\n this.viewBox.y = bBox.y;\n this.viewBox.width = bBox.width;\n this.viewBox.height = bBox.height;\n};\n\n/**\n * Returns a viewbox object. Safe to alter\n *\n * @return {Object} viewbox object\n */\nShadowViewport.prototype.getViewBox = function() {\n return Utils.extend({}, this.viewBox);\n};\n\n/**\n * Get initial zoom and pan values. Save them into originalState\n * Parses viewBox attribute to alter initial sizes\n *\n * @return {CTM} CTM object based on options\n */\nShadowViewport.prototype.processCTM = function() {\n var newCTM = this.getCTM();\n\n if (this.options.fit || this.options.contain) {\n var newScale;\n if (this.options.fit) {\n newScale = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n } else {\n newScale = Math.max(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n }\n\n newCTM.a = newScale; //x-scale\n newCTM.d = newScale; //y-scale\n newCTM.e = -this.viewBox.x * newScale; //x-transform\n newCTM.f = -this.viewBox.y * newScale; //y-transform\n }\n\n if (this.options.center) {\n var offsetX =\n (this.options.width -\n (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) *\n 0.5,\n offsetY =\n (this.options.height -\n (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) *\n 0.5;\n\n newCTM.e = offsetX;\n newCTM.f = offsetY;\n }\n\n // Cache initial values. Based on activeState and fix+center opitons\n this.originalState.zoom = newCTM.a;\n this.originalState.x = newCTM.e;\n this.originalState.y = newCTM.f;\n\n return newCTM;\n};\n\n/**\n * Return originalState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getOriginalState = function() {\n return Utils.extend({}, this.originalState);\n};\n\n/**\n * Return actualState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getState = function() {\n return Utils.extend({}, this.activeState);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getZoom = function() {\n return this.activeState.zoom;\n};\n\n/**\n * Get zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getRelativeZoom = function() {\n return this.activeState.zoom / this.originalState.zoom;\n};\n\n/**\n * Compute zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.computeRelativeZoom = function(scale) {\n return scale / this.originalState.zoom;\n};\n\n/**\n * Get pan\n *\n * @return {Object}\n */\nShadowViewport.prototype.getPan = function() {\n return { x: this.activeState.x, y: this.activeState.y };\n};\n\n/**\n * Return cached viewport CTM value that can be safely modified\n *\n * @return {SVGMatrix}\n */\nShadowViewport.prototype.getCTM = function() {\n var safeCTM = this.options.svg.createSVGMatrix();\n\n // Copy values manually as in FF they are not itterable\n safeCTM.a = this.activeState.zoom;\n safeCTM.b = 0;\n safeCTM.c = 0;\n safeCTM.d = this.activeState.zoom;\n safeCTM.e = this.activeState.x;\n safeCTM.f = this.activeState.y;\n\n return safeCTM;\n};\n\n/**\n * Set a new CTM\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.setCTM = function(newCTM) {\n var willZoom = this.isZoomDifferent(newCTM),\n willPan = this.isPanDifferent(newCTM);\n\n if (willZoom || willPan) {\n // Before zoom\n if (willZoom) {\n // If returns false then cancel zooming\n if (\n this.options.beforeZoom(\n this.getRelativeZoom(),\n this.computeRelativeZoom(newCTM.a)\n ) === false\n ) {\n newCTM.a = newCTM.d = this.activeState.zoom;\n willZoom = false;\n } else {\n this.updateCache(newCTM);\n this.options.onZoom(this.getRelativeZoom());\n }\n }\n\n // Before pan\n if (willPan) {\n var preventPan = this.options.beforePan(this.getPan(), {\n x: newCTM.e,\n y: newCTM.f\n }),\n // If prevent pan is an object\n preventPanX = false,\n preventPanY = false;\n\n // If prevent pan is Boolean false\n if (preventPan === false) {\n // Set x and y same as before\n newCTM.e = this.getPan().x;\n newCTM.f = this.getPan().y;\n\n preventPanX = preventPanY = true;\n } else if (Utils.isObject(preventPan)) {\n // Check for X axes attribute\n if (preventPan.x === false) {\n // Prevent panning on x axes\n newCTM.e = this.getPan().x;\n preventPanX = true;\n } else if (Utils.isNumber(preventPan.x)) {\n // Set a custom pan value\n newCTM.e = preventPan.x;\n }\n\n // Check for Y axes attribute\n if (preventPan.y === false) {\n // Prevent panning on x axes\n newCTM.f = this.getPan().y;\n preventPanY = true;\n } else if (Utils.isNumber(preventPan.y)) {\n // Set a custom pan value\n newCTM.f = preventPan.y;\n }\n }\n\n // Update willPan flag\n // Check if newCTM is still different\n if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {\n willPan = false;\n } else {\n this.updateCache(newCTM);\n this.options.onPan(this.getPan());\n }\n }\n\n // Check again if should zoom or pan\n if (willZoom || willPan) {\n this.updateCTMOnNextFrame();\n }\n }\n};\n\nShadowViewport.prototype.isZoomDifferent = function(newCTM) {\n return this.activeState.zoom !== newCTM.a;\n};\n\nShadowViewport.prototype.isPanDifferent = function(newCTM) {\n return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f;\n};\n\n/**\n * Update cached CTM and active state\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.updateCache = function(newCTM) {\n this.activeState.zoom = newCTM.a;\n this.activeState.x = newCTM.e;\n this.activeState.y = newCTM.f;\n};\n\nShadowViewport.prototype.pendingUpdate = false;\n\n/**\n * Place a request to update CTM on next Frame\n */\nShadowViewport.prototype.updateCTMOnNextFrame = function() {\n if (!this.pendingUpdate) {\n // Lock\n this.pendingUpdate = true;\n\n // Throttle next update\n this.requestAnimationFrame.call(window, this.updateCTMCached);\n }\n};\n\n/**\n * Update viewport CTM with cached CTM\n */\nShadowViewport.prototype.updateCTM = function() {\n var ctm = this.getCTM();\n\n // Updates SVG element\n SvgUtils.setCTM(this.viewport, ctm, this.defs);\n\n // Free the lock\n this.pendingUpdate = false;\n\n // Notify about the update\n if (this.options.onUpdatedCTM) {\n this.options.onUpdatedCTM(ctm);\n }\n};\n\nmodule.exports = function(viewport, options) {\n return new ShadowViewport(viewport, options);\n};\n","var Wheel = require(\"./uniwheel\"),\n ControlIcons = require(\"./control-icons\"),\n Utils = require(\"./utilities\"),\n SvgUtils = require(\"./svg-utilities\"),\n ShadowViewport = require(\"./shadow-viewport\");\n\nvar SvgPanZoom = function(svg, options) {\n this.init(svg, options);\n};\n\nvar optionsDefaults = {\n viewportSelector: \".svg-pan-zoom_viewport\", // Viewport selector. Can be querySelector string or SVGElement\n panEnabled: true, // enable or disable panning (default enabled)\n controlIconsEnabled: false, // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)\n zoomEnabled: true, // enable or disable zooming (default enabled)\n dblClickZoomEnabled: true, // enable or disable zooming by double clicking (default enabled)\n mouseWheelZoomEnabled: true, // enable or disable zooming by mouse wheel (default enabled)\n preventMouseEventsDefault: true, // enable or disable preventDefault for mouse events\n zoomScaleSensitivity: 0.1, // Zoom sensitivity\n minZoom: 0.5, // Minimum Zoom level\n maxZoom: 10, // Maximum Zoom level\n fit: true, // enable or disable viewport fit in SVG (default true)\n contain: false, // enable or disable viewport contain the svg (default false)\n center: true, // enable or disable viewport centering in SVG (default true)\n refreshRate: \"auto\", // Maximum number of frames per second (altering SVG's viewport)\n beforeZoom: null,\n onZoom: null,\n beforePan: null,\n onPan: null,\n customEventsHandler: null,\n eventsListenerElement: null,\n onUpdatedCTM: null\n};\n\nvar passiveListenerOption = { passive: true };\n\nSvgPanZoom.prototype.init = function(svg, options) {\n var that = this;\n\n this.svg = svg;\n this.defs = svg.querySelector(\"defs\");\n\n // Add default attributes to SVG\n SvgUtils.setupSvgAttributes(this.svg);\n\n // Set options\n this.options = Utils.extend(Utils.extend({}, optionsDefaults), options);\n\n // Set default state\n this.state = \"none\";\n\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Init shadow viewport\n this.viewport = ShadowViewport(\n SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector),\n {\n svg: this.svg,\n width: this.width,\n height: this.height,\n fit: this.options.fit,\n contain: this.options.contain,\n center: this.options.center,\n refreshRate: this.options.refreshRate,\n // Put callbacks into functions as they can change through time\n beforeZoom: function(oldScale, newScale) {\n if (that.viewport && that.options.beforeZoom) {\n return that.options.beforeZoom(oldScale, newScale);\n }\n },\n onZoom: function(scale) {\n if (that.viewport && that.options.onZoom) {\n return that.options.onZoom(scale);\n }\n },\n beforePan: function(oldPoint, newPoint) {\n if (that.viewport && that.options.beforePan) {\n return that.options.beforePan(oldPoint, newPoint);\n }\n },\n onPan: function(point) {\n if (that.viewport && that.options.onPan) {\n return that.options.onPan(point);\n }\n },\n onUpdatedCTM: function(ctm) {\n if (that.viewport && that.options.onUpdatedCTM) {\n return that.options.onUpdatedCTM(ctm);\n }\n }\n }\n );\n\n // Wrap callbacks into public API context\n var publicInstance = this.getPublicInstance();\n publicInstance.setBeforeZoom(this.options.beforeZoom);\n publicInstance.setOnZoom(this.options.onZoom);\n publicInstance.setBeforePan(this.options.beforePan);\n publicInstance.setOnPan(this.options.onPan);\n publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM);\n\n if (this.options.controlIconsEnabled) {\n ControlIcons.enable(this);\n }\n\n // Init events handlers\n this.lastMouseWheelEventTime = Date.now();\n this.setupHandlers();\n};\n\n/**\n * Register event handlers\n */\nSvgPanZoom.prototype.setupHandlers = function() {\n var that = this,\n prevEvt = null; // use for touchstart event to detect double tap\n\n this.eventListeners = {\n // Mouse down group\n mousedown: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n touchstart: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n\n // Mouse up group\n mouseup: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchend: function(evt) {\n return that.handleMouseUp(evt);\n },\n\n // Mouse move group\n mousemove: function(evt) {\n return that.handleMouseMove(evt);\n },\n touchmove: function(evt) {\n return that.handleMouseMove(evt);\n },\n\n // Mouse leave group\n mouseleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchcancel: function(evt) {\n return that.handleMouseUp(evt);\n }\n };\n\n // Init custom events handler if available\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.init({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n\n // Custom event handler may halt builtin listeners\n var haltEventListeners = this.options.customEventsHandler\n .haltEventListeners;\n if (haltEventListeners && haltEventListeners.length) {\n for (var i = haltEventListeners.length - 1; i >= 0; i--) {\n if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {\n delete this.eventListeners[haltEventListeners[i]];\n }\n }\n }\n }\n\n // Bind eventListeners\n for (var event in this.eventListeners) {\n // Attach event to eventsListenerElement or SVG if not available\n (this.options.eventsListenerElement || this.svg).addEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Zoom using mouse wheel\n if (this.options.mouseWheelZoomEnabled) {\n this.options.mouseWheelZoomEnabled = false; // set to false as enable will set it back to true\n this.enableMouseWheelZoom();\n }\n};\n\n/**\n * Enable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.enableMouseWheelZoom = function() {\n if (!this.options.mouseWheelZoomEnabled) {\n var that = this;\n\n // Mouse wheel listener\n this.wheelListener = function(evt) {\n return that.handleMouseWheel(evt);\n };\n\n // Bind wheelListener\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.on(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n\n this.options.mouseWheelZoomEnabled = true;\n }\n};\n\n/**\n * Disable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.disableMouseWheelZoom = function() {\n if (this.options.mouseWheelZoomEnabled) {\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.off(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n this.options.mouseWheelZoomEnabled = false;\n }\n};\n\n/**\n * Handle mouse wheel event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseWheel = function(evt) {\n if (!this.options.zoomEnabled || this.state !== \"none\") {\n return;\n }\n\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Default delta in case that deltaY is not available\n var delta = evt.deltaY || 1,\n timeDelta = Date.now() - this.lastMouseWheelEventTime,\n divider = 3 + Math.max(0, 30 - timeDelta);\n\n // Update cache\n this.lastMouseWheelEventTime = Date.now();\n\n // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)\n if (\"deltaMode\" in evt && evt.deltaMode === 0 && evt.wheelDelta) {\n delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY;\n }\n\n delta =\n -0.3 < delta && delta < 0.3\n ? delta\n : ((delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10)) / divider;\n\n var inversedScreenCTM = this.svg.getScreenCTM().inverse(),\n relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n inversedScreenCTM\n ),\n zoom = Math.pow(1 + this.options.zoomScaleSensitivity, -1 * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior\n\n this.zoomAtPoint(zoom, relativeMousePoint);\n};\n\n/**\n * Zoom in at a SVG point\n *\n * @param {SVGPoint} point\n * @param {Float} zoomScale Number representing how much to zoom\n * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.\n * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)\n */\nSvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) {\n var originalState = this.viewport.getOriginalState();\n\n if (!zoomAbsolute) {\n // Fit zoomScale in set bounds\n if (\n this.getZoom() * zoomScale <\n this.options.minZoom * originalState.zoom\n ) {\n zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom();\n } else if (\n this.getZoom() * zoomScale >\n this.options.maxZoom * originalState.zoom\n ) {\n zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom();\n }\n } else {\n // Fit zoomScale in set bounds\n zoomScale = Math.max(\n this.options.minZoom * originalState.zoom,\n Math.min(this.options.maxZoom * originalState.zoom, zoomScale)\n );\n // Find relative scale to achieve desired scale\n zoomScale = zoomScale / this.getZoom();\n }\n\n var oldCTM = this.viewport.getCTM(),\n relativePoint = point.matrixTransform(oldCTM.inverse()),\n modifier = this.svg\n .createSVGMatrix()\n .translate(relativePoint.x, relativePoint.y)\n .scale(zoomScale)\n .translate(-relativePoint.x, -relativePoint.y),\n newCTM = oldCTM.multiply(modifier);\n\n if (newCTM.a !== oldCTM.a) {\n this.viewport.setCTM(newCTM);\n }\n};\n\n/**\n * Zoom at center point\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.zoom = function(scale, absolute) {\n this.zoomAtPoint(\n scale,\n SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height),\n absolute\n );\n};\n\n/**\n * Zoom used by public instance\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoom = function(scale, absolute) {\n if (absolute) {\n scale = this.computeFromRelativeZoom(scale);\n }\n\n this.zoom(scale, absolute);\n};\n\n/**\n * Zoom at point used by public instance\n *\n * @param {Float} scale\n * @param {SVGPoint|Object} point An object that has x and y attributes\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) {\n if (absolute) {\n // Transform zoom into a relative value\n scale = this.computeFromRelativeZoom(scale);\n }\n\n // If not a SVGPoint but has x and y then create a SVGPoint\n if (Utils.getType(point) !== \"SVGPoint\") {\n if (\"x\" in point && \"y\" in point) {\n point = SvgUtils.createSVGPoint(this.svg, point.x, point.y);\n } else {\n throw new Error(\"Given point is invalid\");\n }\n }\n\n this.zoomAtPoint(scale, point, absolute);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getZoom = function() {\n return this.viewport.getZoom();\n};\n\n/**\n * Get zoom scale for public usage\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getRelativeZoom = function() {\n return this.viewport.getRelativeZoom();\n};\n\n/**\n * Compute actual zoom from public zoom\n *\n * @param {Float} zoom\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) {\n return zoom * this.viewport.getOriginalState().zoom;\n};\n\n/**\n * Set zoom to initial state\n */\nSvgPanZoom.prototype.resetZoom = function() {\n var originalState = this.viewport.getOriginalState();\n\n this.zoom(originalState.zoom, true);\n};\n\n/**\n * Set pan to initial state\n */\nSvgPanZoom.prototype.resetPan = function() {\n this.pan(this.viewport.getOriginalState());\n};\n\n/**\n * Set pan and zoom to initial state\n */\nSvgPanZoom.prototype.reset = function() {\n this.resetZoom();\n this.resetPan();\n};\n\n/**\n * Handle double click event\n * See handleMouseDown() for alternate detection method\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleDblClick = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Check if target was a control button\n if (this.options.controlIconsEnabled) {\n var targetClass = evt.target.getAttribute(\"class\") || \"\";\n if (targetClass.indexOf(\"svg-pan-zoom-control\") > -1) {\n return false;\n }\n }\n\n var zoomFactor;\n\n if (evt.shiftKey) {\n zoomFactor = 1 / ((1 + this.options.zoomScaleSensitivity) * 2); // zoom out when shift key pressed\n } else {\n zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2;\n }\n\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.svg.getScreenCTM().inverse()\n );\n this.zoomAtPoint(zoomFactor, point);\n};\n\n/**\n * Handle click event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n Utils.mouseAndTouchNormalize(evt, this.svg);\n\n // Double click detection; more consistent than ondblclick\n if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)) {\n this.handleDblClick(evt);\n } else {\n // Pan mode\n this.state = \"pan\";\n this.firstEventCTM = this.viewport.getCTM();\n this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n );\n }\n};\n\n/**\n * Handle mouse move event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseMove = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\" && this.options.panEnabled) {\n // Pan mode\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n ),\n viewportCTM = this.firstEventCTM.translate(\n point.x - this.stateOrigin.x,\n point.y - this.stateOrigin.y\n );\n\n this.viewport.setCTM(viewportCTM);\n }\n};\n\n/**\n * Handle mouse button release event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseUp = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\") {\n // Quit pan mode\n this.state = \"none\";\n }\n};\n\n/**\n * Adjust viewport size (only) so it will fit in SVG\n * Does not center image\n */\nSvgPanZoom.prototype.fit = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.min(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport size (only) so it will contain the SVG\n * Does not center image\n */\nSvgPanZoom.prototype.contain = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.max(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport pan (only) so it will be centered in SVG\n * Does not zoom/fit/contain image\n */\nSvgPanZoom.prototype.center = function() {\n var viewBox = this.viewport.getViewBox(),\n offsetX =\n (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5,\n offsetY =\n (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5;\n\n this.getPublicInstance().pan({ x: offsetX, y: offsetY });\n};\n\n/**\n * Update content cached BorderBox\n * Use when viewport contents change\n */\nSvgPanZoom.prototype.updateBBox = function() {\n this.viewport.simpleViewBoxCache();\n};\n\n/**\n * Pan to a rendered position\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.pan = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e = point.x;\n viewportCTM.f = point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Relatively pan the graph by a specified rendered position vector\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.panBy = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e += point.x;\n viewportCTM.f += point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Get pan vector\n *\n * @return {Object} {x: 0, y: 0}\n */\nSvgPanZoom.prototype.getPan = function() {\n var state = this.viewport.getState();\n\n return { x: state.x, y: state.y };\n};\n\n/**\n * Recalculates cached svg dimensions and controls position\n */\nSvgPanZoom.prototype.resize = function() {\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n this.svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Recalculate original state\n var viewport = this.viewport;\n viewport.options.width = this.width;\n viewport.options.height = this.height;\n viewport.processCTM();\n\n // Reposition control icons by re-enabling them\n if (this.options.controlIconsEnabled) {\n this.getPublicInstance().disableControlIcons();\n this.getPublicInstance().enableControlIcons();\n }\n};\n\n/**\n * Unbind mouse events, free callbacks and destroy public instance\n */\nSvgPanZoom.prototype.destroy = function() {\n var that = this;\n\n // Free callbacks\n this.beforeZoom = null;\n this.onZoom = null;\n this.beforePan = null;\n this.onPan = null;\n this.onUpdatedCTM = null;\n\n // Destroy custom event handlers\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.destroy({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n }\n\n // Unbind eventListeners\n for (var event in this.eventListeners) {\n (this.options.eventsListenerElement || this.svg).removeEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Unbind wheelListener\n this.disableMouseWheelZoom();\n\n // Remove control icons\n this.getPublicInstance().disableControlIcons();\n\n // Reset zoom and pan\n this.reset();\n\n // Remove instance from instancesStore\n instancesStore = instancesStore.filter(function(instance) {\n return instance.svg !== that.svg;\n });\n\n // Delete options and its contents\n delete this.options;\n\n // Delete viewport to make public shadow viewport functions uncallable\n delete this.viewport;\n\n // Destroy public instance and rewrite getPublicInstance\n delete this.publicInstance;\n delete this.pi;\n this.getPublicInstance = function() {\n return null;\n };\n};\n\n/**\n * Returns a public instance object\n *\n * @return {Object} Public instance object\n */\nSvgPanZoom.prototype.getPublicInstance = function() {\n var that = this;\n\n // Create cache\n if (!this.publicInstance) {\n this.publicInstance = this.pi = {\n // Pan\n enablePan: function() {\n that.options.panEnabled = true;\n return that.pi;\n },\n disablePan: function() {\n that.options.panEnabled = false;\n return that.pi;\n },\n isPanEnabled: function() {\n return !!that.options.panEnabled;\n },\n pan: function(point) {\n that.pan(point);\n return that.pi;\n },\n panBy: function(point) {\n that.panBy(point);\n return that.pi;\n },\n getPan: function() {\n return that.getPan();\n },\n // Pan event\n setBeforePan: function(fn) {\n that.options.beforePan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnPan: function(fn) {\n that.options.onPan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zoom and Control Icons\n enableZoom: function() {\n that.options.zoomEnabled = true;\n return that.pi;\n },\n disableZoom: function() {\n that.options.zoomEnabled = false;\n return that.pi;\n },\n isZoomEnabled: function() {\n return !!that.options.zoomEnabled;\n },\n enableControlIcons: function() {\n if (!that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = true;\n ControlIcons.enable(that);\n }\n return that.pi;\n },\n disableControlIcons: function() {\n if (that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = false;\n ControlIcons.disable(that);\n }\n return that.pi;\n },\n isControlIconsEnabled: function() {\n return !!that.options.controlIconsEnabled;\n },\n // Double click zoom\n enableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = true;\n return that.pi;\n },\n disableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = false;\n return that.pi;\n },\n isDblClickZoomEnabled: function() {\n return !!that.options.dblClickZoomEnabled;\n },\n // Mouse wheel zoom\n enableMouseWheelZoom: function() {\n that.enableMouseWheelZoom();\n return that.pi;\n },\n disableMouseWheelZoom: function() {\n that.disableMouseWheelZoom();\n return that.pi;\n },\n isMouseWheelZoomEnabled: function() {\n return !!that.options.mouseWheelZoomEnabled;\n },\n // Zoom scale and bounds\n setZoomScaleSensitivity: function(scale) {\n that.options.zoomScaleSensitivity = scale;\n return that.pi;\n },\n setMinZoom: function(zoom) {\n that.options.minZoom = zoom;\n return that.pi;\n },\n setMaxZoom: function(zoom) {\n that.options.maxZoom = zoom;\n return that.pi;\n },\n // Zoom event\n setBeforeZoom: function(fn) {\n that.options.beforeZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnZoom: function(fn) {\n that.options.onZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zooming\n zoom: function(scale) {\n that.publicZoom(scale, true);\n return that.pi;\n },\n zoomBy: function(scale) {\n that.publicZoom(scale, false);\n return that.pi;\n },\n zoomAtPoint: function(scale, point) {\n that.publicZoomAtPoint(scale, point, true);\n return that.pi;\n },\n zoomAtPointBy: function(scale, point) {\n that.publicZoomAtPoint(scale, point, false);\n return that.pi;\n },\n zoomIn: function() {\n this.zoomBy(1 + that.options.zoomScaleSensitivity);\n return that.pi;\n },\n zoomOut: function() {\n this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity));\n return that.pi;\n },\n getZoom: function() {\n return that.getRelativeZoom();\n },\n // CTM update\n setOnUpdatedCTM: function(fn) {\n that.options.onUpdatedCTM =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Reset\n resetZoom: function() {\n that.resetZoom();\n return that.pi;\n },\n resetPan: function() {\n that.resetPan();\n return that.pi;\n },\n reset: function() {\n that.reset();\n return that.pi;\n },\n // Fit, Contain and Center\n fit: function() {\n that.fit();\n return that.pi;\n },\n contain: function() {\n that.contain();\n return that.pi;\n },\n center: function() {\n that.center();\n return that.pi;\n },\n // Size and Resize\n updateBBox: function() {\n that.updateBBox();\n return that.pi;\n },\n resize: function() {\n that.resize();\n return that.pi;\n },\n getSizes: function() {\n return {\n width: that.width,\n height: that.height,\n realZoom: that.getZoom(),\n viewBox: that.viewport.getViewBox()\n };\n },\n // Destroy\n destroy: function() {\n that.destroy();\n return that.pi;\n }\n };\n }\n\n return this.publicInstance;\n};\n\n/**\n * Stores pairs of instances of SvgPanZoom and SVG\n * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}\n *\n * @type {Array}\n */\nvar instancesStore = [];\n\nvar svgPanZoom = function(elementOrSelector, options) {\n var svg = Utils.getSvg(elementOrSelector);\n\n if (svg === null) {\n return null;\n } else {\n // Look for existent instance\n for (var i = instancesStore.length - 1; i >= 0; i--) {\n if (instancesStore[i].svg === svg) {\n return instancesStore[i].instance.getPublicInstance();\n }\n }\n\n // If instance not found - create one\n instancesStore.push({\n svg: svg,\n instance: new SvgPanZoom(svg, options)\n });\n\n // Return just pushed instance\n return instancesStore[\n instancesStore.length - 1\n ].instance.getPublicInstance();\n }\n};\n\nmodule.exports = svgPanZoom;\n","var Utils = require(\"./utilities\"),\n _browser = \"unknown\";\n\n// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\nif (/*@cc_on!@*/ false || !!document.documentMode) {\n // internet explorer\n _browser = \"ie\";\n}\n\nmodule.exports = {\n svgNS: \"http://www.w3.org/2000/svg\",\n xmlNS: \"http://www.w3.org/XML/1998/namespace\",\n xmlnsNS: \"http://www.w3.org/2000/xmlns/\",\n xlinkNS: \"http://www.w3.org/1999/xlink\",\n evNS: \"http://www.w3.org/2001/xml-events\",\n\n /**\n * Get svg dimensions: width and height\n *\n * @param {SVGSVGElement} svg\n * @return {Object} {width: 0, height: 0}\n */\n getBoundingClientRectNormalized: function(svg) {\n if (svg.clientWidth && svg.clientHeight) {\n return { width: svg.clientWidth, height: svg.clientHeight };\n } else if (!!svg.getBoundingClientRect()) {\n return svg.getBoundingClientRect();\n } else {\n throw new Error(\"Cannot get BoundingClientRect for SVG.\");\n }\n },\n\n /**\n * Gets g element with class of \"viewport\" or creates it if it doesn't exist\n *\n * @param {SVGSVGElement} svg\n * @return {SVGElement} g (group) element\n */\n getOrCreateViewport: function(svg, selector) {\n var viewport = null;\n\n if (Utils.isElement(selector)) {\n viewport = selector;\n } else {\n viewport = svg.querySelector(selector);\n }\n\n // Check if there is just one main group in SVG\n if (!viewport) {\n var childNodes = Array.prototype.slice\n .call(svg.childNodes || svg.children)\n .filter(function(el) {\n return el.nodeName !== \"defs\" && el.nodeName !== \"#text\";\n });\n\n // Node name should be SVGGElement and should have no transform attribute\n // Groups with transform are not used as viewport because it involves parsing of all transform possibilities\n if (\n childNodes.length === 1 &&\n childNodes[0].nodeName === \"g\" &&\n childNodes[0].getAttribute(\"transform\") === null\n ) {\n viewport = childNodes[0];\n }\n }\n\n // If no favorable group element exists then create one\n if (!viewport) {\n var viewportId =\n \"viewport-\" + new Date().toISOString().replace(/\\D/g, \"\");\n viewport = document.createElementNS(this.svgNS, \"g\");\n viewport.setAttribute(\"id\", viewportId);\n\n // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes\n var svgChildren = svg.childNodes || svg.children;\n if (!!svgChildren && svgChildren.length > 0) {\n for (var i = svgChildren.length; i > 0; i--) {\n // Move everything into viewport except defs\n if (svgChildren[svgChildren.length - i].nodeName !== \"defs\") {\n viewport.appendChild(svgChildren[svgChildren.length - i]);\n }\n }\n }\n svg.appendChild(viewport);\n }\n\n // Parse class names\n var classNames = [];\n if (viewport.getAttribute(\"class\")) {\n classNames = viewport.getAttribute(\"class\").split(\" \");\n }\n\n // Set class (if not set already)\n if (!~classNames.indexOf(\"svg-pan-zoom_viewport\")) {\n classNames.push(\"svg-pan-zoom_viewport\");\n viewport.setAttribute(\"class\", classNames.join(\" \"));\n }\n\n return viewport;\n },\n\n /**\n * Set SVG attributes\n *\n * @param {SVGSVGElement} svg\n */\n setupSvgAttributes: function(svg) {\n // Setting default attributes\n svg.setAttribute(\"xmlns\", this.svgNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:xlink\", this.xlinkNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:ev\", this.evNS);\n\n // Needed for Internet Explorer, otherwise the viewport overflows\n if (svg.parentNode !== null) {\n var style = svg.getAttribute(\"style\") || \"\";\n if (style.toLowerCase().indexOf(\"overflow\") === -1) {\n svg.setAttribute(\"style\", \"overflow: hidden; \" + style);\n }\n }\n },\n\n /**\n * How long Internet Explorer takes to finish updating its display (ms).\n */\n internetExplorerRedisplayInterval: 300,\n\n /**\n * Forces the browser to redisplay all SVG elements that rely on an\n * element defined in a 'defs' section. It works globally, for every\n * available defs element on the page.\n * The throttling is intentionally global.\n *\n * This is only needed for IE. It is as a hack to make markers (and 'use' elements?)\n * visible after pan/zoom when there are multiple SVGs on the page.\n * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/\n * also see svg-pan-zoom issue: https://github.com/ariutta/svg-pan-zoom/issues/62\n */\n refreshDefsGlobal: Utils.throttle(\n function() {\n var allDefs = document.querySelectorAll(\"defs\");\n var allDefsCount = allDefs.length;\n for (var i = 0; i < allDefsCount; i++) {\n var thisDefs = allDefs[i];\n thisDefs.parentNode.insertBefore(thisDefs, thisDefs);\n }\n },\n this ? this.internetExplorerRedisplayInterval : null\n ),\n\n /**\n * Sets the current transform matrix of an element\n *\n * @param {SVGElement} element\n * @param {SVGMatrix} matrix CTM\n * @param {SVGElement} defs\n */\n setCTM: function(element, matrix, defs) {\n var that = this,\n s =\n \"matrix(\" +\n matrix.a +\n \",\" +\n matrix.b +\n \",\" +\n matrix.c +\n \",\" +\n matrix.d +\n \",\" +\n matrix.e +\n \",\" +\n matrix.f +\n \")\";\n\n element.setAttributeNS(null, \"transform\", s);\n if (\"transform\" in element.style) {\n element.style.transform = s;\n } else if (\"-ms-transform\" in element.style) {\n element.style[\"-ms-transform\"] = s;\n } else if (\"-webkit-transform\" in element.style) {\n element.style[\"-webkit-transform\"] = s;\n }\n\n // IE has a bug that makes markers disappear on zoom (when the matrix \"a\" and/or \"d\" elements change)\n // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10\n // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/\n if (_browser === \"ie\" && !!defs) {\n // this refresh is intended for redisplaying the SVG during zooming\n defs.parentNode.insertBefore(defs, defs);\n // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG\n // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that\n // are located under any other element(s).\n window.setTimeout(function() {\n that.refreshDefsGlobal();\n }, that.internetExplorerRedisplayInterval);\n }\n },\n\n /**\n * Instantiate an SVGPoint object with given event coordinates\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n * @return {SVGPoint} point\n */\n getEventPoint: function(evt, svg) {\n var point = svg.createSVGPoint();\n\n Utils.mouseAndTouchNormalize(evt, svg);\n\n point.x = evt.clientX;\n point.y = evt.clientY;\n\n return point;\n },\n\n /**\n * Get SVG center point\n *\n * @param {SVGSVGElement} svg\n * @return {SVGPoint}\n */\n getSvgCenterPoint: function(svg, width, height) {\n return this.createSVGPoint(svg, width / 2, height / 2);\n },\n\n /**\n * Create a SVGPoint with given x and y\n *\n * @param {SVGSVGElement} svg\n * @param {Number} x\n * @param {Number} y\n * @return {SVGPoint}\n */\n createSVGPoint: function(svg, x, y) {\n var point = svg.createSVGPoint();\n point.x = x;\n point.y = y;\n\n return point;\n }\n};\n","// uniwheel 0.1.2 (customized)\n// A unified cross browser mouse wheel event handler\n// https://github.com/teemualap/uniwheel\n\nmodule.exports = (function(){\n\n //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel\n\n var prefix = \"\", _addEventListener, _removeEventListener, support, fns = [];\n var passiveOption = {passive: true};\n\n // detect event model\n if ( window.addEventListener ) {\n _addEventListener = \"addEventListener\";\n _removeEventListener = \"removeEventListener\";\n } else {\n _addEventListener = \"attachEvent\";\n _removeEventListener = \"detachEvent\";\n prefix = \"on\";\n }\n\n // detect available wheel event\n support = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\n\n\n function createCallback(element,callback) {\n\n var fn = function(originalEvent) {\n\n !originalEvent && ( originalEvent = window.event );\n\n // create a normalized event object\n var event = {\n // keep a ref to the original event object\n originalEvent: originalEvent,\n target: originalEvent.target || originalEvent.srcElement,\n type: \"wheel\",\n deltaMode: originalEvent.type == \"MozMousePixelScroll\" ? 0 : 1,\n deltaX: 0,\n delatZ: 0,\n preventDefault: function() {\n originalEvent.preventDefault ?\n originalEvent.preventDefault() :\n originalEvent.returnValue = false;\n }\n };\n\n // calculate deltaY (and deltaX) according to the event\n if ( support == \"mousewheel\" ) {\n event.deltaY = - 1/40 * originalEvent.wheelDelta;\n // Webkit also support wheelDeltaX\n originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );\n } else {\n event.deltaY = originalEvent.detail;\n }\n\n // it's time to fire the callback\n return callback( event );\n\n };\n\n fns.push({\n element: element,\n fn: fn,\n });\n\n return fn;\n }\n\n function getCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns[i].fn;\n }\n }\n return function(){};\n }\n\n function removeCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns.splice(i,1);\n }\n }\n }\n\n function _addWheelListener(elem, eventName, callback, isPassiveListener ) {\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = createCallback(elem, callback);\n }\n\n elem[_addEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);\n }\n\n function _removeWheelListener(elem, eventName, callback, isPassiveListener ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = getCallback(elem);\n }\n\n elem[_removeEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);\n\n removeCallback(elem);\n }\n\n function addWheelListener( elem, callback, isPassiveListener ) {\n _addWheelListener(elem, support, callback, isPassiveListener );\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _addWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener );\n }\n }\n\n function removeWheelListener(elem, callback, isPassiveListener){\n _removeWheelListener(elem, support, callback, isPassiveListener);\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _removeWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener);\n }\n }\n\n return {\n on: addWheelListener,\n off: removeWheelListener\n };\n\n})();\n","module.exports = {\n /**\n * Extends an object\n *\n * @param {Object} target object to extend\n * @param {Object} source object to take properties from\n * @return {Object} extended object\n */\n extend: function(target, source) {\n target = target || {};\n for (var prop in source) {\n // Go recursively\n if (this.isObject(source[prop])) {\n target[prop] = this.extend(target[prop], source[prop]);\n } else {\n target[prop] = source[prop];\n }\n }\n return target;\n },\n\n /**\n * Checks if an object is a DOM element\n *\n * @param {Object} o HTML element or String\n * @return {Boolean} returns true if object is a DOM element\n */\n isElement: function(o) {\n return (\n o instanceof HTMLElement ||\n o instanceof SVGElement ||\n o instanceof SVGSVGElement || //DOM2\n (o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\")\n );\n },\n\n /**\n * Checks if an object is an Object\n *\n * @param {Object} o Object\n * @return {Boolean} returns true if object is an Object\n */\n isObject: function(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n },\n\n /**\n * Checks if variable is Number\n *\n * @param {Integer|Float} n\n * @return {Boolean} returns true if variable is Number\n */\n isNumber: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n\n /**\n * Search for an SVG element\n *\n * @param {Object|String} elementOrSelector DOM Element or selector String\n * @return {Object|Null} SVG or null\n */\n getSvg: function(elementOrSelector) {\n var element, svg;\n\n if (!this.isElement(elementOrSelector)) {\n // If selector provided\n if (\n typeof elementOrSelector === \"string\" ||\n elementOrSelector instanceof String\n ) {\n // Try to find the element\n element = document.querySelector(elementOrSelector);\n\n if (!element) {\n throw new Error(\n \"Provided selector did not find any elements. Selector: \" +\n elementOrSelector\n );\n return null;\n }\n } else {\n throw new Error(\"Provided selector is not an HTML object nor String\");\n return null;\n }\n } else {\n element = elementOrSelector;\n }\n\n if (element.tagName.toLowerCase() === \"svg\") {\n svg = element;\n } else {\n if (element.tagName.toLowerCase() === \"object\") {\n svg = element.contentDocument.documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"embed\") {\n svg = element.getSVGDocument().documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"img\") {\n throw new Error(\n 'Cannot script an SVG in an \"img\" element. Please use an \"object\" element or an in-line SVG.'\n );\n } else {\n throw new Error(\"Cannot get SVG.\");\n }\n return null;\n }\n }\n }\n\n return svg;\n },\n\n /**\n * Attach a given context to a function\n * @param {Function} fn Function\n * @param {Object} context Context\n * @return {Function} Function with certain context\n */\n proxy: function(fn, context) {\n return function() {\n return fn.apply(context, arguments);\n };\n },\n\n /**\n * Returns object type\n * Uses toString that returns [object SVGPoint]\n * And than parses object type from string\n *\n * @param {Object} o Any object\n * @return {String} Object type\n */\n getType: function(o) {\n return Object.prototype.toString\n .apply(o)\n .replace(/^\\[object\\s/, \"\")\n .replace(/\\]$/, \"\");\n },\n\n /**\n * If it is a touch event than add clientX and clientY to event object\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n */\n mouseAndTouchNormalize: function(evt, svg) {\n // If no clientX then fallback\n if (evt.clientX === void 0 || evt.clientX === null) {\n // Fallback\n evt.clientX = 0;\n evt.clientY = 0;\n\n // If it is a touch event\n if (evt.touches !== void 0 && evt.touches.length) {\n if (evt.touches[0].clientX !== void 0) {\n evt.clientX = evt.touches[0].clientX;\n evt.clientY = evt.touches[0].clientY;\n } else if (evt.touches[0].pageX !== void 0) {\n var rect = svg.getBoundingClientRect();\n\n evt.clientX = evt.touches[0].pageX - rect.left;\n evt.clientY = evt.touches[0].pageY - rect.top;\n }\n // If it is a custom event\n } else if (evt.originalEvent !== void 0) {\n if (evt.originalEvent.clientX !== void 0) {\n evt.clientX = evt.originalEvent.clientX;\n evt.clientY = evt.originalEvent.clientY;\n }\n }\n }\n },\n\n /**\n * Check if an event is a double click/tap\n * TODO: For touch gestures use a library (hammer.js) that takes in account other events\n * (touchmove and touchend). It should take in account tap duration and traveled distance\n *\n * @param {Event} evt\n * @param {Event} prevEvt Previous Event\n * @return {Boolean}\n */\n isDblClick: function(evt, prevEvt) {\n // Double click detected by browser\n if (evt.detail === 2) {\n return true;\n }\n // Try to compare events\n else if (prevEvt !== void 0 && prevEvt !== null) {\n var timeStampDiff = evt.timeStamp - prevEvt.timeStamp, // should be lower than 250 ms\n touchesDistance = Math.sqrt(\n Math.pow(evt.clientX - prevEvt.clientX, 2) +\n Math.pow(evt.clientY - prevEvt.clientY, 2)\n );\n\n return timeStampDiff < 250 && touchesDistance < 10;\n }\n\n // Nothing found\n return false;\n },\n\n /**\n * Returns current timestamp as an integer\n *\n * @return {Number}\n */\n now:\n Date.now ||\n function() {\n return new Date().getTime();\n },\n\n // From underscore.\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n throttle: function(func, wait, options) {\n var that = this;\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) {\n options = {};\n }\n var later = function() {\n previous = options.leading === false ? 0 : that.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n };\n return function() {\n var now = that.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n context = this; // eslint-disable-line consistent-this\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n /**\n * Create a requestAnimationFrame simulation\n *\n * @param {Number|String} refreshRate\n * @return {Function}\n */\n createRequestAnimationFrame: function(refreshRate) {\n var timeout = null;\n\n // Convert refreshRate to timeout\n if (refreshRate !== \"auto\" && refreshRate < 60 && refreshRate > 1) {\n timeout = Math.floor(1000 / refreshRate);\n }\n\n if (timeout === null) {\n return window.requestAnimationFrame || requestTimeout(33);\n } else {\n return requestTimeout(timeout);\n }\n }\n};\n\n/**\n * Create a callback that will execute after a given timeout\n *\n * @param {Function} timeout\n * @return {Function}\n */\nfunction requestTimeout(timeout) {\n return function(callback) {\n window.setTimeout(callback, timeout);\n };\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.TinyDatePicker = factory());\n}(this, (function () { 'use strict';\n\n /**\n * @file A generic set of mutation-free date functions.\n */\n\n /**\n * now returns the current date without any time values\n *\n * @returns {Date}\n */\n function now() {\n var dt = new Date();\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * dateEq compares two dates\n *\n * @param {Date} date1 the first date\n * @param {Date} date2 the second date\n * @returns {boolean}\n */\n function datesEq(date1, date2) {\n return (date1 && date1.toDateString()) === (date2 && date2.toDateString());\n }\n\n /**\n * shiftDay shifts the specified date by n days\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftDay(dt, n) {\n dt = new Date(dt);\n dt.setDate(dt.getDate() + n);\n return dt;\n }\n\n /**\n * shiftMonth shifts the specified date by a specified number of months\n *\n * @param {Date} dt\n * @param {number} n\n * @param {boolean} wrap optional, if true, does not change year\n * value, defaults to false\n * @returns {Date}\n */\n function shiftMonth(dt, n, wrap) {\n dt = new Date(dt);\n\n var dayOfMonth = dt.getDate();\n var month = dt.getMonth() + n;\n\n dt.setDate(1);\n dt.setMonth(wrap ? (12 + month) % 12 : month);\n dt.setDate(dayOfMonth);\n\n // If dayOfMonth = 31, but the target month only has 30 or 29 or whatever...\n // head back to the max of the target month\n if (dt.getDate() < dayOfMonth) {\n dt.setDate(0);\n }\n\n return dt;\n }\n\n /**\n * shiftYear shifts the specified date by n years\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftYear(dt, n) {\n dt = new Date(dt);\n dt.setFullYear(dt.getFullYear() + n);\n return dt;\n }\n\n /**\n * setYear changes the specified date to the specified year\n *\n * @param {Date} dt\n * @param {number} year\n */\n function setYear(dt, year) {\n dt = new Date(dt);\n dt.setFullYear(year);\n return dt;\n }\n\n /**\n * setMonth changes the specified date to the specified month\n *\n * @param {Date} dt\n * @param {number} month\n */\n function setMonth(dt, month) {\n return shiftMonth(dt, month - dt.getMonth());\n }\n\n /**\n * dateOrParse creates a function which, given a date or string, returns a date\n *\n * @param {function} parse the function used to parse strings\n * @returns {function}\n */\n function dateOrParse(parse) {\n return function (dt) {\n return dropTime(typeof dt === 'string' ? parse(dt) : dt);\n };\n }\n\n /**\n * constrainDate returns dt or min/max depending on whether dt is out of bounds (inclusive)\n *\n * @export\n * @param {Date} dt\n * @param {Date} min\n * @param {Date} max\n * @returns {Date}\n */\n function constrainDate(dt, min, max) {\n return (dt < min) ? min :\n (dt > max) ? max :\n dt;\n }\n\n function dropTime(dt) {\n dt = new Date(dt);\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * @file Utility functions for function manipulation.\n */\n\n /**\n * bufferFn buffers calls to fn so they only happen every ms milliseconds\n *\n * @param {number} ms number of milliseconds\n * @param {function} fn the function to be buffered\n * @returns {function}\n */\n function bufferFn(ms, fn) {\n var timeout = undefined;\n return function () {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n /**\n * noop is a function which does nothing at all.\n */\n function noop() { }\n\n /**\n * copy properties from object o2 to object o1.\n *\n * @params {Object} o1\n * @params {Object} o2\n * @returns {Object}\n */\n function cp() {\n var args = arguments;\n var o1 = args[0];\n for (var i = 1; i < args.length; ++i) {\n var o2 = args[i] || {};\n for (var key in o2) {\n o1[key] = o2[key];\n }\n }\n return o1;\n }\n\n /**\n * @file Responsible for sanitizing and creating date picker options.\n */\n\n var english = {\n days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n today: 'Today',\n clear: 'Clear',\n close: 'Close',\n };\n\n /**\n * DatePickerOptions constructs a new date picker options object, overriding\n * default values with any values specified in opts.\n *\n * @param {DatePickerOptions} opts\n * @returns {DatePickerOptions}\n */\n function DatePickerOptions(opts) {\n opts = opts || {};\n opts = cp(defaults(), opts);\n var parse = dateOrParse(opts.parse);\n opts.lang = cp(english, opts.lang);\n opts.parse = parse;\n opts.inRange = makeInRangeFn(opts);\n opts.min = parse(opts.min || shiftYear(now(), -100));\n opts.max = parse(opts.max || shiftYear(now(), 100));\n opts.hilightedDate = opts.parse(opts.hilightedDate);\n\n return opts;\n }\n\n function defaults() {\n return {\n lang: english,\n\n // Possible values: dp-modal, dp-below, dp-permanent\n mode: 'dp-modal',\n\n // The date to hilight initially if the date picker has no\n // initial value.\n hilightedDate: now(),\n\n format: function (dt) {\n return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();\n },\n\n parse: function (str) {\n var date = new Date(str);\n return isNaN(date) ? now() : date;\n },\n\n dateClass: function () { },\n\n inRange: function () {\n return true;\n }\n };\n }\n\n function makeInRangeFn(opts) {\n var inRange = opts.inRange; // Cache this version, and return a variant\n\n return function (dt, dp) {\n return inRange(dt, dp) && opts.min <= dt && opts.max >= dt;\n };\n }\n\n /**\n * @file Helper functions for dealing with dom elements.\n */\n\n var Key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n enter: 13,\n esc: 27,\n };\n\n /**\n * on attaches an event handler to the specified element, and returns an\n * off function which can be used to remove the handler.\n *\n * @param {string} evt the name of the event to handle\n * @param {HTMLElement} el the element to attach to\n * @param {function} handler the event handler\n * @returns {function} the off function\n */\n function on(evt, el, handler) {\n el.addEventListener(evt, handler, true);\n\n return function () {\n el.removeEventListener(evt, handler, true);\n };\n }\n\n var CustomEvent = shimCustomEvent();\n\n function shimCustomEvent() {\n var CustomEvent = window.CustomEvent;\n\n if (typeof CustomEvent !== 'function') {\n CustomEvent = function (event, params) {\n params = params || {bubbles: false, cancelable: false, detail: undefined};\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n }\n\n return CustomEvent;\n }\n\n /**\n * @file Manages the calendar / day-picker view.\n */\n\n var dayPicker = {\n onKeyDown: keyDown,\n onClick: {\n 'dp-day': selectDay,\n 'dp-next': gotoNextMonth,\n 'dp-prev': gotoPrevMonth,\n 'dp-today': selectToday,\n 'dp-clear': clear,\n 'dp-close': close,\n 'dp-cal-month': showMonthPicker,\n 'dp-cal-year': showYearPicker,\n },\n render: render\n };\n\n /**\n * view renders the calendar (day picker) as an HTML string.\n *\n * @param {DatePickerContext} context the date picker being rendered\n * @returns {string}\n */\n function render(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var state = dp.state;\n var dayNames = lang.days;\n var dayOffset = opts.dayOffset || 0;\n var selectedDate = state.selectedDate;\n var hilightedDate = state.hilightedDate;\n var hilightedMonth = hilightedDate.getMonth();\n var today = now().getTime();\n\n return (\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n dayNames.map(function (name, i) {\n return (\n '' + dayNames[(i + dayOffset) % dayNames.length] + ''\n );\n }).join('') +\n mapDays(hilightedDate, dayOffset, function (date) {\n var isNotInMonth = date.getMonth() !== hilightedMonth;\n var isDisabled = !opts.inRange(date);\n var isToday = date.getTime() === today;\n var className = 'dp-day';\n className += (isNotInMonth ? ' dp-edge-day' : '');\n className += (datesEq(date, hilightedDate) ? ' dp-current' : '');\n className += (datesEq(date, selectedDate) ? ' dp-selected' : '');\n className += (isDisabled ? ' dp-day-disabled' : '');\n className += (isToday ? ' dp-day-today' : '');\n className += ' ' + opts.dateClass(date, dp);\n\n return (\n ''\n );\n }) +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    '\n );\n }\n\n /**\n * keyDown handles the key down event for the day-picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -7 :\n (key === Key.down) ? 7 :\n 0;\n\n if (key === Key.esc) {\n dp.close();\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftDay(dp.state.hilightedDate, shiftBy)\n });\n }\n }\n\n function selectToday(e, dp) {\n dp.setState({\n selectedDate: now(),\n });\n }\n\n function clear(e, dp) {\n dp.setState({\n selectedDate: null,\n });\n }\n\n function close(e, dp) {\n dp.close();\n }\n\n function showMonthPicker(e, dp) {\n dp.setState({\n view: 'month'\n });\n }\n\n function showYearPicker(e, dp) {\n dp.setState({\n view: 'year'\n });\n }\n\n function gotoNextMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, 1)\n });\n }\n\n function gotoPrevMonth(e, dp) {\n var hilightedDate = dp.state.hilightedDate;\n dp.setState({\n hilightedDate: shiftMonth(hilightedDate, -1)\n });\n }\n\n function selectDay(e, dp) {\n dp.setState({\n selectedDate: new Date(parseInt(e.target.getAttribute('data-date'))),\n });\n }\n\n function mapDays(currentDate, dayOffset, fn) {\n var result = '';\n var iter = new Date(currentDate);\n iter.setDate(1);\n iter.setDate(1 - iter.getDay() + dayOffset);\n\n // If we are showing monday as the 1st of the week,\n // and the monday is the 2nd of the month, the sunday won't\n // show, so we need to shift backwards\n if (dayOffset && iter.getDate() === dayOffset + 1) {\n iter.setDate(dayOffset - 6);\n }\n\n // We are going to have 6 weeks always displayed to keep a consistent\n // calendar size\n for (var day = 0; day < (6 * 7); ++day) {\n result += fn(iter);\n iter.setDate(iter.getDate() + 1);\n }\n\n return result;\n }\n\n /**\n * @file Manages the month-picker view.\n */\n\n var monthPicker = {\n onKeyDown: keyDown$1,\n onClick: {\n 'dp-month': onChooseMonth\n },\n render: render$1\n };\n\n function onChooseMonth(e, dp) {\n dp.setState({\n hilightedDate: setMonth(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-month'))),\n view: 'day',\n });\n }\n\n /**\n * render renders the month picker as an HTML string\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$1(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var months = lang.months;\n var currentDate = dp.state.hilightedDate;\n var currentMonth = currentDate.getMonth();\n\n return (\n '
    ' +\n months.map(function (month, i) {\n var className = 'dp-month';\n className += (currentMonth === i ? ' dp-current' : '');\n\n return (\n ''\n );\n }).join('') +\n '
    '\n );\n }\n\n /**\n * keyDown handles keydown events that occur in the month picker\n *\n * @param {Event} e\n * @param {DatePickerContext} dp\n */\n function keyDown$1(e, dp) {\n var key = e.keyCode;\n var shiftBy =\n (key === Key.left) ? -1 :\n (key === Key.right) ? 1 :\n (key === Key.up) ? -3 :\n (key === Key.down) ? 3 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n dp.setState({\n hilightedDate: shiftMonth(dp.state.hilightedDate, shiftBy, true)\n });\n }\n }\n\n /**\n * @file Manages the year-picker view.\n */\n\n var yearPicker = {\n render: render$2,\n onKeyDown: keyDown$2,\n onClick: {\n 'dp-year': onChooseYear\n },\n };\n\n /**\n * view renders the year picker as an HTML string.\n *\n * @param {DatePickerContext} dp the date picker context\n * @returns {string}\n */\n function render$2(dp) {\n var state = dp.state;\n var currentYear = state.hilightedDate.getFullYear();\n var selectedYear = state.selectedDate.getFullYear();\n\n return (\n '
    ' +\n mapYears(dp, function (year) {\n var className = 'dp-year';\n className += (year === currentYear ? ' dp-current' : '');\n className += (year === selectedYear ? ' dp-selected' : '');\n\n return (\n ''\n );\n }) +\n '
    '\n );\n }\n\n function onChooseYear(e, dp) {\n dp.setState({\n hilightedDate: setYear(dp.state.hilightedDate, parseInt(e.target.getAttribute('data-year'))),\n view: 'day',\n });\n }\n\n function keyDown$2(e, dp) {\n var key = e.keyCode;\n var opts = dp.opts;\n var shiftBy =\n (key === Key.left || key === Key.up) ? 1 :\n (key === Key.right || key === Key.down) ? -1 :\n 0;\n\n if (key === Key.esc) {\n dp.setState({\n view: 'day',\n });\n } else if (shiftBy) {\n e.preventDefault();\n var shiftedYear = shiftYear(dp.state.hilightedDate, shiftBy);\n\n dp.setState({\n hilightedDate: constrainDate(shiftedYear, opts.min, opts.max),\n });\n }\n }\n\n function mapYears(dp, fn) {\n var result = '';\n var max = dp.opts.max.getFullYear();\n\n for (var i = max; i >= dp.opts.min.getFullYear(); --i) {\n result += fn(i);\n }\n\n return result;\n }\n\n /**\n * @file Defines the base date picker behavior, overridden by various modes.\n */\n\n var views = {\n day: dayPicker,\n year: yearPicker,\n month: monthPicker\n };\n\n function BaseMode(input, emit, opts) {\n var detatchInputEvents; // A function that detaches all events from the input\n var closing = false; // A hack to prevent calendar from re-opening when closing.\n var selectedDate; // The currently selected date\n var dp = {\n // The root DOM element for the date picker, initialized on first open.\n el: undefined,\n opts: opts,\n shouldFocusOnBlur: true,\n shouldFocusOnRender: true,\n state: initialState(),\n adjustPosition: noop,\n containerHTML: '
    ',\n\n attachToDom: function () {\n document.body.appendChild(dp.el);\n },\n\n updateInput: function (selectedDate) {\n var e = new CustomEvent('change', {bubbles: true});\n e.simulated = true;\n input.value = selectedDate ? opts.format(selectedDate) : '';\n input.dispatchEvent(e);\n },\n\n computeSelectedDate: function () {\n return opts.parse(input.value);\n },\n\n currentView: function() {\n return views[dp.state.view];\n },\n\n open: function () {\n if (closing) {\n return;\n }\n\n if (!dp.el) {\n dp.el = createContainerElement(opts, dp.containerHTML);\n attachContainerEvents(dp);\n }\n\n selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);\n dp.state.hilightedDate = selectedDate || opts.hilightedDate;\n dp.state.view = 'day';\n\n dp.attachToDom();\n dp.render();\n\n emit('open');\n },\n\n isVisible: function () {\n return !!dp.el && !!dp.el.parentNode;\n },\n\n hasFocus: function () {\n var focused = document.activeElement;\n return dp.el &&\n dp.el.contains(focused) &&\n focused.className.indexOf('dp-focuser') < 0;\n },\n\n shouldHide: function () {\n return dp.isVisible();\n },\n\n close: function (becauseOfBlur) {\n var el = dp.el;\n\n if (!dp.isVisible()) {\n return;\n }\n\n if (el) {\n var parent = el.parentNode;\n parent && parent.removeChild(el);\n }\n\n closing = true;\n\n if (becauseOfBlur && dp.shouldFocusOnBlur) {\n focusInput(input);\n }\n\n // When we close, the input often gains refocus, which\n // can then launch the date picker again, so we buffer\n // a bit and don't show the date picker within N ms of closing\n setTimeout(function() {\n closing = false;\n }, 100);\n\n emit('close');\n },\n\n destroy: function () {\n dp.close();\n detatchInputEvents();\n },\n\n render: function () {\n if (!dp.el || !dp.el.firstChild) {\n return;\n }\n\n var hadFocus = dp.hasFocus();\n var html = dp.currentView().render(dp);\n html && (dp.el.firstChild.innerHTML = html);\n\n dp.adjustPosition();\n\n if (hadFocus || dp.shouldFocusOnRender) {\n focusCurrent(dp);\n }\n },\n\n // Conceptually similar to setState in React, updates\n // the view state and re-renders.\n setState: function (state) {\n for (var key in state) {\n dp.state[key] = state[key];\n }\n\n emit('statechange');\n dp.render();\n },\n };\n\n detatchInputEvents = attachInputEvents(input, dp);\n\n // Builds the initial view state\n // selectedDate is a special case and causes changes to hilightedDate\n // hilightedDate is set on open, so remains undefined initially\n // view is the current view (day, month, year)\n function initialState() {\n return {\n get selectedDate() {\n return selectedDate;\n },\n set selectedDate(dt) {\n if (dt && !opts.inRange(dt)) {\n return;\n }\n\n if (dt) {\n selectedDate = new Date(dt);\n dp.state.hilightedDate = selectedDate;\n } else {\n selectedDate = dt;\n }\n\n dp.updateInput(selectedDate);\n emit('select');\n dp.close();\n },\n view: 'day',\n };\n }\n\n return dp;\n }\n\n function createContainerElement(opts, containerHTML) {\n var el = document.createElement('div');\n\n el.className = opts.mode;\n el.innerHTML = containerHTML;\n\n return el;\n }\n\n function attachInputEvents(input, dp) {\n var bufferShow = bufferFn(5, function () {\n if (dp.shouldHide()) {\n dp.close();\n } else {\n dp.open();\n }\n });\n\n var off = [\n on('blur', input, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n })),\n\n on('mousedown', input, function () {\n if (input === document.activeElement) {\n bufferShow();\n }\n }),\n\n on('focus', input, bufferShow),\n\n on('input', input, function (e) {\n var date = dp.opts.parse(e.target.value);\n isNaN(date) || dp.setState({\n hilightedDate: date\n });\n }),\n ];\n\n // Unregister all events that were registered above.\n return function() {\n off.forEach(function (f) {\n f();\n });\n };\n }\n\n function focusCurrent(dp) {\n var current = dp.el.querySelector('.dp-current');\n return current && current.focus();\n }\n\n function attachContainerEvents(dp) {\n var el = dp.el;\n var calEl = el.querySelector('.dp');\n\n // Hack to get iOS to show active CSS states\n el.ontouchstart = noop;\n\n function onClick(e) {\n e.target.className.split(' ').forEach(function(evt) {\n var handler = dp.currentView().onClick[evt];\n handler && handler(e, dp);\n });\n }\n\n // The calender fires a blur event *every* time we redraw\n // this means we need to buffer the blur event to see if\n // it still has no focus after redrawing, and only then\n // do we return focus to the input. A possible other approach\n // would be to set context.redrawing = true on redraw and\n // set it to false in the blur event.\n on('blur', calEl, bufferFn(150, function () {\n if (!dp.hasFocus()) {\n dp.close(true);\n }\n }));\n\n on('keydown', el, function (e) {\n if (e.keyCode === Key.enter) {\n onClick(e);\n } else {\n dp.currentView().onKeyDown(e, dp);\n }\n });\n\n // If the user clicks in non-focusable space, but\n // still within the date picker, we don't want to\n // hide, so we need to hack some things...\n on('mousedown', calEl, function (e) {\n e.target.focus && e.target.focus(); // IE hack\n if (document.activeElement !== e.target) {\n e.preventDefault();\n focusCurrent(dp);\n }\n });\n\n on('click', el, onClick);\n }\n\n function focusInput(input) {\n // When the modal closes, we need to focus the original input so the\n // user can continue tabbing from where they left off.\n input.focus();\n\n // iOS zonks out if we don't blur the input, so...\n if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {\n input.blur();\n }\n }\n\n /**\n * @file Defines the modal date picker behavior.\n */\n\n function ModalMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n // In modal mode, users really shouldn't be able to type in\n // the input, as all input is done via the calendar.\n input.readonly = true;\n\n // In modal mode, we need to know when the user has tabbed\n // off the end of the calendar, and set focus to the original\n // input. To do this, we add a special element to the DOM.\n // When the user tabs off the bottom of the calendar, they\n // will tab onto this element.\n dp.containerHTML += '.';\n\n return dp;\n }\n\n /**\n * @file Defines the dropdown date picker behavior.\n */\n\n function DropdownMode(input, emit, opts) {\n var dp = BaseMode(input, emit, opts);\n\n dp.shouldFocusOnBlur = false;\n\n Object.defineProperty(dp, 'shouldFocusOnRender', {\n get: function() {\n return input !== document.activeElement;\n }\n });\n\n dp.adjustPosition = function () {\n autoPosition(input, dp);\n };\n\n return dp;\n }\n\n function autoPosition(input, dp) {\n var inputPos = input.getBoundingClientRect();\n var win = window;\n\n adjustCalY(dp, inputPos, win);\n adjustCalX(dp, inputPos, win);\n\n dp.el.style.visibility = '';\n }\n\n function adjustCalX(dp, inputPos, win) {\n var cal = dp.el;\n var scrollLeft = win.pageXOffset;\n var inputLeft = inputPos.left + scrollLeft;\n var maxRight = win.innerWidth + scrollLeft;\n var offsetWidth = cal.offsetWidth;\n var calRight = inputLeft + offsetWidth;\n var shiftedLeft = maxRight - offsetWidth;\n var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;\n\n cal.style.left = left + 'px';\n }\n\n function adjustCalY(dp, inputPos, win) {\n var cal = dp.el;\n var scrollTop = win.pageYOffset;\n var inputTop = scrollTop + inputPos.top;\n var calHeight = cal.offsetHeight;\n var belowTop = inputTop + inputPos.height + 8;\n var aboveTop = inputTop - calHeight - 8;\n var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);\n var top = isAbove ? aboveTop : belowTop;\n\n if (cal.classList) {\n cal.classList.toggle('dp-is-above', isAbove);\n cal.classList.toggle('dp-is-below', !isAbove);\n }\n cal.style.top = top + 'px';\n }\n\n /**\n * @file Defines the permanent date picker behavior.\n */\n\n function PermanentMode(root, emit, opts) {\n var dp = BaseMode(root, emit, opts);\n\n dp.close = noop;\n dp.destroy = noop;\n dp.updateInput = noop;\n dp.shouldFocusOnRender = opts.shouldFocusOnRender;\n\n dp.computeSelectedDate = function () {\n return opts.hilightedDate;\n };\n\n dp.attachToDom = function () {\n root.appendChild(dp.el);\n };\n\n dp.open();\n\n return dp;\n }\n\n /**\n * @file Defines the various date picker modes (modal, dropdown, permanent)\n */\n\n function Mode(input, emit, opts) {\n input = input && input.tagName ? input : document.querySelector(input);\n\n if (opts.mode === 'dp-modal') {\n return ModalMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-below') {\n return DropdownMode(input, emit, opts);\n }\n\n if (opts.mode === 'dp-permanent') {\n return PermanentMode(input, emit, opts);\n }\n }\n\n /**\n * @file Defines simple event emitter behavior.\n */\n\n /**\n * Emitter constructs a new emitter object which has on/off methods.\n *\n * @returns {EventEmitter}\n */\n function Emitter() {\n var handlers = {};\n\n function onOne(name, handler) {\n (handlers[name] = (handlers[name] || [])).push(handler);\n }\n\n function onMany(fns) {\n for (var name in fns) {\n onOne(name, fns[name]);\n }\n }\n\n return {\n on: function (name, handler) {\n if (handler) {\n onOne(name, handler);\n } else {\n onMany(name);\n }\n\n return this;\n },\n\n emit: function (name, arg) {\n (handlers[name] || []).forEach(function (handler) {\n handler(name, arg);\n });\n },\n\n off: function (name, handler) {\n if (!name) {\n handlers = {};\n } else if (!handler) {\n handlers[name] = [];\n } else {\n handlers[name] = (handlers[name] || []).filter(function (h) {\n return h !== handler;\n });\n }\n\n return this;\n }\n };\n }\n\n /**\n * @file The root date picker file, defines public exports for the library.\n */\n\n /**\n * The date picker language configuration\n * @typedef {Object} LangOptions\n * @property {Array.} [days] - Days of the week\n * @property {Array.} [months] - Months of the year\n * @property {string} today - The label for the 'today' button\n * @property {string} close - The label for the 'close' button\n * @property {string} clear - The label for the 'clear' button\n */\n\n /**\n * The configuration options for a date picker.\n *\n * @typedef {Object} DatePickerOptions\n * @property {LangOptions} [lang] - Configures the label text, defaults to English\n * @property {('dp-modal'|'dp-below'|'dp-permanent')} [mode] - The date picker mode, defaults to 'dp-modal'\n * @property {(string|Date)} [hilightedDate] - The date to hilight if no date is selected\n * @property {function(string|Date):Date} [parse] - Parses a date, the complement of the \"format\" function\n * @property {function(Date):string} [format] - Formats a date for displaying to user\n * @property {function(Date):string} [dateClass] - Associates a custom CSS class with a date\n * @property {function(Date):boolean} [inRange] - Indicates whether or not a date is selectable\n * @property {(string|Date)} [min] - The minimum selectable date (inclusive, default 100 years ago)\n * @property {(string|Date)} [max] - The maximum selectable date (inclusive, default 100 years from now)\n */\n\n /**\n * The state values for the date picker\n *\n * @typedef {Object} DatePickerState\n * @property {string} view - The current view 'day' | 'month' | 'year'\n * @property {Date} selectedDate - The date which has been selected by the user\n * @property {Date} hilightedDate - The date which is currently hilighted / active\n */\n\n /**\n * An instance of TinyDatePicker\n *\n * @typedef {Object} DatePicker\n * @property {DatePickerState} state - The values currently displayed.\n * @property {function} on - Adds an event handler\n * @property {function} off - Removes an event handler\n * @property {function} setState - Changes the current state of the date picker\n * @property {function} open - Opens the date picker\n * @property {function} close - Closes the date picker\n * @property {function} destroy - Destroys the date picker (removing all handlers from the input, too)\n */\n\n /**\n * TinyDatePicker constructs a new date picker for the specified input\n *\n * @param {HTMLElement | string} input The input or CSS selector associated with the datepicker\n * @param {DatePickerOptions} opts The options for initializing the date picker\n * @returns {DatePicker}\n */\n function TinyDatePicker(input, opts) {\n var emitter = Emitter();\n var options = DatePickerOptions(opts);\n var mode = Mode(input, emit, options);\n var me = {\n get state() {\n return mode.state;\n },\n on: emitter.on,\n off: emitter.off,\n setState: mode.setState,\n open: mode.open,\n close: mode.close,\n destroy: mode.destroy,\n };\n\n function emit(evt) {\n emitter.emit(evt, me);\n }\n\n return me;\n }\n\n return TinyDatePicker;\n\n})));\n","/*!\n * Unidragger v2.3.0\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 * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n // bind each handle\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n var touchAction = isAdd ? this._touchActionValue : '';\n for ( var i=0; i < this.handles.length; i++ ) {\n var handle = this.handles[i];\n this._bindStartEvent( handle, isAdd );\n handle[ bindMethod ]( 'click', this );\n // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n if ( window.PointerEvent ) {\n handle.style.touchAction = touchAction;\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 var isOkay = this.okayPointerDown( event );\n if ( !isOkay ) {\n return;\n }\n // track start event position\n this.pointerDownPointer = pointer;\n\n event.preventDefault();\n this.pointerDownBlur();\n // bind move and end events\n this._bindPostStartEvents( event );\n this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n TEXTAREA: true,\n INPUT: true,\n SELECT: 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\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n var isCursorNode = cursorNodes[ event.target.nodeName ];\n var isClickType = clickTypes[ event.target.type ];\n var isOkay = !isCursorNode || isClickType;\n if ( !isOkay ) {\n this._pointerReset();\n }\n return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n var focused = document.activeElement;\n // do not blur body for IE10, metafizzy/flickity#117\n var canBlur = focused && focused.blur && focused != document.body;\n if ( canBlur ) {\n focused.blur();\n }\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 moveVector = {\n x: pointer.pageX - this.pointerDownPointer.pageX,\n y: pointer.pageY - this.pointerDownPointer.pageY\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// ----- 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 // prevent clicks\n this.isPreventingClicks = true;\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 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.3.0\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 * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n // munge isAdd, default to true\n isAdd = isAdd === undefined ? true : isAdd;\n var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n // default to mouse events\n var startEvent = 'mousedown';\n if ( window.PointerEvent ) {\n // Pointer Events\n startEvent = 'pointerdown';\n } else if ( 'ontouchstart' in window ) {\n // Touch Events. iOS Safari\n startEvent = 'touchstart';\n }\n elem[ bindMethod ]( startEvent, this );\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 this._pointerReset();\n this._unbindPostStartEvents();\n this.pointerDone();\n};\n\nproto._pointerReset = function() {\n // reset properties\n this.isPointerDown = false;\n delete this.pointerIdentifier;\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);\n\n/**\n * Finds all elements with a \"data-module-init\" attribute\n * and calls the corresponding script\n */\nfunction initializeModules() {\n var modules = document.querySelectorAll( \"[data-module-init]\" );\n\n for ( var i = 0; i < modules.length; i++ ) {\n var el = modules[ i ];\n var $el = $( el );\n var name = el.getAttribute( \"data-module-init\" );\n\n // Find the module script\n try {\n var Module = require( \"modules/\" + name );\n } catch ( e ) {\n console.log( e.toString() );\n var Module = false;\n }\n\n // Initialize the module with the calling element\n if ( typeof Module === \"function\" && !$el.data( \"module\" ) ) {\n var mod = new Module( el );\n\n // Save module instance to jQuery data\n $( el ).data( \"module\", mod );\n }\n }\n}\n\nmodule.exports = initializeModules;\n","var $ = (typeof window !== \"undefined\" ? window['jQuery'] : typeof global !== \"undefined\" ? global['jQuery'] : null);\nvar initializeModules = require( \"./lib/init-modules.js\" );\n\n$(function() {\n\tinitializeModules();\n});\n"]}