{"version":3,"sources":["global.js","plugins/select-replace.js","../../node_modules/js-tools/svg.js","../../vendor/d3r/core/resources/javascript/d3r.js","../../node_modules/magnific-popup/dist/jquery.magnific-popup.min.js","../../node_modules/wnumb/wNumb.js","../../node_modules/slick-carousel/slick/slick.js","../../node_modules/js-cookie/src/js.cookie.js","../../node_modules/selectize/dist/js/standalone/selectize.js","../../node_modules/scroll-lock/dist/scroll-lock.js","../../node_modules/photoswipe/dist/umd/photoswipe.umd.min.js","../../node_modules/photoswipe/dist/umd/photoswipe-lightbox.umd.min.js","components/url.js","components/state.js","components/basket.js","components/filters.js","components/grid.js","components/gallery.js","components/newsletter.js","components/kit-price.js","components/design-directory.js","components/qty.js","components/family.js","components/product.js","plugins/nouislider.js","components/carousel.js","components/notice.js","components/bloomreach.js","components/klaviyo.js","plugins/check-replace.js","plugins/custom-check-replace.js"],"names":["_toConsumableArray","r","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","TypeError","Symbol","iterator","Array","from","isArray","_arrayLikeToArray","_createForOfIteratorHelper","e","t","length","_n4","F","s","n","done","value","f","o","a","u","call","next","return","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","l","i","Object","push","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","arguments","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","configurable","writable","_callSuper","_getPrototypeOf","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","_typeof","_assertThisInitialized","ReferenceError","Boolean","prototype","valueOf","setPrototypeOf","getPrototypeOf","bind","__proto__","_inherits","create","_setPrototypeOf","_classCallCheck","_defineProperties","key","_createClass","_toPrimitive","toPrimitive","String","Number","SELECTREPLACE","classes","focused","disabled","multiple","active","search","listitem","selected","current","nobbled","hidden","image","overview","mobileOverview","action","actions","icon","back","count","up","dn","pgup","pgdn","escape","space","enter","page","$focused","svgIconPath","AndrewMartin","svgSymbolsFile","svgIcon","dropdown","clear","$","fn","selectReplace","this","each","$select","$form","closest","$label","prev","$extra","$wrapper","wrap","parent","$drop","appendTo","$list","find","ndx","$option","$li","val","text","is","addClass","undefined","attr","toLowerCase","prependTo","all","$overviewMobile","$overview","$options","prop","on","preventDefault","stopPropagation","deactivateFilterRanges","trigger","$item","toggleClass","eventName","hasClass","showAll","$items","data","removeClass","parents","list","target","querySelector","drop","parentElement","childElementCount","classList","add","centrePoint","window","innerWidth","getBoundingClientRect","x","countListItems","initial","$selected","not","html","show","hide","eq","document","which","contains","get","$target","$this","autoclose","off","location","assign","selectors","join","split","index","checkValidity","setTimeout","message","confirm","replace","pathname","hash","removeAttr","animate","scrollTop","offset","top","url","width","height","newwindow","open","focus","define","amd","exports","require","jQuery","Zepto","c","d","m","ev","I","p","createElement","className","innerHTML","appendChild","triggerHandler","st","callbacks","charAt","A","currTemplate","closeBtn","closeMarkup","tClose","magnificPopup","instance","init","y","v","after","detach","body","req","abort","g","h","z","w","C","b","j","T","N","k","P","_","S","proto","navigator","appVersion","isLowIE","isIE8","addEventListener","isAndroid","isIOS","supportsTransition","style","transition","pop","probablyMobile","userAgent","popupsCache","isObj","items","toArray","parsed","el","isOpen","types","mainEl","extend","defaults","fixedContentPos","modal","closeOnContentClick","closeOnBgClick","showCloseBtn","enableEscapeKey","bgOverlay","close","_checkIfClose","container","contentContainer","preloader","tLoading","modules","toUpperCase","closeBtnInside","close_replaceWith","type","append","alignTop","css","overflow","overflowY","overflowX","position","fixedBgPos","keyCode","updateSize","wH","_hasScrollBar","_getScrollbarSize","marginRight","isIE7","mainClass","_addClassToMFP","updateItemHTML","_lastFocusedEl","activeElement","content","_setFocus","_onFocusIn","removalDelay","_close","empty","_removeClassFromMFP","currItem","autoFocusLast","prevHeight","documentElement","clientWidth","innerHeight","parseEl","markup","appendContent","preloaded","prepend","tagName","src","addGroup","mfpEl","_openClick","delegate","midClick","ctrlKey","metaKey","altKey","shiftKey","disableOn","updateStatus","status","allowHTMLInStatusIndicator","stopImmediatePropagation","scrollHeight","_parseMarkup","replaceWith","allowHTMLInTemplate","scrollbarSize","cssText","offsetWidth","removeChild","registerModule","options","parseInt","E","hiddenClass","tNotFound","initInline","getInline","inline","parentNode","inlineElement","O","L","M","D","settings","cursor","tError","initAjax","ajax","getAjax","success","xhr","finished","error","loadError","titleSrc","verticalFit","initImage","resizeImage","img","_onImageHasSize","hasSize","clearInterval","isCheckingImgSize","imgHidden","findImageSize","setInterval","naturalWidth","getImage","loaded","alt","complete","clone","title","img_replaceWith","loading","enabled","easing","duration","opener","initZoom","zoom","zIndex","left","_allowZoom","clearTimeout","_getItemToZoom","_getOffset","remove","offsetHeight","B","MozTransform","transform","H","srcAction","patterns","youtube","id","vimeo","gmaps","initIframe","getIframe","iframe","indexOf","substr","lastIndexOf","arrowMarkup","preload","navigateByImgClick","arrows","tPrev","tNext","tCounter","langDir","loop","initGallery","gallery","direction","dir","updateGalleryButtons","counter","arrowLeft","arrowRight","arrowNext","arrowPrev","_preloadTimeout","preloadNearbyImages","goTo","Math","min","_preloadItem","replaceSrc","ratio","initRetina","devicePixelRatio","retina","isNaN","SVG_DEFAULT_PATH","SVG_DEFAULT_PREFIX","Svg","imagePath","imageClassPrefix","setImagePath","path","setImageClassPrefix","prefix","render","prepare","factory","module","wNumb","FormatOptions","strReverse","reverse","strStartsWith","input","match","substring","throwEqualError","Error","isValidNumber","isFinite","formatTo","decimals","thousand","mark","suffix","encoder","decoder","negativeBefore","negative","edit","undo","inputIsNegative","inputPieces","inputBase","originalInput","inputDecimals","output","parseFloat","toFixed","abs","exp","round","formatFrom","strEndsWith","passAll","method","args","inputOptions","optionName","optionValue","filteredOptions","validate","to","instanceUid","Slick","element","dataSettings","accessibility","adaptiveHeight","appendArrows","appendDots","asNavFor","prevArrow","nextArrow","autoplay","autoplaySpeed","centerMode","centerPadding","cssEase","customPaging","slider","dots","dotsClass","draggable","edgeFriction","fade","focusOnSelect","focusOnChange","infinite","initialSlide","lazyLoad","mobileFirst","pauseOnHover","pauseOnFocus","pauseOnDotsHover","respondTo","responsive","rows","rtl","slide","slidesPerRow","slidesToShow","slidesToScroll","speed","swipe","swipeToSlide","touchMove","touchThreshold","useCSS","useTransform","variableWidth","vertical","verticalSwiping","waitForAnimate","initials","animating","dragging","autoPlayTimer","currentDirection","currentLeft","currentSlide","$dots","listWidth","listHeight","loadIndex","$nextArrow","$prevArrow","scrolling","slideCount","slideWidth","$slideTrack","$slides","sliding","slideOffset","swipeLeft","swiping","touchObject","transformsEnabled","unslicked","activeBreakpoint","animType","animProp","breakpoints","breakpointSettings","cssTransitions","focussed","interrupted","paused","positionProp","rowCount","shouldClick","$slider","$slidesCache","transformType","transitionType","visibilityChange","windowWidth","windowTimer","originalSettings","mozHidden","webkitHidden","autoPlay","proxy","autoPlayClear","autoPlayIterator","changeSlide","clickHandler","selectHandler","setPosition","swipeHandler","dragHandler","keyHandler","htmlExpr","registerBreakpoints","activateADA","tabindex","addSlide","slickAdd","addBefore","unload","insertBefore","insertAfter","children","reinit","animateHeight","targetHeight","outerHeight","animateSlide","targetLeft","callback","animProps","animStart","step","now","ceil","applyTransition","disableTransition","getNavTarget","slick","slideHandler","slideTo","buildArrows","buildDots","dot","getDotCount","first","buildOut","wrapAll","setupInfinite","updateDots","setSlideClasses","buildRows","newSlides","numOfSlides","originalSlides","slidesPerSection","createDocumentFragment","row","display","checkResponsive","forceUpdate","breakpoint","targetBreakpoint","respondToWidth","triggerBreakpoint","sliderWidth","hasOwnProperty","unslick","refresh","event","dontAnimate","indexOffset","currentTarget","checkNavigable","navigables","prevNavigable","getNavigableIndexes","cleanUpEvents","interrupt","visibility","cleanUpSlideEvents","orientationChange","resize","cleanUpRows","destroy","fadeSlide","slideIndex","opacity","fadeSlideOut","filterSlides","slickFilter","focusHandler","$sf","getCurrent","slickCurrentSlide","breakPoint","pagerQty","getLeft","verticalHeight","targetSlide","coef","verticalOffset","floor","offsetLeft","outerWidth","getOption","slickGetOption","option","max","indexes","getSlick","getSlideCount","swipedSlide","centerOffset","slickGoTo","creation","setProps","startLoad","loadSlider","initializeEvents","updateArrows","initADA","numDotGroups","tabControlIndexes","slideControlIndex","role","ariaButtonControl","mappedSlideIndex","end","initArrowEvents","initDotEvents","initSlideEvents","initUI","loadRange","rangeStart","rangeEnd","loadImages","imagesScope","imageSource","imageSrcSet","imageSizes","imageToLoad","onload","onerror","prevSlide","nextSlide","progressiveLazyLoad","slickNext","pause","slickPause","play","slickPlay","postSlide","slickPrev","tryCount","$imgsToLoad","initializing","lastVisibleIndex","currentBreakpoint","responsiveSettings","splice","sort","windowDelay","removeSlide","slickRemove","removeBefore","removeAll","setCSS","positionProps","setDimensions","padding","setFade","right","setHeight","setOption","slickSetOption","item","opt","bodyStyle","WebkitTransition","MozTransition","msTransition","OTransform","perspectiveProperty","webkitPerspective","MozPerspective","webkitTransform","msTransform","allSlides","remainder","evenCoef","infiniteCount","toggle","targetElement","sync","animSlide","oldSlide","slideLeft","navTarget","swipeDirection","xDist","yDist","swipeAngle","startX","curX","startY","curY","atan2","PI","swipeEnd","swipeLength","edgeHit","minSwipe","fingerCount","originalEvent","touches","swipeStart","swipeMove","curLeft","positionOffset","verticalSwipeLength","pageX","clientX","pageY","clientY","sqrt","pow","unfilterSlides","slickUnfilter","fromBreakpoint","ret","registeredInModuleLoader","OldCookies","Cookies","api","noConflict","result","attributes","decode","decodeURIComponent","converter","set","expires","Date","toUTCString","JSON","stringify","write","encodeURIComponent","stringifiedAttributes","attributeName","cookie","json","jar","cookies","parts","read","parse","getJSON","withConverter","root","Sifter","diacritics","tokenize","query","trim","regex","letter","tokens","words","escape_regex","DIACRITICS","RegExp","string","object","is_array","getScoreFunction","fields","token_count","nesting","prepareSearch","field_count","scoreValue","token","score","pos","scoreObject","getattr","sum","conjunction","getSortFunction","self","field","fields_count","multiplier","multipliers","get_field","implicit_score","sort_empty","unshift","cmp","option_fields","option_sort","option_sort_empty","total","fn_sort","fn_score","limit","asciifold","obj","names","shift","str","q","chunk","foreignletters","lookup","regexp","foreignletter","MicroPlugin","Interface","plugins","initializePlugins","queue","requested","utils","loadPlugin","plugin","vArg","Selectize","highlight","$element","pattern","node","skip","nodeType","spannode","middlebit","splitText","middleclone","cloneNode","replaceChild","childNodes","removeHighlight","firstChild","nodeName","normalize","MicroEvent","fct","_events","mixin","destObject","props","IS_MAC","KEY_CMD","KEY_CTRL","SUPPORTS_VALIDITY_API","validity","isset","hash_key","escape_html","hook","original","debounce_events","event_args","getSelection","start","selectionStart","selectionEnd","selection","sel","createRange","selLen","moveStart","autoGrow","$input","currentWidth","update","printable","placeholder","character","$parent","force","fromCharCode","$testInput","whiteSpace","$from","$to","properties","styles","transferStyles","domToString","tmp","selectize","delay","timeout","computedStyle","getComputedStyle","getPropertyValue","currentStyle","order","tabIndex","tagType","eventNS","highlightedValue","isBlurring","isDisabled","isRequired","isInvalid","isLocked","isFocused","isInputHidden","isSetup","isShiftDown","isCmdDown","isCtrlDown","ignoreFocus","ignoreBlur","ignoreHover","hasOptions","currentResults","lastValue","caretPos","loadedSearches","$activeOption","$activeItems","optgroups","userOptions","renderCache","onSearchChange","loadThrottle","sifter","registerOption","registerOptionGroup","mode","maxItems","hideSelected","setupCallbacks","setupTemplates","setup","explanation","console","component","group","groupEnd","$control","$control_input","$dropdown","$dropdown_content","$dropdown_parent","inputMode","classes_plugins","inputId","selector","$window","$document","wrapperClass","inputClass","dropdownParent","dropdownClass","dropdownContentClass","copyClassesToDropdown","splitOn","delimiter","delimiterEscaped","onOptionHover","onOptionSelect","onItemSelect","child","mousedown","onMouseDown","click","onClick","keydown","onKeyDown","keyup","onKeyUp","keypress","onKeyPress","positionDropdown","blur","onBlur","onFocus","paste","onPaste","has","revertSettings","$children","setValue","refreshState","updateOriginalInput","refreshItems","updatePlaceholder","disable","onChange","field_label","labelField","field_optgroup","optgroupLabelField","templates","optgroup","optgroup_header","option_create","initialize","change","item_add","item_remove","option_add","option_remove","option_clear","optgroup_add","optgroup_remove","optgroup_clear","dropdown_open","dropdown_close","load","defaultPrevented","isDefaultPrevented","setActiveItem","isFull","pastedText","splitInput","createItem","selectAll","$next","getAdjacentOption","setActiveOption","$prev","advanceSelection","selectOnTab","deleteSelection","refreshOptions","wasFocused","showInput","openOnFocus","dest","deactivate","setTextboxValue","setCaret","createOnBlur","closeAfterSelect","lastQuery","addItem","loadingClass","results","addOption","getValue","silent","addItems","idx","begin","swap","$last","hideInput","scroll","height_menu","height_item","scroll_top","scroll_bottom","stop","scrollDuration","getSearchOptions","sortField","searchField","searchConjunction","calculateScore","triggerDropdown","groups","groups_order","option_html","html_children","has_create_option","$active","$active_before","$create","active_before","maxOptions","optgroupField","lockOptgroupOrder","$order","dom","canCreate","addPrecedence","valueField","optgroupValueField","addOptionGroup","removeOptionGroup","clearOptionGroups","updateOption","$item_new","value_new","index_item","cache_items","cache_options","order_old","getItem","removeOption","removeItem","clearOptions","getElementWithValue","$els","getAttribute","values","buffer","isPending","control","value_next","wasFull","insertAtCaret","persist","caret","lock","called","unlock","refreshValidityState","refreshClasses","invalid","isEmptyObject","opts","label","$el","option_select","$option_select","$tail","onDelete","tail","valueLength","advanceCaret","$adj","$child","before","enable","removeData","templateName","cache","disabledField","clearCache","createFilter","allowEmptyOption","dataAttr","settings_user","attr_data","field_value","field_disabled","field_optgroup_label","field_optgroup_value","tag_name","settings_element","optionsMap","readData","arr","$optgroup","init_select","data_raw","init_textbox","support","sortable","forcePlaceholderSize","ui","helper","headerClass","titleRowClass","labelClass","closeClass","$dropdown_header","equalizeWidth","equalizeHeight","getScrollbarWidth","div","doc","equalizeSizes","height_max","width_last","width_parent","$optgroups","thisRef","render_item","html_container","html_element","multiClose","context","singleClose","installedModules","__webpack_require__","moduleId","getter","toStringTag","__esModule","ns","property","__webpack_exports__","argumentAsArray","argument","isElement","Node","eachNode","nodeList","NodeList","isElementList","throwError","concat","arrayAsSelector","array","nodeListAsArray","nodes","findParentBySelector","$root","querySelectorAll","elementHasSelector","elementHasOverflowHidden","elementScrollTopOnStart","elementScrollTopOnEnd","elementScrollLeftOnStart","scrollLeft","elementScrollLeftOnEnd","scrollWidth","_defineProperty","disablePageScroll","enablePageScroll","getScrollState","clearQueueScrollLocks","scroll_lock_getTargetScrollBarWidth","scroll_lock_getCurrentTargetScrollBarWidth","getPageScrollBarWidth","getCurrentPageScrollBarWidth","scroll_lock_addScrollableTarget","scroll_lock_removeScrollableTarget","scroll_lock_addScrollableSelector","scroll_lock_removeScrollableSelector","scroll_lock_addLockableTarget","scroll_lock_addLockableSelector","scroll_lock_setFillGapMethod","scroll_lock_addFillGapTarget","scroll_lock_removeFillGapTarget","scroll_lock_addFillGapSelector","scroll_lock_removeFillGapSelector","refillGaps","FILL_GAP_AVAILABLE_METHODS","state","scrollableSelectors","lockableSelectors","fillGapSelectors","fillGapMethod","startTouchY","startTouchX","scroll_lock_hideLockableOverflow","fillGaps","scroll_lock_showLockableOverflow","unfillGaps","onlyExists","currentOverflowYProperty","documentWidth","borderLeftWidthCurrentProperty","borderLeftWidth","borderRightWidthCurrentProperty","borderRightWidth","_currentWidth","map","$targets","setAttribute","removeAttribute","sSelector","methods","scroll_lock_fillGapTarget","scroll_lock_unfillGapTarget","scroll_lock_fillGapSelector","fSelector","scroll_lock_unfillGapSelector","scroll_lock_hideLockableOverflowSelector","scroll_lock_showLockableOverflowSelector","scroll_lock_hideLockableOverflowTarget","scroll_lock_showLockableOverflowTarget","isLockable","scrollBarWidth","$lockableParent","currentMargin","maxWidth","currentPadding","paddingRight","currentFillGapMethod","currentClientY","currentClientX","down","directionWithOffset","handle","parentScrollableEl","elementIsInputRange","elementIsScrollableField","prevent","cancelable","passive","deprecatedMethods","getState","getWidth","getCurrentWidth","setScrollableTargets","setFillGapSelectors","setFillGapTargets","clearQueue","scrollLock","source","sym","_objectSpread","getTargetScrollBarWidth","getCurrentTargetScrollBarWidth","addScrollableSelector","removeScrollableSelector","addScrollableTarget","removeScrollableTarget","addLockableSelector","addLockableTarget","addFillGapSelector","removeFillGapSelector","addFillGapTarget","removeFillGapTarget","setFillGapMethod","_state","globalThis","PhotoSwipe","vendor","_this","listener","_this2","getViewportSizeFn","paddingFn","currZoomLevel","center","pswp","dispatch","reset","viewportSize","panAreaSize","itemData","elementSize","fit","fill","vFill","secondary","zoomLevels","slideData","isActive","currIndex","currentResolution","pan","isFirstSlide","contentLoader","getContentBySlide","holderElement","heavyAppended","bounds","prevDisplayedWidth","prevDisplayedHeight","activate","transformOrigin","calculateSize","updateContentSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","hasSlide","panTo","sizeChanged","setDisplayedSize","_this3","isZoomable","destZoomLevel","centerPoint","transitionDuration","animations","stopAllPan","setZoomLevel","calculateZoomToPanOffset","startTransition","isPan","getCurrentTransform","onComplete","zoomTo","zoomAnimationDuration","getViewportCenterPoint","correctPan","currSlide","gestures","startPan","stopAll","_this$gestures","p1","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","panY","applyBgOpacity","velocity","_this$pswp","getCurrSlideX","moveIndexBy","correctZoomPan","_this4","bgOpacity","startSpring","dampingRatio","onUpdate","_this$gestures2","_this$pswp2","isPannable","moveTo","allowPanToNext","_this$gestures3","startP1","p2","startP2","pinchToClose","naturalFrequency","point","toggleZoom","clickToCloseNonZoomable","_this5","prevP2","Z","R","PointerEvent","supportsTouch","maxTouchPoints","U","V","isDragging","isZooming","raf","G","drag","tapHandler","events","scrollWrap","ontouchmove","ontouchend","onPointerDown","onPointerMove","onPointerUp","pointerType","button","mouseDetected","K","W","X","Y","J","tt","it","ht","requestAnimationFrame","et","_this6","doubleTapAction","doubleTap","tap","cancelAnimationFrame","applyFilters","findIndex","pointerId","nt","identifier","ot","rt","lt","itemHolders","_this7","spacing","getNumItems","_this8","potentialIndex","canLoop","getLoopedIndex","stopMainScroll","isMainScroll","updateCurrItem","setContent","resetPosition","setIsActive","updateLazy","Escape","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Tab","_this9","ct","trapFocus","initialPointerPos","dt","ut","vt","returnFocus","escKey","arrowKeys","template","_this0","_t$onFinish","onFinish","_t$duration","_t$easing","ft","wt","gt","yt","_t","xt","removeEventListener","bt","St","zt","cos","sin","_this1","Mt","_t$onFinish2","easeFrame","activeAnimations","Pt","_this10","some","Ct","deltaX","deltaY","wheelToZoom","deltaMode","isButton","ariaLabel","isCustomSVG","size","outlineID","inner","onInit","onclick","topBar","isLoading","preloaderDelay","updatePreloaderVisibility","innerText","indexIndicatorSep","isRegistered","uiElementsData","Tt","_this11","registerElement","At","_this$pswp3","isClosing","imageClickAction","decoding","displayedImageWidth","displayedImageHeight","isAttached","isDecoding","_this12","keepPlaceholder","usePlaceholder","msrc","isLazy","isImageContent","loadImage","_this13","updateSrcsetSizes","srcset","onLoaded","onError","removePlaceholder","displayError","isError","dataset","largestUsedSize","sizes","errorMsg","_this14","catch","finally","appendImage","createContentFromData","Q","Dt","loadSlideByIndex","getContentByIndex","getItemData","addToCache","setSlide","removeByIndex","isClosed","isOpening","It","Et","Lt","kt","Zt","Bt","Ft","Ot","Rt","Nt","Ut","_this15","hideAnimationDuration","maxWidthToAnimate","Vt","showAnimationDuration","showHideAnimationType","showHideOpacity","Gt","getThumbBounds","getPlaceholderElement","$t","bg","innerRect","qt","willChange","_this16","Promise","resolve","Ht","setProperty","Kt","Wt","jt","Xt","_this17","bgClickAction","tapAction","_ref","_class","_this18","ii","si","isDestroying","hasMouse","hi","keyboard","_this19","ei","scrollWheel","pageYOffset","ni","oi","_i10","Yt","_this20","matchMedia","matches","_this21","setScrollOffset","appendHolders","appendToEl","thumbBounds","thumbSelector","thumbCropped","_ref2","_class2","dataSource","Qt","numItems","Element","ti","childSelector","pswpSrc","href","pswpSrcset","pswpWidth","pswpHeight","pswpType","currentSrc","pswpCropped","cropped","_class3","Jt","priority","addFilter","removeFilter","_this22","_len","_key","_this23","PhotoSwipeLightbox","_this24","_this25","_this26","_ref3","_class4","_this27","shouldOpen","onThumbnailsClick","_this28","gallerySelector","getClickedIndex","loadAndOpen","getClickedIndexFn","_this29","pswpModule","openPromise","preloadFirstSlide","then","_this30","default","_this31","_ref4","_class5","_class6","_this32","_len2","_key2","_this33","cleanData","_cleanData","elems","elem","_remove","keepData","widget","base","fullName","namespace","Widget","expr","_createWidget","basePrototype","widgetName","widgetEventPrefix","widgetBaseClass","bridge","isMethodCall","returnValue","methodValue","isFunction","_init","_getCreateOptions","_create","_trigger","metadata","unbind","_setOptions","_setOption","orig","Event","canvas","backdrop","debug","_debug","_canvas","_findElement","_backdrop","backgroundImage","backgroundRepeat","_width","_height","_left","_top","_updatePositionFromCoords","_updatePosition","log","basketChange","basketChangeTimeout","AMURL","build","querystring","paramsToQueryString","params","pairs","queryStringToParams","queryString","pair","setQueryStringParam","STATE","getParams","getChanged","oldParams","changed","setParam","setState","setHash","protocol","hostname","history","pushState","getUrl","pushUrl","replaceUrl","replaceState","getStorage","localStorage","sessionStorage","save","activate_sel","setItem","scope","$scope","stored","kav","triggered","loadHandlers","updateHeaderBasket","price","qty","disableCheckoutButton","checkMaxStock","disableButton","maximum","updateBufferTime","serialize","payload","table","sliders","filterUrl","updateAjax","grid","listingItem","ListingItem","fromItemNum","toItemNum","productCount","handlePaintLinks","updateFilterRanges","allRanges","updateFilterRangesOverview","column","rangeIsDefault","updateFilterRangesSelection","capitalize","range","noUiSlider","activateFilterRanges","checkFilterCount","filterCount","filterType","onpopstate","reload","hasAttribute","form","tag","valid","windowResizing","oldMode","moveElement","setBoth","allowed","onfocus","onkeypress","charCode","dimension","minInput","maxInput","onchange","format","connect","siblings","URL","load_more","searchParams","more","initProductGallery","videoContainer","video","thumbnail","player","videojs","watchVideo","pauseVideo","aspectRatio","initGalery","getElementById","HAZE","instantiate","hazeGallery","popupScroll","$button","fadeIn","fadeOut","CYLINDO","cylindoGallery","$popup","cylindo","newsletter","initPopups","link","ready","price_str","rollsTxt","rolls","fadeTo","submit","newItems","loadMore","decimal_places","minimum","total_qty","quantities","products","sku","product_price","fromPrice","sizePrice","updateBatchPrices","getQueryParameters","setQueryParameters","showAllColours","firstElementChild","textContent","app","eventType","HTMLElement","SVGElement","GTM","dataLayerName","addData","ecommerce","dataLayer","timeoutId","productData","tracking","hasRedirected","google_tag_manager","currencyCode","actionField","eventCallback","eventTimeout","ajaxSuccess","request","clearEcommerce","showMoreButton","updateFinancing","fdOptions","$finTable","fdPrice","tdDetails","fdMinPrice","fdOpt","code","depositPerc","FinanceDetails","m_inst","d_amount","apr","p_name","cur","goods_val","d_pc","l_amount","term","l_repay","Loop","PaintQuantityCalculator","svg","quantity","inputs","validCharacters","exists","calculate","resetForm","confirmQuantity","validateInputs","checkValue","validateInputKeypress","onblur","validateInputBlur","AddToBasketPlugin","totalPrice","flyout","_this34","Overlay","wait_for_scripts","modifiers","flyoutupsell","upsellContainer","upsellContinueForm","upsellsArray","upsells","layoutClass","upsell","returnUpsellElement","insertAdjacentHTML","returnHiddenInput","qtyField","QuantityControl","upsellAddButton","qtyContainer","previousElementSibling","getCount","upsellCount","basketText","thumbnail_alt","_this35","disableBasketButton","refreshAfterAjax","openUpsellBasket","openBasket","fail","MultiProduct","_this36","updatePrice","updateWishlistAdd","initMultiSizeSelect","pieces","single_qty","getProducts","combination","sendToBasket","zeroQuantities","_this37","productSizeSelect","quantityStep","quantityPrice","selectedSize","selectedSizeSKU","selectedSizePrice","bubbles","dispatchEvent","selectElements","multiproduct","FlyoutUpsell","_this38","hiddenInputs","serializeArray","entry","TradeMaterial","_this39","optionsArray","optionsString","$visibleInputs","updateReserveText","hideReserveBlock","hideMaterialBlock","batch_price","selectedIndex","baseAction","tradematerial","SingleProduct","_this40","formId","singleproduct","Sample","_this41","sample","specification","offer","has_offer","price_raw","currency","basket_url","stock_message","select","delivery_information","paintQuantityCalculator","Viewport","mediaQuery","customMediaQuery","customMatchMedia","customMatches","PaintMap","links","random","xDirection","yDirection","paintMapResults","global","VERSION","Function","ArrayProto","ObjProto","SymbolProto","supportsArrayBuffer","ArrayBuffer","supportsDataView","DataView","nativeIsArray","nativeKeys","nativeCreate","nativeIsView","isView","_isNaN","_isFinite","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","MAX_ARRAY_INDEX","restArguments","func","startIndex","rest","isObject","isUndefined","isBoolean","tagTester","isString","isNumber","isDate","isRegExp","isSymbol","isArrayBuffer","nodelist","Int8Array","isFunction$1","hasObjectTag","hasDataViewBug","isIE11","Map","isDataView","isDataView$1","getInt8","has$1","isArguments","isArguments$1","isNaN$1","constant","createSizePropertyCheck","getSizeProperty","collection","sizeProperty","shallowProperty","getByteLength","isBufferLike","typedArrayPattern","isTypedArray$1","getLength","collectNonEnumProps","emulatedSet","nonEnumIdx","isMatch","attrs","_keys","_$1","_wrapped","toBufferView","bufferSource","Uint8Array","byteOffset","toJSON","tagDataView","allKeys","ie11fingerprint","weakMapMethods","forEachName","commonInit","mapTail","mapMethods","setMethods","isMap","isWeakMap","isSet","isWeakSet","invert","functions","createAssigner","keysFunc","extendOwn","baseCreate","Ctor","toPath$1","toPath","deepGet","defaultValue","identity","matcher","optimizeCb","argCount","accumulator","baseIteratee","iteratee","Infinity","cb","noop","getTime","createEscaper","escaper","testRegexp","replaceRegexp","escapeMap","_escape","_unescape","templateSettings","evaluate","interpolate","noMatch","escapes","escapeRegExp","escapeChar","bareIdentifier","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","bound","callArgs","isArrayLike","flatten$1","depth","strict","stack","frame","bindAll","wait","defer","negate","predicate","times","memo","once","findKey","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","currentKey","createReduce","reducer","reduce","reduceRight","every","fromIndex","guard","invoke","contextPath","pluck","computed","lastComputed","reStrSymbol","last","rand","temp","behavior","partition","groupBy","indexBy","countBy","pass","keyInObj","pick","omit","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","_chain","chain","allExports","isNull","isTypedArray","isEmpty","isEqual","todo","aStack","bStack","areArrays","aCtor","bCtor","interceptor","mapObject","propertyOf","accum","unescape","oldSettings","variable","fallback","uniqueId","memoize","hasher","address","throttle","previous","later","leading","throttled","_now","remaining","trailing","cancel","debounce","immediate","passed","debounced","_args","wrapper","compose","detect","findWhere","collect","foldl","inject","foldr","reject","any","includes","include","where","shuffle","sortBy","criteria","head","take","compact","flatten","unique","intersection","argsLength","transpose","paintMap","scrollToEl","Carousel","viewport","slickArrow","unslickable","watch","playVideo","watchFilter","carousel","_this42","filtered","setFilter","unsetFilter","carousels","activeButton","activeSlideIndex","currentSlideElement","heroItemRightExists","slickDots","heroItem","observer","IntersectionObserver","_ref5","isIntersecting","hero_banner_id","gaId","hero_banner","gaLabel","hero_banner_position","disconnect","observe","tablet","prevButton","nextButton","photoswipe","photoswipeEl","_step","dataSourceImages","photoSwipeButtons","leftArrow","rightArrow","arrowPrevSVG","arrowNextSVG","initButton","clickedIndex","photoswipeId","_iterator","err","siteNoticeMessages","siteNotice","loopMessages","bloomreach","exponea","email","identify","email_id","klaviyo","_klOnsite","Proxy","checkReplace","customCheckReplace","isTrigger","isNumeric","addClassFor","asArray","countDecimals","numStr","getPageOffset","supportPageOffset","pageXOffset","isCSS1Compat","compatMode","subRangeRatio","pa","pb","fromPercentage","getJ","toStepping","xVal","xPct","va","vb","toPercentage","getStep","xSteps","snap","handleEntryPoint","that","percentage","xHighestCompleteStep","handleStepPoint","totalSteps","xNumSteps","highestStep","Spectrum","singleStep","ordered","getMargin","fromStepping","isPercentage","getNearbySteps","stepBefore","startValue","thisStep","stepAfter","countStepDecimals","stepDecimals","convert","defaultFormatter","validateFormat","isValidFormatter","testStep","testRange","spectrum","testStart","handles","testSnap","testAnimate","testAnimationDuration","animationDuration","testConnect","testOrientation","ort","testMargin","margin","testLimit","testPadding","testDirection","testBehaviour","fixed","hover","testTooltips","tooltips","formatter","testAriaFormat","ariaFormat","testFormat","testCssPrefix","cssPrefix","testCssClasses","cssClasses","testUseRaf","useRequestAnimationFrame","testOptions","tests","orientation","behaviour","origin","handleLower","handleUpper","horizontal","background","ltr","tooltip","pips","pipsHorizontal","pipsVertical","marker","markerHorizontal","markerVertical","markerNormal","markerLarge","markerSub","valueHorizontal","valueVertical","valueNormal","valueLarge","valueSub","styleOposite","closure","originalOptions","scope_Base","scope_Handles","scope_Connects","scope_Self","scope_Pips","tips","pointerEnabled","move","msPointerEnabled","supportsPassive","CSS","supports","getSupportsPassive","scope_Target","scope_Locations","scope_HandleNumbers","scope_ActiveHandle","scope_Spectrum","scope_Values","scope_Events","scope_Listeners","scope_Document","ownerDocument","scope_DocumentElement","scope_Body","addNodeTo","addOrigin","handleNumber","addConnect","addTooltip","addMarking","spread","filterFunc","valueSizeClasses","markerSizeClasses","valueOrientationClasses","markerOrientationClasses","getClasses","sizeClasses","addSpread","removePips","density","stepped","getGroup","safeIncrement","increment","firstInRange","lastInRange","ignoreFirst","ignoreLast","prevPct","newPct","pctDifference","steps","realSteps","stepsize","generateSpread","baseSize","rect","attachEvent","pageOffset","touch","mouse","pointer","changedTouches","points","fixEvent","buttons","calcPoint","calcPointToPercentage","docElem","proposal","clientTop","clientLeft","moveHandles","upward","locations","handleNumbers","proposals","checkHandlePosition","setHandle","fireEvent","targetEvent","documentLeave","relatedTarget","eventEnd","eventMove","buttonsProperty","movement","startCalcPoint","setZindex","eventStart","moveEvent","endEvent","outEvent","eventTap","getClosestHandle","eventHover","reference","lookBackward","lookForward","toPct","pct","stateUpdate","updateConnect","updateHandlePosition","valueSet","fireSetEvent","isInit","valueGet","bindEvent","namespacedEvent","addSlider","connectOptions","addElements","nearbySteps","decrement","tEvent","tNamespace","__moveHandles","updateOptions","optionsToUpdate","updateAble","newOptions","handleBefore","handleAfter","eventHolders","eventHolder","unencoded","formattedValue","positions","version","noZensmooth","install","zenscroll","isNativeSmoothScrollEnabledOn","makeScroller","defaultDuration","edgeOffset","scrollTimeoutId","setScrollTimeoutId","newValue","stopScroll","getTopWithEdgeOffset","getTopOf","scrollToY","targetY","onDone","toY","getY","distance","startTime","loopScroll","getHeight","scrollToElem","newDefaultDuration","newEdgeOffset","intoView","elemHeight","elemBottom","containerHeight","containerBottom","moving","getDocY","scrollY","scrollingElement","scrollTo","clientHeight","offsetTop","createScroller","scrollContainer","isHistorySupported","isScrollRestorationSupported","scrollRestoration","zenscrollY","targetElem","diff","RE_noZensmooth","anchor","historyState","heroButtons","accordion","mouseenter","setSlickDotsTop","bottom","getHeroContentHeight","resetDots","heights","checkHomePage","header","checkMobile","setupSampleModal","clicked","span","stackDots","initProductVideos","flash","swf","muted","isDesktop","checkHash","reInit","socials","social","productGrid","bindEventListenersToAccordionTabs","tab","checkCustomiserSelection"],"mappings":"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","file":"../../javascript/global.js","sourcesContent":["\nvar SELECTREPLACE = {\n    classes: {\n        focused:  'multi-select-replace--focused',\n        disabled: 'multi-select-replace--disabled',\n        // single:   'multi-select-replace--single',\n        multiple: 'multi-select-replace--multiple',\n        active: 'multi-select-replace--active',\n        search:   'multi-select-replace--search',\n        listitem: 'multi-select-replace__list-item',\n        selected: 'multi-select-replace__list-item--selected',\n        current:  'multi-select-replace__list-item--current',\n        nobbled:  'multi-select-replace__list-item--disabled',\n        hidden:   'multi-select-replace__list-item--hidden',\n        image:    'multi-select-replace__list-item--image',\n        overview: 'multi-select-replace__overview',\n        mobileOverview: 'multi-select-replace__mobile-overview',\n        action:   'multi-select-replace__action',\n        actions:  'multi-select-replace__actions',\n        icon:     'multi-select-replace__icon',\n        back:     'multi-select-replace__back',\n        count:    'multi-select-replace__count'\n    },\n\n    keys: {\n        up:     38,\n        dn:     40,\n        pgup:   33,\n        pgdn:   34,\n        escape: 27,\n        space:  32,\n        enter:  13,\n    },\n\n    page: 5,\n\n    $focused: false,\n\n    svgIconPath: AndrewMartin.svgSymbolsFile,\n    svgIcon: {\n        back: 'icon-select',\n        dropdown: 'icon-select',\n        selected: 'icon-tick',\n        clear: 'icon-close'\n    }\n};\n\n// Styled select elements\n$.fn.selectReplace = function() {\n    $(this).filter(':not(.multi-select-replaced)').each(function() {\n        var $select = $(this);\n\n        var $form     = $select.closest('form');\n        var $label    = $select.prev('label');\n        var $extra    = $select.next('.filterable__extra-content');\n        var $wrapper  = $select.wrap('<div class=\"multi-select-replace\"></div>').parent();\n        var $input    = $('<input class=\"multi-select-replace__search\">').appendTo($wrapper);\n        var $drop     = $('<div class=\"multi-select-replace__drop\"></div>').appendTo($wrapper);\n        var $up       = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--up\"></a>').appendTo($drop);\n        var $down     = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--down\"></a>').appendTo($drop);\n\n        var $list = $('<ul class=\"multi-select-replace__list\"></ul>');\n\n        $select.find('option').each(function(ndx) {\n            var $option = $(this);\n\n            var $li = $('<li class=\"' + SELECTREPLACE.classes.listitem + '\" data-value=\"' + $option.val() + '\"><a href=\"#0\">' + $option.text() + '</a></li>');\n\n            if ($option.is('[data-hidden]')) {\n                $li.addClass(SELECTREPLACE.classes.hidden);\n            }\n\n            if ($option.is(':disabled')) {\n                $li.addClass(SELECTREPLACE.classes.nobbled);\n            }\n\n            if ($option.attr('data-image') !== undefined) {\n                $('<img src=\"' + $option.attr('data-image') + '\" />').appendTo($li);\n                $li.addClass(SELECTREPLACE.classes.image);\n            }\n\n            $li.appendTo($list);\n\n            var $icon = $('<span class=\"multi-select-replace__status\"><svg class=\"' + SELECTREPLACE.svgIcon.selected + '\">\\\n                <use xlink:href=\"' + SELECTREPLACE.svgIconPath + '#' + SELECTREPLACE.svgIcon.selected + '\" />\\\n            </svg></span>').appendTo($li);\n\n\n            if ($option.text().toLowerCase() == 'multicoloured') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch multi-select-replace__swatch--multicoloured\"></div>').prependTo($li);\n            } else if ($option.attr('color') !== '') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch\" style=\"color: ' + $option.attr('color') + ';\"></div>').prependTo($li);\n            }\n        });\n\n        var all = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--all\">Select all</span>';\n        var clear = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--clear\">Clear all</span>';\n\n        var $overviewMobile = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-1\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overviewMobile.appendTo($drop);\n\n        var $overview = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-2\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overview.appendTo($drop);\n\n        $list.appendTo($drop);\n\n        if ($extra) {\n            $extra.appendTo($drop);\n        }\n\n        var $options = $list.find('li');\n\n        $wrapper.addClass(SELECTREPLACE.classes.multiple);\n\n        if ($select.prop('id')) {\n            $select.parent().prop('id', $select.prop('id') + '_replace');\n        }\n\n        $select.addClass('multi-select-replaced');\n\n        $label.on('click', function(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            deactivateFilterRanges($('.js-filter-ranges'))\n            if (SELECTREPLACE.$focused) {\n                if (SELECTREPLACE.$focused !== $wrapper) {\n                    // clicked a different select\n                    SELECTREPLACE.$focused.trigger('_blur');\n\n                    $wrapper.trigger('_focus');\n                } else {\n                    $wrapper.trigger('_blur');\n                }\n            } else {\n                $wrapper.trigger('_focus');\n            }\n        });\n\n        $list.on('click', '.' + SELECTREPLACE.classes.listitem, function(e) {\n            e.preventDefault();\n\n            var $item = $(this);\n\n            // if ($item.data('value') != 'all') {\n                $item.toggleClass(SELECTREPLACE.classes.selected);\n\n                var eventName = $item.hasClass(SELECTREPLACE.classes.selected) ? '_selected' : '_unselected';\n\n                $select.trigger(eventName, this);\n            // }\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.back, function(e) {\n            $wrapper.trigger('_blur');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.actions, function(e) {\n            var $items = $list.find('.' + SELECTREPLACE.classes.listitem)//.not($item);\n\n            var showAll;\n\n            $wrapper.find('.' + SELECTREPLACE.classes.actions).each(function() {\n                var $item = $(this).parent();\n                $item.data('active', !$item.data('active'));\n\n                showAll = $item.data('active');\n\n                $overviewMobile.attr('data-all', showAll);\n                $overview.attr('data-all', showAll);\n            });\n\n            $items.each(function() {\n                var $item = $(this);\n                var eventName = '_unselected';\n                $item.removeClass(SELECTREPLACE.classes.selected);\n\n                if (showAll) {\n                    $item.addClass(SELECTREPLACE.classes.selected);\n                    eventName = '_selected';\n                }\n\n                $select.trigger(eventName, this);\n            });\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('_focus', function(e) {\n            SELECTREPLACE.$focused = $wrapper;\n            $wrapper.addClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').addClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').addClass('filterable__content--active');\n            countListItems(e)\n        });\n\n        // Count number of li's\n\n        function countListItems(e) {\n\n            var list = e.target.querySelector('.multi-select-replace__list')\n            var drop = list.parentElement\n\n            if ( list.childElementCount > 17) {\n                list.classList.add('multi-select-replace__list--large')\n                drop.classList.add('multi-select-replace__drop--large')\n\n            } else if ( list.childElementCount >= 7) {\n                list.classList.add('multi-select-replace__list--medium')\n\n            } else if ( list.childElementCount <= 6) {\n                list.classList.add('multi-select-replace__list--small')\n            }\n\n            var centrePoint = (window.innerWidth / 2);\n\n            if (drop.getBoundingClientRect().x > centrePoint) {\n                drop.classList.add('multi-select-replace__drop--right-align')\n            }\n        }\n\n        $wrapper.on('_blur', function() {\n            SELECTREPLACE.$focused = false;\n            $wrapper.removeClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').removeClass('filterable__content--active');\n        });\n\n        $wrapper.on('_change', function(e, initial) {\n            var $selected = $options.filter('.' + SELECTREPLACE.classes.selected).not('[data-value=\"all\"]');\n            var $items = $options.not('[data-value=\"all\"]');\n\n            var selectValue = '';\n            if ($select.data('blank') !== undefined) {\n                selectValue = $select.data('blank');\n            }\n\n            var html = '';\n\n            if ($selected.length) {\n                $selected.each(function(i) {\n                    html += $(this).find('a').html();\n\n                    if (i < $selected.length - 1) {\n                        html += ', ';\n                    }\n                });\n                selectValue = $selected.length + ' selected';\n                $wrapper.addClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().addClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').show();\n            } else {\n                html = 'None selected';\n                $wrapper.removeClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().removeClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').hide();\n            }\n\n            $wrapper.find('.' + SELECTREPLACE.classes.count).html($selected.length);\n\n            if ($selected.length > 0) {\n                $label.find('.js-filterable__count').html('(' + $selected.length + ')');\n            } else {\n                $label.find('.js-filterable__count').html('');\n            }\n\n            if ($selected.length == 0) {\n                $overview.data('active', false);\n                $overview.attr('data-all', false);\n                $overviewMobile.attr('data-all', false);\n            } else {\n                $overview.data('active', true);\n                $overview.attr('data-all', true);\n                $overviewMobile.attr('data-all', true);\n            }\n\n            // $value.html(selectValue);\n            $wrapper.find('.' + SELECTREPLACE.classes.overview).html(html).attr('data-is-empty', $selected.length == 0);\n\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($options.eq(ndx).hasClass(SELECTREPLACE.classes.selected)) {\n                    $option.prop('selected', true);\n                } else {\n                    $option.prop('selected', null);\n                }\n            });\n\n            if (!initial) {\n                $select.trigger('change', initial);\n            }\n        });\n\n        $(document).on('keydown', function(e) {\n            if (!SELECTREPLACE.$focused) {\n                return;\n            }\n\n            if (e.which == SELECTREPLACE.keys.escape) {\n                $wrapper.trigger('_blur');\n            }\n        });\n\n        $select.on('_change', function() {\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($option.prop('selected')) {\n                    $li = $options.eq(ndx);\n                    $li.addClass(SELECTREPLACE.classes.selected);\n                }\n            });\n        });\n\n        $form.on('reset', function(e) {\n            $options.removeClass(SELECTREPLACE.classes.selected);\n            $wrapper.trigger('_change');\n        });\n\n        $select.trigger('_change', true);\n    });\n};\n\n$(document).on('click', function(e) {\n    if (SELECTREPLACE.$focused) {\n        if (!$.contains(SELECTREPLACE.$focused.get(0), e.target)) {\n            // clicked outside of the current select\n            SELECTREPLACE.$focused.trigger('_blur');\n        }\n    }\n});\n\n$('select[multiple]').selectReplace();\n\n\n/*\n * Copyright 2014 D3R Ltd\n * http://d3r.com\n *\n * D3R Standard Javascript\n *\n * You'll want at least:\n\n    .js .d3r-show,\n    .js .d3r-hide {\n        cursor: pointer;\n    }\n    .js .d3r-hidden {\n        display: none;\n    }\n    .js .d3r-shown {\n        display: block;\n    }\n    .d3r-chooser {\n\n    }\n        .d3r-chooser-option,\n        .d3r-multichooser-option {\n            display: none;\n        }\n *\n */\n\n// hidey showey\n$(document).on('click', '.d3r-show, .d3r-hide', function(e) {\n    var $this = $(this),\n        $target;\n    if ($this.is('a')) e.preventDefault();\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href')[0]) {\n        $target = $($this.attr('href'));\n    }\n    if ($target.length) {\n        var hide = $this.hasClass('d3r-hide');\n        $target[hide ? 'toggleClass' : 'addClass']('d3r-shown');\n        $this[hide ? 'toggleClass' : 'addClass']('d3r-active');\n    }\n    if ($target.hasClass('d3r-shown') && $this.hasClass('d3r-autoclose')) {\n        var autoclose = function(e) {\n            if (!$.contains($target[0], e.target)) {\n                if ($target.hasClass('d3r-shown')) {\n                    e.preventDefault();\n                    $target.removeClass('d3r-shown');\n                    $this.removeClass('d3r-active');\n                }\n                $(document).off('click', autoclose);\n            }\n        };\n        $(document).on('click', autoclose);\n    }\n});\n// redirect from dropdowns\n$(document).on('change', 'select.d3r-redirector', function(e) {\n    window.location.assign($(this).val());\n});\n// display things based on dropdowns\n$(document).on('change', 'select.d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('id')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n    if ($this.val()) {\n        selectors.push('#' + $this.val());\n    }\n\n    $options.filter(selectors.join(',')).addClass('d3r-shown');\n});\n$(document).on('change', 'select.d3r-multichooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-multichooser-option').filter('[data-multichooser=\"'+$this.attr('id')+'\"]'),\n        $option = $('option:selected', this);\n    $options.removeClass('d3r-shown');\n    $.each($option.data('values').split(' '), function(index, val) {\n        var selectors = ['[data-chooservalue=\"' + val + '\"]'];\n\n        if (val) {\n            selectors.push('#' + val);\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    });\n});\n$(document).on('change', 'input[type=\"radio\"].d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('name')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    if ($this.is(':checked')) {\n        var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n        if ($this.val()) {\n            selectors.push('#' + $this.val());\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    }\n});\n\n$('input[type=\"radio\"].d3r-chooser:checked').trigger('change');\n\n$(document).on('click', '.d3r-submit', function(e) {\n    var $this = $(this);\n\n    // If the form is invalid, don't disable the button.\n    if ($this.closest('form') &&\n        !$this.closest('form')[0].checkValidity()) {\n        return;\n    }\n    // The timeout is to allow this submission to proceed. Nasty I know, sorry.\n    if ($this.hasClass('d3r-disabled')) {\n        e.preventDefault();\n    }\n    $this.addClass('d3r-disabled');\n    if (!$this.is('a')) {\n        setTimeout(function() {\n            $this.prop('disabled', true);\n        }, 0);\n    }\n});\n$(document).on('click', '.d3r-confirm', function(e) {\n    var $this = $(this),\n        message = 'Are you sure?';\n    if (!!$this.data('confirm')) message = $this.data('confirm');\n    if (!window.confirm(message)) e.preventDefault();\n});\n$(document).on('click', '.d3r-scrollto', function(e) {\n    var $this = $(this),\n        $target;\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href').replace(window.location.pathname,\"\")[0]) {\n        $target = $($this.attr('href').replace(window.location.pathname,\"\"));\n    }\n    if ($target.length) {\n        var hash = $target.attr(\"id\");\n        $target.removeAttr(\"id\");\n        $(\"html,body\").animate({\n            scrollTop: $target.offset().top\n        }, 500, function() {\n            $target.attr(\"id\", hash);\n        });\n    }\n});\n$(document).on('click', '.d3r-popup', function(e) {\n    e.preventDefault();\n    var $this = $(this),\n        url = $this.attr('href'),\n        width = 600,\n        height = 300,\n        target = 'popup';\n    if (!!$this.data('width')) width = $this.data('width');\n    if (!!$this.data('height')) height = $this.data('height');\n    if (!!$this.attr('target')) target = $this.attr('target');\n\n    var newwindow = window.open(url, target ,'height='+height+',width='+width);\n    if (window.focus) newwindow.focus();\n});\n\n\n!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"==typeof exports?e(require(\"jquery\")):e(window.jQuery||window.Zepto)}(function(c){function e(){}function d(e,t){m.ev.on(x+e+I,t)}function p(e,t,n,o){var i=document.createElement(\"div\");return i.className=\"mfp-\"+e,n&&(i.innerHTML=n),o?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function u(e,t){m.ev.triggerHandler(x+e,t),m.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),m.st.callbacks[e])&&m.st.callbacks[e].apply(m,Array.isArray(t)?t:[t])}function f(e){return e===A&&m.currTemplate.closeBtn||(m.currTemplate.closeBtn=c(m.st.closeMarkup.replace(\"%title%\",m.st.tClose)),A=e),m.currTemplate.closeBtn}function r(){c.magnificPopup.instance||((m=new e).init(),c.magnificPopup.instance=m)}function a(){y&&(v.after(y.addClass(l)).detach(),y=null)}function i(){n&&c(document.body).removeClass(n)}function t(){i(),m.req&&m.req.abort()}var m,o,g,s,h,A,l,v,y,n,w=\"Close\",F=\"BeforeClose\",C=\"MarkupParse\",b=\"Open\",j=\"Change\",x=\"mfp\",I=\".\"+x,T=\"mfp-ready\",N=\"mfp-removing\",k=\"mfp-prevent-close\",P=!!window.jQuery,_=c(window),S=(c.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;m.isLowIE=m.isIE8=document.all&&!document.addEventListener,m.isAndroid=/android/gi.test(e),m.isIOS=/iphone|ipad|ipod/gi.test(e),m.supportsTransition=function(){var e=document.createElement(\"p\").style,t=[\"ms\",\"O\",\"Moz\",\"Webkit\"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+\"Transition\"in e)return!0;return!1}(),m.probablyMobile=m.isAndroid||m.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),m.popupsCache={}},open:function(e){if(!1===e.isObj){m.items=e.items.toArray(),m.index=0;for(var t,n=e.items,o=0;o<n.length;o++)if((t=(t=n[o]).parsed?t.el[0]:t)===e.el[0]){m.index=o;break}}else m.items=Array.isArray(e.items)?e.items:[e.items],m.index=e.index||0;if(!m.isOpen){m.types=[],h=\"\",e.mainEl&&e.mainEl.length?m.ev=e.mainEl.eq(0):m.ev=g,e.key?(m.popupsCache[e.key]||(m.popupsCache[e.key]={}),m.currTemplate=m.popupsCache[e.key]):m.currTemplate={},m.st=c.extend(!0,{},c.magnificPopup.defaults,e),m.fixedContentPos=\"auto\"===m.st.fixedContentPos?!m.probablyMobile:m.st.fixedContentPos,m.st.modal&&(m.st.closeOnContentClick=!1,m.st.closeOnBgClick=!1,m.st.showCloseBtn=!1,m.st.enableEscapeKey=!1),m.bgOverlay||(m.bgOverlay=p(\"bg\").on(\"click\"+I,function(){m.close()}),m.wrap=p(\"wrap\").attr(\"tabindex\",-1).on(\"click\"+I,function(e){m._checkIfClose(e.target)&&m.close()}),m.container=p(\"container\",m.wrap)),m.contentContainer=p(\"content\"),m.st.preloader&&(m.preloader=p(\"preloader\",m.container,m.st.tLoading));var i=c.magnificPopup.modules;for(o=0;o<i.length;o++){var r=(r=i[o]).charAt(0).toUpperCase()+r.slice(1);m[\"init\"+r].call(m)}u(\"BeforeOpen\"),m.st.showCloseBtn&&(m.st.closeBtnInside?(d(C,function(e,t,n,o){n.close_replaceWith=f(o.type)}),h+=\" mfp-close-btn-in\"):m.wrap.append(f())),m.st.alignTop&&(h+=\" mfp-align-top\"),m.fixedContentPos?m.wrap.css({overflow:m.st.overflowY,overflowX:\"hidden\",overflowY:m.st.overflowY}):m.wrap.css({top:_.scrollTop(),position:\"absolute\"}),!1!==m.st.fixedBgPos&&(\"auto\"!==m.st.fixedBgPos||m.fixedContentPos)||m.bgOverlay.css({height:g.height(),position:\"absolute\"}),m.st.enableEscapeKey&&g.on(\"keyup\"+I,function(e){27===e.keyCode&&m.close()}),_.on(\"resize\"+I,function(){m.updateSize()}),m.st.closeOnContentClick||(h+=\" mfp-auto-cursor\"),h&&m.wrap.addClass(h);var a=m.wH=_.height(),s={},l=(m.fixedContentPos&&m._hasScrollBar(a)&&(l=m._getScrollbarSize())&&(s.marginRight=l),m.fixedContentPos&&(m.isIE7?c(\"body, html\").css(\"overflow\",\"hidden\"):s.overflow=\"hidden\"),m.st.mainClass);return m.isIE7&&(l+=\" mfp-ie7\"),l&&m._addClassToMFP(l),m.updateItemHTML(),u(\"BuildControls\"),c(\"html\").css(s),m.bgOverlay.add(m.wrap).prependTo(m.st.prependTo||c(document.body)),m._lastFocusedEl=document.activeElement,setTimeout(function(){m.content?(m._addClassToMFP(T),m._setFocus()):m.bgOverlay.addClass(T),g.on(\"focusin\"+I,m._onFocusIn)},16),m.isOpen=!0,m.updateSize(a),u(b),e}m.updateItemHTML()},close:function(){m.isOpen&&(u(F),m.isOpen=!1,m.st.removalDelay&&!m.isLowIE&&m.supportsTransition?(m._addClassToMFP(N),setTimeout(function(){m._close()},m.st.removalDelay)):m._close())},_close:function(){u(w);var e=N+\" \"+T+\" \";m.bgOverlay.detach(),m.wrap.detach(),m.container.empty(),m.st.mainClass&&(e+=m.st.mainClass+\" \"),m._removeClassFromMFP(e),m.fixedContentPos&&(e={marginRight:\"\"},m.isIE7?c(\"body, html\").css(\"overflow\",\"\"):e.overflow=\"\",c(\"html\").css(e)),g.off(\"keyup.mfp focusin\"+I),m.ev.off(I),m.wrap.attr(\"class\",\"mfp-wrap\").removeAttr(\"style\"),m.bgOverlay.attr(\"class\",\"mfp-bg\"),m.container.attr(\"class\",\"mfp-container\"),!m.st.showCloseBtn||m.st.closeBtnInside&&!0!==m.currTemplate[m.currItem.type]||m.currTemplate.closeBtn&&m.currTemplate.closeBtn.detach(),m.st.autoFocusLast&&m._lastFocusedEl&&c(m._lastFocusedEl).trigger(\"focus\"),m.currItem=null,m.content=null,m.currTemplate=null,m.prevHeight=0,u(\"AfterClose\")},updateSize:function(e){var t;m.isIOS?(t=document.documentElement.clientWidth/window.innerWidth,t=window.innerHeight*t,m.wrap.css(\"height\",t),m.wH=t):m.wH=e||_.height(),m.fixedContentPos||m.wrap.css(\"height\",m.wH),u(\"Resize\")},updateItemHTML:function(){var e=m.items[m.index],t=(m.contentContainer.detach(),m.content&&m.content.detach(),(e=e.parsed?e:m.parseEl(m.index)).type),n=(u(\"BeforeChange\",[m.currItem?m.currItem.type:\"\",t]),m.currItem=e,m.currTemplate[t]||(n=!!m.st[t]&&m.st[t].markup,u(\"FirstMarkupParse\",n),m.currTemplate[t]=!n||c(n)),s&&s!==e.type&&m.container.removeClass(\"mfp-\"+s+\"-holder\"),m[\"get\"+t.charAt(0).toUpperCase()+t.slice(1)](e,m.currTemplate[t]));m.appendContent(n,t),e.preloaded=!0,u(j,e),s=e.type,m.container.prepend(m.contentContainer),u(\"AfterChange\")},appendContent:function(e,t){(m.content=e)?m.st.showCloseBtn&&m.st.closeBtnInside&&!0===m.currTemplate[t]?m.content.find(\".mfp-close\").length||m.content.append(f()):m.content=e:m.content=\"\",u(\"BeforeAppend\"),m.container.addClass(\"mfp-\"+t+\"-holder\"),m.contentContainer.append(m.content)},parseEl:function(e){var t,n=m.items[e];if((n=n.tagName?{el:c(n)}:(t=n.type,{data:n,src:n.src})).el){for(var o=m.types,i=0;i<o.length;i++)if(n.el.hasClass(\"mfp-\"+o[i])){t=o[i];break}n.src=n.el.attr(\"data-mfp-src\"),n.src||(n.src=n.el.attr(\"href\"))}return n.type=t||m.st.type||\"inline\",n.index=e,n.parsed=!0,m.items[e]=n,u(\"ElementParse\",n),m.items[e]},addGroup:function(t,n){function e(e){e.mfpEl=this,m._openClick(e,t,n)}var o=\"click.magnificPopup\";(n=n||{}).mainEl=t,n.items?(n.isObj=!0,t.off(o).on(o,e)):(n.isObj=!1,n.delegate?t.off(o).on(o,n.delegate,e):(n.items=t).off(o).on(o,e))},_openClick:function(e,t,n){var o=(void 0!==n.midClick?n:c.magnificPopup.defaults).midClick;if(o||!(2===e.which||e.ctrlKey||e.metaKey||e.altKey||e.shiftKey)){o=(void 0!==n.disableOn?n:c.magnificPopup.defaults).disableOn;if(o)if(\"function\"==typeof o){if(!o.call(m))return!0}else if(_.width()<o)return!0;e.type&&(e.preventDefault(),m.isOpen)&&e.stopPropagation(),n.el=c(e.mfpEl),n.delegate&&(n.items=t.find(n.delegate)),m.open(n)}},updateStatus:function(e,t){var n;m.preloader&&(o!==e&&m.container.removeClass(\"mfp-s-\"+o),n={status:e,text:t=t||\"loading\"!==e?t:m.st.tLoading},u(\"UpdateStatus\",n),e=n.status,t=n.text,m.st.allowHTMLInStatusIndicator?m.preloader.html(t):m.preloader.text(t),m.preloader.find(\"a\").on(\"click\",function(e){e.stopImmediatePropagation()}),m.container.addClass(\"mfp-s-\"+e),o=e)},_checkIfClose:function(e){if(!c(e).closest(\".\"+k).length){var t=m.st.closeOnContentClick,n=m.st.closeOnBgClick;if(t&&n)return!0;if(!m.content||c(e).closest(\".mfp-close\").length||m.preloader&&e===m.preloader[0])return!0;if(e===m.content[0]||c.contains(m.content[0],e)){if(t)return!0}else if(n&&c.contains(document,e))return!0;return!1}},_addClassToMFP:function(e){m.bgOverlay.addClass(e),m.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),m.wrap.removeClass(e)},_hasScrollBar:function(e){return(m.isIE7?g.height():document.body.scrollHeight)>(e||_.height())},_setFocus:function(){(m.st.focus?m.content.find(m.st.focus).eq(0):m.wrap).trigger(\"focus\")},_onFocusIn:function(e){if(e.target!==m.wrap[0]&&!c.contains(m.wrap[0],e.target))return m._setFocus(),!1},_parseMarkup:function(i,e,t){var r;t.data&&(e=c.extend(t.data,e)),u(C,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,o;1<(r=e.split(\"_\")).length?0<(n=i.find(I+\"-\"+r[0])).length&&(\"replaceWith\"===(o=r[1])?n[0]!==t[0]&&n.replaceWith(t):\"img\"===o?n.is(\"img\")?n.attr(\"src\",t):n.replaceWith(c(\"<img>\").attr(\"src\",t).attr(\"class\",n.attr(\"class\"))):n.attr(r[1],t)):m.st.allowHTMLInTemplate?i.find(I+\"-\"+e).html(t):i.find(I+\"-\"+e).text(t)})},_getScrollbarSize:function(){var e;return void 0===m.scrollbarSize&&((e=document.createElement(\"div\")).style.cssText=\"width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;\",document.body.appendChild(e),m.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),m.scrollbarSize}},modules:[],open:function(e,t){return r(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:\"\",preloader:!0,focus:\"\",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:\"auto\",fixedBgPos:\"auto\",overflowY:\"auto\",closeMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&#215;</button>',tClose:\"Close (Esc)\",tLoading:\"Loading...\",autoFocusLast:!0,allowHTMLInStatusIndicator:!1,allowHTMLInTemplate:!1}},c.fn.magnificPopup=function(e){r();var t,n,o,i=c(this);return\"string\"==typeof e?\"open\"===e?(t=P?i.data(\"magnificPopup\"):i[0].magnificPopup,n=parseInt(arguments[1],10)||0,o=t.items?t.items[n]:(o=i,(o=t.delegate?o.find(t.delegate):o).eq(n)),m._openClick({mfpEl:o},i,t)):m.isOpen&&m[e].apply(m,Array.prototype.slice.call(arguments,1)):(e=c.extend(!0,{},e),P?i.data(\"magnificPopup\",e):i[0].magnificPopup=e,m.addGroup(i,e)),i},\"inline\"),E=(c.magnificPopup.registerModule(S,{options:{hiddenClass:\"hide\",markup:\"\",tNotFound:\"Content not found\"},proto:{initInline:function(){m.types.push(S),d(w+\".\"+S,function(){a()})},getInline:function(e,t){var n,o,i;return a(),e.src?(n=m.st.inline,(o=c(e.src)).length?((i=o[0].parentNode)&&i.tagName&&(v||(l=n.hiddenClass,v=p(l),l=\"mfp-\"+l),y=o.after(v).detach().removeClass(l)),m.updateStatus(\"ready\")):(m.updateStatus(\"error\",n.tNotFound),o=c(\"<div>\")),e.inlineElement=o):(m.updateStatus(\"ready\"),m._parseMarkup(t,{},e),t)}}}),\"ajax\");c.magnificPopup.registerModule(E,{options:{settings:null,cursor:\"mfp-ajax-cur\",tError:\"The content could not be loaded.\"},proto:{initAjax:function(){m.types.push(E),n=m.st.ajax.cursor,d(w+\".\"+E,t),d(\"BeforeChange.\"+E,t)},getAjax:function(o){n&&c(document.body).addClass(n),m.updateStatus(\"loading\");var e=c.extend({url:o.src,success:function(e,t,n){e={data:e,xhr:n};u(\"ParseAjax\",e),m.appendContent(c(e.data),E),o.finished=!0,i(),m._setFocus(),setTimeout(function(){m.wrap.addClass(T)},16),m.updateStatus(\"ready\"),u(\"AjaxContentAdded\")},error:function(){i(),o.finished=o.loadError=!0,m.updateStatus(\"error\",m.st.ajax.tError.replace(\"%url%\",o.src))}},m.st.ajax.settings);return m.req=c.ajax(e),\"\"}}});var z;c.magnificPopup.registerModule(\"image\",{options:{markup:'<div class=\"mfp-figure\"><div class=\"mfp-close\"></div><figure><div class=\"mfp-img\"></div><figcaption><div class=\"mfp-bottom-bar\"><div class=\"mfp-title\"></div><div class=\"mfp-counter\"></div></div></figcaption></figure></div>',cursor:\"mfp-zoom-out-cur\",titleSrc:\"title\",verticalFit:!0,tError:\"The image could not be loaded.\"},proto:{initImage:function(){var e=m.st.image,t=\".image\";m.types.push(\"image\"),d(b+t,function(){\"image\"===m.currItem.type&&e.cursor&&c(document.body).addClass(e.cursor)}),d(w+t,function(){e.cursor&&c(document.body).removeClass(e.cursor),_.off(\"resize\"+I)}),d(\"Resize\"+t,m.resizeImage),m.isLowIE&&d(\"AfterChange\",m.resizeImage)},resizeImage:function(){var e,t=m.currItem;t&&t.img&&m.st.image.verticalFit&&(e=0,m.isLowIE&&(e=parseInt(t.img.css(\"padding-top\"),10)+parseInt(t.img.css(\"padding-bottom\"),10)),t.img.css(\"max-height\",m.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,z&&clearInterval(z),e.isCheckingImgSize=!1,u(\"ImageHasSize\",e),e.imgHidden)&&(m.content&&m.content.removeClass(\"mfp-loading\"),e.imgHidden=!1)},findImageSize:function(t){function n(e){z&&clearInterval(z),z=setInterval(function(){0<i.naturalWidth?m._onImageHasSize(t):(200<o&&clearInterval(z),3===++o?n(10):40===o?n(50):100===o&&n(500))},e)}var o=0,i=t.img[0];n(1)},getImage:function(e,t){function n(){e&&(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))),e.hasSize=!0,e.loaded=!0,e.loadError=!0)}function o(){e&&(e.img[0].complete?(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"ready\")),e.hasSize=!0,e.loaded=!0,u(\"ImageLoadComplete\")):++r<200?setTimeout(o,100):n())}var i,r=0,a=m.st.image,s=t.find(\".mfp-img\");return s.length&&((i=document.createElement(\"img\")).className=\"mfp-img\",e.el&&e.el.find(\"img\").length&&(i.alt=e.el.find(\"img\").attr(\"alt\")),e.img=c(i).on(\"load.mfploader\",o).on(\"error.mfploader\",n),i.src=e.src,s.is(\"img\")&&(e.img=e.img.clone()),0<(i=e.img[0]).naturalWidth?e.hasSize=!0:i.width||(e.hasSize=!1)),m._parseMarkup(t,{title:function(e){if(e.data&&void 0!==e.data.title)return e.data.title;var t=m.st.image.titleSrc;if(t){if(\"function\"==typeof t)return t.call(m,e);if(e.el)return e.el.attr(t)||\"\"}return\"\"}(e),img_replaceWith:e.img},e),m.resizeImage(),e.hasSize?(z&&clearInterval(z),e.loadError?(t.addClass(\"mfp-loading\"),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))):(t.removeClass(\"mfp-loading\"),m.updateStatus(\"ready\"))):(m.updateStatus(\"loading\"),e.loading=!0,e.hasSize||(e.imgHidden=!0,t.addClass(\"mfp-loading\"),m.findImageSize(e))),t}}});function O(e){var t;m.currTemplate[L]&&(t=m.currTemplate[L].find(\"iframe\")).length&&(e||(t[0].src=\"//about:blank\"),m.isIE8)&&t.css(\"display\",e?\"block\":\"none\")}function M(e){var t=m.items.length;return t-1<e?e-t:e<0?t+e:e}function D(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)}c.magnificPopup.registerModule(\"zoom\",{options:{enabled:!1,easing:\"ease-in-out\",duration:300,opener:function(e){return e.is(\"img\")?e:e.find(\"img\")}},proto:{initZoom:function(){var e,t,n,o,i,r,a=m.st.zoom,s=\".zoom\";a.enabled&&m.supportsTransition&&(t=a.duration,n=function(e){var e=e.clone().removeAttr(\"style\").removeAttr(\"class\").addClass(\"mfp-animated-image\"),t=\"all \"+a.duration/1e3+\"s \"+a.easing,n={position:\"fixed\",zIndex:9999,left:0,top:0,\"-webkit-backface-visibility\":\"hidden\"},o=\"transition\";return n[\"-webkit-\"+o]=n[\"-moz-\"+o]=n[\"-o-\"+o]=n[o]=t,e.css(n),e},o=function(){m.content.css(\"visibility\",\"visible\")},d(\"BuildControls\"+s,function(){m._allowZoom()&&(clearTimeout(i),m.content.css(\"visibility\",\"hidden\"),(e=m._getItemToZoom())?((r=n(e)).css(m._getOffset()),m.wrap.append(r),i=setTimeout(function(){r.css(m._getOffset(!0)),i=setTimeout(function(){o(),setTimeout(function(){r.remove(),e=r=null,u(\"ZoomAnimationEnded\")},16)},t)},16)):o())}),d(F+s,function(){if(m._allowZoom()){if(clearTimeout(i),m.st.removalDelay=t,!e){if(!(e=m._getItemToZoom()))return;r=n(e)}r.css(m._getOffset(!0)),m.wrap.append(r),m.content.css(\"visibility\",\"hidden\"),setTimeout(function(){r.css(m._getOffset())},16)}}),d(w+s,function(){m._allowZoom()&&(o(),r&&r.remove(),e=null)}))},_allowZoom:function(){return\"image\"===m.currItem.type},_getItemToZoom:function(){return!!m.currItem.hasSize&&m.currItem.img},_getOffset:function(e){var e=e?m.currItem.img:m.st.zoom.opener(m.currItem.el||m.currItem),t=e.offset(),n=parseInt(e.css(\"padding-top\"),10),o=parseInt(e.css(\"padding-bottom\"),10),e=(t.top-=c(window).scrollTop()-n,{width:e.width(),height:(P?e.innerHeight():e[0].offsetHeight)-o-n});return(B=void 0===B?void 0!==document.createElement(\"p\").style.MozTransform:B)?e[\"-moz-transform\"]=e.transform=\"translate(\"+t.left+\"px,\"+t.top+\"px)\":(e.left=t.left,e.top=t.top),e}}});var B,L=\"iframe\",H=(c.magnificPopup.registerModule(L,{options:{markup:'<div class=\"mfp-iframe-scaler\"><div class=\"mfp-close\"></div><iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe></div>',srcAction:\"iframe_src\",patterns:{youtube:{index:\"youtube.com\",id:\"v=\",src:\"//www.youtube.com/embed/%id%?autoplay=1\"},vimeo:{index:\"vimeo.com/\",id:\"/\",src:\"//player.vimeo.com/video/%id%?autoplay=1\"},gmaps:{index:\"//maps.google.\",src:\"%id%&output=embed\"}}},proto:{initIframe:function(){m.types.push(L),d(\"BeforeChange\",function(e,t,n){t!==n&&(t===L?O():n===L&&O(!0))}),d(w+\".\"+L,function(){O()})},getIframe:function(e,t){var n=e.src,o=m.st.iframe,i=(c.each(o.patterns,function(){if(-1<n.indexOf(this.index))return this.id&&(n=\"string\"==typeof this.id?n.substr(n.lastIndexOf(this.id)+this.id.length,n.length):this.id.call(this,n)),n=this.src.replace(\"%id%\",n),!1}),{});return o.srcAction&&(i[o.srcAction]=n),m._parseMarkup(t,i,e),m.updateStatus(\"ready\"),t}}}),c.magnificPopup.registerModule(\"gallery\",{options:{enabled:!1,arrowMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:\"Previous (Left arrow key)\",tNext:\"Next (Right arrow key)\",tCounter:\"%curr% of %total%\",langDir:null,loop:!0},proto:{initGallery:function(){var r=m.st.gallery,e=\".mfp-gallery\";if(m.direction=!0,!r||!r.enabled)return!1;r.langDir||(r.langDir=document.dir||\"ltr\"),h+=\" mfp-gallery\",d(b+e,function(){r.navigateByImgClick&&m.wrap.on(\"click\"+e,\".mfp-img\",function(){if(1<m.items.length)return m.next(),!1}),g.on(\"keydown\"+e,function(e){37===e.keyCode?\"rtl\"===r.langDir?m.next():m.prev():39===e.keyCode&&(\"rtl\"===r.langDir?m.prev():m.next())}),m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(){m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(e,t){t.text&&(t.text=D(t.text,m.currItem.index,m.items.length))}),d(C+e,function(e,t,n,o){var i=m.items.length;n.counter=1<i?D(r.tCounter,o.index,i):\"\"}),d(\"BuildControls\"+e,function(){var e,t,n,o,i;1<m.items.length&&r.arrows&&!m.arrowLeft&&(t=\"rtl\"===r.langDir?(o=r.tNext,e=r.tPrev,i=\"next\",\"prev\"):(o=r.tPrev,e=r.tNext,i=\"prev\",\"next\"),n=r.arrowMarkup,o=m.arrowLeft=c(n.replace(/%title%/gi,o).replace(/%action%/gi,i).replace(/%dir%/gi,\"left\")).addClass(k),i=m.arrowRight=c(n.replace(/%title%/gi,e).replace(/%action%/gi,t).replace(/%dir%/gi,\"right\")).addClass(k),\"rtl\"===r.langDir?(m.arrowNext=o,m.arrowPrev=i):(m.arrowNext=i,m.arrowPrev=o),o.on(\"click\",function(){\"rtl\"===r.langDir?m.next():m.prev()}),i.on(\"click\",function(){\"rtl\"===r.langDir?m.prev():m.next()}),m.container.append(o.add(i)))}),d(j+e,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),d(w+e,function(){g.off(e),m.wrap.off(\"click\"+e),m.arrowRight=m.arrowLeft=null})},next:function(){var e=M(m.index+1);if(!m.st.gallery.loop&&0===e)return!1;m.direction=!0,m.index=e,m.updateItemHTML()},prev:function(){var e=m.index-1;if(!m.st.gallery.loop&&e<0)return!1;m.direction=!1,m.index=M(e),m.updateItemHTML()},goTo:function(e){m.direction=e>=m.index,m.index=e,m.updateItemHTML()},preloadNearbyImages:function(){for(var e=m.st.gallery.preload,t=Math.min(e[0],m.items.length),n=Math.min(e[1],m.items.length),o=1;o<=(m.direction?n:t);o++)m._preloadItem(m.index+o);for(o=1;o<=(m.direction?t:n);o++)m._preloadItem(m.index-o)},_preloadItem:function(e){var t;e=M(e),m.items[e].preloaded||((t=m.items[e]).parsed||(t=m.parseEl(e)),u(\"LazyLoad\",t),\"image\"===t.type&&(t.img=c('<img class=\"mfp-img\" />').on(\"load.mfploader\",function(){t.hasSize=!0}).on(\"error.mfploader\",function(){t.hasSize=!0,t.loadError=!0,u(\"LazyLoadError\",t)}).attr(\"src\",t.src)),t.preloaded=!0)},updateGalleryButtons:function(){m.st.gallery.loop||\"object\"!=typeof m.arrowPrev||null===m.arrowPrev||(0===m.index?m.arrowPrev.hide():m.arrowPrev.show(),m.index===m.items.length-1?m.arrowNext.hide():m.arrowNext.show())}}}),\"retina\");c.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\\.\\w+$/,function(e){return\"@2x\"+e})},ratio:1},proto:{initRetina:function(){var n,o;1<window.devicePixelRatio&&(n=m.st.retina,o=n.ratio,1<(o=isNaN(o)?o():o))&&(d(\"ImageHasSize.\"+H,function(e,t){t.img.css({\"max-width\":t.img[0].naturalWidth/o,width:\"100%\"})}),d(\"ElementParse.\"+H,function(e,t){t.src=n.replaceSrc(t,o)}))}}}),r()});\nif (typeof SVG_DEFAULT_PATH == \"undefined\") {\n    var SVG_DEFAULT_PATH = '/images/svg-symbols.svg';\n}\nif (typeof SVG_DEFAULT_PREFIX == \"undefined\") {\n    var SVG_DEFAULT_PREFIX = 'icon';\n}\nfunction Svg() {\n\n    this.imagePath = SVG_DEFAULT_PATH;\n\n    this.imageClassPrefix = SVG_DEFAULT_PREFIX;\n\n    this.setImagePath = function(path) {\n        if (path) {\n            this.imagePath = path;\n        }\n    }\n\n    this.setImageClassPrefix = function(prefix) {\n        if (prefix) {\n            this.imageClassPrefix = prefix;\n        }\n    }\n\n    this.render = function(icon) {\n        return '<svg role=\"img\" class=\"' + this.imageClassPrefix + '-' + this.prepare(icon) + '\">' +\n                        '<use xlink:href=\"' + this.imagePath + '#icon-' + this.prepare(icon) + '\"></use>' +\n                    '</svg>'\n    }\n\n    this.prepare = function(icon) {\n        return icon.replace('icon-', '');\n    }\n}\n\nSVG_DEFAULT_PATH = AndrewMartin.svgSymbolsFile;\n\n\n(function(factory) {\r\n\n  if (typeof define === \"function\" && define.amd) {\r\n\n    // AMD. Register as an anonymous module.\r\n\n    define([], factory);\r\n\n  } else if (typeof exports === \"object\") {\r\n\n    // Node/CommonJS\r\n\n    module.exports = factory();\r\n\n  } else {\r\n\n    // Browser globals\r\n\n    window.wNumb = factory();\r\n\n  }\r\n\n})(function() {\r\n\n  \"use strict\";\r\n\n\r\n\n  var FormatOptions = [\r\n\n    \"decimals\",\r\n\n    \"thousand\",\r\n\n    \"mark\",\r\n\n    \"prefix\",\r\n\n    \"suffix\",\r\n\n    \"encoder\",\r\n\n    \"decoder\",\r\n\n    \"negativeBefore\",\r\n\n    \"negative\",\r\n\n    \"edit\",\r\n\n    \"undo\"\r\n\n  ];\r\n\n\r\n\n  // General\r\n\n\r\n\n  // Reverse a string\r\n\n  function strReverse(a) {\r\n\n    return a\r\n\n      .split(\"\")\r\n\n      .reverse()\r\n\n      .join(\"\");\r\n\n  }\r\n\n\r\n\n  // Check if a string starts with a specified prefix.\r\n\n  function strStartsWith(input, match) {\r\n\n    return input.substring(0, match.length) === match;\r\n\n  }\r\n\n\r\n\n  // Check is a string ends in a specified suffix.\r\n\n  function strEndsWith(input, match) {\r\n\n    return input.slice(-1 * match.length) === match;\r\n\n  }\r\n\n\r\n\n  // Throw an error if formatting options are incompatible.\r\n\n  function throwEqualError(F, a, b) {\r\n\n    if ((F[a] || F[b]) && F[a] === F[b]) {\r\n\n      throw new Error(a);\r\n\n    }\r\n\n  }\r\n\n\r\n\n  // Check if a number is finite and not NaN\r\n\n  function isValidNumber(input) {\r\n\n    return typeof input === \"number\" && isFinite(input);\r\n\n  }\r\n\n\r\n\n  // Provide rounding-accurate toFixed method.\r\n\n  // Borrowed: http://stackoverflow.com/a/21323330/775265\r\n\n  function toFixed(value, exp) {\r\n\n    value = value.toString().split(\"e\");\r\n\n    value = Math.round(+(value[0] + \"e\" + (value[1] ? +value[1] + exp : exp)));\r\n\n    value = value.toString().split(\"e\");\r\n\n    return (+(value[0] + \"e\" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp);\r\n\n  }\r\n\n\r\n\n  // Formatting\r\n\n\r\n\n  // Accept a number as input, output formatted string.\r\n\n  function formatTo(\r\n\n    decimals,\r\n\n    thousand,\r\n\n    mark,\r\n\n    prefix,\r\n\n    suffix,\r\n\n    encoder,\r\n\n    decoder,\r\n\n    negativeBefore,\r\n\n    negative,\r\n\n    edit,\r\n\n    undo,\r\n\n    input\r\n\n  ) {\r\n\n    var originalInput = input,\r\n\n      inputIsNegative,\r\n\n      inputPieces,\r\n\n      inputBase,\r\n\n      inputDecimals = \"\",\r\n\n      output = \"\";\r\n\n\r\n\n    // Apply user encoder to the input.\r\n\n    // Expected outcome: number.\r\n\n    if (encoder) {\r\n\n      input = encoder(input);\r\n\n    }\r\n\n\r\n\n    // Stop if no valid number was provided, the number is infinite or NaN.\r\n\n    if (!isValidNumber(input)) {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // Rounding away decimals might cause a value of -0\r\n\n    // when using very small ranges. Remove those cases.\r\n\n    if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) {\r\n\n      input = 0;\r\n\n    }\r\n\n\r\n\n    // Formatting is done on absolute numbers,\r\n\n    // decorated by an optional negative symbol.\r\n\n    if (input < 0) {\r\n\n      inputIsNegative = true;\r\n\n      input = Math.abs(input);\r\n\n    }\r\n\n\r\n\n    // Reduce the number of decimals to the specified option.\r\n\n    if (decimals !== false) {\r\n\n      input = toFixed(input, decimals);\r\n\n    }\r\n\n\r\n\n    // Transform the number into a string, so it can be split.\r\n\n    input = input.toString();\r\n\n\r\n\n    // Break the number on the decimal separator.\r\n\n    if (input.indexOf(\".\") !== -1) {\r\n\n      inputPieces = input.split(\".\");\r\n\n\r\n\n      inputBase = inputPieces[0];\r\n\n\r\n\n      if (mark) {\r\n\n        inputDecimals = mark + inputPieces[1];\r\n\n      }\r\n\n    } else {\r\n\n      // If it isn't split, the entire number will do.\r\n\n      inputBase = input;\r\n\n    }\r\n\n\r\n\n    // Group numbers in sets of three.\r\n\n    if (thousand) {\r\n\n      inputBase = strReverse(inputBase).match(/.{1,3}/g);\r\n\n      inputBase = strReverse(inputBase.join(strReverse(thousand)));\r\n\n    }\r\n\n\r\n\n    // If the number is negative, prefix with negation symbol.\r\n\n    if (inputIsNegative && negativeBefore) {\r\n\n      output += negativeBefore;\r\n\n    }\r\n\n\r\n\n    // Prefix the number\r\n\n    if (prefix) {\r\n\n      output += prefix;\r\n\n    }\r\n\n\r\n\n    // Normal negative option comes after the prefix. Defaults to '-'.\r\n\n    if (inputIsNegative && negative) {\r\n\n      output += negative;\r\n\n    }\r\n\n\r\n\n    // Append the actual number.\r\n\n    output += inputBase;\r\n\n    output += inputDecimals;\r\n\n\r\n\n    // Apply the suffix.\r\n\n    if (suffix) {\r\n\n      output += suffix;\r\n\n    }\r\n\n\r\n\n    // Run the output through a user-specified post-formatter.\r\n\n    if (edit) {\r\n\n      output = edit(output, originalInput);\r\n\n    }\r\n\n\r\n\n    // All done.\r\n\n    return output;\r\n\n  }\r\n\n\r\n\n  // Accept a sting as input, output decoded number.\r\n\n  function formatFrom(\r\n\n    decimals,\r\n\n    thousand,\r\n\n    mark,\r\n\n    prefix,\r\n\n    suffix,\r\n\n    encoder,\r\n\n    decoder,\r\n\n    negativeBefore,\r\n\n    negative,\r\n\n    edit,\r\n\n    undo,\r\n\n    input\r\n\n  ) {\r\n\n    var originalInput = input,\r\n\n      inputIsNegative,\r\n\n      output = \"\";\r\n\n\r\n\n    // User defined pre-decoder. Result must be a non empty string.\r\n\n    if (undo) {\r\n\n      input = undo(input);\r\n\n    }\r\n\n\r\n\n    // Test the input. Can't be empty.\r\n\n    if (!input || typeof input !== \"string\") {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // If the string starts with the negativeBefore value: remove it.\r\n\n    // Remember is was there, the number is negative.\r\n\n    if (negativeBefore && strStartsWith(input, negativeBefore)) {\r\n\n      input = input.replace(negativeBefore, \"\");\r\n\n      inputIsNegative = true;\r\n\n    }\r\n\n\r\n\n    // Repeat the same procedure for the prefix.\r\n\n    if (prefix && strStartsWith(input, prefix)) {\r\n\n      input = input.replace(prefix, \"\");\r\n\n    }\r\n\n\r\n\n    // And again for negative.\r\n\n    if (negative && strStartsWith(input, negative)) {\r\n\n      input = input.replace(negative, \"\");\r\n\n      inputIsNegative = true;\r\n\n    }\r\n\n\r\n\n    // Remove the suffix.\r\n\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\r\n\n    if (suffix && strEndsWith(input, suffix)) {\r\n\n      input = input.slice(0, -1 * suffix.length);\r\n\n    }\r\n\n\r\n\n    // Remove the thousand grouping.\r\n\n    if (thousand) {\r\n\n      input = input.split(thousand).join(\"\");\r\n\n    }\r\n\n\r\n\n    // Set the decimal separator back to period.\r\n\n    if (mark) {\r\n\n      input = input.replace(mark, \".\");\r\n\n    }\r\n\n\r\n\n    // Prepend the negative symbol.\r\n\n    if (inputIsNegative) {\r\n\n      output += \"-\";\r\n\n    }\r\n\n\r\n\n    // Add the number\r\n\n    output += input;\r\n\n\r\n\n    // Trim all non-numeric characters (allow '.' and '-');\r\n\n    output = output.replace(/[^0-9\\.\\-.]/g, \"\");\r\n\n\r\n\n    // The value contains no parse-able number.\r\n\n    if (output === \"\") {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    // Covert to number.\r\n\n    output = Number(output);\r\n\n\r\n\n    // Run the user-specified post-decoder.\r\n\n    if (decoder) {\r\n\n      output = decoder(output);\r\n\n    }\r\n\n\r\n\n    // Check is the output is valid, otherwise: return false.\r\n\n    if (!isValidNumber(output)) {\r\n\n      return false;\r\n\n    }\r\n\n\r\n\n    return output;\r\n\n  }\r\n\n\r\n\n  // Framework\r\n\n\r\n\n  // Validate formatting options\r\n\n  function validate(inputOptions) {\r\n\n    var i,\r\n\n      optionName,\r\n\n      optionValue,\r\n\n      filteredOptions = {};\r\n\n\r\n\n    if (inputOptions[\"suffix\"] === undefined) {\r\n\n      inputOptions[\"suffix\"] = inputOptions[\"postfix\"];\r\n\n    }\r\n\n\r\n\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n\n      optionName = FormatOptions[i];\r\n\n      optionValue = inputOptions[optionName];\r\n\n\r\n\n      if (optionValue === undefined) {\r\n\n        // Only default if negativeBefore isn't set.\r\n\n        if (optionName === \"negative\" && !filteredOptions.negativeBefore) {\r\n\n          filteredOptions[optionName] = \"-\";\r\n\n          // Don't set a default for mark when 'thousand' is set.\r\n\n        } else if (optionName === \"mark\" && filteredOptions.thousand !== \".\") {\r\n\n          filteredOptions[optionName] = \".\";\r\n\n        } else {\r\n\n          filteredOptions[optionName] = false;\r\n\n        }\r\n\n\r\n\n        // Floating points in JS are stable up to 7 decimals.\r\n\n      } else if (optionName === \"decimals\") {\r\n\n        if (optionValue >= 0 && optionValue < 8) {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n\r\n\n        // These options, when provided, must be functions.\r\n\n      } else if (\r\n\n        optionName === \"encoder\" ||\r\n\n        optionName === \"decoder\" ||\r\n\n        optionName === \"edit\" ||\r\n\n        optionName === \"undo\"\r\n\n      ) {\r\n\n        if (typeof optionValue === \"function\") {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n\r\n\n        // Other options are strings.\r\n\n      } else {\r\n\n        if (typeof optionValue === \"string\") {\r\n\n          filteredOptions[optionName] = optionValue;\r\n\n        } else {\r\n\n          throw new Error(optionName);\r\n\n        }\r\n\n      }\r\n\n    }\r\n\n\r\n\n    // Some values can't be extracted from a\r\n\n    // string if certain combinations are present.\r\n\n    throwEqualError(filteredOptions, \"mark\", \"thousand\");\r\n\n    throwEqualError(filteredOptions, \"prefix\", \"negative\");\r\n\n    throwEqualError(filteredOptions, \"prefix\", \"negativeBefore\");\r\n\n\r\n\n    return filteredOptions;\r\n\n  }\r\n\n\r\n\n  // Pass all options as function arguments\r\n\n  function passAll(options, method, input) {\r\n\n    var i,\r\n\n      args = [];\r\n\n\r\n\n    // Add all options in order of FormatOptions\r\n\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n\n      args.push(options[FormatOptions[i]]);\r\n\n    }\r\n\n\r\n\n    // Append the input, then call the method, presenting all\r\n\n    // options as arguments.\r\n\n    args.push(input);\r\n\n    return method.apply(\"\", args);\r\n\n  }\r\n\n\r\n\n  function wNumb(options) {\r\n\n    if (!(this instanceof wNumb)) {\r\n\n      return new wNumb(options);\r\n\n    }\r\n\n\r\n\n    if (typeof options !== \"object\") {\r\n\n      return;\r\n\n    }\r\n\n\r\n\n    options = validate(options);\r\n\n\r\n\n    // Call 'formatTo' with proper arguments.\r\n\n    this.to = function(input) {\r\n\n      return passAll(options, formatTo, input);\r\n\n    };\r\n\n\r\n\n    // Call 'formatFrom' with proper arguments.\r\n\n    this.from = function(input) {\r\n\n      return passAll(options, formatFrom, input);\r\n\n    };\r\n\n  }\r\n\n\r\n\n  return wNumb;\r\n\n});\r\n\n\n/*\n     _ _      _       _\n ___| (_) ___| | __  (_)___\n/ __| | |/ __| |/ /  | / __|\n\\__ \\ | | (__|   < _ | \\__ \\\n|___/_|_|\\___|_|\\_(_)/ |___/\n                   |__/\n\n Version: 1.8.1\n  Author: Ken Wheeler\n Website: http://kenwheeler.github.io\n    Docs: http://kenwheeler.github.io/slick\n    Repo: http://github.com/kenwheeler/slick\n  Issues: http://github.com/kenwheeler/slick/issues\n\n */\n/* global window, document, define, jQuery, setInterval, clearInterval */\n;(function(factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], factory);\n    } else if (typeof exports !== 'undefined') {\n        module.exports = factory(require('jquery'));\n    } else {\n        factory(jQuery);\n    }\n\n}(function($) {\n    'use strict';\n    var Slick = window.Slick || {};\n\n    Slick = (function() {\n\n        var instanceUid = 0;\n\n        function Slick(element, settings) {\n\n            var _ = this, dataSettings;\n\n            _.defaults = {\n                accessibility: true,\n                adaptiveHeight: false,\n                appendArrows: $(element),\n                appendDots: $(element),\n                arrows: true,\n                asNavFor: null,\n                prevArrow: '<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',\n                nextArrow: '<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',\n                autoplay: false,\n                autoplaySpeed: 3000,\n                centerMode: false,\n                centerPadding: '50px',\n                cssEase: 'ease',\n                customPaging: function(slider, i) {\n                    return $('<button type=\"button\" />').text(i + 1);\n                },\n                dots: false,\n                dotsClass: 'slick-dots',\n                draggable: true,\n                easing: 'linear',\n                edgeFriction: 0.35,\n                fade: false,\n                focusOnSelect: false,\n                focusOnChange: false,\n                infinite: true,\n                initialSlide: 0,\n                lazyLoad: 'ondemand',\n                mobileFirst: false,\n                pauseOnHover: true,\n                pauseOnFocus: true,\n                pauseOnDotsHover: false,\n                respondTo: 'window',\n                responsive: null,\n                rows: 1,\n                rtl: false,\n                slide: '',\n                slidesPerRow: 1,\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                speed: 500,\n                swipe: true,\n                swipeToSlide: false,\n                touchMove: true,\n                touchThreshold: 5,\n                useCSS: true,\n                useTransform: true,\n                variableWidth: false,\n                vertical: false,\n                verticalSwiping: false,\n                waitForAnimate: true,\n                zIndex: 1000\n            };\n\n            _.initials = {\n                animating: false,\n                dragging: false,\n                autoPlayTimer: null,\n                currentDirection: 0,\n                currentLeft: null,\n                currentSlide: 0,\n                direction: 1,\n                $dots: null,\n                listWidth: null,\n                listHeight: null,\n                loadIndex: 0,\n                $nextArrow: null,\n                $prevArrow: null,\n                scrolling: false,\n                slideCount: null,\n                slideWidth: null,\n                $slideTrack: null,\n                $slides: null,\n                sliding: false,\n                slideOffset: 0,\n                swipeLeft: null,\n                swiping: false,\n                $list: null,\n                touchObject: {},\n                transformsEnabled: false,\n                unslicked: false\n            };\n\n            $.extend(_, _.initials);\n\n            _.activeBreakpoint = null;\n            _.animType = null;\n            _.animProp = null;\n            _.breakpoints = [];\n            _.breakpointSettings = [];\n            _.cssTransitions = false;\n            _.focussed = false;\n            _.interrupted = false;\n            _.hidden = 'hidden';\n            _.paused = true;\n            _.positionProp = null;\n            _.respondTo = null;\n            _.rowCount = 1;\n            _.shouldClick = true;\n            _.$slider = $(element);\n            _.$slidesCache = null;\n            _.transformType = null;\n            _.transitionType = null;\n            _.visibilityChange = 'visibilitychange';\n            _.windowWidth = 0;\n            _.windowTimer = null;\n\n            dataSettings = $(element).data('slick') || {};\n\n            _.options = $.extend({}, _.defaults, settings, dataSettings);\n\n            _.currentSlide = _.options.initialSlide;\n\n            _.originalSettings = _.options;\n\n            if (typeof document.mozHidden !== 'undefined') {\n                _.hidden = 'mozHidden';\n                _.visibilityChange = 'mozvisibilitychange';\n            } else if (typeof document.webkitHidden !== 'undefined') {\n                _.hidden = 'webkitHidden';\n                _.visibilityChange = 'webkitvisibilitychange';\n            }\n\n            _.autoPlay = $.proxy(_.autoPlay, _);\n            _.autoPlayClear = $.proxy(_.autoPlayClear, _);\n            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);\n            _.changeSlide = $.proxy(_.changeSlide, _);\n            _.clickHandler = $.proxy(_.clickHandler, _);\n            _.selectHandler = $.proxy(_.selectHandler, _);\n            _.setPosition = $.proxy(_.setPosition, _);\n            _.swipeHandler = $.proxy(_.swipeHandler, _);\n            _.dragHandler = $.proxy(_.dragHandler, _);\n            _.keyHandler = $.proxy(_.keyHandler, _);\n\n            _.instanceUid = instanceUid++;\n\n            // A simple way to check for HTML strings\n            // Strict HTML recognition (must start with <)\n            // Extracted from jQuery v1.11 source\n            _.htmlExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*)$/;\n\n\n            _.registerBreakpoints();\n            _.init(true);\n\n        }\n\n        return Slick;\n\n    }());\n\n    Slick.prototype.activateADA = function() {\n        var _ = this;\n\n        _.$slideTrack.find('.slick-active').attr({\n            'aria-hidden': 'false'\n        }).find('a, input, button, select').attr({\n            'tabindex': '0'\n        });\n\n    };\n\n    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            addBefore = index;\n            index = null;\n        } else if (index < 0 || (index >= _.slideCount)) {\n            return false;\n        }\n\n        _.unload();\n\n        if (typeof(index) === 'number') {\n            if (index === 0 && _.$slides.length === 0) {\n                $(markup).appendTo(_.$slideTrack);\n            } else if (addBefore) {\n                $(markup).insertBefore(_.$slides.eq(index));\n            } else {\n                $(markup).insertAfter(_.$slides.eq(index));\n            }\n        } else {\n            if (addBefore === true) {\n                $(markup).prependTo(_.$slideTrack);\n            } else {\n                $(markup).appendTo(_.$slideTrack);\n            }\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slides.each(function(index, element) {\n            $(element).attr('data-slick-index', index);\n        });\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.animateHeight = function() {\n        var _ = this;\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.animate({\n                height: targetHeight\n            }, _.options.speed);\n        }\n    };\n\n    Slick.prototype.animateSlide = function(targetLeft, callback) {\n\n        var animProps = {},\n            _ = this;\n\n        _.animateHeight();\n\n        if (_.options.rtl === true && _.options.vertical === false) {\n            targetLeft = -targetLeft;\n        }\n        if (_.transformsEnabled === false) {\n            if (_.options.vertical === false) {\n                _.$slideTrack.animate({\n                    left: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            } else {\n                _.$slideTrack.animate({\n                    top: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            }\n\n        } else {\n\n            if (_.cssTransitions === false) {\n                if (_.options.rtl === true) {\n                    _.currentLeft = -(_.currentLeft);\n                }\n                $({\n                    animStart: _.currentLeft\n                }).animate({\n                    animStart: targetLeft\n                }, {\n                    duration: _.options.speed,\n                    easing: _.options.easing,\n                    step: function(now) {\n                        now = Math.ceil(now);\n                        if (_.options.vertical === false) {\n                            animProps[_.animType] = 'translate(' +\n                                now + 'px, 0px)';\n                            _.$slideTrack.css(animProps);\n                        } else {\n                            animProps[_.animType] = 'translate(0px,' +\n                                now + 'px)';\n                            _.$slideTrack.css(animProps);\n                        }\n                    },\n                    complete: function() {\n                        if (callback) {\n                            callback.call();\n                        }\n                    }\n                });\n\n            } else {\n\n                _.applyTransition();\n                targetLeft = Math.ceil(targetLeft);\n\n                if (_.options.vertical === false) {\n                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';\n                } else {\n                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';\n                }\n                _.$slideTrack.css(animProps);\n\n                if (callback) {\n                    setTimeout(function() {\n\n                        _.disableTransition();\n\n                        callback.call();\n                    }, _.options.speed);\n                }\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.getNavTarget = function() {\n\n        var _ = this,\n            asNavFor = _.options.asNavFor;\n\n        if ( asNavFor && asNavFor !== null ) {\n            asNavFor = $(asNavFor).not(_.$slider);\n        }\n\n        return asNavFor;\n\n    };\n\n    Slick.prototype.asNavFor = function(index) {\n\n        var _ = this,\n            asNavFor = _.getNavTarget();\n\n        if ( asNavFor !== null && typeof asNavFor === 'object' ) {\n            asNavFor.each(function() {\n                var target = $(this).slick('getSlick');\n                if(!target.unslicked) {\n                    target.slideHandler(index, true);\n                }\n            });\n        }\n\n    };\n\n    Slick.prototype.applyTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        if (_.options.fade === false) {\n            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;\n        } else {\n            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;\n        }\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.autoPlay = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        if ( _.slideCount > _.options.slidesToShow ) {\n            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );\n        }\n\n    };\n\n    Slick.prototype.autoPlayClear = function() {\n\n        var _ = this;\n\n        if (_.autoPlayTimer) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n    };\n\n    Slick.prototype.autoPlayIterator = function() {\n\n        var _ = this,\n            slideTo = _.currentSlide + _.options.slidesToScroll;\n\n        if ( !_.paused && !_.interrupted && !_.focussed ) {\n\n            if ( _.options.infinite === false ) {\n\n                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {\n                    _.direction = 0;\n                }\n\n                else if ( _.direction === 0 ) {\n\n                    slideTo = _.currentSlide - _.options.slidesToScroll;\n\n                    if ( _.currentSlide - 1 === 0 ) {\n                        _.direction = 1;\n                    }\n\n                }\n\n            }\n\n            _.slideHandler( slideTo );\n\n        }\n\n    };\n\n    Slick.prototype.buildArrows = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true ) {\n\n            _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');\n            _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');\n\n            if( _.slideCount > _.options.slidesToShow ) {\n\n                _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n                _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n\n                if (_.htmlExpr.test(_.options.prevArrow)) {\n                    _.$prevArrow.prependTo(_.options.appendArrows);\n                }\n\n                if (_.htmlExpr.test(_.options.nextArrow)) {\n                    _.$nextArrow.appendTo(_.options.appendArrows);\n                }\n\n                if (_.options.infinite !== true) {\n                    _.$prevArrow\n                        .addClass('slick-disabled')\n                        .attr('aria-disabled', 'true');\n                }\n\n            } else {\n\n                _.$prevArrow.add( _.$nextArrow )\n\n                    .addClass('slick-hidden')\n                    .attr({\n                        'aria-disabled': 'true',\n                        'tabindex': '-1'\n                    });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.buildDots = function() {\n\n        var _ = this,\n            i, dot;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$slider.addClass('slick-dotted');\n\n            dot = $('<ul />').addClass(_.options.dotsClass);\n\n            for (i = 0; i <= _.getDotCount(); i += 1) {\n                dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));\n            }\n\n            _.$dots = dot.appendTo(_.options.appendDots);\n\n            _.$dots.find('li').first().addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.buildOut = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slider\n                .children( _.options.slide + ':not(.slick-cloned)')\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        _.$slides.each(function(index, element) {\n            $(element)\n                .attr('data-slick-index', index)\n                .data('originalStyling', $(element).attr('style') || '');\n        });\n\n        _.$slider.addClass('slick-slider');\n\n        _.$slideTrack = (_.slideCount === 0) ?\n            $('<div class=\"slick-track\"/>').appendTo(_.$slider) :\n            _.$slides.wrapAll('<div class=\"slick-track\"/>').parent();\n\n        _.$list = _.$slideTrack.wrap(\n            '<div class=\"slick-list\"/>').parent();\n        _.$slideTrack.css('opacity', 0);\n\n        if (_.options.centerMode === true || _.options.swipeToSlide === true) {\n            _.options.slidesToScroll = 1;\n        }\n\n        $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');\n\n        _.setupInfinite();\n\n        _.buildArrows();\n\n        _.buildDots();\n\n        _.updateDots();\n\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        if (_.options.draggable === true) {\n            _.$list.addClass('draggable');\n        }\n\n    };\n\n    Slick.prototype.buildRows = function() {\n\n        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;\n\n        newSlides = document.createDocumentFragment();\n        originalSlides = _.$slider.children();\n\n        if(_.options.rows > 0) {\n\n            slidesPerSection = _.options.slidesPerRow * _.options.rows;\n            numOfSlides = Math.ceil(\n                originalSlides.length / slidesPerSection\n            );\n\n            for(a = 0; a < numOfSlides; a++){\n                var slide = document.createElement('div');\n                for(b = 0; b < _.options.rows; b++) {\n                    var row = document.createElement('div');\n                    for(c = 0; c < _.options.slidesPerRow; c++) {\n                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));\n                        if (originalSlides.get(target)) {\n                            row.appendChild(originalSlides.get(target));\n                        }\n                    }\n                    slide.appendChild(row);\n                }\n                newSlides.appendChild(slide);\n            }\n\n            _.$slider.empty().append(newSlides);\n            _.$slider.children().children().children()\n                .css({\n                    'width':(100 / _.options.slidesPerRow) + '%',\n                    'display': 'inline-block'\n                });\n\n        }\n\n    };\n\n    Slick.prototype.checkResponsive = function(initial, forceUpdate) {\n\n        var _ = this,\n            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;\n        var sliderWidth = _.$slider.width();\n        var windowWidth = window.innerWidth || $(window).width();\n\n        if (_.respondTo === 'window') {\n            respondToWidth = windowWidth;\n        } else if (_.respondTo === 'slider') {\n            respondToWidth = sliderWidth;\n        } else if (_.respondTo === 'min') {\n            respondToWidth = Math.min(windowWidth, sliderWidth);\n        }\n\n        if ( _.options.responsive &&\n            _.options.responsive.length &&\n            _.options.responsive !== null) {\n\n            targetBreakpoint = null;\n\n            for (breakpoint in _.breakpoints) {\n                if (_.breakpoints.hasOwnProperty(breakpoint)) {\n                    if (_.originalSettings.mobileFirst === false) {\n                        if (respondToWidth < _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    } else {\n                        if (respondToWidth > _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    }\n                }\n            }\n\n            if (targetBreakpoint !== null) {\n                if (_.activeBreakpoint !== null) {\n                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {\n                        _.activeBreakpoint =\n                            targetBreakpoint;\n                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                            _.unslick(targetBreakpoint);\n                        } else {\n                            _.options = $.extend({}, _.originalSettings,\n                                _.breakpointSettings[\n                                    targetBreakpoint]);\n                            if (initial === true) {\n                                _.currentSlide = _.options.initialSlide;\n                            }\n                            _.refresh(initial);\n                        }\n                        triggerBreakpoint = targetBreakpoint;\n                    }\n                } else {\n                    _.activeBreakpoint = targetBreakpoint;\n                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                        _.unslick(targetBreakpoint);\n                    } else {\n                        _.options = $.extend({}, _.originalSettings,\n                            _.breakpointSettings[\n                                targetBreakpoint]);\n                        if (initial === true) {\n                            _.currentSlide = _.options.initialSlide;\n                        }\n                        _.refresh(initial);\n                    }\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            } else {\n                if (_.activeBreakpoint !== null) {\n                    _.activeBreakpoint = null;\n                    _.options = _.originalSettings;\n                    if (initial === true) {\n                        _.currentSlide = _.options.initialSlide;\n                    }\n                    _.refresh(initial);\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            }\n\n            // only trigger breakpoints during an actual break. not on initialize.\n            if( !initial && triggerBreakpoint !== false ) {\n                _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);\n            }\n        }\n\n    };\n\n    Slick.prototype.changeSlide = function(event, dontAnimate) {\n\n        var _ = this,\n            $target = $(event.currentTarget),\n            indexOffset, slideOffset, unevenOffset;\n\n        // If target is a link, prevent default action.\n        if($target.is('a')) {\n            event.preventDefault();\n        }\n\n        // If target is not the <li> element (ie: a child), find the <li>.\n        if(!$target.is('li')) {\n            $target = $target.closest('li');\n        }\n\n        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);\n        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;\n\n        switch (event.data.message) {\n\n            case 'previous':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'next':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'index':\n                var index = event.data.index === 0 ? 0 :\n                    event.data.index || $target.index() * _.options.slidesToScroll;\n\n                _.slideHandler(_.checkNavigable(index), false, dontAnimate);\n                $target.children().trigger('focus');\n                break;\n\n            default:\n                return;\n        }\n\n    };\n\n    Slick.prototype.checkNavigable = function(index) {\n\n        var _ = this,\n            navigables, prevNavigable;\n\n        navigables = _.getNavigableIndexes();\n        prevNavigable = 0;\n        if (index > navigables[navigables.length - 1]) {\n            index = navigables[navigables.length - 1];\n        } else {\n            for (var n in navigables) {\n                if (index < navigables[n]) {\n                    index = prevNavigable;\n                    break;\n                }\n                prevNavigable = navigables[n];\n            }\n        }\n\n        return index;\n    };\n\n    Slick.prototype.cleanUpEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots && _.$dots !== null) {\n\n            $('li', _.$dots)\n                .off('click.slick', _.changeSlide)\n                .off('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n            if (_.options.accessibility === true) {\n                _.$dots.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$slider.off('focus.slick blur.slick');\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);\n            _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);\n                _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);\n        _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);\n        _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);\n        _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);\n\n        _.$list.off('click.slick', _.clickHandler);\n\n        $(document).off(_.visibilityChange, _.visibility);\n\n        _.cleanUpSlideEvents();\n\n        if (_.options.accessibility === true) {\n            _.$list.off('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().off('click.slick', _.selectHandler);\n        }\n\n        $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);\n\n        $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);\n\n        $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);\n\n        $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);\n\n    };\n\n    Slick.prototype.cleanUpSlideEvents = function() {\n\n        var _ = this;\n\n        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));\n        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n    };\n\n    Slick.prototype.cleanUpRows = function() {\n\n        var _ = this, originalSlides;\n\n        if(_.options.rows > 0) {\n            originalSlides = _.$slides.children().children();\n            originalSlides.removeAttr('style');\n            _.$slider.empty().append(originalSlides);\n        }\n\n    };\n\n    Slick.prototype.clickHandler = function(event) {\n\n        var _ = this;\n\n        if (_.shouldClick === false) {\n            event.stopImmediatePropagation();\n            event.stopPropagation();\n            event.preventDefault();\n        }\n\n    };\n\n    Slick.prototype.destroy = function(refresh) {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        _.touchObject = {};\n\n        _.cleanUpEvents();\n\n        $('.slick-cloned', _.$slider).detach();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if ( _.$prevArrow && _.$prevArrow.length ) {\n\n            _.$prevArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.prevArrow )) {\n                _.$prevArrow.remove();\n            }\n        }\n\n        if ( _.$nextArrow && _.$nextArrow.length ) {\n\n            _.$nextArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.nextArrow )) {\n                _.$nextArrow.remove();\n            }\n        }\n\n\n        if (_.$slides) {\n\n            _.$slides\n                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')\n                .removeAttr('aria-hidden')\n                .removeAttr('data-slick-index')\n                .each(function(){\n                    $(this).attr('style', $(this).data('originalStyling'));\n                });\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slideTrack.detach();\n\n            _.$list.detach();\n\n            _.$slider.append(_.$slides);\n        }\n\n        _.cleanUpRows();\n\n        _.$slider.removeClass('slick-slider');\n        _.$slider.removeClass('slick-initialized');\n        _.$slider.removeClass('slick-dotted');\n\n        _.unslicked = true;\n\n        if(!refresh) {\n            _.$slider.trigger('destroy', [_]);\n        }\n\n    };\n\n    Slick.prototype.disableTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        transition[_.transitionType] = '';\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.fadeSlide = function(slideIndex, callback) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).css({\n                zIndex: _.options.zIndex\n            });\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 1\n            }, _.options.speed, _.options.easing, callback);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 1,\n                zIndex: _.options.zIndex\n            });\n\n            if (callback) {\n                setTimeout(function() {\n\n                    _.disableTransition(slideIndex);\n\n                    callback.call();\n                }, _.options.speed);\n            }\n\n        }\n\n    };\n\n    Slick.prototype.fadeSlideOut = function(slideIndex) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            }, _.options.speed, _.options.easing);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            });\n\n        }\n\n    };\n\n    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {\n\n        var _ = this;\n\n        if (filter !== null) {\n\n            _.$slidesCache = _.$slides;\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.focusHandler = function() {\n\n        var _ = this;\n\n        _.$slider\n            .off('focus.slick blur.slick')\n            .on('focus.slick blur.slick', '*', function(event) {\n\n            event.stopImmediatePropagation();\n            var $sf = $(this);\n\n            setTimeout(function() {\n\n                if( _.options.pauseOnFocus ) {\n                    _.focussed = $sf.is(':focus');\n                    _.autoPlay();\n                }\n\n            }, 0);\n\n        });\n    };\n\n    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {\n\n        var _ = this;\n        return _.currentSlide;\n\n    };\n\n    Slick.prototype.getDotCount = function() {\n\n        var _ = this;\n\n        var breakPoint = 0;\n        var counter = 0;\n        var pagerQty = 0;\n\n        if (_.options.infinite === true) {\n            if (_.slideCount <= _.options.slidesToShow) {\n                 ++pagerQty;\n            } else {\n                while (breakPoint < _.slideCount) {\n                    ++pagerQty;\n                    breakPoint = counter + _.options.slidesToScroll;\n                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n                }\n            }\n        } else if (_.options.centerMode === true) {\n            pagerQty = _.slideCount;\n        } else if(!_.options.asNavFor) {\n            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);\n        }else {\n            while (breakPoint < _.slideCount) {\n                ++pagerQty;\n                breakPoint = counter + _.options.slidesToScroll;\n                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n            }\n        }\n\n        return pagerQty - 1;\n\n    };\n\n    Slick.prototype.getLeft = function(slideIndex) {\n\n        var _ = this,\n            targetLeft,\n            verticalHeight,\n            verticalOffset = 0,\n            targetSlide,\n            coef;\n\n        _.slideOffset = 0;\n        verticalHeight = _.$slides.first().outerHeight(true);\n\n        if (_.options.infinite === true) {\n            if (_.slideCount > _.options.slidesToShow) {\n                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;\n                coef = -1\n\n                if (_.options.vertical === true && _.options.centerMode === true) {\n                    if (_.options.slidesToShow === 2) {\n                        coef = -1.5;\n                    } else if (_.options.slidesToShow === 1) {\n                        coef = -2\n                    }\n                }\n                verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;\n            }\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {\n                    if (slideIndex > _.slideCount) {\n                        _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;\n                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;\n                    } else {\n                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;\n                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;\n                    }\n                }\n            }\n        } else {\n            if (slideIndex + _.options.slidesToShow > _.slideCount) {\n                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;\n                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;\n            }\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = 0;\n            verticalOffset = 0;\n        }\n\n        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);\n        } else if (_.options.centerMode === true && _.options.infinite === true) {\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;\n        } else if (_.options.centerMode === true) {\n            _.slideOffset = 0;\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);\n        }\n\n        if (_.options.vertical === false) {\n            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;\n        } else {\n            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;\n        }\n\n        if (_.options.variableWidth === true) {\n\n            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n            } else {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);\n            }\n\n            if (_.options.rtl === true) {\n                if (targetSlide[0]) {\n                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                } else {\n                    targetLeft =  0;\n                }\n            } else {\n                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n            }\n\n            if (_.options.centerMode === true) {\n                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n                } else {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);\n                }\n\n                if (_.options.rtl === true) {\n                    if (targetSlide[0]) {\n                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                    } else {\n                        targetLeft =  0;\n                    }\n                } else {\n                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n                }\n\n                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;\n            }\n        }\n\n        return targetLeft;\n\n    };\n\n    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {\n\n        var _ = this;\n\n        return _.options[option];\n\n    };\n\n    Slick.prototype.getNavigableIndexes = function() {\n\n        var _ = this,\n            breakPoint = 0,\n            counter = 0,\n            indexes = [],\n            max;\n\n        if (_.options.infinite === false) {\n            max = _.slideCount;\n        } else {\n            breakPoint = _.options.slidesToScroll * -1;\n            counter = _.options.slidesToScroll * -1;\n            max = _.slideCount * 2;\n        }\n\n        while (breakPoint < max) {\n            indexes.push(breakPoint);\n            breakPoint = counter + _.options.slidesToScroll;\n            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n        }\n\n        return indexes;\n\n    };\n\n    Slick.prototype.getSlick = function() {\n\n        return this;\n\n    };\n\n    Slick.prototype.getSlideCount = function() {\n\n        var _ = this,\n            slidesTraversed, swipedSlide, centerOffset;\n\n        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;\n\n        if (_.options.swipeToSlide === true) {\n            _.$slideTrack.find('.slick-slide').each(function(index, slide) {\n                if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {\n                    swipedSlide = slide;\n                    return false;\n                }\n            });\n\n            slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;\n\n            return slidesTraversed;\n\n        } else {\n            return _.options.slidesToScroll;\n        }\n\n    };\n\n    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'index',\n                index: parseInt(slide)\n            }\n        }, dontAnimate);\n\n    };\n\n    Slick.prototype.init = function(creation) {\n\n        var _ = this;\n\n        if (!$(_.$slider).hasClass('slick-initialized')) {\n\n            $(_.$slider).addClass('slick-initialized');\n\n            _.buildRows();\n            _.buildOut();\n            _.setProps();\n            _.startLoad();\n            _.loadSlider();\n            _.initializeEvents();\n            _.updateArrows();\n            _.updateDots();\n            _.checkResponsive(true);\n            _.focusHandler();\n\n        }\n\n        if (creation) {\n            _.$slider.trigger('init', [_]);\n        }\n\n        if (_.options.accessibility === true) {\n            _.initADA();\n        }\n\n        if ( _.options.autoplay ) {\n\n            _.paused = false;\n            _.autoPlay();\n\n        }\n\n    };\n\n    Slick.prototype.initADA = function() {\n        var _ = this,\n                numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),\n                tabControlIndexes = _.getNavigableIndexes().filter(function(val) {\n                    return (val >= 0) && (val < _.slideCount);\n                });\n\n        _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({\n            'aria-hidden': 'true',\n            'tabindex': '-1'\n        }).find('a, input, button, select').attr({\n            'tabindex': '-1'\n        });\n\n        if (_.$dots !== null) {\n            _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) {\n                var slideControlIndex = tabControlIndexes.indexOf(i);\n\n                $(this).attr({\n                    'role': 'tabpanel',\n                    'id': 'slick-slide' + _.instanceUid + i,\n                    'tabindex': -1\n                });\n\n                if (slideControlIndex !== -1) {\n                   var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex\n                   if ($('#' + ariaButtonControl).length) {\n                     $(this).attr({\n                         'aria-describedby': ariaButtonControl\n                     });\n                   }\n                }\n            });\n\n            _.$dots.attr('role', 'tablist').find('li').each(function(i) {\n                var mappedSlideIndex = tabControlIndexes[i];\n\n                $(this).attr({\n                    'role': 'presentation'\n                });\n\n                $(this).find('button').first().attr({\n                    'role': 'tab',\n                    'id': 'slick-slide-control' + _.instanceUid + i,\n                    'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex,\n                    'aria-label': (i + 1) + ' of ' + numDotGroups,\n                    'aria-selected': null,\n                    'tabindex': '-1'\n                });\n\n            }).eq(_.currentSlide).find('button').attr({\n                'aria-selected': 'true',\n                'tabindex': '0'\n            }).end();\n        }\n\n        for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) {\n          if (_.options.focusOnChange) {\n            _.$slides.eq(i).attr({'tabindex': '0'});\n          } else {\n            _.$slides.eq(i).removeAttr('tabindex');\n          }\n        }\n\n        _.activateADA();\n\n    };\n\n    Slick.prototype.initArrowEvents = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'previous'\n               }, _.changeSlide);\n            _.$nextArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'next'\n               }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow.on('keydown.slick', _.keyHandler);\n                _.$nextArrow.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n    };\n\n    Slick.prototype.initDotEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n            $('li', _.$dots).on('click.slick', {\n                message: 'index'\n            }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$dots.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n        if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {\n\n            $('li', _.$dots)\n                .on('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initSlideEvents = function() {\n\n        var _ = this;\n\n        if ( _.options.pauseOnHover ) {\n\n            _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));\n            _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initializeEvents = function() {\n\n        var _ = this;\n\n        _.initArrowEvents();\n\n        _.initDotEvents();\n        _.initSlideEvents();\n\n        _.$list.on('touchstart.slick mousedown.slick', {\n            action: 'start'\n        }, _.swipeHandler);\n        _.$list.on('touchmove.slick mousemove.slick', {\n            action: 'move'\n        }, _.swipeHandler);\n        _.$list.on('touchend.slick mouseup.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n        _.$list.on('touchcancel.slick mouseleave.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n\n        _.$list.on('click.slick', _.clickHandler);\n\n        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));\n\n        if (_.options.accessibility === true) {\n            _.$list.on('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));\n\n        $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));\n\n        $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);\n\n        $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);\n        $(_.setPosition);\n\n    };\n\n    Slick.prototype.initUI = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.show();\n            _.$nextArrow.show();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.show();\n\n        }\n\n    };\n\n    Slick.prototype.keyHandler = function(event) {\n\n        var _ = this;\n         //Dont slide if the cursor is inside the form fields and arrow keys are pressed\n        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {\n            if (event.keyCode === 37 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'next' :  'previous'\n                    }\n                });\n            } else if (event.keyCode === 39 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'previous' : 'next'\n                    }\n                });\n            }\n        }\n\n    };\n\n    Slick.prototype.lazyLoad = function() {\n\n        var _ = this,\n            loadRange, cloneRange, rangeStart, rangeEnd;\n\n        function loadImages(imagesScope) {\n\n            $('img[data-lazy]', imagesScope).each(function() {\n\n                var image = $(this),\n                    imageSource = $(this).attr('data-lazy'),\n                    imageSrcSet = $(this).attr('data-srcset'),\n                    imageSizes  = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),\n                    imageToLoad = document.createElement('img');\n\n                imageToLoad.onload = function() {\n\n                    image\n                        .animate({ opacity: 0 }, 100, function() {\n\n                            if (imageSrcSet) {\n                                image\n                                    .attr('srcset', imageSrcSet );\n\n                                if (imageSizes) {\n                                    image\n                                        .attr('sizes', imageSizes );\n                                }\n                            }\n\n                            image\n                                .attr('src', imageSource)\n                                .animate({ opacity: 1 }, 200, function() {\n                                    image\n                                        .removeAttr('data-lazy data-srcset data-sizes')\n                                        .removeClass('slick-loading');\n                                });\n                            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);\n                        });\n\n                };\n\n                imageToLoad.onerror = function() {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                };\n\n                imageToLoad.src = imageSource;\n\n            });\n\n        }\n\n        if (_.options.centerMode === true) {\n            if (_.options.infinite === true) {\n                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);\n                rangeEnd = rangeStart + _.options.slidesToShow + 2;\n            } else {\n                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));\n                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;\n            }\n        } else {\n            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;\n            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);\n            if (_.options.fade === true) {\n                if (rangeStart > 0) rangeStart--;\n                if (rangeEnd <= _.slideCount) rangeEnd++;\n            }\n        }\n\n        loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);\n\n        if (_.options.lazyLoad === 'anticipated') {\n            var prevSlide = rangeStart - 1,\n                nextSlide = rangeEnd,\n                $slides = _.$slider.find('.slick-slide');\n\n            for (var i = 0; i < _.options.slidesToScroll; i++) {\n                if (prevSlide < 0) prevSlide = _.slideCount - 1;\n                loadRange = loadRange.add($slides.eq(prevSlide));\n                loadRange = loadRange.add($slides.eq(nextSlide));\n                prevSlide--;\n                nextSlide++;\n            }\n        }\n\n        loadImages(loadRange);\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-slide');\n            loadImages(cloneRange);\n        } else\n        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);\n            loadImages(cloneRange);\n        } else if (_.currentSlide === 0) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);\n            loadImages(cloneRange);\n        }\n\n    };\n\n    Slick.prototype.loadSlider = function() {\n\n        var _ = this;\n\n        _.setPosition();\n\n        _.$slideTrack.css({\n            opacity: 1\n        });\n\n        _.$slider.removeClass('slick-loading');\n\n        _.initUI();\n\n        if (_.options.lazyLoad === 'progressive') {\n            _.progressiveLazyLoad();\n        }\n\n    };\n\n    Slick.prototype.next = Slick.prototype.slickNext = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'next'\n            }\n        });\n\n    };\n\n    Slick.prototype.orientationChange = function() {\n\n        var _ = this;\n\n        _.checkResponsive();\n        _.setPosition();\n\n    };\n\n    Slick.prototype.pause = Slick.prototype.slickPause = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n        _.paused = true;\n\n    };\n\n    Slick.prototype.play = Slick.prototype.slickPlay = function() {\n\n        var _ = this;\n\n        _.autoPlay();\n        _.options.autoplay = true;\n        _.paused = false;\n        _.focussed = false;\n        _.interrupted = false;\n\n    };\n\n    Slick.prototype.postSlide = function(index) {\n\n        var _ = this;\n\n        if( !_.unslicked ) {\n\n            _.$slider.trigger('afterChange', [_, index]);\n\n            _.animating = false;\n\n            if (_.slideCount > _.options.slidesToShow) {\n                _.setPosition();\n            }\n\n            _.swipeLeft = null;\n\n            if ( _.options.autoplay ) {\n                _.autoPlay();\n            }\n\n            if (_.options.accessibility === true) {\n                _.initADA();\n\n                if (_.options.focusOnChange) {\n                    var $currentSlide = $(_.$slides.get(_.currentSlide));\n                    $currentSlide.attr('tabindex', 0).focus();\n                }\n            }\n\n        }\n\n    };\n\n    Slick.prototype.prev = Slick.prototype.slickPrev = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'previous'\n            }\n        });\n\n    };\n\n    Slick.prototype.preventDefault = function(event) {\n\n        event.preventDefault();\n\n    };\n\n    Slick.prototype.progressiveLazyLoad = function( tryCount ) {\n\n        tryCount = tryCount || 1;\n\n        var _ = this,\n            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),\n            image,\n            imageSource,\n            imageSrcSet,\n            imageSizes,\n            imageToLoad;\n\n        if ( $imgsToLoad.length ) {\n\n            image = $imgsToLoad.first();\n            imageSource = image.attr('data-lazy');\n            imageSrcSet = image.attr('data-srcset');\n            imageSizes  = image.attr('data-sizes') || _.$slider.attr('data-sizes');\n            imageToLoad = document.createElement('img');\n\n            imageToLoad.onload = function() {\n\n                if (imageSrcSet) {\n                    image\n                        .attr('srcset', imageSrcSet );\n\n                    if (imageSizes) {\n                        image\n                            .attr('sizes', imageSizes );\n                    }\n                }\n\n                image\n                    .attr( 'src', imageSource )\n                    .removeAttr('data-lazy data-srcset data-sizes')\n                    .removeClass('slick-loading');\n\n                if ( _.options.adaptiveHeight === true ) {\n                    _.setPosition();\n                }\n\n                _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);\n                _.progressiveLazyLoad();\n\n            };\n\n            imageToLoad.onerror = function() {\n\n                if ( tryCount < 3 ) {\n\n                    /**\n                     * try to load the image 3 times,\n                     * leave a slight delay so we don't get\n                     * servers blocking the request.\n                     */\n                    setTimeout( function() {\n                        _.progressiveLazyLoad( tryCount + 1 );\n                    }, 500 );\n\n                } else {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                    _.progressiveLazyLoad();\n\n                }\n\n            };\n\n            imageToLoad.src = imageSource;\n\n        } else {\n\n            _.$slider.trigger('allImagesLoaded', [ _ ]);\n\n        }\n\n    };\n\n    Slick.prototype.refresh = function( initializing ) {\n\n        var _ = this, currentSlide, lastVisibleIndex;\n\n        lastVisibleIndex = _.slideCount - _.options.slidesToShow;\n\n        // in non-infinite sliders, we don't want to go past the\n        // last visible index.\n        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {\n            _.currentSlide = lastVisibleIndex;\n        }\n\n        // if less slides than to show, go to start.\n        if ( _.slideCount <= _.options.slidesToShow ) {\n            _.currentSlide = 0;\n\n        }\n\n        currentSlide = _.currentSlide;\n\n        _.destroy(true);\n\n        $.extend(_, _.initials, { currentSlide: currentSlide });\n\n        _.init();\n\n        if( !initializing ) {\n\n            _.changeSlide({\n                data: {\n                    message: 'index',\n                    index: currentSlide\n                }\n            }, false);\n\n        }\n\n    };\n\n    Slick.prototype.registerBreakpoints = function() {\n\n        var _ = this, breakpoint, currentBreakpoint, l,\n            responsiveSettings = _.options.responsive || null;\n\n        if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {\n\n            _.respondTo = _.options.respondTo || 'window';\n\n            for ( breakpoint in responsiveSettings ) {\n\n                l = _.breakpoints.length-1;\n\n                if (responsiveSettings.hasOwnProperty(breakpoint)) {\n                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;\n\n                    // loop through the breakpoints and cut out any existing\n                    // ones with the same breakpoint number, we don't want dupes.\n                    while( l >= 0 ) {\n                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {\n                            _.breakpoints.splice(l,1);\n                        }\n                        l--;\n                    }\n\n                    _.breakpoints.push(currentBreakpoint);\n                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;\n\n                }\n\n            }\n\n            _.breakpoints.sort(function(a, b) {\n                return ( _.options.mobileFirst ) ? a-b : b-a;\n            });\n\n        }\n\n    };\n\n    Slick.prototype.reinit = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slideTrack\n                .children(_.options.slide)\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {\n            _.currentSlide = _.currentSlide - _.options.slidesToScroll;\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.currentSlide = 0;\n        }\n\n        _.registerBreakpoints();\n\n        _.setProps();\n        _.setupInfinite();\n        _.buildArrows();\n        _.updateArrows();\n        _.initArrowEvents();\n        _.buildDots();\n        _.updateDots();\n        _.initDotEvents();\n        _.cleanUpSlideEvents();\n        _.initSlideEvents();\n\n        _.checkResponsive(false, true);\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        _.setPosition();\n        _.focusHandler();\n\n        _.paused = !_.options.autoplay;\n        _.autoPlay();\n\n        _.$slider.trigger('reInit', [_]);\n\n    };\n\n    Slick.prototype.resize = function() {\n\n        var _ = this;\n\n        if ($(window).width() !== _.windowWidth) {\n            clearTimeout(_.windowDelay);\n            _.windowDelay = window.setTimeout(function() {\n                _.windowWidth = $(window).width();\n                _.checkResponsive();\n                if( !_.unslicked ) { _.setPosition(); }\n            }, 50);\n        }\n    };\n\n    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            removeBefore = index;\n            index = removeBefore === true ? 0 : _.slideCount - 1;\n        } else {\n            index = removeBefore === true ? --index : index;\n        }\n\n        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {\n            return false;\n        }\n\n        _.unload();\n\n        if (removeAll === true) {\n            _.$slideTrack.children().remove();\n        } else {\n            _.$slideTrack.children(this.options.slide).eq(index).remove();\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.setCSS = function(position) {\n\n        var _ = this,\n            positionProps = {},\n            x, y;\n\n        if (_.options.rtl === true) {\n            position = -position;\n        }\n        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';\n        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';\n\n        positionProps[_.positionProp] = position;\n\n        if (_.transformsEnabled === false) {\n            _.$slideTrack.css(positionProps);\n        } else {\n            positionProps = {};\n            if (_.cssTransitions === false) {\n                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';\n                _.$slideTrack.css(positionProps);\n            } else {\n                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';\n                _.$slideTrack.css(positionProps);\n            }\n        }\n\n    };\n\n    Slick.prototype.setDimensions = function() {\n\n        var _ = this;\n\n        if (_.options.vertical === false) {\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: ('0px ' + _.options.centerPadding)\n                });\n            }\n        } else {\n            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: (_.options.centerPadding + ' 0px')\n                });\n            }\n        }\n\n        _.listWidth = _.$list.width();\n        _.listHeight = _.$list.height();\n\n\n        if (_.options.vertical === false && _.options.variableWidth === false) {\n            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);\n            _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));\n\n        } else if (_.options.variableWidth === true) {\n            _.$slideTrack.width(5000 * _.slideCount);\n        } else {\n            _.slideWidth = Math.ceil(_.listWidth);\n            _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));\n        }\n\n        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();\n        if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);\n\n    };\n\n    Slick.prototype.setFade = function() {\n\n        var _ = this,\n            targetLeft;\n\n        _.$slides.each(function(index, element) {\n            targetLeft = (_.slideWidth * index) * -1;\n            if (_.options.rtl === true) {\n                $(element).css({\n                    position: 'relative',\n                    right: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            } else {\n                $(element).css({\n                    position: 'relative',\n                    left: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            }\n        });\n\n        _.$slides.eq(_.currentSlide).css({\n            zIndex: _.options.zIndex - 1,\n            opacity: 1\n        });\n\n    };\n\n    Slick.prototype.setHeight = function() {\n\n        var _ = this;\n\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.css('height', targetHeight);\n        }\n\n    };\n\n    Slick.prototype.setOption =\n    Slick.prototype.slickSetOption = function() {\n\n        /**\n         * accepts arguments in format of:\n         *\n         *  - for changing a single option's value:\n         *     .slick(\"setOption\", option, value, refresh )\n         *\n         *  - for changing a set of responsive options:\n         *     .slick(\"setOption\", 'responsive', [{}, ...], refresh )\n         *\n         *  - for updating multiple values at once (not responsive)\n         *     .slick(\"setOption\", { 'option': value, ... }, refresh )\n         */\n\n        var _ = this, l, item, option, value, refresh = false, type;\n\n        if( $.type( arguments[0] ) === 'object' ) {\n\n            option =  arguments[0];\n            refresh = arguments[1];\n            type = 'multiple';\n\n        } else if ( $.type( arguments[0] ) === 'string' ) {\n\n            option =  arguments[0];\n            value = arguments[1];\n            refresh = arguments[2];\n\n            if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {\n\n                type = 'responsive';\n\n            } else if ( typeof arguments[1] !== 'undefined' ) {\n\n                type = 'single';\n\n            }\n\n        }\n\n        if ( type === 'single' ) {\n\n            _.options[option] = value;\n\n\n        } else if ( type === 'multiple' ) {\n\n            $.each( option , function( opt, val ) {\n\n                _.options[opt] = val;\n\n            });\n\n\n        } else if ( type === 'responsive' ) {\n\n            for ( item in value ) {\n\n                if( $.type( _.options.responsive ) !== 'array' ) {\n\n                    _.options.responsive = [ value[item] ];\n\n                } else {\n\n                    l = _.options.responsive.length-1;\n\n                    // loop through the responsive object and splice out duplicates.\n                    while( l >= 0 ) {\n\n                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {\n\n                            _.options.responsive.splice(l,1);\n\n                        }\n\n                        l--;\n\n                    }\n\n                    _.options.responsive.push( value[item] );\n\n                }\n\n            }\n\n        }\n\n        if ( refresh ) {\n\n            _.unload();\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.setPosition = function() {\n\n        var _ = this;\n\n        _.setDimensions();\n\n        _.setHeight();\n\n        if (_.options.fade === false) {\n            _.setCSS(_.getLeft(_.currentSlide));\n        } else {\n            _.setFade();\n        }\n\n        _.$slider.trigger('setPosition', [_]);\n\n    };\n\n    Slick.prototype.setProps = function() {\n\n        var _ = this,\n            bodyStyle = document.body.style;\n\n        _.positionProp = _.options.vertical === true ? 'top' : 'left';\n\n        if (_.positionProp === 'top') {\n            _.$slider.addClass('slick-vertical');\n        } else {\n            _.$slider.removeClass('slick-vertical');\n        }\n\n        if (bodyStyle.WebkitTransition !== undefined ||\n            bodyStyle.MozTransition !== undefined ||\n            bodyStyle.msTransition !== undefined) {\n            if (_.options.useCSS === true) {\n                _.cssTransitions = true;\n            }\n        }\n\n        if ( _.options.fade ) {\n            if ( typeof _.options.zIndex === 'number' ) {\n                if( _.options.zIndex < 3 ) {\n                    _.options.zIndex = 3;\n                }\n            } else {\n                _.options.zIndex = _.defaults.zIndex;\n            }\n        }\n\n        if (bodyStyle.OTransform !== undefined) {\n            _.animType = 'OTransform';\n            _.transformType = '-o-transform';\n            _.transitionType = 'OTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.MozTransform !== undefined) {\n            _.animType = 'MozTransform';\n            _.transformType = '-moz-transform';\n            _.transitionType = 'MozTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.webkitTransform !== undefined) {\n            _.animType = 'webkitTransform';\n            _.transformType = '-webkit-transform';\n            _.transitionType = 'webkitTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.msTransform !== undefined) {\n            _.animType = 'msTransform';\n            _.transformType = '-ms-transform';\n            _.transitionType = 'msTransition';\n            if (bodyStyle.msTransform === undefined) _.animType = false;\n        }\n        if (bodyStyle.transform !== undefined && _.animType !== false) {\n            _.animType = 'transform';\n            _.transformType = 'transform';\n            _.transitionType = 'transition';\n        }\n        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);\n    };\n\n\n    Slick.prototype.setSlideClasses = function(index) {\n\n        var _ = this,\n            centerOffset, allSlides, indexOffset, remainder;\n\n        allSlides = _.$slider\n            .find('.slick-slide')\n            .removeClass('slick-active slick-center slick-current')\n            .attr('aria-hidden', 'true');\n\n        _.$slides\n            .eq(index)\n            .addClass('slick-current');\n\n        if (_.options.centerMode === true) {\n\n            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;\n\n            centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n            if (_.options.infinite === true) {\n\n                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {\n                    _.$slides\n                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    indexOffset = _.options.slidesToShow + index;\n                    allSlides\n                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n                if (index === 0) {\n\n                    allSlides\n                        .eq(allSlides.length - 1 - _.options.slidesToShow)\n                        .addClass('slick-center');\n\n                } else if (index === _.slideCount - 1) {\n\n                    allSlides\n                        .eq(_.options.slidesToShow)\n                        .addClass('slick-center');\n\n                }\n\n            }\n\n            _.$slides\n                .eq(index)\n                .addClass('slick-center');\n\n        } else {\n\n            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {\n\n                _.$slides\n                    .slice(index, index + _.options.slidesToShow)\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else if (allSlides.length <= _.options.slidesToShow) {\n\n                allSlides\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else {\n\n                remainder = _.slideCount % _.options.slidesToShow;\n                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;\n\n                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {\n\n                    allSlides\n                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    allSlides\n                        .slice(indexOffset, indexOffset + _.options.slidesToShow)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n            }\n\n        }\n\n        if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {\n            _.lazyLoad();\n        }\n    };\n\n    Slick.prototype.setupInfinite = function() {\n\n        var _ = this,\n            i, slideIndex, infiniteCount;\n\n        if (_.options.fade === true) {\n            _.options.centerMode = false;\n        }\n\n        if (_.options.infinite === true && _.options.fade === false) {\n\n            slideIndex = null;\n\n            if (_.slideCount > _.options.slidesToShow) {\n\n                if (_.options.centerMode === true) {\n                    infiniteCount = _.options.slidesToShow + 1;\n                } else {\n                    infiniteCount = _.options.slidesToShow;\n                }\n\n                for (i = _.slideCount; i > (_.slideCount -\n                        infiniteCount); i -= 1) {\n                    slideIndex = i - 1;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex - _.slideCount)\n                        .prependTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {\n                    slideIndex = i;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex + _.slideCount)\n                        .appendTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {\n                    $(this).attr('id', '');\n                });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.interrupt = function( toggle ) {\n\n        var _ = this;\n\n        if( !toggle ) {\n            _.autoPlay();\n        }\n        _.interrupted = toggle;\n\n    };\n\n    Slick.prototype.selectHandler = function(event) {\n\n        var _ = this;\n\n        var targetElement =\n            $(event.target).is('.slick-slide') ?\n                $(event.target) :\n                $(event.target).parents('.slick-slide');\n\n        var index = parseInt(targetElement.attr('data-slick-index'));\n\n        if (!index) index = 0;\n\n        if (_.slideCount <= _.options.slidesToShow) {\n\n            _.slideHandler(index, false, true);\n            return;\n\n        }\n\n        _.slideHandler(index);\n\n    };\n\n    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {\n\n        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,\n            _ = this, navTarget;\n\n        sync = sync || false;\n\n        if (_.animating === true && _.options.waitForAnimate === true) {\n            return;\n        }\n\n        if (_.options.fade === true && _.currentSlide === index) {\n            return;\n        }\n\n        if (sync === false) {\n            _.asNavFor(index);\n        }\n\n        targetSlide = index;\n        targetLeft = _.getLeft(targetSlide);\n        slideLeft = _.getLeft(_.currentSlide);\n\n        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;\n\n        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        }\n\n        if ( _.options.autoplay ) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n        if (targetSlide < 0) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);\n            } else {\n                animSlide = _.slideCount + targetSlide;\n            }\n        } else if (targetSlide >= _.slideCount) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = 0;\n            } else {\n                animSlide = targetSlide - _.slideCount;\n            }\n        } else {\n            animSlide = targetSlide;\n        }\n\n        _.animating = true;\n\n        _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);\n\n        oldSlide = _.currentSlide;\n        _.currentSlide = animSlide;\n\n        _.setSlideClasses(_.currentSlide);\n\n        if ( _.options.asNavFor ) {\n\n            navTarget = _.getNavTarget();\n            navTarget = navTarget.slick('getSlick');\n\n            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {\n                navTarget.setSlideClasses(_.currentSlide);\n            }\n\n        }\n\n        _.updateDots();\n        _.updateArrows();\n\n        if (_.options.fade === true) {\n            if (dontAnimate !== true) {\n\n                _.fadeSlideOut(oldSlide);\n\n                _.fadeSlide(animSlide, function() {\n                    _.postSlide(animSlide);\n                });\n\n            } else {\n                _.postSlide(animSlide);\n            }\n            _.animateHeight();\n            return;\n        }\n\n        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n            _.animateSlide(targetLeft, function() {\n                _.postSlide(animSlide);\n            });\n        } else {\n            _.postSlide(animSlide);\n        }\n\n    };\n\n    Slick.prototype.startLoad = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.hide();\n            _.$nextArrow.hide();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.hide();\n\n        }\n\n        _.$slider.addClass('slick-loading');\n\n    };\n\n    Slick.prototype.swipeDirection = function() {\n\n        var xDist, yDist, r, swipeAngle, _ = this;\n\n        xDist = _.touchObject.startX - _.touchObject.curX;\n        yDist = _.touchObject.startY - _.touchObject.curY;\n        r = Math.atan2(yDist, xDist);\n\n        swipeAngle = Math.round(r * 180 / Math.PI);\n        if (swipeAngle < 0) {\n            swipeAngle = 360 - Math.abs(swipeAngle);\n        }\n\n        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {\n            return (_.options.rtl === false ? 'right' : 'left');\n        }\n        if (_.options.verticalSwiping === true) {\n            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {\n                return 'down';\n            } else {\n                return 'up';\n            }\n        }\n\n        return 'vertical';\n\n    };\n\n    Slick.prototype.swipeEnd = function(event) {\n\n        var _ = this,\n            slideCount,\n            direction;\n\n        _.dragging = false;\n        _.swiping = false;\n\n        if (_.scrolling) {\n            _.scrolling = false;\n            return false;\n        }\n\n        _.interrupted = false;\n        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;\n\n        if ( _.touchObject.curX === undefined ) {\n            return false;\n        }\n\n        if ( _.touchObject.edgeHit === true ) {\n            _.$slider.trigger('edge', [_, _.swipeDirection() ]);\n        }\n\n        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {\n\n            direction = _.swipeDirection();\n\n            switch ( direction ) {\n\n                case 'left':\n                case 'down':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :\n                            _.currentSlide + _.getSlideCount();\n\n                    _.currentDirection = 0;\n\n                    break;\n\n                case 'right':\n                case 'up':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :\n                            _.currentSlide - _.getSlideCount();\n\n                    _.currentDirection = 1;\n\n                    break;\n\n                default:\n\n\n            }\n\n            if( direction != 'vertical' ) {\n\n                _.slideHandler( slideCount );\n                _.touchObject = {};\n                _.$slider.trigger('swipe', [_, direction ]);\n\n            }\n\n        } else {\n\n            if ( _.touchObject.startX !== _.touchObject.curX ) {\n\n                _.slideHandler( _.currentSlide );\n                _.touchObject = {};\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.swipeHandler = function(event) {\n\n        var _ = this;\n\n        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {\n            return;\n        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {\n            return;\n        }\n\n        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?\n            event.originalEvent.touches.length : 1;\n\n        _.touchObject.minSwipe = _.listWidth / _.options\n            .touchThreshold;\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.minSwipe = _.listHeight / _.options\n                .touchThreshold;\n        }\n\n        switch (event.data.action) {\n\n            case 'start':\n                _.swipeStart(event);\n                break;\n\n            case 'move':\n                _.swipeMove(event);\n                break;\n\n            case 'end':\n                _.swipeEnd(event);\n                break;\n\n        }\n\n    };\n\n    Slick.prototype.swipeMove = function(event) {\n\n        var _ = this,\n            edgeWasHit = false,\n            curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;\n\n        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;\n\n        if (!_.dragging || _.scrolling || touches && touches.length !== 1) {\n            return false;\n        }\n\n        curLeft = _.getLeft(_.currentSlide);\n\n        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;\n        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;\n\n        _.touchObject.swipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));\n\n        verticalSwipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));\n\n        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {\n            _.scrolling = true;\n            return false;\n        }\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.swipeLength = verticalSwipeLength;\n        }\n\n        swipeDirection = _.swipeDirection();\n\n        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {\n            _.swiping = true;\n            event.preventDefault();\n        }\n\n        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);\n        if (_.options.verticalSwiping === true) {\n            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;\n        }\n\n\n        swipeLength = _.touchObject.swipeLength;\n\n        _.touchObject.edgeHit = false;\n\n        if (_.options.infinite === false) {\n            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {\n                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;\n                _.touchObject.edgeHit = true;\n            }\n        }\n\n        if (_.options.vertical === false) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        } else {\n            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;\n        }\n        if (_.options.verticalSwiping === true) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        }\n\n        if (_.options.fade === true || _.options.touchMove === false) {\n            return false;\n        }\n\n        if (_.animating === true) {\n            _.swipeLeft = null;\n            return false;\n        }\n\n        _.setCSS(_.swipeLeft);\n\n    };\n\n    Slick.prototype.swipeStart = function(event) {\n\n        var _ = this,\n            touches;\n\n        _.interrupted = true;\n\n        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {\n            _.touchObject = {};\n            return false;\n        }\n\n        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {\n            touches = event.originalEvent.touches[0];\n        }\n\n        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;\n        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;\n\n        _.dragging = true;\n\n    };\n\n    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {\n\n        var _ = this;\n\n        if (_.$slidesCache !== null) {\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.unload = function() {\n\n        var _ = this;\n\n        $('.slick-cloned', _.$slider).remove();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {\n            _.$prevArrow.remove();\n        }\n\n        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {\n            _.$nextArrow.remove();\n        }\n\n        _.$slides\n            .removeClass('slick-slide slick-active slick-visible slick-current')\n            .attr('aria-hidden', 'true')\n            .css('width', '');\n\n    };\n\n    Slick.prototype.unslick = function(fromBreakpoint) {\n\n        var _ = this;\n        _.$slider.trigger('unslick', [_, fromBreakpoint]);\n        _.destroy();\n\n    };\n\n    Slick.prototype.updateArrows = function() {\n\n        var _ = this,\n            centerOffset;\n\n        centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n        if ( _.options.arrows === true &&\n            _.slideCount > _.options.slidesToShow &&\n            !_.options.infinite ) {\n\n            _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n            _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            if (_.currentSlide === 0) {\n\n                _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.updateDots = function() {\n\n        var _ = this;\n\n        if (_.$dots !== null) {\n\n            _.$dots\n                .find('li')\n                    .removeClass('slick-active')\n                    .end();\n\n            _.$dots\n                .find('li')\n                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))\n                .addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.visibility = function() {\n\n        var _ = this;\n\n        if ( _.options.autoplay ) {\n\n            if ( document[_.hidden] ) {\n\n                _.interrupted = true;\n\n            } else {\n\n                _.interrupted = false;\n\n            }\n\n        }\n\n    };\n\n    $.fn.slick = function() {\n        var _ = this,\n            opt = arguments[0],\n            args = Array.prototype.slice.call(arguments, 1),\n            l = _.length,\n            i,\n            ret;\n        for (i = 0; i < l; i++) {\n            if (typeof opt == 'object' || typeof opt == 'undefined')\n                _[i].slick = new Slick(_[i], opt);\n            else\n                ret = _[i].slick[opt].apply(_[i].slick, args);\n            if (typeof ret != 'undefined') return ret;\n        }\n        return _;\n    };\n\n}));\n\n/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n\n/**\n * sifter.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('sifter', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.Sifter = factory();\n\t}\n}(this, function() {\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tvar Sifter = function(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t * @param {string} query\n\t * @returns {array}\n\t */\n\tSifter.prototype.tokenize = function(query) {\n\t\tquery = trim(String(query || '').toLowerCase());\n\t\tif (!query || !query.length) return [];\n\n\t\tvar i, n, regex, letter;\n\t\tvar tokens = [];\n\t\tvar words = query.split(/ +/);\n\n\t\tfor (i = 0, n = words.length; i < n; i++) {\n\t\t\tregex = escape_regex(words[i]);\n\t\t\tif (this.settings.diacritics) {\n\t\t\t\tfor (letter in DIACRITICS) {\n\t\t\t\t\tif (DIACRITICS.hasOwnProperty(letter)) {\n\t\t\t\t\t\tregex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({\n\t\t\t\tstring : words[i],\n\t\t\t\tregex  : new RegExp(regex, 'i')\n\t\t\t});\n\t\t}\n\n\t\treturn tokens;\n\t};\n\n\t/**\n\t * Iterates over arrays and hashes.\n\t *\n\t * ```\n\t * this.iterator(this.items, function(item, id) {\n\t *    // invoked for each item\n\t * });\n\t * ```\n\t *\n\t * @param {array|object} object\n\t */\n\tSifter.prototype.iterator = function(object, callback) {\n\t\tvar iterator;\n\t\tif (is_array(object)) {\n\t\t\titerator = Array.prototype.forEach || function(callback) {\n\t\t\t\tfor (var i = 0, n = this.length; i < n; i++) {\n\t\t\t\t\tcallback(this[i], i, this);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\titerator = function(callback) {\n\t\t\t\tfor (var key in this) {\n\t\t\t\t\tif (this.hasOwnProperty(key)) {\n\t\t\t\t\t\tcallback(this[key], key, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\titerator.apply(object, [callback]);\n\t};\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @param {object|string} search\n\t * @param {object} options (optional)\n\t * @returns {function}\n\t */\n\tSifter.prototype.getScoreFunction = function(search, options) {\n\t\tvar self, fields, tokens, token_count, nesting;\n\n\t\tself        = this;\n\t\tsearch      = self.prepareSearch(search, options);\n\t\ttokens      = search.tokens;\n\t\tfields      = search.options.fields;\n\t\ttoken_count = tokens.length;\n\t\tnesting     = search.options.nesting;\n\n\t\t/**\n\t\t * Calculates how close of a match the\n\t\t * given value is against a search token.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} token\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreValue = function(value, token) {\n\t\t\tvar score, pos;\n\n\t\t\tif (!value) return 0;\n\t\t\tvalue = String(value || '');\n\t\t\tpos = value.search(token.regex);\n\t\t\tif (pos === -1) return 0;\n\t\t\tscore = token.string.length / value.length;\n\t\t\tif (pos === 0) score += 0.5;\n\t\t\treturn score;\n\t\t};\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {object} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\t\t\tvar field_count = fields.length;\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token, data) {\n\t\t\t\t\treturn scoreValue(getattr(data, fields[0], nesting), token);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn function(token, data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < field_count; i++) {\n\t\t\t\t\tsum += scoreValue(getattr(data, fields[i], nesting), token);\n\t\t\t\t}\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar score;\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tsum += scoreObject(tokens[i], data);\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @param {string|object} search\n\t * @param {object} options\n\t * @return function(a,b)\n\t */\n\tSifter.prototype.getSortFunction = function(search, options) {\n\t\tvar i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;\n\n\t\tself   = this;\n\t\tsearch = self.prepareSearch(search, options);\n\t\tsort   = (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param  {string} name\n\t\t * @param  {object} result\n\t\t * @return {mixed}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn getattr(self.items[result.id], name, options.nesting);\n\t\t};\n\n\t\t// parse options\n\t\tfields = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tfields.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tfields.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\tfields.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\tmultipliers.push(fields[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tfields_count = fields.length;\n\t\tif (!fields_count) {\n\t\t\treturn null;\n\t\t} else if (fields_count === 1) {\n\t\t\tfield = fields[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(field, a),\n\t\t\t\t\tget_field(field, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, a_value, b_value, field;\n\t\t\t\tfor (i = 0; i < fields_count; i++) {\n\t\t\t\t\tfield = fields[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.prepareSearch = function(query, options) {\n\t\tif (typeof query === 'object') return query;\n\n\t\toptions = extend({}, options);\n\n\t\tvar option_fields     = options.fields;\n\t\tvar option_sort       = options.sort;\n\t\tvar option_sort_empty = options.sort_empty;\n\n\t\tif (option_fields && !is_array(option_fields)) options.fields = [option_fields];\n\t\tif (option_sort && !is_array(option_sort)) options.sort = [option_sort];\n\t\tif (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];\n\n\t\treturn {\n\t\t\toptions : options,\n\t\t\tquery   : String(query || '').toLowerCase(),\n\t\t\ttokens  : this.tokenize(query),\n\t\t\ttotal   : 0,\n\t\t\titems   : []\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t * The `options` parameter can contain:\n\t *\n\t *   - fields {string|array}\n\t *   - sort {array}\n\t *   - score {function}\n\t *   - filter {bool}\n\t *   - limit {integer}\n\t *\n\t * Returns an object containing:\n\t *\n\t *   - options {object}\n\t *   - query {string}\n\t *   - tokens {array}\n\t *   - total {int}\n\t *   - items {array}\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.search = function(query, options) {\n\t\tvar self = this, value, score, search, calculateScore;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch  = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery   = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self.getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self.getSortFunction(search, options);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n\n\t// utilities\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar cmp = function(a, b) {\n\t\tif (typeof a === 'number' && typeof b === 'number') {\n\t\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t\t}\n\t\ta = asciifold(String(a || ''));\n\t\tb = asciifold(String(b || ''));\n\t\tif (a > b) return 1;\n\t\tif (b > a) return -1;\n\t\treturn 0;\n\t};\n\n\tvar extend = function(a, b) {\n\t\tvar i, n, k, object;\n\t\tfor (i = 1, n = arguments.length; i < n; i++) {\n\t\t\tobject = arguments[i];\n\t\t\tif (!object) continue;\n\t\t\tfor (k in object) {\n\t\t\t\tif (object.hasOwnProperty(k)) {\n\t\t\t\t\ta[k] = object[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t};\n\n\t/**\n\t * A property getter resolving dot-notation\n\t * @param  {Object}  obj     The root object to fetch property on\n\t * @param  {String}  name    The optionally dotted property name to fetch\n\t * @param  {Boolean} nesting Handle nesting or not\n\t * @return {Object}          The resolved property value\n\t */\n\tvar getattr = function(obj, name, nesting) {\n\t    if (!obj || !name) return;\n\t    if (!nesting) return obj[name];\n\t    var names = name.split(\".\");\n\t    while(names.length && (obj = obj[names.shift()]));\n\t    return obj;\n\t};\n\n\tvar trim = function(str) {\n\t\treturn (str + '').replace(/^\\s+|\\s+$|/g, '');\n\t};\n\n\tvar escape_regex = function(str) {\n\t\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n\t};\n\n\tvar is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {\n\t\treturn Object.prototype.toString.call(object) === '[object Array]';\n\t};\n\n\tvar DIACRITICS = {\n\t\t'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n\t\t'b': '[b␢βΒB฿𐌁ᛒ]',\n\t\t'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄＣｃ]',\n\t\t'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅＤｄð]',\n\t\t'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇＥｅɘǝƏƐε]',\n\t\t'f': '[fƑƒḞḟ]',\n\t\t'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n\t\t'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n\t\t'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪＩｉ]',\n\t\t'j': '[jȷĴĵɈɉʝɟʲ]',\n\t\t'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n\t\t'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟＬｌ]',\n\t\t'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴＮｎŊŋ]',\n\t\t'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n\t\t'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',\n\t\t'q': '[qꝖꝗʠɊɋꝘꝙq̃]',\n\t\t'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n\t\t's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n\t\t't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n\t\t'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n\t\t'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n\t\t'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n\t\t'x': '[xẌẍẊẋχ]',\n\t\t'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n\t\t'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'\n\t};\n\n\tvar asciifold = (function() {\n\t\tvar i, n, k, chunk;\n\t\tvar foreignletters = '';\n\t\tvar lookup = {};\n\t\tfor (k in DIACRITICS) {\n\t\t\tif (DIACRITICS.hasOwnProperty(k)) {\n\t\t\t\tchunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n\t\t\t\tforeignletters += chunk;\n\t\t\t\tfor (i = 0, n = chunk.length; i < n; i++) {\n\t\t\t\t\tlookup[chunk.charAt(i)] = k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar regexp = new RegExp('[' +  foreignletters + ']', 'g');\n\t\treturn function(str) {\n\t\t\treturn str.replace(regexp, function(foreignletter) {\n\t\t\t\treturn lookup[foreignletter];\n\t\t\t}).toLowerCase();\n\t\t};\n\t})();\n\n\n\t// export\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\treturn Sifter;\n}));\n\n\n\n/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('microplugin', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.MicroPlugin = factory();\n\t}\n}(this, function() {\n\tvar MicroPlugin = {};\n\n\tMicroPlugin.mixin = function(Interface) {\n\t\tInterface.plugins = {};\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {mixed} plugins\n\t\t */\n\t\tInterface.prototype.initializePlugins = function(plugins) {\n\t\t\tvar i, n, key;\n\t\t\tvar self  = this;\n\t\t\tvar queue = [];\n\n\t\t\tself.plugins = {\n\t\t\t\tnames     : [],\n\t\t\t\tsettings  : {},\n\t\t\t\trequested : {},\n\t\t\t\tloaded    : {}\n\t\t\t};\n\n\t\t\tif (utils.isArray(plugins)) {\n\t\t\t\tfor (i = 0, n = plugins.length; i < n; i++) {\n\t\t\t\t\tif (typeof plugins[i] === 'string') {\n\t\t\t\t\t\tqueue.push(plugins[i]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugins[i].name] = plugins[i].options;\n\t\t\t\t\t\tqueue.push(plugins[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (queue.length) {\n\t\t\t\tself.require(queue.shift());\n\t\t\t}\n\t\t};\n\n\t\tInterface.prototype.loadPlugin = function(name) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t};\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t */\n\t\tInterface.prototype.require = function(name) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {function} fn\n\t\t */\n\t\tInterface.define = function(name, fn) {\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t};\n\t};\n\n\tvar utils = {\n\t\tisArray: Array.isArray || function(vArg) {\n\t\t\treturn Object.prototype.toString.call(vArg) === '[object Array]';\n\t\t}\n\t};\n\n\treturn MicroPlugin;\n}));\n\n/**\n * selectize.js (v0.12.6)\n * Copyright (c) 2013–2015 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n/*jshint curly:false */\n/*jshint browser:true */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('selectize', ['jquery','sifter','microplugin'], factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'), require('sifter'), require('microplugin'));\n\t} else {\n\t\troot.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);\n\t}\n}(this, function($, Sifter, MicroPlugin) {\n\t'use strict';\n\n\tvar highlight = function($element, pattern) {\n\t\tif (typeof pattern === 'string' && !pattern.length) return;\n\t\tvar regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;\n\t\n\t\tvar highlight = function(node) {\n\t\t\tvar skip = 0;\n\t\t\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t\t\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\t\t\tif (node.nodeType === 3) {\n\t\t\t\tvar pos = node.data.search(regex);\n\t\t\t\tif (pos >= 0 && node.data.length > 0) {\n\t\t\t\t\tvar match = node.data.match(regex);\n\t\t\t\t\tvar spannode = document.createElement('span');\n\t\t\t\t\tspannode.className = 'highlight';\n\t\t\t\t\tvar middlebit = node.splitText(pos);\n\t\t\t\t\tvar endbit = middlebit.splitText(match[0].length);\n\t\t\t\t\tvar middleclone = middlebit.cloneNode(true);\n\t\t\t\t\tspannode.appendChild(middleclone);\n\t\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\n\t\t\t\t\tskip = 1;\n\t\t\t\t}\n\t\t\t} \n\t\t\t// Recurse element node, looking for child text nodes to highlight, unless element \n\t\t\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\t\t\telse if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' )) {\n\t\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\t\ti += highlight(node.childNodes[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn skip;\n\t\t};\n\t\n\t\treturn $element.each(function() {\n\t\t\thighlight(this);\n\t\t});\n\t};\n\t\n\t/**\n\t * removeHighlight fn copied from highlight v5 and\n\t * edited to remove with() and pass js strict mode\n\t */\n\t$.fn.removeHighlight = function() {\n\t\treturn this.find(\"span.highlight\").each(function() {\n\t\t\tthis.parentNode.firstChild.nodeName;\n\t\t\tvar parent = this.parentNode;\n\t\t\tparent.replaceChild(this.firstChild, this);\n\t\t\tparent.normalize();\n\t\t}).end();\n\t};\n\t\n\t\n\tvar MicroEvent = function() {};\n\tMicroEvent.prototype = {\n\t\ton: function(event, fct){\n\t\t\tthis._events = this._events || {};\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t},\n\t\toff: function(event, fct){\n\t\t\tvar n = arguments.length;\n\t\t\tif (n === 0) return delete this._events;\n\t\t\tif (n === 1) return delete this._events[event];\n\t\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t},\n\t\ttrigger: function(event /* , args... */){\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tfor (var i = 0; i < this._events[event].length; i++){\n\t\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * Mixin will delegate all MicroEvent.js function in the destination object.\n\t *\n\t * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent\n\t *\n\t * @param {object} the object which will support MicroEvent\n\t */\n\tMicroEvent.mixin = function(destObject){\n\t\tvar props = ['on', 'off', 'trigger'];\n\t\tfor (var i = 0; i < props.length; i++){\n\t\t\tdestObject.prototype[props[i]] = MicroEvent.prototype[props[i]];\n\t\t}\n\t};\n\t\n\tvar IS_MAC        = /Mac/.test(navigator.userAgent);\n\t\n\tvar KEY_A         = 65;\n\tvar KEY_COMMA     = 188;\n\tvar KEY_RETURN    = 13;\n\tvar KEY_ESC       = 27;\n\tvar KEY_LEFT      = 37;\n\tvar KEY_UP        = 38;\n\tvar KEY_P         = 80;\n\tvar KEY_RIGHT     = 39;\n\tvar KEY_DOWN      = 40;\n\tvar KEY_N         = 78;\n\tvar KEY_BACKSPACE = 8;\n\tvar KEY_DELETE    = 46;\n\tvar KEY_SHIFT     = 16;\n\tvar KEY_CMD       = IS_MAC ? 91 : 17;\n\tvar KEY_CTRL      = IS_MAC ? 18 : 17;\n\tvar KEY_TAB       = 9;\n\t\n\tvar TAG_SELECT    = 1;\n\tvar TAG_INPUT     = 2;\n\t\n\t// for now, android support in general is too spotty to support validity\n\tvar SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;\n\t\n\t\n\tvar isset = function(object) {\n\t\treturn typeof object !== 'undefined';\n\t};\n\t\n\t/**\n\t * Converts a scalar to its best string representation\n\t * for hash keys and HTML attribute values.\n\t *\n\t * Transformations:\n\t *   'str'     -> 'str'\n\t *   null      -> ''\n\t *   undefined -> ''\n\t *   true      -> '1'\n\t *   false     -> '0'\n\t *   0         -> '0'\n\t *   1         -> '1'\n\t *\n\t * @param {string} value\n\t * @returns {string|null}\n\t */\n\tvar hash_key = function(value) {\n\t\tif (typeof value === 'undefined' || value === null) return null;\n\t\tif (typeof value === 'boolean') return value ? '1' : '0';\n\t\treturn value + '';\n\t};\n\t\n\t/**\n\t * Escapes a string for use within HTML.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_html = function(str) {\n\t\treturn (str + '')\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t};\n\t\n\t/**\n\t * Escapes \"$\" characters in replacement strings.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_replace = function(str) {\n\t\treturn (str + '').replace(/\\$/g, '$$$$');\n\t};\n\t\n\tvar hook = {};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked before the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.before = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn original.apply(self, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked after the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.after = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tvar result = original.apply(self, arguments);\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn result;\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be invoked once.\n\t *\n\t * @param {function} fn\n\t * @returns {function}\n\t */\n\tvar once = function(fn) {\n\t\tvar called = false;\n\t\treturn function() {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\tfn.apply(this, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be called once\n\t * every `delay` milliseconds (invoked on the falling edge).\n\t *\n\t * @param {function} fn\n\t * @param {int} delay\n\t * @returns {function}\n\t */\n\tvar debounce = function(fn, delay) {\n\t\tvar timeout;\n\t\treturn function() {\n\t\t\tvar self = this;\n\t\t\tvar args = arguments;\n\t\t\twindow.clearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(function() {\n\t\t\t\tfn.apply(self, args);\n\t\t\t}, delay);\n\t\t};\n\t};\n\t\n\t/**\n\t * Debounce all fired events types listed in `types`\n\t * while executing the provided `fn`.\n\t *\n\t * @param {object} self\n\t * @param {array} types\n\t * @param {function} fn\n\t */\n\tvar debounce_events = function(self, types, fn) {\n\t\tvar type;\n\t\tvar trigger = self.trigger;\n\t\tvar event_args = {};\n\t\n\t\t// override trigger method\n\t\tself.trigger = function() {\n\t\t\tvar type = arguments[0];\n\t\t\tif (types.indexOf(type) !== -1) {\n\t\t\t\tevent_args[type] = arguments;\n\t\t\t} else {\n\t\t\t\treturn trigger.apply(self, arguments);\n\t\t\t}\n\t\t};\n\t\n\t\t// invoke provided function\n\t\tfn.apply(self, []);\n\t\tself.trigger = trigger;\n\t\n\t\t// trigger queued events\n\t\tfor (type in event_args) {\n\t\t\tif (event_args.hasOwnProperty(type)) {\n\t\t\t\ttrigger.apply(self, event_args[type]);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * A workaround for http://bugs.jquery.com/ticket/6696\n\t *\n\t * @param {object} $parent - Parent element to listen on.\n\t * @param {string} event - Event name.\n\t * @param {string} selector - Descendant selector to filter by.\n\t * @param {function} fn - Event handler.\n\t */\n\tvar watchChildEvent = function($parent, event, selector, fn) {\n\t\t$parent.on(event, selector, function(e) {\n\t\t\tvar child = e.target;\n\t\t\twhile (child && child.parentNode !== $parent[0]) {\n\t\t\t\tchild = child.parentNode;\n\t\t\t}\n\t\t\te.currentTarget = child;\n\t\t\treturn fn.apply(this, [e]);\n\t\t});\n\t};\n\t\n\t/**\n\t * Determines the current selection within a text input control.\n\t * Returns an object containing:\n\t *   - start\n\t *   - length\n\t *\n\t * @param {object} input\n\t * @returns {object}\n\t */\n\tvar getSelection = function(input) {\n\t\tvar result = {};\n\t\tif ('selectionStart' in input) {\n\t\t\tresult.start = input.selectionStart;\n\t\t\tresult.length = input.selectionEnd - result.start;\n\t\t} else if (document.selection) {\n\t\t\tinput.focus();\n\t\t\tvar sel = document.selection.createRange();\n\t\t\tvar selLen = document.selection.createRange().text.length;\n\t\t\tsel.moveStart('character', -input.value.length);\n\t\t\tresult.start = sel.text.length - selLen;\n\t\t\tresult.length = selLen;\n\t\t}\n\t\treturn result;\n\t};\n\t\n\t/**\n\t * Copies CSS properties from one element to another.\n\t *\n\t * @param {object} $from\n\t * @param {object} $to\n\t * @param {array} properties\n\t */\n\tvar transferStyles = function($from, $to, properties) {\n\t\tvar i, n, styles = {};\n\t\tif (properties) {\n\t\t\tfor (i = 0, n = properties.length; i < n; i++) {\n\t\t\t\tstyles[properties[i]] = $from.css(properties[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tstyles = $from.css();\n\t\t}\n\t\t$to.css(styles);\n\t};\n\t\n\t/**\n\t * Measures the width of a string within a\n\t * parent element (in pixels).\n\t *\n\t * @param {string} str\n\t * @param {object} $parent\n\t * @returns {int}\n\t */\n\tvar measureString = function(str, $parent) {\n\t\tif (!str) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif (!Selectize.$testInput) {\n\t\t\tSelectize.$testInput = $('<span />').css({\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: -99999,\n\t\t\t\tleft: -99999,\n\t\t\t\twidth: 'auto',\n\t\t\t\tpadding: 0,\n\t\t\t\twhiteSpace: 'pre'\n\t\t\t}).appendTo('body');\n\t\t}\n\t\n\t\tSelectize.$testInput.text(str);\n\t\n\t\ttransferStyles($parent, Selectize.$testInput, [\n\t\t\t'letterSpacing',\n\t\t\t'fontSize',\n\t\t\t'fontFamily',\n\t\t\t'fontWeight',\n\t\t\t'textTransform'\n\t\t]);\n\t\n\t\treturn Selectize.$testInput.width();\n\t};\n\t\n\t/**\n\t * Sets up an input to grow horizontally as the user\n\t * types. If the value is changed manually, you can\n\t * trigger the \"update\" handler to resize:\n\t *\n\t * $input.trigger('update');\n\t *\n\t * @param {object} $input\n\t */\n\tvar autoGrow = function($input) {\n\t\tvar currentWidth = null;\n\t\n\t\tvar update = function(e, options) {\n\t\t\tvar value, keyCode, printable, placeholder, width;\n\t\t\tvar shift, character, selection;\n\t\t\te = e || window.event || {};\n\t\t\toptions = options || {};\n\t\n\t\t\tif (e.metaKey || e.altKey) return;\n\t\t\tif (!options.force && $input.data('grow') === false) return;\n\t\n\t\t\tvalue = $input.val();\n\t\t\tif (e.type && e.type.toLowerCase() === 'keydown') {\n\t\t\t\tkeyCode = e.keyCode;\n\t\t\t\tprintable = (\n\t\t\t\t\t(keyCode >= 48 && keyCode <= 57)  || // 0-9\n\t\t\t\t\t(keyCode >= 65 && keyCode <= 90)   || // a-z\n\t\t\t\t\t(keyCode >= 96 && keyCode <= 111)  || // numpad 0-9, numeric operators\n\t\t\t\t\t(keyCode >= 186 && keyCode <= 222) || // semicolon, equal, comma, dash, etc.\n\t\t\t\t\tkeyCode === 32 // space\n\t\t\t\t);\n\t\n\t\t\t\tif (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {\n\t\t\t\t\tselection = getSelection($input[0]);\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + selection.length);\n\t\t\t\t\t} else if (keyCode === KEY_BACKSPACE && selection.start) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);\n\t\t\t\t\t} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (printable) {\n\t\t\t\t\tshift = e.shiftKey;\n\t\t\t\t\tcharacter = String.fromCharCode(e.keyCode);\n\t\t\t\t\tif (shift) character = character.toUpperCase();\n\t\t\t\t\telse character = character.toLowerCase();\n\t\t\t\t\tvalue += character;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tplaceholder = $input.attr('placeholder');\n\t\t\tif (!value && placeholder) {\n\t\t\t\tvalue = placeholder;\n\t\t\t}\n\t\n\t\t\twidth = measureString(value, $input) + 4;\n\t\t\tif (width !== currentWidth) {\n\t\t\t\tcurrentWidth = width;\n\t\t\t\t$input.width(width);\n\t\t\t\t$input.triggerHandler('resize');\n\t\t\t}\n\t\t};\n\t\n\t\t$input.on('keydown keyup update blur', update);\n\t\tupdate();\n\t};\n\t\n\tvar domToString = function(d) {\n\t\tvar tmp = document.createElement('div');\n\t\n\t\ttmp.appendChild(d.cloneNode(true));\n\t\n\t\treturn tmp.innerHTML;\n\t};\n\t\n\tvar logError = function(message, options){\n\t\tif(!options) options = {};\n\t\tvar component = \"Selectize\";\n\t\n\t\tconsole.error(component + \": \" + message)\n\t\n\t\tif(options.explanation){\n\t\t\t// console.group is undefined in <IE11\n\t\t\tif(console.group) console.group();\n\t\t\tconsole.error(options.explanation);\n\t\t\tif(console.group) console.groupEnd();\n\t\t}\n\t}\n\t\n\t\n\tvar Selectize = function($input, settings) {\n\t\tvar key, i, n, dir, input, self = this;\n\t\tinput = $input[0];\n\t\tinput.selectize = self;\n\t\n\t\t// detect rtl environment\n\t\tvar computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;\n\t\tdir = dir || $input.parents('[dir]:first').attr('dir') || '';\n\t\n\t\t// setup default state\n\t\t$.extend(self, {\n\t\t\torder            : 0,\n\t\t\tsettings         : settings,\n\t\t\t$input           : $input,\n\t\t\ttabIndex         : $input.attr('tabindex') || '',\n\t\t\ttagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,\n\t\t\trtl              : /rtl/i.test(dir),\n\t\n\t\t\teventNS          : '.selectize' + (++Selectize.count),\n\t\t\thighlightedValue : null,\n\t\t\tisBlurring       : false,\n\t\t\tisOpen           : false,\n\t\t\tisDisabled       : false,\n\t\t\tisRequired       : $input.is('[required]'),\n\t\t\tisInvalid        : false,\n\t\t\tisLocked         : false,\n\t\t\tisFocused        : false,\n\t\t\tisInputHidden    : false,\n\t\t\tisSetup          : false,\n\t\t\tisShiftDown      : false,\n\t\t\tisCmdDown        : false,\n\t\t\tisCtrlDown       : false,\n\t\t\tignoreFocus      : false,\n\t\t\tignoreBlur       : false,\n\t\t\tignoreHover      : false,\n\t\t\thasOptions       : false,\n\t\t\tcurrentResults   : null,\n\t\t\tlastValue        : '',\n\t\t\tcaretPos         : 0,\n\t\t\tloading          : 0,\n\t\t\tloadedSearches   : {},\n\t\n\t\t\t$activeOption    : null,\n\t\t\t$activeItems     : [],\n\t\n\t\t\toptgroups        : {},\n\t\t\toptions          : {},\n\t\t\tuserOptions      : {},\n\t\t\titems            : [],\n\t\t\trenderCache      : {},\n\t\t\tonSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)\n\t\t});\n\t\n\t\t// search system\n\t\tself.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\t\n\t\t// build options table\n\t\tif (self.settings.options) {\n\t\t\tfor (i = 0, n = self.settings.options.length; i < n; i++) {\n\t\t\t\tself.registerOption(self.settings.options[i]);\n\t\t\t}\n\t\t\tdelete self.settings.options;\n\t\t}\n\t\n\t\t// build optgroup table\n\t\tif (self.settings.optgroups) {\n\t\t\tfor (i = 0, n = self.settings.optgroups.length; i < n; i++) {\n\t\t\t\tself.registerOptionGroup(self.settings.optgroups[i]);\n\t\t\t}\n\t\t\tdelete self.settings.optgroups;\n\t\t}\n\t\n\t\t// option-dependent defaults\n\t\tself.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof self.settings.hideSelected !== 'boolean') {\n\t\t\tself.settings.hideSelected = self.settings.mode === 'multi';\n\t\t}\n\t\n\t\tself.initializePlugins(self.settings.plugins);\n\t\tself.setupCallbacks();\n\t\tself.setupTemplates();\n\t\tself.setup();\n\t};\n\t\n\t// mixins\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\tMicroEvent.mixin(Selectize);\n\t\n\tif(typeof MicroPlugin !== \"undefined\"){\n\t\tMicroPlugin.mixin(Selectize);\n\t}else{\n\t\tlogError(\"Dependency MicroPlugin is missing\",\n\t\t\t{explanation:\n\t\t\t\t\"Make sure you either: (1) are using the \\\"standalone\\\" \"+\n\t\t\t\t\"version of Selectize, or (2) require MicroPlugin before you \"+\n\t\t\t\t\"load Selectize.\"}\n\t\t);\n\t}\n\t\n\t\n\t// methods\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\t$.extend(Selectize.prototype, {\n\t\n\t\t/**\n\t\t * Creates all elements and sets up event bindings.\n\t\t */\n\t\tsetup: function() {\n\t\t\tvar self      = this;\n\t\t\tvar settings  = self.settings;\n\t\t\tvar eventNS   = self.eventNS;\n\t\t\tvar $window   = $(window);\n\t\t\tvar $document = $(document);\n\t\t\tvar $input    = self.$input;\n\t\n\t\t\tvar $wrapper;\n\t\t\tvar $control;\n\t\t\tvar $control_input;\n\t\t\tvar $dropdown;\n\t\t\tvar $dropdown_content;\n\t\t\tvar $dropdown_parent;\n\t\t\tvar inputMode;\n\t\t\tvar timeout_blur;\n\t\t\tvar timeout_focus;\n\t\t\tvar classes;\n\t\t\tvar classes_plugins;\n\t\t\tvar inputId;\n\t\n\t\t\tinputMode         = self.settings.mode;\n\t\t\tclasses           = $input.attr('class') || '';\n\t\n\t\t\t$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);\n\t\t\t$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);\n\t\t\t$control_input    = $('<input type=\"text\" autocomplete=\"off\" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);\n\t\t\t$dropdown_parent  = $(settings.dropdownParent || $wrapper);\n\t\t\t$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);\n\t\t\t$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);\n\t\n\t\t\tif(inputId = $input.attr('id')) {\n\t\t\t\t$control_input.attr('id', inputId + '-selectized');\n\t\t\t\t$(\"label[for='\"+inputId+\"']\").attr('for', inputId + '-selectized');\n\t\t\t}\n\t\n\t\t\tif(self.settings.copyClassesToDropdown) {\n\t\t\t\t$dropdown.addClass(classes);\n\t\t\t}\n\t\n\t\t\t$wrapper.css({\n\t\t\t\twidth: $input[0].style.width\n\t\t\t});\n\t\n\t\t\tif (self.plugins.names.length) {\n\t\t\t\tclasses_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\t\t$wrapper.addClass(classes_plugins);\n\t\t\t\t$dropdown.addClass(classes_plugins);\n\t\t\t}\n\t\n\t\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {\n\t\t\t\t$input.attr('multiple', 'multiple');\n\t\t\t}\n\t\n\t\t\tif (self.settings.placeholder) {\n\t\t\t\t$control_input.attr('placeholder', settings.placeholder);\n\t\t\t}\n\t\n\t\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\t\tif (!self.settings.splitOn && self.settings.delimiter) {\n\t\t\t\tvar delimiterEscaped = self.settings.delimiter.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\t\tself.settings.splitOn = new RegExp('\\\\s*' + delimiterEscaped + '+\\\\s*');\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocorrect')) {\n\t\t\t\t$control_input.attr('autocorrect', $input.attr('autocorrect'));\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocapitalize')) {\n\t\t\t\t$control_input.attr('autocapitalize', $input.attr('autocapitalize'));\n\t\t\t}\n\t\t\t$control_input[0].type = $input[0].type;\n\t\n\t\t\tself.$wrapper          = $wrapper;\n\t\t\tself.$control          = $control;\n\t\t\tself.$control_input    = $control_input;\n\t\t\tself.$dropdown         = $dropdown;\n\t\t\tself.$dropdown_content = $dropdown_content;\n\t\n\t\t\t$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });\n\t\t\t$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });\n\t\t\t$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });\n\t\t\twatchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });\n\t\t\tautoGrow($control_input);\n\t\n\t\t\t$control.on({\n\t\t\t\tmousedown : function() { return self.onMouseDown.apply(self, arguments); },\n\t\t\t\tclick     : function() { return self.onClick.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$control_input.on({\n\t\t\t\tmousedown : function(e) { e.stopPropagation(); },\n\t\t\t\tkeydown   : function() { return self.onKeyDown.apply(self, arguments); },\n\t\t\t\tkeyup     : function() { return self.onKeyUp.apply(self, arguments); },\n\t\t\t\tkeypress  : function() { return self.onKeyPress.apply(self, arguments); },\n\t\t\t\tresize    : function() { self.positionDropdown.apply(self, []); },\n\t\t\t\tblur      : function() { return self.onBlur.apply(self, arguments); },\n\t\t\t\tfocus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },\n\t\t\t\tpaste     : function() { return self.onPaste.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$document.on('keydown' + eventNS, function(e) {\n\t\t\t\tself.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];\n\t\t\t\tself.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];\n\t\t\t\tself.isShiftDown = e.shiftKey;\n\t\t\t});\n\t\n\t\t\t$document.on('keyup' + eventNS, function(e) {\n\t\t\t\tif (e.keyCode === KEY_CTRL) self.isCtrlDown = false;\n\t\t\t\tif (e.keyCode === KEY_SHIFT) self.isShiftDown = false;\n\t\t\t\tif (e.keyCode === KEY_CMD) self.isCmdDown = false;\n\t\t\t});\n\t\n\t\t\t$document.on('mousedown' + eventNS, function(e) {\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\t// prevent events on the dropdown scrollbar from causing the control to blur\n\t\t\t\t\tif (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// blur on click outside\n\t\t\t\t\tif (!self.$control.has(e.target).length && e.target !== self.$control[0]) {\n\t\t\t\t\t\tself.blur(e.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tself.positionDropdown.apply(self, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t\t$window.on('mousemove' + eventNS, function() {\n\t\t\t\tself.ignoreHover = false;\n\t\t\t});\n\t\n\t\t\t// store original children and tab index so that they can be\n\t\t\t// restored when the destroy() method is called.\n\t\t\tthis.revertSettings = {\n\t\t\t\t$children : $input.children().detach(),\n\t\t\t\ttabindex  : $input.attr('tabindex')\n\t\t\t};\n\t\n\t\t\t$input.attr('tabindex', -1).hide().after(self.$wrapper);\n\t\n\t\t\tif ($.isArray(settings.items)) {\n\t\t\t\tself.setValue(settings.items);\n\t\t\t\tdelete settings.items;\n\t\t\t}\n\t\n\t\t\t// feature detect for the validation API\n\t\t\tif (SUPPORTS_VALIDITY_API) {\n\t\t\t\t$input.on('invalid' + eventNS, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.isInvalid = true;\n\t\t\t\t\tself.refreshState();\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\tself.updateOriginalInput();\n\t\t\tself.refreshItems();\n\t\t\tself.refreshState();\n\t\t\tself.updatePlaceholder();\n\t\t\tself.isSetup = true;\n\t\n\t\t\tif ($input.is(':disabled')) {\n\t\t\t\tself.disable();\n\t\t\t}\n\t\n\t\t\tself.on('change', this.onChange);\n\t\n\t\t\t$input.data('selectize', self);\n\t\t\t$input.addClass('selectized');\n\t\t\tself.trigger('initialize');\n\t\n\t\t\t// preload options\n\t\t\tif (settings.preload === true) {\n\t\t\t\tself.onSearchChange('');\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t/**\n\t\t * Sets up default rendering functions.\n\t\t */\n\t\tsetupTemplates: function() {\n\t\t\tvar self = this;\n\t\t\tvar field_label = self.settings.labelField;\n\t\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\t\n\t\t\tvar templates = {\n\t\t\t\t'optgroup': function(data) {\n\t\t\t\t\treturn '<div class=\"optgroup\">' + data.html + '</div>';\n\t\t\t\t},\n\t\t\t\t'optgroup_header': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"option\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'item': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"item\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option_create': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tself.settings.render = $.extend({}, templates, self.settings.render);\n\t\t},\n\t\n\t\t/**\n\t\t * Maps fired events to callbacks provided\n\t\t * in the settings used when creating the control.\n\t\t */\n\t\tsetupCallbacks: function() {\n\t\t\tvar key, fn, callbacks = {\n\t\t\t\t'initialize'      : 'onInitialize',\n\t\t\t\t'change'          : 'onChange',\n\t\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t\t'clear'           : 'onClear',\n\t\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t\t'type'            : 'onType',\n\t\t\t\t'load'            : 'onLoad',\n\t\t\t\t'focus'           : 'onFocus',\n\t\t\t\t'blur'            : 'onBlur'\n\t\t\t};\n\t\n\t\t\tfor (key in callbacks) {\n\t\t\t\tif (callbacks.hasOwnProperty(key)) {\n\t\t\t\t\tfn = this.settings[callbacks[key]];\n\t\t\t\t\tif (fn) this.on(key, fn);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a click event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonClick: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\t// necessary for mobile webkit devices (manual focus triggering\n\t\t\t// is ignored unless invoked within a click event)\n\t    // also necessary to reopen a dropdown that has been closed by\n\t    // closeAfterSelect\n\t\t\tif (!self.isFocused || !self.isOpen) {\n\t\t\t\tself.focus();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a mouse down event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonMouseDown: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar defaultPrevented = e.isDefaultPrevented();\n\t\t\tvar $target = $(e.target);\n\t\n\t\t\tif (self.isFocused) {\n\t\t\t\t// retain focus by preventing native handling. if the\n\t\t\t\t// event target is the input it should not be modified.\n\t\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t\tif (e.target !== self.$control_input[0]) {\n\t\t\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\t\t\t// toggle dropdown\n\t\t\t\t\t\tself.isOpen ? self.close() : self.open();\n\t\t\t\t\t} else if (!defaultPrevented) {\n\t\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// give control focus\n\t\t\t\tif (!defaultPrevented) {\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\tself.focus();\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the value of the control has been changed.\n\t\t * This should propagate the event to the original DOM\n\t\t * input / select element.\n\t\t */\n\t\tonChange: function() {\n\t\t\tthis.$input.trigger('change');\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> paste.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonPaste: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isFull() || self.isInputHidden || self.isLocked) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If a regex or string is included, this will split the pasted\n\t\t\t// input and create Items for each separate value\n\t\t\tif (self.settings.splitOn) {\n\t\n\t\t\t\t// Wait for pasted text to be recognized in value\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tvar pastedText = self.$control_input.val();\n\t\t\t\t\tif(!pastedText.match(self.settings.splitOn)){ return }\n\t\n\t\t\t\t\tvar splitInput = $.trim(pastedText).split(self.settings.splitOn);\n\t\t\t\t\tfor (var i = 0, n = splitInput.length; i < n; i++) {\n\t\t\t\t\t\tself.createItem(splitInput[i]);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keypress.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyPress: function(e) {\n\t\t\tif (this.isLocked) return e && e.preventDefault();\n\t\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\t\tif (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {\n\t\t\t\tthis.createItem();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keydown.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyDown: function(e) {\n\t\t\tvar isInput = e.target === this.$control_input[0];\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) {\n\t\t\t\tif (e.keyCode !== KEY_TAB) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tswitch (e.keyCode) {\n\t\t\t\tcase KEY_A:\n\t\t\t\t\tif (self.isCmdDown) {\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_N:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_DOWN:\n\t\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\t\tself.open();\n\t\t\t\t\t} else if (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $next = self.getAdjacentOption(self.$activeOption, 1);\n\t\t\t\t\t\tif ($next.length) self.setActiveOption($next, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_P:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_UP:\n\t\t\t\t\tif (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $prev = self.getAdjacentOption(self.$activeOption, -1);\n\t\t\t\t\t\tif ($prev.length) self.setActiveOption($prev, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RETURN:\n\t\t\t\t\tif (self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_LEFT:\n\t\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RIGHT:\n\t\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_TAB:\n\t\t\t\t\tif (self.settings.selectOnTab && self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\n\t\t\t\t\t\t// Default behaviour is to jump to the next field, we only want this\n\t\t\t\t\t\t// if the current field doesn't accept any more entries\n\t\t\t\t\t\tif (!self.isFull()) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_BACKSPACE:\n\t\t\t\tcase KEY_DELETE:\n\t\t\t\t\tself.deleteSelection(e);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keyup.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyUp: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return e && e.preventDefault();\n\t\t\tvar value = self.$control_input.val() || '';\n\t\t\tif (self.lastValue !== value) {\n\t\t\t\tself.lastValue = value;\n\t\t\t\tself.onSearchChange(value);\n\t\t\t\tself.refreshOptions();\n\t\t\t\tself.trigger('type', value);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the user-provide option provider / loader.\n\t\t *\n\t\t * Note: this function is debounced in the Selectize\n\t\t * constructor (by `settings.loadThrottle` milliseconds)\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tonSearchChange: function(value) {\n\t\t\tvar self = this;\n\t\t\tvar fn = self.settings.load;\n\t\t\tif (!fn) return;\n\t\t\tif (self.loadedSearches.hasOwnProperty(value)) return;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tself.load(function(callback) {\n\t\t\t\tfn.apply(self, [value, callback]);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> focus.\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tonFocus: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar wasFocused = self.isFocused;\n\t\n\t\t\tif (self.isDisabled) {\n\t\t\t\tself.blur();\n\t\t\t\te && e.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tif (self.ignoreFocus) return;\n\t\t\tself.isFocused = true;\n\t\t\tif (self.settings.preload === 'focus') self.onSearchChange('');\n\t\n\t\t\tif (!wasFocused) self.trigger('focus');\n\t\n\t\t\tif (!self.$activeItems.length) {\n\t\t\t\tself.showInput();\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t\t}\n\t\n\t\t\tself.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> blur.\n\t\t *\n\t\t * @param {object} e\n\t\t * @param {Element} dest\n\t\t */\n\t\tonBlur: function(e, dest) {\n\t\t\tvar self = this;\n\t\t\tif (!self.isFocused) return;\n\t\t\tself.isFocused = false;\n\t\n\t\t\tif (self.ignoreFocus) {\n\t\t\t\treturn;\n\t\t\t} else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {\n\t\t\t\t// necessary to prevent IE closing the dropdown when the scrollbar is clicked\n\t\t\t\tself.ignoreBlur = true;\n\t\t\t\tself.onFocus(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tvar deactivate = function() {\n\t\t\t\tself.close();\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\tself.refreshState();\n\t\n\t\t\t\t// IE11 bug: element still marked as active\n\t\t\t\tdest && dest.focus && dest.focus();\n\t\n\t\t\t\tself.isBlurring = false;\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.trigger('blur');\n\t\t\t};\n\t\n\t\t\tself.isBlurring = true;\n\t\t\tself.ignoreFocus = true;\n\t\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\t\tself.createItem(null, false, deactivate);\n\t\t\t} else {\n\t\t\t\tdeactivate();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user rolls over\n\t\t * an option in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionHover: function(e) {\n\t\t\tif (this.ignoreHover) return;\n\t\t\tthis.setActiveOption(e.currentTarget, false);\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an option\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionSelect: function(e) {\n\t\t\tvar value, $target, $option, self = this;\n\t\n\t\t\tif (e.preventDefault) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\n\t\t\t$target = $(e.currentTarget);\n\t\t\tif ($target.hasClass('create')) {\n\t\t\t\tself.createItem(null, function() {\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvalue = $target.attr('data-value');\n\t\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\t\tself.lastQuery = null;\n\t\t\t\t\tself.setTextboxValue('');\n\t\t\t\t\tself.addItem(value);\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {\n\t\t\t\t\t\tself.setActiveOption(self.getOption(value));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an item\n\t\t * that has been selected.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonItemSelect: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return;\n\t\t\tif (self.settings.mode === 'multi') {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.setActiveItem(e.currentTarget, e);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the provided method that provides\n\t\t * results to a callback---which are then added\n\t\t * as options to the control.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tload: function(fn) {\n\t\t\tvar self = this;\n\t\t\tvar $wrapper = self.$wrapper.addClass(self.settings.loadingClass);\n\t\n\t\t\tself.loading++;\n\t\t\tfn.apply(self, [function(results) {\n\t\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\t\tif (results && results.length) {\n\t\t\t\t\tself.addOption(results);\n\t\t\t\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\t\t\t\t}\n\t\t\t\tif (!self.loading) {\n\t\t\t\t\t$wrapper.removeClass(self.settings.loadingClass);\n\t\t\t\t}\n\t\t\t\tself.trigger('load', results);\n\t\t\t}]);\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the input field of the control to the specified value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tsetTextboxValue: function(value) {\n\t\t\tvar $input = this.$control_input;\n\t\t\tvar changed = $input.val() !== value;\n\t\t\tif (changed) {\n\t\t\t\t$input.val(value).triggerHandler('update');\n\t\t\t\tthis.lastValue = value;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the value of the control. If multiple items\n\t\t * can be selected (e.g. <select multiple>), this returns\n\t\t * an array. If only one item can be selected, this\n\t\t * returns a string.\n\t\t *\n\t\t * @returns {mixed}\n\t\t */\n\t\tgetValue: function() {\n\t\t\tif (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {\n\t\t\t\treturn this.items;\n\t\t\t} else {\n\t\t\t\treturn this.items.join(this.settings.delimiter);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Resets the selected items to the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t */\n\t\tsetValue: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tthis.clear(silent);\n\t\t\t\tthis.addItems(value, silent);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item.\n\t\t *\n\t\t * @param {object} $item\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tsetActiveItem: function($item, e) {\n\t\t\tvar self = this;\n\t\t\tvar eventName;\n\t\t\tvar i, idx, begin, end, item, swap;\n\t\t\tvar $last;\n\t\n\t\t\tif (self.settings.mode === 'single') return;\n\t\t\t$item = $($item);\n\t\n\t\t\t// clear the active selection\n\t\t\tif (!$item.length) {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [];\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.showInput();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// modify selection\n\t\t\teventName = e && e.type.toLowerCase();\n\t\n\t\t\tif (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {\n\t\t\t\t$last = self.$control.children('.active:last');\n\t\t\t\tbegin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);\n\t\t\t\tend   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);\n\t\t\t\tif (begin > end) {\n\t\t\t\t\tswap  = begin;\n\t\t\t\t\tbegin = end;\n\t\t\t\t\tend   = swap;\n\t\t\t\t}\n\t\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\t\titem = self.$control[0].childNodes[i];\n\t\t\t\t\tif (self.$activeItems.indexOf(item) === -1) {\n\t\t\t\t\t\t$(item).addClass('active');\n\t\t\t\t\t\tself.$activeItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t} else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t\t$item.removeClass('active');\n\t\t\t\t} else {\n\t\t\t\t\tself.$activeItems.push($item.addClass('active')[0]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [$item.addClass('active')[0]];\n\t\t\t}\n\t\n\t\t\t// ensure control has focus\n\t\t\tself.hideInput();\n\t\t\tif (!this.isFocused) {\n\t\t\t\tself.focus();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item in the dropdown menu\n\t\t * of available options.\n\t\t *\n\t\t * @param {object} $object\n\t\t * @param {boolean} scroll\n\t\t * @param {boolean} animate\n\t\t */\n\t\tsetActiveOption: function($option, scroll, animate) {\n\t\t\tvar height_menu, height_item, y;\n\t\t\tvar scroll_top, scroll_bottom;\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.$activeOption) self.$activeOption.removeClass('active');\n\t\t\tself.$activeOption = null;\n\t\n\t\t\t$option = $($option);\n\t\t\tif (!$option.length) return;\n\t\n\t\t\tself.$activeOption = $option.addClass('active');\n\t\n\t\t\tif (scroll || !isset(scroll)) {\n\t\n\t\t\t\theight_menu   = self.$dropdown_content.height();\n\t\t\t\theight_item   = self.$activeOption.outerHeight(true);\n\t\t\t\tscroll        = self.$dropdown_content.scrollTop() || 0;\n\t\t\t\ty             = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;\n\t\t\t\tscroll_top    = y;\n\t\t\t\tscroll_bottom = y - height_menu + height_item;\n\t\n\t\t\t\tif (y + height_item > height_menu + scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t} else if (y < scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t}\n\t\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Selects all items (CTRL + A).\n\t\t */\n\t\tselectAll: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.settings.mode === 'single') return;\n\t\n\t\t\tself.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\tself.hideInput();\n\t\t\t\tself.close();\n\t\t\t}\n\t\t\tself.focus();\n\t\t},\n\t\n\t\t/**\n\t\t * Hides the input element out of view, while\n\t\t * retaining its focus.\n\t\t */\n\t\thideInput: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.setTextboxValue('');\n\t\t\tself.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});\n\t\t\tself.isInputHidden = true;\n\t\t},\n\t\n\t\t/**\n\t\t * Restores input visibility.\n\t\t */\n\t\tshowInput: function() {\n\t\t\tthis.$control_input.css({opacity: 1, position: 'relative', left: 0});\n\t\t\tthis.isInputHidden = false;\n\t\t},\n\t\n\t\t/**\n\t\t * Gives the control focus.\n\t\t */\n\t\tfocus: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.isDisabled) return;\n\t\n\t\t\tself.ignoreFocus = true;\n\t\t\tself.$control_input[0].focus();\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.onFocus();\n\t\t\t}, 0);\n\t\t},\n\t\n\t\t/**\n\t\t * Forces the control out of focus.\n\t\t *\n\t\t * @param {Element} dest\n\t\t */\n\t\tblur: function(dest) {\n\t\t\tthis.$control_input[0].blur();\n\t\t\tthis.onBlur(null, dest);\n\t\t},\n\t\n\t\t/**\n\t\t * Returns a function that scores an object\n\t\t * to show how good of a match it is to the\n\t\t * provided query.\n\t\t *\n\t\t * @param {string} query\n\t\t * @param {object} options\n\t\t * @return {function}\n\t\t */\n\t\tgetScoreFunction: function(query) {\n\t\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t\t},\n\t\n\t\t/**\n\t\t * Returns search options for sifter (the system\n\t\t * for scoring and sorting results).\n\t\t *\n\t\t * @see https://github.com/brianreavis/sifter.js\n\t\t * @return {object}\n\t\t */\n\t\tgetSearchOptions: function() {\n\t\t\tvar settings = this.settings;\n\t\t\tvar sort = settings.sortField;\n\t\t\tif (typeof sort === 'string') {\n\t\t\t\tsort = [{field: sort}];\n\t\t\t}\n\t\n\t\t\treturn {\n\t\t\t\tfields      : settings.searchField,\n\t\t\t\tconjunction : settings.searchConjunction,\n\t\t\t\tsort        : sort,\n\t\t\t\tnesting     : settings.nesting\n\t\t\t};\n\t\t},\n\t\n\t\t/**\n\t\t * Searches through available options and returns\n\t\t * a sorted array of matches.\n\t\t *\n\t\t * Returns an object containing:\n\t\t *\n\t\t *   - query {string}\n\t\t *   - tokens {array}\n\t\t *   - total {int}\n\t\t *   - items {array}\n\t\t *\n\t\t * @param {string} query\n\t\t * @returns {object}\n\t\t */\n\t\tsearch: function(query) {\n\t\t\tvar i, value, score, result, calculateScore;\n\t\t\tvar self     = this;\n\t\t\tvar settings = self.settings;\n\t\t\tvar options  = this.getSearchOptions();\n\t\n\t\t\t// validate user-provided result scoring function\n\t\t\tif (settings.score) {\n\t\t\t\tcalculateScore = self.settings.score.apply(this, [query]);\n\t\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\t\tthrow new Error('Selectize \"score\" setting must be a function that returns a function');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// perform search\n\t\t\tif (query !== self.lastQuery) {\n\t\t\t\tself.lastQuery = query;\n\t\t\t\tresult = self.sifter.search(query, $.extend(options, {score: calculateScore}));\n\t\t\t\tself.currentResults = result;\n\t\t\t} else {\n\t\t\t\tresult = $.extend(true, {}, self.currentResults);\n\t\t\t}\n\t\n\t\t\t// filter out selected items\n\t\t\tif (settings.hideSelected) {\n\t\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {\n\t\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn result;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the list of available options shown\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {boolean} triggerDropdown\n\t\t */\n\t\trefreshOptions: function(triggerDropdown) {\n\t\t\tvar i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;\n\t\t\tvar $active, $active_before, $create;\n\t\n\t\t\tif (typeof triggerDropdown === 'undefined') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tvar self              = this;\n\t\t\tvar query             = $.trim(self.$control_input.val());\n\t\t\tvar results           = self.search(query);\n\t\t\tvar $dropdown_content = self.$dropdown_content;\n\t\t\tvar active_before     = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));\n\t\n\t\t\t// build markup\n\t\t\tn = results.items.length;\n\t\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t\t}\n\t\n\t\t\t// render and group available options individually\n\t\t\tgroups = {};\n\t\t\tgroups_order = [];\n\t\n\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\toption      = self.options[results.items[i].id];\n\t\t\t\toption_html = self.render('option', option);\n\t\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\t\toptgroups   = $.isArray(optgroup) ? optgroup : [optgroup];\n\t\n\t\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\t\toptgroup = optgroups[j];\n\t\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\toptgroup = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t\t}\n\t\t\t\t\tgroups[optgroup].appendChild(option_html);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// sort optgroups\n\t\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\t\tgroups_order.sort(function(a, b) {\n\t\t\t\t\tvar a_order = self.optgroups[a].$order || 0;\n\t\t\t\t\tvar b_order = self.optgroups[b].$order || 0;\n\t\t\t\t\treturn a_order - b_order;\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\t// render optgroup headers & join groups\n\t\t\thtml = document.createDocumentFragment();\n\t\t\tfor (i = 0, n = groups_order.length; i < n; i++) {\n\t\t\t\toptgroup = groups_order[i];\n\t\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {\n\t\t\t\t\t// render the optgroup header and options within it,\n\t\t\t\t\t// then pass it to the wrapper template\n\t\t\t\t\thtml_children = document.createDocumentFragment();\n\t\t\t\t\thtml_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));\n\t\t\t\t\thtml_children.appendChild(groups[optgroup]);\n\t\n\t\t\t\t\thtml.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {\n\t\t\t\t\t\thtml: domToString(html_children),\n\t\t\t\t\t\tdom:  html_children\n\t\t\t\t\t})));\n\t\t\t\t} else {\n\t\t\t\t\thtml.appendChild(groups[optgroup]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t$dropdown_content.html(html);\n\t\n\t\t\t// highlight matching terms inline\n\t\t\tif (self.settings.highlight) {\n\t\t\t\t$dropdown_content.removeHighlight();\n\t\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\t\tfor (i = 0, n = results.tokens.length; i < n; i++) {\n\t\t\t\t\t\thighlight($dropdown_content, results.tokens[i].regex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add \"selected\" class to selected options\n\t\t\tif (!self.settings.hideSelected) {\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tself.getOption(self.items[i]).addClass('selected');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add create option\n\t\t\thas_create_option = self.canCreate(query);\n\t\t\tif (has_create_option) {\n\t\t\t\t$dropdown_content.prepend(self.render('option_create', {input: query}));\n\t\t\t\t$create = $($dropdown_content[0].childNodes[0]);\n\t\t\t}\n\t\n\t\t\t// activate\n\t\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\t\tif (self.hasOptions) {\n\t\t\t\tif (results.items.length > 0) {\n\t\t\t\t\t$active_before = active_before && self.getOption(active_before);\n\t\t\t\t\tif ($active_before && $active_before.length) {\n\t\t\t\t\t\t$active = $active_before;\n\t\t\t\t\t} else if (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\t\t\t$active = self.getOption(self.items[0]);\n\t\t\t\t\t}\n\t\t\t\t\tif (!$active || !$active.length) {\n\t\t\t\t\t\tif ($create && !self.settings.addPrecedence) {\n\t\t\t\t\t\t\t$active = self.getAdjacentOption($create, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$active = $dropdown_content.find('[data-selectable]:first');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$active = $create;\n\t\t\t\t}\n\t\t\t\tself.setActiveOption($active);\n\t\t\t\tif (triggerDropdown && !self.isOpen) { self.open(); }\n\t\t\t} else {\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tif (triggerDropdown && self.isOpen) { self.close(); }\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Adds an available option. If it already exists,\n\t\t * nothing will happen. Note: this does not refresh\n\t\t * the options list dropdown (use `refreshOptions`\n\t\t * for that).\n\t\t *\n\t\t * Usage:\n\t\t *\n\t\t *   this.addOption(data)\n\t\t *\n\t\t * @param {object|array} data\n\t\t */\n\t\taddOption: function(data) {\n\t\t\tvar i, n, value, self = this;\n\t\n\t\t\tif ($.isArray(data)) {\n\t\t\t\tfor (i = 0, n = data.length; i < n; i++) {\n\t\t\t\t\tself.addOption(data[i]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif (value = self.registerOption(data)) {\n\t\t\t\tself.userOptions[value] = true;\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.trigger('option_add', value, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option to the pool of options.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOption: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.valueField]);\n\t\t\tif (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.options[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option group to the pool of option groups.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOptionGroup: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\t\t\tif (!key) return false;\n\t\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.optgroups[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers a new optgroup for options\n\t\t * to be bucketed into.\n\t\t *\n\t\t * @param {string} id\n\t\t * @param {object} data\n\t\t */\n\t\taddOptionGroup: function(id, data) {\n\t\t\tdata[this.settings.optgroupValueField] = id;\n\t\t\tif (id = this.registerOptionGroup(data)) {\n\t\t\t\tthis.trigger('optgroup_add', id, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes an existing option group.\n\t\t *\n\t\t * @param {string} id\n\t\t */\n\t\tremoveOptionGroup: function(id) {\n\t\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\t\tdelete this.optgroups[id];\n\t\t\t\tthis.renderCache = {};\n\t\t\t\tthis.trigger('optgroup_remove', id);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all existing option groups.\n\t\t */\n\t\tclearOptionGroups: function() {\n\t\t\tthis.optgroups = {};\n\t\t\tthis.renderCache = {};\n\t\t\tthis.trigger('optgroup_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Updates an option available for selection. If\n\t\t * it is visible in the selected items or options\n\t\t * dropdown, it will be re-rendered automatically.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {object} data\n\t\t */\n\t\tupdateOption: function(value, data) {\n\t\t\tvar self = this;\n\t\t\tvar $item, $item_new;\n\t\t\tvar value_new, index_item, cache_items, cache_options, order_old;\n\t\n\t\t\tvalue     = hash_key(value);\n\t\t\tvalue_new = hash_key(data[self.settings.valueField]);\n\t\n\t\t\t// sanity checks\n\t\t\tif (value === null) return;\n\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\tif (typeof value_new !== 'string') throw new Error('Value must be set in option data');\n\t\n\t\t\torder_old = self.options[value].$order;\n\t\n\t\t\t// update references\n\t\t\tif (value_new !== value) {\n\t\t\t\tdelete self.options[value];\n\t\t\t\tindex_item = self.items.indexOf(value);\n\t\t\t\tif (index_item !== -1) {\n\t\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata.$order = data.$order || order_old;\n\t\t\tself.options[value_new] = data;\n\t\n\t\t\t// invalidate render cache\n\t\t\tcache_items = self.renderCache['item'];\n\t\t\tcache_options = self.renderCache['option'];\n\t\n\t\t\tif (cache_items) {\n\t\t\t\tdelete cache_items[value];\n\t\t\t\tdelete cache_items[value_new];\n\t\t\t}\n\t\t\tif (cache_options) {\n\t\t\t\tdelete cache_options[value];\n\t\t\t\tdelete cache_options[value_new];\n\t\t\t}\n\t\n\t\t\t// update the item if it's selected\n\t\t\tif (self.items.indexOf(value_new) !== -1) {\n\t\t\t\t$item = self.getItem(value);\n\t\t\t\t$item_new = $(self.render('item', data));\n\t\t\t\tif ($item.hasClass('active')) $item_new.addClass('active');\n\t\t\t\t$item.replaceWith($item_new);\n\t\t\t}\n\t\n\t\t\t// invalidate last query because we might have updated the sortField\n\t\t\tself.lastQuery = null;\n\t\n\t\t\t// update dropdown contents\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.refreshOptions(false);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes a single option.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\tremoveOption: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tvar cache_items = self.renderCache['item'];\n\t\t\tvar cache_options = self.renderCache['option'];\n\t\t\tif (cache_items) delete cache_items[value];\n\t\t\tif (cache_options) delete cache_options[value];\n\t\n\t\t\tdelete self.userOptions[value];\n\t\t\tdelete self.options[value];\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_remove', value);\n\t\t\tself.removeItem(value, silent);\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all options.\n\t\t */\n\t\tclearOptions: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.loadedSearches = {};\n\t\t\tself.userOptions = {};\n\t\t\tself.renderCache = {};\n\t\t\tvar options = self.options;\n\t\t\t$.each(self.options, function(key, value) {\n\t\t\t\tif(self.items.indexOf(key) == -1) {\n\t\t\t\t\tdelete options[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.options = self.sifter.items = options;\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the option\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetOption: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the next or\n\t\t * previous selectable option.\n\t\t *\n\t\t * @param {object} $option\n\t\t * @param {int} direction  can be 1 for next or -1 for previous\n\t\t * @return {object}\n\t\t */\n\t\tgetAdjacentOption: function($option, direction) {\n\t\t\tvar $options = this.$dropdown.find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t},\n\t\n\t\t/**\n\t\t * Finds the first element with a \"data-value\" attribute\n\t\t * that matches the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} $els\n\t\t * @return {object}\n\t\t */\n\t\tgetElementWithValue: function(value, $els) {\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tif (typeof value !== 'undefined' && value !== null) {\n\t\t\t\tfor (var i = 0, n = $els.length; i < n; i++) {\n\t\t\t\t\tif ($els[i].getAttribute('data-value') === value) {\n\t\t\t\t\t\treturn $($els[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn $();\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the item\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetItem: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$control.children());\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" multiple items at once. Adds them to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItems: function(values, silent) {\n\t\t\tthis.buffer = document.createDocumentFragment();\n\t\n\t\t\tvar childNodes = this.$control[0].childNodes;\n\t\t\tfor (var i = 0; i < childNodes.length; i++) {\n\t\t\t\tthis.buffer.appendChild(childNodes[i]);\n\t\t\t}\n\t\n\t\t\tvar items = $.isArray(values) ? values : [values];\n\t\t\tfor (var i = 0, n = items.length; i < n; i++) {\n\t\t\t\tthis.isPending = (i < n - 1);\n\t\t\t\tthis.addItem(items[i], silent);\n\t\t\t}\n\t\n\t\t\tvar control = this.$control[0];\n\t\t\tcontrol.insertBefore(this.buffer, control.firstChild);\n\t\n\t\t\tthis.buffer = null;\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" an item. Adds it to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItem: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tvar $item, $option, $options;\n\t\t\t\tvar self = this;\n\t\t\t\tvar inputMode = self.settings.mode;\n\t\t\t\tvar i, active, value_next, wasFull;\n\t\t\t\tvalue = hash_key(value);\n\t\n\t\t\t\tif (self.items.indexOf(value) !== -1) {\n\t\t\t\t\tif (inputMode === 'single') self.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\t\n\t\t\t\t$item = $(self.render('item', self.options[value]));\n\t\t\t\twasFull = self.isFull();\n\t\t\t\tself.items.splice(self.caretPos, 0, value);\n\t\t\t\tself.insertAtCaret($item);\n\t\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\t\tself.refreshState();\n\t\t\t\t}\n\t\n\t\t\t\tif (self.isSetup) {\n\t\t\t\t\t$options = self.$dropdown_content.find('[data-selectable]');\n\t\n\t\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\t$option = self.getOption(value);\n\t\t\t\t\t\tvalue_next = self.getAdjacentOption($option, 1).attr('data-value');\n\t\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t\t\tif (value_next) {\n\t\t\t\t\t\t\tself.setActiveOption(self.getOption(value_next));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\t\tif (!$options.length || self.isFull()) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\t\tself.positionDropdown();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tself.updatePlaceholder();\n\t\t\t\t\tself.trigger('item_add', value, $item);\n\t\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the selected item matching\n\t\t * the provided value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tremoveItem: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvar $item, i, idx;\n\t\n\t\t\t$item = (value instanceof $) ? value : self.getItem(value);\n\t\t\tvalue = hash_key($item.attr('data-value'));\n\t\t\ti = self.items.indexOf(value);\n\t\n\t\t\tif (i !== -1) {\n\t\t\t\t$item.remove();\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.items.splice(i, 1);\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\t\t\tself.removeOption(value, silent);\n\t\t\t\t}\n\t\n\t\t\t\tif (i < self.caretPos) {\n\t\t\t\t\tself.setCaret(self.caretPos - 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.refreshState();\n\t\t\t\tself.updatePlaceholder();\n\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\tself.positionDropdown();\n\t\t\t\tself.trigger('item_remove', value, $item);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the `create` method provided in the\n\t\t * selectize options that should provide the data\n\t\t * for the new item, given the user input.\n\t\t *\n\t\t * Once this completes, it will be added\n\t\t * to the item list.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} [triggerDropdown]\n\t\t * @param {function} [callback]\n\t\t * @return {boolean}\n\t\t */\n\t\tcreateItem: function(input, triggerDropdown) {\n\t\t\tvar self  = this;\n\t\t\tvar caret = self.caretPos;\n\t\t\tinput = input || $.trim(self.$control_input.val() || '');\n\t\n\t\t\tvar callback = arguments[arguments.length - 1];\n\t\t\tif (typeof callback !== 'function') callback = function() {};\n\t\n\t\t\tif (typeof triggerDropdown !== 'boolean') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tif (!self.canCreate(input)) {\n\t\t\t\tcallback();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tself.lock();\n\t\n\t\t\tvar setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {\n\t\t\t\tvar data = {};\n\t\t\t\tdata[self.settings.labelField] = input;\n\t\t\t\tdata[self.settings.valueField] = input;\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\tvar create = once(function(data) {\n\t\t\t\tself.unlock();\n\t\n\t\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\t\tif (typeof value !== 'string') return callback();\n\t\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.addOption(data);\n\t\t\t\tself.setCaret(caret);\n\t\t\t\tself.addItem(value);\n\t\t\t\tself.refreshOptions(triggerDropdown && self.settings.mode !== 'single');\n\t\t\t\tcallback(data);\n\t\t\t});\n\t\n\t\t\tvar output = setup.apply(this, [input, create]);\n\t\t\tif (typeof output !== 'undefined') {\n\t\t\t\tcreate(output);\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Re-renders the selected item lists.\n\t\t */\n\t\trefreshItems: function() {\n\t\t\tthis.lastQuery = null;\n\t\n\t\t\tif (this.isSetup) {\n\t\t\t\tthis.addItem(this.items);\n\t\t\t}\n\t\n\t\t\tthis.refreshState();\n\t\t\tthis.updateOriginalInput();\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent attributes\n\t\t * and CSS classes.\n\t\t */\n\t\trefreshState: function() {\n\t\t\tthis.refreshValidityState();\n\t\t\tthis.refreshClasses();\n\t\t},\n\t\n\t\t/**\n\t\t * Update the `required` attribute of both input and control input.\n\t\t *\n\t\t * The `required` property needs to be activated on the control input\n\t\t * for the error to be displayed at the right place. `required` also\n\t\t * needs to be temporarily deactivated on the input since the input is\n\t\t * hidden and can't show errors.\n\t\t */\n\t\trefreshValidityState: function() {\n\t\t\tif (!this.isRequired) return false;\n\t\n\t\t\tvar invalid = !this.items.length;\n\t\n\t\t\tthis.isInvalid = invalid;\n\t\t\tthis.$control_input.prop('required', invalid);\n\t\t\tthis.$input.prop('required', !invalid);\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent CSS classes.\n\t\t */\n\t\trefreshClasses: function() {\n\t\t\tvar self     = this;\n\t\t\tvar isFull   = self.isFull();\n\t\t\tvar isLocked = self.isLocked;\n\t\n\t\t\tself.$wrapper\n\t\t\t\t.toggleClass('rtl', self.rtl);\n\t\n\t\t\tself.$control\n\t\t\t\t.toggleClass('focus', self.isFocused)\n\t\t\t\t.toggleClass('disabled', self.isDisabled)\n\t\t\t\t.toggleClass('required', self.isRequired)\n\t\t\t\t.toggleClass('invalid', self.isInvalid)\n\t\t\t\t.toggleClass('locked', isLocked)\n\t\t\t\t.toggleClass('full', isFull).toggleClass('not-full', !isFull)\n\t\t\t\t.toggleClass('input-active', self.isFocused && !self.isInputHidden)\n\t\t\t\t.toggleClass('dropdown-active', self.isOpen)\n\t\t\t\t.toggleClass('has-options', !$.isEmptyObject(self.options))\n\t\t\t\t.toggleClass('has-items', self.items.length > 0);\n\t\n\t\t\tself.$control_input.data('grow', !isFull && !isLocked);\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not more items can be added\n\t\t * to the control without exceeding the user-defined maximum.\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFull: function() {\n\t\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the original <select> or <input>\n\t\t * element to reflect the current state.\n\t\t */\n\t\tupdateOriginalInput: function(opts) {\n\t\t\tvar i, n, options, label, self = this;\n\t\t\topts = opts || {};\n\t\n\t\t\tif (self.tagType === TAG_SELECT) {\n\t\t\t\toptions = [];\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tlabel = self.options[self.items[i]][self.settings.labelField] || '';\n\t\t\t\t\toptions.push('<option value=\"' + escape_html(self.items[i]) + '\" selected=\"selected\">' + escape_html(label) + '</option>');\n\t\t\t\t}\n\t\t\t\tif (!options.length && !this.$input.attr('multiple')) {\n\t\t\t\t\toptions.push('<option value=\"\" selected=\"selected\"></option>');\n\t\t\t\t}\n\t\t\t\tself.$input.html(options.join(''));\n\t\t\t} else {\n\t\t\t\tself.$input.val(self.getValue());\n\t\t\t\tself.$input.attr('value',self.$input.val());\n\t\t\t}\n\t\n\t\t\tif (self.isSetup) {\n\t\t\t\tif (!opts.silent) {\n\t\t\t\t\tself.trigger('change', self.$input.val());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Shows/hide the input placeholder depending\n\t\t * on if there items in the list already.\n\t\t */\n\t\tupdatePlaceholder: function() {\n\t\t\tif (!this.settings.placeholder) return;\n\t\t\tvar $input = this.$control_input;\n\t\n\t\t\tif (this.items.length) {\n\t\t\t\t$input.removeAttr('placeholder');\n\t\t\t} else {\n\t\t\t\t$input.attr('placeholder', this.settings.placeholder);\n\t\t\t}\n\t\t\t$input.triggerHandler('update', {force: true});\n\t\t},\n\t\n\t\t/**\n\t\t * Shows the autocomplete dropdown containing\n\t\t * the available options.\n\t\t */\n\t\topen: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\t\tself.focus();\n\t\t\tself.isOpen = true;\n\t\t\tself.refreshState();\n\t\t\tself.$dropdown.css({visibility: 'hidden', display: 'block'});\n\t\t\tself.positionDropdown();\n\t\t\tself.$dropdown.css({visibility: 'visible'});\n\t\t\tself.trigger('dropdown_open', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Closes the autocomplete dropdown menu.\n\t\t */\n\t\tclose: function() {\n\t\t\tvar self = this;\n\t\t\tvar trigger = self.isOpen;\n\t\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\n\t\t\t\t// Do not trigger blur while inside a blur event,\n\t\t\t\t// this fixes some weird tabbing behavior in FF and IE.\n\t\t\t\t// See #1164\n\t\t\t\tif (!self.isBlurring) {\n\t\t\t\t\tself.$control_input.blur(); // close keyboard on iOS\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.isOpen = false;\n\t\t\tself.$dropdown.hide();\n\t\t\tself.setActiveOption(null);\n\t\t\tself.refreshState();\n\t\n\t\t\tif (trigger) self.trigger('dropdown_close', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Calculates and applies the appropriate\n\t\t * position of the dropdown.\n\t\t */\n\t\tpositionDropdown: function() {\n\t\t\tvar $control = this.$control;\n\t\t\tvar offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();\n\t\t\toffset.top += $control.outerHeight(true);\n\t\n\t\t\tthis.$dropdown.css({\n\t\t\t\twidth : $control[0].getBoundingClientRect().width,\n\t\t\t\ttop   : offset.top,\n\t\t\t\tleft  : offset.left\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Resets / clears all selected items\n\t\t * from the control.\n\t\t *\n\t\t * @param {boolean} silent\n\t\t */\n\t\tclear: function(silent) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (!self.items.length) return;\n\t\t\tself.$control.children(':not(input)').remove();\n\t\t\tself.items = [];\n\t\t\tself.lastQuery = null;\n\t\t\tself.setCaret(0);\n\t\t\tself.setActiveItem(null);\n\t\t\tself.updatePlaceholder();\n\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\tself.refreshState();\n\t\t\tself.showInput();\n\t\t\tself.trigger('clear');\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for inserting an element\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {object} $el\n\t\t */\n\t\tinsertAtCaret: function($el) {\n\t\t\tvar caret = Math.min(this.caretPos, this.items.length);\n\t\t\tvar el = $el[0];\n\t\t\tvar target = this.buffer || this.$control[0];\n\t\n\t\t\tif (caret === 0) {\n\t\t\t\ttarget.insertBefore(el, target.firstChild);\n\t\t\t} else {\n\t\t\t\ttarget.insertBefore(el, target.childNodes[caret]);\n\t\t\t}\n\t\n\t\t\tthis.setCaret(caret + 1);\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the current selected item(s).\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tdeleteSelection: function(e) {\n\t\t\tvar i, n, direction, selection, values, caret, option_select, $option_select, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tdirection = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.$activeOption && !self.settings.hideSelected) {\n\t\t\t\toption_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');\n\t\t\t}\n\t\n\t\t\t// determine items that will be removed\n\t\t\tvalues = [];\n\t\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\t$tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));\n\t\t\t\tcaret = self.$control.children(':not(input)').index($tail);\n\t\t\t\tif (direction > 0) { caret++; }\n\t\n\t\t\t\tfor (i = 0, n = self.$activeItems.length; i < n; i++) {\n\t\t\t\t\tvalues.push($(self.$activeItems[i]).attr('data-value'));\n\t\t\t\t}\n\t\t\t\tif (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos - 1]);\n\t\t\t\t} else if (direction > 0 && selection.start === self.$control_input.val().length) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// allow the callback to abort\n\t\t\tif (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// perform removal\n\t\t\tif (typeof caret !== 'undefined') {\n\t\t\t\tself.setCaret(caret);\n\t\t\t}\n\t\t\twhile (values.length) {\n\t\t\t\tself.removeItem(values.pop());\n\t\t\t}\n\t\n\t\t\tself.showInput();\n\t\t\tself.positionDropdown();\n\t\t\tself.refreshOptions(true);\n\t\n\t\t\t// select previous option\n\t\t\tif (option_select) {\n\t\t\t\t$option_select = self.getOption(option_select);\n\t\t\t\tif ($option_select.length) {\n\t\t\t\t\tself.setActiveOption($option_select);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Selects the previous / next item (depending\n\t\t * on the `direction` argument).\n\t\t *\n\t\t * > 0 - right\n\t\t * < 0 - left\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceSelection: function(direction, e) {\n\t\t\tvar tail, selection, idx, valueLength, cursorAtEdge, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tif (direction === 0) return;\n\t\t\tif (self.rtl) direction *= -1;\n\t\n\t\t\ttail = direction > 0 ? 'last' : 'first';\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.isFocused && !self.isInputHidden) {\n\t\t\t\tvalueLength = self.$control_input.val().length;\n\t\t\t\tcursorAtEdge = direction < 0\n\t\t\t\t\t? selection.start === 0 && selection.length === 0\n\t\t\t\t\t: selection.start === valueLength;\n\t\n\t\t\t\tif (cursorAtEdge && !valueLength) {\n\t\t\t\t\tself.advanceCaret(direction, e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$tail = self.$control.children('.active:' + tail);\n\t\t\t\tif ($tail.length) {\n\t\t\t\t\tidx = self.$control.children(':not(input)').index($tail);\n\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\tself.setCaret(direction > 0 ? idx + 1 : idx);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret left / right.\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceCaret: function(direction, e) {\n\t\t\tvar self = this, fn, $adj;\n\t\n\t\t\tif (direction === 0) return;\n\t\n\t\t\tfn = direction > 0 ? 'next' : 'prev';\n\t\t\tif (self.isShiftDown) {\n\t\t\t\t$adj = self.$control_input[fn]();\n\t\t\t\tif ($adj.length) {\n\t\t\t\t\tself.hideInput();\n\t\t\t\t\tself.setActiveItem($adj);\n\t\t\t\t\te && e.preventDefault();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.setCaret(self.caretPos + direction);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret to the specified index.\n\t\t *\n\t\t * @param {int} i\n\t\t */\n\t\tsetCaret: function(i) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\ti = self.items.length;\n\t\t\t} else {\n\t\t\t\ti = Math.max(0, Math.min(self.items.length, i));\n\t\t\t}\n\t\n\t\t\tif(!self.isPending) {\n\t\t\t\t// the input must be moved by leaving it in place and moving the\n\t\t\t\t// siblings, due to the fact that focus cannot be restored once lost\n\t\t\t\t// on mobile webkit devices\n\t\t\t\tvar j, n, fn, $children, $child;\n\t\t\t\t$children = self.$control.children(':not(input)');\n\t\t\t\tfor (j = 0, n = $children.length; j < n; j++) {\n\t\t\t\t\t$child = $($children[j]).detach();\n\t\t\t\t\tif (j <  i) {\n\t\t\t\t\t\tself.$control_input.before($child);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.$control.append($child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.caretPos = i;\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control. Used while\n\t\t * items are being asynchronously created.\n\t\t */\n\t\tlock: function() {\n\t\t\tthis.close();\n\t\t\tthis.isLocked = true;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Re-enables user input on the control.\n\t\t */\n\t\tunlock: function() {\n\t\t\tthis.isLocked = false;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control completely.\n\t\t * While disabled, it cannot receive focus.\n\t\t */\n\t\tdisable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', true);\n\t\t\tself.$control_input.prop('disabled', true).prop('tabindex', -1);\n\t\t\tself.isDisabled = true;\n\t\t\tself.lock();\n\t\t},\n\t\n\t\t/**\n\t\t * Enables the control so that it can respond\n\t\t * to focus and user input.\n\t\t */\n\t\tenable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', false);\n\t\t\tself.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);\n\t\t\tself.isDisabled = false;\n\t\t\tself.unlock();\n\t\t},\n\t\n\t\t/**\n\t\t * Completely destroys the control and\n\t\t * unbinds all event listeners so that it can\n\t\t * be garbage collected.\n\t\t */\n\t\tdestroy: function() {\n\t\t\tvar self = this;\n\t\t\tvar eventNS = self.eventNS;\n\t\t\tvar revertSettings = self.revertSettings;\n\t\n\t\t\tself.trigger('destroy');\n\t\t\tself.off();\n\t\t\tself.$wrapper.remove();\n\t\t\tself.$dropdown.remove();\n\t\n\t\t\tself.$input\n\t\t\t\t.html('')\n\t\t\t\t.append(revertSettings.$children)\n\t\t\t\t.removeAttr('tabindex')\n\t\t\t\t.removeClass('selectized')\n\t\t\t\t.attr({tabindex: revertSettings.tabindex})\n\t\t\t\t.show();\n\t\n\t\t\tself.$control_input.removeData('grow');\n\t\t\tself.$input.removeData('selectize');\n\t\n\t\t\tif (--Selectize.count == 0 && Selectize.$testInput) {\n\t\t\t\tSelectize.$testInput.remove();\n\t\t\t\tSelectize.$testInput = undefined;\n\t\t\t}\n\t\n\t\t\t$(window).off(eventNS);\n\t\t\t$(document).off(eventNS);\n\t\t\t$(document.body).off(eventNS);\n\t\n\t\t\tdelete self.$input[0].selectize;\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for rendering \"item\" and\n\t\t * \"option\" templates, given the data.\n\t\t *\n\t\t * @param {string} templateName\n\t\t * @param {object} data\n\t\t * @returns {string}\n\t\t */\n\t\trender: function(templateName, data) {\n\t\t\tvar value, id, label;\n\t\t\tvar html = '';\n\t\t\tvar cache = false;\n\t\t\tvar self = this;\n\t\t\tvar regex_tag = /^[\\t \\r\\n]*<([a-z][a-z0-9\\-_]*(?:\\:[a-z][a-z0-9\\-_]*)?)/i;\n\t\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\tvalue = hash_key(data[self.settings.valueField]);\n\t\t\t\tcache = !!value;\n\t\t\t}\n\t\n\t\t\t// pull markup from cache if it exists\n\t\t\tif (cache) {\n\t\t\t\tif (!isset(self.renderCache[templateName])) {\n\t\t\t\t\tself.renderCache[templateName] = {};\n\t\t\t\t}\n\t\t\t\tif (self.renderCache[templateName].hasOwnProperty(value)) {\n\t\t\t\t\treturn self.renderCache[templateName][value];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// render markup\n\t\t\thtml = $(self.settings.render[templateName].apply(this, [data, escape_html]));\n\t\n\t\t\t// add mandatory attributes\n\t\t\tif (templateName === 'option' || templateName === 'option_create') {\n\t\t\t\tif (!data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-selectable', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (templateName === 'optgroup') {\n\t\t\t\tid = data[self.settings.optgroupValueField] || '';\n\t\t\t\thtml.attr('data-group', id);\n\t\t\t\tif(data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-disabled', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\thtml.attr('data-value', value || '');\n\t\t\t}\n\t\n\t\t\t// update cache\n\t\t\tif (cache) {\n\t\t\t\tself.renderCache[templateName][value] = html[0];\n\t\t\t}\n\t\n\t\t\treturn html[0];\n\t\t},\n\t\n\t\t/**\n\t\t * Clears the render cache for a template. If\n\t\t * no template is given, clears all render\n\t\t * caches.\n\t\t *\n\t\t * @param {string} templateName\n\t\t */\n\t\tclearCache: function(templateName) {\n\t\t\tvar self = this;\n\t\t\tif (typeof templateName === 'undefined') {\n\t\t\t\tself.renderCache = {};\n\t\t\t} else {\n\t\t\t\tdelete self.renderCache[templateName];\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not to display the\n\t\t * create item prompt, given a user input.\n\t\t *\n\t\t * @param {string} input\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCreate: function(input) {\n\t\t\tvar self = this;\n\t\t\tif (!self.settings.create) return false;\n\t\t\tvar filter = self.settings.createFilter;\n\t\t\treturn input.length\n\t\t\t\t&& (typeof filter !== 'function' || filter.apply(self, [input]))\n\t\t\t\t&& (typeof filter !== 'string' || new RegExp(filter).test(input))\n\t\t\t\t&& (!(filter instanceof RegExp) || filter.test(input));\n\t\t}\n\t\n\t});\n\t\n\t\n\tSelectize.count = 0;\n\tSelectize.defaults = {\n\t\toptions: [],\n\t\toptgroups: [],\n\t\n\t\tplugins: [],\n\t\tdelimiter: ',',\n\t\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\t\tpersist: true,\n\t\tdiacritics: true,\n\t\tcreate: false,\n\t\tcreateOnBlur: false,\n\t\tcreateFilter: null,\n\t\thighlight: true,\n\t\topenOnFocus: true,\n\t\tmaxOptions: 1000,\n\t\tmaxItems: null,\n\t\thideSelected: null,\n\t\taddPrecedence: false,\n\t\tselectOnTab: false,\n\t\tpreload: false,\n\t\tallowEmptyOption: false,\n\t\tcloseAfterSelect: false,\n\t\n\t\tscrollDuration: 60,\n\t\tloadThrottle: 300,\n\t\tloadingClass: 'loading',\n\t\n\t\tdataAttr: 'data-data',\n\t\toptgroupField: 'optgroup',\n\t\tvalueField: 'value',\n\t\tlabelField: 'text',\n\t\tdisabledField: 'disabled',\n\t\toptgroupLabelField: 'label',\n\t\toptgroupValueField: 'value',\n\t\tlockOptgroupOrder: false,\n\t\n\t\tsortField: '$order',\n\t\tsearchField: ['text'],\n\t\tsearchConjunction: 'and',\n\t\n\t\tmode: null,\n\t\twrapperClass: 'selectize-control',\n\t\tinputClass: 'selectize-input',\n\t\tdropdownClass: 'selectize-dropdown',\n\t\tdropdownContentClass: 'selectize-dropdown-content',\n\t\n\t\tdropdownParent: null,\n\t\n\t\tcopyClassesToDropdown: true,\n\t\n\t\t/*\n\t\tload                 : null, // function(query, callback) { ... }\n\t\tscore                : null, // function(search) { ... }\n\t\tonInitialize         : null, // function() { ... }\n\t\tonChange             : null, // function(value) { ... }\n\t\tonItemAdd            : null, // function(value, $item) { ... }\n\t\tonItemRemove         : null, // function(value) { ... }\n\t\tonClear              : null, // function() { ... }\n\t\tonOptionAdd          : null, // function(value, data) { ... }\n\t\tonOptionRemove       : null, // function(value) { ... }\n\t\tonOptionClear        : null, // function() { ... }\n\t\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\t\tonOptionGroupRemove  : null, // function(id) { ... }\n\t\tonOptionGroupClear   : null, // function() { ... }\n\t\tonDropdownOpen       : null, // function($dropdown) { ... }\n\t\tonDropdownClose      : null, // function($dropdown) { ... }\n\t\tonType               : null, // function(str) { ... }\n\t\tonDelete             : null, // function(values) { ... }\n\t\t*/\n\t\n\t\trender: {\n\t\t\t/*\n\t\t\titem: null,\n\t\t\toptgroup: null,\n\t\t\toptgroup_header: null,\n\t\t\toption: null,\n\t\t\toption_create: null\n\t\t\t*/\n\t\t}\n\t};\n\t\n\t\n\t$.fn.selectize = function(settings_user) {\n\t\tvar defaults             = $.fn.selectize.defaults;\n\t\tvar settings             = $.extend({}, defaults, settings_user);\n\t\tvar attr_data            = settings.dataAttr;\n\t\tvar field_label          = settings.labelField;\n\t\tvar field_value          = settings.valueField;\n\t\tvar field_disabled       = settings.disabledField;\n\t\tvar field_optgroup       = settings.optgroupField;\n\t\tvar field_optgroup_label = settings.optgroupLabelField;\n\t\tvar field_optgroup_value = settings.optgroupValueField;\n\t\n\t\t/**\n\t\t * Initializes selectize from a <input type=\"text\"> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_textbox = function($input, settings_element) {\n\t\t\tvar i, n, values, option;\n\t\n\t\t\tvar data_raw = $input.attr(attr_data);\n\t\n\t\t\tif (!data_raw) {\n\t\t\t\tvar value = $.trim($input.val() || '');\n\t\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\t\tvalues = value.split(settings.delimiter);\n\t\t\t\tfor (i = 0, n = values.length; i < n; i++) {\n\t\t\t\t\toption = {};\n\t\t\t\t\toption[field_label] = values[i];\n\t\t\t\t\toption[field_value] = values[i];\n\t\t\t\t\tsettings_element.options.push(option);\n\t\t\t\t}\n\t\t\t\tsettings_element.items = values;\n\t\t\t} else {\n\t\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\t\tfor (i = 0, n = settings_element.options.length; i < n; i++) {\n\t\t\t\t\tsettings_element.items.push(settings_element.options[i][field_value]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t/**\n\t\t * Initializes selectize from a <select> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_select = function($input, settings_element) {\n\t\t\tvar i, n, tagName, $children, order = 0;\n\t\t\tvar options = settings_element.options;\n\t\t\tvar optionsMap = {};\n\t\n\t\t\tvar readData = function($el) {\n\t\t\t\tvar data = attr_data && $el.attr(attr_data);\n\t\t\t\tif (typeof data === 'string' && data.length) {\n\t\t\t\t\treturn JSON.parse(data);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\t\n\t\t\tvar addOption = function($option, group) {\n\t\t\t\t$option = $($option);\n\t\n\t\t\t\tvar value = hash_key($option.val());\n\t\t\t\tif (!value && !settings.allowEmptyOption) return;\n\t\n\t\t\t\t// if the option already exists, it's probably been\n\t\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t\t// existing option so that it's rendered in both places.\n\t\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t\t} else if (!$.isArray(arr)) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tvar option             = readData($option) || {};\n\t\t\t\toption[field_label]    = option[field_label] || $option.text();\n\t\t\t\toption[field_value]    = option[field_value] || value;\n\t\t\t\toption[field_disabled] = option[field_disabled] || $option.prop('disabled');\n\t\t\t\toption[field_optgroup] = option[field_optgroup] || group;\n\t\n\t\t\t\toptionsMap[value] = option;\n\t\t\t\toptions.push(option);\n\t\n\t\t\t\tif ($option.is(':selected')) {\n\t\t\t\t\tsettings_element.items.push(value);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tvar addGroup = function($optgroup) {\n\t\t\t\tvar i, n, id, optgroup, $options;\n\t\n\t\t\t\t$optgroup = $($optgroup);\n\t\t\t\tid = $optgroup.attr('label');\n\t\n\t\t\t\tif (id) {\n\t\t\t\t\toptgroup = readData($optgroup) || {};\n\t\t\t\t\toptgroup[field_optgroup_label] = id;\n\t\t\t\t\toptgroup[field_optgroup_value] = id;\n\t\t\t\t\toptgroup[field_disabled] = $optgroup.prop('disabled');\n\t\t\t\t\tsettings_element.optgroups.push(optgroup);\n\t\t\t\t}\n\t\n\t\t\t\t$options = $('option', $optgroup);\n\t\t\t\tfor (i = 0, n = $options.length; i < n; i++) {\n\t\t\t\t\taddOption($options[i], id);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tsettings_element.maxItems = $input.attr('multiple') ? null : 1;\n\t\n\t\t\t$children = $input.children();\n\t\t\tfor (i = 0, n = $children.length; i < n; i++) {\n\t\t\t\ttagName = $children[i].tagName.toLowerCase();\n\t\t\t\tif (tagName === 'optgroup') {\n\t\t\t\t\taddGroup($children[i]);\n\t\t\t\t} else if (tagName === 'option') {\n\t\t\t\t\taddOption($children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\treturn this.each(function() {\n\t\t\tif (this.selectize) return;\n\t\n\t\t\tvar instance;\n\t\t\tvar $input = $(this);\n\t\t\tvar tag_name = this.tagName.toLowerCase();\n\t\t\tvar placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');\n\t\t\tif (!placeholder && !settings.allowEmptyOption) {\n\t\t\t\tplaceholder = $input.children('option[value=\"\"]').text();\n\t\t\t}\n\t\n\t\t\tvar settings_element = {\n\t\t\t\t'placeholder' : placeholder,\n\t\t\t\t'options'     : [],\n\t\t\t\t'optgroups'   : [],\n\t\t\t\t'items'       : []\n\t\t\t};\n\t\n\t\t\tif (tag_name === 'select') {\n\t\t\t\tinit_select($input, settings_element);\n\t\t\t} else {\n\t\t\t\tinit_textbox($input, settings_element);\n\t\t\t}\n\t\n\t\t\tinstance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));\n\t\t});\n\t};\n\t\n\t$.fn.selectize.defaults = Selectize.defaults;\n\t$.fn.selectize.support = {\n\t\tvalidity: SUPPORTS_VALIDITY_API\n\t};\n\t\n\t\n\tSelectize.define('drag_drop', function(options) {\n\t\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\t\tif (this.settings.mode !== 'multi') return;\n\t\tvar self = this;\n\t\n\t\tself.lock = (function() {\n\t\t\tvar original = self.lock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.disable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.unlock = (function() {\n\t\t\tvar original = self.unlock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.enable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(this, arguments);\n\t\n\t\t\t\tvar $control = self.$control.sortable({\n\t\t\t\t\titems: '[data-value]',\n\t\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\t\tdisabled: self.isLocked,\n\t\t\t\t\tstart: function(e, ui) {\n\t\t\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t\t\t},\n\t\t\t\t\tstop: function() {\n\t\t\t\t\t\t$control.css({overflow: 'hidden'});\n\t\t\t\t\t\tvar active = self.$activeItems ? self.$activeItems.slice() : null;\n\t\t\t\t\t\tvar values = [];\n\t\t\t\t\t\t$control.children('[data-value]').each(function() {\n\t\t\t\t\t\t\tvalues.push($(this).attr('data-value'));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tself.setValue(values);\n\t\t\t\t\t\tself.setActiveItem(active);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('dropdown_header', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\ttitle         : 'Untitled',\n\t\t\theaderClass   : 'selectize-dropdown-header',\n\t\t\ttitleRowClass : 'selectize-dropdown-header-title',\n\t\t\tlabelClass    : 'selectize-dropdown-header-label',\n\t\t\tcloseClass    : 'selectize-dropdown-header-close',\n\t\n\t\t\thtml: function(data) {\n\t\t\t\treturn (\n\t\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t\t'<a href=\"javascript:void(0)\" class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}, options);\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(self, arguments);\n\t\t\t\tself.$dropdown_header = $(options.html(options));\n\t\t\t\tself.$dropdown.prepend(self.$dropdown_header);\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('optgroup_columns', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\tequalizeWidth  : true,\n\t\t\tequalizeHeight : true\n\t\t}, options);\n\t\n\t\tthis.getAdjacentOption = function($option, direction) {\n\t\t\tvar $options = $option.closest('[data-group]').find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, $option, $options, $optgroup;\n\t\n\t\t\t\tif (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {\n\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t$optgroup = this.$activeOption.closest('[data-group]');\n\t\t\t\t\tindex = $optgroup.find('[data-selectable]').index(this.$activeOption);\n\t\n\t\t\t\t\tif(e.keyCode === KEY_LEFT) {\n\t\t\t\t\t\t$optgroup = $optgroup.prev('[data-group]');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$optgroup = $optgroup.next('[data-group]');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t$options = $optgroup.find('[data-selectable]');\n\t\t\t\t\t$option  = $options.eq(Math.min($options.length - 1, index));\n\t\t\t\t\tif ($option.length) {\n\t\t\t\t\t\tthis.setActiveOption($option);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tvar getScrollbarWidth = function() {\n\t\t\tvar div;\n\t\t\tvar width = getScrollbarWidth.width;\n\t\t\tvar doc = document;\n\t\n\t\t\tif (typeof width === 'undefined') {\n\t\t\t\tdiv = doc.createElement('div');\n\t\t\t\tdiv.innerHTML = '<div style=\"width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;\"><div style=\"width:1px;height:100px;\"></div></div>';\n\t\t\t\tdiv = div.firstChild;\n\t\t\t\tdoc.body.appendChild(div);\n\t\t\t\twidth = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;\n\t\t\t\tdoc.body.removeChild(div);\n\t\t\t}\n\t\t\treturn width;\n\t\t};\n\t\n\t\tvar equalizeSizes = function() {\n\t\t\tvar i, n, height_max, width, width_last, width_parent, $optgroups;\n\t\n\t\t\t$optgroups = $('[data-group]', self.$dropdown_content);\n\t\t\tn = $optgroups.length;\n\t\t\tif (!n || !self.$dropdown_content.width()) return;\n\t\n\t\t\tif (options.equalizeHeight) {\n\t\t\t\theight_max = 0;\n\t\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\t\theight_max = Math.max(height_max, $optgroups.eq(i).height());\n\t\t\t\t}\n\t\t\t\t$optgroups.css({height: height_max});\n\t\t\t}\n\t\n\t\t\tif (options.equalizeWidth) {\n\t\t\t\twidth_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();\n\t\t\t\twidth = Math.round(width_parent / n);\n\t\t\t\t$optgroups.css({width: width});\n\t\t\t\tif (n > 1) {\n\t\t\t\t\twidth_last = width_parent - width * (n - 1);\n\t\t\t\t\t$optgroups.eq(n - 1).css({width: width_last});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\tif (options.equalizeHeight || options.equalizeWidth) {\n\t\t\thook.after(this, 'positionDropdown', equalizeSizes);\n\t\t\thook.after(this, 'refreshOptions', equalizeSizes);\n\t\t}\n\t\n\t\n\t});\n\t\n\tSelectize.define('remove_button', function(options) {\n\t\toptions = $.extend({\n\t\t\t\tlabel     : '&times;',\n\t\t\t\ttitle     : 'Remove',\n\t\t\t\tclassName : 'remove',\n\t\t\t\tappend    : true\n\t\t\t}, options);\n\t\n\t\t\tvar singleClose = function(thisRef, options) {\n\t\n\t\t\t\toptions.className = 'remove-single';\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\treturn $('<span>').append(html_container)\n\t\t\t\t\t\t.append(html_element);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar id = $(self.$input.context).attr('id');\n\t\t\t\t\t\t\tvar selectizer = $('#'+id);\n\t\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tself.clear();\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tvar multiClose = function(thisRef, options) {\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\tvar pos = html_container.search(/(<\\/[^>]+>\\s*)$/);\n\t\t\t\t\treturn html_container.substring(0, pos) + html_element + html_container.substring(pos);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tvar $item = $(e.currentTarget).parent();\n\t\t\t\t\t\t\tself.setActiveItem($item);\n\t\t\t\t\t\t\tif (self.deleteSelection()) {\n\t\t\t\t\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tif (this.settings.mode === 'single') {\n\t\t\t\tsingleClose(this, options);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tmultiClose(this, options);\n\t\t\t}\n\t});\n\t\n\t\n\tSelectize.define('restore_on_backspace', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions.text = options.text || function(option) {\n\t\t\treturn option[this.settings.labelField];\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, option;\n\t\t\t\tif (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {\n\t\t\t\t\tindex = this.caretPos - 1;\n\t\t\t\t\tif (index >= 0 && index < this.items.length) {\n\t\t\t\t\t\toption = this.options[this.items[index]];\n\t\t\t\t\t\tif (this.deleteSelection(e)) {\n\t\t\t\t\t\t\tthis.setTextboxValue(options.text.apply(this, [option]));\n\t\t\t\t\t\t\tthis.refreshOptions(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t});\n\t\n\n\treturn Selectize;\n}));\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"scrollLock\"] = factory();\n\telse\n\t\troot[\"scrollLock\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});\n/*!\n  * PhotoSwipe 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipe=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function s(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function h(t,i){const s=Math.abs(t.x-i.x),h=Math.abs(t.y-i.y);return Math.sqrt(s*s+h*h)}function e(t,i){return t.x===i.x&&t.y===i.y}function n(t,i,s){return Math.min(Math.max(t,i),s)}function o(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}function r(t,i,s,h){t.style.transform=o(i,s,h)}function a(t,i,s,h){t.style.transition=i?`${i} ${s}ms ${h||\"cubic-bezier(.4,0,.22,1)\"}`:\"none\"}function l(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const c=\"idle\",d=\"loading\",u=\"loaded\",p=\"error\";function m(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let v=!1;try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:()=>{v=!0}}))}catch(t){}class f{constructor(){this.t=[]}add(t,i,s,h){this.i(t,i,s,h)}remove(t,i,s,h){this.i(t,i,s,h,!0)}removeAll(){this.t.forEach((t=>{this.i(t.target,t.type,t.listener,t.passive,!0,!0)})),this.t=[]}i(t,i,s,h,e,n){if(!t)return;const o=e?\"removeEventListener\":\"addEventListener\";i.split(\" \").forEach((i=>{if(i){n||(e?this.t=this.t.filter((h=>h.type!==i||h.listener!==s||h.target!==t)):this.t.push({target:t,type:i,listener:s,passive:h}));const r=!!v&&{passive:h||!1};t[o](i,s,r)}}))}}function w(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function g(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}function y(t,i,s,h){return{x:i.x-g(\"left\",t,i,s,h)-g(\"right\",t,i,s,h),y:i.y-g(\"top\",t,i,s,h)-g(\"bottom\",t,i,s,h)}}class _{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this.o(\"x\"),this.o(\"y\"),this.slide.pswp.dispatch(\"calcBounds\",{slide:this.slide})):this.reset()}o(t){const{pswp:i}=this.slide,s=this.slide[\"x\"===t?\"width\":\"height\"]*this.currZoomLevel,h=g(\"x\"===t?\"left\":\"top\",i.options,i.viewportSize,this.slide.data,this.slide.index),e=this.slide.panAreaSize[t];this.center[t]=Math.round((e-s)/2)+h,this.max[t]=s>e?Math.round(e-s)+h:this.center[t],this.min[t]=s>e?h:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return n(i,this.max[t],this.min[t])}}class x{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.l(),this.secondary=this.u(),this.max=Math.max(this.initial,this.secondary,this.p()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}m(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}u(){let t=this.m(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}l(){return this.m(\"initial\")||this.fit}p(){return this.m(\"max\")||Math.max(1,4*this.fit)}}class b{constructor(i,s,h){this.data=i,this.index=s,this.pswp=h,this.isActive=s===h.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!h.opener.isOpen,this.zoomLevels=new x(h.options,i,s,h),this.pswp.dispatch(\"gettingData\",{slide:this,data:this.data,index:s}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=t(\"pswp__zoom-wrap\",\"div\"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new _(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch(\"slideInit\",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin=\"0 0\",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch(\"firstZoomPan\",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch(\"afterSetContent\",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch(\"slideLoad\",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch(\"appendHeavy\",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch(\"appendHeavyContent\",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch(\"slideActivate\",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch(\"slideDeactivate\",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch(\"slideDestroy\",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const s=Math.round(this.width*i)||this.pswp.viewportSize.x,h=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(s,h)||t)&&this.content.setDisplayedSize(s,h)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,h,e){const{pswp:o}=this;if(!this.isZoomable()||o.mainScroll.isShifted())return;o.dispatch(\"beforeZoomTo\",{destZoomLevel:t,centerPoint:i,transitionDuration:h}),o.animations.stopAllPan();const r=this.currZoomLevel;e||(t=n(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset(\"x\",i,r),this.pan.y=this.calculateZoomToPanOffset(\"y\",i,r),s(this.pan);const a=()=>{this.v(t),this.applyCurrentZoomPan()};h?o.animations.startTransition({isPan:!0,name:\"zoomTo\",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:h,easing:o.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,s){if(0===this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),s||(s=this.zoomLevels.initial);const h=this.currZoomLevel/s;return this.bounds.correctPan(t,(this.pan[t]-i[t])*h+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan(\"x\",t),this.pan.y=this.bounds.correctPan(\"y\",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this.g(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch(\"zoomPanUpdate\",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),i(this.pan,this.bounds.center),this.pswp.dispatch(\"initialZoomPan\",{slide:this})}g(t,i,s){s/=this.currentResolution||this.zoomLevels.initial,r(this.container,t,i,s)}calculateSize(){const{pswp:t}=this;i(this.panAreaSize,y(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch(\"calcSlideSize\",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return o(this.pan.x,this.pan.y,t)}v(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch(\"resolutionChanged\"))}}class S{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&i(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:h}=this.gestures,{currSlide:e}=this.pswp;if(\"y\"===h&&this.pswp.options.closeOnVerticalDrag&&e&&e.currZoomLevel<=e.zoomLevels.fit&&!this.gestures.isMultitouch){const s=e.pan.y+(t.y-i.y);if(!this.pswp.dispatch(\"verticalDrag\",{panY:s}).defaultPrevented){this._(\"y\",s,.6);const t=1-Math.abs(this.S(e.pan.y));this.pswp.applyBgOpacity(t),e.applyCurrentZoomPan()}}else{this.M(\"x\")||(this.M(\"y\"),e&&(s(e.pan),e.applyCurrentZoomPan()))}}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:s}=this.pswp;let h=0;if(this.pswp.animations.stopAll(),i.isShifted()){const s=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&s<0||t.x<.1&&s<-.5?(h=1,t.x=Math.min(t.x,0)):(t.x>.5&&s>0||t.x>-.1&&s>.5)&&(h=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(h,!0,t.x)}s&&s.currZoomLevel>s.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this.P(\"x\"),this.P(\"y\"))}P(t){const{velocity:i}=this.gestures,{currSlide:s}=this.pswp;if(!s)return;const{pan:h,bounds:e}=s,o=h[t],r=this.pswp.bgOpacity<1&&\"y\"===t,a=o+function(t,i){return t*i/(1-i)}(i[t],.995);if(r){const t=this.S(o),i=this.S(a);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=e.correctPan(t,a);if(o===l)return;const c=l===a?1:.82,d=this.pswp.bgOpacity,u=l-o;this.pswp.animations.startSpring({name:\"panGesture\"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:c,onUpdate:i=>{if(r&&this.pswp.bgOpacity<1){const t=1-(l-i)/u;this.pswp.applyBgOpacity(n(d+(1-d)*t,0,1))}h[t]=Math.floor(i),s.applyCurrentZoomPan()}})}M(t){const{p1:i,dragAxis:s,prevP1:h,isMultitouch:e}=this.gestures,{currSlide:n,mainScroll:o}=this.pswp,r=i[t]-h[t],a=o.x+r;if(!r||!n)return!1;if(\"x\"===t&&!n.isPannable()&&!e)return o.moveTo(a,!0),!0;const{bounds:l}=n,c=n.pan[t]+r;if(this.pswp.options.allowPanToNext&&\"x\"===s&&\"x\"===t&&!e){const i=o.getCurrSlideX(),s=o.x-i,h=r>0,e=!h;if(c>l.min[t]&&h){if(l.min[t]<=this.startPan[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(c<l.max[t]&&e){if(this.startPan[t]<=l.max[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(0!==s){if(s>0)return o.moveTo(Math.max(a,i),!0),!0;if(s<0)return o.moveTo(Math.min(a,i),!0),!0}else this._(t,c)}else\"y\"===t&&(o.isShifted()||l.min.y===l.max.y)||this._(t,c);return!1}S(t){var i,s;return(t-(null!==(i=null===(s=this.pswp.currSlide)||void 0===s?void 0:s.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_(t,i,s){const{currSlide:h}=this.pswp;if(!h)return;const{pan:e,bounds:n}=h;if(n.correctPan(t,i)!==i||s){const h=Math.round(i-e[t]);e[t]+=h*(s||.35)}else e[t]=i}}function z(t,i,s){return t.x=(i.x+s.x)/2,t.y=(i.y+s.y)/2,t}class M{constructor(t){this.gestures=t,this.C={x:0,y:0},this.T={x:0,y:0},this.A={x:0,y:0},this.D=!1,this.I=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this.I=t.currZoomLevel,i(this.C,t.pan)),this.gestures.pswp.animations.stopAllPan(),this.D=!1}change(){const{p1:t,startP1:i,p2:s,startP2:e,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const r=o.zoomLevels.min,a=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;z(this.T,i,e),z(this.A,t,s);let l=1/h(i,e)*h(t,s)*this.I;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this.D=!0),l<r)if(n.options.pinchToClose&&!this.D&&this.I<=o.zoomLevels.initial){const t=1-(r-l)/(r/1.2);n.dispatch(\"pinchClose\",{bgOpacity:t}).defaultPrevented||n.applyBgOpacity(t)}else l=r-.15*(r-l);else l>a&&(l=a+.05*(l-a));o.pan.x=this.L(\"x\",l),o.pan.y=this.L(\"y\",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevel<i.zoomLevels.initial)&&!this.D&&t.options.pinchToClose?t.close():this.correctZoomPan()}L(t,i){const s=i/this.I;return this.A[t]-(this.T[t]-this.C[t])*s}correctZoomPan(t){const{pswp:s}=this.gestures,{currSlide:h}=s;if(null==h||!h.isZoomable())return;0===this.A.x&&(t=!0);const o=h.currZoomLevel;let r,a=!0;o<h.zoomLevels.initial?r=h.zoomLevels.initial:o>h.zoomLevels.max?r=h.zoomLevels.max:(a=!1,r=o);const l=s.bgOpacity,c=s.bgOpacity<1,d=i({x:0,y:0},h.pan);let u=i({x:0,y:0},d);t&&(this.A.x=0,this.A.y=0,this.T.x=0,this.T.y=0,this.I=o,i(this.C,d)),a&&(u={x:this.L(\"x\",r),y:this.L(\"y\",r)}),h.setZoomLevel(r),u={x:h.bounds.correctPan(\"x\",u.x),y:h.bounds.correctPan(\"y\",u.y)},h.setZoomLevel(o);const p=!e(u,d);if(!p&&!a&&!c)return h.v(r),void h.applyCurrentZoomPan();s.animations.stopAllPan(),s.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,p||a){if(p&&(h.pan.x=d.x+(u.x-d.x)*t,h.pan.y=d.y+(u.y-d.y)*t),a){const i=o+(r-o)*t;h.setZoomLevel(i)}h.applyCurrentZoomPan()}c&&s.bgOpacity<1&&s.applyBgOpacity(n(l+(1-l)*t,0,1))},onComplete:()=>{h.v(r),h.applyCurrentZoomPan()}})}}function P(t){return!!t.target.closest(\".pswp__container\")}class C{constructor(t){this.gestures=t}click(t,i){const s=i.target.classList,h=s.contains(\"pswp__img\"),e=s.contains(\"pswp__item\")||s.contains(\"pswp__zoom-wrap\");h?this.k(\"imageClick\",t,i):e&&this.k(\"bgClick\",t,i)}tap(t,i){P(i)&&this.k(\"tap\",t,i)}doubleTap(t,i){P(i)&&this.k(\"doubleTap\",t,i)}k(t,i,s){var h;const{pswp:e}=this.gestures,{currSlide:n}=e,o=t+\"Action\",r=e.options[o];if(!e.dispatch(o,{point:i,originalEvent:s}).defaultPrevented)if(\"function\"!=typeof r)switch(r){case\"close\":case\"next\":e[r]();break;case\"zoom\":null==n||n.toggleZoom(i);break;case\"zoom-or-close\":null!=n&&n.isZoomable()&&n.zoomLevels.secondary!==n.zoomLevels.initial?n.toggleZoom(i):e.options.clickToCloseNonZoomable&&e.close();break;case\"toggle-controls\":null===(h=this.gestures.pswp.element)||void 0===h||h.classList.toggle(\"pswp--ui-visible\")}else r.call(e,i,s)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this.Z={x:0,y:0},this.B={x:0,y:0},this.F=0,this.O=[],this.R=\"ontouchstart\"in window,this.N=!!window.PointerEvent,this.supportsTouch=this.R||this.N&&navigator.maxTouchPoints>1,this.F=0,this.U=0,this.V=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this.G=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new S(this),this.zoomLevels=new M(this),this.tapHandler=new C(this),t.on(\"bindEvents\",(()=>{t.events.add(t.scrollWrap,\"click\",this.$.bind(this)),this.N?this.q(\"pointer\",\"down\",\"up\",\"cancel\"):this.R?(this.q(\"touch\",\"start\",\"end\",\"cancel\"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this.q(\"mouse\",\"down\",\"up\")}))}q(t,i,s,h){const{pswp:e}=this,{events:n}=e,o=h?t+h:\"\";n.add(e.scrollWrap,t+i,this.onPointerDown.bind(this)),n.add(window,t+\"move\",this.onPointerMove.bind(this)),n.add(window,t+s,this.onPointerUp.bind(this)),o&&n.add(e.scrollWrap,o,this.onPointerUp.bind(this))}onPointerDown(t){const s=\"mousedown\"===t.type||\"mouse\"===t.pointerType;if(s&&t.button>0)return;const{pswp:h}=this;h.opener.isOpen?h.dispatch(\"pointerDown\",{originalEvent:t}).defaultPrevented||(s&&(h.mouseDetected(),this.H(t,\"down\")),h.animations.stopAll(),this.K(t,\"down\"),1===this.F&&(this.dragAxis=null,i(this.startP1,this.p1)),this.F>1?(this.W(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this.H(t,\"move\"),this.F&&(this.K(t,\"move\"),this.pswp.dispatch(\"pointerMove\",{originalEvent:t}).defaultPrevented||(1!==this.F||this.isDragging?this.F>1&&!this.isZooming&&(this.j(),this.isZooming=!0,this.X(),this.zoomLevels.start(),this.Y(),this.J()):(this.dragAxis||this.tt(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this.W(),this.X(),this.U=Date.now(),this.V=!1,i(this.B,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this.Y(),this.J()))))}j(){this.isDragging&&(this.isDragging=!1,this.V||this.it(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this.F&&(this.K(t,\"up\"),this.pswp.dispatch(\"pointerUp\",{originalEvent:t}).defaultPrevented||(0===this.F&&(this.Y(),this.isDragging?this.j():this.isZooming||this.isMultitouch||this.st(t)),this.F<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this.F&&(this.dragAxis=null,this.X()))))}J(){(this.isDragging||this.isZooming)&&(this.it(),this.isDragging?e(this.p1,this.prevP1)||this.drag.change():e(this.p1,this.prevP1)&&e(this.p2,this.prevP2)||this.zoomLevels.change(),this.ht(),this.raf=requestAnimationFrame(this.J.bind(this)))}it(t){const s=Date.now(),h=s-this.U;h<50&&!t||(this.velocity.x=this.et(\"x\",h),this.velocity.y=this.et(\"y\",h),this.U=s,i(this.B,this.p1),this.V=!0)}st(t){const{mainScroll:s}=this.pswp;if(s.isShifted())return void s.moveIndexBy(0,!0);if(t.type.indexOf(\"cancel\")>0)return;if(\"mouseup\"===t.type||\"mouse\"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this.G?(this.W(),h(this.Z,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(i(this.Z,this.startP1),this.G=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this.W()}),e))}W(){this.G&&(clearTimeout(this.G),this.G=null)}et(t,i){const s=this.p1[t]-this.B[t];return Math.abs(s)>1&&i>5?s/i:0}Y(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}H(t,i){this.pswp.applyFilters(\"preventPointerEvent\",!0,t,i)&&t.preventDefault()}K(t,s){if(this.N){const h=t,e=this.O.findIndex((t=>t.id===h.pointerId));\"up\"===s&&e>-1?this.O.splice(e,1):\"down\"===s&&-1===e?this.O.push(this.nt(h,{x:0,y:0})):e>-1&&this.nt(h,this.O[e]),this.F=this.O.length,this.F>0&&i(this.p1,this.O[0]),this.F>1&&i(this.p2,this.O[1])}else{const i=t;this.F=0,i.type.indexOf(\"touch\")>-1?i.touches&&i.touches.length>0&&(this.nt(i.touches[0],this.p1),this.F++,i.touches.length>1&&(this.nt(i.touches[1],this.p2),this.F++)):(this.nt(t,this.p1),\"up\"===s?this.F=0:this.F++)}}ht(){i(this.prevP1,this.p1),i(this.prevP2,this.p2)}X(){i(this.startP1,this.p1),i(this.startP2,this.p2),this.ht()}tt(){if(this.pswp.mainScroll.isShifted())this.dragAxis=\"x\";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?\"x\":\"y\";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}nt(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,\"pointerId\"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}$(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class A{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this.ot=0,this.rt=0,this.lt=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,s=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),h=s!==this.slideWidth;h&&(this.slideWidth=s,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,s)=>{h&&r(i.el,(s+this.lt)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this.ot=0,this.rt=0,this.slideWidth=0,this.lt=-1}appendHolders(){this.itemHolders=[];for(let i=0;i<3;i++){const s=t(\"pswp__item\",\"div\",this.pswp.container);s.setAttribute(\"role\",\"group\"),s.setAttribute(\"aria-roledescription\",\"slide\"),s.setAttribute(\"aria-hidden\",\"true\"),s.style.display=1===i?\"block\":\"none\",this.itemHolders.push({el:s})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,s){const{pswp:h}=this;let e=h.potentialIndex+t;const n=h.getNumItems();if(h.canLoop()){e=h.getLoopedIndex(e);const i=(t+n)%n;t=i<=n/2?i:i-n}else e<0?e=0:e>=n&&(e=n-1),t=e-h.potentialIndex;h.potentialIndex=e,this.ot-=t,h.animations.stopMainScroll();const o=this.getCurrSlideX();if(i){h.animations.startSpring({isMainScroll:!0,start:this.x,end:o,velocity:s||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),h.appendHeavy()}});let t=h.potentialIndex-h.currIndex;if(h.canLoop()){const i=(t+n)%n;t=i<=n/2?i:i-n}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(o),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this.ot}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,s=this.rt-this.ot;if(!s)return;this.rt=this.ot,i.currIndex=i.potentialIndex;let h,e=Math.abs(s);e>=3&&(this.lt+=s+(s>0?-3:3),e=3,this.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy(),t.slide=void 0})));for(let t=0;t<e;t++)s>0?(h=this.itemHolders.shift(),h&&(this.itemHolders[2]=h,this.lt++,r(h.el,(this.lt+2)*this.slideWidth),i.setContent(h,i.currIndex-e+t+2))):(h=this.itemHolders.pop(),h&&(this.itemHolders.unshift(h),this.lt--,r(h.el,this.lt*this.slideWidth),i.setContent(h,i.currIndex+e-t-2)));Math.abs(this.lt)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(s),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch(\"change\")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this.ot-t)/this.slideWidth;i+=this.pswp.currIndex;const s=Math.round(t-this.x);(i<0&&s>0||i>=this.pswp.getNumItems()-1&&s<0)&&(t=this.x+.35*s)}this.x=t,this.pswp.container&&r(this.pswp.container,t),this.pswp.dispatch(\"moveMainScroll\",{x:t,dragging:null!=i&&i})}}const D={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},I=(t,i)=>i?t:D[t];class E{constructor(t){this.pswp=t,this.ct=!1,t.on(\"bindEvents\",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this.dt(),t.events.add(document,\"focusin\",this.ut.bind(this))),t.events.add(document,\"keydown\",this.vt.bind(this))}));const i=document.activeElement;t.on(\"destroy\",(()=>{t.options.returnFocus&&i&&this.ct&&i.focus()}))}dt(){!this.ct&&this.pswp.element&&(this.pswp.element.focus(),this.ct=!0)}vt(t){const{pswp:i}=this;if(i.dispatch(\"keydown\",{originalEvent:t}).defaultPrevented)return;if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let s,h,e=!1;const n=\"key\"in t;switch(n?t.key:t.keyCode){case I(\"Escape\",n):i.options.escKey&&(s=\"close\");break;case I(\"z\",n):s=\"toggleZoom\";break;case I(\"ArrowLeft\",n):h=\"x\";break;case I(\"ArrowUp\",n):h=\"y\";break;case I(\"ArrowRight\",n):h=\"x\",e=!0;break;case I(\"ArrowDown\",n):e=!0,h=\"y\";break;case I(\"Tab\",n):this.dt()}if(h){t.preventDefault();const{currSlide:n}=i;i.options.arrowKeys&&\"x\"===h&&i.getNumItems()>1?s=e?\"next\":\"prev\":n&&n.currZoomLevel>n.zoomLevels.fit&&(n.pan[h]+=e?-80:80,n.panTo(n.pan.x,n.pan.y))}s&&(t.preventDefault(),i[s]())}ut(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const L=\"cubic-bezier(.4,0,.22,1)\";class k{constructor(t){var i;this.props=t;const{target:s,onComplete:h,transform:e,onFinish:n=(()=>{}),duration:o=333,easing:r=L}=t;this.onFinish=n;const l=e?\"transform\":\"opacity\",c=null!==(i=t[l])&&void 0!==i?i:\"\";this.ft=s,this.wt=h,this.gt=!1,this.yt=this.yt.bind(this),this._t=setTimeout((()=>{a(s,l,o,r),this._t=setTimeout((()=>{s.addEventListener(\"transitionend\",this.yt,!1),s.addEventListener(\"transitioncancel\",this.yt,!1),this._t=setTimeout((()=>{this.xt()}),o+500),s.style[l]=c}),30)}),0)}yt(t){t.target===this.ft&&this.xt()}xt(){this.gt||(this.gt=!0,this.onFinish(),this.wt&&this.wt())}destroy(){this._t&&clearTimeout(this._t),a(this.ft),this.ft.removeEventListener(\"transitionend\",this.yt,!1),this.ft.removeEventListener(\"transitioncancel\",this.yt,!1),this.gt||this.xt()}}class Z{constructor(t,i,s){this.velocity=1e3*t,this.bt=i||.75,this.St=s||12,this.zt=this.St,this.bt<1&&(this.zt*=Math.sqrt(1-this.bt*this.bt))}easeFrame(t,i){let s,h=0;i/=1e3;const e=Math.E**(-this.bt*this.St*i);if(1===this.bt)s=this.velocity+this.St*t,h=(t+s*i)*e,this.velocity=h*-this.St+s*e;else if(this.bt<1){s=1/this.zt*(this.bt*this.St*t+this.velocity);const n=Math.cos(this.zt*i),o=Math.sin(this.zt*i);h=e*(t*n+s*o),this.velocity=h*-this.St*this.bt+e*(-this.zt*t*o+this.zt*s*n)}return h}}class B{constructor(t){this.props=t,this.Mt=0;const{start:i,end:s,velocity:h,onUpdate:e,onComplete:n,onFinish:o=(()=>{}),dampingRatio:r,naturalFrequency:a}=t;this.onFinish=o;const l=new Z(h,r,a);let c=Date.now(),d=i-s;const u=()=>{this.Mt&&(d=l.easeFrame(d,Date.now()-c),Math.abs(d)<1&&Math.abs(l.velocity)<50?(e(s),n&&n(),this.onFinish()):(c=Date.now(),e(d+s),this.Mt=requestAnimationFrame(u)))};this.Mt=requestAnimationFrame(u)}destroy(){this.Mt>=0&&cancelAnimationFrame(this.Mt),this.Mt=0}}class F{constructor(){this.activeAnimations=[]}startSpring(t){this.Pt(t,!0)}startTransition(t){this.Pt(t)}Pt(t,i){const s=i?new B(t):new k(t);return this.activeAnimations.push(s),s.onFinish=()=>this.stop(s),s}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class O{constructor(t){this.pswp=t,t.events.add(t.element,\"wheel\",this.Ct.bind(this))}Ct(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:s,deltaY:h}=t;if(i&&!this.pswp.dispatch(\"wheel\",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let s=-h;1===t.deltaMode?s*=.05:s*=t.deltaMode?1:.002,s=2**s;const e=i.currZoomLevel*s;i.zoomTo(e,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(s*=18,h*=18),i.panTo(i.pan.x-s,i.pan.y-h))}}class R{constructor(i,s){var h;const e=s.name||s.className;let n=s.html;if(!1===i.options[e])return;\"string\"==typeof i.options[e+\"SVG\"]&&(n=i.options[e+\"SVG\"]),i.dispatch(\"uiElementCreate\",{data:s});let o=\"\";s.isButton?(o+=\"pswp__button \",o+=s.className||`pswp__button--${s.name}`):o+=s.className||`pswp__${s.name}`;let r=s.isButton?s.tagName||\"button\":s.tagName||\"div\";r=r.toLowerCase();const a=t(o,r);if(s.isButton){\"button\"===r&&(a.type=\"button\");let{title:t}=s;const{ariaLabel:h}=s;\"string\"==typeof i.options[e+\"Title\"]&&(t=i.options[e+\"Title\"]),t&&(a.title=t);const n=h||t;n&&a.setAttribute(\"aria-label\",n)}a.innerHTML=function(t){if(\"string\"==typeof t)return t;if(!t||!t.isCustomSVG)return\"\";const i=t;let s='<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';return s=s.split(\"%d\").join(i.size||32),i.outlineID&&(s+='<use class=\"pswp__icn-shadow\" xlink:href=\"#'+i.outlineID+'\"/>'),s+=i.inner,s+=\"</svg>\",s}(n),s.onInit&&s.onInit(a,i),s.onClick&&(a.onclick=t=>{\"string\"==typeof s.onClick?i[s.onClick]():\"function\"==typeof s.onClick&&s.onClick(t,a,i)});const l=s.appendTo||\"bar\";let c=i.element;\"bar\"===l?(i.topBar||(i.topBar=t(\"pswp__top-bar pswp__hide-on-close\",\"div\",i.scrollWrap)),c=i.topBar):(a.classList.add(\"pswp__hide-on-close\"),\"wrapper\"===l&&(c=i.scrollWrap)),null===(h=c)||void 0===h||h.appendChild(i.applyFilters(\"uiElement\",a,s))}}function N(t,i,s){t.classList.add(\"pswp__button--arrow\"),t.setAttribute(\"aria-controls\",\"pswp__items\"),i.on(\"change\",(()=>{i.options.loop||(t.disabled=s?!(i.currIndex<i.getNumItems()-1):!(i.currIndex>0))}))}const U={name:\"arrowPrev\",className:\"pswp__button--arrow--prev\",title:\"Previous\",order:10,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"prev\",onInit:N},V={name:\"arrowNext\",className:\"pswp__button--arrow--next\",title:\"Next\",order:11,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href=\"#pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"next\",onInit:(t,i)=>{N(t,i,!0)}},G={name:\"close\",title:\"Close\",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',outlineID:\"pswp__icn-close\"},onClick:\"close\"},$={name:\"zoom\",title:\"Zoom\",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',outlineID:\"pswp__icn-zoom\"},onClick:\"toggleZoom\"},q={name:\"preloader\",appendTo:\"bar\",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',outlineID:\"pswp__icn-loading\"},onInit:(t,i)=>{let s,h=null;const e=i=>{var h,e;s!==i&&(s=i,h=\"active\",e=i,t.classList.toggle(\"pswp__preloader--\"+h,e))},n=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return e(!1),void(h&&(clearTimeout(h),h=null));h||(h=setTimeout((()=>{var t;e(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),h=null}),i.options.preloaderDelay))};i.on(\"change\",n),i.on(\"loadComplete\",(t=>{i.currSlide===t.slide&&n()})),i.ui&&(i.ui.updatePreloaderVisibility=n)}},H={name:\"counter\",order:5,onInit:(t,i)=>{i.on(\"change\",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function K(t,i){t.classList.toggle(\"pswp--zoomed-in\",i)}class W{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this.Tt=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[G,U,V,$,q,H],t.dispatch(\"uiRegister\"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on(\"change\",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle(\"pswp--one-slide\",1===t.getNumItems())})),t.on(\"zoomPanUpdate\",(()=>this.At()))}registerElement(t){this.isRegistered?this.items.push(new R(this.pswp,t)):this.uiElementsData.push(t)}At(){const{template:t,currSlide:i,options:s}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:h}=i;if(this.pswp.opener.isOpen||(h=i.zoomLevels.initial),h===this.Tt)return;this.Tt=h;const e=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(e)<.01||!i.isZoomable())return K(t,!1),void t.classList.remove(\"pswp--zoom-allowed\");t.classList.add(\"pswp--zoom-allowed\");K(t,(h===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=h),\"zoom\"!==s.imageClickAction&&\"zoom-or-close\"!==s.imageClickAction||t.classList.add(\"pswp--click-to-zoom\")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class X{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,i){this.element&&(\"IMG\"===this.element.tagName?(l(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=o(0,0,t/250)):l(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class Y{constructor(t,i,s){this.instance=i,this.data=t,this.index=s,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=c,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new X(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const h=this.element;this.updateSrcsetSizes(),this.data.srcset&&(h.srcset=this.data.srcset),h.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",h.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=d,h.complete?this.onLoaded():(h.onload=()=>{this.onLoaded()},h.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==p||this.removePlaceholder())}onError(){this.state=p,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===d,this)}isError(){return this.state===p}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:i}).defaultPrevented&&(l(this.element,t,i),this.isImageContent()&&!this.isError()))){const s=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,s?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==p,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===p)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||m())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!m()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==p||this.removePlaceholder()))}}function J(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new x(n,t,-1),o=i.pswp?i.pswp.viewportSize:w(n,i);const r=y(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}class Q{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this.Dt=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch(\"lazyLoad\").defaultPrevented)return;const{preload:s}=i.options,h=void 0===t||t>=0;let e;for(e=0;e<=s[1];e++)this.loadSlideByIndex(i.currIndex+(h?e:-e));for(e=1;e<=s[0];e++)this.loadSlideByIndex(i.currIndex+(h?-e:e))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let s=this.getContentByIndex(i);s||(s=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return J(s,i,t)}(i,this.pswp),s&&this.addToCache(s))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this.Dt.push(t),this.Dt.length>this.limit){const t=this.Dt.findIndex((t=>!t.isAttached&&!t.hasSlide));if(-1!==t){this.Dt.splice(t,1)[0].destroy()}}}removeByIndex(t){const i=this.Dt.findIndex((i=>i.index===t));-1!==i&&this.Dt.splice(i,1)}getContentByIndex(t){return this.Dt.find((i=>i.index===t))}destroy(){this.Dt.forEach((t=>t.destroy())),this.Dt=[]}}const tt=.003;class it{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this.It=void 0,this.Et=!1,this.Lt=!1,this.kt=!1,this.Zt=!1,this.Bt=void 0,this.Ft=void 0,this.Ot=void 0,this.Rt=void 0,this.Nt=void 0,this.Ut=this.Ut.bind(this),t.on(\"firstZoomPan\",this.Ut)}open(){this.Ut(),this.Pt()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this.It=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt(),setTimeout((()=>{this.Pt()}),this.Lt?30:0)}Ut(){if(this.pswp.off(\"firstZoomPan\",this.Ut),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this.It=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt()}}Vt(){const{pswp:t}=this,i=this.pswp.currSlide,{options:s}=t;var h,e;(\"fade\"===s.showHideAnimationType?(s.showHideOpacity=!0,this.Nt=void 0):\"none\"===s.showHideAnimationType?(s.showHideOpacity=!1,this.It=0,this.Nt=void 0):this.isOpening&&t.Gt?this.Nt=t.Gt:this.Nt=this.pswp.getThumbBounds(),this.Bt=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this.Et=Boolean(this.It&&this.It>50),this.$t=Boolean(this.Nt)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this.$t)?this.kt=null!==(h=s.showHideOpacity)&&void 0!==h&&h:(this.kt=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan()));if(this.Zt=!this.kt&&this.pswp.options.bgOpacity>tt,this.Ft=this.kt?t.element:t.bg,!this.Et)return this.It=0,this.$t=!1,this.Zt=!1,this.kt=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)));this.$t&&this.Nt&&this.Nt.innerRect?(this.Lt=!0,this.Ot=this.pswp.container,this.Rt=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.holderElement,t.container&&(t.container.style.overflow=\"hidden\",t.container.style.width=t.viewportSize.x+\"px\")):this.Lt=!1;this.isOpening?(this.kt?(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)):(this.Zt&&t.bg&&(t.bg.style.opacity=String(tt)),t.element&&(t.element.style.opacity=\"1\")),this.$t&&(this.qt(),this.Bt&&(this.Bt.style.willChange=\"transform\",this.Bt.style.opacity=String(tt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display=\"none\"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display=\"none\"),this.Lt&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}Pt(){this.isOpening&&this.Et&&this.Bt&&\"IMG\"===this.Bt.tagName?new Promise((t=>{let i=!1,s=!0;var h;(h=this.Bt,\"decode\"in h?h.decode().catch((()=>{})):h.complete?Promise.resolve(h):new Promise(((t,i)=>{h.onload=()=>t(h),h.onerror=i}))).finally((()=>{i=!0,s||t(!0)})),setTimeout((()=>{s=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this.Ht())):this.Ht()}Ht(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty(\"--pswp-transition-duration\",this.It+\"ms\"),this.pswp.dispatch(this.isOpening?\"openingAnimationStart\":\"closingAnimationStart\"),this.pswp.dispatch(\"initialZoom\"+(this.isOpening?\"In\":\"Out\")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle(\"pswp--ui-visible\",this.isOpening),this.isOpening?(this.Bt&&(this.Bt.style.opacity=\"1\"),this.Kt()):this.isClosing&&this.Wt(),this.Et||this.jt()}jt(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?\"openingAnimationEnd\":\"closingAnimationEnd\"),t.dispatch(\"initialZoom\"+(this.isOpen?\"InEnd\":\"OutEnd\")),this.isClosed)t.destroy();else if(this.isOpen){var i;this.$t&&t.container&&(t.container.style.overflow=\"visible\",t.container.style.width=\"100%\"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}Kt(){const{pswp:t}=this;this.$t&&(this.Lt&&this.Ot&&this.Rt&&(this.Xt(this.Ot,\"transform\",\"translate3d(0,0,0)\"),this.Xt(this.Rt,\"transform\",\"none\")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this.Xt(t.currSlide.container,\"transform\",t.currSlide.getCurrentTransform()))),this.Zt&&t.bg&&this.Xt(t.bg,\"opacity\",String(t.options.bgOpacity)),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"1\")}Wt(){const{pswp:t}=this;this.$t&&this.qt(!0),this.Zt&&t.bgOpacity>.01&&t.bg&&this.Xt(t.bg,\"opacity\",\"0\"),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"0\")}qt(t){if(!this.Nt)return;const{pswp:s}=this,{innerRect:h}=this.Nt,{currSlide:e,viewportSize:n}=s;if(this.Lt&&h&&this.Ot&&this.Rt){const i=-n.x+(this.Nt.x-h.x)+h.w,s=-n.y+(this.Nt.y-h.y)+h.h,e=n.x-h.w,a=n.y-h.h;t?(this.Xt(this.Ot,\"transform\",o(i,s)),this.Xt(this.Rt,\"transform\",o(e,a))):(r(this.Ot,i,s),r(this.Rt,e,a))}e&&(i(e.pan,h||this.Nt),e.currZoomLevel=this.Nt.w/e.width,t?this.Xt(e.container,\"transform\",e.getCurrentTransform()):e.applyCurrentZoomPan())}Xt(t,i,s){if(!this.It)return void(t.style[i]=s);const{animations:h}=this.pswp,e={duration:this.It,easing:this.pswp.options.easing,onComplete:()=>{h.activeAnimations.length||this.jt()},target:t};e[i]=s,h.startTransition(e)}}const st={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:\"zoom-or-close\",bgClickAction:\"close\",tapAction:\"toggle-controls\",doubleTapAction:\"zoom\",indexIndicatorSep:\" / \",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:\"The image cannot be loaded\",preload:[1,2],easing:\"cubic-bezier(.4,0,.22,1)\"};return class extends class extends class{constructor(){this.Yt={},this.Jt={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.Jt[t]||(this.Jt[t]=[]),null===(h=this.Jt[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.Jt[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.Jt[t]&&(this.Jt[t]=this.Jt[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.Jt[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.Yt[t]||(this.Yt[t]=[]),null===(s=this.Yt[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.Yt[t]&&(this.Yt[t]=this.Yt[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new j(t,i);return null===(s=this.Yt[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new Y(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.ti(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}Qt(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?function(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}(this.options.children,this.options.childSelector,t)||[]:[t]}ti(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return J(t,this,i)}}{constructor(t){super(),this.options=this.ii(t||{}),this.offset={x:0,y:0},this.si={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this.hi={},this.Gt=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new f,this.animations=new F,this.mainScroll=new A(this),this.gestures=new T(this),this.opener=new it(this),this.keyboard=new E(this),this.contentLoader=new Q(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch(\"init\"),this.dispatch(\"beforeOpen\"),this.ei();let t=\"pswp--open\";return this.gestures.supportsTouch&&(t+=\" pswp--touch\"),this.options.mainClass&&(t+=\" \"+this.options.mainClass),this.element&&(this.element.className+=\" \"+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch(\"firstUpdate\"),this.scrollWheel=new O(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this.hi=this.getItemData(this.currIndex),this.dispatch(\"gettingData\",{index:this.currIndex,data:this.hi,slide:void 0}),this.Gt=this.getThumbBounds(),this.dispatch(\"initialLayout\"),this.on(\"openingAnimationEnd\",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display=\"block\",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display=\"block\",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,\"resize\",this.ni.bind(this)),this.events.add(window,\"scroll\",this.oi.bind(this)),this.dispatch(\"bindEvents\")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch(\"change\"),this.opener.open(),this.dispatch(\"afterInit\"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),n(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch(\"close\"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType=\"none\",void this.close();this.dispatch(\"destroy\"),this.Yt={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,s)=>{var h,e;let n=(null!==(h=null===(e=this.currSlide)||void 0===e?void 0:e.index)&&void 0!==h?h:0)-1+s;var o;(this.canLoop()&&(n=this.getLoopedIndex(n)),n===t)&&(this.setContent(i,t,!0),1===s&&(this.currSlide=i.slide,null===(o=i.slide)||void 0===o||o.setIsActive(!0)))})),this.dispatch(\"change\")}setContent(t,i,s){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!s)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const h=this.getItemData(i);t.slide=new b(h,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const s=w(this.options,this);!t&&e(s,this.si)||(i(this.si,s),this.dispatch(\"beforeResize\"),i(this.viewportSize,this.si),this.oi(),this.dispatch(\"viewportSize\"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia(\"(any-hover: hover)\").matches&&this.mouseDetected(),this.dispatch(\"resize\"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add(\"pswp--has_mouse\"))}ni(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}oi(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch(\"updateScrollOffset\")}ei(){this.element=t(\"pswp\",\"div\"),this.element.setAttribute(\"tabindex\",\"-1\"),this.element.setAttribute(\"role\",\"dialog\"),this.template=this.element,this.bg=t(\"pswp__bg\",\"div\",this.element),this.scrollWrap=t(\"pswp__scroll-wrap\",\"section\",this.element),this.container=t(\"pswp__container\",\"div\",this.scrollWrap),this.scrollWrap.setAttribute(\"aria-roledescription\",\"carousel\"),this.container.setAttribute(\"aria-live\",\"off\"),this.container.setAttribute(\"id\",\"pswp__items\"),this.mainScroll.appendHolders(),this.ui=new W(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,s){const h=s.dispatch(\"thumbBounds\",{index:t,itemData:i,instance:s});if(h.thumbBounds)return h.thumbBounds;const{element:e}=i;let n,o;if(e&&!1!==s.options.thumbSelector){const t=s.options.thumbSelector||\"img\";o=e.matches(t)?e:e.querySelector(t)}return o=s.applyFilters(\"thumbEl\",o,i,t),o&&(n=i.thumbCropped?function(t,i,s){const h=t.getBoundingClientRect(),e=h.width/i,n=h.height/s,o=e>n?e:n,r=(h.width-i*o)/2,a=(h.height-s*o)/2,l={x:h.left+r,y:h.top+a,w:i*o};return l.innerRect={w:h.width,h:h.height,x:r,y:a},l}(o,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(o)),s.applyFilters(\"thumbBounds\",n,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this.hi,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}ii(t){return window.matchMedia(\"(prefers-reduced-motion), (update: slow)\").matches&&(t.showHideAnimationType=\"none\",t.zoomAnimationDuration=0),{...st,...t}}}}));\n\n/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipeLightbox=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const s=\"idle\",h=\"loading\",e=\"loaded\",n=\"error\";function o(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}function r(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}class l{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class a{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,s){this.element&&(\"IMG\"===this.element.tagName?(i(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=function(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}(0,0,t/250)):i(this.element,t,s))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class d{constructor(t,i,h){this.instance=i,this.data=t,this.index=h,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=s,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new a(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const e=this.element;this.updateSrcsetSizes(),this.data.srcset&&(e.srcset=this.data.srcset),e.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",e.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=h,e.complete?this.onLoaded():(e.onload=()=>{this.onLoaded()},e.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=e,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==e&&this.state!==n||this.removePlaceholder())}onError(){this.state=n,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===h,this)}isError(){return this.state===n}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,s){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,s),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:s}).defaultPrevented&&(i(this.element,t,s),this.isImageContent()&&!this.isError()))){const i=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=s,i?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:s,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==n,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===n)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||r())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!r()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==e&&this.state!==n||this.removePlaceholder()))}}function c(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}class u{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.t(),this.secondary=this.i(),this.max=Math.max(this.initial,this.secondary,this.o()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}l(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}i(){let t=this.l(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}t(){return this.l(\"initial\")||this.fit}o(){return this.l(\"max\")||Math.max(1,4*this.fit)}}function p(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new u(n,t,-1),o=i.pswp?i.pswp.viewportSize:function(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}(n,i);const r=function(t,i,s,h){return{x:i.x-c(\"left\",t,i,s,h)-c(\"right\",t,i,s,h),y:i.y-c(\"top\",t,i,s,h)-c(\"bottom\",t,i,s,h)}}(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}return class extends class extends class{constructor(){this.u={},this.p={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.p[t]||(this.p[t]=[]),null===(h=this.p[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.p[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.p[t]&&(this.p[t]=this.p[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.p[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.u[t]||(this.u[t]=[]),null===(s=this.u[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.u[t]&&(this.u[t]=this.u[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new l(t,i);return null===(s=this.u[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new d(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.m(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}v(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?o(this.options.children,this.options.childSelector,t)||[]:[t]}m(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return p(t,this,i)}}{constructor(t){super(),this.options=t||{},this.g=0,this.shouldOpen=!1,this._=void 0,this.onThumbnailsClick=this.onThumbnailsClick.bind(this)}init(){o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.addEventListener(\"click\",this.onThumbnailsClick,!1)}))}onThumbnailsClick(t){if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t)||window.pswp)return;let i={x:t.clientX,y:t.clientY};i.x||i.y||(i=null);let s=this.getClickedIndex(t);s=this.applyFilters(\"clickedIndex\",s,t,this);const h={gallery:t.currentTarget};s>=0&&(t.preventDefault(),this.loadAndOpen(s,h,i))}getClickedIndex(t){if(this.options.getClickedIndexFn)return this.options.getClickedIndexFn.call(this,t);const i=t.target,s=o(this.options.children,this.options.childSelector,t.currentTarget).findIndex((t=>t===i||t.contains(i)));return-1!==s?s:this.options.children||this.options.childSelector?-1:0}loadAndOpen(t,i,s){if(window.pswp||!this.options)return!1;if(!i&&this.options.gallery&&this.options.children){const t=o(this.options.gallery);t[0]&&(i={gallery:t[0]})}return this.options.index=t,this.options.initialPointerPos=s,this.shouldOpen=!0,this.preload(t,i),!0}preload(t,i){const{options:s}=this;i&&(s.dataSource=i);const h=[],e=typeof s.pswpModule;if(\"function\"==typeof(n=s.pswpModule)&&n.prototype&&n.prototype.goTo)h.push(Promise.resolve(s.pswpModule));else{if(\"string\"===e)throw new Error(\"pswpModule as string is no longer supported\");if(\"function\"!==e)throw new Error(\"pswpModule is not valid\");h.push(s.pswpModule())}var n;\"function\"==typeof s.openPromise&&h.push(s.openPromise()),!1!==s.preloadFirstSlide&&t>=0&&(this._=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return p(s,i,t)}(t,this));const o=++this.g;Promise.all(h).then((t=>{if(this.shouldOpen){const i=t[0];this.I(i,o)}}))}I(t,i){if(i!==this.g&&this.shouldOpen)return;if(this.shouldOpen=!1,window.pswp)return;const s=\"object\"==typeof t?new t.default(this.options):new t(this.options);this.pswp=s,window.pswp=s,Object.keys(this.u).forEach((t=>{var i;null===(i=this.u[t])||void 0===i||i.forEach((i=>{s.on(t,i)}))})),Object.keys(this.p).forEach((t=>{var i;null===(i=this.p[t])||void 0===i||i.forEach((i=>{s.addFilter(t,i.fn,i.priority)}))})),this._&&(s.contentLoader.addToCache(this._),this._=void 0),s.on(\"destroy\",(()=>{this.pswp=void 0,delete window.pswp})),s.init()}destroy(){var t;null===(t=this.pswp)||void 0===t||t.destroy(),this.shouldOpen=!1,this.u={},o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.removeEventListener(\"click\",this.onThumbnailsClick,!1)}))}}}));\n\n\n/*!\n * jQuery UI Widget 1.8.24\n *\n * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Widget\n */\n(function( $, undefined ) {\n\n// jQuery 1.4+\nif ( $.cleanData ) {\n\tvar _cleanData = $.cleanData;\n\t$.cleanData = function( elems ) {\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\ttry {\n\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t} catch( e ) {}\n\t\t}\n\t\t_cleanData( elems );\n\t};\n} else {\n\tvar _remove = $.fn.remove;\n\t$.fn.remove = function( selector, keepData ) {\n\t\treturn this.each(function() {\n\t\t\tif ( !keepData ) {\n\t\t\t\tif ( !selector || $.filter( selector, [ this ] ).length ) {\n\t\t\t\t\t$( \"*\", this ).add( [ this ] ).each(function() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t$( this ).triggerHandler( \"remove\" );\n\t\t\t\t\t\t// http://bugs.jquery.com/ticket/8235\n\t\t\t\t\t\t} catch( e ) {}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _remove.call( $(this), selector, keepData );\n\t\t});\n\t};\n}\n\n$.widget = function( name, base, prototype ) {\n\tvar namespace = name.split( \".\" )[ 0 ],\n\t\tfullName;\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName ] = function( elem ) {\n\t\treturn !!$.data( elem, name );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\t$[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without initializing for simple inheritance\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\tvar basePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n//\t$.each( basePrototype, function( key, val ) {\n//\t\tif ( $.isPlainObject(val) ) {\n//\t\t\tbasePrototype[ key ] = $.extend( {}, val );\n//\t\t}\n//\t});\n\tbasePrototype.options = $.extend( true, {}, basePrototype.options );\n\t$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,\n\t\twidgetBaseClass: fullName\n\t}, prototype );\n\n\t$.widget.bridge( name, $[ namespace ][ name ] );\n};\n\n$.widget.bridge = function( name, object ) {\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = Array.prototype.slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.extend.apply( null, [ true, options ].concat(args) ) :\n\t\t\toptions;\n\n\t\t// prevent calls to internal methods\n\t\tif ( isMethodCall && options.charAt( 0 ) === \"_\" ) {\n\t\t\treturn returnValue;\n\t\t}\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, name ),\n\t\t\t\t\tmethodValue = instance && $.isFunction( instance[options] ) ?\n\t\t\t\t\t\tinstance[ options ].apply( instance, args ) :\n\t\t\t\t\t\tinstance;\n\t\t\t\t// TODO: add this back in 1.9 and use $.error() (see #5972)\n//\t\t\t\tif ( !instance ) {\n//\t\t\t\t\tthrow \"cannot call methods on \" + name + \" prior to initialization; \" +\n//\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\";\n//\t\t\t\t}\n//\t\t\t\tif ( !$.isFunction( instance[options] ) ) {\n//\t\t\t\t\tthrow \"no such method '\" + options + \"' for \" + name + \" widget instance\";\n//\t\t\t\t}\n//\t\t\t\tvar methodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, name );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, name, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( options, element ) {\n\t// allow instantiation without initializing for simple inheritance\n\tif ( arguments.length ) {\n\t\tthis._createWidget( options, element );\n\t}\n};\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\toptions: {\n\t\tdisabled: false\n\t},\n\t_createWidget: function( options, element ) {\n\t\t// $.widget.bridge stores the plugin instance, but we do it anyway\n\t\t// so that it's stored even before the _create function runs\n\t\t$.data( element, this.widgetName, this );\n\t\tthis.element = $( element );\n\t\tthis.options = $.extend( true, {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tvar self = this;\n\t\tthis.element.bind( \"remove.\" + this.widgetName, function() {\n\t\t\tself.destroy();\n\t\t});\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\" );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: function() {\n\t\treturn $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];\n\t},\n\t_create: function() {},\n\t_init: function() {},\n\n\tdestroy: function() {\n\t\tthis.element\n\t\t\t.unbind( \".\" + this.widgetName )\n\t\t\t.removeData( this.widgetName );\n\t\tthis.widget()\n\t\t\t.unbind( \".\" + this.widgetName )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetBaseClass + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\t},\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.extend( {}, this.options );\n\t\t}\n\n\t\tif  (typeof key === \"string\" ) {\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn this.options[ key ];\n\t\t\t}\n\t\t\toptions = {};\n\t\t\toptions[ key ] = value;\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar self = this;\n\t\t$.each( options, function( key, value ) {\n\t\t\tself._setOption( key, value );\n\t\t});\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t[ value ? \"addClass\" : \"removeClass\"](\n\t\t\t\t\tthis.widgetBaseClass + \"-disabled\" + \" \" +\n\t\t\t\t\t\"ui-state-disabled\" )\n\t\t\t\t.attr( \"aria-disabled\", value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOption( \"disabled\", false );\n\t},\n\tdisable: function() {\n\t\treturn this._setOption( \"disabled\", true );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\n\t\treturn !( $.isFunction(callback) &&\n\t\t\tcallback.call( this.element[0], event, data ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n})( jQuery );\n\n\n/**\n * Copyright D3R 2013\n * http://d3r.com\n * dom@d3r.com\n *\n * Dependencies: jQuery, jQuery Widget\n */\n(function($) {\n    var zoom = {\n        enabled: false,\n        options: {\n            image   : 'img',\n            canvas  : false,\n            backdrop: false,\n            trigger : false,\n            debug   : false\n        },\n        _init: function() {\n            this._debug('Zoom :: INIT', this.element.data('fullsize'));\n            if (!this.element.data('fullsize')) return;\n            this.image = this.element.find(this.options.image);\n            if (this.options.canvas) {\n                this._canvas = this._findElement(this.options.canvas);\n            } else {\n                this._canvas = this.element;\n            }\n            if (this.options.backdrop) {\n                this._backdrop = this._findElement(this.options.backdrop);\n                this._backdrop.on('click', $.proxy(this, 'toggle'));\n                this._debug('Zoom :: BACKDROP', 'enabled');\n            }\n            if (this.options.trigger) {\n                this._trigger = this._findElement(this.options.trigger);\n                this._debug('ZOOM :: Trigger', this._trigger);\n                this.element.on('click', $.proxy(this, 'toggle'));\n            } else {\n                this.element.on('mouseenter', $.proxy(this, 'enable'));\n            }\n        },\n        destroy: function() {\n            this._debug('Zoom :: DESTROY');\n            this.element.off('mouseenter', $.proxy(this, 'enable'));\n            this.element.off('mouseleave', $.proxy(this, 'disable'));\n            this.element.off('click', $.proxy(this, 'toggle'));\n        },\n        enable: function(e) {\n            this._debug('Zoom :: ENABLE');\n            this._canvas.css({\n                backgroundImage: `url('${this.element.data('fullsize')}')`,\n                backgroundRepeat: 'no-repeat'\n            });\n            this.element.addClass('zoom--enabled');\n            this._canvas.addClass('zoom__canvas--enabled');\n            this._backdrop.addClass('zoom__backdrop--enabled');\n            this._width = this.element.width();\n            this._height = this.element.height();\n            var offset = this.element.offset();\n            this._left = offset.left;\n            this._top = offset.top;\n            this.element.on('mousemove', $.proxy(this, '_updatePosition'));\n            this.enabled = true;\n            this._updatePositionFromCoords(e.pageX, e.pageY);\n        },\n        disable: function(e) {\n            this._debug('Zoom :: DISABLE');\n            this.element.removeClass('zoom--enabled');\n            this._canvas.removeClass('zoom__canvas--enabled');\n            this._backdrop.removeClass('zoom__backdrop--enabled');\n            this.element.off('mousemove', $.proxy(this, '_updatePosition'));\n            this.enabled = false;\n        },\n        toggle: function(e) {\n            if (e.target.tagName != 'SPAN') {\n                if (this.enabled) {\n                    this.disable(e);\n                } else {\n                    this.enable(e);\n                }\n            }\n        },\n        _findElement: function(selector) {\n            if (selector[0] === '>') {\n                return this.element.find(selector.slice(1));\n            } else {\n                return $(selector);\n            }\n        },\n        _updatePosition: function(e) {\n            this._updatePositionFromCoords(e.pageX, e.pageY);\n        },\n        _updatePositionFromCoords: function(pageX, pageY) {\n            var left = 100 * (pageX - this._left) / this._width,\n                top = 100 * (pageY - this._top) / this._height;\n            this._canvas.css('backgroundPosition', left+\"% \"+top+\"%\");\n        },\n        _debug: function() {\n            if (true === this.options.debug && !!window.console && !!window.console.log){\n                window.console.log.apply(window.console, arguments);\n            }\n        }\n    };\n    $.widget('d3r.zoom', zoom);\n})(jQuery);\n\nvar AMURL = {\n    build: function(parts) {\n        var url = parts.path;\n\n        parts.querystring = parts.querystring.replace('?', '');\n        if (parts.querystring !== '') {\n            url += '?' + parts.querystring;\n        }\n\n        parts.hash = parts.hash.replace('#', '');\n        if (parts.hash !== '') {\n            url += '#' + parts.hash;\n        }\n\n        return url;\n    },\n\n    parts: function(url) {\n        var parts = url.toString().split('#');\n        url = parts[0];\n        var hash = parts.length > 1 ? '#' + parts[1] : '';\n\n        parts = url.split('?');\n        var path = parts[0];\n        var qs   = parts.length > 1 ? parts[1] : '';\n\n        return {'path': path, 'querystring': qs, 'hash': hash};\n    },\n\n    paramsToQueryString: function(params) {\n        var pairs = [];\n        for (var key in params) {\n            var val = params[key];\n\n            if (key != '' && val != null && val != undefined && val != '') {\n                pairs.push(key + '=' + params[key]);\n            }\n        }\n\n        if (pairs.length > 0) {\n            return '?' + pairs.join('&');\n        } else {\n            return '';\n        }\n    },\n\n\n    queryStringToParams: function(queryString) {\n        if (queryString.indexOf('?') > -1) {\n            var queryString = queryString.split('?')[1];\n        }\n\n        var pairs = queryString.split('&');\n\n        params = [];\n        for (var i=0; i<pairs.length; i++) {\n            var pair = pairs[i].split('=');\n            params[pair[0]] = pair[1];\n        }\n\n        return params;\n    },\n\n    setQueryStringParam: function(queryString, key, value) {\n        var params = this.queryStringToParams(queryString);\n        params[key] = value;\n        return this.paramsToQueryString(params);\n    }\n};\n\nvar STATE = {\n    params: null,\n    enabled: true,\n\n    disable: function() {\n        this.enabled = false;\n    },\n\n    enable: function() {\n        this.enabled = true;\n    },\n\n    getParams: function(force) {\n        if (this.params == null || force) {\n            var query = window.location.search.substring(1);\n            this.params = AMURL.queryStringToParams(query);\n        }\n\n        return this.params;\n    },\n\n    getChanged: function() {\n        var oldParams = this.params;\n        this.getParams(true);\n        var changed = [];\n\n        if (oldParams) {\n            for (var key in this.params) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n\n            for (var key in oldParams) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n        } else {\n            changed = this.params;\n        }\n\n        return changed;\n    },\n\n    setParam: function(key, val) {\n        this.getParams();\n\n        if (val == null) {\n            delete this.params[key];\n        } else {\n            this.params[key] = val;\n        }\n\n        return this;\n    },\n\n    setState: function(state) {\n        var pair = state.split('=');\n        var key = pair[0];\n        var val = pair[1];\n\n        this.setParam(key, val);\n\n        return this;\n    },\n\n    setHash: function(hash) {\n        if (hash.indexOf('#') == -1) {\n            hash = '#' + hash;\n        }\n\n        var url = window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search + hash;\n\n        if (window.location != url) {\n            history.pushState({}, null, url);\n        }\n    },\n\n    getUrl: function() {\n        var url = AMURL.parts(window.location);\n        this.getParams();\n        url.querystring = AMURL.paramsToQueryString(this.params);\n\n        return url.path + url.querystring + url.hash;\n    },\n\n    pushUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            if (window.location != url) {\n                history.pushState({}, null, url);\n            }\n        }\n\n        return this;\n    },\n\n    replaceUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            history.replaceState({}, null, url);\n        }\n\n        return this;\n    },\n\n    getStorage: function($option, name) {\n        if ($option.hasClass('js-store_state')) {\n            return localStorage[name];\n        } else {\n            return sessionStorage[name];\n        }\n    },\n\n    save: function($option) {\n        if (!this.enabled) {\n            return;\n        }\n\n        var name  = undefined;\n        var value = undefined;\n\n\n        if ($option.data('state')) {\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n\n            if ($option.hasClass('js-toggle_active')) {\n                var activate_sel = $option.data('activate');\n                var $activate    = activate_sel ? $(activate_sel) : $option;\n\n                if (!$activate.hasClass('js-is_active')) {\n                    value = undefined;\n                }\n            }\n        } else {\n            name  = $option.prop('name');\n            value = $option.val();\n\n            if ($option.prop('tagName') == 'INPUT') {\n                var type  = $option.prop('type');\n\n                if ((type == 'checkbox' || type == 'radio') && $option.not(':checked')) {\n                    value = undefined;\n                }\n            }\n        }\n\n        if ($option.hasClass('js-history_state')) {\n            STATE.setParam(name, value);\n            STATE.pushUrl();\n        }\n\n        if ($option.hasClass('js-store_state')) {\n            localStorage.setItem(name, value);\n        }\n\n        if ($option.hasClass('js-session_state')) {\n            sessionStorage.setItem(name, value);\n        }\n    },\n\n    load: function(scope) {\n        var $scope = $(scope);\n\n        this.disable();\n\n        $scope.find('a.js-store_state, a.js-session_state, button.js-store_state, button.js-session_state').each(function() {\n            var $option = $(this);\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n            var stored  = STATE.getStorage($option, name);\n\n            if (value == stored) {\n                $option.trigger('click');\n            }\n        });\n\n        $scope.find('input.js-store_state, input.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var type    = $option.prop('type');\n            var value   = $option.val();\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                if (type == 'checkbox' || type == 'radio') {\n                    if (value == stored) {\n                        $option.trigger('click');\n                    }\n                } else {\n                    $option.val(stored).trigger('change');\n                }\n            }\n        });\n\n        $scope.find('select.js-store_state, select.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                $option.val(stored).trigger('change');\n            }\n        });\n\n        var changed = this.getChanged();\n\n        for (var key in changed) {\n            var val = changed[key];\n            if (val == null || val == undefined) {\n                val = '';\n            }\n            var kav = key + '=' + val;\n            var triggered = false;\n\n            $scope.find('a.js-history_state[data-state=\"' + kav + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            if (val == '') {\n                // no matches for no value, so maybe it's just the default option like house fabric\n                $scope.find('a.js-history_state[data-state^=\"' + kav + '\"]:first').each(function() {\n                    triggered  = true;\n                    $(this).trigger('click');\n                });\n\n                if (triggered) {\n                    continue;\n                }\n            }\n\n            $scope.find('input.js-history_state[name=\"' + key + '\"][value=\"' + val + '\"]').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            $scope.find('select.js-history_state[name=\"' + key + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).val(val).trigger('change');\n            });\n        }\n\n        this.enable();\n    },\n\n    loadHandlers: function(scope) {\n        var $scope = $(scope);\n\n        $scope.find('.js-history_state, .js-store_state, .js-session_state').each(function() {\n            var option  = this;\n            var $option = $(this);\n\n            if (option.tagName == 'A' || option.tagName == 'BUTTON') {\n                $option.on('click _update', function(e) {\n                    e.preventDefault();\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'INPUT') {\n                $option.on('change _update', function(e) {\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'SELECT') {\n                $option.on('change _update', function(e, initial) {\n                    if (initial) {\n                        // change is called by selectReplace on page load - not a real 'change' so ignore\n                        return;\n                    }\n                    STATE.save($option);\n                });\n            }\n        });\n\n        STATE.load(scope);\n    }\n};\n\n$(function () {\n    // eg $('#simplemodal-container').trigger('_loadHandlers');\n    $(document).on('_loadHandlers', function(e) {\n        STATE.loadHandlers(e.target);\n    });\n\n    STATE.loadHandlers(document);\n});\n\nfunction updateHeaderBasket(price, qty) {\n    $('.header__nav__item--basket, .header__basket').each(function() {\n        $('.tag', $(this)).html(qty);\n        $('.header__basket__price', $(this)).html(price);\n    });\n}\n\nfunction disableCheckoutButton(disable) {\n    $('.basket__checkout a').toggleClass('button--disabled', disable);\n}\n\nfunction checkMaxStock() {\n\n    var disableButton = false;\n\n    $('.basket__qty__input').each(function () {\n        var input = $(this);\n        var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n        if (maximum !== false) {\n            if (parseFloat(input.val()) > maximum) {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").show()\n                disableButton = true;\n            } else {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").hide()\n            }\n        }\n    })\n\n    if (disableButton === true) {\n        disableCheckoutButton(true);\n    } else {\n        disableCheckoutButton(false);\n    }\n}\n\nvar basketChange;\nvar basketChangeTimeout;\nvar updateBufferTime = 2000;\n\n$(document).on('change', '.basket__qty__input', function() {\n    clearTimeout(basketChangeTimeout);\n    basketChangeTimeout = setTimeout(function(){\n        if (basketChange != null) {\n            basketChange.abort();\n        }\n        basketChange = $.ajax('/basket/update', {\n            type: 'POST',\n            data: $('.basket__table input').serialize(),\n            success: function(data) {\n                if (data.result) {\n                    $('.basket__wrapper').html(data.payload.table);\n                }\n                updateHeaderBasket(data.payload.price, data.payload.qty);\n                checkMaxStock();\n            }\n        });\n    }, 1000)\n});\n\ncheckMaxStock();\n\nvar sliders = {};\nvar sliding = false;\nvar filterUrl = null;\n\nfunction updateAjax(url) {\n    $.ajax(url, {\n        success: function(data) {\n            window.history.pushState(null, null, url);\n            filterUrl = url;\n            var grid = $('#products_container');\n            grid.find('.product-listing').addClass('product-listing--to-load');\n\n            setTimeout(function(){\n                grid.replaceWith(data.payload.html);\n                if (typeof AndrewMartin.listingItem == 'undefined') {\n                    AndrewMartin.listingItem = new ListingItem();\n                }\n                AndrewMartin.listingItem.init();\n\n                $('#product_fromitemnum').text(data.payload.fromItemNum);\n                $('#product_toitemnum').text(data.payload.toItemNum);\n                $('.product_count').text(data.payload.productCount);\n                if ($('.filterable').hasClass('filterable--active')) {\n                    $('[hide-from-filters]').addClass('hide-from-filters');\n                }\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n                handlePaintLinks();\n            }, 300);\n        }\n    });\n}\n\nwindow.onpopstate = function(event) {\n    if (filterUrl && filterUrl !== document.location.pathname + document.location.search) {\n        document.location.reload();\n    }\n};\n\ncheckFilterCount();\n\n$(document).on('change', '.filterable :input:not(.filterable--ignore)', function () {\n\n    if (this.getAttribute('data-validation')) {\n        // If value is not a number, set it to the minimum value\n        if (isNaN(parseInt(this.value))) {\n            if (this.hasAttribute('min')) {\n                this.value = this.min;\n            } else {\n                this.value = 0;\n            }\n        }\n\n        // If value is lower than the minimum value, set it to the minimum value\n        if (this.hasAttribute('min')) {\n            if (parseInt(this.value) < parseInt(this.min)) {\n                this.value = this.min;\n            }\n        }\n\n        // If value is higher than the maximum value, set it to the maximum value\n        if (this.hasAttribute('max')) {\n            if (parseInt(this.value) > parseInt(this.max)) {\n                this.value = this.max;\n            }\n        }\n    }\n\n    if ($(this).parents('.js-filter-ranges').length > 0) {\n        new updateFilterRanges($(this).parents('.js-filter-ranges'));\n    }\n\n    var url = '';\n    var form = $('#filters_form');\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore), .filterable .filterable__option :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        var tag = $(this).prop('tagName');\n        var type = $(this).prop('type');\n        var valid = false;\n\n        if (key && value) {\n            if (tag == 'SELECT') {\n                valid = true;\n            } else if (tag == 'INPUT') {\n                if (type == 'radio' || type == 'checkbox') {\n                    if ($(this).is(':checked')) {\n                        valid = true;\n                    }\n                } else {\n                    valid = true;\n                }\n            }\n\n            if (valid) {\n                if (Array.isArray(value)) {\n                    for (var i = 0; i < value.length; i++) {\n                        (function(i) {\n                            if (url == '') {\n                                url += '?';\n                            } else {\n                                url += '&';\n                            }\n                            url += key + '[]=' + encodeURIComponent(value[i]);\n                        })(i);\n                    }\n                } else {\n                    if (rangeIsDefault($(this))) {\n                        return;\n                    }\n                    if (url == '') {\n                        url += '?';\n                    } else {\n                        url += '&';\n                    }\n                    url += key + '=' + encodeURIComponent(value);\n                }\n            }\n        }\n    });\n\n    checkFilterCount();\n\n    url = window.location.pathname + url;\n\n    $('#products_container').addClass('product-listing--loading');\n\n    // If a related slider exists, then update it\n    if (this.getAttribute('data-field')) {\n        var field = this.getAttribute('data-field');//.split('---');\n        var slider = sliders[field];\n\n        if (slider) {\n            if (!sliding) {\n                var values = this.getAttribute('data-value') == 'min' ? [this.value, null] : [null, this.value];\n                slider.noUiSlider.set(values);\n            }\n            sliding = false;\n        }\n    }\n\n    clearTimeout(form.data('timer'));\n    form.data('timer', setTimeout(function() {\n        updateAjax(url);\n    }, 750));\n});\n\n$('.js-filter-ranges').each(function() {\n    new updateFilterRanges($(this));\n});\n\nfunction updateFilterRanges(el) {\n    this.selected = {};\n    this.allRanges = {};\n    this.el = el;\n\n    var self = this;\n\n    this.updateFilterRangesOverview = function() {\n       this.el.find(':input:not(.filterable--ignore)').each(function() {\n            var value = $(this).attr('data-value');\n            var column = $(this).attr('data-column');\n            if (!rangeIsDefault($(this))) {\n                if (!self.selected[column]) {\n                    self.selected[column] = {};\n                }\n                self.selected[column][value] = $(this).val();\n            }\n            if (!self.allRanges[column]) {\n                self.allRanges[column] = {};\n            }\n            self.allRanges[column][value] = $(this).val();\n        });\n\n        if (Object.keys(this.selected).length > 0) {\n            this.el.addClass('filter-ranges--selected');\n        } else {\n            this.el.removeClass('filter-ranges--selected');\n        }\n\n        var label = Object.keys(this.selected).length > 0 ? Object.keys(this.selected).length + ' selected' : 'Select&hellip;';\n\n        this.el.find('.js-filter-ranges__overview').html(label);\n    }\n\n    this.updateFilterRangesSelection = function() {\n        var keys = Object.keys(this.selected);\n        var label = '';\n\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                var values = self.allRanges[keys[i]];\n                label += self.capitalize(keys[i]) + ': ' + values.min + '-' + values.max + 'cm';\n\n                if (i < keys.length - 1) {\n                    label += ', ';\n                }\n            })(i);\n        }\n\n        this.el.find('.js-filter-ranges__selection').html(label);\n        this.el.find('.js-filter-ranges__selection-mobile').html(keys.length);\n        this.el.find('.js-filterable__count').html(keys.length ? '(' + keys.length + ')' : '');\n\n        if (keys.length) {\n            this.el.parents('.filterable__dimension').addClass('filterable__dimension--has-selection');\n        } else {\n            this.el.parents('.filterable__dimension').removeClass('filterable__dimension--has-selection');\n        }\n    }\n\n    this.capitalize = function(string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n\n    this.updateFilterRangesOverview();\n    this.updateFilterRangesSelection();\n\n    $(document).on('click', '.js-filter-ranges__clear', function(e) {\n        sliding = true;\n\n        self.el.find('.js-filter-range__slider').each(function() {\n            var range = this.noUiSlider.options.range;\n            this.noUiSlider.set([range.min, range.max]);\n        });\n    });\n}\n\n// Toggle visibility of the clicked filter range\n$(document).on('click', '.js-filter-ranges__top', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    if (el.hasClass('filter-ranges--active')) {\n        deactivateFilterRanges(el);\n    } else {\n        activateFilterRanges(el);\n    }\n});\n\n$(document).on('click', '.js-filter-ranges__back', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    deactivateFilterRanges(el);\n});\n\n$(document).on('click', '.js-filter-ranges label', function(e) {\n    var el = $(this).closest('.js-filter-ranges').find('.js-filter-ranges__top');\n    el.trigger('click');\n});\n\n// Deactivate any active filter ranges when document is clicked\n$(document).on('click', function(e) {\n    var el = e.target.closest('.js-filter-ranges');\n\n    if (!el && $('.filter-ranges--active').length) {\n        $('.js-filter-ranges').removeClass('filter-ranges--active');\n    }\n});\n\nfunction rangeIsDefault(el) {\n    return (el.attr('data-value') == 'min' && el.val() == el.attr('min')) || (el.attr('data-value') == 'max' && el.val() == el.attr('max'))\n}\n\n$(document).on('click', '.js-filterable-toggle', function(e) {\n    e.preventDefault();\n    $('.filterable').toggleClass('filterable--active');\n    $('#filters_form').toggleClass('filterable--absolute');\n    $('.footer').toggleClass('hide-from-filters');\n    if ($('.filterable').hasClass('filterable--active')) {\n        $('[hide-from-filters]').addClass('hide-from-filters');\n    } else {\n        $('[hide-from-filters]').removeClass('hide-from-filters');\n        deactivateFilterRanges($('.js-filter-ranges'));\n    }\n});\n\n$(document).on('click', function(e) {\n\n    if (!(e.target.closest('.js-filter-ranges'))) {\n        deactivateFilterRanges($('.js-filter-ranges'))\n    }\n})\n\nfunction activateFilterRanges(el) {\n    el.addClass('filter-ranges--active');\n    el.parents('.filterable__dimension').addClass('filterable__dimension--active');\n    el.parents('.filterable__content').addClass('filterable__content--active');\n}\n\nfunction deactivateFilterRanges(el) {\n    el.removeClass('filter-ranges--active');\n    el.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n    el.parents('.filterable__content').removeClass('filterable__content--active');\n}\n\n// Check the number of filters that have been set\nfunction checkFilterCount() {\n    var filterCount = [];\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        if (key && value) {\n            if (Array.isArray(value)) {\n                for (var i = 0; i < value.length; i++) {\n                    (function(i) {\n                        var filterType = key;\n\n                        if (filterCount.indexOf(filterType) == -1) {\n                            filterCount.push(filterType);\n                        }\n                    })(i);\n                }\n            } else {\n                if (rangeIsDefault($(this))) {\n                    return;\n                }\n\n                var filterType = $(this).attr('data-dimension');\n\n                if (filterCount.indexOf(filterType) == -1) {\n                    filterCount.push(filterType);\n                }\n            }\n        }\n    });\n\n    if (filterCount.length > 0) {\n        $('.filterable').addClass('filterable--has-filter-selected');\n    } else {\n        $('.filterable').removeClass('filterable--has-filter-selected');\n    }\n\n    $('.js-filterable__total-count').html(filterCount.length);\n}\n\n$(function() {\n    var windowResizing;\n    var mode;\n    var oldMode;\n\n    function moveElement() {\n        mode = window.matchMedia('(max-width: 580px)').matches ? 'mobile' : 'desktop';\n\n        if (mode != oldMode) {\n            var from = 'desktop';\n            var to = 'mobile';\n\n            if (mode == 'desktop') {\n                from = 'mobile';\n                to = 'desktop';\n            }\n\n            $('.js-moveable-content[data-visible=\"' + from + '\"]').children().eq(0).appendTo($('.js-moveable-content[data-visible=\"' + to + '\"]'));\n        }\n\n        oldMode = mode;\n    }\n\n    moveElement();\n\n    $(window).on('resize', function() {\n        clearTimeout(windowResizing);\n        windowResizing = setTimeout(function() {\n            moveElement();\n        }, 100);\n    });\n});\n\n$(function() {\n    var slider = document.querySelectorAll('.js-filter-range__slider');\n    var setBoth = document.querySelectorAll('.js-filter-range__set-both');\n    var input = document.querySelectorAll('.js-filter-range__input');\n    var allowed = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // 0-9\n    var range = {};\n\n    for (var i = 0; i < input.length; i++) {\n        (function(i) {\n            input[i].setAttribute('data-validation', 'number');\n            input[i].type = 'text';\n\n            input[i].onfocus = function() {\n                this.onkeypress = function(e) {\n                    // If the key is not in the array of allowed keys, then prevent it\n                    if (allowed.indexOf(e.charCode) == -1) {\n                        e.preventDefault();\n                    }\n                }\n            }\n\n            var dimension = input[i].getAttribute('data-dimension');\n            var column = input[i].getAttribute('data-column');\n            var min = input[i].getAttribute('min');\n            var max = input[i].getAttribute('max');\n\n            range[dimension + '-' + column] = {\n                'min': parseInt(min),\n                'max': parseInt(max)\n            };\n        })(i);\n    }\n\n    for (var i = 0; i < setBoth.length; i++) {\n        (function(i) {\n            var field = setBoth[i].getAttribute('data-field');\n            var minInput = document.querySelector('.js-filter-range__input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('.js-filter-range__input[data-value=\"max\"][data-field=\"' + field + '\"]');\n\n            setBoth[i].onchange = function() {\n                var range = this.value.split('-');\n                minInput.value = range[0];\n                maxInput.value = range[1];\n\n                $(minInput).change();\n                $(maxInput).change();\n            }\n        })(i);\n    }\n\n    for (var i = 0; i < slider.length; i++) {\n        (function(i) {\n            var field = slider[i].getAttribute('data-field');\n            var minInput = document.querySelector('input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('input[data-value=\"max\"][data-field=\"' + field + '\"]');\n            var params = {\n                start: [\n                    minInput.value,\n                    maxInput.value\n                ],\n                range: range[field],\n                format: wNumb({\n                    decimals: 0\n                }),\n                step: 1,\n                connect: true\n            }\n\n            noUiSlider.create(slider[i], params);\n\n            slider[i].noUiSlider.on('update', function(values, handle) {\n                var value = handle == 1 ? 'max' : 'min';\n                var input = document.querySelector('input[data-value=\"' + value + '\"][data-field=\"' + field + '\"]');\n\n                input.value = values[handle];\n\n                if (sliding) {\n                    $(input).change();\n                }\n            });\n\n            slider[i].noUiSlider.on('slide', function(values, handle) {\n                sliding = true;\n            });\n\n            sliders[slider[i].getAttribute('data-field')] = slider[i];\n        })(i);\n    }\n})\n\n$('.js-grid-load-more').click(function(e) {\n    e.preventDefault();\n\n    var grid = $(this).siblings('.wrap').find('.grid');\n    var current = $(this).addClass('load-more--loading');\n\n    $.ajax($(this).attr('href'), {\n        success: function(data) {\n            grid.children(':hidden').children('.product-listing').addClass('product-listing--to-load');\n\n            grid.children().removeClass('s-hidden-true m-hidden-true ph-hidden-true ml-hidden-true l-hidden-true');\n            grid.append(data.payload.html);\n\n            url = new URL(window.location.href);\n\n            load_more = url.searchParams.get('load_more');\n            if (!load_more) {\n                load_more = 1;\n            }\n            load_more++;\n            url.searchParams.set('load_more', load_more);\n\n            window.history.pushState({load_more: load_more}, document.title, url.toString());\n\n            if (data.payload.page && data.payload.more) {\n                current.attr('href', data.payload.more).removeClass('load-more--loading');\n            } else {\n                current.remove();\n            }\n            setTimeout(function(){\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n            }, 100);\n        }\n    });\n});\n\nvar initProductGallery = function() {\n    var gallery = $('.product__gallery .product__photo');\n    var videoContainer = $('.product__gallery .product__video');\n    var video = $('.product__gallery .product__video video');\n    var thumbnail = $('.product__thumbnail');\n    var className = 'product__thumbnail--active';\n\n    if (!gallery.length) {\n        return;\n    }\n\n    if (video.length > 0) {\n        var player = videojs(video[0].id);\n    }\n\n    function update(i) {\n        thumbnail.eq(i).addClass(className);\n    }\n\n    function watchVideo() {\n        if (video.length > 0) {\n            player.aspectRatio('1:1');\n            // Not using the `video` variable as slick removes the DocElement and re-adds so breaks this listener\n            gallery.on('touchend click', '.product__video video', function(e) {\n                if (player.paused()) {\n                    playVideo();\n                } else {\n                    pauseVideo()\n                }\n            });\n        }\n    }\n\n    function playVideo() {\n        player.play();\n        videoContainer.addClass('product__video--playing');\n    }\n\n    function pauseVideo() {\n        player.pause();\n        videoContainer.removeClass('product__video--playing');\n    }\n\n    gallery.on('init', function() {\n        update(0);\n        watchVideo();\n\n        if (window.matchMedia('(min-width: 999px)').matches) {\n            $('.zoom--pdp').zoom({\n                canvas: '.zoom__canvas--pdp',\n                trigger: '.zoom__trigger--pdp',\n                backdrop: '.zoom__backdrop--pdp',\n            });\n        }\n    });\n    gallery.on('afterChange', function() {\n        $('.' + className).removeClass(className);\n        update($(this).slick('slickCurrentSlide'));\n        if (player) {\n            if (!player.paused()) {\n                pauseVideo();\n            }\n        }\n    });\n    thumbnail.on('click', function() {\n        gallery.slick('slickGoTo', $(this).index());\n    });\n\n    gallery.slick({\n        nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n        prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n        dots: true\n    });\n\n    $('button', gallery).click(function(e) {\n        e.preventDefault();\n    });\n};\n\ninitProductGallery();\n\nvar initGalery = function() {\n    var gallery = $('.carousel');\n    gallery.each(function() {\n        var el = $(this);\n        var infinite = el.data('noloop') == undefined;\n        var img = $('.carousel__item', el);\n\n        el.on('init', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.on('afterChange', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.slick({\n            nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n            prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n            dots: true,\n            infinite: infinite\n        });\n\n        function updateArrows(current, total) {\n            if (current == 1) {\n                el.addClass('carousel--at-start');\n            } else {\n                el.removeClass('carousel--at-start');\n            }\n\n            if (current == total) {\n                el.addClass('carousel--at-end');\n            } else {\n                el.removeClass('carousel--at-end');\n            }\n        }\n    });\n};\n\ninitGalery();\n\n$(function () {\n    if (document.getElementById('js-haze_viewer') !== null) {\n        if (window.HAZE !== undefined) {\n            HAZE.instantiate('js-haze_viewer', 'gallery', window.hazeGallery);\n            console.log('HAZE', 'Haze gallery will initialize on page load');\n            return;\n        } else {\n            console.error('HAZE is not defined (gallery.js)');\n        }\n    } else if (window.matchMedia('(max-width: 999px)').matches) {\n        const popupScroll = document.querySelector('.js-haze-popup');\n        $(document).on('click', '.js-haze-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $($button.data('popup'));\n\n            /** Apparently the viewer is binned off from the DOM by slick :D */\n            // var $hazeLocation = document.getElementById('js-haze_viewer_location');\n            // var $haze = document.getElementById($button.data('haze'));\n            // $haze.appendTo($hazeLocation);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (document.getElementById('js-haze_mobile') !== null) {\n                if (window.HAZE !== undefined) {\n                    HAZE.instantiate('js-haze_mobile', 'gallery', window.hazeGallery);\n                }\n\n                if (window.matchMedia('(max-width: 999px)').matches) {\n                    scrollLock.disablePageScroll(popupScroll);\n                }\n            }\n        });\n\n        $(document).on('click', '.js-haze-close', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $button.closest('.js-haze-popup');\n            $popup.fadeOut('fast');\n\n            scrollLock.enablePageScroll(popupScroll);\n        });\n    }\n\n    if (window.CYLINDO !== undefined) {\n        const popupScroll = document.querySelector('.js-cylindo-popup');\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            CYLINDO.instantiate('js-cylindo_mobile', 'mobile-popup', window.cylindoGallery);\n        } else {\n            CYLINDO.instantiate('js-cylindo_viewer', 'gallery', window.cylindoGallery);\n        }\n\n        $(document).on('click', '.js-cylindo-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup   = $($button.data('popup'));\n            var $cylindo = $($button.data('cylindo'));\n\n            $cylindo.appendTo($popup);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                scrollLock.disablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-close', function(e) {\n            e.preventDefault();\n\n            // Add unzoom functionality to the back button for mobile\n\n            if (document.querySelector('html').classList.contains('cylindo-zoom')) {\n                var cylindo = $(this).data('cylindo-mobile');\n\n                CYLINDO.zoom(cylindo, false);\n            } else {\n                var $button = $(this);\n                var $popup = $button.closest('.js-cylindo-popup');\n                $popup.fadeOut('fast');\n\n                scrollLock.enablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-zoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, true);\n        });\n\n        $(document).on('click', '.js-cylindo-unzoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, false);\n        });\n    }\n});\n\n//=require magnific-popup/dist/jquery.magnific-popup.min.js\n\nvar className = 'sizing-calculator';\nfunction initPopups() {\n    // Control each popup\n    $.each($('.js-open-popup'), function() {\n        // Determine the link and the target\n        var link = $(this);\n        var target = $(link.data('mfp-src'));\n\n        // Hide the popup content\n        target.addClass('mfp-hide');\n\n        // Enable the popup\n        link.magnificPopup({\n            type :'inline',\n            showCloseBtn : false,\n            callbacks: {\n                close: function () {\n                    $('.' + className).removeClass(className + '--has-results');\n\n                    $('p.error', '#product-sizing-calculate').remove();\n                    $('.field', '#product-sizing-calculate').removeClass('field--error');\n                }\n            }\n        });\n    });\n\n    // Close a popup\n    $('.js-close-popup').click(function() {\n        $.magnificPopup.close();\n    });\n}\n\n$(document).ready(function() {\n    initPopups();\n\n    $(document).on('submit', '#product-sizing-calculate', function(e) {\n        e.preventDefault();\n        var par = $(this).parents('.sizing-calculator');\n        var width = $('input[name=width]', $(this));\n        var height = $('input[name=height]', $(this));\n\n        $('p.error', $(this)).remove();\n        $('.field', $(this)).removeClass('field--error');\n\n        var error = false;\n\n        if (width.val() == '' || !width.val().match(/^\\d*\\.?\\d+/)) {\n            width.parent().addClass('field--error');\n            width.parent().append('<p class=\"error\">Please enter a width</p>')\n            error = true;\n        }\n\n        if (height.val() == '' || !height.val().match(/^\\d*\\.?\\d+/)) {\n            height.parent().addClass('field--error');\n            height.parent().append('<p class=\"error\">Please enter a height</p>')\n            error = true;\n        }\n\n        if (error) {\n            return false;\n        }\n\n        $.ajax('/products/wallpaper-price', {\n            type: 'post',\n            data: $(this).serialize(),\n            success: function(data) {\n                $('.sizing-calculator__height').html(data.payload.height + 'm');\n                $('.sizing-calculator__width').html(data.payload.width + 'm');\n                $('.sizing-calculator__price').html(data.payload.price_str);\n                $('.sizing-calculator__qty').val(data.payload.qty);\n\n                var rollsTxt = data.payload.rolls + ' roll' + ((data.payload.rolls > 1) ? 's' : '');\n\n                if (data.payload.rolls != data.payload.qty) {\n                    rollsTxt += ' (' + data.payload.qty +  ' packs)';\n                }\n\n                $('.sizing-calculator__rolls').html(rollsTxt);\n\n                $('.' + className).addClass(className + '--has-results');\n            }\n        });\n    });\n});\n\nvar newsletter;\n$(document).on('submit', '.signup-form', function(e) {\n    e.preventDefault();\n\n    var form = this;\n\n    if (newsletter != null) {\n        newsletter.abort();\n    }\n    newsletter = $.ajax($(this).attr('action'), {\n        type: $(this).attr('method'),\n        data: $(this).serialize(),\n        success: function(data) {\n            if (data.result) {\n                $(form).fadeTo(400, 0, function() {\n                    $(form).parent().append('<label class=\"signup-form__thanks\">Thank you</label>');\n                });\n            }\n        }\n    });\n});\n\n// $('.js-kit-price input').on('change', function() {\n//     var input = $(this);\n//     var sku = input.data('frame-sku');\n\n//     var form = $('#basket-add');\n//     form.find('button.product__button').prop('disabled', 'disabled');\n\n//     $.ajax('/products/kit-price', {\n//         type: 'post',\n//         data: $('.product-piece input').serialize(),\n//         success: function(data) {\n//             form.find(\"input.\" + sku).val(input.val());\n\n//             if (typeof(fdPrice) != 'undefined') {\n//                 fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n//                 updateFinancing();\n//                 initPopups();\n//             }\n\n//             $('.product__total-price span.value').html(data.payload.price);\n\n//             if (data.payload.price_raw > 0) {\n//                 form.find('button.product__button').prop('disabled', false).removeClass('button--disabled');\n//                 $('.product__total-price').show();\n//                 $('.product__finance-option').show();\n//             } else {\n//                 $('.product__total-price').hide();\n//                 $('.product__finance-option').hide();\n//             }\n//         }\n//     });\n// });\n\n\n$(function() {\n    $('.design-directory__filters').find('input, select').on('change', function() {\n        $(this).parents('form').submit();\n    });\n\n    $(document).on('click', '.js-design-directory-load-more', function(event) {\n        event.preventDefault();\n        $('.load-more').addClass('load-more--loading');\n        $.ajax(\n            $(this).attr('href')\n        ).done(function(payload) {\n            newItems = $(payload).find('.design-directory__list .grid > *').css('display', 'none').addClass('js-should-fade-in');\n            loadMore = $(payload).find('.design-directory__load-more');\n            $('.design-directory__list .grid').append(newItems);\n            $('.js-should-fade-in').fadeIn().removeClass('js-should-fade-in');\n            $('.design-directory__load-more').replaceWith(loadMore);\n        });\n    });\n\n});\n\n$(document).on('click', '.product__qty a, .product-piece__qty a, .product-piece__qty button', function(e){\n    e.preventDefault();\n    var input = $(this).siblings('.input');\n    var step = typeof input.data('step') !== 'undefined' ? input.data('step') : 1;\n    var decimal_places = typeof input.data('places') !== 'undefined' ? input.data('places') : 0;\n    var minimum = typeof input.data('min') !== 'undefined' ? input.data('min') : 1;\n    var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n    if ($('svg', $(this)).hasClass('icon-plus')) {\n        input.val((parseFloat(input.val()) + step).toFixed(decimal_places));\n    } else if (parseInt(input.val()) >= 0) {\n        input.val((parseFloat(input.val()) - step).toFixed(decimal_places));\n    }\n\n    if (maximum !== false && parseFloat(input.val()) > maximum) {\n        input.val(maximum);\n    }\n    if (minimum !== false && parseFloat(input.val()) < minimum) {\n        input.val(minimum);\n    }\n\n    input.trigger('change');\n});\n\n$(document).on('input change', '.product__qty input, .product-piece__qty input', function(e) {\n    if ($('.product__custom-qty').length > 0) {\n        const target = $('.js-customise-price-target');\n\n        var price = 0.00;\n        var qty = $(this).val();\n\n        price = target.data('price') * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        target.find('.value').html(target.data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    if ($('.product__multi__size__qty').length > 0) {\n        var price = 0.00;\n        var total_qty = 0;\n        const quantities = $('.product__multi__size__qty:visible');\n        let products = {};\n\n        quantities.each(function (index, element) {\n            let sku = $(element).data('sku');\n            const qty = parseInt($(element).find('input[name=qty]').val());\n            const product_price = parseFloat(parseFloat($(this).data('price')).toFixed(2));\n\n            if (qty > 0) {\n                price += (product_price * qty);\n                total_qty += qty;\n                products[sku] = qty;\n            }\n        });\n\n        const keys = Object.keys(products);\n        if (keys.length > 0) {\n            $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n            $('.js-wishlist-action').attr('data-sku', keys.join(','));\n        } else {\n            $('.js-wishlist-action').addClass('product__wishlist--disabled');\n        }\n\n        if (price === 0) {\n            var fromPrice = null;\n\n            $('.product__multi__size').each(function() {\n                var sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                if (sizePrice < fromPrice || fromPrice === null) {\n                    fromPrice = sizePrice;\n                }\n            })\n\n            price = fromPrice;\n\n            $('.product__multi__total_label').html('From:');\n        } else {\n            $('.product__multi__total_label').html('Total Price:');\n        }\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n\n        var disable = total_qty <= 0;\n        $('.product__button').toggleClass('button--disabled', disable);\n    }\n\n    if ($('.product__price__total_value').length > 0) {\n        var product_price = parseFloat($('.product__qty').data('price'));\n        var qty = parseFloat($(this).val());\n\n        var price = product_price * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__price__total_value').html($('.product__price__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    var maximum = typeof $(this).data('max') !== 'undefined' ? $(this).data('max') : false;\n    var minimum = typeof $(this).data('min') !== 'undefined' ? $(this).data('min') : 1;\n    if (maximum !== false && parseFloat($(this).val()) > maximum) {\n        $(this).val(maximum);\n    }\n    if (minimum !== false && parseFloat($(this).val()) < minimum && parseFloat($(this).val()) >= 0) {\n        $(this).val(minimum);\n    }\n    if ($('.batches__totals').length > 0) {\n        updateBatchPrices();\n    }\n})\n\nvar updateBatchPrices = function() {\n    var price = 0.00;\n    var total_qty = 0;\n    var quantities = $('.batches__piece-qty:visible');\n    var product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n    quantities.each(function(){\n        var qty = parseFloat($(this).find('input[name=qty]').val());\n\n        if (qty > 0) {\n            price += product_price * qty;\n            total_qty += qty;\n        }\n    });\n\n    $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n    $('.batches__totals-info span').html(total_qty.toFixed(1));\n    $('.js-material-length').html(total_qty.toFixed(1));\n\n    if (total_qty > 0) {\n        $('.product__button').toggleClass('button--disabled', false);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', false);\n    } else {\n        $('.product__button').toggleClass('button--disabled', true);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', true);\n    }\n}\n\n;(function (app) {\n    app.plugins = app.plugins || {};\n\n    app.plugins.delegate = function delegate(\n        element,\n        eventType,\n        selector,\n        listener,\n        options\n    ) {\n        element.addEventListener(\n            eventType,\n            /**\n             * @param {Event} event\n             */\n            function callback(event) {\n                if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                    var closest = event.target.closest(selector);\n                    if (closest) {\n                        listener(event);\n                    }\n                }\n            },\n            options || null\n        );\n    };\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n;(function (app) {\n    /**\n     * GTM datalayer functionality\n     */\n    class GTM {\n        /**\n         * Clear ecom data to prevent double events\n         *\n         * @param dataLayerName\n         */\n        clearEcommerce(dataLayerName) {\n            this.addData([{ecommerce: null}], dataLayerName);\n        }\n\n        /**\n         * Add some data to the data layer\n         *\n         * @param dataLayer An array of datalayer events to push in\n         * @param dataLayerName The name of the datalayer\n         */\n        addData(dataLayer, dataLayerName) {\n            if (!dataLayer || !dataLayerName) {\n                return;\n            }\n\n            if (typeof window[dataLayerName] === \"undefined\") {\n                window[dataLayerName] = [];\n            }\n\n            for (let i = 0; i < dataLayer.length; i++) {\n                window[dataLayerName].push(dataLayer[i]);\n            }\n        }\n    }\n\n    app.GTM = new GTM();\n\n    $(function () {\n        if (window.dataLayer) {\n            $(document).on('click', '.js-ee', function (e) {\n                const productData = JSON.parse(this.dataset.tracking);\n                const link = this.href;\n\n                let callback = function () {},\n                    hasRedirected = false;\n                let timeoutId;\n\n                if (window.google_tag_manager) {\n                    e.preventDefault();\n                    callback = function () {\n                        clearTimeout(timeoutId);\n                        if (!hasRedirected) {\n                            hasRedirected = true;\n                            setTimeout(function() {\n                                window.location.assign(link);\n                            }, 10)\n                        }\n                    };\n                    // If GTM gets in a real mess, step in.\n                    timeoutId = setTimeout(callback, 2500);\n                }\n\n                // Let GTM handle the redirect once it's done its thing.\n                window.dataLayer.push({\n                    'event': 'productClick',\n                    'ecommerce': {\n                        'currencyCode': 'GBP',\n                        'click': {\n                            'actionField': {\n                                'list': productData.list\n                            },\n                            'products': [productData]\n                        }\n                    },\n                    'eventCallback': callback,\n                    'eventTimeout': 2000\n                });\n            });\n        }\n\n        $(document).on('click', '.product-listing, .colourways__item a', function (e) {\n            Cookies.set('ANDREWMARTIN_TRACKING', $(this).data('tracking'));\n        });\n\n        // Legacy tracking of AJAX calls\n        $(document).ajaxSuccess(function (event, request, settings, data) {\n            const payload = data.payload;\n            if (payload !== undefined\n                && payload.dataLayer !== undefined\n                && payload.dataLayerName !== undefined\n            ) {\n                const dataLayerName = payload.dataLayerName;\n\n                app.GTM.clearEcommerce(dataLayerName);\n                app.GTM.addData(payload.dataLayer, dataLayerName);\n            }\n        });\n    });\n})(window.AndrewMartin = window.AndrewMartin || {});\n\nfunction getQueryParameters() {\n    var queryString = location.search.slice(1),\n        params = {};\n\n    queryString.replace(/([^=]*)=([^&]*)&*/g, function (_, key, value) {\n        params[key] = value;\n    });\n\n    return params;\n}\n\n\nfunction setQueryParameters(params) {\n    var query = [],\n        key, value;\n\n    for (key in params) {\n        if (!params.hasOwnProperty(key)) continue;\n        value = params[key];\n        query.push(key + \"=\" + value);\n    }\n\n    location.search = query.join(\"&\");\n}\n\nfunction showAllColours(e) {\n    e.preventDefault()\n    let active = 'filterable__unslick--active'\n\n    if (this.classList.contains(active)) {\n        this.classList.remove(active);\n        this.firstElementChild.textContent = 'show more colours'\n    } else {\n        this.classList.add(active)\n        this.firstElementChild.textContent = 'show fewer colours'\n    }\n}\n\nvar showMoreButton = document.querySelector('.js-unslick');\n\nif (showMoreButton) {\n    showMoreButton.addEventListener('click', showAllColours)\n}\n\n;(function (app) {\n    app.plugins = app.plugins || {};\n\n    app.plugins.delegate = function delegate(\n        element,\n        eventType,\n        selector,\n        listener,\n        options\n    ) {\n        element.addEventListener(\n            eventType,\n            /**\n             * @param {Event} event\n             */\n            function callback(event) {\n                if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                    var closest = event.target.closest(selector);\n                    if (closest) {\n                        listener(event);\n                    }\n                }\n            },\n            options || null\n        );\n    };\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n;(app => {\n    /**\n     * Base class for jQuery plugins that handle adding products to the\n     * basket from the PDP\n     *\n     * Encapsulates a bit of the logic for sending the data to the basket\n     * and any common actions afterwards\n     */\n    class AddToBasketPlugin {\n        /**\n         * @param {jQuery} $element The product container\n         * @param {{}} options. Not used\n         */\n        constructor($element, options) {\n            this.bind();\n            /**\n             * @type {HTMLElement}\n             */\n            this.element = $element.get(0);\n        }\n\n        /**\n         * Update any global elements with the basket data\n         *\n         * @param {{}} data Returned from basket request\n         * @param {number} quantity The quantity added to the basket\n         */\n        refreshAfterAjax(data, quantity) {\n            if (data.hasOwnProperty('payload')) {\n                if (data.payload.hasOwnProperty('totalPrice')) {\n                    $('.js-total-price-insert').html(data.payload.totalPrice);\n                }\n                if (data.payload.hasOwnProperty('qty')) {\n                    $('.quick-links__notification__value').html(data.payload.qty)\n                }\n            }\n        }\n\n        /**\n         * Trigger the add to basket event, causing the flyout to open\n         *\n         * @param {{}} payload Payload from the basket request\n         */\n        openBasket(payload) {\n            app.flyout.load('/basket', {}, true);\n        }\n\n        openUpsellBasket(payload) {\n            window.Overlay.load('/basket/upsell', {\n                wait_for_scripts: true,\n                modifiers: ['sidebar', 'flyout'],\n                callback: () => {\n                    $('.basket').flyoutupsell();\n\n                    const upsellContainer = document.querySelector('[data-upsell-container]');\n                    const upsellContinueForm = document.querySelector('[data-upsell-continue]');\n                    const upsellsArray = Object.values(payload.upsells);\n                    const layoutClass = upsellsArray.length < 4 ? 'stacked' : 'compact';\n\n                    upsellContainer.setAttribute('data-layout', layoutClass);\n\n                    upsellsArray.forEach(upsell => {\n                        upsellContainer.innerHTML += this.returnUpsellElement(upsell, upsellsArray.length);\n                        upsellContinueForm.insertAdjacentHTML('beforeend', this.returnHiddenInput(upsell));\n                    })\n\n                    if (payload.hasOwnProperty('count')) {\n                        $('.js-basket-count').html(payload.count);\n                    }\n\n                    document.querySelectorAll('.basket-upsell__qty').forEach((qtyField, i) => {\n                        var quantityControl = new app.plugins.QuantityControl({\n                            el: qtyField,\n                            mode: qtyField.getAttribute('quantity-control'),\n                            id: 'quantity-control-' + i\n                        });\n                        quantityControl.init();\n                    });\n\n                    const upsellAddButtons = document.querySelectorAll('[data-upsell-add]');\n\n                    upsellAddButtons.forEach(upsellAddButton => {\n                        upsellAddButton.addEventListener('click', () => {\n                            const qtyContainer = upsellAddButton.previousElementSibling;\n                            let getCount = parseInt($('.js-basket-count').html());\n\n                            getCount += 1;\n                            $('.js-basket-count').html(getCount);\n\n                            qtyContainer.classList.add('basket-upsell__qty--active');\n                            qtyContainer.insertAdjacentHTML('beforeend', '<p data-basket-qty>1 in basket</p>');\n                            upsellAddButton.classList.add('button--hide');\n                            qtyContainer.querySelector('input').value = 1;\n                        })\n                    });\n                }\n            })\n        }\n\n        returnUpsellElement(upsell, upsellCount) {\n            const basketText = window.matchMedia(\n                '(max-width: 999px)'\n            ).matches ? 'add' : 'add to basket';\n            return `\n                <div class=\"basket-upsell\" data-layout=${upsellCount < 4 ? 'stacked' : 'compact'}>\n                  <figure class=\"basket-upsell__image\">\n                    ${upsell.thumbnail_alt}\n                    </figure>\n                    <p class=\"basket-upsell__title\">${upsell.title}</p>\n                    <p class=\"basket-upsell__detail\">${upsell.size}</p>\n                    <p class=\"basket-upsell__price\">${upsell.price}</p>\n                    <div\n                      class=\"basket-upsell__qty\"\n                      data-sku=\"${upsell.sku}\"\n                      data-qty\n                    >\n                      <input\n                        type=\"number\"\n                        data-sku=\"${upsell.sku}]\"\n                        name=\"qty\"\n                        data-step=\"1\"\n                        data-places=\"0\"\n                        value=\"0\"\n                        data-upsell-qty\n                      />\n                    </div>\n                    <button class=\"button button--refresh button--full\" data-upsell-add>\n                      <span>${basketText}</span>\n                    </button>\n                </div>\n            `\n        }\n\n        returnHiddenInput(upsell) {\n            return `<input type=\"hidden\" name=\"sku[${upsell.sku}]\" data-sku=\"${upsell.sku}\" value=\"\" data-hidden-input />`\n        }\n\n        /**\n         * Disable the basket button\n         *\n         * @param {boolean} disabled\n         */\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n\n        /**\n         * Send some products to the basket and trigger common actions afterwards\n         *\n         * @param data\n         * @param quantity\n         * @param url\n         * @param method\n         * @return {*}\n         */\n        sendToBasket(data, quantity, url = '/basket/add', method = 'post') {\n            this.disableBasketButton(true);\n            return $.ajax(url, {\n                type: method,\n                data,\n            }).done(data => {\n                this.refreshAfterAjax(data, quantity);\n                if (Object.keys(data.payload.upsells).length) {\n                    this.openUpsellBasket(data.payload);\n                } else {\n                    this.openBasket(data.payload);\n                }\n                this.disableBasketButton(false);\n            }).fail(data => {\n                console.log(data);\n                this.disableBasketButton(false);\n            });\n        }\n\n        /**\n         * Interface to bind events\n         */\n        bind() {\n        }\n    }\n    window.AndrewMartin.AddToBasketPlugin = AddToBasketPlugin;\n\n})(window.AndrewMartin = window.AndrewMartin || {});\n\n\n/**\n * Multi-product add to cart jQuery plugin\n */\n;$(function () {\n    class MultiProduct extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('select.product__multi__sizes__select__finish').on('change', () => {\n                const selected = $('select.product__multi__sizes__select__finish').find(\":selected\");\n\n                $('.product__multi__finish-group:not([data-finish=\"' + selected.val() + '\"])').hide();\n                $('.product__multi__finish-group[data-finish=\"' + selected.val() + '\"]').show();\n\n                this.updatePrice();\n                this.updateWishlistAdd();\n            });\n\n            this.initMultiSizeSelect();\n\n            $('.product__form--addbasketmulti').on('submit', event => {\n                event.preventDefault();\n                const quantities = $('.product__multi__size__qty');\n                const pieces = $('.product-piece__qty');\n                const options = $('.product__custom-selection_option');\n                const single_qty = $('.product__custom-qty');\n                const form = $(event.target);\n                let products = {};\n                let quantity = 0;\n                let location = null;\n\n                if ($('.outdoor-radio__input').length > 0) {\n                    location = $('.outdoor-radio__input:checked').val();\n                }\n\n                products = this.getProducts();\n                pieces.each(function (index, element) {\n                    let sku = $(element).find('.js-piece-input').data('frame-sku');\n                    const qty = parseInt($(element).find('.js-piece-input').val());\n\n                    if (location) {\n                        sku = sku + '_' + location;\n                    }\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n\n                    quantity += qty;\n                });\n\n                const combination = $('.js-combination-key');\n                if (combination.length > 0) {\n                    let sku = combination.val();\n\n                    // if there's a combination SKU - ignore the other ones\n                    if (sku) {\n                        products = {};\n                        products[sku] =\n                            single_qty.length > 0 ? single_qty.val() : 1;\n                    }\n                }\n\n                const data = { sku: products };\n\n                this.sendToBasket(data, quantity).done(() => {\n                    this.zeroQuantities();\n                });\n            });\n\n            $('.product__form--addbasketajax').on('submit', event => {\n                event.preventDefault();\n                this.sendToBasket({}, 1, $(event.target).attr('action')).done(\n                    () => {\n                        this.updatePrice();\n                        magnificPopup.close();\n                    }\n                );\n            });\n\n            // trigger initial load\n            $('select.product__multi__sizes__select__finish').trigger('change');\n            this.updatePrice();\n            this.updateWishlistAdd();\n        }\n\n        initMultiSizeSelect() {\n            const productSizeSelect = document.querySelector('#product-size');\n\n            if (!productSizeSelect) {\n                return;\n            }\n\n            // Listen for changes on the new size selection dropdown\n            productSizeSelect.addEventListener('change', event => {\n                const quantityStep = document.querySelector(\n                    '.product__multi__size__qty'\n                );\n                const quantityPrice = document.querySelector(\n                    '.product__multi__size__price'\n                );\n                const selectedSize =\n                    event.currentTarget.querySelector('option:checked');\n                const selectedSizeSKU = selectedSize.value;\n                const selectedSizePrice = selectedSize.dataset.price;\n\n                $(quantityStep).data('price', selectedSizePrice);\n                $(quantityStep).data('sku', selectedSizeSKU);\n                $(quantityStep).attr('data-sku', selectedSizeSKU);\n                quantityPrice.setAttribute('data-price', selectedSizePrice);\n                $(quantityPrice).html(\n                    $(quantityPrice).data('currency') +\n                        selectedSizePrice\n                            .toString()\n                            .replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n                );\n\n                this.updatePrice();\n                this.updateWishlistAdd();\n            });\n\n            const event = new Event('change', {\n                bubbles: true,\n                cancelable: true,\n            });\n\n            // Dispatch the event on the select element to trigger any attached change event listeners\n            productSizeSelect.dispatchEvent(event);\n        }\n\n        getProducts() {\n            const quantities = $('.product__multi__size__qty:visible, .product-piece__qty:visible');\n            const selectElements = 'input[name=qty], .js-combination-piece-select, .js-piece-input';\n            let products = {};\n            let location = null;\n\n            if ($('.outdoor-radio__input').length > 0) {\n                location = $('.outdoor-radio__input:checked').val();\n            }\n\n            quantities.each(function (index, element) {\n                let sku = null;\n\n                if (typeof $(element).attr('data-sku') != 'undefined') {\n                    sku = $(element).attr('data-sku');\n                } else if (typeof $(element).find(selectElements).attr('data-frame-sku') != 'undefined')  {\n                    sku = $(element).find(selectElements).attr('data-frame-sku');\n                }\n\n                if (sku && location) {\n                    sku = sku + '_' + location;\n                }\n\n                const qty = parseInt($(element).find(selectElements).val());\n\n                if (sku && qty > 0) {\n                    products[sku] = qty;\n                }\n            });\n\n            return products;\n        }\n\n        updateWishlistAdd() {\n            const products = this.getProducts();\n            const keys = Object.keys(products);\n\n            if (keys.length > 0) {\n                $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n                $('.js-wishlist-action').attr('data-sku', keys.join(','));\n            }\n        }\n\n        updatePrice() {\n            let price = 0.00;\n            let total_qty = 0;\n            const quantities = $('.product__multi__size__qty:visible, .product-piece__qty:visible');\n\n            quantities.each(function () {\n                const product_price = parseFloat($(this).data('price'));\n                const qty = parseInt($(this).find('input[name=qty], .js-combination-piece-select, .js-piece-input').val());\n\n                if (qty > 0) {\n                    price += (product_price * qty);\n                    total_qty += qty;\n                }\n            });\n\n            if (price === 0) {\n                let fromPrice = null;\n\n                $('.product__multi__size').each(function () {\n                    const sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                    if (sizePrice < fromPrice || fromPrice === null) {\n                        fromPrice = sizePrice;\n                    }\n                })\n\n                price = fromPrice;\n\n                $('.product__multi__total_label').html('From:');\n            } else {\n                $('.product__multi__total_label').html('Total Price:');\n            }\n\n            if (price) {\n                if (price.toFixed(2) % 1 > 0) {\n                    price = price.toFixed(2);\n                } else {\n                    price = price.toFixed(0);\n                }\n\n                $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n            }\n\n            var selected = true;\n\n            $('.js-customise__show-content').each(function(i, element) {\n                if ($(element).data('required')) {\n                    selected = false;\n                }\n            });\n\n            if (total_qty > 0) {\n                this.disableBasketButton(false);\n            } else if (!selected) {\n                this.disableBasketButton(true);\n            }\n        }\n\n        zeroQuantities() {\n            const quantities = $('.product__multi__size__qty');\n\n            quantities.each(function () {\n                $(this).find('input[name=qty]').val(0);\n            });\n        }\n\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.product__upsell__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n    }\n\n    $.fn.multiproduct = function (options) {\n        if (!$.data(this, \"plugin_multiproduct\")) {\n            $.data(this, \"plugin_multiproduct\", new MultiProduct(this, options));\n        }\n\n        return $.data(this, \"plugin_multiproduct\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Single product add to cart jQuery plugin\n */\n ;$(function () {\n    class FlyoutUpsell extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {            \n            $('.product__form--addbasketmulti').on('submit', event => {\n                event.preventDefault();\n\n                const hiddenInputs = document.querySelectorAll('[data-hidden-input]');\n                const quantities = document.querySelectorAll('[data-qty]');\n                const form = $(event.target);\n                const products = {};\n                let quantity = 0;\n\n                quantities.forEach(function(element) {\n                    const qty = parseInt(element.querySelector('input[name=qty]').value);\n                    let sku = element.dataset.sku;\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n\n                    hiddenInputs.forEach(input => {\n                        if (input.dataset.sku == sku) {\n                            input.value = qty;\n                        }\n                    })\n\n                    quantity += qty;\n                });\n\n                form.serializeArray().forEach(function (entry) {\n                    if (entry.name.match(/^sku\\[[^\\]]+]$/)) {\n                        products[entry.name.replace(/^sku\\[([^\\]]+)]/, '$1')] = entry.value;\n                    }\n                });\n\n                const data = {'sku': products};\n\n                if (quantity == 0) {\n                    this.openBasket(data.payload)\n                } else {\n                    this.sendToBasket(data, quantity);\n                }\n            }); \n        }\n    }\n\n    $.fn.flyoutupsell = function (options) {\n        if (!$.data(this, \"plugin_flyoutupsell\")) {\n            $.data(this, \"plugin_flyoutupsell\", new FlyoutUpsell(this, options));\n        }\n\n        return $.data(this, \"plugin_flyoutupsell\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Trade Material prototype\n */\n$(() => {\n    class TradeMaterial extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('#js-batches-form').on('submit', e => {\n                e.preventDefault();\n                const type = $('.js-purchase-type:checked').val();\n                const optionsArray = [];\n\n                switch (type) {\n                    case 'add':\n                        break;\n                    case 'reserve':\n                        optionsArray.push('RES');\n                        if ($('.js-reserve-cutting:visible') && $('.js-reserve-cutting').prop('checked')) {\n                            optionsArray.push('C');\n                        }\n                        break;\n                    case 'cutting':\n                        optionsArray.push('C');\n                        break;\n                    case 'returnable':\n                        optionsArray.push('R');\n                        break;\n                }\n\n                const optionsString = optionsArray.join('-');\n                const products = {};\n\n                // Generate and array of all visible SKUs that have quantities\n\n                const $visibleInputs = $('.batches__piece-qty:visible');\n                let quantity = 0;\n\n                $visibleInputs.each(function () {\n                    const $input = $(this).find('input[name=qty]');\n                    const sku = $input.attr('data-sku').replace('%options%', optionsString);\n                    const qty = parseFloat($input.val());\n\n                    if (qty > 0) {\n                        products[sku] = qty;\n                    }\n                    quantity += qty;\n                })\n\n                // If we are requesting a cutting or a returnable get the default SKU and set quantity to 1\n\n                if ($visibleInputs.length === 0) {\n                    const $input = $('.js-piece-input-any');\n                    const sku = $input.attr('data-sku').replace('%options%', optionsString);\n                    products[sku] = 1;\n                    quantity = 1;\n                }\n\n                this.sendToBasket({'sku': products}, quantity);\n            })\n\n            $('.js-reserve-cutting').on('change click', () => {\n                this.updateReserveText();\n            })\n\n            $('.js-purchase-type').on('change', (event) => {\n                this.hideReserveBlock(true)\n                switch (event.target.value) {\n                    case 'add':\n                        this.hideMaterialBlock(false);\n                        break;\n                    case 'reserve':\n                        this.hideMaterialBlock(false);\n                        this.hideReserveBlock(false);\n                        break;\n                    case 'cutting':\n                    case 'returnable':\n                        this.hideMaterialBlock(true);\n                        this.zeroQuantities();\n                        this.disableBasketButton(false);\n                        break;\n                }\n            });\n\n            $('.js-batches-dropdown').on('change', event => {\n                var batch_price = event.target[event.target.selectedIndex].getAttribute('data-price');\n                $('.batches').attr('data-price', batch_price);\n                $('.js-batch-price').text(batch_price);\n\n                if ($('.product__form--addbasket').length > 0) {\n                    const baseAction = $('.product__form--addbasket').attr('data-base-action');\n                    $('.product__form--addbasket').attr('action', baseAction + event.target.value);\n                } else {\n                    $('.js-batches-pieces').removeClass('batches__pieces-show');\n                    $('.js-batches-pieces[data-batch=\"' + event.target.value + '\"]').addClass('batches__pieces-show');\n\n                    this.updatePrice();\n                    this.zeroQuantities();\n                }\n            });\n        }\n\n        updateReserveText() {\n            if ($('.js-reserve-cutting').prop('checked')) {\n                $('.reserve-cutting__text-no-cutting').toggleClass('reserve-cutting__text-hidden', true);\n                $('.reserve-cutting__text-cutting').toggleClass('reserve-cutting__text-hidden', false);\n            } else {\n                $('.reserve-cutting__text-no-cutting').toggleClass('reserve-cutting__text-hidden', false);\n                $('.reserve-cutting__text-cutting').toggleClass('reserve-cutting__text-hidden', true);\n            }\n        }\n\n        hideReserveBlock(disabled) {\n            if (disabled === true) {\n                $('.js-reserve-cutting-hold').hide();\n            } else {\n                $('.js-reserve-cutting-hold').show();\n            }\n        }\n\n        hideMaterialBlock(disabled) {\n            if (disabled === true) {\n                $('.batches__main').hide();\n            } else {\n                $('.batches__main').show();\n            }\n        }\n\n        zeroQuantities() {\n            const quantities = $('.batches__piece-qty');\n\n            quantities.each(function () {\n                $(this).find('input[name=qty]').val(0);\n            });\n\n            this.disableBasketButton(true);\n            this.updatePrice();\n        }\n\n        updatePrice() {\n            let price = 0.00;\n            let total_qty = 0;\n            const quantities = $('.batches__piece-qty:visible');\n            const product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n            quantities.each(function () {\n                const qty = parseFloat($(this).find('input[name=qty]').val());\n\n                if (qty > 0) {\n                    price += product_price * qty;\n                    total_qty += qty;\n                }\n            });\n\n            $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n            $('.batches__totals-info span').html(total_qty.toFixed(1));\n            $('.js-material-length').html(total_qty.toFixed(1));\n\n            this.disableBasketButton(total_qty <= 0);\n        }\n    }\n\n    $.fn.tradematerial = function (options) {\n        if (!$.data(this, \"plugin_tradematerial\")) {\n            $.data(this, \"plugin_tradematerial\", new TradeMaterial(this, options));\n        }\n\n        return $.data(this, \"plugin_tradematerial\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Single product add to cart jQuery plugin\n */\n;$(function () {\n    class SingleProduct extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('.product__form--addbasketajax').on('submit', event => {\n                event.preventDefault();\n                const form = $(event.target);\n                const formId = event.target.id;\n                let qty = 1;\n                if (formId) {\n                    // Input is outside form so grab the value\n                    qty = $(`input[name=\"qty\"][form=${formId}]`).val();\n                } else {\n                    qty = form.find(`input[name=\"qty\"]`).val();\n                }\n\n                let location = null;\n                let action = form.attr('action');\n\n                if ($('.outdoor-radio__input').length > 0) {\n                    location = $('.outdoor-radio__input:checked').val();\n                    action = action + '_' + location;\n                }\n\n                this.sendToBasket({qty: qty}, qty, action, 'get')\n                    .done(() => {\n                        magnificPopup.close();\n                    });\n            });\n        }\n\n        disableBasketButton(disabled) {\n            $('.product__button').toggleClass('button--disabled', disabled);\n            $('.product__upsell__button').toggleClass('button--disabled', disabled);\n            $('.js-wishlist-action').toggleClass('product__wishlist--disabled', disabled);\n        }\n    }\n\n    $.fn.singleproduct = function (options) {\n        if (!$.data(this, \"plugin_singleproduct\")) {\n            $.data(this, \"plugin_singleproduct\", new SingleProduct(this, options));\n        }\n\n        return $.data(this, \"plugin_singleproduct\");\n    };\n});\n\n//=require components/add-to-basket.js\n\n/**\n * Sample add to basket plugin\n */\n $(() => {\n    class Sample extends window.AndrewMartin.AddToBasketPlugin {\n        bind() {\n            const magnificPopup = $.magnificPopup.instance;\n\n            $('.product__form--addbasketajax--sample').on('submit', event => {\n                event.preventDefault();\n                this.sendToBasket(\n                    {},\n                    1,\n                    $(event.target).attr('action')\n                ).done(() => {\n                    magnificPopup.close();\n                });\n            });\n\n        }\n    }\n\n    $.fn.sample = function (options) {\n        if (!$.data(this, \"plugin_sample\")) {\n            $.data(this, \"plugin_sample\", new Sample(this, options));\n        }\n\n        return $.data(this, \"plugin_sample\");\n    };\n});\n\n$('.product__sizes li.sizes__option').click(function() {\n    var selection = $(this);\n\n    // don't do anything if the size is already selected\n    if (selection.hasClass('sizes__option--active') && !selection.hasClass('sizes__option--active--first')) {\n        return;\n    }\n\n    $.ajax({\n        url: selection.data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n\n    $('.product__sizes .sizes__option').removeClass('sizes__option--active');\n    selection.addClass('sizes__option--active');\n    selection.removeClass('sizes__option--active--first');\n});\n\n$('.product__sizes .d3r-size-select').change(function() {\n    var select = $(this);\n\n    if (!select.find(':selected').data('url')) {\n        return;\n    }\n\n    $.ajax({\n        url: select.find(':selected').data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n            $('.product__delivery-information__text').html(data.payload.delivery_information);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n});\n\n$('.colourways__item').on('mouseover', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $(this).data('colour'));\n});\n\n$('.colourways__item').on('mouseout', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $('.colourways__text').data('colour'));\n});\n\nfunction updateFinancing() {\n    if ($('.product__financing').length == 0 || typeof(fdOptions) == \"undefined\") {\n        return;\n    }\n\n    var $finTable  = $('#finance-calculator table tbody'),\n        price      = parseFloat(fdPrice),\n        tdDetails  = [];\n\n    if (price < fdMinPrice) {\n        $('.product__financing').hide();\n        return;\n    }\n    $('.product__financing').show();\n\n    $('select', $finTable).empty();\n\n    var i = 0;\n    for (var fdOpt in fdOptions) {\n        var code        = fdOptions[fdOpt]['code'],\n            depositPerc = fdOptions[fdOpt]['deposit'],\n            depositVal  = depositPerc / 100,\n            depositAmt  = price * depositVal;\n\n        var opt = new FinanceDetails(code, price, depositPerc, depositAmt);\n        if (opt) {\n            tdDetails.push(opt);\n\n            // Only show the first option on the PDP directly\n            if (i == 0) {\n                $('.product__financing--message').html(\n                    '&pound;' + parseFloat(opt.m_inst).toFixed(2) +\n                    ' per month with a &pound;' + parseFloat(opt.d_amount).toFixed(2) +\n                    ' deposit (' + opt.apr + '% interest).'\n                );\n                $('.product__financing').fadeIn();\n            }\n\n            $('select', $finTable).append($('<option>', {\n                value: i,\n                text: opt.p_name\n            }));\n\n            ++i;\n        }\n    }\n\n    $('select', $finTable).on('change', function() {\n        var opt = tdDetails[$(this).prop('selectedIndex')],\n            cur = '&pound;';\n\n        $('#cost_of_goods', $finTable).html(cur + parseFloat(opt.goods_val).toFixed(2));\n        $('#deposit_percentage', $finTable).html(opt.d_pc + '%');\n        $('#deposit_amount', $finTable).html(cur + parseFloat(opt.d_amount).toFixed(2));\n        $('#credit_amount', $finTable).html(cur + parseFloat(opt.l_amount).toFixed(2));\n        $('#finance_term', $finTable).html(opt.term + ' months');\n        $('#apr', $finTable).html(opt.apr + '%');\n        $('#cost_per_month', $finTable).html(cur + parseFloat(opt.m_inst).toFixed(2));\n        $('#monthly_repayment', $finTable).html(cur + parseFloat(opt.l_repay).toFixed(2));\n        $('#total', $finTable).html(cur + parseFloat(opt.total).toFixed(2));\n    }).trigger('change');\n}\n$('document').ready(updateFinancing);\n\n\n//=require magnific-popup/dist/jquery.magnific-popup.min.js\n//=require js-tools/svg.js\nfunction Loop() {\n\n    this.object = function(obj, callback) {\n        var keys = Object.keys(obj);\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                callback(keys, i);\n            })(i);\n        }\n    }\n\n    this.array = function(array, callback, reverse) {\n        if (reverse) {\n            for (var i = array.length - 1; i > -1; i--) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        } else {\n            for (var i = 0; i < array.length; i++) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        }\n    }\n}\n\n\nfunction PaintQuantityCalculator() {\n    var self = this;\n    var loop = new Loop();\n    var svg = new Svg();\n\n    this.el = document.querySelector('.js-paint-quantity-calculator');\n    this.link = document.querySelector('.js-launch-paint-quantity-calculator');\n    this.submit = document.querySelector('.js-paint-quantity-calculator__submit');\n    this.confirm = document.querySelector('.js-paint-quantity-calculator__confirm');\n    this.reset = document.querySelector('.js-paint-quantity-calculator__reset');\n    this.width = document.querySelector('.js-paint-quantity-calculator__width');\n    this.height = document.querySelector('.js-paint-quantity-calculator__height');\n    this.dimension = {\n        width: document.querySelector('.js-paint-quantity-calculator__dimension-width'),\n        height: document.querySelector('.js-paint-quantity-calculator__dimension-height')\n    };\n    this.quantity = document.querySelector('.js-paint-quantity-calculator__quantity');\n    this.inputs = [\n        this.width,\n        this.height\n    ];\n    this.validCharacters = [46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // . and 0-9\n    this.error = [];\n    this.result = null;\n\n    this.exists = function() {\n        return this.el != undefined;\n    }\n\n    this.init = function() {\n        this.el.classList.add('mfp-hide');\n\n        this.link.onclick = this.activate.bind(this);\n        this.submit.onclick = this.calculate.bind(this);\n        this.reset.onclick = this.resetForm.bind(this);\n\n        if (this.confirm) {\n            this.confirm.onclick = this.confirmQuantity.bind(this);\n        }\n\n        this.validateInputs();\n    }\n\n    this.activate = function(e) {\n        e.preventDefault();\n\n        $.magnificPopup.open({\n            mainClass: 'mfp-flush mfp-fade',\n            removalDelay: 300,\n            items: {\n                src: '.paint-quantity-calculator'\n            },\n            closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close paint-quantity-calculator__close\">' + svg.render('close') + '</button>',\n            type: 'inline',\n        });\n    }\n\n    this.calculate = function(e) {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.error = [];\n        this.result = null;\n\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n            var value = self.checkValue(input.value);\n\n            if (self.result == null) {\n                self.result = value;\n            } else {\n                self.result = self.result * value;\n            }\n\n            if (value == 0) {\n                self.error.push(input.id);\n            }\n        });\n\n        // sqm/20 * 2 coats = litres\n        this.result = this.result / 20 * 2;\n\n        this.render();\n    }\n\n    this.resetForm = function(e) {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.error = [];\n        this.result = null;\n\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n\n            input.value = null;\n        });\n\n        this.render();\n    }\n\n    this.confirmQuantity = function() {\n        console.log('confirm!', this.result);\n        this.resetForm();\n        $.magnificPopup.close();\n    }\n\n    this.validateInputs = function() {\n        loop.array(this.inputs, function(inputs, i) {\n            var input = inputs[i];\n\n            input.onkeypress = self.validateInputKeypress.bind(this);\n            input.onblur = self.validateInputBlur.bind(this);\n        });\n    }\n\n    this.validateInputKeypress = function(e) {\n        if (self.validCharacters.indexOf(e.charCode) == -1) {\n            e.preventDefault();\n        }\n    }\n\n    this.validateInputBlur = function(e) {\n        if (isNaN(parseFloat(e.target.value))) {\n            e.target.value = null;\n        }\n    }\n\n    this.checkValue = function(value) {\n        return parseFloat(value).toFixed(1) || 0;\n    }\n\n    this.render = function() {\n        if (this.error.length > 0) {\n            this.el.classList.add('paint-quantity-calculator--has-error');\n        } else {\n            this.el.classList.remove('paint-quantity-calculator--has-error');\n        }\n        if (this.result) {\n            this.el.classList.add('paint-quantity-calculator--has-result');\n            loop.array(this.inputs, function(inputs, i) {\n                var input = inputs[i];\n\n                if (self.dimension[input.id]) {\n                    self.dimension[input.id].innerHTML = self.checkValue(input.value);\n                }\n            });\n            this.quantity.innerHTML = this.result.toFixed(2);\n        } else {\n            this.el.classList.remove('paint-quantity-calculator--has-result');\n        }\n    }\n}\n\nvar paintQuantityCalculator = new PaintQuantityCalculator();\n\nif (paintQuantityCalculator.exists()) {\n    paintQuantityCalculator.init();\n}\n\n//=require js-tools/svg.js\n//=require js-tools/loop.js\nfunction Viewport(breakpoints) {\n\n    // Get the breakpoint config\n    this.breakpoints = breakpoints;\n\n    // Constuct the breakpoint for the media query\n    this.mediaQuery = function(breakpoint) {\n        return '(' + this.breakpoints[breakpoint].type + ': ' + this.breakpoints[breakpoint].size + 'px)';\n    }\n\n    // Check if the media query matches\n    this.matchMedia = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint));\n    }\n\n    // Check if the media query matches\n    this.matches = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint)).matches;\n    }\n\n    // Construct the custom media query\n    this.customMediaQuery = function(breakpoint) {\n        return breakpoint;\n    }\n\n    // Check if the custom media query matches\n    this.customMatchMedia = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint));\n    }\n\n    // Check if the custom media query matches\n    this.customMatches = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint)).matches;\n    }\n\n    // Watch for viewport resize\n    this.resize = function(callback) {\n        var windowResizing;\n\n        window.addEventListener('resize', function() {\n            clearTimeout(windowResizing);\n            windowResizing = setTimeout(function() {\n                if (typeof callback == 'function') {\n                    callback();\n                }\n            }, 100);\n        });\n    }\n}\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define('underscore', factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {\n    var current = global._;\n    var exports = global._ = factory();\n    exports.noConflict = function () { global._ = current; return exports; };\n  }()));\n}(this, (function () {\n  //     Underscore.js 1.13.8\n  //     https://underscorejs.org\n  //     (c) 2009-2026 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n  //     Underscore may be freely distributed under the MIT license.\n\n  // Current version.\n  var VERSION = '1.13.8';\n\n  // Establish the root object, `window` (`self`) in the browser, `global`\n  // on the server, or `this` in some virtual machines. We use `self`\n  // instead of `window` for `WebWorker` support.\n  var root = (typeof self == 'object' && self.self === self && self) ||\n            (typeof global == 'object' && global.global === global && global) ||\n            Function('return this')() ||\n            {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype;\n  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push = ArrayProto.push,\n      slice = ArrayProto.slice,\n      toString = ObjProto.toString,\n      hasOwnProperty = ObjProto.hasOwnProperty;\n\n  // Modern feature detection.\n  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n      supportsDataView = typeof DataView !== 'undefined';\n\n  // All **ECMAScript 5+** native function implementations that we hope to use\n  // are declared here.\n  var nativeIsArray = Array.isArray,\n      nativeKeys = Object.keys,\n      nativeCreate = Object.create,\n      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n  // Create references to these builtin functions because we override them.\n  var _isNaN = isNaN,\n      _isFinite = isFinite;\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  // The largest integer that can be represented exactly.\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n\n  // Some functions take a variable number of arguments, or a few expected\n  // arguments at the beginning and then a variable number of values to operate\n  // on. This helper accumulates all remaining arguments past the function’s\n  // argument length (or an explicit `startIndex`), into an array that becomes\n  // the last argument. Similar to ES6’s \"rest parameter\".\n  function restArguments(func, startIndex) {\n    startIndex = startIndex == null ? func.length - 1 : +startIndex;\n    return function() {\n      var length = Math.max(arguments.length - startIndex, 0),\n          rest = Array(length),\n          index = 0;\n      for (; index < length; index++) {\n        rest[index] = arguments[index + startIndex];\n      }\n      switch (startIndex) {\n        case 0: return func.call(this, rest);\n        case 1: return func.call(this, arguments[0], rest);\n        case 2: return func.call(this, arguments[0], arguments[1], rest);\n      }\n      var args = Array(startIndex + 1);\n      for (index = 0; index < startIndex; index++) {\n        args[index] = arguments[index];\n      }\n      args[startIndex] = rest;\n      return func.apply(this, args);\n    };\n  }\n\n  // Is a given variable an object?\n  function isObject(obj) {\n    var type = typeof obj;\n    return type === 'function' || (type === 'object' && !!obj);\n  }\n\n  // Is a given value equal to null?\n  function isNull(obj) {\n    return obj === null;\n  }\n\n  // Is a given variable undefined?\n  function isUndefined(obj) {\n    return obj === void 0;\n  }\n\n  // Is a given value a boolean?\n  function isBoolean(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  }\n\n  // Is a given value a DOM element?\n  function isElement(obj) {\n    return !!(obj && obj.nodeType === 1);\n  }\n\n  // Internal function for creating a `toString`-based type tester.\n  function tagTester(name) {\n    var tag = '[object ' + name + ']';\n    return function(obj) {\n      return toString.call(obj) === tag;\n    };\n  }\n\n  var isString = tagTester('String');\n\n  var isNumber = tagTester('Number');\n\n  var isDate = tagTester('Date');\n\n  var isRegExp = tagTester('RegExp');\n\n  var isError = tagTester('Error');\n\n  var isSymbol = tagTester('Symbol');\n\n  var isArrayBuffer = tagTester('ArrayBuffer');\n\n  var isFunction = tagTester('Function');\n\n  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\n  var nodelist = root.document && root.document.childNodes;\n  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n    isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  var isFunction$1 = isFunction;\n\n  var hasObjectTag = tagTester('Object');\n\n  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n  // In IE 11, the most common among them, this problem also applies to\n  // `Map`, `WeakMap` and `Set`.\n  // Also, there are cases where an application can override the native\n  // `DataView` object, in cases like that we can't use the constructor\n  // safely and should just rely on alternate `DataView` checks\n  var hasDataViewBug = (\n        supportsDataView && (!/\\[native code\\]/.test(String(DataView)) || hasObjectTag(new DataView(new ArrayBuffer(8))))\n      ),\n      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n\n  var isDataView = tagTester('DataView');\n\n  // In IE 10 - Edge 13, we need a different heuristic\n  // to determine whether an object is a `DataView`.\n  // Also, in cases where the native `DataView` is\n  // overridden we can't rely on the tag itself.\n  function alternateIsDataView(obj) {\n    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);\n  }\n\n  var isDataView$1 = (hasDataViewBug ? alternateIsDataView : isDataView);\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native `Array.isArray`.\n  var isArray = nativeIsArray || tagTester('Array');\n\n  // Internal function to check whether `key` is an own property name of `obj`.\n  function has$1(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  }\n\n  var isArguments = tagTester('Arguments');\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  (function() {\n    if (!isArguments(arguments)) {\n      isArguments = function(obj) {\n        return has$1(obj, 'callee');\n      };\n    }\n  }());\n\n  var isArguments$1 = isArguments;\n\n  // Is a given object a finite number?\n  function isFinite$1(obj) {\n    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n  }\n\n  // Is the given value `NaN`?\n  function isNaN$1(obj) {\n    return isNumber(obj) && _isNaN(obj);\n  }\n\n  // Predicate-generating function. Often useful outside of Underscore.\n  function constant(value) {\n    return function() {\n      return value;\n    };\n  }\n\n  // Common internal logic for `isArrayLike` and `isBufferLike`.\n  function createSizePropertyCheck(getSizeProperty) {\n    return function(collection) {\n      var sizeProperty = getSizeProperty(collection);\n      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n    }\n  }\n\n  // Internal helper to generate a function to obtain property `key` from `obj`.\n  function shallowProperty(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  }\n\n  // Internal helper to obtain the `byteLength` property of an object.\n  var getByteLength = shallowProperty('byteLength');\n\n  // Internal helper to determine whether we should spend extensive checks against\n  // `ArrayBuffer` et al.\n  var isBufferLike = createSizePropertyCheck(getByteLength);\n\n  // Is a given value a typed array?\n  var typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\n  function isTypedArray(obj) {\n    // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n    // Otherwise, fall back on the above regular expression.\n    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :\n                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n  }\n\n  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);\n\n  // Internal helper to obtain the `length` property of an object.\n  var getLength = shallowProperty('length');\n\n  // Internal helper to create a simple lookup structure.\n  // `collectNonEnumProps` used to depend on `_.contains`, but this led to\n  // circular imports. `emulatedSet` is a one-off solution that only works for\n  // arrays of strings.\n  function emulatedSet(keys) {\n    var hash = {};\n    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n    return {\n      contains: function(key) { return hash[key] === true; },\n      push: function(key) {\n        hash[key] = true;\n        return keys.push(key);\n      }\n    };\n  }\n\n  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n  // needed.\n  function collectNonEnumProps(obj, keys) {\n    keys = emulatedSet(keys);\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`.\n  function keys(obj) {\n    if (!isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (has$1(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  }\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  function isEmpty(obj) {\n    if (obj == null) return true;\n    // Skip the more expensive `toString`-based type checks if `obj` has no\n    // `.length`.\n    var length = getLength(obj);\n    if (typeof length == 'number' && (\n      isArray(obj) || isString(obj) || isArguments$1(obj)\n    )) return length === 0;\n    return getLength(keys(obj)) === 0;\n  }\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  function isMatch(object, attrs) {\n    var _keys = keys(attrs), length = _keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = _keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  }\n\n  // If Underscore is called as a function, it returns a wrapped object that can\n  // be used OO-style. This wrapper holds altered versions of all functions added\n  // through `_.mixin`. Wrapped objects may be chained.\n  function _$1(obj) {\n    if (obj instanceof _$1) return obj;\n    if (!(this instanceof _$1)) return new _$1(obj);\n    this._wrapped = obj;\n  }\n\n  _$1.VERSION = VERSION;\n\n  // Extracts the result from a wrapped and chained object.\n  _$1.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxies for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;\n\n  _$1.prototype.toString = function() {\n    return String(this._wrapped);\n  };\n\n  // Internal function to wrap or shallow-copy an ArrayBuffer,\n  // typed array or DataView to a new view, reusing the buffer.\n  function toBufferView(bufferSource) {\n    return new Uint8Array(\n      bufferSource.buffer || bufferSource,\n      bufferSource.byteOffset || 0,\n      getByteLength(bufferSource)\n    );\n  }\n\n  // We use this string twice, so give it a name for minification.\n  var tagDataView = '[object DataView]';\n\n  // Perform a deep comparison to check if two objects are equal.\n  function isEqual(a, b) {\n    var todo = [{a: a, b: b}];\n    // Initializing stacks of traversed objects for cycle detection.\n    var aStack = [], bStack = [];\n\n    while (todo.length) {\n      var frame = todo.pop();\n      if (frame === true) {\n        // Remove the first object from the stack of traversed objects.\n        aStack.pop();\n        bStack.pop();\n        continue;\n      }\n      a = frame.a;\n      b = frame.b;\n\n      // Identical objects are equal. `0 === -0`, but they aren't identical.\n      // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n      if (a === b) {\n        if (a !== 0 || 1 / a === 1 / b) continue;\n        return false;\n      }\n      // `null` or `undefined` only equal to itself (strict comparison).\n      if (a == null || b == null) return false;\n      // `NaN`s are equivalent, but non-reflexive.\n      if (a !== a) {\n        if (b !== b) continue;\n        return false;\n      }\n      // Exhaust primitive checks\n      var type = typeof a;\n      if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n\n  // Internal recursive comparison function for `_.isEqual`.\n      // Unwrap any wrapped objects.\n      if (a instanceof _$1) a = a._wrapped;\n      if (b instanceof _$1) b = b._wrapped;\n      // Compare `[[Class]]` names.\n      var className = toString.call(a);\n      if (className !== toString.call(b)) return false;\n      // Work around a bug in IE 10 - Edge 13.\n      if (hasDataViewBug && className == '[object Object]' && isDataView$1(a)) {\n        if (!isDataView$1(b)) return false;\n        className = tagDataView;\n      }\n      switch (className) {\n        // These types are compared by value.\n      case '[object RegExp]':\n        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        if ('' + a === '' + b) continue;\n        return false;\n      case '[object Number]':\n        todo.push({a: +a, b: +b});\n        continue;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        if (+a === +b) continue;\n        return false;\n      case '[object Symbol]':\n        if (SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b)) continue;\n        return false;\n      case '[object ArrayBuffer]':\n      case tagDataView:\n        // Coerce to typed array so we can fall through.\n        todo.push({a: toBufferView(a), b: toBufferView(b)});\n        continue;\n      }\n\n      var areArrays = className === '[object Array]';\n      if (!areArrays && isTypedArray$1(a)) {\n        var byteLength = getByteLength(a);\n        if (byteLength !== getByteLength(b)) return false;\n        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) continue;\n        areArrays = true;\n      }\n      if (!areArrays) {\n        if (typeof a != 'object' || typeof b != 'object') return false;\n\n        // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n        // from different frames are.\n        var aCtor = a.constructor, bCtor = b.constructor;\n        if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&\n                                 isFunction$1(bCtor) && bCtor instanceof bCtor)\n            && ('constructor' in a && 'constructor' in b)) {\n          return false;\n        }\n      }\n\n      // Assume equality for cyclic structures. The algorithm for detecting cyclic\n      // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n      var length = aStack.length;\n      while (length--) {\n        // Linear search. Performance is inversely proportional to the number of\n        // unique nested structures.\n        if (aStack[length] === a) {\n          if (bStack[length] === b) break;\n          return false;\n        }\n      }\n      if (length >= 0) continue;\n\n      // Add the first object to the stack of traversed objects.\n      aStack.push(a);\n      bStack.push(b);\n      todo.push(true);\n\n      // Recursively compare objects and arrays.\n      if (areArrays) {\n        // Compare array lengths to determine if a deep comparison is necessary.\n        length = a.length;\n        if (length !== b.length) return false;\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (length--) {\n          todo.push({a: a[length], b: b[length]});\n        }\n      } else {\n        // Deep compare objects.\n        var _keys = keys(a), key;\n        length = _keys.length;\n        // Ensure that both objects contain the same number of properties before comparing deep equality.\n        if (keys(b).length !== length) return false;\n        while (length--) {\n          // Deep compare each member\n          key = _keys[length];\n          if (!has$1(b, key)) return false;\n          todo.push({a: a[key], b: b[key]});\n        }\n      }\n    }\n    return true;\n  }\n\n  // Retrieve all the enumerable property names of an object.\n  function allKeys(obj) {\n    if (!isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  }\n\n  // Since the regular `Object.prototype.toString` type tests don't work for\n  // some types in IE 11, we use a fingerprinting heuristic instead, based\n  // on the methods. It's not great, but it's the best we got.\n  // The fingerprint method lists are defined below.\n  function ie11fingerprint(methods) {\n    var length = getLength(methods);\n    return function(obj) {\n      if (obj == null) return false;\n      // `Map`, `WeakMap` and `Set` have no enumerable keys.\n      var keys = allKeys(obj);\n      if (getLength(keys)) return false;\n      for (var i = 0; i < length; i++) {\n        if (!isFunction$1(obj[methods[i]])) return false;\n      }\n      // If we are testing against `WeakMap`, we need to ensure that\n      // `obj` doesn't have a `forEach` method in order to distinguish\n      // it from a regular `Map`.\n      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);\n    };\n  }\n\n  // In the interest of compact minification, we write\n  // each string in the fingerprints only once.\n  var forEachName = 'forEach',\n      hasName = 'has',\n      commonInit = ['clear', 'delete'],\n      mapTail = ['get', hasName, 'set'];\n\n  // `Map`, `WeakMap` and `Set` each have slightly different\n  // combinations of the above sublists.\n  var mapMethods = commonInit.concat(forEachName, mapTail),\n      weakMapMethods = commonInit.concat(mapTail),\n      setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\n  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n\n  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n\n  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n\n  var isWeakSet = tagTester('WeakSet');\n\n  // Retrieve the values of an object's properties.\n  function values(obj) {\n    var _keys = keys(obj);\n    var length = _keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[_keys[i]];\n    }\n    return values;\n  }\n\n  // Convert an object into a list of `[key, value]` pairs.\n  // The opposite of `_.object` with one argument.\n  function pairs(obj) {\n    var _keys = keys(obj);\n    var length = _keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [_keys[i], obj[_keys[i]]];\n    }\n    return pairs;\n  }\n\n  // Invert the keys and values of an object. The values must be serializable.\n  function invert(obj) {\n    var result = {};\n    var _keys = keys(obj);\n    for (var i = 0, length = _keys.length; i < length; i++) {\n      result[obj[_keys[i]]] = _keys[i];\n    }\n    return result;\n  }\n\n  // Return a sorted list of the function names available on the object.\n  function functions(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (isFunction$1(obj[key])) names.push(key);\n    }\n    return names.sort();\n  }\n\n  // An internal function for creating assigner functions.\n  function createAssigner(keysFunc, defaults) {\n    return function(obj) {\n      var length = arguments.length;\n      if (defaults) obj = Object(obj);\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!defaults || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  }\n\n  // Extend a given object with all the properties in passed-in object(s).\n  var extend = createAssigner(allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in\n  // object(s).\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  var extendOwn = createAssigner(keys);\n\n  // Fill in a given object with default properties.\n  var defaults = createAssigner(allKeys, true);\n\n  // Create a naked function reference for surrogate-prototype-swapping.\n  function ctor() {\n    return function(){};\n  }\n\n  // An internal function for creating a new object that inherits from another.\n  function baseCreate(prototype) {\n    if (!isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    var Ctor = ctor();\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  }\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  function create(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) extendOwn(result, props);\n    return result;\n  }\n\n  // Create a (shallow-cloned) duplicate of an object.\n  function clone(obj) {\n    if (!isObject(obj)) return obj;\n    return isArray(obj) ? obj.slice() : extend({}, obj);\n  }\n\n  // Invokes `interceptor` with the `obj` and then returns `obj`.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  function tap(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  }\n\n  // Normalize a (deep) property `path` to array.\n  // Like `_.iteratee`, this function can be customized.\n  function toPath$1(path) {\n    return isArray(path) ? path : [path];\n  }\n  _$1.toPath = toPath$1;\n\n  // Internal wrapper for `_.toPath` to enable minification.\n  // Similar to `cb` for `_.iteratee`.\n  function toPath(path) {\n    return _$1.toPath(path);\n  }\n\n  // Internal function to obtain a nested property in `obj` along `path`.\n  function deepGet(obj, path) {\n    var length = path.length;\n    for (var i = 0; i < length; i++) {\n      if (obj == null) return void 0;\n      obj = obj[path[i]];\n    }\n    return length ? obj : void 0;\n  }\n\n  // Get the value of the (deep) property on `path` from `object`.\n  // If any property in `path` does not exist or if the value is\n  // `undefined`, return `defaultValue` instead.\n  // The `path` is normalized through `_.toPath`.\n  function get(object, path, defaultValue) {\n    var value = deepGet(object, toPath(path));\n    return isUndefined(value) ? defaultValue : value;\n  }\n\n  // Shortcut function for checking if an object has a given property directly on\n  // itself (in other words, not on a prototype). Unlike the internal `has`\n  // function, this public version can also traverse nested properties.\n  function has(obj, path) {\n    path = toPath(path);\n    var length = path.length;\n    for (var i = 0; i < length; i++) {\n      var key = path[i];\n      if (!has$1(obj, key)) return false;\n      obj = obj[key];\n    }\n    return !!length;\n  }\n\n  // Keep the identity function around for default iteratees.\n  function identity(value) {\n    return value;\n  }\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  function matcher(attrs) {\n    attrs = extendOwn({}, attrs);\n    return function(obj) {\n      return isMatch(obj, attrs);\n    };\n  }\n\n  // Creates a function that, when passed an object, will traverse that object’s\n  // properties down the given `path`, specified as an array of keys or indices.\n  function property(path) {\n    path = toPath(path);\n    return function(obj) {\n      return deepGet(obj, path);\n    };\n  }\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  function optimizeCb(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      // The 2-argument case is omitted because we’re not using it.\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  }\n\n  // An internal function to generate callbacks that can be applied to each\n  // element in a collection, returning the desired result — either `_.identity`,\n  // an arbitrary callback, a property matcher, or a property accessor.\n  function baseIteratee(value, context, argCount) {\n    if (value == null) return identity;\n    if (isFunction$1(value)) return optimizeCb(value, context, argCount);\n    if (isObject(value) && !isArray(value)) return matcher(value);\n    return property(value);\n  }\n\n  // External wrapper for our callback generator. Users may customize\n  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n  // This abstraction hides the internal-only `argCount` argument.\n  function iteratee(value, context) {\n    return baseIteratee(value, context, Infinity);\n  }\n  _$1.iteratee = iteratee;\n\n  // The function we call internally to generate a callback. It invokes\n  // `_.iteratee` if overridden, otherwise `baseIteratee`.\n  function cb(value, context, argCount) {\n    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);\n    return baseIteratee(value, context, argCount);\n  }\n\n  // Returns the results of applying the `iteratee` to each element of `obj`.\n  // In contrast to `_.map` it returns an object.\n  function mapObject(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var _keys = keys(obj),\n        length = _keys.length,\n        results = {};\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys[index];\n      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  }\n\n  // Predicate-generating function. Often useful outside of Underscore.\n  function noop(){}\n\n  // Generates a function for a given object that returns a given property.\n  function propertyOf(obj) {\n    if (obj == null) return noop;\n    return function(path) {\n      return get(obj, path);\n    };\n  }\n\n  // Run a function **n** times.\n  function times(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  }\n\n  // Return a random integer between `min` and `max` (inclusive).\n  function random(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  }\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  var now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n  // Internal helper to generate functions for escaping and unescaping strings\n  // to/from HTML interpolation.\n  function createEscaper(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped.\n    var source = '(?:' + keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  }\n\n  // Internal list of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n\n  // Function for escaping strings to HTML interpolation.\n  var _escape = createEscaper(escapeMap);\n\n  // Internal list of HTML entities for unescaping.\n  var unescapeMap = invert(escapeMap);\n\n  // Function for unescaping strings from HTML interpolation.\n  var _unescape = createEscaper(unescapeMap);\n\n  // By default, Underscore uses ERB-style template delimiters. Change the\n  // following template settings to use alternative delimiters.\n  var templateSettings = _$1.templateSettings = {\n    evaluate: /<%([\\s\\S]+?)%>/g,\n    interpolate: /<%=([\\s\\S]+?)%>/g,\n    escape: /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `_.templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\": \"'\",\n    '\\\\': '\\\\',\n    '\\r': 'r',\n    '\\n': 'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  function escapeChar(match) {\n    return '\\\\' + escapes[match];\n  }\n\n  // In order to prevent third-party code injection through\n  // `_.templateSettings.variable`, we test it against the following regular\n  // expression. It is intentionally a bit more liberal than just matching valid\n  // identifiers, but still prevents possible loopholes through defaults or\n  // destructuring assignment.\n  var bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  function template(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = defaults({}, settings, _$1.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offset.\n      return match;\n    });\n    source += \"';\\n\";\n\n    var argument = settings.variable;\n    if (argument) {\n      // Insure against third-party code injection. (CVE-2021-23358)\n      if (!bareIdentifier.test(argument)) throw new Error(\n        'variable is not a bare identifier: ' + argument\n      );\n    } else {\n      // If a variable is not specified, place data values in local scope.\n      source = 'with(obj||{}){\\n' + source + '}\\n';\n      argument = 'obj';\n    }\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    var render;\n    try {\n      render = new Function(argument, '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _$1);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  }\n\n  // Traverses the children of `obj` along `path`. If a child is a function, it\n  // is invoked with its parent as context. Returns the value of the final\n  // child, or `fallback` if any child is undefined.\n  function result(obj, path, fallback) {\n    path = toPath(path);\n    var length = path.length;\n    if (!length) {\n      return isFunction$1(fallback) ? fallback.call(obj) : fallback;\n    }\n    for (var i = 0; i < length; i++) {\n      var prop = obj == null ? void 0 : obj[path[i]];\n      if (prop === void 0) {\n        prop = fallback;\n        i = length; // Ensure we don't continue iterating.\n      }\n      obj = isFunction$1(prop) ? prop.call(obj) : prop;\n    }\n    return obj;\n  }\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  function uniqueId(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  }\n\n  // Start chaining a wrapped Underscore object.\n  function chain(obj) {\n    var instance = _$1(obj);\n    instance._chain = true;\n    return instance;\n  }\n\n  // Internal function to execute `sourceFunc` bound to `context` with optional\n  // `args`. Determines whether to execute a function as a constructor or as a\n  // normal function.\n  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (isObject(result)) return result;\n    return self;\n  }\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. `_` acts\n  // as a placeholder by default, allowing any combination of arguments to be\n  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\n  var partial = restArguments(function(func, boundArgs) {\n    var placeholder = partial.placeholder;\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  });\n\n  partial.placeholder = _$1;\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally).\n  var bind = restArguments(function(func, context, args) {\n    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');\n    var bound = restArguments(function(callArgs) {\n      return executeBound(func, bound, context, this, args.concat(callArgs));\n    });\n    return bound;\n  });\n\n  // Internal helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object.\n  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var isArrayLike = createSizePropertyCheck(getLength);\n\n  // Internal implementation of a recursive `flatten` function.\n  function flatten$1(input, depth, strict) {\n    if (!depth && depth !== 0) depth = Infinity;\n    var output = [], idx = 0, i = 0, length = getLength(input) || 0, stack = [];\n    while (true) {\n      if (i >= length) {\n        if (!stack.length) break;\n        var frame = stack.pop();\n        i = frame.i;\n        input = frame.v;\n        length = getLength(input);\n        continue;\n      }\n      var value = input[i++];\n      if (stack.length >= depth) {\n        output[idx++] = value;\n      } else if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {\n        // Flatten current level of array or arguments object.\n        stack.push({i: i, v: input});\n        i = 0;\n        input = value;\n        length = getLength(input);\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  }\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  var bindAll = restArguments(function(obj, keys) {\n    keys = flatten$1(keys, false, false);\n    var index = keys.length;\n    if (index < 1) throw new Error('bindAll must be passed function names');\n    while (index--) {\n      var key = keys[index];\n      obj[key] = bind(obj[key], obj);\n    }\n    return obj;\n  });\n\n  // Memoize an expensive function by storing its results.\n  function memoize(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  }\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  var delay = restArguments(function(func, wait, args) {\n    return setTimeout(function() {\n      return func.apply(null, args);\n    }, wait);\n  });\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  var defer = partial(delay, _$1, 1);\n\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  function throttle(func, wait, options) {\n    var timeout, context, args, result;\n    var previous = 0;\n    if (!options) options = {};\n\n    var later = function() {\n      previous = options.leading === false ? 0 : now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n\n    var throttled = function() {\n      var _now = now();\n      if (!previous && options.leading === false) previous = _now;\n      var remaining = wait - (_now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = _now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n\n    throttled.cancel = function() {\n      clearTimeout(timeout);\n      previous = 0;\n      timeout = context = args = null;\n    };\n\n    return throttled;\n  }\n\n  // When a sequence of calls of the returned function ends, the argument\n  // function is triggered. The end of a sequence is defined by the `wait`\n  // parameter. If `immediate` is passed, the argument function will be\n  // triggered at the beginning of the sequence instead of at the end.\n  function debounce(func, wait, immediate) {\n    var timeout, previous, args, result, context;\n\n    var later = function() {\n      var passed = now() - previous;\n      if (wait > passed) {\n        timeout = setTimeout(later, wait - passed);\n      } else {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n        // This check is needed because `func` can recursively invoke `debounced`.\n        if (!timeout) args = context = null;\n      }\n    };\n\n    var debounced = restArguments(function(_args) {\n      context = this;\n      args = _args;\n      previous = now();\n      if (!timeout) {\n        timeout = setTimeout(later, wait);\n        if (immediate) result = func.apply(context, args);\n      }\n      return result;\n    });\n\n    debounced.cancel = function() {\n      clearTimeout(timeout);\n      timeout = args = context = null;\n    };\n\n    return debounced;\n  }\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  function wrap(func, wrapper) {\n    return partial(wrapper, func);\n  }\n\n  // Returns a negated version of the passed-in predicate.\n  function negate(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  }\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  function compose() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  }\n\n  // Returns a function that will only be executed on and after the Nth call.\n  function after(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  }\n\n  // Returns a function that will only be executed up to (but not including) the\n  // Nth call.\n  function before(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  }\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  var once = partial(before, 2);\n\n  // Returns the first key on an object that passes a truth test.\n  function findKey(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = keys(obj), key;\n    for (var i = 0, length = _keys.length; i < length; i++) {\n      key = _keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  }\n\n  // Internal function to generate `_.findIndex` and `_.findLastIndex`.\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a truth test.\n  var findIndex = createPredicateIndexFinder(1);\n\n  // Returns the last index on an array-like that passes a truth test.\n  var findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  function sortedIndex(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  }\n\n  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n          i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), isNaN$1);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  var indexOf = createIndexFinder(1, findIndex, sortedIndex);\n\n  // Return the position of the last occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n  // Return the first value which passes a truth test.\n  function find(obj, predicate, context) {\n    var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n    var key = keyFinder(obj, predicate, context);\n    if (key !== void 0 && key !== -1) return obj[key];\n  }\n\n  // Convenience version of a common use case of `_.find`: getting the first\n  // object containing specific `key:value` pairs.\n  function findWhere(obj, attrs) {\n    return find(obj, matcher(attrs));\n  }\n\n  // The cornerstone for collection functions, an `each`\n  // implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  function each(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var _keys = keys(obj);\n      for (i = 0, length = _keys.length; i < length; i++) {\n        iteratee(obj[_keys[i]], _keys[i], obj);\n      }\n    }\n    return obj;\n  }\n\n  // Return the results of applying the iteratee to each element.\n  function map(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  }\n\n  // Internal helper to create a reducing function, iterating left or right.\n  function createReduce(dir) {\n    // Wrap code that reassigns argument variables in a separate function than\n    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n    var reducer = function(obj, iteratee, memo, initial) {\n      var _keys = !isArrayLike(obj) && keys(obj),\n          length = (_keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      if (!initial) {\n        memo = obj[_keys ? _keys[index] : index];\n        index += dir;\n      }\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = _keys ? _keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    };\n\n    return function(obj, iteratee, memo, context) {\n      var initial = arguments.length >= 3;\n      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  var reduce = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  var reduceRight = createReduce(-1);\n\n  // Return all the elements that pass a truth test.\n  function filter(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  }\n\n  // Return all the elements for which a truth test fails.\n  function reject(obj, predicate, context) {\n    return filter(obj, negate(cb(predicate)), context);\n  }\n\n  // Determine whether all of the elements pass a truth test.\n  function every(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  }\n\n  // Determine if at least one element in the object passes a truth test.\n  function some(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  }\n\n  // Determine if the array or object contains a given item (using `===`).\n  function contains(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return indexOf(obj, item, fromIndex) >= 0;\n  }\n\n  // Invoke a method (with arguments) on every item in a collection.\n  var invoke = restArguments(function(obj, path, args) {\n    var contextPath, func;\n    if (isFunction$1(path)) {\n      func = path;\n    } else {\n      path = toPath(path);\n      contextPath = path.slice(0, -1);\n      path = path[path.length - 1];\n    }\n    return map(obj, function(context) {\n      var method = func;\n      if (!method) {\n        if (contextPath && contextPath.length) {\n          context = deepGet(context, contextPath);\n        }\n        if (context == null) return void 0;\n        method = context[path];\n      }\n      return method == null ? method : method.apply(context, args);\n    });\n  });\n\n  // Convenience version of a common use case of `_.map`: fetching a property.\n  function pluck(obj, key) {\n    return map(obj, property(key));\n  }\n\n  // Convenience version of a common use case of `_.filter`: selecting only\n  // objects containing specific `key:value` pairs.\n  function where(obj, attrs) {\n    return filter(obj, matcher(attrs));\n  }\n\n  // Return the maximum element (or element-based computation).\n  function max(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n      obj = isArrayLike(obj) ? obj : values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value != null && value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      each(obj, function(v, index, list) {\n        computed = iteratee(v, index, list);\n        if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n          result = v;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  }\n\n  // Return the minimum element (or element-based computation).\n  function min(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n      obj = isArrayLike(obj) ? obj : values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value != null && value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      each(obj, function(v, index, list) {\n        computed = iteratee(v, index, list);\n        if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n          result = v;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  }\n\n  // Safely create a real, live array from anything iterable.\n  var reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n  function toArray(obj) {\n    if (!obj) return [];\n    if (isArray(obj)) return slice.call(obj);\n    if (isString(obj)) {\n      // Keep surrogate pair characters together.\n      return obj.match(reStrSymbol);\n    }\n    if (isArrayLike(obj)) return map(obj, identity);\n    return values(obj);\n  }\n\n  // Sample **n** random values from a collection using the modern version of the\n  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `_.map`.\n  function sample(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = values(obj);\n      return obj[random(obj.length - 1)];\n    }\n    var sample = toArray(obj);\n    var length = getLength(sample);\n    n = Math.max(Math.min(n, length), 0);\n    var last = length - 1;\n    for (var index = 0; index < n; index++) {\n      var rand = random(index, last);\n      var temp = sample[index];\n      sample[index] = sample[rand];\n      sample[rand] = temp;\n    }\n    return sample.slice(0, n);\n  }\n\n  // Shuffle a collection.\n  function shuffle(obj) {\n    return sample(obj, Infinity);\n  }\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  function sortBy(obj, iteratee, context) {\n    var index = 0;\n    iteratee = cb(iteratee, context);\n    return pluck(map(obj, function(value, key, list) {\n      return {\n        value: value,\n        index: index++,\n        criteria: iteratee(value, key, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  }\n\n  // An internal function used for aggregate \"group by\" operations.\n  function group(behavior, partition) {\n    return function(obj, iteratee, context) {\n      var result = partition ? [[], []] : {};\n      iteratee = cb(iteratee, context);\n      each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  }\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  var groupBy = group(function(result, value, key) {\n    if (has$1(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n  // when you know that your index values will be unique.\n  var indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  var countBy = group(function(result, value, key) {\n    if (has$1(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Split a collection into two arrays: one whose elements all pass the given\n  // truth test, and one whose elements all do not pass the truth test.\n  var partition = group(function(result, value, pass) {\n    result[pass ? 0 : 1].push(value);\n  }, true);\n\n  // Return the number of elements in a collection.\n  function size(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : keys(obj).length;\n  }\n\n  // Internal `_.pick` helper function to determine whether `key` is an enumerable\n  // property name of `obj`.\n  function keyInObj(value, key, obj) {\n    return key in obj;\n  }\n\n  // Return a copy of the object only containing the allowed properties.\n  var pick = restArguments(function(obj, keys) {\n    var result = {}, iteratee = keys[0];\n    if (obj == null) return result;\n    if (isFunction$1(iteratee)) {\n      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n      keys = allKeys(obj);\n    } else {\n      iteratee = keyInObj;\n      keys = flatten$1(keys, false, false);\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  });\n\n  // Return a copy of the object without the disallowed properties.\n  var omit = restArguments(function(obj, keys) {\n    var iteratee = keys[0], context;\n    if (isFunction$1(iteratee)) {\n      iteratee = negate(iteratee);\n      if (keys.length > 1) context = keys[1];\n    } else {\n      keys = map(flatten$1(keys, false, false), String);\n      iteratee = function(value, key) {\n        return !contains(keys, key);\n      };\n    }\n    return pick(obj, iteratee, context);\n  });\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  function initial(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  }\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  function first(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n    if (n == null || guard) return array[0];\n    return initial(array, array.length - n);\n  }\n\n  // Returns everything but the first entry of the `array`. Especially useful on\n  // the `arguments` object. Passing an **n** will return the rest N values in the\n  // `array`.\n  function rest(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  }\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  function last(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n    if (n == null || guard) return array[array.length - 1];\n    return rest(array, Math.max(0, array.length - n));\n  }\n\n  // Trim out all falsy values from an array.\n  function compact(array) {\n    return filter(array, Boolean);\n  }\n\n  // Flatten out an array, either recursively (by default), or up to `depth`.\n  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\n  function flatten(array, depth) {\n    return flatten$1(array, depth, false);\n  }\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  var difference = restArguments(function(array, rest) {\n    rest = flatten$1(rest, true, true);\n    return filter(array, function(value){\n      return !contains(rest, value);\n    });\n  });\n\n  // Return a version of the array that does not contain the specified value(s).\n  var without = restArguments(function(array, otherArrays) {\n    return difference(array, otherArrays);\n  });\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // The faster algorithm will not work with an iteratee if the iteratee\n  // is not a one-to-one function, so providing an iteratee will disable\n  // the faster algorithm.\n  function uniq(array, isSorted, iteratee, context) {\n    if (!isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted && !iteratee) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  var union = restArguments(function(arrays) {\n    return uniq(flatten$1(arrays, true, true));\n  });\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  function intersection(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (contains(result, item)) continue;\n      var j;\n      for (j = 1; j < argsLength; j++) {\n        if (!contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  }\n\n  // Complement of zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices.\n  function unzip(array) {\n    var length = (array && max(array, getLength).length) || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = pluck(array, index);\n    }\n    return result;\n  }\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  var zip = restArguments(unzip);\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.\n  function object(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  }\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](https://docs.python.org/library/functions.html#range).\n  function range(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    if (!step) {\n      step = stop < start ? -1 : 1;\n    }\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  }\n\n  // Chunk a single array into multiple arrays, each containing `count` or fewer\n  // items.\n  function chunk(array, count) {\n    if (count == null || count < 1) return [];\n    var result = [];\n    var i = 0, length = array.length;\n    while (i < length) {\n      result.push(slice.call(array, i, i += count));\n    }\n    return result;\n  }\n\n  // Helper function to continue chaining intermediate results.\n  function chainResult(instance, obj) {\n    return instance._chain ? _$1(obj).chain() : obj;\n  }\n\n  // Add your own custom functions to the Underscore object.\n  function mixin(obj) {\n    each(functions(obj), function(name) {\n      var func = _$1[name] = obj[name];\n      _$1.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return chainResult(this, func.apply(_$1, args));\n      };\n    });\n    return _$1;\n  }\n\n  // Add all mutator `Array` functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) {\n        method.apply(obj, arguments);\n        if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n          delete obj[0];\n        }\n      }\n      return chainResult(this, obj);\n    };\n  });\n\n  // Add all accessor `Array` functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) obj = method.apply(obj, arguments);\n      return chainResult(this, obj);\n    };\n  });\n\n  // Named Exports\n\n  var allExports = {\n    __proto__: null,\n    VERSION: VERSION,\n    restArguments: restArguments,\n    isObject: isObject,\n    isNull: isNull,\n    isUndefined: isUndefined,\n    isBoolean: isBoolean,\n    isElement: isElement,\n    isString: isString,\n    isNumber: isNumber,\n    isDate: isDate,\n    isRegExp: isRegExp,\n    isError: isError,\n    isSymbol: isSymbol,\n    isArrayBuffer: isArrayBuffer,\n    isDataView: isDataView$1,\n    isArray: isArray,\n    isFunction: isFunction$1,\n    isArguments: isArguments$1,\n    isFinite: isFinite$1,\n    isNaN: isNaN$1,\n    isTypedArray: isTypedArray$1,\n    isEmpty: isEmpty,\n    isMatch: isMatch,\n    isEqual: isEqual,\n    isMap: isMap,\n    isWeakMap: isWeakMap,\n    isSet: isSet,\n    isWeakSet: isWeakSet,\n    keys: keys,\n    allKeys: allKeys,\n    values: values,\n    pairs: pairs,\n    invert: invert,\n    functions: functions,\n    methods: functions,\n    extend: extend,\n    extendOwn: extendOwn,\n    assign: extendOwn,\n    defaults: defaults,\n    create: create,\n    clone: clone,\n    tap: tap,\n    get: get,\n    has: has,\n    mapObject: mapObject,\n    identity: identity,\n    constant: constant,\n    noop: noop,\n    toPath: toPath$1,\n    property: property,\n    propertyOf: propertyOf,\n    matcher: matcher,\n    matches: matcher,\n    times: times,\n    random: random,\n    now: now,\n    escape: _escape,\n    unescape: _unescape,\n    templateSettings: templateSettings,\n    template: template,\n    result: result,\n    uniqueId: uniqueId,\n    chain: chain,\n    iteratee: iteratee,\n    partial: partial,\n    bind: bind,\n    bindAll: bindAll,\n    memoize: memoize,\n    delay: delay,\n    defer: defer,\n    throttle: throttle,\n    debounce: debounce,\n    wrap: wrap,\n    negate: negate,\n    compose: compose,\n    after: after,\n    before: before,\n    once: once,\n    findKey: findKey,\n    findIndex: findIndex,\n    findLastIndex: findLastIndex,\n    sortedIndex: sortedIndex,\n    indexOf: indexOf,\n    lastIndexOf: lastIndexOf,\n    find: find,\n    detect: find,\n    findWhere: findWhere,\n    each: each,\n    forEach: each,\n    map: map,\n    collect: map,\n    reduce: reduce,\n    foldl: reduce,\n    inject: reduce,\n    reduceRight: reduceRight,\n    foldr: reduceRight,\n    filter: filter,\n    select: filter,\n    reject: reject,\n    every: every,\n    all: every,\n    some: some,\n    any: some,\n    contains: contains,\n    includes: contains,\n    include: contains,\n    invoke: invoke,\n    pluck: pluck,\n    where: where,\n    max: max,\n    min: min,\n    shuffle: shuffle,\n    sample: sample,\n    sortBy: sortBy,\n    groupBy: groupBy,\n    indexBy: indexBy,\n    countBy: countBy,\n    partition: partition,\n    toArray: toArray,\n    size: size,\n    pick: pick,\n    omit: omit,\n    first: first,\n    head: first,\n    take: first,\n    initial: initial,\n    last: last,\n    rest: rest,\n    tail: rest,\n    drop: rest,\n    compact: compact,\n    flatten: flatten,\n    without: without,\n    uniq: uniq,\n    unique: uniq,\n    union: union,\n    intersection: intersection,\n    difference: difference,\n    unzip: unzip,\n    transpose: unzip,\n    zip: zip,\n    object: object,\n    range: range,\n    chunk: chunk,\n    mixin: mixin,\n    'default': _$1\n  };\n\n  // Default Export\n\n  // Add all of the Underscore functions to the wrapper object.\n  var _ = mixin(allExports);\n  // Legacy Node.js API.\n  _._ = _;\n\n  return _;\n\n})));\n//# sourceMappingURL=underscore-umd.js.map\n\n\nfunction PaintMap() {\n    var self = this;\n    var loop = new Loop();\n    var viewport = new Viewport();\n\n    this.el = document.querySelector('.js-paint-map');\n    this.link = document.querySelectorAll('.js-paint-map__link');\n    this.item = document.querySelector('.js-paint-item');\n    this.itemData = {\n        title: document.querySelector('.paint-item__title'),\n        location: document.querySelector('.paint-item__location'),\n        text: document.querySelector('.paint-item__text'),\n        url: document.querySelector('.paint-item__url')\n    }\n\n    this.breakpoint = 860;\n\n    this.exists = function() {\n        return this.el != undefined;\n    }\n\n    this.init = function() {\n        loop.array(this.link, function(links, i) {\n            var link = links[i];\n\n            link.onclick = self.update.bind(self, link);\n        });\n\n        console.log(window.innerWidth);\n        if (window.innerWidth > this.breakpoint) {\n            this.link[Math.floor((Math.random() * this.link.length) + 1)].click();\n        }\n\n        this.el.onclick = this.deactivate.bind(this);\n        this.item.onclick = function(e) {\n            e.stopPropagation();\n        }\n    }\n\n    this.update = function(link, e) {\n        this.deactivate();\n        this.activate(link, e);\n    }\n\n    this.activate = function(link, e) {\n        if (e) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n\n        if (window.innerWidth > this.breakpoint) {\n            var xDirection = parseInt(link.style.left) > 50 ? 'right' : 'left' ;\n            var yDirection = parseInt(link.style.top) > 50 ? 'bottom' : 'top' ;\n\n            link.classList.add('paint-map__link--active');\n            this.item.classList.add('paint-item--active');\n            this.item.classList.add('paint-item--' + xDirection);\n            this.item.classList.add('paint-item--' + yDirection);\n\n            this.position(link.style.top, link.style.left);\n\n            var result = _.find(paintMapResults, function(result) {\n                return result.id == link.getAttribute('data-id')\n            });\n\n            loop.object(this.itemData, function(keys, i) {\n                if (keys[i] == 'url') {\n                    self.itemData[keys[i]].href = result[keys[i]];\n                    self.itemData[keys[i]].innerHTML = 'View ' + result.title;\n                } else {\n                    self.itemData[keys[i]].innerHTML = result[keys[i]];\n                }\n            });\n        }\n    }\n\n    this.deactivate = function() {\n        var link = document.querySelector('.paint-map__link--active');\n\n        if (link) {\n            link.classList.remove('paint-map__link--active');\n        }\n\n        this.item.classList.remove('paint-item--active');\n        this.item.classList.remove('paint-item--top');\n        this.item.classList.remove('paint-item--right');\n        this.item.classList.remove('paint-item--bottom');\n        this.item.classList.remove('paint-item--left');\n    }\n\n    this.position = function(top, left) {\n        this.item.style.top = top;\n        this.item.style.left = left;\n    }\n}\n\nvar paintMap = new PaintMap();\n\nif (paintMap.exists()) {\n    paintMap.init();\n}\n\nAndrewMartin.carousels = [];\n\nAndrewMartin.carousel = () => {\n\n    const activeButton = '<button class=\"slick-polygon-button\">' +\n                            '<svg width=\"30px\" height=\"30px\" viewBox=\"0 0 30 30\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n                                '<polygon id=\"path-1\" points=\"15 0 14.3169392 1.99095879 1.99095879 14.3162292 0 15 1.99095879 15.6834158 14.3169392 28.0090412 15 30 15.6834158 28.0090412 28.0090412 15.6834158 30 15 28.0090412 14.3162292 15.6834158 1.99095879\"></polygon>' +\n                            '</svg>' +\n                        '</button>';\n\n    // Hero carousel\n    document.querySelectorAll('.js-carousel--hero').forEach((el, i) => {\n        el.classList.add('js-carousel--hero-' + i);\n\n        let carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            adaptiveHeight: true,\n            autoplay: true,\n            autoplaySpeed: 7000,\n            fade: true,\n            speed: 300,\n            pauseOnHover: false,\n            pauseOnFocus: false\n        }, 'hero-' + i);\n\n        $(el).on(('init reInit afterChange'), (event, slick, currentSlide) => {\n            const activeSlideIndex = typeof currentSlide === 'undefined' ? 0 : currentSlide;\n            const currentSlideElement = $(slick.$slides[activeSlideIndex]);\n            const heroItemRightExists = currentSlideElement.find('.hero__item--right').length > 0;\n            const slickDots = $(slick.$dots);\n\n            if (heroItemRightExists) {\n                slickDots.addClass('slick-dots--left');\n                slickDots.removeClass('slick-dots--right');\n            } else {\n                slickDots.addClass('slick-dots--right');\n                slickDots.removeClass('slick-dots--left');\n            }\n\n            const heroItem = currentSlideElement.get(0).querySelector('.hero__item');\n\n            if (heroItem && !heroItem.dataset.seen) {\n                const observer = new IntersectionObserver(([entry]) => {\n                    if (entry.isIntersecting) {\n                        heroItem.dataset.seen = true;\n\n                        window.dataLayer.push({\n                            event: 'hero_banner_view',\n                            hero_banner_id: heroItem.dataset.gaId,\n                            hero_banner: heroItem.dataset.gaLabel,\n                            hero_banner_position: activeSlideIndex,\n                        });\n\n                        observer.disconnect();\n                    }\n                });\n\n                observer.observe(currentSlideElement.get(0));\n            }\n        });\n\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Quote carousel\n    document.querySelectorAll('.js-carousel--quote').forEach((el, i) => {\n        el.classList.add('js-carousel--quote-' + i);\n\n        let carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'quote-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Review carousel\n    document.querySelectorAll('.js-carousel--reviews').forEach((el, i) => {\n        el.classList.add('js-carousel--reviews-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.overlay-reviews__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 4,\n            slidesToScroll: 4,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: {\n                        slidesToShow: 1.5,\n                        slidesToScroll: 1,\n                    }\n                }\n            ],\n            autoplay: false,\n            speed: 1000\n        }, 'reviews-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Design review carousel\n    document.querySelectorAll('.js-carousel--design-review').forEach((el, i) => {\n        el.classList.add('js-carousel--design-review-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 6,\n            responsive: [\n                {\n                    breakpoint: 1920,\n                    settings: {\n                        slidesToShow: 5,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 1680,\n                    settings: {\n                        slidesToShow: 4,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1\n                    }\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: false,\n            speed: 1000\n        }, 'design-review-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Complete the look carousel (carbon copy of above)\n    document.querySelectorAll('.js-carousel--product-recommended').forEach((el, i) => {\n\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-recommended-' + i);\n\n        const title = el.previousElementSibling;\n\n        let carousel = new Carousel({\n            appendArrows: $(title),\n            slidesToShow: 4,\n            swipeToSlide: true,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1,\n                        swipeToSlide: true,\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick',\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: false,\n            speed: 200\n        }, 'product-recommended-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Get inspired carousel\n    document.querySelectorAll('.js-carousel--inspired').forEach((el, i) => {\n        el.classList.add('js-carousel--inspired-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'inspired-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n      // Split Feature block carousel\n      document.querySelectorAll('.js-carousel--split-feature').forEach((el, i) => {\n        el.classList.add('js-carousel--split-feature-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            swipe: true,\n            autoplay: true,\n            fade: true,\n            speed: 1000\n        }, 'split-feature-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n     // PDP callout carousel\n     document.querySelectorAll('.js-carousel--product').forEach((el, i) => {\n        el.classList.add('js-carousel--product-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 300\n        }, 'product-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP mobile gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            dots: true,\n            filter: {\n                selector: function() { return $('.slick-show', this).length === 1; },\n                breakpoint: AndrewMartin.breakpoints.tablet.size\n            },\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: true,\n            cssEase: 'linear',\n            speed: 100\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery-v2').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        const prevButton = document.querySelector('[data-mobile-prev]');\n        const nextButton = document.querySelector('[data-mobile-next]');\n        const count = document.querySelector('[data-carousel-count]');\n\n        if (window.matchMedia('(max-width: 999px)').matches && (nextButton || prevButton)) {\n            prevButton.addEventListener('click', () => {\n                $(el).slick('slickPrev');\n            })\n\n            nextButton.addEventListener('click', () => {\n                $(el).slick('slickNext');\n            })\n\n            $(el).on('init reInit afterChange', (event, slick, currentSlide) => {\n                //currentSlide is undefined on init -- set it to 0 in this case (currentSlide is 0 based)\n                const i = (currentSlide ? currentSlide : 0) + 1;\n\n                count.innerText = `${i}/${slick.slideCount}`\n            });\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            mobileFirst: true,\n            dots: false,\n            fade: true,\n            cssEase: 'linear',\n            asNavFor: '.js-carousel--product-thumbnails',\n            speed: 100,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        swipe: false,\n                    },\n                },\n            ],\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            $(el).slick('slickFilter', function() {\n                return $('.slick-show', this).length === 1;\n            });\n        }\n    });\n\n    // PDP thumbnails\n    document.querySelectorAll('.js-carousel--product-thumbnails').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-thumbnails-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 4.5,\n            asNavFor: '.js-carousel--product-gallery-v2',\n            focusOnSelect: true,\n            infinite: false,\n            dots: false,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: \"unslick\",\n                },\n            ],\n        }, 'product-thumbnails-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Categories Block Carousel\n    document.querySelectorAll('.js-carousel--categories').forEach((el, i) => {\n        el.classList.add('js-carousel--categories-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.categories-carousel__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 3.75,\n            slidesToScroll: 1,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3.3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2.3,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick'\n                }\n            ],\n            autoplay: false,\n            speed: 200\n        }, 'categories-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n}\n\n//=require js-tools/svg.js\n\nAndrewMartin.pswp = null;\n\nAndrewMartin.photoswipe = () => {\n    const photoswipeEl = document.querySelector('[data-photoswipe]');\n\n    if (!photoswipeEl) {\n        return;\n    }\n\n    const dataSourceImages = JSON.parse(photoswipeEl?.dataset.photoswipe);\n\n    const photoSwipeButtons = photoswipeEl.querySelectorAll(\n        'button.photoswipe-gallery'\n    );\n\n    const svg = new Svg();\n\n    const leftArrow = svg.render('icon-arrow-large-left');\n\n    const rightArrow = svg.render('icon-arrow-large-right');\n\n    const options = {\n        dataSource: dataSourceImages,\n        showHideAnimationType: 'none',\n        arrowPrevSVG: leftArrow,\n        arrowNextSVG: rightArrow,\n    };\n\n    const initButton = (e) => {\n        e.stopPropagation();\n\n        const button = e.currentTarget;\n\n        // Retrieve the index from the button's data attribute\n        const clickedIndex = parseInt(button.dataset.photoswipeId, 10);\n\n        if (!isNaN(clickedIndex) && dataSourceImages[clickedIndex]) {\n            options.index = clickedIndex; // Set the correct start slide index\n\n            if (AndrewMartin.pswp) {\n                AndrewMartin.pswp.destroy(); // Destroy the previous instance if it exists\n            }\n\n            AndrewMartin.pswp = new PhotoSwipe(options);\n            AndrewMartin.pswp.init(); // Initialize the PhotoSwipe instance\n        } else {\n            console.error(\n                'Invalid index or image not found in PhotoSwipe data source.'\n            );\n        }\n    };\n\n    for (const button of photoSwipeButtons) {\n        button.addEventListener('click', initButton);\n    }\n};\n\nAndrewMartin.siteNoticeMessages = [];\nAndrewMartin.siteNotice = () => {\n    AndrewMartin.siteNoticeMessages = document.querySelectorAll('.js-header-message');\n\n    function loopMessages(active)  {\n        if (AndrewMartin.siteNoticeMessages.length) {\n            AndrewMartin.siteNoticeMessages.forEach((m) => {\n                m.classList.add('notice__content--hidden');\n            })\n\n            AndrewMartin.siteNoticeMessages[active].classList.remove('notice__content--hidden')\n\n            if (++active >= AndrewMartin.siteNoticeMessages.length) {\n                active = 0;\n            }\n\n            setTimeout(() => {\n                loopMessages(active)\n            }, 7000)\n        }\n    }\n\n    if (AndrewMartin.siteNoticeMessages.length) {\n        loopMessages(0);\n    }\n}\n\nAndrewMartin.bloomreach = () => {\n    $('.js-bloomreach-identify').on('submit', function() {\n        if (typeof exponea === 'undefined') {\n            console.error('Bloomreach not initialised');\n            return true;\n        }\n\n        const email = $(this).find('input[name$=\"email\"]').val() || $(this).find('input[name$=\"email]\"]').val();\n\n        if (!email) {\n            console.error('No email address to send to bloomreach');\n            return true;\n        }\n\n        exponea.identify(\n            {\n              'email_id': email\n            },\n            {\n              'email': email\n            }\n        );\n\n        return true;\n    });\n}\n\nAndrewMartin.klaviyo = () => {\n    !function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return\"push\"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t=\"function\"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();\n\n    const form = document.querySelector('.js-klaviyo-identify');\n\n    if (!form) {\n        console.error('Klaviyo form not found');\n        return;\n    }\n\n    form.addEventListener('submit', (event) => {\n        if (typeof klaviyo === 'undefined') {\n            console.error('Klaviyo not initialised');\n            return true;\n        }\n\n        const email = event.currentTarget.querySelector('input[name$=\"email\"]').value || event.currentTarget.querySelector('input[name$=\"email]\"]').value;\n\n        if (!email) {\n            console.error('No email address to send to klaviyo');\n            return true;\n        }\n\n        klaviyo.identify({\n            'email': email\n        }).then(() => {\n            console.log('Klaviyo identify success');\n        });\n\n        return true;\n    });\n}\n\n\n/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Neil Brayfield <neil@d3r.com>\n */\n$.fn.checkReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.change(function (e) {\n\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n\n/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Andy Hartley <andy.hartley@d3r.com>\n */\n$.fn.customCheckReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.change(function (e) {\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            if (e.isTrigger) {\n                return false;\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n\n/*! nouislider - 10.0.0 - 2017-05-28 14:52:48 */\r\n\r\n(function (factory) {\r\n\r\n    if ( typeof define === 'function' && define.amd ) {\r\n\r\n        // AMD. Register as an anonymous module.\r\n        define([], factory);\r\n\r\n    } else if ( typeof exports === 'object' ) {\r\n\r\n        // Node/CommonJS\r\n        module.exports = factory();\r\n\r\n    } else {\r\n\r\n        // Browser globals\r\n        window.noUiSlider = factory();\r\n    }\r\n\r\n}(function( ){\r\n\r\n\t'use strict';\r\n\r\n\tvar VERSION = '10.0.0';\r\n\r\n\r\n\tfunction isValidFormatter ( entry ) {\r\n\t\treturn typeof entry === 'object' && typeof entry.to === 'function' && typeof entry.from === 'function';\r\n\t}\r\n\r\n\tfunction removeElement ( el ) {\r\n\t\tel.parentElement.removeChild(el);\r\n\t}\r\n\r\n\t// Bindable version\r\n\tfunction preventDefault ( e ) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t// Removes duplicates from an array.\r\n\tfunction unique ( array ) {\r\n\t\treturn array.filter(function(a){\r\n\t\t\treturn !this[a] ? this[a] = true : false;\r\n\t\t}, {});\r\n\t}\r\n\r\n\t// Round a value to the closest 'to'.\r\n\tfunction closest ( value, to ) {\r\n\t\treturn Math.round(value / to) * to;\r\n\t}\r\n\r\n\t// Current position of an element relative to the document.\r\n\tfunction offset ( elem, orientation ) {\r\n\r\n\t\tvar rect = elem.getBoundingClientRect();\r\n\t\tvar doc = elem.ownerDocument;\r\n\t\tvar docElem = doc.documentElement;\r\n\t\tvar pageOffset = getPageOffset(doc);\r\n\r\n\t\t// getBoundingClientRect contains left scroll in Chrome on Android.\r\n\t\t// I haven't found a feature detection that proves this. Worst case\r\n\t\t// scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\r\n\t\tif ( /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) ) {\r\n\t\t\tpageOffset.x = 0;\r\n\t\t}\r\n\r\n\t\treturn orientation ? (rect.top + pageOffset.y - docElem.clientTop) : (rect.left + pageOffset.x - docElem.clientLeft);\r\n\t}\r\n\r\n\t// Checks whether a value is numerical.\r\n\tfunction isNumeric ( a ) {\r\n\t\treturn typeof a === 'number' && !isNaN( a ) && isFinite( a );\r\n\t}\r\n\r\n\t// Sets a class and removes it after [duration] ms.\r\n\tfunction addClassFor ( element, className, duration ) {\r\n\t\tif (duration > 0) {\r\n\t\taddClass(element, className);\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tremoveClass(element, className);\r\n\t\t\t}, duration);\r\n\t\t}\r\n\t}\r\n\r\n\t// Limits a value to 0 - 100\r\n\tfunction limit ( a ) {\r\n\t\treturn Math.max(Math.min(a, 100), 0);\r\n\t}\r\n\r\n\t// Wraps a variable as an array, if it isn't one yet.\r\n\t// Note that an input array is returned by reference!\r\n\tfunction asArray ( a ) {\r\n\t\treturn Array.isArray(a) ? a : [a];\r\n\t}\r\n\r\n\t// Counts decimals\r\n\tfunction countDecimals ( numStr ) {\r\n\t\tnumStr = String(numStr);\r\n\t\tvar pieces = numStr.split(\".\");\r\n\t\treturn pieces.length > 1 ? pieces[1].length : 0;\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#add_class\r\n\tfunction addClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.add(className);\r\n\t\t} else {\r\n\t\t\tel.className += ' ' + className;\r\n\t\t}\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#remove_class\r\n\tfunction removeClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.remove(className);\r\n\t\t} else {\r\n\t\t\tel.className = el.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n\t\t}\r\n\t}\r\n\r\n\t// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\r\n\tfunction hasClass ( el, className ) {\r\n\t\treturn el.classList ? el.classList.contains(className) : new RegExp('\\\\b' + className + '\\\\b').test(el.className);\r\n\t}\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\r\n\tfunction getPageOffset ( doc ) {\r\n\r\n\t\tvar supportPageOffset = window.pageXOffset !== undefined;\r\n\t\tvar isCSS1Compat = ((doc.compatMode || \"\") === \"CSS1Compat\");\r\n\t\tvar x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft;\r\n\t\tvar y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop;\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t}\r\n\r\n\t// we provide a function to compute constants instead\r\n\t// of accessing window.* as soon as the module needs it\r\n\t// so that we do not compute anything if not needed\r\n\tfunction getActions ( ) {\r\n\r\n\t\t// Determine the events to bind. IE11 implements pointerEvents without\r\n\t\t// a prefix, which breaks compatibility with the IE10 implementation.\r\n\t\treturn window.navigator.pointerEnabled ? {\r\n\t\t\tstart: 'pointerdown',\r\n\t\t\tmove: 'pointermove',\r\n\t\t\tend: 'pointerup'\r\n\t\t} : window.navigator.msPointerEnabled ? {\r\n\t\t\tstart: 'MSPointerDown',\r\n\t\t\tmove: 'MSPointerMove',\r\n\t\t\tend: 'MSPointerUp'\r\n\t\t} : {\r\n\t\t\tstart: 'mousedown touchstart',\r\n\t\t\tmove: 'mousemove touchmove',\r\n\t\t\tend: 'mouseup touchend'\r\n\t\t};\r\n\t}\r\n\r\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\t// Issue #785\r\n\tfunction getSupportsPassive ( ) {\r\n\r\n\t\tvar supportsPassive = false;\r\n\r\n\t\ttry {\r\n\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\tsupportsPassive = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\twindow.addEventListener('test', null, opts);\r\n\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supportsPassive;\r\n\t}\r\n\r\n\tfunction getSupportsTouchActionNone ( ) {\r\n\t\treturn window.CSS && CSS.supports && CSS.supports('touch-action', 'none');\r\n\t}\r\n\r\n\r\n// Value calculation\r\n\r\n\t// Determine the size of a sub-range in relation to a full range.\r\n\tfunction subRangeRatio ( pa, pb ) {\r\n\t\treturn (100 / (pb - pa));\r\n\t}\r\n\r\n\t// (percentage) How many percent is this value of this range?\r\n\tfunction fromPercentage ( range, value ) {\r\n\t\treturn (value * 100) / ( range[1] - range[0] );\r\n\t}\r\n\r\n\t// (percentage) Where is this value on this range?\r\n\tfunction toPercentage ( range, value ) {\r\n\t\treturn fromPercentage( range, range[0] < 0 ?\r\n\t\t\tvalue + Math.abs(range[0]) :\r\n\t\t\t\tvalue - range[0] );\r\n\t}\r\n\r\n\t// (value) How much is this percentage on this range?\r\n\tfunction isPercentage ( range, value ) {\r\n\t\treturn ((value * ( range[1] - range[0] )) / 100) + range[0];\r\n\t}\r\n\r\n\r\n// Range conversion\r\n\r\n\tfunction getJ ( value, arr ) {\r\n\r\n\t\tvar j = 1;\r\n\r\n\t\twhile ( value >= arr[j] ){\r\n\t\t\tj += 1;\r\n\t\t}\r\n\r\n\t\treturn j;\r\n\t}\r\n\r\n\t// (percentage) Input a value, find where, on a scale of 0-100, it applies.\r\n\tfunction toStepping ( xVal, xPct, value ) {\r\n\r\n\t\tif ( value >= xVal.slice(-1)[0] ){\r\n\t\t\treturn 100;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xVal ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn pa + (toPercentage([va, vb], value) / subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (value) Input a percentage, find where it is on the specified range.\r\n\tfunction fromStepping ( xVal, xPct, value ) {\r\n\r\n\t\t// There is no range group that fits 100\r\n\t\tif ( value >= 100 ){\r\n\t\t\treturn xVal.slice(-1)[0];\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn isPercentage([va, vb], (value - pa) * subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (percentage) Get the step that applies at a certain value.\r\n\tfunction getStep ( xPct, xSteps, snap, value ) {\r\n\r\n\t\tif ( value === 100 ) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), a, b;\r\n\r\n\t\t// If 'snap' is set, steps are used as fixed points on the slider.\r\n\t\tif ( snap ) {\r\n\r\n\t\t\ta = xPct[j-1];\r\n\t\t\tb = xPct[j];\r\n\r\n\t\t\t// Find the closest position, a or b.\r\n\t\t\tif ((value - a) > ((b-a)/2)){\r\n\t\t\t\treturn b;\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tif ( !xSteps[j-1] ){\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn xPct[j-1] + closest(\r\n\t\t\tvalue - xPct[j-1],\r\n\t\t\txSteps[j-1]\r\n\t\t);\r\n\t}\r\n\r\n\r\n// Entry parsing\r\n\r\n\tfunction handleEntryPoint ( index, value, that ) {\r\n\r\n\t\tvar percentage;\r\n\r\n\t\t// Wrap numerical input in an array.\r\n\t\tif ( typeof value === \"number\" ) {\r\n\t\t\tvalue = [value];\r\n\t\t}\r\n\r\n\t\t// Reject any invalid input, by testing whether value is an array.\r\n\t\tif ( Object.prototype.toString.call( value ) !== '[object Array]' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\r\n\t\t}\r\n\r\n\t\t// Covert min/max syntax to 0 and 100.\r\n\t\tif ( index === 'min' ) {\r\n\t\t\tpercentage = 0;\r\n\t\t} else if ( index === 'max' ) {\r\n\t\t\tpercentage = 100;\r\n\t\t} else {\r\n\t\t\tpercentage = parseFloat( index );\r\n\t\t}\r\n\r\n\t\t// Check for correct input.\r\n\t\tif ( !isNumeric( percentage ) || !isNumeric( value[0] ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\r\n\t\t}\r\n\r\n\t\t// Store values.\r\n\t\tthat.xPct.push( percentage );\r\n\t\tthat.xVal.push( value[0] );\r\n\r\n\t\t// NaN will evaluate to false too, but to keep\r\n\t\t// logging clear, set step explicitly. Make sure\r\n\t\t// not to override the 'step' setting with false.\r\n\t\tif ( !percentage ) {\r\n\t\t\tif ( !isNaN( value[1] ) ) {\r\n\t\t\t\tthat.xSteps[0] = value[1];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthat.xSteps.push( isNaN(value[1]) ? false : value[1] );\r\n\t\t}\r\n\r\n\t\tthat.xHighestCompleteStep.push(0);\r\n\t}\r\n\r\n\tfunction handleStepPoint ( i, n, that ) {\r\n\r\n\t\t// Ignore 'false' stepping.\r\n\t\tif ( !n ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Factor to range ratio\r\n\t\tthat.xSteps[i] = fromPercentage([\r\n\t\t\t that.xVal[i]\r\n\t\t\t,that.xVal[i+1]\r\n\t\t], n) / subRangeRatio (\r\n\t\t\tthat.xPct[i],\r\n\t\t\tthat.xPct[i+1] );\r\n\r\n\t\tvar totalSteps = (that.xVal[i+1] - that.xVal[i]) / that.xNumSteps[i];\r\n\t\tvar highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\r\n\t\tvar step = that.xVal[i] + (that.xNumSteps[i] * highestStep);\r\n\r\n\t\tthat.xHighestCompleteStep[i] = step;\r\n\t}\r\n\r\n\r\n// Interface\r\n\r\n\tfunction Spectrum ( entry, snap, singleStep ) {\r\n\r\n\t\tthis.xPct = [];\r\n\t\tthis.xVal = [];\r\n\t\tthis.xSteps = [ singleStep || false ];\r\n\t\tthis.xNumSteps = [ false ];\r\n\t\tthis.xHighestCompleteStep = [];\r\n\r\n\t\tthis.snap = snap;\r\n\r\n\t\tvar index, ordered = [ /* [0, 'min'], [1, '50%'], [2, 'max'] */ ];\r\n\r\n\t\t// Map the object keys to an array.\r\n\t\tfor ( index in entry ) {\r\n\t\t\tif ( entry.hasOwnProperty(index) ) {\r\n\t\t\t\tordered.push([entry[index], index]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sort all entries by value (numeric sort).\r\n\t\tif ( ordered.length && typeof ordered[0][0] === \"object\" ) {\r\n\t\t\tordered.sort(function(a, b) { return a[0][0] - b[0][0]; });\r\n\t\t} else {\r\n\t\t\tordered.sort(function(a, b) { return a[0] - b[0]; });\r\n\t\t}\r\n\r\n\r\n\t\t// Convert all entries to subranges.\r\n\t\tfor ( index = 0; index < ordered.length; index++ ) {\r\n\t\t\thandleEntryPoint(ordered[index][1], ordered[index][0], this);\r\n\t\t}\r\n\r\n\t\t// Store the actual step values.\r\n\t\t// xSteps is sorted in the same order as xPct and xVal.\r\n\t\tthis.xNumSteps = this.xSteps.slice(0);\r\n\r\n\t\t// Convert all numeric steps to the percentage of the subrange they represent.\r\n\t\tfor ( index = 0; index < this.xNumSteps.length; index++ ) {\r\n\t\t\thandleStepPoint(index, this.xNumSteps[index], this);\r\n\t\t}\r\n\t}\r\n\r\n\tSpectrum.prototype.getMargin = function ( value ) {\r\n\r\n\t\tvar step = this.xNumSteps[0];\r\n\r\n\t\tif ( step && ((value / step) % 1) !== 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit', 'margin' and 'padding' must be divisible by step.\");\r\n\t\t}\r\n\r\n\t\treturn this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false;\r\n\t};\r\n\r\n\tSpectrum.prototype.toStepping = function ( value ) {\r\n\r\n\t\tvalue = toStepping( this.xVal, this.xPct, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.fromStepping = function ( value ) {\r\n\r\n\t\treturn fromStepping( this.xVal, this.xPct, value );\r\n\t};\r\n\r\n\tSpectrum.prototype.getStep = function ( value ) {\r\n\r\n\t\tvalue = getStep(this.xPct, this.xSteps, this.snap, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.getNearbySteps = function ( value ) {\r\n\r\n\t\tvar j = getJ(value, this.xPct);\r\n\r\n\t\treturn {\r\n\t\t\tstepBefore: { startValue: this.xVal[j-2], step: this.xNumSteps[j-2], highestStep: this.xHighestCompleteStep[j-2] },\r\n\t\t\tthisStep: { startValue: this.xVal[j-1], step: this.xNumSteps[j-1], highestStep: this.xHighestCompleteStep[j-1] },\r\n\t\t\tstepAfter: { startValue: this.xVal[j-0], step: this.xNumSteps[j-0], highestStep: this.xHighestCompleteStep[j-0] }\r\n\t\t};\r\n\t};\r\n\r\n\tSpectrum.prototype.countStepDecimals = function () {\r\n\t\tvar stepDecimals = this.xNumSteps.map(countDecimals);\r\n\t\treturn Math.max.apply(null, stepDecimals);\r\n \t};\r\n\r\n\t// Outside testing\r\n\tSpectrum.prototype.convert = function ( value ) {\r\n\t\treturn this.getStep(this.toStepping(value));\r\n\t};\r\n\r\n/*\tEvery input option is tested and parsed. This'll prevent\r\n\tendless validation in internal methods. These tests are\r\n\tstructured with an item for every option available. An\r\n\toption can be marked as required by setting the 'r' flag.\r\n\tThe testing function is provided with three arguments:\r\n\t\t- The provided value for the option;\r\n\t\t- A reference to the options object;\r\n\t\t- The name for the option;\r\n\r\n\tThe testing function returns false when an error is detected,\r\n\tor true when everything is OK. It can also modify the option\r\n\tobject, to make sure all values can be correctly looped elsewhere. */\r\n\r\n\tvar defaultFormatter = { 'to': function( value ){\r\n\t\treturn value !== undefined && value.toFixed(2);\r\n\t}, 'from': Number };\r\n\r\n\tfunction validateFormat ( entry ) {\r\n\r\n\t\t// Any object with a to and from method is supported.\r\n\t\tif ( isValidFormatter(entry) ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\r\n\t}\r\n\r\n\tfunction testStep ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric( entry ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\r\n\t\t}\r\n\r\n\t\t// The step option can still be used to set stepping\r\n\t\t// for linear sliders. Overwritten if set in 'range'.\r\n\t\tparsed.singleStep = entry;\r\n\t}\r\n\r\n\tfunction testRange ( parsed, entry ) {\r\n\r\n\t\t// Filter incorrect input.\r\n\t\tif ( typeof entry !== 'object' || Array.isArray(entry) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\r\n\t\t}\r\n\r\n\t\t// Catch missing start or end.\r\n\t\tif ( entry.min === undefined || entry.max === undefined ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\r\n\t\t}\r\n\r\n\t\t// Catch equal start or end.\r\n\t\tif ( entry.min === entry.max ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\r\n\t\t}\r\n\r\n\t\tparsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\r\n\t}\r\n\r\n\tfunction testStart ( parsed, entry ) {\r\n\r\n\t\tentry = asArray(entry);\r\n\r\n\t\t// Validate input. Values aren't tested, as the public .val method\r\n\t\t// will always provide a valid location.\r\n\t\tif ( !Array.isArray( entry ) || !entry.length ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\r\n\t\t}\r\n\r\n\t\t// Store the number of handles.\r\n\t\tparsed.handles = entry.length;\r\n\r\n\t\t// When the slider is initialized, the .val method will\r\n\t\t// be called with the start options.\r\n\t\tparsed.start = entry;\r\n\t}\r\n\r\n\tfunction testSnap ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.snap = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimate ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.animate = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimationDuration ( parsed, entry ) {\r\n\r\n\t\tparsed.animationDuration = entry;\r\n\r\n\t\tif ( typeof entry !== 'number' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testConnect ( parsed, entry ) {\r\n\r\n\t\tvar connect = [false];\r\n\t\tvar i;\r\n\r\n\t\t// Map legacy options\r\n\t\tif ( entry === 'lower' ) {\r\n\t\t\tentry = [true, false];\r\n\t\t}\r\n\r\n\t\telse if ( entry === 'upper' ) {\r\n\t\t\tentry = [false, true];\r\n\t\t}\r\n\r\n\t\t// Handle boolean options\r\n\t\tif ( entry === true || entry === false ) {\r\n\r\n\t\t\tfor ( i = 1; i < parsed.handles; i++ ) {\r\n\t\t\t\tconnect.push(entry);\r\n\t\t\t}\r\n\r\n\t\t\tconnect.push(false);\r\n\t\t}\r\n\r\n\t\t// Reject invalid input\r\n\t\telse if ( !Array.isArray( entry ) || !entry.length || entry.length !== parsed.handles + 1 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tconnect = entry;\r\n\t\t}\r\n\r\n\t\tparsed.connect = connect;\r\n\t}\r\n\r\n\tfunction testOrientation ( parsed, entry ) {\r\n\r\n\t\t// Set orientation to an a numerical value for easy\r\n\t\t// array selection.\r\n\t\tswitch ( entry ){\r\n\t\t  case 'horizontal':\r\n\t\t\tparsed.ort = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'vertical':\r\n\t\t\tparsed.ort = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testMargin ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\t// Issue #582\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.margin = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.margin ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option is only supported on linear sliders.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testLimit ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tparsed.limit = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.limit || parsed.handles < 2 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option is only supported on linear sliders with 2 or more handles.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testPadding ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.padding = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.padding ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option is only supported on linear sliders.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding < 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding >= 50 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be less than half the range.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testDirection ( parsed, entry ) {\r\n\r\n\t\t// Set direction as a numerical value for easy parsing.\r\n\t\t// Invert connection for RTL sliders, so that the proper\r\n\t\t// handles get the connect/background classes.\r\n\t\tswitch ( entry ) {\r\n\t\t  case 'ltr':\r\n\t\t\tparsed.dir = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'rtl':\r\n\t\t\tparsed.dir = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testBehaviour ( parsed, entry ) {\r\n\r\n\t\t// Make sure the input is a string.\r\n\t\tif ( typeof entry !== 'string' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\r\n\t\t}\r\n\r\n\t\t// Check if the string contains any keywords.\r\n\t\t// None are required.\r\n\t\tvar tap = entry.indexOf('tap') >= 0;\r\n\t\tvar drag = entry.indexOf('drag') >= 0;\r\n\t\tvar fixed = entry.indexOf('fixed') >= 0;\r\n\t\tvar snap = entry.indexOf('snap') >= 0;\r\n\t\tvar hover = entry.indexOf('hover') >= 0;\r\n\r\n\t\tif ( fixed ) {\r\n\r\n\t\t\tif ( parsed.handles !== 2 ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\r\n\t\t\t}\r\n\r\n\t\t\t// Use margin to enforce fixed state\r\n\t\t\ttestMargin(parsed, parsed.start[1] - parsed.start[0]);\r\n\t\t}\r\n\r\n\t\tparsed.events = {\r\n\t\t\ttap: tap || snap,\r\n\t\t\tdrag: drag,\r\n\t\t\tfixed: fixed,\r\n\t\t\tsnap: snap,\r\n\t\t\thover: hover\r\n\t\t};\r\n\t}\r\n\r\n\tfunction testTooltips ( parsed, entry ) {\r\n\r\n\t\tif ( entry === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\telse if ( entry === true ) {\r\n\r\n\t\t\tparsed.tooltips = [];\r\n\r\n\t\t\tfor ( var i = 0; i < parsed.handles; i++ ) {\r\n\t\t\t\tparsed.tooltips.push(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse {\r\n\r\n\t\t\tparsed.tooltips = asArray(entry);\r\n\r\n\t\t\tif ( parsed.tooltips.length !== parsed.handles ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\r\n\t\t\t}\r\n\r\n\t\t\tparsed.tooltips.forEach(function(formatter){\r\n\t\t\t\tif ( typeof formatter !== 'boolean' && (typeof formatter !== 'object' || typeof formatter.to !== 'function') ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAriaFormat ( parsed, entry ) {\r\n\t\tparsed.ariaFormat = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testFormat ( parsed, entry ) {\r\n\t\tparsed.format = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testCssPrefix ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'string' && entry !== false ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\r\n\t\t}\r\n\r\n\t\tparsed.cssPrefix = entry;\r\n\t}\r\n\r\n\tfunction testCssClasses ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'object' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\r\n\t\t}\r\n\r\n\t\tif ( typeof parsed.cssPrefix === 'string' ) {\r\n\t\t\tparsed.cssClasses = {};\r\n\r\n\t\t\tfor ( var key in entry ) {\r\n\t\t\t\tif ( !entry.hasOwnProperty(key) ) { continue; }\r\n\r\n\t\t\t\tparsed.cssClasses[key] = parsed.cssPrefix + entry[key];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparsed.cssClasses = entry;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testUseRaf ( parsed, entry ) {\r\n\t\tif ( entry === true || entry === false ) {\r\n\t\t\tparsed.useRequestAnimationFrame = entry;\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'useRequestAnimationFrame' option should be true (default) or false.\");\r\n\t\t}\r\n\t}\r\n\r\n\t// Test all developer settings and parse to assumption-safe values.\r\n\tfunction testOptions ( options ) {\r\n\r\n\t\t// To prove a fix for #537, freeze options here.\r\n\t\t// If the object is modified, an error will be thrown.\r\n\t\t// Object.freeze(options);\r\n\r\n\t\tvar parsed = {\r\n\t\t\tmargin: 0,\r\n\t\t\tlimit: 0,\r\n\t\t\tpadding: 0,\r\n\t\t\tanimate: true,\r\n\t\t\tanimationDuration: 300,\r\n\t\t\tariaFormat: defaultFormatter,\r\n\t\t\tformat: defaultFormatter\r\n\t\t};\r\n\r\n\t\t// Tests are executed in the order they are presented here.\r\n\t\tvar tests = {\r\n\t\t\t'step': { r: false, t: testStep },\r\n\t\t\t'start': { r: true, t: testStart },\r\n\t\t\t'connect': { r: true, t: testConnect },\r\n\t\t\t'direction': { r: true, t: testDirection },\r\n\t\t\t'snap': { r: false, t: testSnap },\r\n\t\t\t'animate': { r: false, t: testAnimate },\r\n\t\t\t'animationDuration': { r: false, t: testAnimationDuration },\r\n\t\t\t'range': { r: true, t: testRange },\r\n\t\t\t'orientation': { r: false, t: testOrientation },\r\n\t\t\t'margin': { r: false, t: testMargin },\r\n\t\t\t'limit': { r: false, t: testLimit },\r\n\t\t\t'padding': { r: false, t: testPadding },\r\n\t\t\t'behaviour': { r: true, t: testBehaviour },\r\n\t\t\t'ariaFormat': { r: false, t: testAriaFormat },\r\n\t\t\t'format': { r: false, t: testFormat },\r\n\t\t\t'tooltips': { r: false, t: testTooltips },\r\n\t\t\t'cssPrefix': { r: false, t: testCssPrefix },\r\n\t\t\t'cssClasses': { r: false, t: testCssClasses },\r\n\t\t\t'useRequestAnimationFrame': { r: false, t: testUseRaf }\r\n\t\t};\r\n\r\n\t\tvar defaults = {\r\n\t\t\t'connect': false,\r\n\t\t\t'direction': 'ltr',\r\n\t\t\t'behaviour': 'tap',\r\n\t\t\t'orientation': 'horizontal',\r\n\t\t\t'cssPrefix' : 'noUi-',\r\n\t\t\t'cssClasses': {\r\n\t\t\t\ttarget: 'target',\r\n\t\t\t\tbase: 'base',\r\n\t\t\t\torigin: 'origin',\r\n\t\t\t\thandle: 'handle',\r\n\t\t\t\thandleLower: 'handle-lower',\r\n\t\t\t\thandleUpper: 'handle-upper',\r\n\t\t\t\thorizontal: 'horizontal',\r\n\t\t\t\tvertical: 'vertical',\r\n\t\t\t\tbackground: 'background',\r\n\t\t\t\tconnect: 'connect',\r\n\t\t\t\tltr: 'ltr',\r\n\t\t\t\trtl: 'rtl',\r\n\t\t\t\tdraggable: 'draggable',\r\n\t\t\t\tdrag: 'state-drag',\r\n\t\t\t\ttap: 'state-tap',\r\n\t\t\t\tactive: 'active',\r\n\t\t\t\ttooltip: 'tooltip',\r\n\t\t\t\tpips: 'pips',\r\n\t\t\t\tpipsHorizontal: 'pips-horizontal',\r\n\t\t\t\tpipsVertical: 'pips-vertical',\r\n\t\t\t\tmarker: 'marker',\r\n\t\t\t\tmarkerHorizontal: 'marker-horizontal',\r\n\t\t\t\tmarkerVertical: 'marker-vertical',\r\n\t\t\t\tmarkerNormal: 'marker-normal',\r\n\t\t\t\tmarkerLarge: 'marker-large',\r\n\t\t\t\tmarkerSub: 'marker-sub',\r\n\t\t\t\tvalue: 'value',\r\n\t\t\t\tvalueHorizontal: 'value-horizontal',\r\n\t\t\t\tvalueVertical: 'value-vertical',\r\n\t\t\t\tvalueNormal: 'value-normal',\r\n\t\t\t\tvalueLarge: 'value-large',\r\n\t\t\t\tvalueSub: 'value-sub'\r\n\t\t\t},\r\n\t\t\t'useRequestAnimationFrame': true\r\n\t\t};\r\n\r\n\t\t// AriaFormat defaults to regular format, if any.\r\n\t\tif ( options.format && !options.ariaFormat ) {\r\n\t\t\toptions.ariaFormat = options.format;\r\n\t\t}\r\n\r\n\t\t// Run all options through a testing mechanism to ensure correct\r\n\t\t// input. It should be noted that options might get modified to\r\n\t\t// be handled properly. E.g. wrapping integers in arrays.\r\n\t\tObject.keys(tests).forEach(function( name ){\r\n\r\n\t\t\t// If the option isn't set, but it is required, throw an error.\r\n\t\t\tif ( options[name] === undefined && defaults[name] === undefined ) {\r\n\r\n\t\t\t\tif ( tests[name].r ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\ttests[name].t( parsed, options[name] === undefined ? defaults[name] : options[name] );\r\n\t\t});\r\n\r\n\t\t// Forward pips options\r\n\t\tparsed.pips = options.pips;\r\n\r\n\t\tvar styles = [['left', 'top'], ['right', 'bottom']];\r\n\r\n\t\t// Pre-define the styles.\r\n\t\tparsed.style = styles[parsed.dir][parsed.ort];\r\n\t\tparsed.styleOposite = styles[parsed.dir?0:1][parsed.ort];\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\r\nfunction closure ( target, options, originalOptions ){\r\n\r\n\tvar actions = getActions();\r\n\tvar supportsTouchActionNone = getSupportsTouchActionNone();\r\n\tvar supportsPassive = supportsTouchActionNone && getSupportsPassive();\r\n\r\n\t// All variables local to 'closure' are prefixed with 'scope_'\r\n\tvar scope_Target = target;\r\n\tvar scope_Locations = [];\r\n\tvar scope_Base;\r\n\tvar scope_Handles;\r\n\tvar scope_HandleNumbers = [];\r\n\tvar scope_ActiveHandle = false;\r\n\tvar scope_Connects;\r\n\tvar scope_Spectrum = options.spectrum;\r\n\tvar scope_Values = [];\r\n\tvar scope_Events = {};\r\n\tvar scope_Self;\r\n\tvar scope_Pips;\r\n\tvar scope_Listeners = null;\r\n\tvar scope_Document = target.ownerDocument;\r\n\tvar scope_DocumentElement = scope_Document.documentElement;\r\n\tvar scope_Body = scope_Document.body;\r\n\r\n\r\n\t// Creates a node, adds it to target, returns the new node.\r\n\tfunction addNodeTo ( target, className ) {\r\n\r\n\t\tvar div = scope_Document.createElement('div');\r\n\r\n\t\tif ( className ) {\r\n\t\t\taddClass(div, className);\r\n\t\t}\r\n\r\n\t\ttarget.appendChild(div);\r\n\r\n\t\treturn div;\r\n\t}\r\n\r\n\t// Append a origin to the base\r\n\tfunction addOrigin ( base, handleNumber ) {\r\n\r\n\t\tvar origin = addNodeTo(base, options.cssClasses.origin);\r\n\t\tvar handle = addNodeTo(origin, options.cssClasses.handle);\r\n\r\n\t\thandle.setAttribute('data-handle', handleNumber);\r\n\r\n\t\t// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n\t\t// 0 = focusable and reachable\r\n\t\thandle.setAttribute('tabindex', '0');\r\n\t\thandle.setAttribute('role', 'slider');\r\n\t\thandle.setAttribute('aria-orientation', options.ort ? 'vertical' : 'horizontal');\r\n\r\n\t\tif ( handleNumber === 0 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleLower);\r\n\t\t}\r\n\r\n\t\telse if ( handleNumber === options.handles - 1 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleUpper);\r\n\t\t}\r\n\r\n\t\treturn origin;\r\n\t}\r\n\r\n\t// Insert nodes for connect elements\r\n\tfunction addConnect ( base, add ) {\r\n\r\n\t\tif ( !add ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(base, options.cssClasses.connect);\r\n\t}\r\n\r\n\t// Add handles to the slider base.\r\n\tfunction addElements ( connectOptions, base ) {\r\n\r\n\t\tscope_Handles = [];\r\n\t\tscope_Connects = [];\r\n\r\n\t\tscope_Connects.push(addConnect(base, connectOptions[0]));\r\n\r\n\t\t// [::::O====O====O====]\r\n\t\t// connectOptions = [0, 1, 1, 1]\r\n\r\n\t\tfor ( var i = 0; i < options.handles; i++ ) {\r\n\t\t\t// Keep a list of all added handles.\r\n\t\t\tscope_Handles.push(addOrigin(base, i));\r\n\t\t\tscope_HandleNumbers[i] = i;\r\n\t\t\tscope_Connects.push(addConnect(base, connectOptions[i + 1]));\r\n\t\t}\r\n\t}\r\n\r\n\t// Initialize a single slider.\r\n\tfunction addSlider ( target ) {\r\n\r\n\t\t// Apply classes and data to the target.\r\n\t\taddClass(target, options.cssClasses.target);\r\n\r\n\t\tif ( options.dir === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.ltr);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.rtl);\r\n\t\t}\r\n\r\n\t\tif ( options.ort === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.horizontal);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.vertical);\r\n\t\t}\r\n\r\n\t\tscope_Base = addNodeTo(target, options.cssClasses.base);\r\n\t}\r\n\r\n\r\n\tfunction addTooltip ( handle, handleNumber ) {\r\n\r\n\t\tif ( !options.tooltips[handleNumber] ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(handle.firstChild, options.cssClasses.tooltip);\r\n\t}\r\n\r\n\t// The tooltips option is a shorthand for using the 'update' event.\r\n\tfunction tooltips ( ) {\r\n\r\n\t\t// Tooltips are added with options.tooltips in original order.\r\n\t\tvar tips = scope_Handles.map(addTooltip);\r\n\r\n\t\tbindEvent('update', function(values, handleNumber, unencoded) {\r\n\r\n\t\t\tif ( !tips[handleNumber] ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar formattedValue = values[handleNumber];\r\n\r\n\t\t\tif ( options.tooltips[handleNumber] !== true ) {\r\n\t\t\t\tformattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\r\n\t\t\t}\r\n\r\n\t\t\ttips[handleNumber].innerHTML = formattedValue;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction aria ( ) {\r\n\r\n\t\tbindEvent('update', function ( values, handleNumber, unencoded, tap, positions ) {\r\n\r\n\t\t\t// Update Aria Values for all handles, as a change in one changes min and max values for the next.\r\n\t\t\tscope_HandleNumbers.forEach(function( handleNumber ){\r\n\r\n\t\t\t\tvar handle = scope_Handles[handleNumber];\r\n\r\n\t\t\t\tvar min = checkHandlePosition(scope_Locations, handleNumber, 0, true, true, true);\r\n\t\t\t\tvar max = checkHandlePosition(scope_Locations, handleNumber, 100, true, true, true);\r\n\r\n\t\t\t\tvar now = positions[handleNumber];\r\n\t\t\t\tvar text = options.ariaFormat.to(unencoded[handleNumber]);\r\n\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemin', min.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemax', max.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuenow', now.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuetext', text);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction getGroup ( mode, values, stepped ) {\r\n\r\n\t\t// Use the range.\r\n\t\tif ( mode === 'range' || mode === 'steps' ) {\r\n\t\t\treturn scope_Spectrum.xVal;\r\n\t\t}\r\n\r\n\t\tif ( mode === 'count' ) {\r\n\r\n\t\t\tif ( !values ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'values' required for mode 'count'.\");\r\n\t\t\t}\r\n\r\n\t\t\t// Divide 0 - 100 in 'count' parts.\r\n\t\t\tvar spread = ( 100 / (values - 1) );\r\n\t\t\tvar v;\r\n\t\t\tvar i = 0;\r\n\r\n\t\t\tvalues = [];\r\n\r\n\t\t\t// List these parts and have them handled as 'positions'.\r\n\t\t\twhile ( (v = i++ * spread) <= 100 ) {\r\n\t\t\t\tvalues.push(v);\r\n\t\t\t}\r\n\r\n\t\t\tmode = 'positions';\r\n\t\t}\r\n\r\n\t\tif ( mode === 'positions' ) {\r\n\r\n\t\t\t// Map all percentages to on-range values.\r\n\t\t\treturn values.map(function( value ){\r\n\t\t\t\treturn scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( mode === 'values' ) {\r\n\r\n\t\t\t// If the value must be stepped, it needs to be converted to a percentage first.\r\n\t\t\tif ( stepped ) {\r\n\r\n\t\t\t\treturn values.map(function( value ){\r\n\r\n\t\t\t\t\t// Convert to percentage, apply step, return to value.\r\n\t\t\t\t\treturn scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) );\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise, we can simply use the values.\r\n\t\t\treturn values;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction generateSpread ( density, mode, group ) {\r\n\r\n\t\tfunction safeIncrement(value, increment) {\r\n\t\t\t// Avoid floating point variance by dropping the smallest decimal places.\r\n\t\t\treturn (value + increment).toFixed(7) / 1;\r\n\t\t}\r\n\r\n\t\tvar indexes = {};\r\n\t\tvar firstInRange = scope_Spectrum.xVal[0];\r\n\t\tvar lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length-1];\r\n\t\tvar ignoreFirst = false;\r\n\t\tvar ignoreLast = false;\r\n\t\tvar prevPct = 0;\r\n\r\n\t\t// Create a copy of the group, sort it and filter away all duplicates.\r\n\t\tgroup = unique(group.slice().sort(function(a, b){ return a - b; }));\r\n\r\n\t\t// Make sure the range starts with the first element.\r\n\t\tif ( group[0] !== firstInRange ) {\r\n\t\t\tgroup.unshift(firstInRange);\r\n\t\t\tignoreFirst = true;\r\n\t\t}\r\n\r\n\t\t// Likewise for the last one.\r\n\t\tif ( group[group.length - 1] !== lastInRange ) {\r\n\t\t\tgroup.push(lastInRange);\r\n\t\t\tignoreLast = true;\r\n\t\t}\r\n\r\n\t\tgroup.forEach(function ( current, index ) {\r\n\r\n\t\t\t// Get the current step and the lower + upper positions.\r\n\t\t\tvar step;\r\n\t\t\tvar i;\r\n\t\t\tvar q;\r\n\t\t\tvar low = current;\r\n\t\t\tvar high = group[index+1];\r\n\t\t\tvar newPct;\r\n\t\t\tvar pctDifference;\r\n\t\t\tvar pctPos;\r\n\t\t\tvar type;\r\n\t\t\tvar steps;\r\n\t\t\tvar realSteps;\r\n\t\t\tvar stepsize;\r\n\r\n\t\t\t// When using 'steps' mode, use the provided steps.\r\n\t\t\t// Otherwise, we'll step on to the next subrange.\r\n\t\t\tif ( mode === 'steps' ) {\r\n\t\t\t\tstep = scope_Spectrum.xNumSteps[ index ];\r\n\t\t\t}\r\n\r\n\t\t\t// Default to a 'full' step.\r\n\t\t\tif ( !step ) {\r\n\t\t\t\tstep = high-low;\r\n\t\t\t}\r\n\r\n\t\t\t// Low can be 0, so test for false. If high is undefined,\r\n\t\t\t// we are at the last subrange. Index 0 is already handled.\r\n\t\t\tif ( low === false || high === undefined ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure step isn't 0, which would cause an infinite loop (#654)\r\n\t\t\tstep = Math.max(step, 0.0000001);\r\n\r\n\t\t\t// Find all steps in the subrange.\r\n\t\t\tfor ( i = low; i <= high; i = safeIncrement(i, step) ) {\r\n\r\n\t\t\t\t// Get the percentage value for the current step,\r\n\t\t\t\t// calculate the size for the subrange.\r\n\t\t\t\tnewPct = scope_Spectrum.toStepping( i );\r\n\t\t\t\tpctDifference = newPct - prevPct;\r\n\r\n\t\t\t\tsteps = pctDifference / density;\r\n\t\t\t\trealSteps = Math.round(steps);\r\n\r\n\t\t\t\t// This ratio represents the ammount of percentage-space a point indicates.\r\n\t\t\t\t// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided.\r\n\t\t\t\t// Round the percentage offset to an even number, then divide by two\r\n\t\t\t\t// to spread the offset on both sides of the range.\r\n\t\t\t\tstepsize = pctDifference/realSteps;\r\n\r\n\t\t\t\t// Divide all points evenly, adding the correct number to this subrange.\r\n\t\t\t\t// Run up to <= so that 100% gets a point, event if ignoreLast is set.\r\n\t\t\t\tfor ( q = 1; q <= realSteps; q += 1 ) {\r\n\r\n\t\t\t\t\t// The ratio between the rounded value and the actual size might be ~1% off.\r\n\t\t\t\t\t// Correct the percentage offset by the number of points\r\n\t\t\t\t\t// per subrange. density = 1 will result in 100 points on the\r\n\t\t\t\t\t// full range, 2 for 50, 4 for 25, etc.\r\n\t\t\t\t\tpctPos = prevPct + ( q * stepsize );\r\n\t\t\t\t\tindexes[pctPos.toFixed(5)] = ['x', 0];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Determine the point type.\r\n\t\t\t\ttype = (group.indexOf(i) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 );\r\n\r\n\t\t\t\t// Enforce the 'ignoreFirst' option by overwriting the type for 0.\r\n\t\t\t\tif ( !index && ignoreFirst ) {\r\n\t\t\t\t\ttype = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( !(i === high && ignoreLast)) {\r\n\t\t\t\t\t// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\r\n\t\t\t\t\tindexes[newPct.toFixed(5)] = [i, type];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Update the percentage count.\r\n\t\t\t\tprevPct = newPct;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn indexes;\r\n\t}\r\n\r\n\tfunction addMarking ( spread, filterFunc, formatter ) {\r\n\r\n\t\tvar element = scope_Document.createElement('div');\r\n\r\n\t\tvar valueSizeClasses = [\r\n\t\t\toptions.cssClasses.valueNormal,\r\n\t\t\toptions.cssClasses.valueLarge,\r\n\t\t\toptions.cssClasses.valueSub\r\n\t\t];\r\n\t\tvar markerSizeClasses = [\r\n\t\t\toptions.cssClasses.markerNormal,\r\n\t\t\toptions.cssClasses.markerLarge,\r\n\t\t\toptions.cssClasses.markerSub\r\n\t\t];\r\n\t\tvar valueOrientationClasses = [\r\n\t\t\toptions.cssClasses.valueHorizontal,\r\n\t\t\toptions.cssClasses.valueVertical\r\n\t\t];\r\n\t\tvar markerOrientationClasses = [\r\n\t\t\toptions.cssClasses.markerHorizontal,\r\n\t\t\toptions.cssClasses.markerVertical\r\n\t\t];\r\n\r\n\t\taddClass(element, options.cssClasses.pips);\r\n\t\taddClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\r\n\r\n\t\tfunction getClasses( type, source ){\r\n\t\t\tvar a = source === options.cssClasses.value;\r\n\t\t\tvar orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\r\n\t\t\tvar sizeClasses = a ? valueSizeClasses : markerSizeClasses;\r\n\r\n\t\t\treturn source + ' ' + orientationClasses[options.ort] + ' ' + sizeClasses[type];\r\n\t\t}\r\n\r\n\t\tfunction addSpread ( offset, values ){\r\n\r\n\t\t\t// Apply the filter function, if it is set.\r\n\t\t\tvalues[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1];\r\n\r\n\t\t\t// Add a marker for every point\r\n\t\t\tvar node = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.marker);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\r\n\t\t\t// Values are only appended for points marked '1' or '2'.\r\n\t\t\tif ( values[1] ) {\r\n\t\t\t\tnode = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.value);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\t\t\t\tnode.innerText = formatter.to(values[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append all points.\r\n\t\tObject.keys(spread).forEach(function(a){\r\n\t\t\taddSpread(a, spread[a]);\r\n\t\t});\r\n\r\n\t\treturn element;\r\n\t}\r\n\r\n\tfunction removePips ( ) {\r\n\t\tif ( scope_Pips ) {\r\n\t\t\tremoveElement(scope_Pips);\r\n\t\t\tscope_Pips = null;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction pips ( grid ) {\r\n\r\n\t\t// Fix #669\r\n\t\tremovePips();\r\n\r\n\t\tvar mode = grid.mode;\r\n\t\tvar density = grid.density || 1;\r\n\t\tvar filter = grid.filter || false;\r\n\t\tvar values = grid.values || false;\r\n\t\tvar stepped = grid.stepped || false;\r\n\t\tvar group = getGroup( mode, values, stepped );\r\n\t\tvar spread = generateSpread( density, mode, group );\r\n\t\tvar format = grid.format || {\r\n\t\t\tto: Math.round\r\n\t\t};\r\n\r\n\t\tscope_Pips = scope_Target.appendChild(addMarking(\r\n\t\t\tspread,\r\n\t\t\tfilter,\r\n\t\t\tformat\r\n\t\t));\r\n\r\n\t\treturn scope_Pips;\r\n\t}\r\n\r\n\r\n\t// Shorthand for base dimensions.\r\n\tfunction baseSize ( ) {\r\n\t\tvar rect = scope_Base.getBoundingClientRect(), alt = 'offset' + ['Width', 'Height'][options.ort];\r\n\t\treturn options.ort === 0 ? (rect.width||scope_Base[alt]) : (rect.height||scope_Base[alt]);\r\n\t}\r\n\r\n\t// Handler for attaching events trough a proxy.\r\n\tfunction attachEvent ( events, element, callback, data ) {\r\n\r\n\t\t// This function can be used to 'filter' events to the slider.\r\n\t\t// element is a node, not a nodeList\r\n\r\n\t\tvar method = function ( e ){\r\n\r\n\t\t\tif ( scope_Target.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Stop if an active 'tap' transition is taking place.\r\n\t\t\tif ( hasClass(scope_Target, options.cssClasses.tap) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\te = fixEvent(e, data.pageOffset);\r\n\r\n\t\t\t// Handle reject of multitouch\r\n\t\t\tif ( !e ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( data.hover && e.buttons ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\r\n\t\t\t// iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\r\n\t\t\t// touch-action: manipulation, but that allows panning, which breaks\r\n\t\t\t// sliders after zooming/on non-responsive pages.\r\n\t\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=133112\r\n\t\t\tif ( !supportsPassive ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\te.calcPoint = e.points[ options.ort ];\r\n\r\n\t\t\t// Call the event handler with the event [ and additional data ].\r\n\t\t\tcallback ( e, data );\r\n\t\t};\r\n\r\n\t\tvar methods = [];\r\n\r\n\t\t// Bind a closure on the target for every event type.\r\n\t\tevents.split(' ').forEach(function( eventName ){\r\n\t\t\telement.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\r\n\t\t\tmethods.push([eventName, method]);\r\n\t\t});\r\n\r\n\t\treturn methods;\r\n\t}\r\n\r\n\t// Provide a clean event with standardized offset values.\r\n\tfunction fixEvent ( e, pageOffset ) {\r\n\r\n\t\t// Filter the event to register the type, which can be\r\n\t\t// touch, mouse or pointer. Offset changes need to be\r\n\t\t// made on an event specific basis.\r\n\t\tvar touch = e.type.indexOf('touch') === 0;\r\n\t\tvar mouse = e.type.indexOf('mouse') === 0;\r\n\t\tvar pointer = e.type.indexOf('pointer') === 0;\r\n\r\n\t\tvar x;\r\n\t\tvar y;\r\n\r\n\t\t// IE10 implemented pointer events with a prefix;\r\n\t\tif ( e.type.indexOf('MSPointer') === 0 ) {\r\n\t\t\tpointer = true;\r\n\t\t}\r\n\r\n\t\tif ( touch ) {\r\n\r\n\t\t\t// Fix bug when user touches with two or more fingers on mobile devices.\r\n\t\t\t// It's useful when you have two or more sliders on one page,\r\n\t\t\t// that can be touched simultaneously.\r\n\t\t\t// #649, #663, #668\r\n\t\t\tif ( e.touches.length > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// noUiSlider supports one movement at a time,\r\n\t\t\t// so we can select the first 'changedTouch'.\r\n\t\t\tx = e.changedTouches[0].pageX;\r\n\t\t\ty = e.changedTouches[0].pageY;\r\n\t\t}\r\n\r\n\t\tpageOffset = pageOffset || getPageOffset(scope_Document);\r\n\r\n\t\tif ( mouse || pointer ) {\r\n\t\t\tx = e.clientX + pageOffset.x;\r\n\t\t\ty = e.clientY + pageOffset.y;\r\n\t\t}\r\n\r\n\t\te.pageOffset = pageOffset;\r\n\t\te.points = [x, y];\r\n\t\te.cursor = mouse || pointer; // Fix #435\r\n\r\n\t\treturn e;\r\n\t}\r\n\r\n\t// Translate a coordinate in the document to a percentage on the slider\r\n\tfunction calcPointToPercentage ( calcPoint ) {\r\n\t\tvar location = calcPoint - offset(scope_Base, options.ort);\r\n\t\tvar proposal = ( location * 100 ) / baseSize();\r\n\t\treturn options.dir ? 100 - proposal : proposal;\r\n\t}\r\n\r\n\t// Find handle closest to a certain percentage on the slider\r\n\tfunction getClosestHandle ( proposal ) {\r\n\r\n\t\tvar closest = 100;\r\n\t\tvar handleNumber = false;\r\n\r\n\t\tscope_Handles.forEach(function(handle, index){\r\n\r\n\t\t\t// Disabled handles are ignored\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = Math.abs(scope_Locations[index] - proposal);\r\n\r\n\t\t\tif ( pos < closest ) {\r\n\t\t\t\thandleNumber = index;\r\n\t\t\t\tclosest = pos;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn handleNumber;\r\n\t}\r\n\r\n\t// Moves handle(s) by a percentage\r\n\t// (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\r\n\tfunction moveHandles ( upward, proposal, locations, handleNumbers ) {\r\n\r\n\t\tvar proposals = locations.slice();\r\n\r\n\t\tvar b = [!upward, upward];\r\n\t\tvar f = [upward, !upward];\r\n\r\n\t\t// Copy handleNumbers so we don't change the dataset\r\n\t\thandleNumbers = handleNumbers.slice();\r\n\r\n\t\t// Check to see which handle is 'leading'.\r\n\t\t// If that one can't move the second can't either.\r\n\t\tif ( upward ) {\r\n\t\t\thandleNumbers.reverse();\r\n\t\t}\r\n\r\n\t\t// Step 1: get the maximum percentage that any of the handles can move\r\n\t\tif ( handleNumbers.length > 1 ) {\r\n\r\n\t\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\r\n\t\t\t\tvar to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false);\r\n\r\n\t\t\t\t// Stop if one of the handles can't move.\r\n\t\t\t\tif ( to === false ) {\r\n\t\t\t\t\tproposal = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tproposal = to - proposals[handleNumber];\r\n\t\t\t\t\tproposals[handleNumber] = to;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// If using one handle, check backward AND forward\r\n\t\telse {\r\n\t\t\tb = f = [true];\r\n\t\t}\r\n\r\n\t\tvar state = false;\r\n\r\n\t\t// Step 2: Try to set the handles with the found percentage\r\n\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\t\t\tstate = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\r\n\t\t});\r\n\r\n\t\t// Step 3: If a handle moved, fire events\r\n\t\tif ( state ) {\r\n\t\t\thandleNumbers.forEach(function(handleNumber){\r\n\t\t\t\tfireEvent('update', handleNumber);\r\n\t\t\t\tfireEvent('slide', handleNumber);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// External event handling\r\n\tfunction fireEvent ( eventName, handleNumber, tap ) {\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\r\n\t\t\tvar eventType = targetEvent.split('.')[0];\r\n\r\n\t\t\tif ( eventName === eventType ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\t// Use the slider public API as the scope ('this')\r\n\t\t\t\t\t\tscope_Self,\r\n\t\t\t\t\t\t// Return values as array, so arg_1[arg_2] is always valid.\r\n\t\t\t\t\t\tscope_Values.map(options.format.to),\r\n\t\t\t\t\t\t// Handle index, 0 or 1\r\n\t\t\t\t\t\thandleNumber,\r\n\t\t\t\t\t\t// Unformatted slider values\r\n\t\t\t\t\t\tscope_Values.slice(),\r\n\t\t\t\t\t\t// Event is fired by tap, true or false\r\n\t\t\t\t\t\ttap || false,\r\n\t\t\t\t\t\t// Left offset of the handle, in relation to the slider\r\n\t\t\t\t\t\tscope_Locations.slice()\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t// Fire 'end' when a mouse or pen leaves the document.\r\n\tfunction documentLeave ( event, data ) {\r\n\t\tif ( event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null ){\r\n\t\t\teventEnd (event, data);\r\n\t\t}\r\n\t}\r\n\r\n\t// Handle movement on document for handle and range drag.\r\n\tfunction eventMove ( event, data ) {\r\n\r\n\t\t// Fix #498\r\n\t\t// Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\r\n\t\t// https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\r\n\t\t// IE9 has .buttons and .which zero on mousemove.\r\n\t\t// Firefox breaks the spec MDN defines.\r\n\t\tif ( navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) {\r\n\t\t\treturn eventEnd(event, data);\r\n\t\t}\r\n\r\n\t\t// Check if we are moving up or down\r\n\t\tvar movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\r\n\r\n\t\t// Convert the movement into a percentage of the slider width/height\r\n\t\tvar proposal = (movement * 100) / data.baseSize;\r\n\r\n\t\tmoveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\r\n\t}\r\n\r\n\t// Unbind move events on document, call callbacks.\r\n\tfunction eventEnd ( event, data ) {\r\n\r\n\t\t// The handle is no longer active, so remove the class.\r\n\t\tif ( scope_ActiveHandle ) {\r\n\t\t\tremoveClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t\tscope_ActiveHandle = false;\r\n\t\t}\r\n\r\n\t\t// Remove cursor styles and text-selection events bound to the body.\r\n\t\tif ( event.cursor ) {\r\n\t\t\tscope_Body.style.cursor = '';\r\n\t\t\tscope_Body.removeEventListener('selectstart', preventDefault);\r\n\t\t}\r\n\r\n\t\t// Unbind the move and end events, which are added on 'start'.\r\n\t\tscope_Listeners.forEach(function( c ) {\r\n\t\t\tscope_DocumentElement.removeEventListener(c[0], c[1]);\r\n\t\t});\r\n\r\n\t\t// Remove dragging class.\r\n\t\tremoveClass(scope_Target, options.cssClasses.drag);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('change', handleNumber);\r\n\t\t\tfireEvent('set', handleNumber);\r\n\t\t\tfireEvent('end', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Bind move events on document.\r\n\tfunction eventStart ( event, data ) {\r\n\r\n\t\tif ( data.handleNumbers.length === 1 ) {\r\n\r\n\t\t\tvar handle = scope_Handles[data.handleNumbers[0]];\r\n\r\n\t\t\t// Ignore 'disabled' handles\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Mark the handle as 'active' so it can be styled.\r\n\t\t\tscope_ActiveHandle = handle.children[0];\r\n\t\t\taddClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t}\r\n\r\n\t\t// A drag should never propagate up to the 'tap' event.\r\n\t\tevent.stopPropagation();\r\n\r\n\t\t// Attach the move and end events.\r\n\t\tvar moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\r\n\t\t\tstartCalcPoint: event.calcPoint,\r\n\t\t\tbaseSize: baseSize(),\r\n\t\t\tpageOffset: event.pageOffset,\r\n\t\t\thandleNumbers: data.handleNumbers,\r\n\t\t\tbuttonsProperty: event.buttons,\r\n\t\t\tlocations: scope_Locations.slice()\r\n\t\t});\r\n\r\n\t\tvar endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tvar outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tscope_Listeners = moveEvent.concat(endEvent, outEvent);\r\n\r\n\t\t// Text selection isn't an issue on touch devices,\r\n\t\t// so adding cursor styles can be skipped.\r\n\t\tif ( event.cursor ) {\r\n\r\n\t\t\t// Prevent the 'I' cursor and extend the range-drag cursor.\r\n\t\t\tscope_Body.style.cursor = getComputedStyle(event.target).cursor;\r\n\r\n\t\t\t// Mark the target with a dragging state.\r\n\t\t\tif ( scope_Handles.length > 1 ) {\r\n\t\t\t\taddClass(scope_Target, options.cssClasses.drag);\r\n\t\t\t}\r\n\r\n\t\t\t// Prevent text selection when dragging the handles.\r\n\t\t\t// In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\r\n\t\t\t// which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\r\n\t\t\t// meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\r\n\t\t\t// The 'cursor' flag is false.\r\n\t\t\t// See: http://caniuse.com/#search=selectstart\r\n\t\t\tscope_Body.addEventListener('selectstart', preventDefault, false);\r\n\t\t}\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('start', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Move closest handle to tapped location.\r\n\tfunction eventTap ( event ) {\r\n\r\n\t\t// The tap event shouldn't propagate up\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\t\tvar handleNumber = getClosestHandle(proposal);\r\n\r\n\t\t// Tackle the case that all handles are 'disabled'.\r\n\t\tif ( handleNumber === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Flag the slider as it is now in a transitional state.\r\n\t\t// Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\r\n\t\tif ( !options.events.snap ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\tsetHandle(handleNumber, proposal, true, true);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tfireEvent('slide', handleNumber, true);\r\n\t\tfireEvent('update', handleNumber, true);\r\n\t\tfireEvent('change', handleNumber, true);\r\n\t\tfireEvent('set', handleNumber, true);\r\n\r\n\t\tif ( options.events.snap ) {\r\n\t\t\teventStart(event, { handleNumbers: [handleNumber] });\r\n\t\t}\r\n\t}\r\n\r\n\t// Fires a 'hover' event for a hovered mouse/pen position.\r\n\tfunction eventHover ( event ) {\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\r\n\t\tvar to = scope_Spectrum.getStep(proposal);\r\n\t\tvar value = scope_Spectrum.fromStepping(to);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\t\t\tif ( 'hover' === targetEvent.split('.')[0] ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\t\t\t\t\tcallback.call( scope_Self, value );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach events to several slider parts.\r\n\tfunction bindSliderEvents ( behaviour ) {\r\n\r\n\t\t// Attach the standard drag event to the handles.\r\n\t\tif ( !behaviour.fixed ) {\r\n\r\n\t\t\tscope_Handles.forEach(function( handle, index ){\r\n\r\n\t\t\t\t// These events are only bound to the visual handle\r\n\t\t\t\t// element, not the 'real' origin element.\r\n\t\t\t\tattachEvent ( actions.start, handle.children[0], eventStart, {\r\n\t\t\t\t\thandleNumbers: [index]\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Attach the tap event to the slider base.\r\n\t\tif ( behaviour.tap ) {\r\n\t\t\tattachEvent (actions.start, scope_Base, eventTap, {});\r\n\t\t}\r\n\r\n\t\t// Fire hover events\r\n\t\tif ( behaviour.hover ) {\r\n\t\t\tattachEvent (actions.move, scope_Base, eventHover, { hover: true });\r\n\t\t}\r\n\r\n\t\t// Make the range draggable.\r\n\t\tif ( behaviour.drag ){\r\n\r\n\t\t\tscope_Connects.forEach(function( connect, index ){\r\n\r\n\t\t\t\tif ( connect === false || index === 0 || index === scope_Connects.length - 1 ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar handleBefore = scope_Handles[index - 1];\r\n\t\t\t\tvar handleAfter = scope_Handles[index];\r\n\t\t\t\tvar eventHolders = [connect];\r\n\r\n\t\t\t\taddClass(connect, options.cssClasses.draggable);\r\n\r\n\t\t\t\t// When the range is fixed, the entire range can\r\n\t\t\t\t// be dragged by the handles. The handle in the first\r\n\t\t\t\t// origin will propagate the start event upward,\r\n\t\t\t\t// but it needs to be bound manually on the other.\r\n\t\t\t\tif ( behaviour.fixed ) {\r\n\t\t\t\t\teventHolders.push(handleBefore.children[0]);\r\n\t\t\t\t\teventHolders.push(handleAfter.children[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\teventHolders.forEach(function( eventHolder ) {\r\n\t\t\t\t\tattachEvent ( actions.start, eventHolder, eventStart, {\r\n\t\t\t\t\t\thandles: [handleBefore, handleAfter],\r\n\t\t\t\t\t\thandleNumbers: [index - 1, index]\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t// Split out the handle positioning logic so the Move event can use it, too\r\n\tfunction checkHandlePosition ( reference, handleNumber, to, lookBackward, lookForward, getValue ) {\r\n\r\n\t\t// For sliders with multiple handles, limit movement to the other handle.\r\n\t\t// Apply the margin option by adding it to the handle positions.\r\n\t\tif ( scope_Handles.length > 1 ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber - 1] + options.margin);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber + 1] - options.margin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The limit option has the opposite effect, limiting handles to a\r\n\t\t// maximum distance from another. Limit must be > 0, as otherwise\r\n\t\t// handles would be unmoveable.\r\n\t\tif ( scope_Handles.length > 1 && options.limit ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber - 1] + options.limit);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber + 1] - options.limit);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The padding option keeps the handles a certain distance from the\r\n\t\t// edges of the slider. Padding must be > 0.\r\n\t\tif ( options.padding ) {\r\n\r\n\t\t\tif ( handleNumber === 0 ) {\r\n\t\t\t\tto = Math.max(to, options.padding);\r\n\t\t\t}\r\n\r\n\t\t\tif ( handleNumber === scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, 100 - options.padding);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tto = scope_Spectrum.getStep(to);\r\n\r\n\t\t// Limit percentage to the 0 - 100 range\r\n\t\tto = limit(to);\r\n\r\n\t\t// Return false if handle can't move\r\n\t\tif ( to === reference[handleNumber] && !getValue ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn to;\r\n\t}\r\n\r\n\tfunction toPct ( pct ) {\r\n\t\treturn pct + '%';\r\n\t}\r\n\r\n\t// Updates scope_Locations and scope_Values, updates visual state\r\n\tfunction updateHandlePosition ( handleNumber, to ) {\r\n\r\n\t\t// Update locations.\r\n\t\tscope_Locations[handleNumber] = to;\r\n\r\n\t\t// Convert the value to the slider stepping/range.\r\n\t\tscope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\r\n\r\n\t\t// Called synchronously or on the next animationFrame\r\n\t\tvar stateUpdate = function() {\r\n\t\t\tscope_Handles[handleNumber].style[options.style] = toPct(to);\r\n\t\t\tupdateConnect(handleNumber);\r\n\t\t\tupdateConnect(handleNumber + 1);\r\n\t\t};\r\n\r\n\t\t// Set the handle to the new position.\r\n\t\t// Use requestAnimationFrame for efficient painting.\r\n\t\t// No significant effect in Chrome, Edge sees dramatic performace improvements.\r\n\t\t// Option to disable is useful for unit tests, and single-step debugging.\r\n\t\tif ( window.requestAnimationFrame && options.useRequestAnimationFrame ) {\r\n\t\t\twindow.requestAnimationFrame(stateUpdate);\r\n\t\t} else {\r\n\t\t\tstateUpdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setZindex ( ) {\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\t// Handles before the slider middle are stacked later = higher,\r\n\t\t\t// Handles after the middle later is lower\r\n\t\t\t// [[7] [8] .......... | .......... [5] [4]\r\n\t\t\tvar dir = (scope_Locations[handleNumber] > 50 ? -1 : 1);\r\n\t\t\tvar zIndex = 3 + (scope_Handles.length + (dir * handleNumber));\r\n\t\t\tscope_Handles[handleNumber].childNodes[0].style.zIndex = zIndex;\r\n\t\t});\r\n\t}\r\n\r\n\t// Test suggested values and apply margin, step.\r\n\tfunction setHandle ( handleNumber, to, lookBackward, lookForward ) {\r\n\r\n\t\tto = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\r\n\r\n\t\tif ( to === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tupdateHandlePosition(handleNumber, to);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Updates style attribute for connect nodes\r\n\tfunction updateConnect ( index ) {\r\n\r\n\t\t// Skip connects set to false\r\n\t\tif ( !scope_Connects[index] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar l = 0;\r\n\t\tvar h = 100;\r\n\r\n\t\tif ( index !== 0 ) {\r\n\t\t\tl = scope_Locations[index - 1];\r\n\t\t}\r\n\r\n\t\tif ( index !== scope_Connects.length - 1 ) {\r\n\t\t\th = scope_Locations[index];\r\n\t\t}\r\n\r\n\t\tscope_Connects[index].style[options.style] = toPct(l);\r\n\t\tscope_Connects[index].style[options.styleOposite] = toPct(100 - h);\r\n\t}\r\n\r\n\t// ...\r\n\tfunction setValue ( to, handleNumber ) {\r\n\r\n\t\t// Setting with null indicates an 'ignore'.\r\n\t\t// Inputting 'false' is invalid.\r\n\t\tif ( to === null || to === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If a formatted number was passed, attemt to decode it.\r\n\t\tif ( typeof to === 'number' ) {\r\n\t\t\tto = String(to);\r\n\t\t}\r\n\r\n\t\tto = options.format.from(to);\r\n\r\n\t\t// Request an update for all links if the value was invalid.\r\n\t\t// Do so too if setting the handle fails.\r\n\t\tif ( to !== false && !isNaN(to) ) {\r\n\t\t\tsetHandle(handleNumber, scope_Spectrum.toStepping(to), false, false);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set the slider value.\r\n\tfunction valueSet ( input, fireSetEvent ) {\r\n\r\n\t\tvar values = asArray(input);\r\n\t\tvar isInit = scope_Locations[0] === undefined;\r\n\r\n\t\t// Event fires by default\r\n\t\tfireSetEvent = (fireSetEvent === undefined ? true : !!fireSetEvent);\r\n\r\n\t\tvalues.forEach(setValue);\r\n\r\n\t\t// Animation is optional.\r\n\t\t// Make sure the initial values were set before using animated placement.\r\n\t\tif ( options.animate && !isInit ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\t// Now that all base values are set, apply constraints\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\tsetHandle(handleNumber, scope_Locations[handleNumber], true, false);\r\n\t\t});\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\r\n\t\t\tfireEvent('update', handleNumber);\r\n\r\n\t\t\t// Fire the event only for handles that received a new value, as per #579\r\n\t\t\tif ( values[handleNumber] !== null && fireSetEvent ) {\r\n\t\t\t\tfireEvent('set', handleNumber);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Reset slider to initial values\r\n\tfunction valueReset ( fireSetEvent ) {\r\n\t\tvalueSet(options.start, fireSetEvent);\r\n\t}\r\n\r\n\t// Get the slider value.\r\n\tfunction valueGet ( ) {\r\n\r\n\t\tvar values = scope_Values.map(options.format.to);\r\n\r\n\t\t// If only one handle is used, return a single value.\r\n\t\tif ( values.length === 1 ){\r\n\t\t\treturn values[0];\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t// Removes classes from the root and empties it.\r\n\tfunction destroy ( ) {\r\n\r\n\t\tfor ( var key in options.cssClasses ) {\r\n\t\t\tif ( !options.cssClasses.hasOwnProperty(key) ) { continue; }\r\n\t\t\tremoveClass(scope_Target, options.cssClasses[key]);\r\n\t\t}\r\n\r\n\t\twhile (scope_Target.firstChild) {\r\n\t\t\tscope_Target.removeChild(scope_Target.firstChild);\r\n\t\t}\r\n\r\n\t\tdelete scope_Target.noUiSlider;\r\n\t}\r\n\r\n\t// Get the current step size for the slider.\r\n\tfunction getCurrentStep ( ) {\r\n\r\n\t\t// Check all locations, map them to their stepping point.\r\n\t\t// Get the step point, then find it in the input list.\r\n\t\treturn scope_Locations.map(function( location, index ){\r\n\r\n\t\t\tvar nearbySteps = scope_Spectrum.getNearbySteps( location );\r\n\t\t\tvar value = scope_Values[index];\r\n\t\t\tvar increment = nearbySteps.thisStep.step;\r\n\t\t\tvar decrement = null;\r\n\r\n\t\t\t// If the next value in this step moves into the next step,\r\n\t\t\t// the increment is the start of the next step - the current value\r\n\t\t\tif ( increment !== false ) {\r\n\t\t\t\tif ( value + increment > nearbySteps.stepAfter.startValue ) {\r\n\t\t\t\t\tincrement = nearbySteps.stepAfter.startValue - value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// If the value is beyond the starting point\r\n\t\t\tif ( value > nearbySteps.thisStep.startValue ) {\r\n\t\t\t\tdecrement = nearbySteps.thisStep.step;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( nearbySteps.stepBefore.step === false ) {\r\n\t\t\t\tdecrement = false;\r\n\t\t\t}\r\n\r\n\t\t\t// If a handle is at the start of a step, it always steps back into the previous step first\r\n\t\t\telse {\r\n\t\t\t\tdecrement = value - nearbySteps.stepBefore.highestStep;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// Now, if at the slider edges, there is not in/decrement\r\n\t\t\tif ( location === 100 ) {\r\n\t\t\t\tincrement = null;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( location === 0 ) {\r\n\t\t\t\tdecrement = null;\r\n\t\t\t}\r\n\r\n\t\t\t// As per #391, the comparison for the decrement step can have some rounding issues.\r\n\t\t\tvar stepDecimals = scope_Spectrum.countStepDecimals();\r\n\r\n\t\t\t// Round per #391\r\n\t\t\tif ( increment !== null && increment !== false ) {\r\n\t\t\t\tincrement = Number(increment.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\tif ( decrement !== null && decrement !== false ) {\r\n\t\t\t\tdecrement = Number(decrement.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\treturn [decrement, increment];\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach an event to this slider, possibly including a namespace\r\n\tfunction bindEvent ( namespacedEvent, callback ) {\r\n\t\tscope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\r\n\t\tscope_Events[namespacedEvent].push(callback);\r\n\r\n\t\t// If the event bound is 'update,' fire it immediately for all handles.\r\n\t\tif ( namespacedEvent.split('.')[0] === 'update' ) {\r\n\t\t\tscope_Handles.forEach(function(a, index){\r\n\t\t\t\tfireEvent('update', index);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Undo attachment of event\r\n\tfunction removeEvent ( namespacedEvent ) {\r\n\r\n\t\tvar event = namespacedEvent && namespacedEvent.split('.')[0];\r\n\t\tvar namespace = event && namespacedEvent.substring(event.length);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( bind ){\r\n\r\n\t\t\tvar tEvent = bind.split('.')[0],\r\n\t\t\t\ttNamespace = bind.substring(tEvent.length);\r\n\r\n\t\t\tif ( (!event || event === tEvent) && (!namespace || namespace === tNamespace) ) {\r\n\t\t\t\tdelete scope_Events[bind];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Updateable: margin, limit, padding, step, range, animate, snap\r\n\tfunction updateOptions ( optionsToUpdate, fireSetEvent ) {\r\n\r\n\t\t// Spectrum is created using the range, snap, direction and step options.\r\n\t\t// 'snap' and 'step' can be updated.\r\n\t\t// If 'snap' and 'step' are not passed, they should remain unchanged.\r\n\t\tvar v = valueGet();\r\n\r\n\t\tvar updateAble = ['margin', 'limit', 'padding', 'range', 'animate', 'snap', 'step', 'format'];\r\n\r\n\t\t// Only change options that we're actually passed to update.\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toriginalOptions[name] = optionsToUpdate[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar newOptions = testOptions(originalOptions);\r\n\r\n\t\t// Load new options into the slider state\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toptions[name] = newOptions[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tscope_Spectrum = newOptions.spectrum;\r\n\r\n\t\t// Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\r\n\t\toptions.margin = newOptions.margin;\r\n\t\toptions.limit = newOptions.limit;\r\n\t\toptions.padding = newOptions.padding;\r\n\r\n\t\t// Update pips, removes existing.\r\n\t\tif ( options.pips ) {\r\n\t\t\tpips(options.pips);\r\n\t\t}\r\n\r\n\t\t// Invalidate the current positioning so valueSet forces an update.\r\n\t\tscope_Locations = [];\r\n\t\tvalueSet(optionsToUpdate.start || v, fireSetEvent);\r\n\t}\r\n\r\n\t// Throw an error if the slider was already initialized.\r\n\tif ( scope_Target.noUiSlider ) {\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\r\n\t}\r\n\r\n\t// Create the base element, initialise HTML and set classes.\r\n\t// Add handles and connect elements.\r\n\taddSlider(scope_Target);\r\n\taddElements(options.connect, scope_Base);\r\n\r\n\tscope_Self = {\r\n\t\tdestroy: destroy,\r\n\t\tsteps: getCurrentStep,\r\n\t\ton: bindEvent,\r\n\t\toff: removeEvent,\r\n\t\tget: valueGet,\r\n\t\tset: valueSet,\r\n\t\treset: valueReset,\r\n\t\t// Exposed for unit testing, don't use this in your application.\r\n\t\t__moveHandles: function(a, b, c) { moveHandles(a, b, scope_Locations, c); },\r\n\t\toptions: originalOptions, // Issue #600, #678\r\n\t\tupdateOptions: updateOptions,\r\n\t\ttarget: scope_Target, // Issue #597\r\n\t\tremovePips: removePips,\r\n\t\tpips: pips // Issue #594\r\n\t};\r\n\r\n\t// Attach user events.\r\n\tbindSliderEvents(options.events);\r\n\r\n\t// Use the public value method to set the start values.\r\n\tvalueSet(options.start);\r\n\r\n\tif ( options.pips ) {\r\n\t\tpips(options.pips);\r\n\t}\r\n\r\n\tif ( options.tooltips ) {\r\n\t\ttooltips();\r\n\t}\r\n\r\n\taria();\r\n\r\n\treturn scope_Self;\r\n\r\n}\r\n\r\n\r\n\t// Run the standard initializer\r\n\tfunction initialize ( target, originalOptions ) {\r\n\r\n\t\tif ( !target || !target.nodeName ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\r\n\t\t}\r\n\r\n\t\t// Test the options and create the slider environment;\r\n\t\tvar options = testOptions( originalOptions, target );\r\n\t\tvar api = closure( target, options, originalOptions );\r\n\r\n\t\ttarget.noUiSlider = api;\r\n\r\n\t\treturn api;\r\n\t}\r\n\r\n\t// Use an object instead of a function for future expansibility;\r\n\treturn {\r\n\t\tversion: VERSION,\r\n\t\tcreate: initialize\r\n\t};\r\n\r\n}));\nfunction scrollToEl(el) {\n    var scrollDuration = 500;\n    var scrollTop = Math.round(el.offset().top - 10);\n    var header = window.innerWidth > 1250 ? $('.header__nav') : $('.header');\n    var items = [\n        header,\n        $('#debug-bar'),\n        $('#admin-bar'),\n        $('.notice'),\n    ];\n\n    for (var i = 0; i < items.length; i++) {\n        if (items[i].length > 0) {\n            scrollTop -= items[i].outerHeight();\n        }\n    }\n\n    $('html, body').animate({\n        scrollTop: scrollTop\n    }, {\n        duration: scrollDuration\n    });\n}\n\n//=require js-tools/svg.js\n//=require js-tools/viewport.js\n\nfunction Carousel(options, className) {\n\n    var viewport = new Viewport(AndrewMartin.breakpoints);\n\n    // Options\n    this.options = {\n        arrows: false,\n        dots: true,\n        prevArrow: 'icon-arrow-large-left',\n        nextArrow: 'icon-arrow-large-right'\n    };\n\n    $.extend(this.options, options);\n\n    this.options.prevArrow = slickArrow(this.options.prevArrow, 'prev');\n    this.options.nextArrow = slickArrow(this.options.nextArrow, 'next');\n\n    // Variables\n    this.className = 'js-carousel--';\n    this.breakpoint;\n\n    // Public functions\n    this.init = init;\n    this.activate = activate;\n    this.watch = watch;\n    this.unslickable = unslickable;\n    this.playVideo = playVideo;\n    this.watchFilter = watchFilter;\n    this.setFilter = setFilter;\n    this.unsetFilter = unsetFilter;\n\n    // Functions\n\n    // Set up a carousel\n    function init(el) {\n        var self = this;\n\n        // Assign the classname of the carousel element\n        this.className += className;\n\n        if (this.options.arrows) {\n            el.addClass('carousel--has-arrows');\n        }\n\n        if (this.options.dots) {\n            el.addClass('carousel--has-dots');\n        }\n\n        // Is the carousel responsive?\n        if (this.options.responsive) {\n            // If so, is it unslickable (is slick unset at a particular breakpoint)?\n            if (this.unslickable()) {\n                // If we start at the small breakpoint, we need to be ready to reinit for the large breakpoint\n                if (this.options.mobileFirst) {\n                    if (window.matchMedia('(min-width : ' + this.breakpoint + 'px)').matches) {\n                        this.watch();\n                    }\n                } else {\n                    if (window.matchMedia('(max-width : ' + this.breakpoint + 'px)').matches) {\n                        this.watch();\n                    }\n                }\n                // If we destroy the carousel, we need to be ready to reinit\n                $('.' + this.className).on('destroy', function(e, slick) {\n                    $(this).attr('data-carousel-active', false);\n                    self.watch();\n                });\n            }\n        }\n\n        $('.' + this.className).on('init', function(event, slick) {\n            self.playVideo($(event.target), slick.currentSlide);\n        });\n\n        $('.' + this.className).on('afterChange', function(event, slick, currentSlide) {\n            self.playVideo($(event.target), currentSlide);\n        });\n\n        // Init the carousel\n        this.activate();\n\n        this.watchFilter();\n    }\n\n    // Init the carousel\n    function activate() {\n        $('.' + this.className).attr('data-carousel-active', true);\n        $('.' + this.className).slick(this.options);\n    }\n\n    // Watch for resize events\n    function watch() {\n        var self = this;\n        var resize;\n        $(window).off('resize.' + this.className).on('resize.' + this.className, function() {\n            clearTimeout(resize);\n            resize = setTimeout(function() {\n                if (self.options.mobileFirst) {\n                    if (window.matchMedia('(max-width : ' + self.breakpoint + 'px)').matches) {\n                        self.activate();\n                        $(window).off('resize.' + self.className);\n                    }\n                } else {\n                    if (window.matchMedia('(min-width : ' + self.breakpoint + 'px)').matches) {\n                        self.activate();\n                        $(window).off('resize.' + self.className);\n                    }\n                }\n            }, 100);\n        });\n    }\n\n    // Is the carousel unslickable?\n    function unslickable() {\n        var unslick = false;\n        for (var i = 0; i < this.options.responsive.length; i++) {\n            if (this.options.responsive[i].settings == 'unslick') {\n                this.breakpoint = this.options.responsive[i].breakpoint;\n                unslick = true;\n            }\n        }\n        return unslick;\n    }\n\n    function playVideo(carousel, id) {\n        var slide = carousel.find('.slick-slide[data-slick-index=\"' + id + '\"]');\n\n        if (slide.find('.playable-video').length > 0) {\n            var video = slide.find('.playable-video');\n            if (!video.hasClass('playable-video--playing')) {\n                video.addClass('playable-video--playing');\n\n                videojs(video.attr('id')).play();\n            }\n        }\n    }\n\n    function slickArrow(icon, action) {\n        const svg = new Svg();\n\n        return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>'\n    }\n\n    function watchFilter() {\n        if (this.options.filter) {\n            this.filtered = false;\n\n            if (viewport.customMatches('(max-width: ' + this.options.filter.breakpoint + 'px)')) {\n                this.setFilter();\n            } else {\n                this.unsetFilter(true);\n            }\n\n            viewport.resize(() => {\n                if (viewport.customMatches('(max-width: ' + this.options.filter.breakpoint + 'px)')) {\n                    this.setFilter();\n                } else {\n                    this.unsetFilter();\n                }\n            });\n        }\n    }\n\n    function setFilter() {\n        if (!this.filtered) {\n\n            if (!$('.' + this.className).hasClass('slick-slider')) {\n                this.activate();\n            }\n\n            $('.' + this.className).slick('slickUnfilter');\n            $('.' + this.className).slick('slickFilter', this.options.filter.selector);\n\n            this.filtered = true;\n        }\n    }\n\n    function unsetFilter(force) {\n        if (this.filtered || force) {\n\n            $('.' + this.className).slick('slickUnfilter');\n            $('.' + this.className).slick('unslick');\n\n            this.filtered = false;\n        }\n    }\n}\n\n\nwindow.noZensmooth = true;\n/**\n * Zenscroll 4.0.2\n * https://github.com/zengabor/zenscroll/\n *\n * Copyright 2015–2018 Gabor Lenard\n *\n * This is free and unencumbered software released into the public domain.\n * \n * Anyone is free to copy, modify, publish, use, compile, sell, or\n * distribute this software, either in source code form or as a compiled\n * binary, for any purpose, commercial or non-commercial, and by any\n * means.\n * \n * In jurisdictions that recognize copyright laws, the author or authors\n * of this software dedicate any and all copyright interest in the\n * software to the public domain. We make this dedication for the benefit\n * of the public at large and to the detriment of our heirs and\n * successors. We intend this dedication to be an overt act of\n * relinquishment in perpetuity of all present and future rights to this\n * software under copyright law.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n * \n * For more information, please refer to <http://unlicense.org>\n * \n */\n\n/*jshint devel:true, asi:true */\n\n/*global define, module */\n\n\n(function (root, factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\tdefine([], factory())\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory()\n\t} else {\n\t\t(function install() {\n\t\t\t// To make sure Zenscroll can be referenced from the header, before `body` is available\n\t\t\tif (document && document.body) {\n\t\t\t\troot.zenscroll = factory()\n\t\t\t} else {\n\t\t\t\t// retry 9ms later\n\t\t\t\tsetTimeout(install, 9)\n\t\t\t}\n\t\t})()\n\t}\n}(this, function () {\n\t\"use strict\"\n\n\n\t// Detect if the browser already supports native smooth scrolling (e.g., Firefox 36+ and Chrome 49+) and it is enabled:\n\tvar isNativeSmoothScrollEnabledOn = function (elem) {\n\t\treturn elem && \"getComputedStyle\" in window &&\n\t\t\twindow.getComputedStyle(elem)[\"scroll-behavior\"] === \"smooth\"\n\t}\n\n\n\t// Exit if it’s not a browser environment:\n\tif (typeof window === \"undefined\" || !(\"document\" in window)) {\n\t\treturn {}\n\t}\n\n\n\tvar makeScroller = function (container, defaultDuration, edgeOffset) {\n\n\t\t// Use defaults if not provided\n\t\tdefaultDuration = defaultDuration || 999 //ms\n\t\tif (!edgeOffset && edgeOffset !== 0) {\n\t\t\t// When scrolling, this amount of distance is kept from the edges of the container:\n\t\t\tedgeOffset = 9 //px\n\t\t}\n\n\t\t// Handling the life-cycle of the scroller\n\t\tvar scrollTimeoutId\n\t\tvar setScrollTimeoutId = function (newValue) {\n\t\t\tscrollTimeoutId = newValue\n\t\t}\n\n\t\t/**\n\t\t * Stop the current smooth scroll operation immediately\n\t\t */\n\t\tvar stopScroll = function () {\n\t\t\tclearTimeout(scrollTimeoutId)\n\t\t\tsetScrollTimeoutId(0)\n\t\t}\n\n\t\tvar getTopWithEdgeOffset = function (elem) {\n\t\t\treturn Math.max(0, container.getTopOf(elem) - edgeOffset)\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to a specific vertical position in the document.\n\t\t *\n\t\t * @param {targetY} The vertical position within the document.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t *        If not provided the default duration is used.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToY = function (targetY, duration, onDone) {\n\t\t\tstopScroll()\n\t\t\tif (duration === 0 || (duration && duration < 0) || isNativeSmoothScrollEnabledOn(container.body)) {\n\t\t\t\tcontainer.toY(targetY)\n\t\t\t\tif (onDone) {\n\t\t\t\t\tonDone()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar startY = container.getY()\n\t\t\t\tvar distance = Math.max(0, targetY) - startY\n\t\t\t\tvar startTime = new Date().getTime()\n\t\t\t\tduration = duration || Math.min(Math.abs(distance), defaultDuration);\n\t\t\t\t(function loopScroll() {\n\t\t\t\t\tsetScrollTimeoutId(setTimeout(function () {\n\t\t\t\t\t\t// Calculate percentage:\n\t\t\t\t\t\tvar p = Math.min(1, (new Date().getTime() - startTime) / duration)\n\t\t\t\t\t\t// Calculate the absolute vertical position:\n\t\t\t\t\t\tvar y = Math.max(0, Math.floor(startY + distance*(p < 0.5 ? 2*p*p : p*(4 - p*2)-1)))\n\t\t\t\t\t\tcontainer.toY(y)\n\t\t\t\t\t\tif (p < 1 && (container.getHeight() + y) < container.body.scrollHeight) {\n\t\t\t\t\t\t\tloopScroll()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsetTimeout(stopScroll, 99) // with cooldown time\n\t\t\t\t\t\t\tif (onDone) {\n\t\t\t\t\t\t\t\tonDone()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9))\n\t\t\t\t})()\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to the top of a specific element.\n\t\t *\n\t\t * @param {elem} The element to scroll to.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToElem = function (elem, duration, onDone) {\n\t\t\tscrollToY(getTopWithEdgeOffset(elem), duration, onDone)\n\t\t}\n\n\t\t/**\n\t\t * Scrolls an element into view if necessary.\n\t\t *\n\t\t * @param {elem} The element.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollIntoView = function (elem, duration, onDone) {\n\t\t\tvar elemHeight = elem.getBoundingClientRect().height\n\t\t\tvar elemBottom = container.getTopOf(elem) + elemHeight\n\t\t\tvar containerHeight = container.getHeight()\n\t\t\tvar y = container.getY()\n\t\t\tvar containerBottom = y + containerHeight\n\t\t\tif (getTopWithEdgeOffset(elem) < y || (elemHeight + edgeOffset) > containerHeight) {\n\t\t\t\t// Element is clipped at top or is higher than screen.\n\t\t\t\tscrollToElem(elem, duration, onDone)\n\t\t\t} else if ((elemBottom + edgeOffset) > containerBottom) {\n\t\t\t\t// Element is clipped at the bottom.\n\t\t\t\tscrollToY(elemBottom - containerHeight + edgeOffset, duration, onDone)\n\t\t\t} else if (onDone) {\n\t\t\t\tonDone()\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Scrolls to the center of an element.\n\t\t *\n\t\t * @param {elem} The element.\n\t\t * @param {duration} Optionally the duration of the scroll operation.\n\t\t * @param {offset} Optionally the offset of the top of the element from the center of the screen.\n\t\t *        A value of 0 is ignored.\n\t\t * @param {onDone} An optional callback function to be invoked once the scroll finished.\n\t\t */\n\t\tvar scrollToCenterOf = function (elem, duration, offset, onDone) {\n\t\t\tscrollToY(Math.max(0, container.getTopOf(elem) - container.getHeight()/2 + (offset || elem.getBoundingClientRect().height/2)), duration, onDone)\n\t\t}\n\n\t\t/**\n\t\t * Changes default settings for this scroller.\n\t\t *\n\t\t * @param {newDefaultDuration} Optionally a new value for default duration, used for each scroll method by default.\n\t\t *        Ignored if null or undefined.\n\t\t * @param {newEdgeOffset} Optionally a new value for the edge offset, used by each scroll method by default. Ignored if null or undefined.\n\t\t * @returns An object with the current values.\n\t\t */\n\t\tvar setup = function (newDefaultDuration, newEdgeOffset) {\n\t\t\tif (newDefaultDuration === 0 || newDefaultDuration) {\n\t\t\t\tdefaultDuration = newDefaultDuration\n\t\t\t}\n\t\t\tif (newEdgeOffset === 0 || newEdgeOffset) {\n\t\t\t\tedgeOffset = newEdgeOffset\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdefaultDuration: defaultDuration,\n\t\t\t\tedgeOffset: edgeOffset\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsetup: setup,\n\t\t\tto: scrollToElem,\n\t\t\ttoY: scrollToY,\n\t\t\tintoView: scrollIntoView,\n\t\t\tcenter: scrollToCenterOf,\n\t\t\tstop: stopScroll,\n\t\t\tmoving: function () { return !!scrollTimeoutId },\n\t\t\tgetY: container.getY,\n\t\t\tgetTopOf: container.getTopOf\n\t\t}\n\n\t}\n\n\n\tvar docElem = document.documentElement\n\tvar getDocY = function () { return window.scrollY || docElem.scrollTop }\n\n\t// Create a scroller for the document:\n\tvar zenscroll = makeScroller({\n\t\tbody: document.scrollingElement || document.body,\n\t\ttoY: function (y) { window.scrollTo(0, y) },\n\t\tgetY: getDocY,\n\t\tgetHeight: function () { return window.innerHeight || docElem.clientHeight },\n\t\tgetTopOf: function (elem) { return elem.getBoundingClientRect().top + getDocY() - docElem.offsetTop }\n\t})\n\n\n\t/**\n\t * Creates a scroller from the provided container element (e.g., a DIV)\n\t *\n\t * @param {scrollContainer} The vertical position within the document.\n\t * @param {defaultDuration} Optionally a value for default duration, used for each scroll method by default.\n\t *        Ignored if 0 or null or undefined.\n\t * @param {edgeOffset} Optionally a value for the edge offset, used by each scroll method by default. \n\t *        Ignored if null or undefined.\n\t * @returns A scroller object, similar to `zenscroll` but controlling the provided element.\n\t */\n\tzenscroll.createScroller = function (scrollContainer, defaultDuration, edgeOffset) {\n\t\treturn makeScroller({\n\t\t\tbody: scrollContainer,\n\t\t\ttoY: function (y) { scrollContainer.scrollTop = y },\n\t\t\tgetY: function () { return scrollContainer.scrollTop },\n\t\t\tgetHeight: function () { return Math.min(scrollContainer.clientHeight, window.innerHeight || docElem.clientHeight) },\n\t\t\tgetTopOf: function (elem) { return elem.offsetTop }\n\t\t}, defaultDuration, edgeOffset)\n\t}\n\n\n\t// Automatic link-smoothing on achors\n\t// Exclude IE8- or when native is enabled or Zenscroll auto- is disabled\n\tif (\"addEventListener\" in window && !window.noZensmooth && !isNativeSmoothScrollEnabledOn(document.body)) {\n\n\t\tvar isHistorySupported = \"history\" in window && \"pushState\" in history\n\t\tvar isScrollRestorationSupported = isHistorySupported && \"scrollRestoration\" in history\n\n\t\t// On first load & refresh make sure the browser restores the position first\n\t\tif (isScrollRestorationSupported) {\n\t\t\thistory.scrollRestoration = \"auto\"\n\t\t}\n\n\t\twindow.addEventListener(\"load\", function () {\n\n\t\t\tif (isScrollRestorationSupported) {\n\t\t\t\t// Set it to manual\n\t\t\t\tsetTimeout(function () { history.scrollRestoration = \"manual\" }, 9)\n\t\t\t\twindow.addEventListener(\"popstate\", function (event) {\n\t\t\t\t\tif (event.state && \"zenscrollY\" in event.state) {\n\t\t\t\t\t\tzenscroll.toY(event.state.zenscrollY)\n\t\t\t\t\t}\n\t\t\t\t}, false)\n\t\t\t}\n\n\t\t\t// Add edge offset on first load if necessary\n\t\t\t// This may not work on IE (or older computer?) as it requires more timeout, around 100 ms\n\t\t\tif (window.location.hash) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t// Adjustment is only needed if there is an edge offset:\n\t\t\t\t\tvar edgeOffset = zenscroll.setup().edgeOffset\n\t\t\t\t\tif (edgeOffset) {\n\t\t\t\t\t\tvar targetElem = document.getElementById(window.location.href.split(\"#\")[1])\n\t\t\t\t\t\tif (targetElem) {\n\t\t\t\t\t\t\tvar targetY = Math.max(0, zenscroll.getTopOf(targetElem) - edgeOffset)\n\t\t\t\t\t\t\tvar diff = zenscroll.getY() - targetY\n\t\t\t\t\t\t\t// Only do the adjustment if the browser is very close to the element:\n\t\t\t\t\t\t\tif (0 <= diff && diff < 9 ) {\n\t\t\t\t\t\t\t\twindow.scrollTo(0, targetY)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, 9)\n\t\t\t}\n\n\t\t}, false)\n\n\t\t// Handling clicks on anchors\n\t\tvar RE_noZensmooth = new RegExp(\"(^|\\\\s)noZensmooth(\\\\s|$)\")\n\t\twindow.addEventListener(\"click\", function (event) {\n\t\t\tvar anchor = event.target\n\t\t\twhile (anchor && anchor.tagName !== \"A\") {\n\t\t\t\tanchor = anchor.parentNode\n\t\t\t}\n\t\t\t// Let the browser handle the click if it wasn't with the primary button, or with some modifier keys:\n\t\t\tif (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Save the current scrolling position so it can be used for scroll restoration:\n\t\t\tif (isScrollRestorationSupported) {\n\t\t\t\tvar historyState = history.state && typeof history.state === \"object\" ? history.state : {}\n\t\t\t\thistoryState.zenscrollY = zenscroll.getY()\n\t\t\t\ttry {\n\t\t\t\t\thistory.replaceState(historyState, \"\")\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Avoid the Chrome Security exception on file protocol, e.g., file://index.html\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Find the referenced ID:\n\t\t\tvar href = anchor.getAttribute(\"href\") || \"\"\n\t\t\tif (href.indexOf(\"#\") === 0 && !RE_noZensmooth.test(anchor.className)) {\n\t\t\t\tvar targetY = 0\n\t\t\t\tvar targetElem = document.getElementById(href.substring(1))\n\t\t\t\tif (href !== \"#\") {\n\t\t\t\t\tif (!targetElem) {\n\t\t\t\t\t\t// Let the browser handle the click if the target ID is not found.\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\ttargetY = zenscroll.getTopOf(targetElem)\n\t\t\t\t}\n\t\t\t\tevent.preventDefault()\n\t\t\t\t// By default trigger the browser's `hashchange` event...\n\t\t\t\tvar onDone = function () { window.location = href }\n\t\t\t\t// ...unless there is an edge offset specified\n\t\t\t\tvar edgeOffset = zenscroll.setup().edgeOffset\n\t\t\t\tif (edgeOffset) {\n\t\t\t\t\ttargetY = Math.max(0, targetY - edgeOffset)\n\t\t\t\t\tif (isHistorySupported) {\n\t\t\t\t\t\tonDone = function () { history.pushState({}, \"\", href) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tzenscroll.toY(targetY, null, onDone)\n\t\t\t}\n\t\t}, false)\n\n\t}\n\n\n\treturn zenscroll\n\n\n}));\n\n\n// Pause hero carousel when CTA is hovered\nvar heroButtons = document.querySelectorAll('.js-hero-button')\n\nif (heroButtons) {\n    heroButtons.forEach((button) => {\n\n        button.addEventListener('mouseenter', function() {\n            $('.js-carousel--hero').slick('slickPause');\n        })\n\n        button.addEventListener('mouseleave', function() {\n            $('.js-carousel--hero').slick('slickPlay');\n        })\n    })\n}\n\n$('input[type=checkbox]')\n    .not('.custom-check-replace')\n    .not('.custom-check-replace2')\n    .not('.no-replace')\n    .not('.account-form-toggle__switch')\n    .checkReplace();\n$('input[type=checkbox].custom-check-replace').customCheckReplace();\n\nif ($('#hero_video').length) {\n    videojs.options.flash.swf = '/css/video-js/video-js.swf';\n    videojs(\"hero_video\").ready(function() {\n        var player = this;\n        player.play();\n        player.muted(true);\n    });\n}\n\n// Reveal the product listing items, after the timeout\nsetTimeout(function() {\n    $('.product-listing--to-load').removeClass('product-listing--to-load');\n}, 100);\n\n// Watch the categories sub-navigation\n\n(function() {\n\n    var breakpoint = 1199;\n\n    // Check if we are viewing the mobile or desktop layout\n\n    function isDesktop() {\n        return !window.matchMedia('(max-width : ' + breakpoint + 'px)').matches;\n    }\n\n    // Toggle the visibility of the sub-categories (on mobile)\n\n    $('.js-expand-nav').on('click', function(e){\n        if (!isDesktop()) {\n            e.preventDefault();\n            $(this).toggleClass('nav-categories__item--expanded');\n        }\n    });\n\n    // Toggle the visibility of the sub-categories (on desktop)\n\n    $('.js-expand-nav').on('mouseenter', function(e){\n        if (isDesktop()) {\n            $(this).addClass('nav-categories__item--expanded');\n        }\n    }).on('mouseleave', function(e){\n        if (isDesktop()) {\n            $(this).removeClass('nav-categories__item--expanded');\n        }\n    });\n\n    // Prevent click events bubbling up to the parent category link\n\n    $('.js-expand-nav .nav-categories__children').on('click', function(e){\n        e.stopPropagation();\n    });\n})();\n\n// Open external links in a new window\n$('body').on('click', '.external-link', function(e) {\n    e.preventDefault();\n    window.open($(e.target).attr('href'));\n});\n\n// Watch the product accordions\n(function() {\n    // Watch all clicks on links that begin with a hash\n    $('a[href^=\"#\"][href!=\"#\"]').on('click', function(event) {\n        // Check to see if the element can be ignored\n        if ($(this).data('zen-ignore')) {\n            return;\n        }\n        var anchor = event.target\n        while (anchor && anchor.tagName !== \"A\") {\n            anchor = anchor.parentNode\n        }\n        // Let the browser handle the click if it wasn't with the primary button, or with some modifier keys:\n        if (!anchor || event.which !== 1 || event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n            return;\n        }\n\n        var href = anchor.getAttribute(\"href\") || \"\"\n        if (href.indexOf(\"#\") === 0) {\n            var targetY = 0\n            var targetElem = document.getElementById(href.substring(1))\n            if (href !== \"#\") {\n                if (!targetElem) {\n                    // Let the browser handle the click if the target ID is not found.\n                    return\n                }\n                targetY = zenscroll.getTopOf(targetElem)\n            }\n            event.preventDefault()\n            // By default trigger the browser's `hashchange` event...\n            var onDone = function () {\n                window.location = href;\n                checkHash();\n            }\n\n            zenscroll.toY(targetY, null, onDone)\n        }\n    });\n\n    // Check the current URL for a hash\n\n    checkHash();\n\n    // If the current URL features a hash value, check if the hash corresponds to accordion-based content\n\n    function checkHash() {\n        var hash = window.location.hash;\n        var target = $(hash);\n\n        var item = target.siblings('.accordion').eq(0);\n\n        if (item.length && item.attr('class').indexOf('--active') == -1) {\n            item.find('.js-accordion-toggle').click();\n        }\n    }\n})();\n\n// Apply carousel functionality to steps\n(function() {\n    // Define the breakpoint at which the layout changes\n    var breakpoint = 860;\n\n    // Init the carousel\n    function init() {\n        $('.js-steps-carousel').each(function(index, value) {\n            var steps = $(this).find('.block__step').length;\n\n            $(value).slick({\n                slidesToShow: steps >= 4 ? 4 : steps,\n                infinite : false,\n                dots: true,\n                arrows: false,\n                responsive: [{\n                    breakpoint: breakpoint,\n                    settings: 'unslick'\n                }]\n            });\n        });\n    }\n\n    // Reinit the carousel (after changing breakpoint)\n    function reInit() {\n        var resize;\n        $(window).on('resize.steps-carousel', function() {\n            clearTimeout(resize);\n            resize = setTimeout(function() {\n                if (!window.matchMedia('(max-width : ' + breakpoint + 'px)').matches) {\n                    init();\n                    $(window).off('resize.steps-carousel');\n                }\n            }, 100);\n        });\n    }\n\n    // Init the carousel\n    init();\n\n    // If we start at the small breakpoint, we need to be ready to reinit for the large breakpoint\n    if (window.matchMedia('(max-width : ' + breakpoint + 'px)').matches) {\n        reInit();\n    }\n\n    // If we destroy the carousel, we need to be ready to reinit\n    $('.js-steps-carousel').on('destroy', function(e, slick) {\n        reInit();\n    });\n})();\n\n// Toggle accordion content visibility\nfunction accordion(callback) {\n    // Toggle accordion content visibility\n    $('.js-accordion-toggle').off('click.accordion-toggle').on('click.accordion-toggle', function() {\n        $(this).parent().toggleClass('accordion--active');\n        if (callback) {\n            callback($(this).parent());\n        }\n    });\n}\naccordion();\n\n// Video preview\n(function() {\n    var video = $('.block--video').eq(0);\n    if ($('.js-preview-video').length == 0) {\n        return;\n    }\n    if (video.length == 0) {\n        $('.js-preview-video').remove();\n        return;\n    }\n\n    $(document).on('click', '.js-go-to-video', function() {\n        scrollToEl(video);\n    });\n})();\n\n$(document).on('click', '.js-go-to-video', function() {\n    scrollToEl(video);\n});\n\n// Video preview\n$(document).on('click', '.js-show-stockists', function(e) {\n    e.preventDefault();\n    scrollToEl($('.stockist__list'));\n});\n\nfunction handlePaintLinks() {\n    // Allow the fake link to go to the new URL\n    $('.js-go-to-url').click(function(e) {\n        e.stopPropagation();\n        window.location = $(this).data('href');\n    });\n    // Add the sample to the basket\n    $('.js-add-sample-to-basket').click(function(e) {\n        e.stopPropagation();\n\n        $.ajax($(this).data('href'), {\n            type: 'get',\n            success: function(data) {\n                refreshAfterAjax(data, 1);\n            },\n            fail: function() {\n            }\n        });\n    });\n    // Resize the overlay to center it correctly\n    $('.js-go-to-url').parent().mouseenter(function(e) {\n        $('.js-go-to-url').height($(this).height() - $(this).find('.product-listing__content__bottom').outerHeight());\n    });\n\n    function refreshAfterAjax(data, quantity) {\n        if (data.hasOwnProperty('payload')) {\n            if (data.payload.hasOwnProperty('qty')) {\n                $('.quick-links__notification__value').html(data.payload.qty)\n\n                if (quantity) {\n                    var noun = quantity == 1 ? 'item' : 'items';\n                    var message = quantity + ' ' + noun + ' added to the basket';\n\n                    $('.quick-links__update').html(message);\n                    $('.quick-links__update').addClass('quick-links__update--active');\n\n                    setTimeout(function() {\n                        $('.quick-links__update').removeClass('quick-links__update--active');\n\n                        setTimeout(function() {\n                            $('.quick-links__update').html('');\n                        }, 300);\n                    }, 3000);\n                }\n            }\n        }\n    }\n}\n\nhandlePaintLinks();\n\n$(document).on('click', '.js-account-message__close', function () {\n    $(this).closest(('.account-message')).remove();\n});\n\n\n$('#basket__account-select').change(function(){\n    window.location = 'basket/change-account/' + $(this).val();\n});\n\n$(document).on('click', '.discover-nav__link, .js-scroll', function(e) {\n    var $this = $(this);\n    var href = $this.attr('href');\n    if (href != '#') {\n        e.preventDefault();\n        scrollToEl($(href));\n    }\n});\n\n// Hide empty social boxed on PDP\n(function () {\n    var socials = document.querySelectorAll('.product__sharing-list__item')\n\n    if (socials) {\n        socials.forEach(social => {\n            if (social.children.length == 0) {\n                social.style.display = 'none';\n            }\n        })\n    }\n})()\n\n// Responsive slick dots height for when hero breaks in to two on mobile\n\nfunction setSlickDotsTop(dots) {\n    dots.style.top = 'initial';\n    dots.style.bottom = `${getHeroContentHeight() + 20}px`;\n}\n\nfunction resetDots(dots) {\n    dots.style.top = 'initial';\n\n    if (window.matchMedia('(max-width: 999px)').matches) {\n        dots.style.bottom = '40px'\n    } else {\n        dots.style.bottom = '80px';\n    }\n}\n\nfunction getHeroContentHeight() {\n    const contentBoxes = Array.from(\n        document.querySelectorAll('.hero__content')\n    );\n    const heights = contentBoxes.map(\n        content => content.getBoundingClientRect().height\n    );\n\n    return Math.max(...heights);\n}\n\nfunction checkHomePage() {\n    var header = document.querySelector('.js-header');\n    return header && !header.classList.contains('header--plain');\n}\n\nfunction checkMobile() {\n    return (window.matchMedia('(max-width: 680px)').matches);\n}\n\nfunction setupSampleModal() {\n    var self = this;\n    const modal = document.querySelector('.js-customise-info-modal');\n\n    if (modal == null) return;\n\n    $('.js-open-sample-detail').on('click', function(e) {\n        e.preventDefault();\n        var svg = new Svg();\n\n        $.magnificPopup.open({\n            type: 'inline',\n            mainClass: 'mfp-sample-detail mfp-fade',\n            removalDelay: 300,\n            items: {\n                src: '.js-sample-popup--pdp',\n            },\n            closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n            fixedContentPos: true,\n            callbacks: {\n                open: function() {\n                    function slickArrow(icon, action) {\n                        const svg = new Svg();\n\n                        return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n                    }\n\n                    $(\".js-carousel--customise-modal--pdp\").slick({\n                        slidesToShow: 1,\n                        slidesToScroll: 1,\n                        arrows: true,\n                        swipe: true,\n                        infinite: false,\n                        autoplay: false,\n                        mobileFirst: true,\n                        dots: false,\n                        fade: true,\n                        cssEase: 'linear',\n                        asNavFor: '.js-carousel--modal-thumbnails--pdp',\n                        speed: 100,\n                        prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                        nextArrow: slickArrow('icon-arrow-large-right', 'next')\n                    })\n\n                    $(\".js-carousel--modal-thumbnails--pdp\").slick({\n                        slidesToShow: 3.5,\n                        asNavFor: '.js-carousel--customise-modal--pdp',\n                        focusOnSelect: true,\n                        infinite: false,\n                        dots: false,\n                        arrows: false,\n                    })\n\n                    $('.js-fabric-sample-add').on('click', function(e) {\n                        e.preventDefault();\n                        var clicked = $(this);\n                        var span = clicked.find('span');\n                        var html = span.html();\n                        html = html.replace(' Added to basket', '');\n                        clicked.addClass('customise__action--working');\n                        span.html('Adding to basket...');\n                        $.ajax($(this).attr('href'), {\n                            success: function(data) {\n                                if (data.payload.hasOwnProperty('count')) {\n                                    $('.js-basket-count').html(data.payload.count);\n                                }\n\n                                clicked.find('span').html(html + ' Added to basket');\n                                clicked.removeClass('customise__action--working');\n                                clicked.addClass('customise__action--done');\n\n                                if (clicked.hasClass('js-close-after-action')) {\n                                    $.magnificPopup.close();\n                                }\n                            }\n                        });\n                    });\n                }\n            }\n        });\n    });\n}\n\nsetupSampleModal();\n\n$('.js-open-sample').on('click', function(e) {\n    e.preventDefault();\n    var svg = new Svg();\n\n    $.magnificPopup.open({\n        type: 'inline',\n        mainClass: 'mfp-sample mfp-fade',\n        removalDelay: 300,\n        items: {\n            src: '.js-sample-popup',\n        },\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true\n    });\n})\n\n$('.js-open-sample-detail').on('click', function(e) {\n    e.preventDefault();\n    var svg = new Svg();\n\n    $.magnificPopup.open({\n        type: 'inline',\n        mainClass: 'mfp-sample-detail mfp-fade',\n        removalDelay: 300,\n        items: {\n            src: '.js-sample-popup--pdp',\n        },\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true,\n        callbacks: {\n            open: function() {\n                function slickArrow(icon, action) {\n                    const svg = new Svg();\n\n                    return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n                }\n\n                $(\".js-carousel--customise-modal--pdp\").slick({\n                    slidesToShow: 1,\n                    slidesToScroll: 1,\n                    arrows: true,\n                    swipe: true,\n                    infinite: false,\n                    autoplay: false,\n                    mobileFirst: true,\n                    dots: false,\n                    fade: true,\n                    cssEase: 'linear',\n                    asNavFor: '.js-carousel--modal-thumbnails--pdp',\n                    speed: 100,\n                    prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                    nextArrow: slickArrow('icon-arrow-large-right', 'next')\n                })\n\n                $(\".js-carousel--modal-thumbnails--pdp\").slick({\n                    slidesToShow: 3.5,\n                    asNavFor: '.js-carousel--customise-modal--pdp',\n                    focusOnSelect: true,\n                    infinite: false,\n                    dots: false,\n                    arrows: false,\n                })\n\n                $('.js-fabric-sample-add').on('click', function(e) {\n                    e.preventDefault();\n                    var clicked = $(this);\n                    var span = clicked.find('span');\n                    var html = span.html();\n                    html = html.replace(' Added to basket', '');\n                    clicked.addClass('customise__action--working');\n                    span.html('Adding to basket...');\n                    $.ajax($(this).attr('href'), {\n                        success: function(data) {\n                            if (data.payload.hasOwnProperty('count')) {\n                                $('.js-basket-count').html(data.payload.count);\n                            }\n                            clicked.find('span').html(html + ' Added to basket');\n                            clicked.removeClass('customise__action--working');\n                            clicked.addClass('customise__action--done');\n\n                            if (clicked.hasClass('js-close-after-action')) {\n                                $.magnificPopup.close();\n                            }\n\n                            clicked.find('span').html(html);\n                        }\n                    });\n                });\n            }\n        }\n    });\n});\n\n// Shift slick dot positioning for too many dots\n\nfunction stackDots() {\n    setTimeout(() => {\n        var productGrid = document.querySelector('.product-grid');\n        var slickDots = productGrid.querySelector('.slick-dots')\n\n        if (slickDots) {\n            if (slickDots.childElementCount > 8 && window.matchMedia('(max-width: 600px)').matches) {\n                slickDots.classList.add('slick-dots--lots');\n            } else if (slickDots.classList.contains('slick-dots--lots') && !window.matchMedia('(max-width: 600px)').matches) {\n                slickDots.classList.remove('slick-dots--lots');\n            }\n        }\n    }, 500)\n}\n\nwindow.addEventListener('resize', function() {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid) {\n        stackDots();\n    }\n});\n\nwindow.addEventListener('load', function() {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid) {\n        stackDots();\n    }\n});\n\n// Expand first image in product grid if there are two or less images\n\n(function () {\n    var productGrid = document.querySelector('.product-grid');\n\n    if (productGrid && productGrid.childElementCount <= 2) {\n        productGrid.firstElementChild.classList.add('product-grid--photo-expand')\n    }\n})();\n\nAndrewMartin.carousel();\nAndrewMartin.photoswipe();\nAndrewMartin.siteNotice();\nAndrewMartin.bloomreach();\nAndrewMartin.klaviyo();\n\n$('.magnific-link').magnificPopup({\n    type: 'inline',\n    mainClass: 'mfp--cover mfp-fade',\n    closeOnBgClick: false,\n    removalDelay: 300,\n    closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\"><svg class=\"icon-close\"><use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-close\" /></svg></button>'\n});\n\nfunction initProductVideos() {\n    var videoContainer = $('.product__video');\n    var video = $('.product__video video');\n\n    if (typeof videojs == 'undefined') {\n        return;\n    }\n\n    if (!video.length) {\n        return;\n    }\n\n    video.each(function(i) {\n        var player = videojs(this.id);\n\n        $(this).on('touchend click', function(e) {\n            if (player.paused()) {\n                playVideo();\n            } else {\n                pauseVideo();\n            }\n        });\n\n        function playVideo() {\n            player.play();\n            $(videoContainer[i]).addClass('product__video--playing');\n        }\n\n        function pauseVideo() {\n            player.pause();\n            $(videoContainer[i]).removeClass('product__video--playing');\n        }\n    })\n}\n\ninitProductVideos();\n\n$('.js-outlet-popup').magnificPopup({\n    midClick: true,\n    type: 'inline',\n    closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\"><svg class=\"icon-close\"><use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-close\" /></svg></button>',\n    mainClass: 'mfp--outlet mfp-fade',\n    callbacks: {\n        open: function() {\n\n            function slickArrow(icon, action) {\n                const svg = new Svg();\n\n                return '<button type=\"button\" class=\"slick-arrow slick-' + action + '\"><span>' + svg.render(icon) + '</span></button>';\n            }\n\n            $(\".js-carousel--outlet\").slick({\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                dots: true,\n                arrows: true,\n                swipe: true,\n                infinite: false,\n                autoplay: false,\n                fade: true,\n                speed: 600,\n                prevArrow: slickArrow('icon-arrow-large-left', 'prev'),\n                nextArrow: slickArrow('icon-arrow-large-right', 'next')\n            })\n        },\n\n        close: function() {\n            $(\".js-carousel--outlet\").slick('unslick');\n        }\n    }\n});\n\n//PDP extra info overlays\n\n(function() {\n    var svg = new Svg();\n\n    $('.js-open-details, .js-open-delivery, .js-open-product-details, .js-open-about').magnificPopup({\n        closeBtnInside: false,\n        mainClass: 'mfp-pdp mfp-fade',\n        removalDelay: 300,\n        closeMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">' + svg.render('close') + '</button>',\n        fixedContentPos: true,\n        callbacks: {\n            open: function () {\n                bindEventListenersToAccordionTabs();\n            }\n        }\n    })\n})();\n\nconst bindEventListenersToAccordionTabs = () => {\n    $('.js-tabs__product').on('click', function(e) {\n        e.preventDefault();\n        $('.product-tab__item--active').removeClass('product-tab__item--active');\n        $(this).addClass('product-tab__item--active');\n        $('[data-tabs][data-tabs-active=\\\"true\\\"]').attr('data-tabs-active', false);\n        $('[data-tabs][data-tabs-id=\\\"' + $(this).data('tabs-id') + '\\\"]').attr('data-tabs-active', true);\n        var tab = $(this).data('tabs-id');\n        if (tab != 1) {\n            $('input[name=tab]').val(tab);\n        } else {\n            $('input[name=tab]').val('');\n        }\n    });\n}\n\n// Should the customiser option be selected?\nfunction checkCustomiserSelection(selector) {\n    const breakpoint = AndrewMartin.breakpoints.tablet;\n\n    if (breakpoint) {\n        var type = breakpoint.type;\n        var size = breakpoint.size;\n        var valid = !window.matchMedia(`(${type}: ${size}px)`).matches;\n\n        if (valid) {\n            var input = $(selector);\n\n            if (input) {\n                input.prop('checked', true);\n            }\n        }\n    }\n}\n","var SELECTREPLACE = {\n    classes: {\n        focused:  'multi-select-replace--focused',\n        disabled: 'multi-select-replace--disabled',\n        // single:   'multi-select-replace--single',\n        multiple: 'multi-select-replace--multiple',\n        active: 'multi-select-replace--active',\n        search:   'multi-select-replace--search',\n        listitem: 'multi-select-replace__list-item',\n        selected: 'multi-select-replace__list-item--selected',\n        current:  'multi-select-replace__list-item--current',\n        nobbled:  'multi-select-replace__list-item--disabled',\n        hidden:   'multi-select-replace__list-item--hidden',\n        image:    'multi-select-replace__list-item--image',\n        overview: 'multi-select-replace__overview',\n        mobileOverview: 'multi-select-replace__mobile-overview',\n        action:   'multi-select-replace__action',\n        actions:  'multi-select-replace__actions',\n        icon:     'multi-select-replace__icon',\n        back:     'multi-select-replace__back',\n        count:    'multi-select-replace__count'\n    },\n\n    keys: {\n        up:     38,\n        dn:     40,\n        pgup:   33,\n        pgdn:   34,\n        escape: 27,\n        space:  32,\n        enter:  13,\n    },\n\n    page: 5,\n\n    $focused: false,\n\n    svgIconPath: AndrewMartin.svgSymbolsFile,\n    svgIcon: {\n        back: 'icon-select',\n        dropdown: 'icon-select',\n        selected: 'icon-tick',\n        clear: 'icon-close'\n    }\n};\n\n// Styled select elements\n$.fn.selectReplace = function() {\n    $(this).filter(':not(.multi-select-replaced)').each(function() {\n        var $select = $(this);\n\n        var $form     = $select.closest('form');\n        var $label    = $select.prev('label');\n        var $extra    = $select.next('.filterable__extra-content');\n        var $wrapper  = $select.wrap('<div class=\"multi-select-replace\"></div>').parent();\n        var $input    = $('<input class=\"multi-select-replace__search\">').appendTo($wrapper);\n        var $drop     = $('<div class=\"multi-select-replace__drop\"></div>').appendTo($wrapper);\n        var $up       = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--up\"></a>').appendTo($drop);\n        var $down     = $('<a href=\"#\" class=\"multi-select-replace__elevator-button multi-select-replace__elevator-button--down\"></a>').appendTo($drop);\n\n        var $list = $('<ul class=\"multi-select-replace__list\"></ul>');\n\n        $select.find('option').each(function(ndx) {\n            var $option = $(this);\n\n            var $li = $('<li class=\"' + SELECTREPLACE.classes.listitem + '\" data-value=\"' + $option.val() + '\"><a href=\"#0\">' + $option.text() + '</a></li>');\n\n            if ($option.is('[data-hidden]')) {\n                $li.addClass(SELECTREPLACE.classes.hidden);\n            }\n\n            if ($option.is(':disabled')) {\n                $li.addClass(SELECTREPLACE.classes.nobbled);\n            }\n\n            if ($option.attr('data-image') !== undefined) {\n                $('<img src=\"' + $option.attr('data-image') + '\" />').appendTo($li);\n                $li.addClass(SELECTREPLACE.classes.image);\n            }\n\n            $li.appendTo($list);\n\n            var $icon = $('<span class=\"multi-select-replace__status\"><svg class=\"' + SELECTREPLACE.svgIcon.selected + '\">\\\n                <use xlink:href=\"' + SELECTREPLACE.svgIconPath + '#' + SELECTREPLACE.svgIcon.selected + '\" />\\\n            </svg></span>').appendTo($li);\n\n\n            if ($option.text().toLowerCase() == 'multicoloured') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch multi-select-replace__swatch--multicoloured\"></div>').prependTo($li);\n            } else if ($option.attr('color') !== '') {\n                var $swatch = $('<div class=\"multi-select-replace__swatch\" style=\"color: ' + $option.attr('color') + ';\"></div>').prependTo($li);\n            }\n        });\n\n        var all = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--all\">Select all</span>';\n        var clear = '<span class=\"' + SELECTREPLACE.classes.action + ' ' + SELECTREPLACE.classes.action + '--clear\">Clear all</span>';\n\n        var $overviewMobile = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-1\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overviewMobile.appendTo($drop);\n\n        var $overview = $('<div class=\"' + SELECTREPLACE.classes.listitem + ' ' + SELECTREPLACE.classes.listitem + '--overview ' + SELECTREPLACE.classes.listitem + '--overview-2\" data-value=\"all\"><div class=\"' + SELECTREPLACE.classes.actions + '\">' + all + clear + '</div></div>');\n        $overview.appendTo($drop);\n\n        $list.appendTo($drop);\n\n        if ($extra) {\n            $extra.appendTo($drop);\n        }\n\n        var $options = $list.find('li');\n\n        $wrapper.addClass(SELECTREPLACE.classes.multiple);\n\n        if ($select.prop('id')) {\n            $select.parent().prop('id', $select.prop('id') + '_replace');\n        }\n\n        $select.addClass('multi-select-replaced');\n\n        $label.on('click', function(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            deactivateFilterRanges($('.js-filter-ranges'))\n            if (SELECTREPLACE.$focused) {\n                if (SELECTREPLACE.$focused !== $wrapper) {\n                    // clicked a different select\n                    SELECTREPLACE.$focused.trigger('_blur');\n\n                    $wrapper.trigger('_focus');\n                } else {\n                    $wrapper.trigger('_blur');\n                }\n            } else {\n                $wrapper.trigger('_focus');\n            }\n        });\n\n        $list.on('click', '.' + SELECTREPLACE.classes.listitem, function(e) {\n            e.preventDefault();\n\n            var $item = $(this);\n\n            // if ($item.data('value') != 'all') {\n                $item.toggleClass(SELECTREPLACE.classes.selected);\n\n                var eventName = $item.hasClass(SELECTREPLACE.classes.selected) ? '_selected' : '_unselected';\n\n                $select.trigger(eventName, this);\n            // }\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.back, function(e) {\n            $wrapper.trigger('_blur');\n        });\n\n        $wrapper.on('click', '.' + SELECTREPLACE.classes.actions, function(e) {\n            var $items = $list.find('.' + SELECTREPLACE.classes.listitem)//.not($item);\n\n            var showAll;\n\n            $wrapper.find('.' + SELECTREPLACE.classes.actions).each(function() {\n                var $item = $(this).parent();\n                $item.data('active', !$item.data('active'));\n\n                showAll = $item.data('active');\n\n                $overviewMobile.attr('data-all', showAll);\n                $overview.attr('data-all', showAll);\n            });\n\n            $items.each(function() {\n                var $item = $(this);\n                var eventName = '_unselected';\n                $item.removeClass(SELECTREPLACE.classes.selected);\n\n                if (showAll) {\n                    $item.addClass(SELECTREPLACE.classes.selected);\n                    eventName = '_selected';\n                }\n\n                $select.trigger(eventName, this);\n            });\n\n            $wrapper.trigger('_change');\n        });\n\n        $wrapper.on('_focus', function(e) {\n            SELECTREPLACE.$focused = $wrapper;\n            $wrapper.addClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').addClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').addClass('filterable__content--active');\n            countListItems(e)\n        });\n\n        // Count number of li's\n\n        function countListItems(e) {\n\n            var list = e.target.querySelector('.multi-select-replace__list')\n            var drop = list.parentElement\n\n            if ( list.childElementCount > 17) {\n                list.classList.add('multi-select-replace__list--large')\n                drop.classList.add('multi-select-replace__drop--large')\n\n            } else if ( list.childElementCount >= 7) {\n                list.classList.add('multi-select-replace__list--medium')\n\n            } else if ( list.childElementCount <= 6) {\n                list.classList.add('multi-select-replace__list--small')\n            }\n\n            var centrePoint = (window.innerWidth / 2);\n\n            if (drop.getBoundingClientRect().x > centrePoint) {\n                drop.classList.add('multi-select-replace__drop--right-align')\n            }\n        }\n\n        $wrapper.on('_blur', function() {\n            SELECTREPLACE.$focused = false;\n            $wrapper.removeClass(SELECTREPLACE.classes.focused);\n            $wrapper.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n            $wrapper.parents('.filterable__content').removeClass('filterable__content--active');\n        });\n\n        $wrapper.on('_change', function(e, initial) {\n            var $selected = $options.filter('.' + SELECTREPLACE.classes.selected).not('[data-value=\"all\"]');\n            var $items = $options.not('[data-value=\"all\"]');\n\n            var selectValue = '';\n            if ($select.data('blank') !== undefined) {\n                selectValue = $select.data('blank');\n            }\n\n            var html = '';\n\n            if ($selected.length) {\n                $selected.each(function(i) {\n                    html += $(this).find('a').html();\n\n                    if (i < $selected.length - 1) {\n                        html += ', ';\n                    }\n                });\n                selectValue = $selected.length + ' selected';\n                $wrapper.addClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().addClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').show();\n            } else {\n                html = 'None selected';\n                $wrapper.removeClass(SELECTREPLACE.classes.active);\n                $wrapper.parent().removeClass('filterable__dimension--has-selection');\n                $('.js-clear-filters').hide();\n            }\n\n            $wrapper.find('.' + SELECTREPLACE.classes.count).html($selected.length);\n\n            if ($selected.length > 0) {\n                $label.find('.js-filterable__count').html('(' + $selected.length + ')');\n            } else {\n                $label.find('.js-filterable__count').html('');\n            }\n\n            if ($selected.length == 0) {\n                $overview.data('active', false);\n                $overview.attr('data-all', false);\n                $overviewMobile.attr('data-all', false);\n            } else {\n                $overview.data('active', true);\n                $overview.attr('data-all', true);\n                $overviewMobile.attr('data-all', true);\n            }\n\n            // $value.html(selectValue);\n            $wrapper.find('.' + SELECTREPLACE.classes.overview).html(html).attr('data-is-empty', $selected.length == 0);\n\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($options.eq(ndx).hasClass(SELECTREPLACE.classes.selected)) {\n                    $option.prop('selected', true);\n                } else {\n                    $option.prop('selected', null);\n                }\n            });\n\n            if (!initial) {\n                $select.trigger('change', initial);\n            }\n        });\n\n        $(document).on('keydown', function(e) {\n            if (!SELECTREPLACE.$focused) {\n                return;\n            }\n\n            if (e.which == SELECTREPLACE.keys.escape) {\n                $wrapper.trigger('_blur');\n            }\n        });\n\n        $select.on('_change', function() {\n            $select.find('option').each(function(ndx) {\n                var $option = $(this);\n\n                if ($option.prop('selected')) {\n                    $li = $options.eq(ndx);\n                    $li.addClass(SELECTREPLACE.classes.selected);\n                }\n            });\n        });\n\n        $form.on('reset', function(e) {\n            $options.removeClass(SELECTREPLACE.classes.selected);\n            $wrapper.trigger('_change');\n        });\n\n        $select.trigger('_change', true);\n    });\n};\n\n$(document).on('click', function(e) {\n    if (SELECTREPLACE.$focused) {\n        if (!$.contains(SELECTREPLACE.$focused.get(0), e.target)) {\n            // clicked outside of the current select\n            SELECTREPLACE.$focused.trigger('_blur');\n        }\n    }\n});\n\n$('select[multiple]').selectReplace();\n","if (typeof SVG_DEFAULT_PATH == \"undefined\") {\n    var SVG_DEFAULT_PATH = '/images/svg-symbols.svg';\n}\nif (typeof SVG_DEFAULT_PREFIX == \"undefined\") {\n    var SVG_DEFAULT_PREFIX = 'icon';\n}\nfunction Svg() {\n\n    this.imagePath = SVG_DEFAULT_PATH;\n\n    this.imageClassPrefix = SVG_DEFAULT_PREFIX;\n\n    this.setImagePath = function(path) {\n        if (path) {\n            this.imagePath = path;\n        }\n    }\n\n    this.setImageClassPrefix = function(prefix) {\n        if (prefix) {\n            this.imageClassPrefix = prefix;\n        }\n    }\n\n    this.render = function(icon) {\n        return '<svg role=\"img\" class=\"' + this.imageClassPrefix + '-' + this.prepare(icon) + '\">' +\n                        '<use xlink:href=\"' + this.imagePath + '#icon-' + this.prepare(icon) + '\"></use>' +\n                    '</svg>'\n    }\n\n    this.prepare = function(icon) {\n        return icon.replace('icon-', '');\n    }\n}\n","/*\n * Copyright 2014 D3R Ltd\n * http://d3r.com\n *\n * D3R Standard Javascript\n *\n * You'll want at least:\n\n    .js .d3r-show,\n    .js .d3r-hide {\n        cursor: pointer;\n    }\n    .js .d3r-hidden {\n        display: none;\n    }\n    .js .d3r-shown {\n        display: block;\n    }\n    .d3r-chooser {\n\n    }\n        .d3r-chooser-option,\n        .d3r-multichooser-option {\n            display: none;\n        }\n *\n */\n\n// hidey showey\n$(document).on('click', '.d3r-show, .d3r-hide', function(e) {\n    var $this = $(this),\n        $target;\n    if ($this.is('a')) e.preventDefault();\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href')[0]) {\n        $target = $($this.attr('href'));\n    }\n    if ($target.length) {\n        var hide = $this.hasClass('d3r-hide');\n        $target[hide ? 'toggleClass' : 'addClass']('d3r-shown');\n        $this[hide ? 'toggleClass' : 'addClass']('d3r-active');\n    }\n    if ($target.hasClass('d3r-shown') && $this.hasClass('d3r-autoclose')) {\n        var autoclose = function(e) {\n            if (!$.contains($target[0], e.target)) {\n                if ($target.hasClass('d3r-shown')) {\n                    e.preventDefault();\n                    $target.removeClass('d3r-shown');\n                    $this.removeClass('d3r-active');\n                }\n                $(document).off('click', autoclose);\n            }\n        };\n        $(document).on('click', autoclose);\n    }\n});\n// redirect from dropdowns\n$(document).on('change', 'select.d3r-redirector', function(e) {\n    window.location.assign($(this).val());\n});\n// display things based on dropdowns\n$(document).on('change', 'select.d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('id')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n    if ($this.val()) {\n        selectors.push('#' + $this.val());\n    }\n\n    $options.filter(selectors.join(',')).addClass('d3r-shown');\n});\n$(document).on('change', 'select.d3r-multichooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-multichooser-option').filter('[data-multichooser=\"'+$this.attr('id')+'\"]'),\n        $option = $('option:selected', this);\n    $options.removeClass('d3r-shown');\n    $.each($option.data('values').split(' '), function(index, val) {\n        var selectors = ['[data-chooservalue=\"' + val + '\"]'];\n\n        if (val) {\n            selectors.push('#' + val);\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    });\n});\n$(document).on('change', 'input[type=\"radio\"].d3r-chooser', function(e) {\n    var $this = $(this),\n        $options = $('.d3r-chooser-option').filter('[data-chooser=\"'+$this.attr('name')+'\"]');\n    $options.removeClass('d3r-shown');\n\n    if ($this.is(':checked')) {\n        var selectors = ['[data-chooservalue=\"' + $this.val() + '\"]'];\n\n        if ($this.val()) {\n            selectors.push('#' + $this.val());\n        }\n\n        $options.filter(selectors.join(',')).addClass('d3r-shown');\n    }\n});\n\n$('input[type=\"radio\"].d3r-chooser:checked').trigger('change');\n\n$(document).on('click', '.d3r-submit', function(e) {\n    var $this = $(this);\n\n    // If the form is invalid, don't disable the button.\n    if ($this.closest('form') &&\n        !$this.closest('form')[0].checkValidity()) {\n        return;\n    }\n    // The timeout is to allow this submission to proceed. Nasty I know, sorry.\n    if ($this.hasClass('d3r-disabled')) {\n        e.preventDefault();\n    }\n    $this.addClass('d3r-disabled');\n    if (!$this.is('a')) {\n        setTimeout(function() {\n            $this.prop('disabled', true);\n        }, 0);\n    }\n});\n$(document).on('click', '.d3r-confirm', function(e) {\n    var $this = $(this),\n        message = 'Are you sure?';\n    if (!!$this.data('confirm')) message = $this.data('confirm');\n    if (!window.confirm(message)) e.preventDefault();\n});\n$(document).on('click', '.d3r-scrollto', function(e) {\n    var $this = $(this),\n        $target;\n    if (!!$this.data('target')) {\n        $target = $('#'+$this.data('target'));\n    } else if (!!$this.attr('href') && \"#\" == $this.attr('href').replace(window.location.pathname,\"\")[0]) {\n        $target = $($this.attr('href').replace(window.location.pathname,\"\"));\n    }\n    if ($target.length) {\n        var hash = $target.attr(\"id\");\n        $target.removeAttr(\"id\");\n        $(\"html,body\").animate({\n            scrollTop: $target.offset().top\n        }, 500, function() {\n            $target.attr(\"id\", hash);\n        });\n    }\n});\n$(document).on('click', '.d3r-popup', function(e) {\n    e.preventDefault();\n    var $this = $(this),\n        url = $this.attr('href'),\n        width = 600,\n        height = 300,\n        target = 'popup';\n    if (!!$this.data('width')) width = $this.data('width');\n    if (!!$this.data('height')) height = $this.data('height');\n    if (!!$this.attr('target')) target = $this.attr('target');\n\n    var newwindow = window.open(url, target ,'height='+height+',width='+width);\n    if (window.focus) newwindow.focus();\n});\n","!function(e){\"function\"==typeof define&&define.amd?define([\"jquery\"],e):\"object\"==typeof exports?e(require(\"jquery\")):e(window.jQuery||window.Zepto)}(function(c){function e(){}function d(e,t){m.ev.on(x+e+I,t)}function p(e,t,n,o){var i=document.createElement(\"div\");return i.className=\"mfp-\"+e,n&&(i.innerHTML=n),o?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function u(e,t){m.ev.triggerHandler(x+e,t),m.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),m.st.callbacks[e])&&m.st.callbacks[e].apply(m,Array.isArray(t)?t:[t])}function f(e){return e===A&&m.currTemplate.closeBtn||(m.currTemplate.closeBtn=c(m.st.closeMarkup.replace(\"%title%\",m.st.tClose)),A=e),m.currTemplate.closeBtn}function r(){c.magnificPopup.instance||((m=new e).init(),c.magnificPopup.instance=m)}function a(){y&&(v.after(y.addClass(l)).detach(),y=null)}function i(){n&&c(document.body).removeClass(n)}function t(){i(),m.req&&m.req.abort()}var m,o,g,s,h,A,l,v,y,n,w=\"Close\",F=\"BeforeClose\",C=\"MarkupParse\",b=\"Open\",j=\"Change\",x=\"mfp\",I=\".\"+x,T=\"mfp-ready\",N=\"mfp-removing\",k=\"mfp-prevent-close\",P=!!window.jQuery,_=c(window),S=(c.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;m.isLowIE=m.isIE8=document.all&&!document.addEventListener,m.isAndroid=/android/gi.test(e),m.isIOS=/iphone|ipad|ipod/gi.test(e),m.supportsTransition=function(){var e=document.createElement(\"p\").style,t=[\"ms\",\"O\",\"Moz\",\"Webkit\"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+\"Transition\"in e)return!0;return!1}(),m.probablyMobile=m.isAndroid||m.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),m.popupsCache={}},open:function(e){if(!1===e.isObj){m.items=e.items.toArray(),m.index=0;for(var t,n=e.items,o=0;o<n.length;o++)if((t=(t=n[o]).parsed?t.el[0]:t)===e.el[0]){m.index=o;break}}else m.items=Array.isArray(e.items)?e.items:[e.items],m.index=e.index||0;if(!m.isOpen){m.types=[],h=\"\",e.mainEl&&e.mainEl.length?m.ev=e.mainEl.eq(0):m.ev=g,e.key?(m.popupsCache[e.key]||(m.popupsCache[e.key]={}),m.currTemplate=m.popupsCache[e.key]):m.currTemplate={},m.st=c.extend(!0,{},c.magnificPopup.defaults,e),m.fixedContentPos=\"auto\"===m.st.fixedContentPos?!m.probablyMobile:m.st.fixedContentPos,m.st.modal&&(m.st.closeOnContentClick=!1,m.st.closeOnBgClick=!1,m.st.showCloseBtn=!1,m.st.enableEscapeKey=!1),m.bgOverlay||(m.bgOverlay=p(\"bg\").on(\"click\"+I,function(){m.close()}),m.wrap=p(\"wrap\").attr(\"tabindex\",-1).on(\"click\"+I,function(e){m._checkIfClose(e.target)&&m.close()}),m.container=p(\"container\",m.wrap)),m.contentContainer=p(\"content\"),m.st.preloader&&(m.preloader=p(\"preloader\",m.container,m.st.tLoading));var i=c.magnificPopup.modules;for(o=0;o<i.length;o++){var r=(r=i[o]).charAt(0).toUpperCase()+r.slice(1);m[\"init\"+r].call(m)}u(\"BeforeOpen\"),m.st.showCloseBtn&&(m.st.closeBtnInside?(d(C,function(e,t,n,o){n.close_replaceWith=f(o.type)}),h+=\" mfp-close-btn-in\"):m.wrap.append(f())),m.st.alignTop&&(h+=\" mfp-align-top\"),m.fixedContentPos?m.wrap.css({overflow:m.st.overflowY,overflowX:\"hidden\",overflowY:m.st.overflowY}):m.wrap.css({top:_.scrollTop(),position:\"absolute\"}),!1!==m.st.fixedBgPos&&(\"auto\"!==m.st.fixedBgPos||m.fixedContentPos)||m.bgOverlay.css({height:g.height(),position:\"absolute\"}),m.st.enableEscapeKey&&g.on(\"keyup\"+I,function(e){27===e.keyCode&&m.close()}),_.on(\"resize\"+I,function(){m.updateSize()}),m.st.closeOnContentClick||(h+=\" mfp-auto-cursor\"),h&&m.wrap.addClass(h);var a=m.wH=_.height(),s={},l=(m.fixedContentPos&&m._hasScrollBar(a)&&(l=m._getScrollbarSize())&&(s.marginRight=l),m.fixedContentPos&&(m.isIE7?c(\"body, html\").css(\"overflow\",\"hidden\"):s.overflow=\"hidden\"),m.st.mainClass);return m.isIE7&&(l+=\" mfp-ie7\"),l&&m._addClassToMFP(l),m.updateItemHTML(),u(\"BuildControls\"),c(\"html\").css(s),m.bgOverlay.add(m.wrap).prependTo(m.st.prependTo||c(document.body)),m._lastFocusedEl=document.activeElement,setTimeout(function(){m.content?(m._addClassToMFP(T),m._setFocus()):m.bgOverlay.addClass(T),g.on(\"focusin\"+I,m._onFocusIn)},16),m.isOpen=!0,m.updateSize(a),u(b),e}m.updateItemHTML()},close:function(){m.isOpen&&(u(F),m.isOpen=!1,m.st.removalDelay&&!m.isLowIE&&m.supportsTransition?(m._addClassToMFP(N),setTimeout(function(){m._close()},m.st.removalDelay)):m._close())},_close:function(){u(w);var e=N+\" \"+T+\" \";m.bgOverlay.detach(),m.wrap.detach(),m.container.empty(),m.st.mainClass&&(e+=m.st.mainClass+\" \"),m._removeClassFromMFP(e),m.fixedContentPos&&(e={marginRight:\"\"},m.isIE7?c(\"body, html\").css(\"overflow\",\"\"):e.overflow=\"\",c(\"html\").css(e)),g.off(\"keyup.mfp focusin\"+I),m.ev.off(I),m.wrap.attr(\"class\",\"mfp-wrap\").removeAttr(\"style\"),m.bgOverlay.attr(\"class\",\"mfp-bg\"),m.container.attr(\"class\",\"mfp-container\"),!m.st.showCloseBtn||m.st.closeBtnInside&&!0!==m.currTemplate[m.currItem.type]||m.currTemplate.closeBtn&&m.currTemplate.closeBtn.detach(),m.st.autoFocusLast&&m._lastFocusedEl&&c(m._lastFocusedEl).trigger(\"focus\"),m.currItem=null,m.content=null,m.currTemplate=null,m.prevHeight=0,u(\"AfterClose\")},updateSize:function(e){var t;m.isIOS?(t=document.documentElement.clientWidth/window.innerWidth,t=window.innerHeight*t,m.wrap.css(\"height\",t),m.wH=t):m.wH=e||_.height(),m.fixedContentPos||m.wrap.css(\"height\",m.wH),u(\"Resize\")},updateItemHTML:function(){var e=m.items[m.index],t=(m.contentContainer.detach(),m.content&&m.content.detach(),(e=e.parsed?e:m.parseEl(m.index)).type),n=(u(\"BeforeChange\",[m.currItem?m.currItem.type:\"\",t]),m.currItem=e,m.currTemplate[t]||(n=!!m.st[t]&&m.st[t].markup,u(\"FirstMarkupParse\",n),m.currTemplate[t]=!n||c(n)),s&&s!==e.type&&m.container.removeClass(\"mfp-\"+s+\"-holder\"),m[\"get\"+t.charAt(0).toUpperCase()+t.slice(1)](e,m.currTemplate[t]));m.appendContent(n,t),e.preloaded=!0,u(j,e),s=e.type,m.container.prepend(m.contentContainer),u(\"AfterChange\")},appendContent:function(e,t){(m.content=e)?m.st.showCloseBtn&&m.st.closeBtnInside&&!0===m.currTemplate[t]?m.content.find(\".mfp-close\").length||m.content.append(f()):m.content=e:m.content=\"\",u(\"BeforeAppend\"),m.container.addClass(\"mfp-\"+t+\"-holder\"),m.contentContainer.append(m.content)},parseEl:function(e){var t,n=m.items[e];if((n=n.tagName?{el:c(n)}:(t=n.type,{data:n,src:n.src})).el){for(var o=m.types,i=0;i<o.length;i++)if(n.el.hasClass(\"mfp-\"+o[i])){t=o[i];break}n.src=n.el.attr(\"data-mfp-src\"),n.src||(n.src=n.el.attr(\"href\"))}return n.type=t||m.st.type||\"inline\",n.index=e,n.parsed=!0,m.items[e]=n,u(\"ElementParse\",n),m.items[e]},addGroup:function(t,n){function e(e){e.mfpEl=this,m._openClick(e,t,n)}var o=\"click.magnificPopup\";(n=n||{}).mainEl=t,n.items?(n.isObj=!0,t.off(o).on(o,e)):(n.isObj=!1,n.delegate?t.off(o).on(o,n.delegate,e):(n.items=t).off(o).on(o,e))},_openClick:function(e,t,n){var o=(void 0!==n.midClick?n:c.magnificPopup.defaults).midClick;if(o||!(2===e.which||e.ctrlKey||e.metaKey||e.altKey||e.shiftKey)){o=(void 0!==n.disableOn?n:c.magnificPopup.defaults).disableOn;if(o)if(\"function\"==typeof o){if(!o.call(m))return!0}else if(_.width()<o)return!0;e.type&&(e.preventDefault(),m.isOpen)&&e.stopPropagation(),n.el=c(e.mfpEl),n.delegate&&(n.items=t.find(n.delegate)),m.open(n)}},updateStatus:function(e,t){var n;m.preloader&&(o!==e&&m.container.removeClass(\"mfp-s-\"+o),n={status:e,text:t=t||\"loading\"!==e?t:m.st.tLoading},u(\"UpdateStatus\",n),e=n.status,t=n.text,m.st.allowHTMLInStatusIndicator?m.preloader.html(t):m.preloader.text(t),m.preloader.find(\"a\").on(\"click\",function(e){e.stopImmediatePropagation()}),m.container.addClass(\"mfp-s-\"+e),o=e)},_checkIfClose:function(e){if(!c(e).closest(\".\"+k).length){var t=m.st.closeOnContentClick,n=m.st.closeOnBgClick;if(t&&n)return!0;if(!m.content||c(e).closest(\".mfp-close\").length||m.preloader&&e===m.preloader[0])return!0;if(e===m.content[0]||c.contains(m.content[0],e)){if(t)return!0}else if(n&&c.contains(document,e))return!0;return!1}},_addClassToMFP:function(e){m.bgOverlay.addClass(e),m.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),m.wrap.removeClass(e)},_hasScrollBar:function(e){return(m.isIE7?g.height():document.body.scrollHeight)>(e||_.height())},_setFocus:function(){(m.st.focus?m.content.find(m.st.focus).eq(0):m.wrap).trigger(\"focus\")},_onFocusIn:function(e){if(e.target!==m.wrap[0]&&!c.contains(m.wrap[0],e.target))return m._setFocus(),!1},_parseMarkup:function(i,e,t){var r;t.data&&(e=c.extend(t.data,e)),u(C,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,o;1<(r=e.split(\"_\")).length?0<(n=i.find(I+\"-\"+r[0])).length&&(\"replaceWith\"===(o=r[1])?n[0]!==t[0]&&n.replaceWith(t):\"img\"===o?n.is(\"img\")?n.attr(\"src\",t):n.replaceWith(c(\"<img>\").attr(\"src\",t).attr(\"class\",n.attr(\"class\"))):n.attr(r[1],t)):m.st.allowHTMLInTemplate?i.find(I+\"-\"+e).html(t):i.find(I+\"-\"+e).text(t)})},_getScrollbarSize:function(){var e;return void 0===m.scrollbarSize&&((e=document.createElement(\"div\")).style.cssText=\"width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;\",document.body.appendChild(e),m.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),m.scrollbarSize}},modules:[],open:function(e,t){return r(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:\"\",preloader:!0,focus:\"\",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:\"auto\",fixedBgPos:\"auto\",overflowY:\"auto\",closeMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&#215;</button>',tClose:\"Close (Esc)\",tLoading:\"Loading...\",autoFocusLast:!0,allowHTMLInStatusIndicator:!1,allowHTMLInTemplate:!1}},c.fn.magnificPopup=function(e){r();var t,n,o,i=c(this);return\"string\"==typeof e?\"open\"===e?(t=P?i.data(\"magnificPopup\"):i[0].magnificPopup,n=parseInt(arguments[1],10)||0,o=t.items?t.items[n]:(o=i,(o=t.delegate?o.find(t.delegate):o).eq(n)),m._openClick({mfpEl:o},i,t)):m.isOpen&&m[e].apply(m,Array.prototype.slice.call(arguments,1)):(e=c.extend(!0,{},e),P?i.data(\"magnificPopup\",e):i[0].magnificPopup=e,m.addGroup(i,e)),i},\"inline\"),E=(c.magnificPopup.registerModule(S,{options:{hiddenClass:\"hide\",markup:\"\",tNotFound:\"Content not found\"},proto:{initInline:function(){m.types.push(S),d(w+\".\"+S,function(){a()})},getInline:function(e,t){var n,o,i;return a(),e.src?(n=m.st.inline,(o=c(e.src)).length?((i=o[0].parentNode)&&i.tagName&&(v||(l=n.hiddenClass,v=p(l),l=\"mfp-\"+l),y=o.after(v).detach().removeClass(l)),m.updateStatus(\"ready\")):(m.updateStatus(\"error\",n.tNotFound),o=c(\"<div>\")),e.inlineElement=o):(m.updateStatus(\"ready\"),m._parseMarkup(t,{},e),t)}}}),\"ajax\");c.magnificPopup.registerModule(E,{options:{settings:null,cursor:\"mfp-ajax-cur\",tError:\"The content could not be loaded.\"},proto:{initAjax:function(){m.types.push(E),n=m.st.ajax.cursor,d(w+\".\"+E,t),d(\"BeforeChange.\"+E,t)},getAjax:function(o){n&&c(document.body).addClass(n),m.updateStatus(\"loading\");var e=c.extend({url:o.src,success:function(e,t,n){e={data:e,xhr:n};u(\"ParseAjax\",e),m.appendContent(c(e.data),E),o.finished=!0,i(),m._setFocus(),setTimeout(function(){m.wrap.addClass(T)},16),m.updateStatus(\"ready\"),u(\"AjaxContentAdded\")},error:function(){i(),o.finished=o.loadError=!0,m.updateStatus(\"error\",m.st.ajax.tError.replace(\"%url%\",o.src))}},m.st.ajax.settings);return m.req=c.ajax(e),\"\"}}});var z;c.magnificPopup.registerModule(\"image\",{options:{markup:'<div class=\"mfp-figure\"><div class=\"mfp-close\"></div><figure><div class=\"mfp-img\"></div><figcaption><div class=\"mfp-bottom-bar\"><div class=\"mfp-title\"></div><div class=\"mfp-counter\"></div></div></figcaption></figure></div>',cursor:\"mfp-zoom-out-cur\",titleSrc:\"title\",verticalFit:!0,tError:\"The image could not be loaded.\"},proto:{initImage:function(){var e=m.st.image,t=\".image\";m.types.push(\"image\"),d(b+t,function(){\"image\"===m.currItem.type&&e.cursor&&c(document.body).addClass(e.cursor)}),d(w+t,function(){e.cursor&&c(document.body).removeClass(e.cursor),_.off(\"resize\"+I)}),d(\"Resize\"+t,m.resizeImage),m.isLowIE&&d(\"AfterChange\",m.resizeImage)},resizeImage:function(){var e,t=m.currItem;t&&t.img&&m.st.image.verticalFit&&(e=0,m.isLowIE&&(e=parseInt(t.img.css(\"padding-top\"),10)+parseInt(t.img.css(\"padding-bottom\"),10)),t.img.css(\"max-height\",m.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,z&&clearInterval(z),e.isCheckingImgSize=!1,u(\"ImageHasSize\",e),e.imgHidden)&&(m.content&&m.content.removeClass(\"mfp-loading\"),e.imgHidden=!1)},findImageSize:function(t){function n(e){z&&clearInterval(z),z=setInterval(function(){0<i.naturalWidth?m._onImageHasSize(t):(200<o&&clearInterval(z),3===++o?n(10):40===o?n(50):100===o&&n(500))},e)}var o=0,i=t.img[0];n(1)},getImage:function(e,t){function n(){e&&(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))),e.hasSize=!0,e.loaded=!0,e.loadError=!0)}function o(){e&&(e.img[0].complete?(e.img.off(\".mfploader\"),e===m.currItem&&(m._onImageHasSize(e),m.updateStatus(\"ready\")),e.hasSize=!0,e.loaded=!0,u(\"ImageLoadComplete\")):++r<200?setTimeout(o,100):n())}var i,r=0,a=m.st.image,s=t.find(\".mfp-img\");return s.length&&((i=document.createElement(\"img\")).className=\"mfp-img\",e.el&&e.el.find(\"img\").length&&(i.alt=e.el.find(\"img\").attr(\"alt\")),e.img=c(i).on(\"load.mfploader\",o).on(\"error.mfploader\",n),i.src=e.src,s.is(\"img\")&&(e.img=e.img.clone()),0<(i=e.img[0]).naturalWidth?e.hasSize=!0:i.width||(e.hasSize=!1)),m._parseMarkup(t,{title:function(e){if(e.data&&void 0!==e.data.title)return e.data.title;var t=m.st.image.titleSrc;if(t){if(\"function\"==typeof t)return t.call(m,e);if(e.el)return e.el.attr(t)||\"\"}return\"\"}(e),img_replaceWith:e.img},e),m.resizeImage(),e.hasSize?(z&&clearInterval(z),e.loadError?(t.addClass(\"mfp-loading\"),m.updateStatus(\"error\",a.tError.replace(\"%url%\",e.src))):(t.removeClass(\"mfp-loading\"),m.updateStatus(\"ready\"))):(m.updateStatus(\"loading\"),e.loading=!0,e.hasSize||(e.imgHidden=!0,t.addClass(\"mfp-loading\"),m.findImageSize(e))),t}}});function O(e){var t;m.currTemplate[L]&&(t=m.currTemplate[L].find(\"iframe\")).length&&(e||(t[0].src=\"//about:blank\"),m.isIE8)&&t.css(\"display\",e?\"block\":\"none\")}function M(e){var t=m.items.length;return t-1<e?e-t:e<0?t+e:e}function D(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)}c.magnificPopup.registerModule(\"zoom\",{options:{enabled:!1,easing:\"ease-in-out\",duration:300,opener:function(e){return e.is(\"img\")?e:e.find(\"img\")}},proto:{initZoom:function(){var e,t,n,o,i,r,a=m.st.zoom,s=\".zoom\";a.enabled&&m.supportsTransition&&(t=a.duration,n=function(e){var e=e.clone().removeAttr(\"style\").removeAttr(\"class\").addClass(\"mfp-animated-image\"),t=\"all \"+a.duration/1e3+\"s \"+a.easing,n={position:\"fixed\",zIndex:9999,left:0,top:0,\"-webkit-backface-visibility\":\"hidden\"},o=\"transition\";return n[\"-webkit-\"+o]=n[\"-moz-\"+o]=n[\"-o-\"+o]=n[o]=t,e.css(n),e},o=function(){m.content.css(\"visibility\",\"visible\")},d(\"BuildControls\"+s,function(){m._allowZoom()&&(clearTimeout(i),m.content.css(\"visibility\",\"hidden\"),(e=m._getItemToZoom())?((r=n(e)).css(m._getOffset()),m.wrap.append(r),i=setTimeout(function(){r.css(m._getOffset(!0)),i=setTimeout(function(){o(),setTimeout(function(){r.remove(),e=r=null,u(\"ZoomAnimationEnded\")},16)},t)},16)):o())}),d(F+s,function(){if(m._allowZoom()){if(clearTimeout(i),m.st.removalDelay=t,!e){if(!(e=m._getItemToZoom()))return;r=n(e)}r.css(m._getOffset(!0)),m.wrap.append(r),m.content.css(\"visibility\",\"hidden\"),setTimeout(function(){r.css(m._getOffset())},16)}}),d(w+s,function(){m._allowZoom()&&(o(),r&&r.remove(),e=null)}))},_allowZoom:function(){return\"image\"===m.currItem.type},_getItemToZoom:function(){return!!m.currItem.hasSize&&m.currItem.img},_getOffset:function(e){var e=e?m.currItem.img:m.st.zoom.opener(m.currItem.el||m.currItem),t=e.offset(),n=parseInt(e.css(\"padding-top\"),10),o=parseInt(e.css(\"padding-bottom\"),10),e=(t.top-=c(window).scrollTop()-n,{width:e.width(),height:(P?e.innerHeight():e[0].offsetHeight)-o-n});return(B=void 0===B?void 0!==document.createElement(\"p\").style.MozTransform:B)?e[\"-moz-transform\"]=e.transform=\"translate(\"+t.left+\"px,\"+t.top+\"px)\":(e.left=t.left,e.top=t.top),e}}});var B,L=\"iframe\",H=(c.magnificPopup.registerModule(L,{options:{markup:'<div class=\"mfp-iframe-scaler\"><div class=\"mfp-close\"></div><iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe></div>',srcAction:\"iframe_src\",patterns:{youtube:{index:\"youtube.com\",id:\"v=\",src:\"//www.youtube.com/embed/%id%?autoplay=1\"},vimeo:{index:\"vimeo.com/\",id:\"/\",src:\"//player.vimeo.com/video/%id%?autoplay=1\"},gmaps:{index:\"//maps.google.\",src:\"%id%&output=embed\"}}},proto:{initIframe:function(){m.types.push(L),d(\"BeforeChange\",function(e,t,n){t!==n&&(t===L?O():n===L&&O(!0))}),d(w+\".\"+L,function(){O()})},getIframe:function(e,t){var n=e.src,o=m.st.iframe,i=(c.each(o.patterns,function(){if(-1<n.indexOf(this.index))return this.id&&(n=\"string\"==typeof this.id?n.substr(n.lastIndexOf(this.id)+this.id.length,n.length):this.id.call(this,n)),n=this.src.replace(\"%id%\",n),!1}),{});return o.srcAction&&(i[o.srcAction]=n),m._parseMarkup(t,i,e),m.updateStatus(\"ready\"),t}}}),c.magnificPopup.registerModule(\"gallery\",{options:{enabled:!1,arrowMarkup:'<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:\"Previous (Left arrow key)\",tNext:\"Next (Right arrow key)\",tCounter:\"%curr% of %total%\",langDir:null,loop:!0},proto:{initGallery:function(){var r=m.st.gallery,e=\".mfp-gallery\";if(m.direction=!0,!r||!r.enabled)return!1;r.langDir||(r.langDir=document.dir||\"ltr\"),h+=\" mfp-gallery\",d(b+e,function(){r.navigateByImgClick&&m.wrap.on(\"click\"+e,\".mfp-img\",function(){if(1<m.items.length)return m.next(),!1}),g.on(\"keydown\"+e,function(e){37===e.keyCode?\"rtl\"===r.langDir?m.next():m.prev():39===e.keyCode&&(\"rtl\"===r.langDir?m.prev():m.next())}),m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(){m.updateGalleryButtons()}),d(\"UpdateStatus\"+e,function(e,t){t.text&&(t.text=D(t.text,m.currItem.index,m.items.length))}),d(C+e,function(e,t,n,o){var i=m.items.length;n.counter=1<i?D(r.tCounter,o.index,i):\"\"}),d(\"BuildControls\"+e,function(){var e,t,n,o,i;1<m.items.length&&r.arrows&&!m.arrowLeft&&(t=\"rtl\"===r.langDir?(o=r.tNext,e=r.tPrev,i=\"next\",\"prev\"):(o=r.tPrev,e=r.tNext,i=\"prev\",\"next\"),n=r.arrowMarkup,o=m.arrowLeft=c(n.replace(/%title%/gi,o).replace(/%action%/gi,i).replace(/%dir%/gi,\"left\")).addClass(k),i=m.arrowRight=c(n.replace(/%title%/gi,e).replace(/%action%/gi,t).replace(/%dir%/gi,\"right\")).addClass(k),\"rtl\"===r.langDir?(m.arrowNext=o,m.arrowPrev=i):(m.arrowNext=i,m.arrowPrev=o),o.on(\"click\",function(){\"rtl\"===r.langDir?m.next():m.prev()}),i.on(\"click\",function(){\"rtl\"===r.langDir?m.prev():m.next()}),m.container.append(o.add(i)))}),d(j+e,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),d(w+e,function(){g.off(e),m.wrap.off(\"click\"+e),m.arrowRight=m.arrowLeft=null})},next:function(){var e=M(m.index+1);if(!m.st.gallery.loop&&0===e)return!1;m.direction=!0,m.index=e,m.updateItemHTML()},prev:function(){var e=m.index-1;if(!m.st.gallery.loop&&e<0)return!1;m.direction=!1,m.index=M(e),m.updateItemHTML()},goTo:function(e){m.direction=e>=m.index,m.index=e,m.updateItemHTML()},preloadNearbyImages:function(){for(var e=m.st.gallery.preload,t=Math.min(e[0],m.items.length),n=Math.min(e[1],m.items.length),o=1;o<=(m.direction?n:t);o++)m._preloadItem(m.index+o);for(o=1;o<=(m.direction?t:n);o++)m._preloadItem(m.index-o)},_preloadItem:function(e){var t;e=M(e),m.items[e].preloaded||((t=m.items[e]).parsed||(t=m.parseEl(e)),u(\"LazyLoad\",t),\"image\"===t.type&&(t.img=c('<img class=\"mfp-img\" />').on(\"load.mfploader\",function(){t.hasSize=!0}).on(\"error.mfploader\",function(){t.hasSize=!0,t.loadError=!0,u(\"LazyLoadError\",t)}).attr(\"src\",t.src)),t.preloaded=!0)},updateGalleryButtons:function(){m.st.gallery.loop||\"object\"!=typeof m.arrowPrev||null===m.arrowPrev||(0===m.index?m.arrowPrev.hide():m.arrowPrev.show(),m.index===m.items.length-1?m.arrowNext.hide():m.arrowNext.show())}}}),\"retina\");c.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\\.\\w+$/,function(e){return\"@2x\"+e})},ratio:1},proto:{initRetina:function(){var n,o;1<window.devicePixelRatio&&(n=m.st.retina,o=n.ratio,1<(o=isNaN(o)?o():o))&&(d(\"ImageHasSize.\"+H,function(e,t){t.img.css({\"max-width\":t.img[0].naturalWidth/o,width:\"100%\"})}),d(\"ElementParse.\"+H,function(e,t){t.src=n.replaceSrc(t,o)}))}}}),r()});","(function(factory) {\r\n  if (typeof define === \"function\" && define.amd) {\r\n    // AMD. Register as an anonymous module.\r\n    define([], factory);\r\n  } else if (typeof exports === \"object\") {\r\n    // Node/CommonJS\r\n    module.exports = factory();\r\n  } else {\r\n    // Browser globals\r\n    window.wNumb = factory();\r\n  }\r\n})(function() {\r\n  \"use strict\";\r\n\r\n  var FormatOptions = [\r\n    \"decimals\",\r\n    \"thousand\",\r\n    \"mark\",\r\n    \"prefix\",\r\n    \"suffix\",\r\n    \"encoder\",\r\n    \"decoder\",\r\n    \"negativeBefore\",\r\n    \"negative\",\r\n    \"edit\",\r\n    \"undo\"\r\n  ];\r\n\r\n  // General\r\n\r\n  // Reverse a string\r\n  function strReverse(a) {\r\n    return a\r\n      .split(\"\")\r\n      .reverse()\r\n      .join(\"\");\r\n  }\r\n\r\n  // Check if a string starts with a specified prefix.\r\n  function strStartsWith(input, match) {\r\n    return input.substring(0, match.length) === match;\r\n  }\r\n\r\n  // Check is a string ends in a specified suffix.\r\n  function strEndsWith(input, match) {\r\n    return input.slice(-1 * match.length) === match;\r\n  }\r\n\r\n  // Throw an error if formatting options are incompatible.\r\n  function throwEqualError(F, a, b) {\r\n    if ((F[a] || F[b]) && F[a] === F[b]) {\r\n      throw new Error(a);\r\n    }\r\n  }\r\n\r\n  // Check if a number is finite and not NaN\r\n  function isValidNumber(input) {\r\n    return typeof input === \"number\" && isFinite(input);\r\n  }\r\n\r\n  // Provide rounding-accurate toFixed method.\r\n  // Borrowed: http://stackoverflow.com/a/21323330/775265\r\n  function toFixed(value, exp) {\r\n    value = value.toString().split(\"e\");\r\n    value = Math.round(+(value[0] + \"e\" + (value[1] ? +value[1] + exp : exp)));\r\n    value = value.toString().split(\"e\");\r\n    return (+(value[0] + \"e\" + (value[1] ? +value[1] - exp : -exp))).toFixed(exp);\r\n  }\r\n\r\n  // Formatting\r\n\r\n  // Accept a number as input, output formatted string.\r\n  function formatTo(\r\n    decimals,\r\n    thousand,\r\n    mark,\r\n    prefix,\r\n    suffix,\r\n    encoder,\r\n    decoder,\r\n    negativeBefore,\r\n    negative,\r\n    edit,\r\n    undo,\r\n    input\r\n  ) {\r\n    var originalInput = input,\r\n      inputIsNegative,\r\n      inputPieces,\r\n      inputBase,\r\n      inputDecimals = \"\",\r\n      output = \"\";\r\n\r\n    // Apply user encoder to the input.\r\n    // Expected outcome: number.\r\n    if (encoder) {\r\n      input = encoder(input);\r\n    }\r\n\r\n    // Stop if no valid number was provided, the number is infinite or NaN.\r\n    if (!isValidNumber(input)) {\r\n      return false;\r\n    }\r\n\r\n    // Rounding away decimals might cause a value of -0\r\n    // when using very small ranges. Remove those cases.\r\n    if (decimals !== false && parseFloat(input.toFixed(decimals)) === 0) {\r\n      input = 0;\r\n    }\r\n\r\n    // Formatting is done on absolute numbers,\r\n    // decorated by an optional negative symbol.\r\n    if (input < 0) {\r\n      inputIsNegative = true;\r\n      input = Math.abs(input);\r\n    }\r\n\r\n    // Reduce the number of decimals to the specified option.\r\n    if (decimals !== false) {\r\n      input = toFixed(input, decimals);\r\n    }\r\n\r\n    // Transform the number into a string, so it can be split.\r\n    input = input.toString();\r\n\r\n    // Break the number on the decimal separator.\r\n    if (input.indexOf(\".\") !== -1) {\r\n      inputPieces = input.split(\".\");\r\n\r\n      inputBase = inputPieces[0];\r\n\r\n      if (mark) {\r\n        inputDecimals = mark + inputPieces[1];\r\n      }\r\n    } else {\r\n      // If it isn't split, the entire number will do.\r\n      inputBase = input;\r\n    }\r\n\r\n    // Group numbers in sets of three.\r\n    if (thousand) {\r\n      inputBase = strReverse(inputBase).match(/.{1,3}/g);\r\n      inputBase = strReverse(inputBase.join(strReverse(thousand)));\r\n    }\r\n\r\n    // If the number is negative, prefix with negation symbol.\r\n    if (inputIsNegative && negativeBefore) {\r\n      output += negativeBefore;\r\n    }\r\n\r\n    // Prefix the number\r\n    if (prefix) {\r\n      output += prefix;\r\n    }\r\n\r\n    // Normal negative option comes after the prefix. Defaults to '-'.\r\n    if (inputIsNegative && negative) {\r\n      output += negative;\r\n    }\r\n\r\n    // Append the actual number.\r\n    output += inputBase;\r\n    output += inputDecimals;\r\n\r\n    // Apply the suffix.\r\n    if (suffix) {\r\n      output += suffix;\r\n    }\r\n\r\n    // Run the output through a user-specified post-formatter.\r\n    if (edit) {\r\n      output = edit(output, originalInput);\r\n    }\r\n\r\n    // All done.\r\n    return output;\r\n  }\r\n\r\n  // Accept a sting as input, output decoded number.\r\n  function formatFrom(\r\n    decimals,\r\n    thousand,\r\n    mark,\r\n    prefix,\r\n    suffix,\r\n    encoder,\r\n    decoder,\r\n    negativeBefore,\r\n    negative,\r\n    edit,\r\n    undo,\r\n    input\r\n  ) {\r\n    var originalInput = input,\r\n      inputIsNegative,\r\n      output = \"\";\r\n\r\n    // User defined pre-decoder. Result must be a non empty string.\r\n    if (undo) {\r\n      input = undo(input);\r\n    }\r\n\r\n    // Test the input. Can't be empty.\r\n    if (!input || typeof input !== \"string\") {\r\n      return false;\r\n    }\r\n\r\n    // If the string starts with the negativeBefore value: remove it.\r\n    // Remember is was there, the number is negative.\r\n    if (negativeBefore && strStartsWith(input, negativeBefore)) {\r\n      input = input.replace(negativeBefore, \"\");\r\n      inputIsNegative = true;\r\n    }\r\n\r\n    // Repeat the same procedure for the prefix.\r\n    if (prefix && strStartsWith(input, prefix)) {\r\n      input = input.replace(prefix, \"\");\r\n    }\r\n\r\n    // And again for negative.\r\n    if (negative && strStartsWith(input, negative)) {\r\n      input = input.replace(negative, \"\");\r\n      inputIsNegative = true;\r\n    }\r\n\r\n    // Remove the suffix.\r\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\r\n    if (suffix && strEndsWith(input, suffix)) {\r\n      input = input.slice(0, -1 * suffix.length);\r\n    }\r\n\r\n    // Remove the thousand grouping.\r\n    if (thousand) {\r\n      input = input.split(thousand).join(\"\");\r\n    }\r\n\r\n    // Set the decimal separator back to period.\r\n    if (mark) {\r\n      input = input.replace(mark, \".\");\r\n    }\r\n\r\n    // Prepend the negative symbol.\r\n    if (inputIsNegative) {\r\n      output += \"-\";\r\n    }\r\n\r\n    // Add the number\r\n    output += input;\r\n\r\n    // Trim all non-numeric characters (allow '.' and '-');\r\n    output = output.replace(/[^0-9\\.\\-.]/g, \"\");\r\n\r\n    // The value contains no parse-able number.\r\n    if (output === \"\") {\r\n      return false;\r\n    }\r\n\r\n    // Covert to number.\r\n    output = Number(output);\r\n\r\n    // Run the user-specified post-decoder.\r\n    if (decoder) {\r\n      output = decoder(output);\r\n    }\r\n\r\n    // Check is the output is valid, otherwise: return false.\r\n    if (!isValidNumber(output)) {\r\n      return false;\r\n    }\r\n\r\n    return output;\r\n  }\r\n\r\n  // Framework\r\n\r\n  // Validate formatting options\r\n  function validate(inputOptions) {\r\n    var i,\r\n      optionName,\r\n      optionValue,\r\n      filteredOptions = {};\r\n\r\n    if (inputOptions[\"suffix\"] === undefined) {\r\n      inputOptions[\"suffix\"] = inputOptions[\"postfix\"];\r\n    }\r\n\r\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n      optionName = FormatOptions[i];\r\n      optionValue = inputOptions[optionName];\r\n\r\n      if (optionValue === undefined) {\r\n        // Only default if negativeBefore isn't set.\r\n        if (optionName === \"negative\" && !filteredOptions.negativeBefore) {\r\n          filteredOptions[optionName] = \"-\";\r\n          // Don't set a default for mark when 'thousand' is set.\r\n        } else if (optionName === \"mark\" && filteredOptions.thousand !== \".\") {\r\n          filteredOptions[optionName] = \".\";\r\n        } else {\r\n          filteredOptions[optionName] = false;\r\n        }\r\n\r\n        // Floating points in JS are stable up to 7 decimals.\r\n      } else if (optionName === \"decimals\") {\r\n        if (optionValue >= 0 && optionValue < 8) {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n\r\n        // These options, when provided, must be functions.\r\n      } else if (\r\n        optionName === \"encoder\" ||\r\n        optionName === \"decoder\" ||\r\n        optionName === \"edit\" ||\r\n        optionName === \"undo\"\r\n      ) {\r\n        if (typeof optionValue === \"function\") {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n\r\n        // Other options are strings.\r\n      } else {\r\n        if (typeof optionValue === \"string\") {\r\n          filteredOptions[optionName] = optionValue;\r\n        } else {\r\n          throw new Error(optionName);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Some values can't be extracted from a\r\n    // string if certain combinations are present.\r\n    throwEqualError(filteredOptions, \"mark\", \"thousand\");\r\n    throwEqualError(filteredOptions, \"prefix\", \"negative\");\r\n    throwEqualError(filteredOptions, \"prefix\", \"negativeBefore\");\r\n\r\n    return filteredOptions;\r\n  }\r\n\r\n  // Pass all options as function arguments\r\n  function passAll(options, method, input) {\r\n    var i,\r\n      args = [];\r\n\r\n    // Add all options in order of FormatOptions\r\n    for (i = 0; i < FormatOptions.length; i += 1) {\r\n      args.push(options[FormatOptions[i]]);\r\n    }\r\n\r\n    // Append the input, then call the method, presenting all\r\n    // options as arguments.\r\n    args.push(input);\r\n    return method.apply(\"\", args);\r\n  }\r\n\r\n  function wNumb(options) {\r\n    if (!(this instanceof wNumb)) {\r\n      return new wNumb(options);\r\n    }\r\n\r\n    if (typeof options !== \"object\") {\r\n      return;\r\n    }\r\n\r\n    options = validate(options);\r\n\r\n    // Call 'formatTo' with proper arguments.\r\n    this.to = function(input) {\r\n      return passAll(options, formatTo, input);\r\n    };\r\n\r\n    // Call 'formatFrom' with proper arguments.\r\n    this.from = function(input) {\r\n      return passAll(options, formatFrom, input);\r\n    };\r\n  }\r\n\r\n  return wNumb;\r\n});\r\n","/*\n     _ _      _       _\n ___| (_) ___| | __  (_)___\n/ __| | |/ __| |/ /  | / __|\n\\__ \\ | | (__|   < _ | \\__ \\\n|___/_|_|\\___|_|\\_(_)/ |___/\n                   |__/\n\n Version: 1.8.1\n  Author: Ken Wheeler\n Website: http://kenwheeler.github.io\n    Docs: http://kenwheeler.github.io/slick\n    Repo: http://github.com/kenwheeler/slick\n  Issues: http://github.com/kenwheeler/slick/issues\n\n */\n/* global window, document, define, jQuery, setInterval, clearInterval */\n;(function(factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], factory);\n    } else if (typeof exports !== 'undefined') {\n        module.exports = factory(require('jquery'));\n    } else {\n        factory(jQuery);\n    }\n\n}(function($) {\n    'use strict';\n    var Slick = window.Slick || {};\n\n    Slick = (function() {\n\n        var instanceUid = 0;\n\n        function Slick(element, settings) {\n\n            var _ = this, dataSettings;\n\n            _.defaults = {\n                accessibility: true,\n                adaptiveHeight: false,\n                appendArrows: $(element),\n                appendDots: $(element),\n                arrows: true,\n                asNavFor: null,\n                prevArrow: '<button class=\"slick-prev\" aria-label=\"Previous\" type=\"button\">Previous</button>',\n                nextArrow: '<button class=\"slick-next\" aria-label=\"Next\" type=\"button\">Next</button>',\n                autoplay: false,\n                autoplaySpeed: 3000,\n                centerMode: false,\n                centerPadding: '50px',\n                cssEase: 'ease',\n                customPaging: function(slider, i) {\n                    return $('<button type=\"button\" />').text(i + 1);\n                },\n                dots: false,\n                dotsClass: 'slick-dots',\n                draggable: true,\n                easing: 'linear',\n                edgeFriction: 0.35,\n                fade: false,\n                focusOnSelect: false,\n                focusOnChange: false,\n                infinite: true,\n                initialSlide: 0,\n                lazyLoad: 'ondemand',\n                mobileFirst: false,\n                pauseOnHover: true,\n                pauseOnFocus: true,\n                pauseOnDotsHover: false,\n                respondTo: 'window',\n                responsive: null,\n                rows: 1,\n                rtl: false,\n                slide: '',\n                slidesPerRow: 1,\n                slidesToShow: 1,\n                slidesToScroll: 1,\n                speed: 500,\n                swipe: true,\n                swipeToSlide: false,\n                touchMove: true,\n                touchThreshold: 5,\n                useCSS: true,\n                useTransform: true,\n                variableWidth: false,\n                vertical: false,\n                verticalSwiping: false,\n                waitForAnimate: true,\n                zIndex: 1000\n            };\n\n            _.initials = {\n                animating: false,\n                dragging: false,\n                autoPlayTimer: null,\n                currentDirection: 0,\n                currentLeft: null,\n                currentSlide: 0,\n                direction: 1,\n                $dots: null,\n                listWidth: null,\n                listHeight: null,\n                loadIndex: 0,\n                $nextArrow: null,\n                $prevArrow: null,\n                scrolling: false,\n                slideCount: null,\n                slideWidth: null,\n                $slideTrack: null,\n                $slides: null,\n                sliding: false,\n                slideOffset: 0,\n                swipeLeft: null,\n                swiping: false,\n                $list: null,\n                touchObject: {},\n                transformsEnabled: false,\n                unslicked: false\n            };\n\n            $.extend(_, _.initials);\n\n            _.activeBreakpoint = null;\n            _.animType = null;\n            _.animProp = null;\n            _.breakpoints = [];\n            _.breakpointSettings = [];\n            _.cssTransitions = false;\n            _.focussed = false;\n            _.interrupted = false;\n            _.hidden = 'hidden';\n            _.paused = true;\n            _.positionProp = null;\n            _.respondTo = null;\n            _.rowCount = 1;\n            _.shouldClick = true;\n            _.$slider = $(element);\n            _.$slidesCache = null;\n            _.transformType = null;\n            _.transitionType = null;\n            _.visibilityChange = 'visibilitychange';\n            _.windowWidth = 0;\n            _.windowTimer = null;\n\n            dataSettings = $(element).data('slick') || {};\n\n            _.options = $.extend({}, _.defaults, settings, dataSettings);\n\n            _.currentSlide = _.options.initialSlide;\n\n            _.originalSettings = _.options;\n\n            if (typeof document.mozHidden !== 'undefined') {\n                _.hidden = 'mozHidden';\n                _.visibilityChange = 'mozvisibilitychange';\n            } else if (typeof document.webkitHidden !== 'undefined') {\n                _.hidden = 'webkitHidden';\n                _.visibilityChange = 'webkitvisibilitychange';\n            }\n\n            _.autoPlay = $.proxy(_.autoPlay, _);\n            _.autoPlayClear = $.proxy(_.autoPlayClear, _);\n            _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);\n            _.changeSlide = $.proxy(_.changeSlide, _);\n            _.clickHandler = $.proxy(_.clickHandler, _);\n            _.selectHandler = $.proxy(_.selectHandler, _);\n            _.setPosition = $.proxy(_.setPosition, _);\n            _.swipeHandler = $.proxy(_.swipeHandler, _);\n            _.dragHandler = $.proxy(_.dragHandler, _);\n            _.keyHandler = $.proxy(_.keyHandler, _);\n\n            _.instanceUid = instanceUid++;\n\n            // A simple way to check for HTML strings\n            // Strict HTML recognition (must start with <)\n            // Extracted from jQuery v1.11 source\n            _.htmlExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*)$/;\n\n\n            _.registerBreakpoints();\n            _.init(true);\n\n        }\n\n        return Slick;\n\n    }());\n\n    Slick.prototype.activateADA = function() {\n        var _ = this;\n\n        _.$slideTrack.find('.slick-active').attr({\n            'aria-hidden': 'false'\n        }).find('a, input, button, select').attr({\n            'tabindex': '0'\n        });\n\n    };\n\n    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            addBefore = index;\n            index = null;\n        } else if (index < 0 || (index >= _.slideCount)) {\n            return false;\n        }\n\n        _.unload();\n\n        if (typeof(index) === 'number') {\n            if (index === 0 && _.$slides.length === 0) {\n                $(markup).appendTo(_.$slideTrack);\n            } else if (addBefore) {\n                $(markup).insertBefore(_.$slides.eq(index));\n            } else {\n                $(markup).insertAfter(_.$slides.eq(index));\n            }\n        } else {\n            if (addBefore === true) {\n                $(markup).prependTo(_.$slideTrack);\n            } else {\n                $(markup).appendTo(_.$slideTrack);\n            }\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slides.each(function(index, element) {\n            $(element).attr('data-slick-index', index);\n        });\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.animateHeight = function() {\n        var _ = this;\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.animate({\n                height: targetHeight\n            }, _.options.speed);\n        }\n    };\n\n    Slick.prototype.animateSlide = function(targetLeft, callback) {\n\n        var animProps = {},\n            _ = this;\n\n        _.animateHeight();\n\n        if (_.options.rtl === true && _.options.vertical === false) {\n            targetLeft = -targetLeft;\n        }\n        if (_.transformsEnabled === false) {\n            if (_.options.vertical === false) {\n                _.$slideTrack.animate({\n                    left: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            } else {\n                _.$slideTrack.animate({\n                    top: targetLeft\n                }, _.options.speed, _.options.easing, callback);\n            }\n\n        } else {\n\n            if (_.cssTransitions === false) {\n                if (_.options.rtl === true) {\n                    _.currentLeft = -(_.currentLeft);\n                }\n                $({\n                    animStart: _.currentLeft\n                }).animate({\n                    animStart: targetLeft\n                }, {\n                    duration: _.options.speed,\n                    easing: _.options.easing,\n                    step: function(now) {\n                        now = Math.ceil(now);\n                        if (_.options.vertical === false) {\n                            animProps[_.animType] = 'translate(' +\n                                now + 'px, 0px)';\n                            _.$slideTrack.css(animProps);\n                        } else {\n                            animProps[_.animType] = 'translate(0px,' +\n                                now + 'px)';\n                            _.$slideTrack.css(animProps);\n                        }\n                    },\n                    complete: function() {\n                        if (callback) {\n                            callback.call();\n                        }\n                    }\n                });\n\n            } else {\n\n                _.applyTransition();\n                targetLeft = Math.ceil(targetLeft);\n\n                if (_.options.vertical === false) {\n                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';\n                } else {\n                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';\n                }\n                _.$slideTrack.css(animProps);\n\n                if (callback) {\n                    setTimeout(function() {\n\n                        _.disableTransition();\n\n                        callback.call();\n                    }, _.options.speed);\n                }\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.getNavTarget = function() {\n\n        var _ = this,\n            asNavFor = _.options.asNavFor;\n\n        if ( asNavFor && asNavFor !== null ) {\n            asNavFor = $(asNavFor).not(_.$slider);\n        }\n\n        return asNavFor;\n\n    };\n\n    Slick.prototype.asNavFor = function(index) {\n\n        var _ = this,\n            asNavFor = _.getNavTarget();\n\n        if ( asNavFor !== null && typeof asNavFor === 'object' ) {\n            asNavFor.each(function() {\n                var target = $(this).slick('getSlick');\n                if(!target.unslicked) {\n                    target.slideHandler(index, true);\n                }\n            });\n        }\n\n    };\n\n    Slick.prototype.applyTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        if (_.options.fade === false) {\n            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;\n        } else {\n            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;\n        }\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.autoPlay = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        if ( _.slideCount > _.options.slidesToShow ) {\n            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );\n        }\n\n    };\n\n    Slick.prototype.autoPlayClear = function() {\n\n        var _ = this;\n\n        if (_.autoPlayTimer) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n    };\n\n    Slick.prototype.autoPlayIterator = function() {\n\n        var _ = this,\n            slideTo = _.currentSlide + _.options.slidesToScroll;\n\n        if ( !_.paused && !_.interrupted && !_.focussed ) {\n\n            if ( _.options.infinite === false ) {\n\n                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {\n                    _.direction = 0;\n                }\n\n                else if ( _.direction === 0 ) {\n\n                    slideTo = _.currentSlide - _.options.slidesToScroll;\n\n                    if ( _.currentSlide - 1 === 0 ) {\n                        _.direction = 1;\n                    }\n\n                }\n\n            }\n\n            _.slideHandler( slideTo );\n\n        }\n\n    };\n\n    Slick.prototype.buildArrows = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true ) {\n\n            _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');\n            _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');\n\n            if( _.slideCount > _.options.slidesToShow ) {\n\n                _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n                _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');\n\n                if (_.htmlExpr.test(_.options.prevArrow)) {\n                    _.$prevArrow.prependTo(_.options.appendArrows);\n                }\n\n                if (_.htmlExpr.test(_.options.nextArrow)) {\n                    _.$nextArrow.appendTo(_.options.appendArrows);\n                }\n\n                if (_.options.infinite !== true) {\n                    _.$prevArrow\n                        .addClass('slick-disabled')\n                        .attr('aria-disabled', 'true');\n                }\n\n            } else {\n\n                _.$prevArrow.add( _.$nextArrow )\n\n                    .addClass('slick-hidden')\n                    .attr({\n                        'aria-disabled': 'true',\n                        'tabindex': '-1'\n                    });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.buildDots = function() {\n\n        var _ = this,\n            i, dot;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$slider.addClass('slick-dotted');\n\n            dot = $('<ul />').addClass(_.options.dotsClass);\n\n            for (i = 0; i <= _.getDotCount(); i += 1) {\n                dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));\n            }\n\n            _.$dots = dot.appendTo(_.options.appendDots);\n\n            _.$dots.find('li').first().addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.buildOut = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slider\n                .children( _.options.slide + ':not(.slick-cloned)')\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        _.$slides.each(function(index, element) {\n            $(element)\n                .attr('data-slick-index', index)\n                .data('originalStyling', $(element).attr('style') || '');\n        });\n\n        _.$slider.addClass('slick-slider');\n\n        _.$slideTrack = (_.slideCount === 0) ?\n            $('<div class=\"slick-track\"/>').appendTo(_.$slider) :\n            _.$slides.wrapAll('<div class=\"slick-track\"/>').parent();\n\n        _.$list = _.$slideTrack.wrap(\n            '<div class=\"slick-list\"/>').parent();\n        _.$slideTrack.css('opacity', 0);\n\n        if (_.options.centerMode === true || _.options.swipeToSlide === true) {\n            _.options.slidesToScroll = 1;\n        }\n\n        $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');\n\n        _.setupInfinite();\n\n        _.buildArrows();\n\n        _.buildDots();\n\n        _.updateDots();\n\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        if (_.options.draggable === true) {\n            _.$list.addClass('draggable');\n        }\n\n    };\n\n    Slick.prototype.buildRows = function() {\n\n        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;\n\n        newSlides = document.createDocumentFragment();\n        originalSlides = _.$slider.children();\n\n        if(_.options.rows > 0) {\n\n            slidesPerSection = _.options.slidesPerRow * _.options.rows;\n            numOfSlides = Math.ceil(\n                originalSlides.length / slidesPerSection\n            );\n\n            for(a = 0; a < numOfSlides; a++){\n                var slide = document.createElement('div');\n                for(b = 0; b < _.options.rows; b++) {\n                    var row = document.createElement('div');\n                    for(c = 0; c < _.options.slidesPerRow; c++) {\n                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));\n                        if (originalSlides.get(target)) {\n                            row.appendChild(originalSlides.get(target));\n                        }\n                    }\n                    slide.appendChild(row);\n                }\n                newSlides.appendChild(slide);\n            }\n\n            _.$slider.empty().append(newSlides);\n            _.$slider.children().children().children()\n                .css({\n                    'width':(100 / _.options.slidesPerRow) + '%',\n                    'display': 'inline-block'\n                });\n\n        }\n\n    };\n\n    Slick.prototype.checkResponsive = function(initial, forceUpdate) {\n\n        var _ = this,\n            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;\n        var sliderWidth = _.$slider.width();\n        var windowWidth = window.innerWidth || $(window).width();\n\n        if (_.respondTo === 'window') {\n            respondToWidth = windowWidth;\n        } else if (_.respondTo === 'slider') {\n            respondToWidth = sliderWidth;\n        } else if (_.respondTo === 'min') {\n            respondToWidth = Math.min(windowWidth, sliderWidth);\n        }\n\n        if ( _.options.responsive &&\n            _.options.responsive.length &&\n            _.options.responsive !== null) {\n\n            targetBreakpoint = null;\n\n            for (breakpoint in _.breakpoints) {\n                if (_.breakpoints.hasOwnProperty(breakpoint)) {\n                    if (_.originalSettings.mobileFirst === false) {\n                        if (respondToWidth < _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    } else {\n                        if (respondToWidth > _.breakpoints[breakpoint]) {\n                            targetBreakpoint = _.breakpoints[breakpoint];\n                        }\n                    }\n                }\n            }\n\n            if (targetBreakpoint !== null) {\n                if (_.activeBreakpoint !== null) {\n                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {\n                        _.activeBreakpoint =\n                            targetBreakpoint;\n                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                            _.unslick(targetBreakpoint);\n                        } else {\n                            _.options = $.extend({}, _.originalSettings,\n                                _.breakpointSettings[\n                                    targetBreakpoint]);\n                            if (initial === true) {\n                                _.currentSlide = _.options.initialSlide;\n                            }\n                            _.refresh(initial);\n                        }\n                        triggerBreakpoint = targetBreakpoint;\n                    }\n                } else {\n                    _.activeBreakpoint = targetBreakpoint;\n                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {\n                        _.unslick(targetBreakpoint);\n                    } else {\n                        _.options = $.extend({}, _.originalSettings,\n                            _.breakpointSettings[\n                                targetBreakpoint]);\n                        if (initial === true) {\n                            _.currentSlide = _.options.initialSlide;\n                        }\n                        _.refresh(initial);\n                    }\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            } else {\n                if (_.activeBreakpoint !== null) {\n                    _.activeBreakpoint = null;\n                    _.options = _.originalSettings;\n                    if (initial === true) {\n                        _.currentSlide = _.options.initialSlide;\n                    }\n                    _.refresh(initial);\n                    triggerBreakpoint = targetBreakpoint;\n                }\n            }\n\n            // only trigger breakpoints during an actual break. not on initialize.\n            if( !initial && triggerBreakpoint !== false ) {\n                _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);\n            }\n        }\n\n    };\n\n    Slick.prototype.changeSlide = function(event, dontAnimate) {\n\n        var _ = this,\n            $target = $(event.currentTarget),\n            indexOffset, slideOffset, unevenOffset;\n\n        // If target is a link, prevent default action.\n        if($target.is('a')) {\n            event.preventDefault();\n        }\n\n        // If target is not the <li> element (ie: a child), find the <li>.\n        if(!$target.is('li')) {\n            $target = $target.closest('li');\n        }\n\n        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);\n        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;\n\n        switch (event.data.message) {\n\n            case 'previous':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'next':\n                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;\n                if (_.slideCount > _.options.slidesToShow) {\n                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);\n                }\n                break;\n\n            case 'index':\n                var index = event.data.index === 0 ? 0 :\n                    event.data.index || $target.index() * _.options.slidesToScroll;\n\n                _.slideHandler(_.checkNavigable(index), false, dontAnimate);\n                $target.children().trigger('focus');\n                break;\n\n            default:\n                return;\n        }\n\n    };\n\n    Slick.prototype.checkNavigable = function(index) {\n\n        var _ = this,\n            navigables, prevNavigable;\n\n        navigables = _.getNavigableIndexes();\n        prevNavigable = 0;\n        if (index > navigables[navigables.length - 1]) {\n            index = navigables[navigables.length - 1];\n        } else {\n            for (var n in navigables) {\n                if (index < navigables[n]) {\n                    index = prevNavigable;\n                    break;\n                }\n                prevNavigable = navigables[n];\n            }\n        }\n\n        return index;\n    };\n\n    Slick.prototype.cleanUpEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots && _.$dots !== null) {\n\n            $('li', _.$dots)\n                .off('click.slick', _.changeSlide)\n                .off('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n            if (_.options.accessibility === true) {\n                _.$dots.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$slider.off('focus.slick blur.slick');\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);\n            _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);\n                _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);\n            }\n        }\n\n        _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);\n        _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);\n        _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);\n        _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);\n\n        _.$list.off('click.slick', _.clickHandler);\n\n        $(document).off(_.visibilityChange, _.visibility);\n\n        _.cleanUpSlideEvents();\n\n        if (_.options.accessibility === true) {\n            _.$list.off('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().off('click.slick', _.selectHandler);\n        }\n\n        $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);\n\n        $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);\n\n        $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);\n\n        $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);\n\n    };\n\n    Slick.prototype.cleanUpSlideEvents = function() {\n\n        var _ = this;\n\n        _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));\n        _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n    };\n\n    Slick.prototype.cleanUpRows = function() {\n\n        var _ = this, originalSlides;\n\n        if(_.options.rows > 0) {\n            originalSlides = _.$slides.children().children();\n            originalSlides.removeAttr('style');\n            _.$slider.empty().append(originalSlides);\n        }\n\n    };\n\n    Slick.prototype.clickHandler = function(event) {\n\n        var _ = this;\n\n        if (_.shouldClick === false) {\n            event.stopImmediatePropagation();\n            event.stopPropagation();\n            event.preventDefault();\n        }\n\n    };\n\n    Slick.prototype.destroy = function(refresh) {\n\n        var _ = this;\n\n        _.autoPlayClear();\n\n        _.touchObject = {};\n\n        _.cleanUpEvents();\n\n        $('.slick-cloned', _.$slider).detach();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if ( _.$prevArrow && _.$prevArrow.length ) {\n\n            _.$prevArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.prevArrow )) {\n                _.$prevArrow.remove();\n            }\n        }\n\n        if ( _.$nextArrow && _.$nextArrow.length ) {\n\n            _.$nextArrow\n                .removeClass('slick-disabled slick-arrow slick-hidden')\n                .removeAttr('aria-hidden aria-disabled tabindex')\n                .css('display','');\n\n            if ( _.htmlExpr.test( _.options.nextArrow )) {\n                _.$nextArrow.remove();\n            }\n        }\n\n\n        if (_.$slides) {\n\n            _.$slides\n                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')\n                .removeAttr('aria-hidden')\n                .removeAttr('data-slick-index')\n                .each(function(){\n                    $(this).attr('style', $(this).data('originalStyling'));\n                });\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slideTrack.detach();\n\n            _.$list.detach();\n\n            _.$slider.append(_.$slides);\n        }\n\n        _.cleanUpRows();\n\n        _.$slider.removeClass('slick-slider');\n        _.$slider.removeClass('slick-initialized');\n        _.$slider.removeClass('slick-dotted');\n\n        _.unslicked = true;\n\n        if(!refresh) {\n            _.$slider.trigger('destroy', [_]);\n        }\n\n    };\n\n    Slick.prototype.disableTransition = function(slide) {\n\n        var _ = this,\n            transition = {};\n\n        transition[_.transitionType] = '';\n\n        if (_.options.fade === false) {\n            _.$slideTrack.css(transition);\n        } else {\n            _.$slides.eq(slide).css(transition);\n        }\n\n    };\n\n    Slick.prototype.fadeSlide = function(slideIndex, callback) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).css({\n                zIndex: _.options.zIndex\n            });\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 1\n            }, _.options.speed, _.options.easing, callback);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 1,\n                zIndex: _.options.zIndex\n            });\n\n            if (callback) {\n                setTimeout(function() {\n\n                    _.disableTransition(slideIndex);\n\n                    callback.call();\n                }, _.options.speed);\n            }\n\n        }\n\n    };\n\n    Slick.prototype.fadeSlideOut = function(slideIndex) {\n\n        var _ = this;\n\n        if (_.cssTransitions === false) {\n\n            _.$slides.eq(slideIndex).animate({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            }, _.options.speed, _.options.easing);\n\n        } else {\n\n            _.applyTransition(slideIndex);\n\n            _.$slides.eq(slideIndex).css({\n                opacity: 0,\n                zIndex: _.options.zIndex - 2\n            });\n\n        }\n\n    };\n\n    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {\n\n        var _ = this;\n\n        if (filter !== null) {\n\n            _.$slidesCache = _.$slides;\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.filter(filter).appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.focusHandler = function() {\n\n        var _ = this;\n\n        _.$slider\n            .off('focus.slick blur.slick')\n            .on('focus.slick blur.slick', '*', function(event) {\n\n            event.stopImmediatePropagation();\n            var $sf = $(this);\n\n            setTimeout(function() {\n\n                if( _.options.pauseOnFocus ) {\n                    _.focussed = $sf.is(':focus');\n                    _.autoPlay();\n                }\n\n            }, 0);\n\n        });\n    };\n\n    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {\n\n        var _ = this;\n        return _.currentSlide;\n\n    };\n\n    Slick.prototype.getDotCount = function() {\n\n        var _ = this;\n\n        var breakPoint = 0;\n        var counter = 0;\n        var pagerQty = 0;\n\n        if (_.options.infinite === true) {\n            if (_.slideCount <= _.options.slidesToShow) {\n                 ++pagerQty;\n            } else {\n                while (breakPoint < _.slideCount) {\n                    ++pagerQty;\n                    breakPoint = counter + _.options.slidesToScroll;\n                    counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n                }\n            }\n        } else if (_.options.centerMode === true) {\n            pagerQty = _.slideCount;\n        } else if(!_.options.asNavFor) {\n            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);\n        }else {\n            while (breakPoint < _.slideCount) {\n                ++pagerQty;\n                breakPoint = counter + _.options.slidesToScroll;\n                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n            }\n        }\n\n        return pagerQty - 1;\n\n    };\n\n    Slick.prototype.getLeft = function(slideIndex) {\n\n        var _ = this,\n            targetLeft,\n            verticalHeight,\n            verticalOffset = 0,\n            targetSlide,\n            coef;\n\n        _.slideOffset = 0;\n        verticalHeight = _.$slides.first().outerHeight(true);\n\n        if (_.options.infinite === true) {\n            if (_.slideCount > _.options.slidesToShow) {\n                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;\n                coef = -1\n\n                if (_.options.vertical === true && _.options.centerMode === true) {\n                    if (_.options.slidesToShow === 2) {\n                        coef = -1.5;\n                    } else if (_.options.slidesToShow === 1) {\n                        coef = -2\n                    }\n                }\n                verticalOffset = (verticalHeight * _.options.slidesToShow) * coef;\n            }\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {\n                    if (slideIndex > _.slideCount) {\n                        _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;\n                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;\n                    } else {\n                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;\n                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;\n                    }\n                }\n            }\n        } else {\n            if (slideIndex + _.options.slidesToShow > _.slideCount) {\n                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;\n                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;\n            }\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = 0;\n            verticalOffset = 0;\n        }\n\n        if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {\n            _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2);\n        } else if (_.options.centerMode === true && _.options.infinite === true) {\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;\n        } else if (_.options.centerMode === true) {\n            _.slideOffset = 0;\n            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);\n        }\n\n        if (_.options.vertical === false) {\n            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;\n        } else {\n            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;\n        }\n\n        if (_.options.variableWidth === true) {\n\n            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n            } else {\n                targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);\n            }\n\n            if (_.options.rtl === true) {\n                if (targetSlide[0]) {\n                    targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                } else {\n                    targetLeft =  0;\n                }\n            } else {\n                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n            }\n\n            if (_.options.centerMode === true) {\n                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);\n                } else {\n                    targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);\n                }\n\n                if (_.options.rtl === true) {\n                    if (targetSlide[0]) {\n                        targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;\n                    } else {\n                        targetLeft =  0;\n                    }\n                } else {\n                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;\n                }\n\n                targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;\n            }\n        }\n\n        return targetLeft;\n\n    };\n\n    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {\n\n        var _ = this;\n\n        return _.options[option];\n\n    };\n\n    Slick.prototype.getNavigableIndexes = function() {\n\n        var _ = this,\n            breakPoint = 0,\n            counter = 0,\n            indexes = [],\n            max;\n\n        if (_.options.infinite === false) {\n            max = _.slideCount;\n        } else {\n            breakPoint = _.options.slidesToScroll * -1;\n            counter = _.options.slidesToScroll * -1;\n            max = _.slideCount * 2;\n        }\n\n        while (breakPoint < max) {\n            indexes.push(breakPoint);\n            breakPoint = counter + _.options.slidesToScroll;\n            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;\n        }\n\n        return indexes;\n\n    };\n\n    Slick.prototype.getSlick = function() {\n\n        return this;\n\n    };\n\n    Slick.prototype.getSlideCount = function() {\n\n        var _ = this,\n            slidesTraversed, swipedSlide, centerOffset;\n\n        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;\n\n        if (_.options.swipeToSlide === true) {\n            _.$slideTrack.find('.slick-slide').each(function(index, slide) {\n                if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {\n                    swipedSlide = slide;\n                    return false;\n                }\n            });\n\n            slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;\n\n            return slidesTraversed;\n\n        } else {\n            return _.options.slidesToScroll;\n        }\n\n    };\n\n    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'index',\n                index: parseInt(slide)\n            }\n        }, dontAnimate);\n\n    };\n\n    Slick.prototype.init = function(creation) {\n\n        var _ = this;\n\n        if (!$(_.$slider).hasClass('slick-initialized')) {\n\n            $(_.$slider).addClass('slick-initialized');\n\n            _.buildRows();\n            _.buildOut();\n            _.setProps();\n            _.startLoad();\n            _.loadSlider();\n            _.initializeEvents();\n            _.updateArrows();\n            _.updateDots();\n            _.checkResponsive(true);\n            _.focusHandler();\n\n        }\n\n        if (creation) {\n            _.$slider.trigger('init', [_]);\n        }\n\n        if (_.options.accessibility === true) {\n            _.initADA();\n        }\n\n        if ( _.options.autoplay ) {\n\n            _.paused = false;\n            _.autoPlay();\n\n        }\n\n    };\n\n    Slick.prototype.initADA = function() {\n        var _ = this,\n                numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),\n                tabControlIndexes = _.getNavigableIndexes().filter(function(val) {\n                    return (val >= 0) && (val < _.slideCount);\n                });\n\n        _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({\n            'aria-hidden': 'true',\n            'tabindex': '-1'\n        }).find('a, input, button, select').attr({\n            'tabindex': '-1'\n        });\n\n        if (_.$dots !== null) {\n            _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) {\n                var slideControlIndex = tabControlIndexes.indexOf(i);\n\n                $(this).attr({\n                    'role': 'tabpanel',\n                    'id': 'slick-slide' + _.instanceUid + i,\n                    'tabindex': -1\n                });\n\n                if (slideControlIndex !== -1) {\n                   var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex\n                   if ($('#' + ariaButtonControl).length) {\n                     $(this).attr({\n                         'aria-describedby': ariaButtonControl\n                     });\n                   }\n                }\n            });\n\n            _.$dots.attr('role', 'tablist').find('li').each(function(i) {\n                var mappedSlideIndex = tabControlIndexes[i];\n\n                $(this).attr({\n                    'role': 'presentation'\n                });\n\n                $(this).find('button').first().attr({\n                    'role': 'tab',\n                    'id': 'slick-slide-control' + _.instanceUid + i,\n                    'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex,\n                    'aria-label': (i + 1) + ' of ' + numDotGroups,\n                    'aria-selected': null,\n                    'tabindex': '-1'\n                });\n\n            }).eq(_.currentSlide).find('button').attr({\n                'aria-selected': 'true',\n                'tabindex': '0'\n            }).end();\n        }\n\n        for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) {\n          if (_.options.focusOnChange) {\n            _.$slides.eq(i).attr({'tabindex': '0'});\n          } else {\n            _.$slides.eq(i).removeAttr('tabindex');\n          }\n        }\n\n        _.activateADA();\n\n    };\n\n    Slick.prototype.initArrowEvents = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n            _.$prevArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'previous'\n               }, _.changeSlide);\n            _.$nextArrow\n               .off('click.slick')\n               .on('click.slick', {\n                    message: 'next'\n               }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$prevArrow.on('keydown.slick', _.keyHandler);\n                _.$nextArrow.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n    };\n\n    Slick.prototype.initDotEvents = function() {\n\n        var _ = this;\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n            $('li', _.$dots).on('click.slick', {\n                message: 'index'\n            }, _.changeSlide);\n\n            if (_.options.accessibility === true) {\n                _.$dots.on('keydown.slick', _.keyHandler);\n            }\n        }\n\n        if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {\n\n            $('li', _.$dots)\n                .on('mouseenter.slick', $.proxy(_.interrupt, _, true))\n                .on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initSlideEvents = function() {\n\n        var _ = this;\n\n        if ( _.options.pauseOnHover ) {\n\n            _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));\n            _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));\n\n        }\n\n    };\n\n    Slick.prototype.initializeEvents = function() {\n\n        var _ = this;\n\n        _.initArrowEvents();\n\n        _.initDotEvents();\n        _.initSlideEvents();\n\n        _.$list.on('touchstart.slick mousedown.slick', {\n            action: 'start'\n        }, _.swipeHandler);\n        _.$list.on('touchmove.slick mousemove.slick', {\n            action: 'move'\n        }, _.swipeHandler);\n        _.$list.on('touchend.slick mouseup.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n        _.$list.on('touchcancel.slick mouseleave.slick', {\n            action: 'end'\n        }, _.swipeHandler);\n\n        _.$list.on('click.slick', _.clickHandler);\n\n        $(document).on(_.visibilityChange, $.proxy(_.visibility, _));\n\n        if (_.options.accessibility === true) {\n            _.$list.on('keydown.slick', _.keyHandler);\n        }\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _));\n\n        $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _));\n\n        $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);\n\n        $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);\n        $(_.setPosition);\n\n    };\n\n    Slick.prototype.initUI = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.show();\n            _.$nextArrow.show();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.show();\n\n        }\n\n    };\n\n    Slick.prototype.keyHandler = function(event) {\n\n        var _ = this;\n         //Dont slide if the cursor is inside the form fields and arrow keys are pressed\n        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {\n            if (event.keyCode === 37 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'next' :  'previous'\n                    }\n                });\n            } else if (event.keyCode === 39 && _.options.accessibility === true) {\n                _.changeSlide({\n                    data: {\n                        message: _.options.rtl === true ? 'previous' : 'next'\n                    }\n                });\n            }\n        }\n\n    };\n\n    Slick.prototype.lazyLoad = function() {\n\n        var _ = this,\n            loadRange, cloneRange, rangeStart, rangeEnd;\n\n        function loadImages(imagesScope) {\n\n            $('img[data-lazy]', imagesScope).each(function() {\n\n                var image = $(this),\n                    imageSource = $(this).attr('data-lazy'),\n                    imageSrcSet = $(this).attr('data-srcset'),\n                    imageSizes  = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),\n                    imageToLoad = document.createElement('img');\n\n                imageToLoad.onload = function() {\n\n                    image\n                        .animate({ opacity: 0 }, 100, function() {\n\n                            if (imageSrcSet) {\n                                image\n                                    .attr('srcset', imageSrcSet );\n\n                                if (imageSizes) {\n                                    image\n                                        .attr('sizes', imageSizes );\n                                }\n                            }\n\n                            image\n                                .attr('src', imageSource)\n                                .animate({ opacity: 1 }, 200, function() {\n                                    image\n                                        .removeAttr('data-lazy data-srcset data-sizes')\n                                        .removeClass('slick-loading');\n                                });\n                            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);\n                        });\n\n                };\n\n                imageToLoad.onerror = function() {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                };\n\n                imageToLoad.src = imageSource;\n\n            });\n\n        }\n\n        if (_.options.centerMode === true) {\n            if (_.options.infinite === true) {\n                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);\n                rangeEnd = rangeStart + _.options.slidesToShow + 2;\n            } else {\n                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));\n                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;\n            }\n        } else {\n            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;\n            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);\n            if (_.options.fade === true) {\n                if (rangeStart > 0) rangeStart--;\n                if (rangeEnd <= _.slideCount) rangeEnd++;\n            }\n        }\n\n        loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);\n\n        if (_.options.lazyLoad === 'anticipated') {\n            var prevSlide = rangeStart - 1,\n                nextSlide = rangeEnd,\n                $slides = _.$slider.find('.slick-slide');\n\n            for (var i = 0; i < _.options.slidesToScroll; i++) {\n                if (prevSlide < 0) prevSlide = _.slideCount - 1;\n                loadRange = loadRange.add($slides.eq(prevSlide));\n                loadRange = loadRange.add($slides.eq(nextSlide));\n                prevSlide--;\n                nextSlide++;\n            }\n        }\n\n        loadImages(loadRange);\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-slide');\n            loadImages(cloneRange);\n        } else\n        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);\n            loadImages(cloneRange);\n        } else if (_.currentSlide === 0) {\n            cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);\n            loadImages(cloneRange);\n        }\n\n    };\n\n    Slick.prototype.loadSlider = function() {\n\n        var _ = this;\n\n        _.setPosition();\n\n        _.$slideTrack.css({\n            opacity: 1\n        });\n\n        _.$slider.removeClass('slick-loading');\n\n        _.initUI();\n\n        if (_.options.lazyLoad === 'progressive') {\n            _.progressiveLazyLoad();\n        }\n\n    };\n\n    Slick.prototype.next = Slick.prototype.slickNext = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'next'\n            }\n        });\n\n    };\n\n    Slick.prototype.orientationChange = function() {\n\n        var _ = this;\n\n        _.checkResponsive();\n        _.setPosition();\n\n    };\n\n    Slick.prototype.pause = Slick.prototype.slickPause = function() {\n\n        var _ = this;\n\n        _.autoPlayClear();\n        _.paused = true;\n\n    };\n\n    Slick.prototype.play = Slick.prototype.slickPlay = function() {\n\n        var _ = this;\n\n        _.autoPlay();\n        _.options.autoplay = true;\n        _.paused = false;\n        _.focussed = false;\n        _.interrupted = false;\n\n    };\n\n    Slick.prototype.postSlide = function(index) {\n\n        var _ = this;\n\n        if( !_.unslicked ) {\n\n            _.$slider.trigger('afterChange', [_, index]);\n\n            _.animating = false;\n\n            if (_.slideCount > _.options.slidesToShow) {\n                _.setPosition();\n            }\n\n            _.swipeLeft = null;\n\n            if ( _.options.autoplay ) {\n                _.autoPlay();\n            }\n\n            if (_.options.accessibility === true) {\n                _.initADA();\n\n                if (_.options.focusOnChange) {\n                    var $currentSlide = $(_.$slides.get(_.currentSlide));\n                    $currentSlide.attr('tabindex', 0).focus();\n                }\n            }\n\n        }\n\n    };\n\n    Slick.prototype.prev = Slick.prototype.slickPrev = function() {\n\n        var _ = this;\n\n        _.changeSlide({\n            data: {\n                message: 'previous'\n            }\n        });\n\n    };\n\n    Slick.prototype.preventDefault = function(event) {\n\n        event.preventDefault();\n\n    };\n\n    Slick.prototype.progressiveLazyLoad = function( tryCount ) {\n\n        tryCount = tryCount || 1;\n\n        var _ = this,\n            $imgsToLoad = $( 'img[data-lazy]', _.$slider ),\n            image,\n            imageSource,\n            imageSrcSet,\n            imageSizes,\n            imageToLoad;\n\n        if ( $imgsToLoad.length ) {\n\n            image = $imgsToLoad.first();\n            imageSource = image.attr('data-lazy');\n            imageSrcSet = image.attr('data-srcset');\n            imageSizes  = image.attr('data-sizes') || _.$slider.attr('data-sizes');\n            imageToLoad = document.createElement('img');\n\n            imageToLoad.onload = function() {\n\n                if (imageSrcSet) {\n                    image\n                        .attr('srcset', imageSrcSet );\n\n                    if (imageSizes) {\n                        image\n                            .attr('sizes', imageSizes );\n                    }\n                }\n\n                image\n                    .attr( 'src', imageSource )\n                    .removeAttr('data-lazy data-srcset data-sizes')\n                    .removeClass('slick-loading');\n\n                if ( _.options.adaptiveHeight === true ) {\n                    _.setPosition();\n                }\n\n                _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]);\n                _.progressiveLazyLoad();\n\n            };\n\n            imageToLoad.onerror = function() {\n\n                if ( tryCount < 3 ) {\n\n                    /**\n                     * try to load the image 3 times,\n                     * leave a slight delay so we don't get\n                     * servers blocking the request.\n                     */\n                    setTimeout( function() {\n                        _.progressiveLazyLoad( tryCount + 1 );\n                    }, 500 );\n\n                } else {\n\n                    image\n                        .removeAttr( 'data-lazy' )\n                        .removeClass( 'slick-loading' )\n                        .addClass( 'slick-lazyload-error' );\n\n                    _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]);\n\n                    _.progressiveLazyLoad();\n\n                }\n\n            };\n\n            imageToLoad.src = imageSource;\n\n        } else {\n\n            _.$slider.trigger('allImagesLoaded', [ _ ]);\n\n        }\n\n    };\n\n    Slick.prototype.refresh = function( initializing ) {\n\n        var _ = this, currentSlide, lastVisibleIndex;\n\n        lastVisibleIndex = _.slideCount - _.options.slidesToShow;\n\n        // in non-infinite sliders, we don't want to go past the\n        // last visible index.\n        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {\n            _.currentSlide = lastVisibleIndex;\n        }\n\n        // if less slides than to show, go to start.\n        if ( _.slideCount <= _.options.slidesToShow ) {\n            _.currentSlide = 0;\n\n        }\n\n        currentSlide = _.currentSlide;\n\n        _.destroy(true);\n\n        $.extend(_, _.initials, { currentSlide: currentSlide });\n\n        _.init();\n\n        if( !initializing ) {\n\n            _.changeSlide({\n                data: {\n                    message: 'index',\n                    index: currentSlide\n                }\n            }, false);\n\n        }\n\n    };\n\n    Slick.prototype.registerBreakpoints = function() {\n\n        var _ = this, breakpoint, currentBreakpoint, l,\n            responsiveSettings = _.options.responsive || null;\n\n        if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) {\n\n            _.respondTo = _.options.respondTo || 'window';\n\n            for ( breakpoint in responsiveSettings ) {\n\n                l = _.breakpoints.length-1;\n\n                if (responsiveSettings.hasOwnProperty(breakpoint)) {\n                    currentBreakpoint = responsiveSettings[breakpoint].breakpoint;\n\n                    // loop through the breakpoints and cut out any existing\n                    // ones with the same breakpoint number, we don't want dupes.\n                    while( l >= 0 ) {\n                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {\n                            _.breakpoints.splice(l,1);\n                        }\n                        l--;\n                    }\n\n                    _.breakpoints.push(currentBreakpoint);\n                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;\n\n                }\n\n            }\n\n            _.breakpoints.sort(function(a, b) {\n                return ( _.options.mobileFirst ) ? a-b : b-a;\n            });\n\n        }\n\n    };\n\n    Slick.prototype.reinit = function() {\n\n        var _ = this;\n\n        _.$slides =\n            _.$slideTrack\n                .children(_.options.slide)\n                .addClass('slick-slide');\n\n        _.slideCount = _.$slides.length;\n\n        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {\n            _.currentSlide = _.currentSlide - _.options.slidesToScroll;\n        }\n\n        if (_.slideCount <= _.options.slidesToShow) {\n            _.currentSlide = 0;\n        }\n\n        _.registerBreakpoints();\n\n        _.setProps();\n        _.setupInfinite();\n        _.buildArrows();\n        _.updateArrows();\n        _.initArrowEvents();\n        _.buildDots();\n        _.updateDots();\n        _.initDotEvents();\n        _.cleanUpSlideEvents();\n        _.initSlideEvents();\n\n        _.checkResponsive(false, true);\n\n        if (_.options.focusOnSelect === true) {\n            $(_.$slideTrack).children().on('click.slick', _.selectHandler);\n        }\n\n        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);\n\n        _.setPosition();\n        _.focusHandler();\n\n        _.paused = !_.options.autoplay;\n        _.autoPlay();\n\n        _.$slider.trigger('reInit', [_]);\n\n    };\n\n    Slick.prototype.resize = function() {\n\n        var _ = this;\n\n        if ($(window).width() !== _.windowWidth) {\n            clearTimeout(_.windowDelay);\n            _.windowDelay = window.setTimeout(function() {\n                _.windowWidth = $(window).width();\n                _.checkResponsive();\n                if( !_.unslicked ) { _.setPosition(); }\n            }, 50);\n        }\n    };\n\n    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {\n\n        var _ = this;\n\n        if (typeof(index) === 'boolean') {\n            removeBefore = index;\n            index = removeBefore === true ? 0 : _.slideCount - 1;\n        } else {\n            index = removeBefore === true ? --index : index;\n        }\n\n        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {\n            return false;\n        }\n\n        _.unload();\n\n        if (removeAll === true) {\n            _.$slideTrack.children().remove();\n        } else {\n            _.$slideTrack.children(this.options.slide).eq(index).remove();\n        }\n\n        _.$slides = _.$slideTrack.children(this.options.slide);\n\n        _.$slideTrack.children(this.options.slide).detach();\n\n        _.$slideTrack.append(_.$slides);\n\n        _.$slidesCache = _.$slides;\n\n        _.reinit();\n\n    };\n\n    Slick.prototype.setCSS = function(position) {\n\n        var _ = this,\n            positionProps = {},\n            x, y;\n\n        if (_.options.rtl === true) {\n            position = -position;\n        }\n        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';\n        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';\n\n        positionProps[_.positionProp] = position;\n\n        if (_.transformsEnabled === false) {\n            _.$slideTrack.css(positionProps);\n        } else {\n            positionProps = {};\n            if (_.cssTransitions === false) {\n                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';\n                _.$slideTrack.css(positionProps);\n            } else {\n                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';\n                _.$slideTrack.css(positionProps);\n            }\n        }\n\n    };\n\n    Slick.prototype.setDimensions = function() {\n\n        var _ = this;\n\n        if (_.options.vertical === false) {\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: ('0px ' + _.options.centerPadding)\n                });\n            }\n        } else {\n            _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);\n            if (_.options.centerMode === true) {\n                _.$list.css({\n                    padding: (_.options.centerPadding + ' 0px')\n                });\n            }\n        }\n\n        _.listWidth = _.$list.width();\n        _.listHeight = _.$list.height();\n\n\n        if (_.options.vertical === false && _.options.variableWidth === false) {\n            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);\n            _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));\n\n        } else if (_.options.variableWidth === true) {\n            _.$slideTrack.width(5000 * _.slideCount);\n        } else {\n            _.slideWidth = Math.ceil(_.listWidth);\n            _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));\n        }\n\n        var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();\n        if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);\n\n    };\n\n    Slick.prototype.setFade = function() {\n\n        var _ = this,\n            targetLeft;\n\n        _.$slides.each(function(index, element) {\n            targetLeft = (_.slideWidth * index) * -1;\n            if (_.options.rtl === true) {\n                $(element).css({\n                    position: 'relative',\n                    right: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            } else {\n                $(element).css({\n                    position: 'relative',\n                    left: targetLeft,\n                    top: 0,\n                    zIndex: _.options.zIndex - 2,\n                    opacity: 0\n                });\n            }\n        });\n\n        _.$slides.eq(_.currentSlide).css({\n            zIndex: _.options.zIndex - 1,\n            opacity: 1\n        });\n\n    };\n\n    Slick.prototype.setHeight = function() {\n\n        var _ = this;\n\n        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {\n            var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);\n            _.$list.css('height', targetHeight);\n        }\n\n    };\n\n    Slick.prototype.setOption =\n    Slick.prototype.slickSetOption = function() {\n\n        /**\n         * accepts arguments in format of:\n         *\n         *  - for changing a single option's value:\n         *     .slick(\"setOption\", option, value, refresh )\n         *\n         *  - for changing a set of responsive options:\n         *     .slick(\"setOption\", 'responsive', [{}, ...], refresh )\n         *\n         *  - for updating multiple values at once (not responsive)\n         *     .slick(\"setOption\", { 'option': value, ... }, refresh )\n         */\n\n        var _ = this, l, item, option, value, refresh = false, type;\n\n        if( $.type( arguments[0] ) === 'object' ) {\n\n            option =  arguments[0];\n            refresh = arguments[1];\n            type = 'multiple';\n\n        } else if ( $.type( arguments[0] ) === 'string' ) {\n\n            option =  arguments[0];\n            value = arguments[1];\n            refresh = arguments[2];\n\n            if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) {\n\n                type = 'responsive';\n\n            } else if ( typeof arguments[1] !== 'undefined' ) {\n\n                type = 'single';\n\n            }\n\n        }\n\n        if ( type === 'single' ) {\n\n            _.options[option] = value;\n\n\n        } else if ( type === 'multiple' ) {\n\n            $.each( option , function( opt, val ) {\n\n                _.options[opt] = val;\n\n            });\n\n\n        } else if ( type === 'responsive' ) {\n\n            for ( item in value ) {\n\n                if( $.type( _.options.responsive ) !== 'array' ) {\n\n                    _.options.responsive = [ value[item] ];\n\n                } else {\n\n                    l = _.options.responsive.length-1;\n\n                    // loop through the responsive object and splice out duplicates.\n                    while( l >= 0 ) {\n\n                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {\n\n                            _.options.responsive.splice(l,1);\n\n                        }\n\n                        l--;\n\n                    }\n\n                    _.options.responsive.push( value[item] );\n\n                }\n\n            }\n\n        }\n\n        if ( refresh ) {\n\n            _.unload();\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.setPosition = function() {\n\n        var _ = this;\n\n        _.setDimensions();\n\n        _.setHeight();\n\n        if (_.options.fade === false) {\n            _.setCSS(_.getLeft(_.currentSlide));\n        } else {\n            _.setFade();\n        }\n\n        _.$slider.trigger('setPosition', [_]);\n\n    };\n\n    Slick.prototype.setProps = function() {\n\n        var _ = this,\n            bodyStyle = document.body.style;\n\n        _.positionProp = _.options.vertical === true ? 'top' : 'left';\n\n        if (_.positionProp === 'top') {\n            _.$slider.addClass('slick-vertical');\n        } else {\n            _.$slider.removeClass('slick-vertical');\n        }\n\n        if (bodyStyle.WebkitTransition !== undefined ||\n            bodyStyle.MozTransition !== undefined ||\n            bodyStyle.msTransition !== undefined) {\n            if (_.options.useCSS === true) {\n                _.cssTransitions = true;\n            }\n        }\n\n        if ( _.options.fade ) {\n            if ( typeof _.options.zIndex === 'number' ) {\n                if( _.options.zIndex < 3 ) {\n                    _.options.zIndex = 3;\n                }\n            } else {\n                _.options.zIndex = _.defaults.zIndex;\n            }\n        }\n\n        if (bodyStyle.OTransform !== undefined) {\n            _.animType = 'OTransform';\n            _.transformType = '-o-transform';\n            _.transitionType = 'OTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.MozTransform !== undefined) {\n            _.animType = 'MozTransform';\n            _.transformType = '-moz-transform';\n            _.transitionType = 'MozTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.webkitTransform !== undefined) {\n            _.animType = 'webkitTransform';\n            _.transformType = '-webkit-transform';\n            _.transitionType = 'webkitTransition';\n            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;\n        }\n        if (bodyStyle.msTransform !== undefined) {\n            _.animType = 'msTransform';\n            _.transformType = '-ms-transform';\n            _.transitionType = 'msTransition';\n            if (bodyStyle.msTransform === undefined) _.animType = false;\n        }\n        if (bodyStyle.transform !== undefined && _.animType !== false) {\n            _.animType = 'transform';\n            _.transformType = 'transform';\n            _.transitionType = 'transition';\n        }\n        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);\n    };\n\n\n    Slick.prototype.setSlideClasses = function(index) {\n\n        var _ = this,\n            centerOffset, allSlides, indexOffset, remainder;\n\n        allSlides = _.$slider\n            .find('.slick-slide')\n            .removeClass('slick-active slick-center slick-current')\n            .attr('aria-hidden', 'true');\n\n        _.$slides\n            .eq(index)\n            .addClass('slick-current');\n\n        if (_.options.centerMode === true) {\n\n            var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;\n\n            centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n            if (_.options.infinite === true) {\n\n                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {\n                    _.$slides\n                        .slice(index - centerOffset + evenCoef, index + centerOffset + 1)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    indexOffset = _.options.slidesToShow + index;\n                    allSlides\n                        .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n                if (index === 0) {\n\n                    allSlides\n                        .eq(allSlides.length - 1 - _.options.slidesToShow)\n                        .addClass('slick-center');\n\n                } else if (index === _.slideCount - 1) {\n\n                    allSlides\n                        .eq(_.options.slidesToShow)\n                        .addClass('slick-center');\n\n                }\n\n            }\n\n            _.$slides\n                .eq(index)\n                .addClass('slick-center');\n\n        } else {\n\n            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {\n\n                _.$slides\n                    .slice(index, index + _.options.slidesToShow)\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else if (allSlides.length <= _.options.slidesToShow) {\n\n                allSlides\n                    .addClass('slick-active')\n                    .attr('aria-hidden', 'false');\n\n            } else {\n\n                remainder = _.slideCount % _.options.slidesToShow;\n                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;\n\n                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {\n\n                    allSlides\n                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                } else {\n\n                    allSlides\n                        .slice(indexOffset, indexOffset + _.options.slidesToShow)\n                        .addClass('slick-active')\n                        .attr('aria-hidden', 'false');\n\n                }\n\n            }\n\n        }\n\n        if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {\n            _.lazyLoad();\n        }\n    };\n\n    Slick.prototype.setupInfinite = function() {\n\n        var _ = this,\n            i, slideIndex, infiniteCount;\n\n        if (_.options.fade === true) {\n            _.options.centerMode = false;\n        }\n\n        if (_.options.infinite === true && _.options.fade === false) {\n\n            slideIndex = null;\n\n            if (_.slideCount > _.options.slidesToShow) {\n\n                if (_.options.centerMode === true) {\n                    infiniteCount = _.options.slidesToShow + 1;\n                } else {\n                    infiniteCount = _.options.slidesToShow;\n                }\n\n                for (i = _.slideCount; i > (_.slideCount -\n                        infiniteCount); i -= 1) {\n                    slideIndex = i - 1;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex - _.slideCount)\n                        .prependTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                for (i = 0; i < infiniteCount  + _.slideCount; i += 1) {\n                    slideIndex = i;\n                    $(_.$slides[slideIndex]).clone(true).attr('id', '')\n                        .attr('data-slick-index', slideIndex + _.slideCount)\n                        .appendTo(_.$slideTrack).addClass('slick-cloned');\n                }\n                _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {\n                    $(this).attr('id', '');\n                });\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.interrupt = function( toggle ) {\n\n        var _ = this;\n\n        if( !toggle ) {\n            _.autoPlay();\n        }\n        _.interrupted = toggle;\n\n    };\n\n    Slick.prototype.selectHandler = function(event) {\n\n        var _ = this;\n\n        var targetElement =\n            $(event.target).is('.slick-slide') ?\n                $(event.target) :\n                $(event.target).parents('.slick-slide');\n\n        var index = parseInt(targetElement.attr('data-slick-index'));\n\n        if (!index) index = 0;\n\n        if (_.slideCount <= _.options.slidesToShow) {\n\n            _.slideHandler(index, false, true);\n            return;\n\n        }\n\n        _.slideHandler(index);\n\n    };\n\n    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {\n\n        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,\n            _ = this, navTarget;\n\n        sync = sync || false;\n\n        if (_.animating === true && _.options.waitForAnimate === true) {\n            return;\n        }\n\n        if (_.options.fade === true && _.currentSlide === index) {\n            return;\n        }\n\n        if (sync === false) {\n            _.asNavFor(index);\n        }\n\n        targetSlide = index;\n        targetLeft = _.getLeft(targetSlide);\n        slideLeft = _.getLeft(_.currentSlide);\n\n        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;\n\n        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {\n            if (_.options.fade === false) {\n                targetSlide = _.currentSlide;\n                if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n                    _.animateSlide(slideLeft, function() {\n                        _.postSlide(targetSlide);\n                    });\n                } else {\n                    _.postSlide(targetSlide);\n                }\n            }\n            return;\n        }\n\n        if ( _.options.autoplay ) {\n            clearInterval(_.autoPlayTimer);\n        }\n\n        if (targetSlide < 0) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);\n            } else {\n                animSlide = _.slideCount + targetSlide;\n            }\n        } else if (targetSlide >= _.slideCount) {\n            if (_.slideCount % _.options.slidesToScroll !== 0) {\n                animSlide = 0;\n            } else {\n                animSlide = targetSlide - _.slideCount;\n            }\n        } else {\n            animSlide = targetSlide;\n        }\n\n        _.animating = true;\n\n        _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);\n\n        oldSlide = _.currentSlide;\n        _.currentSlide = animSlide;\n\n        _.setSlideClasses(_.currentSlide);\n\n        if ( _.options.asNavFor ) {\n\n            navTarget = _.getNavTarget();\n            navTarget = navTarget.slick('getSlick');\n\n            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {\n                navTarget.setSlideClasses(_.currentSlide);\n            }\n\n        }\n\n        _.updateDots();\n        _.updateArrows();\n\n        if (_.options.fade === true) {\n            if (dontAnimate !== true) {\n\n                _.fadeSlideOut(oldSlide);\n\n                _.fadeSlide(animSlide, function() {\n                    _.postSlide(animSlide);\n                });\n\n            } else {\n                _.postSlide(animSlide);\n            }\n            _.animateHeight();\n            return;\n        }\n\n        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {\n            _.animateSlide(targetLeft, function() {\n                _.postSlide(animSlide);\n            });\n        } else {\n            _.postSlide(animSlide);\n        }\n\n    };\n\n    Slick.prototype.startLoad = function() {\n\n        var _ = this;\n\n        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$prevArrow.hide();\n            _.$nextArrow.hide();\n\n        }\n\n        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {\n\n            _.$dots.hide();\n\n        }\n\n        _.$slider.addClass('slick-loading');\n\n    };\n\n    Slick.prototype.swipeDirection = function() {\n\n        var xDist, yDist, r, swipeAngle, _ = this;\n\n        xDist = _.touchObject.startX - _.touchObject.curX;\n        yDist = _.touchObject.startY - _.touchObject.curY;\n        r = Math.atan2(yDist, xDist);\n\n        swipeAngle = Math.round(r * 180 / Math.PI);\n        if (swipeAngle < 0) {\n            swipeAngle = 360 - Math.abs(swipeAngle);\n        }\n\n        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {\n            return (_.options.rtl === false ? 'left' : 'right');\n        }\n        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {\n            return (_.options.rtl === false ? 'right' : 'left');\n        }\n        if (_.options.verticalSwiping === true) {\n            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {\n                return 'down';\n            } else {\n                return 'up';\n            }\n        }\n\n        return 'vertical';\n\n    };\n\n    Slick.prototype.swipeEnd = function(event) {\n\n        var _ = this,\n            slideCount,\n            direction;\n\n        _.dragging = false;\n        _.swiping = false;\n\n        if (_.scrolling) {\n            _.scrolling = false;\n            return false;\n        }\n\n        _.interrupted = false;\n        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;\n\n        if ( _.touchObject.curX === undefined ) {\n            return false;\n        }\n\n        if ( _.touchObject.edgeHit === true ) {\n            _.$slider.trigger('edge', [_, _.swipeDirection() ]);\n        }\n\n        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {\n\n            direction = _.swipeDirection();\n\n            switch ( direction ) {\n\n                case 'left':\n                case 'down':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :\n                            _.currentSlide + _.getSlideCount();\n\n                    _.currentDirection = 0;\n\n                    break;\n\n                case 'right':\n                case 'up':\n\n                    slideCount =\n                        _.options.swipeToSlide ?\n                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :\n                            _.currentSlide - _.getSlideCount();\n\n                    _.currentDirection = 1;\n\n                    break;\n\n                default:\n\n\n            }\n\n            if( direction != 'vertical' ) {\n\n                _.slideHandler( slideCount );\n                _.touchObject = {};\n                _.$slider.trigger('swipe', [_, direction ]);\n\n            }\n\n        } else {\n\n            if ( _.touchObject.startX !== _.touchObject.curX ) {\n\n                _.slideHandler( _.currentSlide );\n                _.touchObject = {};\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.swipeHandler = function(event) {\n\n        var _ = this;\n\n        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {\n            return;\n        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {\n            return;\n        }\n\n        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?\n            event.originalEvent.touches.length : 1;\n\n        _.touchObject.minSwipe = _.listWidth / _.options\n            .touchThreshold;\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.minSwipe = _.listHeight / _.options\n                .touchThreshold;\n        }\n\n        switch (event.data.action) {\n\n            case 'start':\n                _.swipeStart(event);\n                break;\n\n            case 'move':\n                _.swipeMove(event);\n                break;\n\n            case 'end':\n                _.swipeEnd(event);\n                break;\n\n        }\n\n    };\n\n    Slick.prototype.swipeMove = function(event) {\n\n        var _ = this,\n            edgeWasHit = false,\n            curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength;\n\n        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;\n\n        if (!_.dragging || _.scrolling || touches && touches.length !== 1) {\n            return false;\n        }\n\n        curLeft = _.getLeft(_.currentSlide);\n\n        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;\n        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;\n\n        _.touchObject.swipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));\n\n        verticalSwipeLength = Math.round(Math.sqrt(\n            Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));\n\n        if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {\n            _.scrolling = true;\n            return false;\n        }\n\n        if (_.options.verticalSwiping === true) {\n            _.touchObject.swipeLength = verticalSwipeLength;\n        }\n\n        swipeDirection = _.swipeDirection();\n\n        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {\n            _.swiping = true;\n            event.preventDefault();\n        }\n\n        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);\n        if (_.options.verticalSwiping === true) {\n            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;\n        }\n\n\n        swipeLength = _.touchObject.swipeLength;\n\n        _.touchObject.edgeHit = false;\n\n        if (_.options.infinite === false) {\n            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {\n                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;\n                _.touchObject.edgeHit = true;\n            }\n        }\n\n        if (_.options.vertical === false) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        } else {\n            _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;\n        }\n        if (_.options.verticalSwiping === true) {\n            _.swipeLeft = curLeft + swipeLength * positionOffset;\n        }\n\n        if (_.options.fade === true || _.options.touchMove === false) {\n            return false;\n        }\n\n        if (_.animating === true) {\n            _.swipeLeft = null;\n            return false;\n        }\n\n        _.setCSS(_.swipeLeft);\n\n    };\n\n    Slick.prototype.swipeStart = function(event) {\n\n        var _ = this,\n            touches;\n\n        _.interrupted = true;\n\n        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {\n            _.touchObject = {};\n            return false;\n        }\n\n        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {\n            touches = event.originalEvent.touches[0];\n        }\n\n        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;\n        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;\n\n        _.dragging = true;\n\n    };\n\n    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {\n\n        var _ = this;\n\n        if (_.$slidesCache !== null) {\n\n            _.unload();\n\n            _.$slideTrack.children(this.options.slide).detach();\n\n            _.$slidesCache.appendTo(_.$slideTrack);\n\n            _.reinit();\n\n        }\n\n    };\n\n    Slick.prototype.unload = function() {\n\n        var _ = this;\n\n        $('.slick-cloned', _.$slider).remove();\n\n        if (_.$dots) {\n            _.$dots.remove();\n        }\n\n        if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {\n            _.$prevArrow.remove();\n        }\n\n        if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {\n            _.$nextArrow.remove();\n        }\n\n        _.$slides\n            .removeClass('slick-slide slick-active slick-visible slick-current')\n            .attr('aria-hidden', 'true')\n            .css('width', '');\n\n    };\n\n    Slick.prototype.unslick = function(fromBreakpoint) {\n\n        var _ = this;\n        _.$slider.trigger('unslick', [_, fromBreakpoint]);\n        _.destroy();\n\n    };\n\n    Slick.prototype.updateArrows = function() {\n\n        var _ = this,\n            centerOffset;\n\n        centerOffset = Math.floor(_.options.slidesToShow / 2);\n\n        if ( _.options.arrows === true &&\n            _.slideCount > _.options.slidesToShow &&\n            !_.options.infinite ) {\n\n            _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n            _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            if (_.currentSlide === 0) {\n\n                _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {\n\n                _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');\n                _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');\n\n            }\n\n        }\n\n    };\n\n    Slick.prototype.updateDots = function() {\n\n        var _ = this;\n\n        if (_.$dots !== null) {\n\n            _.$dots\n                .find('li')\n                    .removeClass('slick-active')\n                    .end();\n\n            _.$dots\n                .find('li')\n                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))\n                .addClass('slick-active');\n\n        }\n\n    };\n\n    Slick.prototype.visibility = function() {\n\n        var _ = this;\n\n        if ( _.options.autoplay ) {\n\n            if ( document[_.hidden] ) {\n\n                _.interrupted = true;\n\n            } else {\n\n                _.interrupted = false;\n\n            }\n\n        }\n\n    };\n\n    $.fn.slick = function() {\n        var _ = this,\n            opt = arguments[0],\n            args = Array.prototype.slice.call(arguments, 1),\n            l = _.length,\n            i,\n            ret;\n        for (i = 0; i < l; i++) {\n            if (typeof opt == 'object' || typeof opt == 'undefined')\n                _[i].slick = new Slick(_[i], opt);\n            else\n                ret = _[i].slick[opt].apply(_[i].slick, args);\n            if (typeof ret != 'undefined') return ret;\n        }\n        return _;\n    };\n\n}));\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","/**\n * sifter.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('sifter', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.Sifter = factory();\n\t}\n}(this, function() {\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tvar Sifter = function(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t * @param {string} query\n\t * @returns {array}\n\t */\n\tSifter.prototype.tokenize = function(query) {\n\t\tquery = trim(String(query || '').toLowerCase());\n\t\tif (!query || !query.length) return [];\n\n\t\tvar i, n, regex, letter;\n\t\tvar tokens = [];\n\t\tvar words = query.split(/ +/);\n\n\t\tfor (i = 0, n = words.length; i < n; i++) {\n\t\t\tregex = escape_regex(words[i]);\n\t\t\tif (this.settings.diacritics) {\n\t\t\t\tfor (letter in DIACRITICS) {\n\t\t\t\t\tif (DIACRITICS.hasOwnProperty(letter)) {\n\t\t\t\t\t\tregex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({\n\t\t\t\tstring : words[i],\n\t\t\t\tregex  : new RegExp(regex, 'i')\n\t\t\t});\n\t\t}\n\n\t\treturn tokens;\n\t};\n\n\t/**\n\t * Iterates over arrays and hashes.\n\t *\n\t * ```\n\t * this.iterator(this.items, function(item, id) {\n\t *    // invoked for each item\n\t * });\n\t * ```\n\t *\n\t * @param {array|object} object\n\t */\n\tSifter.prototype.iterator = function(object, callback) {\n\t\tvar iterator;\n\t\tif (is_array(object)) {\n\t\t\titerator = Array.prototype.forEach || function(callback) {\n\t\t\t\tfor (var i = 0, n = this.length; i < n; i++) {\n\t\t\t\t\tcallback(this[i], i, this);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\titerator = function(callback) {\n\t\t\t\tfor (var key in this) {\n\t\t\t\t\tif (this.hasOwnProperty(key)) {\n\t\t\t\t\t\tcallback(this[key], key, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\titerator.apply(object, [callback]);\n\t};\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @param {object|string} search\n\t * @param {object} options (optional)\n\t * @returns {function}\n\t */\n\tSifter.prototype.getScoreFunction = function(search, options) {\n\t\tvar self, fields, tokens, token_count, nesting;\n\n\t\tself        = this;\n\t\tsearch      = self.prepareSearch(search, options);\n\t\ttokens      = search.tokens;\n\t\tfields      = search.options.fields;\n\t\ttoken_count = tokens.length;\n\t\tnesting     = search.options.nesting;\n\n\t\t/**\n\t\t * Calculates how close of a match the\n\t\t * given value is against a search token.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} token\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreValue = function(value, token) {\n\t\t\tvar score, pos;\n\n\t\t\tif (!value) return 0;\n\t\t\tvalue = String(value || '');\n\t\t\tpos = value.search(token.regex);\n\t\t\tif (pos === -1) return 0;\n\t\t\tscore = token.string.length / value.length;\n\t\t\tif (pos === 0) score += 0.5;\n\t\t\treturn score;\n\t\t};\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {object} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\t\t\tvar field_count = fields.length;\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token, data) {\n\t\t\t\t\treturn scoreValue(getattr(data, fields[0], nesting), token);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn function(token, data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < field_count; i++) {\n\t\t\t\t\tsum += scoreValue(getattr(data, fields[i], nesting), token);\n\t\t\t\t}\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar score;\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tfor (var i = 0, sum = 0; i < token_count; i++) {\n\t\t\t\t\tsum += scoreObject(tokens[i], data);\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @param {string|object} search\n\t * @param {object} options\n\t * @return function(a,b)\n\t */\n\tSifter.prototype.getSortFunction = function(search, options) {\n\t\tvar i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;\n\n\t\tself   = this;\n\t\tsearch = self.prepareSearch(search, options);\n\t\tsort   = (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param  {string} name\n\t\t * @param  {object} result\n\t\t * @return {mixed}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn getattr(self.items[result.id], name, options.nesting);\n\t\t};\n\n\t\t// parse options\n\t\tfields = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tfields.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tfields.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\t\tif (fields[i].field === '$score') {\n\t\t\t\t\tfields.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = fields.length; i < n; i++) {\n\t\t\tmultipliers.push(fields[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tfields_count = fields.length;\n\t\tif (!fields_count) {\n\t\t\treturn null;\n\t\t} else if (fields_count === 1) {\n\t\t\tfield = fields[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(field, a),\n\t\t\t\t\tget_field(field, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, a_value, b_value, field;\n\t\t\t\tfor (i = 0; i < fields_count; i++) {\n\t\t\t\t\tfield = fields[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.prepareSearch = function(query, options) {\n\t\tif (typeof query === 'object') return query;\n\n\t\toptions = extend({}, options);\n\n\t\tvar option_fields     = options.fields;\n\t\tvar option_sort       = options.sort;\n\t\tvar option_sort_empty = options.sort_empty;\n\n\t\tif (option_fields && !is_array(option_fields)) options.fields = [option_fields];\n\t\tif (option_sort && !is_array(option_sort)) options.sort = [option_sort];\n\t\tif (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];\n\n\t\treturn {\n\t\t\toptions : options,\n\t\t\tquery   : String(query || '').toLowerCase(),\n\t\t\ttokens  : this.tokenize(query),\n\t\t\ttotal   : 0,\n\t\t\titems   : []\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t * The `options` parameter can contain:\n\t *\n\t *   - fields {string|array}\n\t *   - sort {array}\n\t *   - score {function}\n\t *   - filter {bool}\n\t *   - limit {integer}\n\t *\n\t * Returns an object containing:\n\t *\n\t *   - options {object}\n\t *   - query {string}\n\t *   - tokens {array}\n\t *   - total {int}\n\t *   - items {array}\n\t *\n\t * @param {string} query\n\t * @param {object} options\n\t * @returns {object}\n\t */\n\tSifter.prototype.search = function(query, options) {\n\t\tvar self = this, value, score, search, calculateScore;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch  = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery   = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self.getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tself.iterator(self.items, function(item, id) {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self.getSortFunction(search, options);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n\n\t// utilities\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\tvar cmp = function(a, b) {\n\t\tif (typeof a === 'number' && typeof b === 'number') {\n\t\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t\t}\n\t\ta = asciifold(String(a || ''));\n\t\tb = asciifold(String(b || ''));\n\t\tif (a > b) return 1;\n\t\tif (b > a) return -1;\n\t\treturn 0;\n\t};\n\n\tvar extend = function(a, b) {\n\t\tvar i, n, k, object;\n\t\tfor (i = 1, n = arguments.length; i < n; i++) {\n\t\t\tobject = arguments[i];\n\t\t\tif (!object) continue;\n\t\t\tfor (k in object) {\n\t\t\t\tif (object.hasOwnProperty(k)) {\n\t\t\t\t\ta[k] = object[k];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t};\n\n\t/**\n\t * A property getter resolving dot-notation\n\t * @param  {Object}  obj     The root object to fetch property on\n\t * @param  {String}  name    The optionally dotted property name to fetch\n\t * @param  {Boolean} nesting Handle nesting or not\n\t * @return {Object}          The resolved property value\n\t */\n\tvar getattr = function(obj, name, nesting) {\n\t    if (!obj || !name) return;\n\t    if (!nesting) return obj[name];\n\t    var names = name.split(\".\");\n\t    while(names.length && (obj = obj[names.shift()]));\n\t    return obj;\n\t};\n\n\tvar trim = function(str) {\n\t\treturn (str + '').replace(/^\\s+|\\s+$|/g, '');\n\t};\n\n\tvar escape_regex = function(str) {\n\t\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n\t};\n\n\tvar is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {\n\t\treturn Object.prototype.toString.call(object) === '[object Array]';\n\t};\n\n\tvar DIACRITICS = {\n\t\t'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',\n\t\t'b': '[b␢βΒB฿𐌁ᛒ]',\n\t\t'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄＣｃ]',\n\t\t'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅＤｄð]',\n\t\t'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇＥｅɘǝƏƐε]',\n\t\t'f': '[fƑƒḞḟ]',\n\t\t'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',\n\t\t'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',\n\t\t'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪＩｉ]',\n\t\t'j': '[jȷĴĵɈɉʝɟʲ]',\n\t\t'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',\n\t\t'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟＬｌ]',\n\t\t'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴＮｎŊŋ]',\n\t\t'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',\n\t\t'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',\n\t\t'q': '[qꝖꝗʠɊɋꝘꝙq̃]',\n\t\t'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',\n\t\t's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',\n\t\t't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',\n\t\t'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',\n\t\t'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',\n\t\t'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',\n\t\t'x': '[xẌẍẊẋχ]',\n\t\t'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',\n\t\t'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'\n\t};\n\n\tvar asciifold = (function() {\n\t\tvar i, n, k, chunk;\n\t\tvar foreignletters = '';\n\t\tvar lookup = {};\n\t\tfor (k in DIACRITICS) {\n\t\t\tif (DIACRITICS.hasOwnProperty(k)) {\n\t\t\t\tchunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);\n\t\t\t\tforeignletters += chunk;\n\t\t\t\tfor (i = 0, n = chunk.length; i < n; i++) {\n\t\t\t\t\tlookup[chunk.charAt(i)] = k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar regexp = new RegExp('[' +  foreignletters + ']', 'g');\n\t\treturn function(str) {\n\t\t\treturn str.replace(regexp, function(foreignletter) {\n\t\t\t\treturn lookup[foreignletter];\n\t\t\t}).toLowerCase();\n\t\t};\n\t})();\n\n\n\t// export\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n\treturn Sifter;\n}));\n\n\n\n/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('microplugin', factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.MicroPlugin = factory();\n\t}\n}(this, function() {\n\tvar MicroPlugin = {};\n\n\tMicroPlugin.mixin = function(Interface) {\n\t\tInterface.plugins = {};\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {mixed} plugins\n\t\t */\n\t\tInterface.prototype.initializePlugins = function(plugins) {\n\t\t\tvar i, n, key;\n\t\t\tvar self  = this;\n\t\t\tvar queue = [];\n\n\t\t\tself.plugins = {\n\t\t\t\tnames     : [],\n\t\t\t\tsettings  : {},\n\t\t\t\trequested : {},\n\t\t\t\tloaded    : {}\n\t\t\t};\n\n\t\t\tif (utils.isArray(plugins)) {\n\t\t\t\tfor (i = 0, n = plugins.length; i < n; i++) {\n\t\t\t\t\tif (typeof plugins[i] === 'string') {\n\t\t\t\t\t\tqueue.push(plugins[i]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugins[i].name] = plugins[i].options;\n\t\t\t\t\t\tqueue.push(plugins[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (queue.length) {\n\t\t\t\tself.require(queue.shift());\n\t\t\t}\n\t\t};\n\n\t\tInterface.prototype.loadPlugin = function(name) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t};\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t */\n\t\tInterface.prototype.require = function(name) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {function} fn\n\t\t */\n\t\tInterface.define = function(name, fn) {\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t};\n\t};\n\n\tvar utils = {\n\t\tisArray: Array.isArray || function(vArg) {\n\t\t\treturn Object.prototype.toString.call(vArg) === '[object Array]';\n\t\t}\n\t};\n\n\treturn MicroPlugin;\n}));\n\n/**\n * selectize.js (v0.12.6)\n * Copyright (c) 2013–2015 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\n/*jshint curly:false */\n/*jshint browser:true */\n\n(function(root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine('selectize', ['jquery','sifter','microplugin'], factory);\n\t} else if (typeof exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'), require('sifter'), require('microplugin'));\n\t} else {\n\t\troot.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);\n\t}\n}(this, function($, Sifter, MicroPlugin) {\n\t'use strict';\n\n\tvar highlight = function($element, pattern) {\n\t\tif (typeof pattern === 'string' && !pattern.length) return;\n\t\tvar regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;\n\t\n\t\tvar highlight = function(node) {\n\t\t\tvar skip = 0;\n\t\t\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t\t\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\t\t\tif (node.nodeType === 3) {\n\t\t\t\tvar pos = node.data.search(regex);\n\t\t\t\tif (pos >= 0 && node.data.length > 0) {\n\t\t\t\t\tvar match = node.data.match(regex);\n\t\t\t\t\tvar spannode = document.createElement('span');\n\t\t\t\t\tspannode.className = 'highlight';\n\t\t\t\t\tvar middlebit = node.splitText(pos);\n\t\t\t\t\tvar endbit = middlebit.splitText(match[0].length);\n\t\t\t\t\tvar middleclone = middlebit.cloneNode(true);\n\t\t\t\t\tspannode.appendChild(middleclone);\n\t\t\t\t\tmiddlebit.parentNode.replaceChild(spannode, middlebit);\n\t\t\t\t\tskip = 1;\n\t\t\t\t}\n\t\t\t} \n\t\t\t// Recurse element node, looking for child text nodes to highlight, unless element \n\t\t\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\t\t\telse if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' )) {\n\t\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\t\ti += highlight(node.childNodes[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn skip;\n\t\t};\n\t\n\t\treturn $element.each(function() {\n\t\t\thighlight(this);\n\t\t});\n\t};\n\t\n\t/**\n\t * removeHighlight fn copied from highlight v5 and\n\t * edited to remove with() and pass js strict mode\n\t */\n\t$.fn.removeHighlight = function() {\n\t\treturn this.find(\"span.highlight\").each(function() {\n\t\t\tthis.parentNode.firstChild.nodeName;\n\t\t\tvar parent = this.parentNode;\n\t\t\tparent.replaceChild(this.firstChild, this);\n\t\t\tparent.normalize();\n\t\t}).end();\n\t};\n\t\n\t\n\tvar MicroEvent = function() {};\n\tMicroEvent.prototype = {\n\t\ton: function(event, fct){\n\t\t\tthis._events = this._events || {};\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t},\n\t\toff: function(event, fct){\n\t\t\tvar n = arguments.length;\n\t\t\tif (n === 0) return delete this._events;\n\t\t\tif (n === 1) return delete this._events[event];\n\t\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t},\n\t\ttrigger: function(event /* , args... */){\n\t\t\tthis._events = this._events || {};\n\t\t\tif (event in this._events === false) return;\n\t\t\tfor (var i = 0; i < this._events[event].length; i++){\n\t\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * Mixin will delegate all MicroEvent.js function in the destination object.\n\t *\n\t * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent\n\t *\n\t * @param {object} the object which will support MicroEvent\n\t */\n\tMicroEvent.mixin = function(destObject){\n\t\tvar props = ['on', 'off', 'trigger'];\n\t\tfor (var i = 0; i < props.length; i++){\n\t\t\tdestObject.prototype[props[i]] = MicroEvent.prototype[props[i]];\n\t\t}\n\t};\n\t\n\tvar IS_MAC        = /Mac/.test(navigator.userAgent);\n\t\n\tvar KEY_A         = 65;\n\tvar KEY_COMMA     = 188;\n\tvar KEY_RETURN    = 13;\n\tvar KEY_ESC       = 27;\n\tvar KEY_LEFT      = 37;\n\tvar KEY_UP        = 38;\n\tvar KEY_P         = 80;\n\tvar KEY_RIGHT     = 39;\n\tvar KEY_DOWN      = 40;\n\tvar KEY_N         = 78;\n\tvar KEY_BACKSPACE = 8;\n\tvar KEY_DELETE    = 46;\n\tvar KEY_SHIFT     = 16;\n\tvar KEY_CMD       = IS_MAC ? 91 : 17;\n\tvar KEY_CTRL      = IS_MAC ? 18 : 17;\n\tvar KEY_TAB       = 9;\n\t\n\tvar TAG_SELECT    = 1;\n\tvar TAG_INPUT     = 2;\n\t\n\t// for now, android support in general is too spotty to support validity\n\tvar SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;\n\t\n\t\n\tvar isset = function(object) {\n\t\treturn typeof object !== 'undefined';\n\t};\n\t\n\t/**\n\t * Converts a scalar to its best string representation\n\t * for hash keys and HTML attribute values.\n\t *\n\t * Transformations:\n\t *   'str'     -> 'str'\n\t *   null      -> ''\n\t *   undefined -> ''\n\t *   true      -> '1'\n\t *   false     -> '0'\n\t *   0         -> '0'\n\t *   1         -> '1'\n\t *\n\t * @param {string} value\n\t * @returns {string|null}\n\t */\n\tvar hash_key = function(value) {\n\t\tif (typeof value === 'undefined' || value === null) return null;\n\t\tif (typeof value === 'boolean') return value ? '1' : '0';\n\t\treturn value + '';\n\t};\n\t\n\t/**\n\t * Escapes a string for use within HTML.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_html = function(str) {\n\t\treturn (str + '')\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t};\n\t\n\t/**\n\t * Escapes \"$\" characters in replacement strings.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\tvar escape_replace = function(str) {\n\t\treturn (str + '').replace(/\\$/g, '$$$$');\n\t};\n\t\n\tvar hook = {};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked before the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.before = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn original.apply(self, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `method` on `self` so that `fn`\n\t * is invoked after the original method.\n\t *\n\t * @param {object} self\n\t * @param {string} method\n\t * @param {function} fn\n\t */\n\thook.after = function(self, method, fn) {\n\t\tvar original = self[method];\n\t\tself[method] = function() {\n\t\t\tvar result = original.apply(self, arguments);\n\t\t\tfn.apply(self, arguments);\n\t\t\treturn result;\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be invoked once.\n\t *\n\t * @param {function} fn\n\t * @returns {function}\n\t */\n\tvar once = function(fn) {\n\t\tvar called = false;\n\t\treturn function() {\n\t\t\tif (called) return;\n\t\t\tcalled = true;\n\t\t\tfn.apply(this, arguments);\n\t\t};\n\t};\n\t\n\t/**\n\t * Wraps `fn` so that it can only be called once\n\t * every `delay` milliseconds (invoked on the falling edge).\n\t *\n\t * @param {function} fn\n\t * @param {int} delay\n\t * @returns {function}\n\t */\n\tvar debounce = function(fn, delay) {\n\t\tvar timeout;\n\t\treturn function() {\n\t\t\tvar self = this;\n\t\t\tvar args = arguments;\n\t\t\twindow.clearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(function() {\n\t\t\t\tfn.apply(self, args);\n\t\t\t}, delay);\n\t\t};\n\t};\n\t\n\t/**\n\t * Debounce all fired events types listed in `types`\n\t * while executing the provided `fn`.\n\t *\n\t * @param {object} self\n\t * @param {array} types\n\t * @param {function} fn\n\t */\n\tvar debounce_events = function(self, types, fn) {\n\t\tvar type;\n\t\tvar trigger = self.trigger;\n\t\tvar event_args = {};\n\t\n\t\t// override trigger method\n\t\tself.trigger = function() {\n\t\t\tvar type = arguments[0];\n\t\t\tif (types.indexOf(type) !== -1) {\n\t\t\t\tevent_args[type] = arguments;\n\t\t\t} else {\n\t\t\t\treturn trigger.apply(self, arguments);\n\t\t\t}\n\t\t};\n\t\n\t\t// invoke provided function\n\t\tfn.apply(self, []);\n\t\tself.trigger = trigger;\n\t\n\t\t// trigger queued events\n\t\tfor (type in event_args) {\n\t\t\tif (event_args.hasOwnProperty(type)) {\n\t\t\t\ttrigger.apply(self, event_args[type]);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/**\n\t * A workaround for http://bugs.jquery.com/ticket/6696\n\t *\n\t * @param {object} $parent - Parent element to listen on.\n\t * @param {string} event - Event name.\n\t * @param {string} selector - Descendant selector to filter by.\n\t * @param {function} fn - Event handler.\n\t */\n\tvar watchChildEvent = function($parent, event, selector, fn) {\n\t\t$parent.on(event, selector, function(e) {\n\t\t\tvar child = e.target;\n\t\t\twhile (child && child.parentNode !== $parent[0]) {\n\t\t\t\tchild = child.parentNode;\n\t\t\t}\n\t\t\te.currentTarget = child;\n\t\t\treturn fn.apply(this, [e]);\n\t\t});\n\t};\n\t\n\t/**\n\t * Determines the current selection within a text input control.\n\t * Returns an object containing:\n\t *   - start\n\t *   - length\n\t *\n\t * @param {object} input\n\t * @returns {object}\n\t */\n\tvar getSelection = function(input) {\n\t\tvar result = {};\n\t\tif ('selectionStart' in input) {\n\t\t\tresult.start = input.selectionStart;\n\t\t\tresult.length = input.selectionEnd - result.start;\n\t\t} else if (document.selection) {\n\t\t\tinput.focus();\n\t\t\tvar sel = document.selection.createRange();\n\t\t\tvar selLen = document.selection.createRange().text.length;\n\t\t\tsel.moveStart('character', -input.value.length);\n\t\t\tresult.start = sel.text.length - selLen;\n\t\t\tresult.length = selLen;\n\t\t}\n\t\treturn result;\n\t};\n\t\n\t/**\n\t * Copies CSS properties from one element to another.\n\t *\n\t * @param {object} $from\n\t * @param {object} $to\n\t * @param {array} properties\n\t */\n\tvar transferStyles = function($from, $to, properties) {\n\t\tvar i, n, styles = {};\n\t\tif (properties) {\n\t\t\tfor (i = 0, n = properties.length; i < n; i++) {\n\t\t\t\tstyles[properties[i]] = $from.css(properties[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tstyles = $from.css();\n\t\t}\n\t\t$to.css(styles);\n\t};\n\t\n\t/**\n\t * Measures the width of a string within a\n\t * parent element (in pixels).\n\t *\n\t * @param {string} str\n\t * @param {object} $parent\n\t * @returns {int}\n\t */\n\tvar measureString = function(str, $parent) {\n\t\tif (!str) {\n\t\t\treturn 0;\n\t\t}\n\t\n\t\tif (!Selectize.$testInput) {\n\t\t\tSelectize.$testInput = $('<span />').css({\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: -99999,\n\t\t\t\tleft: -99999,\n\t\t\t\twidth: 'auto',\n\t\t\t\tpadding: 0,\n\t\t\t\twhiteSpace: 'pre'\n\t\t\t}).appendTo('body');\n\t\t}\n\t\n\t\tSelectize.$testInput.text(str);\n\t\n\t\ttransferStyles($parent, Selectize.$testInput, [\n\t\t\t'letterSpacing',\n\t\t\t'fontSize',\n\t\t\t'fontFamily',\n\t\t\t'fontWeight',\n\t\t\t'textTransform'\n\t\t]);\n\t\n\t\treturn Selectize.$testInput.width();\n\t};\n\t\n\t/**\n\t * Sets up an input to grow horizontally as the user\n\t * types. If the value is changed manually, you can\n\t * trigger the \"update\" handler to resize:\n\t *\n\t * $input.trigger('update');\n\t *\n\t * @param {object} $input\n\t */\n\tvar autoGrow = function($input) {\n\t\tvar currentWidth = null;\n\t\n\t\tvar update = function(e, options) {\n\t\t\tvar value, keyCode, printable, placeholder, width;\n\t\t\tvar shift, character, selection;\n\t\t\te = e || window.event || {};\n\t\t\toptions = options || {};\n\t\n\t\t\tif (e.metaKey || e.altKey) return;\n\t\t\tif (!options.force && $input.data('grow') === false) return;\n\t\n\t\t\tvalue = $input.val();\n\t\t\tif (e.type && e.type.toLowerCase() === 'keydown') {\n\t\t\t\tkeyCode = e.keyCode;\n\t\t\t\tprintable = (\n\t\t\t\t\t(keyCode >= 48 && keyCode <= 57)  || // 0-9\n\t\t\t\t\t(keyCode >= 65 && keyCode <= 90)   || // a-z\n\t\t\t\t\t(keyCode >= 96 && keyCode <= 111)  || // numpad 0-9, numeric operators\n\t\t\t\t\t(keyCode >= 186 && keyCode <= 222) || // semicolon, equal, comma, dash, etc.\n\t\t\t\t\tkeyCode === 32 // space\n\t\t\t\t);\n\t\n\t\t\t\tif (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {\n\t\t\t\t\tselection = getSelection($input[0]);\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + selection.length);\n\t\t\t\t\t} else if (keyCode === KEY_BACKSPACE && selection.start) {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);\n\t\t\t\t\t} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {\n\t\t\t\t\t\tvalue = value.substring(0, selection.start) + value.substring(selection.start + 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (printable) {\n\t\t\t\t\tshift = e.shiftKey;\n\t\t\t\t\tcharacter = String.fromCharCode(e.keyCode);\n\t\t\t\t\tif (shift) character = character.toUpperCase();\n\t\t\t\t\telse character = character.toLowerCase();\n\t\t\t\t\tvalue += character;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tplaceholder = $input.attr('placeholder');\n\t\t\tif (!value && placeholder) {\n\t\t\t\tvalue = placeholder;\n\t\t\t}\n\t\n\t\t\twidth = measureString(value, $input) + 4;\n\t\t\tif (width !== currentWidth) {\n\t\t\t\tcurrentWidth = width;\n\t\t\t\t$input.width(width);\n\t\t\t\t$input.triggerHandler('resize');\n\t\t\t}\n\t\t};\n\t\n\t\t$input.on('keydown keyup update blur', update);\n\t\tupdate();\n\t};\n\t\n\tvar domToString = function(d) {\n\t\tvar tmp = document.createElement('div');\n\t\n\t\ttmp.appendChild(d.cloneNode(true));\n\t\n\t\treturn tmp.innerHTML;\n\t};\n\t\n\tvar logError = function(message, options){\n\t\tif(!options) options = {};\n\t\tvar component = \"Selectize\";\n\t\n\t\tconsole.error(component + \": \" + message)\n\t\n\t\tif(options.explanation){\n\t\t\t// console.group is undefined in <IE11\n\t\t\tif(console.group) console.group();\n\t\t\tconsole.error(options.explanation);\n\t\t\tif(console.group) console.groupEnd();\n\t\t}\n\t}\n\t\n\t\n\tvar Selectize = function($input, settings) {\n\t\tvar key, i, n, dir, input, self = this;\n\t\tinput = $input[0];\n\t\tinput.selectize = self;\n\t\n\t\t// detect rtl environment\n\t\tvar computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;\n\t\tdir = dir || $input.parents('[dir]:first').attr('dir') || '';\n\t\n\t\t// setup default state\n\t\t$.extend(self, {\n\t\t\torder            : 0,\n\t\t\tsettings         : settings,\n\t\t\t$input           : $input,\n\t\t\ttabIndex         : $input.attr('tabindex') || '',\n\t\t\ttagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,\n\t\t\trtl              : /rtl/i.test(dir),\n\t\n\t\t\teventNS          : '.selectize' + (++Selectize.count),\n\t\t\thighlightedValue : null,\n\t\t\tisBlurring       : false,\n\t\t\tisOpen           : false,\n\t\t\tisDisabled       : false,\n\t\t\tisRequired       : $input.is('[required]'),\n\t\t\tisInvalid        : false,\n\t\t\tisLocked         : false,\n\t\t\tisFocused        : false,\n\t\t\tisInputHidden    : false,\n\t\t\tisSetup          : false,\n\t\t\tisShiftDown      : false,\n\t\t\tisCmdDown        : false,\n\t\t\tisCtrlDown       : false,\n\t\t\tignoreFocus      : false,\n\t\t\tignoreBlur       : false,\n\t\t\tignoreHover      : false,\n\t\t\thasOptions       : false,\n\t\t\tcurrentResults   : null,\n\t\t\tlastValue        : '',\n\t\t\tcaretPos         : 0,\n\t\t\tloading          : 0,\n\t\t\tloadedSearches   : {},\n\t\n\t\t\t$activeOption    : null,\n\t\t\t$activeItems     : [],\n\t\n\t\t\toptgroups        : {},\n\t\t\toptions          : {},\n\t\t\tuserOptions      : {},\n\t\t\titems            : [],\n\t\t\trenderCache      : {},\n\t\t\tonSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)\n\t\t});\n\t\n\t\t// search system\n\t\tself.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\t\n\t\t// build options table\n\t\tif (self.settings.options) {\n\t\t\tfor (i = 0, n = self.settings.options.length; i < n; i++) {\n\t\t\t\tself.registerOption(self.settings.options[i]);\n\t\t\t}\n\t\t\tdelete self.settings.options;\n\t\t}\n\t\n\t\t// build optgroup table\n\t\tif (self.settings.optgroups) {\n\t\t\tfor (i = 0, n = self.settings.optgroups.length; i < n; i++) {\n\t\t\t\tself.registerOptionGroup(self.settings.optgroups[i]);\n\t\t\t}\n\t\t\tdelete self.settings.optgroups;\n\t\t}\n\t\n\t\t// option-dependent defaults\n\t\tself.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof self.settings.hideSelected !== 'boolean') {\n\t\t\tself.settings.hideSelected = self.settings.mode === 'multi';\n\t\t}\n\t\n\t\tself.initializePlugins(self.settings.plugins);\n\t\tself.setupCallbacks();\n\t\tself.setupTemplates();\n\t\tself.setup();\n\t};\n\t\n\t// mixins\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\tMicroEvent.mixin(Selectize);\n\t\n\tif(typeof MicroPlugin !== \"undefined\"){\n\t\tMicroPlugin.mixin(Selectize);\n\t}else{\n\t\tlogError(\"Dependency MicroPlugin is missing\",\n\t\t\t{explanation:\n\t\t\t\t\"Make sure you either: (1) are using the \\\"standalone\\\" \"+\n\t\t\t\t\"version of Selectize, or (2) require MicroPlugin before you \"+\n\t\t\t\t\"load Selectize.\"}\n\t\t);\n\t}\n\t\n\t\n\t// methods\n\t// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\t\n\t$.extend(Selectize.prototype, {\n\t\n\t\t/**\n\t\t * Creates all elements and sets up event bindings.\n\t\t */\n\t\tsetup: function() {\n\t\t\tvar self      = this;\n\t\t\tvar settings  = self.settings;\n\t\t\tvar eventNS   = self.eventNS;\n\t\t\tvar $window   = $(window);\n\t\t\tvar $document = $(document);\n\t\t\tvar $input    = self.$input;\n\t\n\t\t\tvar $wrapper;\n\t\t\tvar $control;\n\t\t\tvar $control_input;\n\t\t\tvar $dropdown;\n\t\t\tvar $dropdown_content;\n\t\t\tvar $dropdown_parent;\n\t\t\tvar inputMode;\n\t\t\tvar timeout_blur;\n\t\t\tvar timeout_focus;\n\t\t\tvar classes;\n\t\t\tvar classes_plugins;\n\t\t\tvar inputId;\n\t\n\t\t\tinputMode         = self.settings.mode;\n\t\t\tclasses           = $input.attr('class') || '';\n\t\n\t\t\t$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);\n\t\t\t$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);\n\t\t\t$control_input    = $('<input type=\"text\" autocomplete=\"off\" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);\n\t\t\t$dropdown_parent  = $(settings.dropdownParent || $wrapper);\n\t\t\t$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);\n\t\t\t$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);\n\t\n\t\t\tif(inputId = $input.attr('id')) {\n\t\t\t\t$control_input.attr('id', inputId + '-selectized');\n\t\t\t\t$(\"label[for='\"+inputId+\"']\").attr('for', inputId + '-selectized');\n\t\t\t}\n\t\n\t\t\tif(self.settings.copyClassesToDropdown) {\n\t\t\t\t$dropdown.addClass(classes);\n\t\t\t}\n\t\n\t\t\t$wrapper.css({\n\t\t\t\twidth: $input[0].style.width\n\t\t\t});\n\t\n\t\t\tif (self.plugins.names.length) {\n\t\t\t\tclasses_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\t\t$wrapper.addClass(classes_plugins);\n\t\t\t\t$dropdown.addClass(classes_plugins);\n\t\t\t}\n\t\n\t\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {\n\t\t\t\t$input.attr('multiple', 'multiple');\n\t\t\t}\n\t\n\t\t\tif (self.settings.placeholder) {\n\t\t\t\t$control_input.attr('placeholder', settings.placeholder);\n\t\t\t}\n\t\n\t\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\t\tif (!self.settings.splitOn && self.settings.delimiter) {\n\t\t\t\tvar delimiterEscaped = self.settings.delimiter.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\t\tself.settings.splitOn = new RegExp('\\\\s*' + delimiterEscaped + '+\\\\s*');\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocorrect')) {\n\t\t\t\t$control_input.attr('autocorrect', $input.attr('autocorrect'));\n\t\t\t}\n\t\n\t\t\tif ($input.attr('autocapitalize')) {\n\t\t\t\t$control_input.attr('autocapitalize', $input.attr('autocapitalize'));\n\t\t\t}\n\t\t\t$control_input[0].type = $input[0].type;\n\t\n\t\t\tself.$wrapper          = $wrapper;\n\t\t\tself.$control          = $control;\n\t\t\tself.$control_input    = $control_input;\n\t\t\tself.$dropdown         = $dropdown;\n\t\t\tself.$dropdown_content = $dropdown_content;\n\t\n\t\t\t$dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });\n\t\t\t$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });\n\t\t\t$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });\n\t\t\twatchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });\n\t\t\tautoGrow($control_input);\n\t\n\t\t\t$control.on({\n\t\t\t\tmousedown : function() { return self.onMouseDown.apply(self, arguments); },\n\t\t\t\tclick     : function() { return self.onClick.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$control_input.on({\n\t\t\t\tmousedown : function(e) { e.stopPropagation(); },\n\t\t\t\tkeydown   : function() { return self.onKeyDown.apply(self, arguments); },\n\t\t\t\tkeyup     : function() { return self.onKeyUp.apply(self, arguments); },\n\t\t\t\tkeypress  : function() { return self.onKeyPress.apply(self, arguments); },\n\t\t\t\tresize    : function() { self.positionDropdown.apply(self, []); },\n\t\t\t\tblur      : function() { return self.onBlur.apply(self, arguments); },\n\t\t\t\tfocus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },\n\t\t\t\tpaste     : function() { return self.onPaste.apply(self, arguments); }\n\t\t\t});\n\t\n\t\t\t$document.on('keydown' + eventNS, function(e) {\n\t\t\t\tself.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];\n\t\t\t\tself.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];\n\t\t\t\tself.isShiftDown = e.shiftKey;\n\t\t\t});\n\t\n\t\t\t$document.on('keyup' + eventNS, function(e) {\n\t\t\t\tif (e.keyCode === KEY_CTRL) self.isCtrlDown = false;\n\t\t\t\tif (e.keyCode === KEY_SHIFT) self.isShiftDown = false;\n\t\t\t\tif (e.keyCode === KEY_CMD) self.isCmdDown = false;\n\t\t\t});\n\t\n\t\t\t$document.on('mousedown' + eventNS, function(e) {\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\t// prevent events on the dropdown scrollbar from causing the control to blur\n\t\t\t\t\tif (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// blur on click outside\n\t\t\t\t\tif (!self.$control.has(e.target).length && e.target !== self.$control[0]) {\n\t\t\t\t\t\tself.blur(e.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tself.positionDropdown.apply(self, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t\t$window.on('mousemove' + eventNS, function() {\n\t\t\t\tself.ignoreHover = false;\n\t\t\t});\n\t\n\t\t\t// store original children and tab index so that they can be\n\t\t\t// restored when the destroy() method is called.\n\t\t\tthis.revertSettings = {\n\t\t\t\t$children : $input.children().detach(),\n\t\t\t\ttabindex  : $input.attr('tabindex')\n\t\t\t};\n\t\n\t\t\t$input.attr('tabindex', -1).hide().after(self.$wrapper);\n\t\n\t\t\tif ($.isArray(settings.items)) {\n\t\t\t\tself.setValue(settings.items);\n\t\t\t\tdelete settings.items;\n\t\t\t}\n\t\n\t\t\t// feature detect for the validation API\n\t\t\tif (SUPPORTS_VALIDITY_API) {\n\t\t\t\t$input.on('invalid' + eventNS, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.isInvalid = true;\n\t\t\t\t\tself.refreshState();\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\tself.updateOriginalInput();\n\t\t\tself.refreshItems();\n\t\t\tself.refreshState();\n\t\t\tself.updatePlaceholder();\n\t\t\tself.isSetup = true;\n\t\n\t\t\tif ($input.is(':disabled')) {\n\t\t\t\tself.disable();\n\t\t\t}\n\t\n\t\t\tself.on('change', this.onChange);\n\t\n\t\t\t$input.data('selectize', self);\n\t\t\t$input.addClass('selectized');\n\t\t\tself.trigger('initialize');\n\t\n\t\t\t// preload options\n\t\t\tif (settings.preload === true) {\n\t\t\t\tself.onSearchChange('');\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t/**\n\t\t * Sets up default rendering functions.\n\t\t */\n\t\tsetupTemplates: function() {\n\t\t\tvar self = this;\n\t\t\tvar field_label = self.settings.labelField;\n\t\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\t\n\t\t\tvar templates = {\n\t\t\t\t'optgroup': function(data) {\n\t\t\t\t\treturn '<div class=\"optgroup\">' + data.html + '</div>';\n\t\t\t\t},\n\t\t\t\t'optgroup_header': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"option\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'item': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"item\">' + escape(data[field_label]) + '</div>';\n\t\t\t\t},\n\t\t\t\t'option_create': function(data, escape) {\n\t\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tself.settings.render = $.extend({}, templates, self.settings.render);\n\t\t},\n\t\n\t\t/**\n\t\t * Maps fired events to callbacks provided\n\t\t * in the settings used when creating the control.\n\t\t */\n\t\tsetupCallbacks: function() {\n\t\t\tvar key, fn, callbacks = {\n\t\t\t\t'initialize'      : 'onInitialize',\n\t\t\t\t'change'          : 'onChange',\n\t\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t\t'clear'           : 'onClear',\n\t\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t\t'type'            : 'onType',\n\t\t\t\t'load'            : 'onLoad',\n\t\t\t\t'focus'           : 'onFocus',\n\t\t\t\t'blur'            : 'onBlur'\n\t\t\t};\n\t\n\t\t\tfor (key in callbacks) {\n\t\t\t\tif (callbacks.hasOwnProperty(key)) {\n\t\t\t\t\tfn = this.settings[callbacks[key]];\n\t\t\t\t\tif (fn) this.on(key, fn);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a click event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonClick: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\t// necessary for mobile webkit devices (manual focus triggering\n\t\t\t// is ignored unless invoked within a click event)\n\t    // also necessary to reopen a dropdown that has been closed by\n\t    // closeAfterSelect\n\t\t\tif (!self.isFocused || !self.isOpen) {\n\t\t\t\tself.focus();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the main control element\n\t\t * has a mouse down event.\n\t\t *\n\t\t * @param {object} e\n\t\t * @return {boolean}\n\t\t */\n\t\tonMouseDown: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar defaultPrevented = e.isDefaultPrevented();\n\t\t\tvar $target = $(e.target);\n\t\n\t\t\tif (self.isFocused) {\n\t\t\t\t// retain focus by preventing native handling. if the\n\t\t\t\t// event target is the input it should not be modified.\n\t\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t\tif (e.target !== self.$control_input[0]) {\n\t\t\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\t\t\t// toggle dropdown\n\t\t\t\t\t\tself.isOpen ? self.close() : self.open();\n\t\t\t\t\t} else if (!defaultPrevented) {\n\t\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// give control focus\n\t\t\t\tif (!defaultPrevented) {\n\t\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\t\tself.focus();\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the value of the control has been changed.\n\t\t * This should propagate the event to the original DOM\n\t\t * input / select element.\n\t\t */\n\t\tonChange: function() {\n\t\t\tthis.$input.trigger('change');\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> paste.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonPaste: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isFull() || self.isInputHidden || self.isLocked) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If a regex or string is included, this will split the pasted\n\t\t\t// input and create Items for each separate value\n\t\t\tif (self.settings.splitOn) {\n\t\n\t\t\t\t// Wait for pasted text to be recognized in value\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tvar pastedText = self.$control_input.val();\n\t\t\t\t\tif(!pastedText.match(self.settings.splitOn)){ return }\n\t\n\t\t\t\t\tvar splitInput = $.trim(pastedText).split(self.settings.splitOn);\n\t\t\t\t\tfor (var i = 0, n = splitInput.length; i < n; i++) {\n\t\t\t\t\t\tself.createItem(splitInput[i]);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keypress.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyPress: function(e) {\n\t\t\tif (this.isLocked) return e && e.preventDefault();\n\t\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\t\tif (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {\n\t\t\t\tthis.createItem();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keydown.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyDown: function(e) {\n\t\t\tvar isInput = e.target === this.$control_input[0];\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) {\n\t\t\t\tif (e.keyCode !== KEY_TAB) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tswitch (e.keyCode) {\n\t\t\t\tcase KEY_A:\n\t\t\t\t\tif (self.isCmdDown) {\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_N:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_DOWN:\n\t\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\t\tself.open();\n\t\t\t\t\t} else if (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $next = self.getAdjacentOption(self.$activeOption, 1);\n\t\t\t\t\t\tif ($next.length) self.setActiveOption($next, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_P:\n\t\t\t\t\tif (!e.ctrlKey || e.altKey) break;\n\t\t\t\tcase KEY_UP:\n\t\t\t\t\tif (self.$activeOption) {\n\t\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t\tvar $prev = self.getAdjacentOption(self.$activeOption, -1);\n\t\t\t\t\t\tif ($prev.length) self.setActiveOption($prev, true, true);\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RETURN:\n\t\t\t\t\tif (self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_LEFT:\n\t\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_RIGHT:\n\t\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_TAB:\n\t\t\t\t\tif (self.settings.selectOnTab && self.isOpen && self.$activeOption) {\n\t\t\t\t\t\tself.onOptionSelect({currentTarget: self.$activeOption});\n\t\n\t\t\t\t\t\t// Default behaviour is to jump to the next field, we only want this\n\t\t\t\t\t\t// if the current field doesn't accept any more entries\n\t\t\t\t\t\tif (!self.isFull()) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\tcase KEY_BACKSPACE:\n\t\t\t\tcase KEY_DELETE:\n\t\t\t\t\tself.deleteSelection(e);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> keyup.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonKeyUp: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return e && e.preventDefault();\n\t\t\tvar value = self.$control_input.val() || '';\n\t\t\tif (self.lastValue !== value) {\n\t\t\t\tself.lastValue = value;\n\t\t\t\tself.onSearchChange(value);\n\t\t\t\tself.refreshOptions();\n\t\t\t\tself.trigger('type', value);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the user-provide option provider / loader.\n\t\t *\n\t\t * Note: this function is debounced in the Selectize\n\t\t * constructor (by `settings.loadThrottle` milliseconds)\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tonSearchChange: function(value) {\n\t\t\tvar self = this;\n\t\t\tvar fn = self.settings.load;\n\t\t\tif (!fn) return;\n\t\t\tif (self.loadedSearches.hasOwnProperty(value)) return;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tself.load(function(callback) {\n\t\t\t\tfn.apply(self, [value, callback]);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> focus.\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tonFocus: function(e) {\n\t\t\tvar self = this;\n\t\t\tvar wasFocused = self.isFocused;\n\t\n\t\t\tif (self.isDisabled) {\n\t\t\t\tself.blur();\n\t\t\t\te && e.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tif (self.ignoreFocus) return;\n\t\t\tself.isFocused = true;\n\t\t\tif (self.settings.preload === 'focus') self.onSearchChange('');\n\t\n\t\t\tif (!wasFocused) self.trigger('focus');\n\t\n\t\t\tif (!self.$activeItems.length) {\n\t\t\t\tself.showInput();\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t\t}\n\t\n\t\t\tself.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered on <input> blur.\n\t\t *\n\t\t * @param {object} e\n\t\t * @param {Element} dest\n\t\t */\n\t\tonBlur: function(e, dest) {\n\t\t\tvar self = this;\n\t\t\tif (!self.isFocused) return;\n\t\t\tself.isFocused = false;\n\t\n\t\t\tif (self.ignoreFocus) {\n\t\t\t\treturn;\n\t\t\t} else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {\n\t\t\t\t// necessary to prevent IE closing the dropdown when the scrollbar is clicked\n\t\t\t\tself.ignoreBlur = true;\n\t\t\t\tself.onFocus(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tvar deactivate = function() {\n\t\t\t\tself.close();\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.setActiveItem(null);\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\tself.refreshState();\n\t\n\t\t\t\t// IE11 bug: element still marked as active\n\t\t\t\tdest && dest.focus && dest.focus();\n\t\n\t\t\t\tself.isBlurring = false;\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.trigger('blur');\n\t\t\t};\n\t\n\t\t\tself.isBlurring = true;\n\t\t\tself.ignoreFocus = true;\n\t\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\t\tself.createItem(null, false, deactivate);\n\t\t\t} else {\n\t\t\t\tdeactivate();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user rolls over\n\t\t * an option in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionHover: function(e) {\n\t\t\tif (this.ignoreHover) return;\n\t\t\tthis.setActiveOption(e.currentTarget, false);\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an option\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonOptionSelect: function(e) {\n\t\t\tvar value, $target, $option, self = this;\n\t\n\t\t\tif (e.preventDefault) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\n\t\t\t$target = $(e.currentTarget);\n\t\t\tif ($target.hasClass('create')) {\n\t\t\t\tself.createItem(null, function() {\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvalue = $target.attr('data-value');\n\t\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\t\tself.lastQuery = null;\n\t\t\t\t\tself.setTextboxValue('');\n\t\t\t\t\tself.addItem(value);\n\t\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {\n\t\t\t\t\t\tself.setActiveOption(self.getOption(value));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Triggered when the user clicks on an item\n\t\t * that has been selected.\n\t\t *\n\t\t * @param {object} e\n\t\t * @returns {boolean}\n\t\t */\n\t\tonItemSelect: function(e) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked) return;\n\t\t\tif (self.settings.mode === 'multi') {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.setActiveItem(e.currentTarget, e);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the provided method that provides\n\t\t * results to a callback---which are then added\n\t\t * as options to the control.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tload: function(fn) {\n\t\t\tvar self = this;\n\t\t\tvar $wrapper = self.$wrapper.addClass(self.settings.loadingClass);\n\t\n\t\t\tself.loading++;\n\t\t\tfn.apply(self, [function(results) {\n\t\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\t\tif (results && results.length) {\n\t\t\t\t\tself.addOption(results);\n\t\t\t\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\t\t\t\t}\n\t\t\t\tif (!self.loading) {\n\t\t\t\t\t$wrapper.removeClass(self.settings.loadingClass);\n\t\t\t\t}\n\t\t\t\tself.trigger('load', results);\n\t\t\t}]);\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the input field of the control to the specified value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tsetTextboxValue: function(value) {\n\t\t\tvar $input = this.$control_input;\n\t\t\tvar changed = $input.val() !== value;\n\t\t\tif (changed) {\n\t\t\t\t$input.val(value).triggerHandler('update');\n\t\t\t\tthis.lastValue = value;\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the value of the control. If multiple items\n\t\t * can be selected (e.g. <select multiple>), this returns\n\t\t * an array. If only one item can be selected, this\n\t\t * returns a string.\n\t\t *\n\t\t * @returns {mixed}\n\t\t */\n\t\tgetValue: function() {\n\t\t\tif (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {\n\t\t\t\treturn this.items;\n\t\t\t} else {\n\t\t\t\treturn this.items.join(this.settings.delimiter);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Resets the selected items to the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t */\n\t\tsetValue: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tthis.clear(silent);\n\t\t\t\tthis.addItems(value, silent);\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item.\n\t\t *\n\t\t * @param {object} $item\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tsetActiveItem: function($item, e) {\n\t\t\tvar self = this;\n\t\t\tvar eventName;\n\t\t\tvar i, idx, begin, end, item, swap;\n\t\t\tvar $last;\n\t\n\t\t\tif (self.settings.mode === 'single') return;\n\t\t\t$item = $($item);\n\t\n\t\t\t// clear the active selection\n\t\t\tif (!$item.length) {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [];\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.showInput();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// modify selection\n\t\t\teventName = e && e.type.toLowerCase();\n\t\n\t\t\tif (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {\n\t\t\t\t$last = self.$control.children('.active:last');\n\t\t\t\tbegin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);\n\t\t\t\tend   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);\n\t\t\t\tif (begin > end) {\n\t\t\t\t\tswap  = begin;\n\t\t\t\t\tbegin = end;\n\t\t\t\t\tend   = swap;\n\t\t\t\t}\n\t\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\t\titem = self.$control[0].childNodes[i];\n\t\t\t\t\tif (self.$activeItems.indexOf(item) === -1) {\n\t\t\t\t\t\t$(item).addClass('active');\n\t\t\t\t\t\tself.$activeItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t} else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t\t$item.removeClass('active');\n\t\t\t\t} else {\n\t\t\t\t\tself.$activeItems.push($item.addClass('active')[0]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$(self.$activeItems).removeClass('active');\n\t\t\t\tself.$activeItems = [$item.addClass('active')[0]];\n\t\t\t}\n\t\n\t\t\t// ensure control has focus\n\t\t\tself.hideInput();\n\t\t\tif (!this.isFocused) {\n\t\t\t\tself.focus();\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Sets the selected item in the dropdown menu\n\t\t * of available options.\n\t\t *\n\t\t * @param {object} $object\n\t\t * @param {boolean} scroll\n\t\t * @param {boolean} animate\n\t\t */\n\t\tsetActiveOption: function($option, scroll, animate) {\n\t\t\tvar height_menu, height_item, y;\n\t\t\tvar scroll_top, scroll_bottom;\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.$activeOption) self.$activeOption.removeClass('active');\n\t\t\tself.$activeOption = null;\n\t\n\t\t\t$option = $($option);\n\t\t\tif (!$option.length) return;\n\t\n\t\t\tself.$activeOption = $option.addClass('active');\n\t\n\t\t\tif (scroll || !isset(scroll)) {\n\t\n\t\t\t\theight_menu   = self.$dropdown_content.height();\n\t\t\t\theight_item   = self.$activeOption.outerHeight(true);\n\t\t\t\tscroll        = self.$dropdown_content.scrollTop() || 0;\n\t\t\t\ty             = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;\n\t\t\t\tscroll_top    = y;\n\t\t\t\tscroll_bottom = y - height_menu + height_item;\n\t\n\t\t\t\tif (y + height_item > height_menu + scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t} else if (y < scroll) {\n\t\t\t\t\tself.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);\n\t\t\t\t}\n\t\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Selects all items (CTRL + A).\n\t\t */\n\t\tselectAll: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.settings.mode === 'single') return;\n\t\n\t\t\tself.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\tself.hideInput();\n\t\t\t\tself.close();\n\t\t\t}\n\t\t\tself.focus();\n\t\t},\n\t\n\t\t/**\n\t\t * Hides the input element out of view, while\n\t\t * retaining its focus.\n\t\t */\n\t\thideInput: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.setTextboxValue('');\n\t\t\tself.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});\n\t\t\tself.isInputHidden = true;\n\t\t},\n\t\n\t\t/**\n\t\t * Restores input visibility.\n\t\t */\n\t\tshowInput: function() {\n\t\t\tthis.$control_input.css({opacity: 1, position: 'relative', left: 0});\n\t\t\tthis.isInputHidden = false;\n\t\t},\n\t\n\t\t/**\n\t\t * Gives the control focus.\n\t\t */\n\t\tfocus: function() {\n\t\t\tvar self = this;\n\t\t\tif (self.isDisabled) return;\n\t\n\t\t\tself.ignoreFocus = true;\n\t\t\tself.$control_input[0].focus();\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tself.ignoreFocus = false;\n\t\t\t\tself.onFocus();\n\t\t\t}, 0);\n\t\t},\n\t\n\t\t/**\n\t\t * Forces the control out of focus.\n\t\t *\n\t\t * @param {Element} dest\n\t\t */\n\t\tblur: function(dest) {\n\t\t\tthis.$control_input[0].blur();\n\t\t\tthis.onBlur(null, dest);\n\t\t},\n\t\n\t\t/**\n\t\t * Returns a function that scores an object\n\t\t * to show how good of a match it is to the\n\t\t * provided query.\n\t\t *\n\t\t * @param {string} query\n\t\t * @param {object} options\n\t\t * @return {function}\n\t\t */\n\t\tgetScoreFunction: function(query) {\n\t\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t\t},\n\t\n\t\t/**\n\t\t * Returns search options for sifter (the system\n\t\t * for scoring and sorting results).\n\t\t *\n\t\t * @see https://github.com/brianreavis/sifter.js\n\t\t * @return {object}\n\t\t */\n\t\tgetSearchOptions: function() {\n\t\t\tvar settings = this.settings;\n\t\t\tvar sort = settings.sortField;\n\t\t\tif (typeof sort === 'string') {\n\t\t\t\tsort = [{field: sort}];\n\t\t\t}\n\t\n\t\t\treturn {\n\t\t\t\tfields      : settings.searchField,\n\t\t\t\tconjunction : settings.searchConjunction,\n\t\t\t\tsort        : sort,\n\t\t\t\tnesting     : settings.nesting\n\t\t\t};\n\t\t},\n\t\n\t\t/**\n\t\t * Searches through available options and returns\n\t\t * a sorted array of matches.\n\t\t *\n\t\t * Returns an object containing:\n\t\t *\n\t\t *   - query {string}\n\t\t *   - tokens {array}\n\t\t *   - total {int}\n\t\t *   - items {array}\n\t\t *\n\t\t * @param {string} query\n\t\t * @returns {object}\n\t\t */\n\t\tsearch: function(query) {\n\t\t\tvar i, value, score, result, calculateScore;\n\t\t\tvar self     = this;\n\t\t\tvar settings = self.settings;\n\t\t\tvar options  = this.getSearchOptions();\n\t\n\t\t\t// validate user-provided result scoring function\n\t\t\tif (settings.score) {\n\t\t\t\tcalculateScore = self.settings.score.apply(this, [query]);\n\t\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\t\tthrow new Error('Selectize \"score\" setting must be a function that returns a function');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// perform search\n\t\t\tif (query !== self.lastQuery) {\n\t\t\t\tself.lastQuery = query;\n\t\t\t\tresult = self.sifter.search(query, $.extend(options, {score: calculateScore}));\n\t\t\t\tself.currentResults = result;\n\t\t\t} else {\n\t\t\t\tresult = $.extend(true, {}, self.currentResults);\n\t\t\t}\n\t\n\t\t\t// filter out selected items\n\t\t\tif (settings.hideSelected) {\n\t\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {\n\t\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn result;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the list of available options shown\n\t\t * in the autocomplete dropdown menu.\n\t\t *\n\t\t * @param {boolean} triggerDropdown\n\t\t */\n\t\trefreshOptions: function(triggerDropdown) {\n\t\t\tvar i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;\n\t\t\tvar $active, $active_before, $create;\n\t\n\t\t\tif (typeof triggerDropdown === 'undefined') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tvar self              = this;\n\t\t\tvar query             = $.trim(self.$control_input.val());\n\t\t\tvar results           = self.search(query);\n\t\t\tvar $dropdown_content = self.$dropdown_content;\n\t\t\tvar active_before     = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));\n\t\n\t\t\t// build markup\n\t\t\tn = results.items.length;\n\t\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t\t}\n\t\n\t\t\t// render and group available options individually\n\t\t\tgroups = {};\n\t\t\tgroups_order = [];\n\t\n\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\toption      = self.options[results.items[i].id];\n\t\t\t\toption_html = self.render('option', option);\n\t\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\t\toptgroups   = $.isArray(optgroup) ? optgroup : [optgroup];\n\t\n\t\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\t\toptgroup = optgroups[j];\n\t\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\toptgroup = '';\n\t\t\t\t\t}\n\t\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t\t}\n\t\t\t\t\tgroups[optgroup].appendChild(option_html);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// sort optgroups\n\t\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\t\tgroups_order.sort(function(a, b) {\n\t\t\t\t\tvar a_order = self.optgroups[a].$order || 0;\n\t\t\t\t\tvar b_order = self.optgroups[b].$order || 0;\n\t\t\t\t\treturn a_order - b_order;\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\t// render optgroup headers & join groups\n\t\t\thtml = document.createDocumentFragment();\n\t\t\tfor (i = 0, n = groups_order.length; i < n; i++) {\n\t\t\t\toptgroup = groups_order[i];\n\t\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {\n\t\t\t\t\t// render the optgroup header and options within it,\n\t\t\t\t\t// then pass it to the wrapper template\n\t\t\t\t\thtml_children = document.createDocumentFragment();\n\t\t\t\t\thtml_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));\n\t\t\t\t\thtml_children.appendChild(groups[optgroup]);\n\t\n\t\t\t\t\thtml.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {\n\t\t\t\t\t\thtml: domToString(html_children),\n\t\t\t\t\t\tdom:  html_children\n\t\t\t\t\t})));\n\t\t\t\t} else {\n\t\t\t\t\thtml.appendChild(groups[optgroup]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t$dropdown_content.html(html);\n\t\n\t\t\t// highlight matching terms inline\n\t\t\tif (self.settings.highlight) {\n\t\t\t\t$dropdown_content.removeHighlight();\n\t\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\t\tfor (i = 0, n = results.tokens.length; i < n; i++) {\n\t\t\t\t\t\thighlight($dropdown_content, results.tokens[i].regex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add \"selected\" class to selected options\n\t\t\tif (!self.settings.hideSelected) {\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tself.getOption(self.items[i]).addClass('selected');\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// add create option\n\t\t\thas_create_option = self.canCreate(query);\n\t\t\tif (has_create_option) {\n\t\t\t\t$dropdown_content.prepend(self.render('option_create', {input: query}));\n\t\t\t\t$create = $($dropdown_content[0].childNodes[0]);\n\t\t\t}\n\t\n\t\t\t// activate\n\t\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\t\tif (self.hasOptions) {\n\t\t\t\tif (results.items.length > 0) {\n\t\t\t\t\t$active_before = active_before && self.getOption(active_before);\n\t\t\t\t\tif ($active_before && $active_before.length) {\n\t\t\t\t\t\t$active = $active_before;\n\t\t\t\t\t} else if (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\t\t\t$active = self.getOption(self.items[0]);\n\t\t\t\t\t}\n\t\t\t\t\tif (!$active || !$active.length) {\n\t\t\t\t\t\tif ($create && !self.settings.addPrecedence) {\n\t\t\t\t\t\t\t$active = self.getAdjacentOption($create, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$active = $dropdown_content.find('[data-selectable]:first');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$active = $create;\n\t\t\t\t}\n\t\t\t\tself.setActiveOption($active);\n\t\t\t\tif (triggerDropdown && !self.isOpen) { self.open(); }\n\t\t\t} else {\n\t\t\t\tself.setActiveOption(null);\n\t\t\t\tif (triggerDropdown && self.isOpen) { self.close(); }\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Adds an available option. If it already exists,\n\t\t * nothing will happen. Note: this does not refresh\n\t\t * the options list dropdown (use `refreshOptions`\n\t\t * for that).\n\t\t *\n\t\t * Usage:\n\t\t *\n\t\t *   this.addOption(data)\n\t\t *\n\t\t * @param {object|array} data\n\t\t */\n\t\taddOption: function(data) {\n\t\t\tvar i, n, value, self = this;\n\t\n\t\t\tif ($.isArray(data)) {\n\t\t\t\tfor (i = 0, n = data.length; i < n; i++) {\n\t\t\t\t\tself.addOption(data[i]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif (value = self.registerOption(data)) {\n\t\t\t\tself.userOptions[value] = true;\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.trigger('option_add', value, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option to the pool of options.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOption: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.valueField]);\n\t\t\tif (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.options[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers an option group to the pool of option groups.\n\t\t *\n\t\t * @param {object} data\n\t\t * @return {boolean|string}\n\t\t */\n\t\tregisterOptionGroup: function(data) {\n\t\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\t\t\tif (!key) return false;\n\t\n\t\t\tdata.$order = data.$order || ++this.order;\n\t\t\tthis.optgroups[key] = data;\n\t\t\treturn key;\n\t\t},\n\t\n\t\t/**\n\t\t * Registers a new optgroup for options\n\t\t * to be bucketed into.\n\t\t *\n\t\t * @param {string} id\n\t\t * @param {object} data\n\t\t */\n\t\taddOptionGroup: function(id, data) {\n\t\t\tdata[this.settings.optgroupValueField] = id;\n\t\t\tif (id = this.registerOptionGroup(data)) {\n\t\t\t\tthis.trigger('optgroup_add', id, data);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes an existing option group.\n\t\t *\n\t\t * @param {string} id\n\t\t */\n\t\tremoveOptionGroup: function(id) {\n\t\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\t\tdelete this.optgroups[id];\n\t\t\t\tthis.renderCache = {};\n\t\t\t\tthis.trigger('optgroup_remove', id);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all existing option groups.\n\t\t */\n\t\tclearOptionGroups: function() {\n\t\t\tthis.optgroups = {};\n\t\t\tthis.renderCache = {};\n\t\t\tthis.trigger('optgroup_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Updates an option available for selection. If\n\t\t * it is visible in the selected items or options\n\t\t * dropdown, it will be re-rendered automatically.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {object} data\n\t\t */\n\t\tupdateOption: function(value, data) {\n\t\t\tvar self = this;\n\t\t\tvar $item, $item_new;\n\t\t\tvar value_new, index_item, cache_items, cache_options, order_old;\n\t\n\t\t\tvalue     = hash_key(value);\n\t\t\tvalue_new = hash_key(data[self.settings.valueField]);\n\t\n\t\t\t// sanity checks\n\t\t\tif (value === null) return;\n\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\tif (typeof value_new !== 'string') throw new Error('Value must be set in option data');\n\t\n\t\t\torder_old = self.options[value].$order;\n\t\n\t\t\t// update references\n\t\t\tif (value_new !== value) {\n\t\t\t\tdelete self.options[value];\n\t\t\t\tindex_item = self.items.indexOf(value);\n\t\t\t\tif (index_item !== -1) {\n\t\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata.$order = data.$order || order_old;\n\t\t\tself.options[value_new] = data;\n\t\n\t\t\t// invalidate render cache\n\t\t\tcache_items = self.renderCache['item'];\n\t\t\tcache_options = self.renderCache['option'];\n\t\n\t\t\tif (cache_items) {\n\t\t\t\tdelete cache_items[value];\n\t\t\t\tdelete cache_items[value_new];\n\t\t\t}\n\t\t\tif (cache_options) {\n\t\t\t\tdelete cache_options[value];\n\t\t\t\tdelete cache_options[value_new];\n\t\t\t}\n\t\n\t\t\t// update the item if it's selected\n\t\t\tif (self.items.indexOf(value_new) !== -1) {\n\t\t\t\t$item = self.getItem(value);\n\t\t\t\t$item_new = $(self.render('item', data));\n\t\t\t\tif ($item.hasClass('active')) $item_new.addClass('active');\n\t\t\t\t$item.replaceWith($item_new);\n\t\t\t}\n\t\n\t\t\t// invalidate last query because we might have updated the sortField\n\t\t\tself.lastQuery = null;\n\t\n\t\t\t// update dropdown contents\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.refreshOptions(false);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Removes a single option.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\tremoveOption: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tvar cache_items = self.renderCache['item'];\n\t\t\tvar cache_options = self.renderCache['option'];\n\t\t\tif (cache_items) delete cache_items[value];\n\t\t\tif (cache_options) delete cache_options[value];\n\t\n\t\t\tdelete self.userOptions[value];\n\t\t\tdelete self.options[value];\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_remove', value);\n\t\t\tself.removeItem(value, silent);\n\t\t},\n\t\n\t\t/**\n\t\t * Clears all options.\n\t\t */\n\t\tclearOptions: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tself.loadedSearches = {};\n\t\t\tself.userOptions = {};\n\t\t\tself.renderCache = {};\n\t\t\tvar options = self.options;\n\t\t\t$.each(self.options, function(key, value) {\n\t\t\t\tif(self.items.indexOf(key) == -1) {\n\t\t\t\t\tdelete options[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.options = self.sifter.items = options;\n\t\t\tself.lastQuery = null;\n\t\t\tself.trigger('option_clear');\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the option\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetOption: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the next or\n\t\t * previous selectable option.\n\t\t *\n\t\t * @param {object} $option\n\t\t * @param {int} direction  can be 1 for next or -1 for previous\n\t\t * @return {object}\n\t\t */\n\t\tgetAdjacentOption: function($option, direction) {\n\t\t\tvar $options = this.$dropdown.find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t},\n\t\n\t\t/**\n\t\t * Finds the first element with a \"data-value\" attribute\n\t\t * that matches the given value.\n\t\t *\n\t\t * @param {mixed} value\n\t\t * @param {object} $els\n\t\t * @return {object}\n\t\t */\n\t\tgetElementWithValue: function(value, $els) {\n\t\t\tvalue = hash_key(value);\n\t\n\t\t\tif (typeof value !== 'undefined' && value !== null) {\n\t\t\t\tfor (var i = 0, n = $els.length; i < n; i++) {\n\t\t\t\t\tif ($els[i].getAttribute('data-value') === value) {\n\t\t\t\t\t\treturn $($els[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn $();\n\t\t},\n\t\n\t\t/**\n\t\t * Returns the jQuery element of the item\n\t\t * matching the given value.\n\t\t *\n\t\t * @param {string} value\n\t\t * @returns {object}\n\t\t */\n\t\tgetItem: function(value) {\n\t\t\treturn this.getElementWithValue(value, this.$control.children());\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" multiple items at once. Adds them to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItems: function(values, silent) {\n\t\t\tthis.buffer = document.createDocumentFragment();\n\t\n\t\t\tvar childNodes = this.$control[0].childNodes;\n\t\t\tfor (var i = 0; i < childNodes.length; i++) {\n\t\t\t\tthis.buffer.appendChild(childNodes[i]);\n\t\t\t}\n\t\n\t\t\tvar items = $.isArray(values) ? values : [values];\n\t\t\tfor (var i = 0, n = items.length; i < n; i++) {\n\t\t\t\tthis.isPending = (i < n - 1);\n\t\t\t\tthis.addItem(items[i], silent);\n\t\t\t}\n\t\n\t\t\tvar control = this.$control[0];\n\t\t\tcontrol.insertBefore(this.buffer, control.firstChild);\n\t\n\t\t\tthis.buffer = null;\n\t\t},\n\t\n\t\t/**\n\t\t * \"Selects\" an item. Adds it to the list\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} silent\n\t\t */\n\t\taddItem: function(value, silent) {\n\t\t\tvar events = silent ? [] : ['change'];\n\t\n\t\t\tdebounce_events(this, events, function() {\n\t\t\t\tvar $item, $option, $options;\n\t\t\t\tvar self = this;\n\t\t\t\tvar inputMode = self.settings.mode;\n\t\t\t\tvar i, active, value_next, wasFull;\n\t\t\t\tvalue = hash_key(value);\n\t\n\t\t\t\tif (self.items.indexOf(value) !== -1) {\n\t\t\t\t\tif (inputMode === 'single') self.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tif (!self.options.hasOwnProperty(value)) return;\n\t\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\t\n\t\t\t\t$item = $(self.render('item', self.options[value]));\n\t\t\t\twasFull = self.isFull();\n\t\t\t\tself.items.splice(self.caretPos, 0, value);\n\t\t\t\tself.insertAtCaret($item);\n\t\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\t\tself.refreshState();\n\t\t\t\t}\n\t\n\t\t\t\tif (self.isSetup) {\n\t\t\t\t\t$options = self.$dropdown_content.find('[data-selectable]');\n\t\n\t\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\t$option = self.getOption(value);\n\t\t\t\t\t\tvalue_next = self.getAdjacentOption($option, 1).attr('data-value');\n\t\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t\t\tif (value_next) {\n\t\t\t\t\t\t\tself.setActiveOption(self.getOption(value_next));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\t\tif (!$options.length || self.isFull()) {\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\t\tself.positionDropdown();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tself.updatePlaceholder();\n\t\t\t\t\tself.trigger('item_add', value, $item);\n\t\n\t\t\t\t\tif (!self.isPending) {\n\t\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the selected item matching\n\t\t * the provided value.\n\t\t *\n\t\t * @param {string} value\n\t\t */\n\t\tremoveItem: function(value, silent) {\n\t\t\tvar self = this;\n\t\t\tvar $item, i, idx;\n\t\n\t\t\t$item = (value instanceof $) ? value : self.getItem(value);\n\t\t\tvalue = hash_key($item.attr('data-value'));\n\t\t\ti = self.items.indexOf(value);\n\t\n\t\t\tif (i !== -1) {\n\t\t\t\t$item.remove();\n\t\t\t\tif ($item.hasClass('active')) {\n\t\t\t\t\tidx = self.$activeItems.indexOf($item[0]);\n\t\t\t\t\tself.$activeItems.splice(idx, 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.items.splice(i, 1);\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\t\t\tself.removeOption(value, silent);\n\t\t\t\t}\n\t\n\t\t\t\tif (i < self.caretPos) {\n\t\t\t\t\tself.setCaret(self.caretPos - 1);\n\t\t\t\t}\n\t\n\t\t\t\tself.refreshState();\n\t\t\t\tself.updatePlaceholder();\n\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\tself.positionDropdown();\n\t\t\t\tself.trigger('item_remove', value, $item);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Invokes the `create` method provided in the\n\t\t * selectize options that should provide the data\n\t\t * for the new item, given the user input.\n\t\t *\n\t\t * Once this completes, it will be added\n\t\t * to the item list.\n\t\t *\n\t\t * @param {string} value\n\t\t * @param {boolean} [triggerDropdown]\n\t\t * @param {function} [callback]\n\t\t * @return {boolean}\n\t\t */\n\t\tcreateItem: function(input, triggerDropdown) {\n\t\t\tvar self  = this;\n\t\t\tvar caret = self.caretPos;\n\t\t\tinput = input || $.trim(self.$control_input.val() || '');\n\t\n\t\t\tvar callback = arguments[arguments.length - 1];\n\t\t\tif (typeof callback !== 'function') callback = function() {};\n\t\n\t\t\tif (typeof triggerDropdown !== 'boolean') {\n\t\t\t\ttriggerDropdown = true;\n\t\t\t}\n\t\n\t\t\tif (!self.canCreate(input)) {\n\t\t\t\tcallback();\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\tself.lock();\n\t\n\t\t\tvar setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {\n\t\t\t\tvar data = {};\n\t\t\t\tdata[self.settings.labelField] = input;\n\t\t\t\tdata[self.settings.valueField] = input;\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\tvar create = once(function(data) {\n\t\t\t\tself.unlock();\n\t\n\t\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\t\tif (typeof value !== 'string') return callback();\n\t\n\t\t\t\tself.setTextboxValue('');\n\t\t\t\tself.addOption(data);\n\t\t\t\tself.setCaret(caret);\n\t\t\t\tself.addItem(value);\n\t\t\t\tself.refreshOptions(triggerDropdown && self.settings.mode !== 'single');\n\t\t\t\tcallback(data);\n\t\t\t});\n\t\n\t\t\tvar output = setup.apply(this, [input, create]);\n\t\t\tif (typeof output !== 'undefined') {\n\t\t\t\tcreate(output);\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Re-renders the selected item lists.\n\t\t */\n\t\trefreshItems: function() {\n\t\t\tthis.lastQuery = null;\n\t\n\t\t\tif (this.isSetup) {\n\t\t\t\tthis.addItem(this.items);\n\t\t\t}\n\t\n\t\t\tthis.refreshState();\n\t\t\tthis.updateOriginalInput();\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent attributes\n\t\t * and CSS classes.\n\t\t */\n\t\trefreshState: function() {\n\t\t\tthis.refreshValidityState();\n\t\t\tthis.refreshClasses();\n\t\t},\n\t\n\t\t/**\n\t\t * Update the `required` attribute of both input and control input.\n\t\t *\n\t\t * The `required` property needs to be activated on the control input\n\t\t * for the error to be displayed at the right place. `required` also\n\t\t * needs to be temporarily deactivated on the input since the input is\n\t\t * hidden and can't show errors.\n\t\t */\n\t\trefreshValidityState: function() {\n\t\t\tif (!this.isRequired) return false;\n\t\n\t\t\tvar invalid = !this.items.length;\n\t\n\t\t\tthis.isInvalid = invalid;\n\t\t\tthis.$control_input.prop('required', invalid);\n\t\t\tthis.$input.prop('required', !invalid);\n\t\t},\n\t\n\t\t/**\n\t\t * Updates all state-dependent CSS classes.\n\t\t */\n\t\trefreshClasses: function() {\n\t\t\tvar self     = this;\n\t\t\tvar isFull   = self.isFull();\n\t\t\tvar isLocked = self.isLocked;\n\t\n\t\t\tself.$wrapper\n\t\t\t\t.toggleClass('rtl', self.rtl);\n\t\n\t\t\tself.$control\n\t\t\t\t.toggleClass('focus', self.isFocused)\n\t\t\t\t.toggleClass('disabled', self.isDisabled)\n\t\t\t\t.toggleClass('required', self.isRequired)\n\t\t\t\t.toggleClass('invalid', self.isInvalid)\n\t\t\t\t.toggleClass('locked', isLocked)\n\t\t\t\t.toggleClass('full', isFull).toggleClass('not-full', !isFull)\n\t\t\t\t.toggleClass('input-active', self.isFocused && !self.isInputHidden)\n\t\t\t\t.toggleClass('dropdown-active', self.isOpen)\n\t\t\t\t.toggleClass('has-options', !$.isEmptyObject(self.options))\n\t\t\t\t.toggleClass('has-items', self.items.length > 0);\n\t\n\t\t\tself.$control_input.data('grow', !isFull && !isLocked);\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not more items can be added\n\t\t * to the control without exceeding the user-defined maximum.\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFull: function() {\n\t\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t\t},\n\t\n\t\t/**\n\t\t * Refreshes the original <select> or <input>\n\t\t * element to reflect the current state.\n\t\t */\n\t\tupdateOriginalInput: function(opts) {\n\t\t\tvar i, n, options, label, self = this;\n\t\t\topts = opts || {};\n\t\n\t\t\tif (self.tagType === TAG_SELECT) {\n\t\t\t\toptions = [];\n\t\t\t\tfor (i = 0, n = self.items.length; i < n; i++) {\n\t\t\t\t\tlabel = self.options[self.items[i]][self.settings.labelField] || '';\n\t\t\t\t\toptions.push('<option value=\"' + escape_html(self.items[i]) + '\" selected=\"selected\">' + escape_html(label) + '</option>');\n\t\t\t\t}\n\t\t\t\tif (!options.length && !this.$input.attr('multiple')) {\n\t\t\t\t\toptions.push('<option value=\"\" selected=\"selected\"></option>');\n\t\t\t\t}\n\t\t\t\tself.$input.html(options.join(''));\n\t\t\t} else {\n\t\t\t\tself.$input.val(self.getValue());\n\t\t\t\tself.$input.attr('value',self.$input.val());\n\t\t\t}\n\t\n\t\t\tif (self.isSetup) {\n\t\t\t\tif (!opts.silent) {\n\t\t\t\t\tself.trigger('change', self.$input.val());\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Shows/hide the input placeholder depending\n\t\t * on if there items in the list already.\n\t\t */\n\t\tupdatePlaceholder: function() {\n\t\t\tif (!this.settings.placeholder) return;\n\t\t\tvar $input = this.$control_input;\n\t\n\t\t\tif (this.items.length) {\n\t\t\t\t$input.removeAttr('placeholder');\n\t\t\t} else {\n\t\t\t\t$input.attr('placeholder', this.settings.placeholder);\n\t\t\t}\n\t\t\t$input.triggerHandler('update', {force: true});\n\t\t},\n\t\n\t\t/**\n\t\t * Shows the autocomplete dropdown containing\n\t\t * the available options.\n\t\t */\n\t\topen: function() {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\t\tself.focus();\n\t\t\tself.isOpen = true;\n\t\t\tself.refreshState();\n\t\t\tself.$dropdown.css({visibility: 'hidden', display: 'block'});\n\t\t\tself.positionDropdown();\n\t\t\tself.$dropdown.css({visibility: 'visible'});\n\t\t\tself.trigger('dropdown_open', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Closes the autocomplete dropdown menu.\n\t\t */\n\t\tclose: function() {\n\t\t\tvar self = this;\n\t\t\tvar trigger = self.isOpen;\n\t\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\n\t\t\t\t// Do not trigger blur while inside a blur event,\n\t\t\t\t// this fixes some weird tabbing behavior in FF and IE.\n\t\t\t\t// See #1164\n\t\t\t\tif (!self.isBlurring) {\n\t\t\t\t\tself.$control_input.blur(); // close keyboard on iOS\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.isOpen = false;\n\t\t\tself.$dropdown.hide();\n\t\t\tself.setActiveOption(null);\n\t\t\tself.refreshState();\n\t\n\t\t\tif (trigger) self.trigger('dropdown_close', self.$dropdown);\n\t\t},\n\t\n\t\t/**\n\t\t * Calculates and applies the appropriate\n\t\t * position of the dropdown.\n\t\t */\n\t\tpositionDropdown: function() {\n\t\t\tvar $control = this.$control;\n\t\t\tvar offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();\n\t\t\toffset.top += $control.outerHeight(true);\n\t\n\t\t\tthis.$dropdown.css({\n\t\t\t\twidth : $control[0].getBoundingClientRect().width,\n\t\t\t\ttop   : offset.top,\n\t\t\t\tleft  : offset.left\n\t\t\t});\n\t\t},\n\t\n\t\t/**\n\t\t * Resets / clears all selected items\n\t\t * from the control.\n\t\t *\n\t\t * @param {boolean} silent\n\t\t */\n\t\tclear: function(silent) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (!self.items.length) return;\n\t\t\tself.$control.children(':not(input)').remove();\n\t\t\tself.items = [];\n\t\t\tself.lastQuery = null;\n\t\t\tself.setCaret(0);\n\t\t\tself.setActiveItem(null);\n\t\t\tself.updatePlaceholder();\n\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\tself.refreshState();\n\t\t\tself.showInput();\n\t\t\tself.trigger('clear');\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for inserting an element\n\t\t * at the current caret position.\n\t\t *\n\t\t * @param {object} $el\n\t\t */\n\t\tinsertAtCaret: function($el) {\n\t\t\tvar caret = Math.min(this.caretPos, this.items.length);\n\t\t\tvar el = $el[0];\n\t\t\tvar target = this.buffer || this.$control[0];\n\t\n\t\t\tif (caret === 0) {\n\t\t\t\ttarget.insertBefore(el, target.firstChild);\n\t\t\t} else {\n\t\t\t\ttarget.insertBefore(el, target.childNodes[caret]);\n\t\t\t}\n\t\n\t\t\tthis.setCaret(caret + 1);\n\t\t},\n\t\n\t\t/**\n\t\t * Removes the current selected item(s).\n\t\t *\n\t\t * @param {object} e (optional)\n\t\t * @returns {boolean}\n\t\t */\n\t\tdeleteSelection: function(e) {\n\t\t\tvar i, n, direction, selection, values, caret, option_select, $option_select, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tdirection = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.$activeOption && !self.settings.hideSelected) {\n\t\t\t\toption_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');\n\t\t\t}\n\t\n\t\t\t// determine items that will be removed\n\t\t\tvalues = [];\n\t\n\t\t\tif (self.$activeItems.length) {\n\t\t\t\t$tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));\n\t\t\t\tcaret = self.$control.children(':not(input)').index($tail);\n\t\t\t\tif (direction > 0) { caret++; }\n\t\n\t\t\t\tfor (i = 0, n = self.$activeItems.length; i < n; i++) {\n\t\t\t\t\tvalues.push($(self.$activeItems[i]).attr('data-value'));\n\t\t\t\t}\n\t\t\t\tif (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos - 1]);\n\t\t\t\t} else if (direction > 0 && selection.start === self.$control_input.val().length) {\n\t\t\t\t\tvalues.push(self.items[self.caretPos]);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// allow the callback to abort\n\t\t\tif (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\n\t\t\t// perform removal\n\t\t\tif (typeof caret !== 'undefined') {\n\t\t\t\tself.setCaret(caret);\n\t\t\t}\n\t\t\twhile (values.length) {\n\t\t\t\tself.removeItem(values.pop());\n\t\t\t}\n\t\n\t\t\tself.showInput();\n\t\t\tself.positionDropdown();\n\t\t\tself.refreshOptions(true);\n\t\n\t\t\t// select previous option\n\t\t\tif (option_select) {\n\t\t\t\t$option_select = self.getOption(option_select);\n\t\t\t\tif ($option_select.length) {\n\t\t\t\t\tself.setActiveOption($option_select);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn true;\n\t\t},\n\t\n\t\t/**\n\t\t * Selects the previous / next item (depending\n\t\t * on the `direction` argument).\n\t\t *\n\t\t * > 0 - right\n\t\t * < 0 - left\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceSelection: function(direction, e) {\n\t\t\tvar tail, selection, idx, valueLength, cursorAtEdge, $tail;\n\t\t\tvar self = this;\n\t\n\t\t\tif (direction === 0) return;\n\t\t\tif (self.rtl) direction *= -1;\n\t\n\t\t\ttail = direction > 0 ? 'last' : 'first';\n\t\t\tselection = getSelection(self.$control_input[0]);\n\t\n\t\t\tif (self.isFocused && !self.isInputHidden) {\n\t\t\t\tvalueLength = self.$control_input.val().length;\n\t\t\t\tcursorAtEdge = direction < 0\n\t\t\t\t\t? selection.start === 0 && selection.length === 0\n\t\t\t\t\t: selection.start === valueLength;\n\t\n\t\t\t\tif (cursorAtEdge && !valueLength) {\n\t\t\t\t\tself.advanceCaret(direction, e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$tail = self.$control.children('.active:' + tail);\n\t\t\t\tif ($tail.length) {\n\t\t\t\t\tidx = self.$control.children(':not(input)').index($tail);\n\t\t\t\t\tself.setActiveItem(null);\n\t\t\t\t\tself.setCaret(direction > 0 ? idx + 1 : idx);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret left / right.\n\t\t *\n\t\t * @param {int} direction\n\t\t * @param {object} e (optional)\n\t\t */\n\t\tadvanceCaret: function(direction, e) {\n\t\t\tvar self = this, fn, $adj;\n\t\n\t\t\tif (direction === 0) return;\n\t\n\t\t\tfn = direction > 0 ? 'next' : 'prev';\n\t\t\tif (self.isShiftDown) {\n\t\t\t\t$adj = self.$control_input[fn]();\n\t\t\t\tif ($adj.length) {\n\t\t\t\t\tself.hideInput();\n\t\t\t\t\tself.setActiveItem($adj);\n\t\t\t\t\te && e.preventDefault();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.setCaret(self.caretPos + direction);\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Moves the caret to the specified index.\n\t\t *\n\t\t * @param {int} i\n\t\t */\n\t\tsetCaret: function(i) {\n\t\t\tvar self = this;\n\t\n\t\t\tif (self.settings.mode === 'single') {\n\t\t\t\ti = self.items.length;\n\t\t\t} else {\n\t\t\t\ti = Math.max(0, Math.min(self.items.length, i));\n\t\t\t}\n\t\n\t\t\tif(!self.isPending) {\n\t\t\t\t// the input must be moved by leaving it in place and moving the\n\t\t\t\t// siblings, due to the fact that focus cannot be restored once lost\n\t\t\t\t// on mobile webkit devices\n\t\t\t\tvar j, n, fn, $children, $child;\n\t\t\t\t$children = self.$control.children(':not(input)');\n\t\t\t\tfor (j = 0, n = $children.length; j < n; j++) {\n\t\t\t\t\t$child = $($children[j]).detach();\n\t\t\t\t\tif (j <  i) {\n\t\t\t\t\t\tself.$control_input.before($child);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.$control.append($child);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tself.caretPos = i;\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control. Used while\n\t\t * items are being asynchronously created.\n\t\t */\n\t\tlock: function() {\n\t\t\tthis.close();\n\t\t\tthis.isLocked = true;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Re-enables user input on the control.\n\t\t */\n\t\tunlock: function() {\n\t\t\tthis.isLocked = false;\n\t\t\tthis.refreshState();\n\t\t},\n\t\n\t\t/**\n\t\t * Disables user input on the control completely.\n\t\t * While disabled, it cannot receive focus.\n\t\t */\n\t\tdisable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', true);\n\t\t\tself.$control_input.prop('disabled', true).prop('tabindex', -1);\n\t\t\tself.isDisabled = true;\n\t\t\tself.lock();\n\t\t},\n\t\n\t\t/**\n\t\t * Enables the control so that it can respond\n\t\t * to focus and user input.\n\t\t */\n\t\tenable: function() {\n\t\t\tvar self = this;\n\t\t\tself.$input.prop('disabled', false);\n\t\t\tself.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);\n\t\t\tself.isDisabled = false;\n\t\t\tself.unlock();\n\t\t},\n\t\n\t\t/**\n\t\t * Completely destroys the control and\n\t\t * unbinds all event listeners so that it can\n\t\t * be garbage collected.\n\t\t */\n\t\tdestroy: function() {\n\t\t\tvar self = this;\n\t\t\tvar eventNS = self.eventNS;\n\t\t\tvar revertSettings = self.revertSettings;\n\t\n\t\t\tself.trigger('destroy');\n\t\t\tself.off();\n\t\t\tself.$wrapper.remove();\n\t\t\tself.$dropdown.remove();\n\t\n\t\t\tself.$input\n\t\t\t\t.html('')\n\t\t\t\t.append(revertSettings.$children)\n\t\t\t\t.removeAttr('tabindex')\n\t\t\t\t.removeClass('selectized')\n\t\t\t\t.attr({tabindex: revertSettings.tabindex})\n\t\t\t\t.show();\n\t\n\t\t\tself.$control_input.removeData('grow');\n\t\t\tself.$input.removeData('selectize');\n\t\n\t\t\tif (--Selectize.count == 0 && Selectize.$testInput) {\n\t\t\t\tSelectize.$testInput.remove();\n\t\t\t\tSelectize.$testInput = undefined;\n\t\t\t}\n\t\n\t\t\t$(window).off(eventNS);\n\t\t\t$(document).off(eventNS);\n\t\t\t$(document.body).off(eventNS);\n\t\n\t\t\tdelete self.$input[0].selectize;\n\t\t},\n\t\n\t\t/**\n\t\t * A helper method for rendering \"item\" and\n\t\t * \"option\" templates, given the data.\n\t\t *\n\t\t * @param {string} templateName\n\t\t * @param {object} data\n\t\t * @returns {string}\n\t\t */\n\t\trender: function(templateName, data) {\n\t\t\tvar value, id, label;\n\t\t\tvar html = '';\n\t\t\tvar cache = false;\n\t\t\tvar self = this;\n\t\t\tvar regex_tag = /^[\\t \\r\\n]*<([a-z][a-z0-9\\-_]*(?:\\:[a-z][a-z0-9\\-_]*)?)/i;\n\t\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\tvalue = hash_key(data[self.settings.valueField]);\n\t\t\t\tcache = !!value;\n\t\t\t}\n\t\n\t\t\t// pull markup from cache if it exists\n\t\t\tif (cache) {\n\t\t\t\tif (!isset(self.renderCache[templateName])) {\n\t\t\t\t\tself.renderCache[templateName] = {};\n\t\t\t\t}\n\t\t\t\tif (self.renderCache[templateName].hasOwnProperty(value)) {\n\t\t\t\t\treturn self.renderCache[templateName][value];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// render markup\n\t\t\thtml = $(self.settings.render[templateName].apply(this, [data, escape_html]));\n\t\n\t\t\t// add mandatory attributes\n\t\t\tif (templateName === 'option' || templateName === 'option_create') {\n\t\t\t\tif (!data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-selectable', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (templateName === 'optgroup') {\n\t\t\t\tid = data[self.settings.optgroupValueField] || '';\n\t\t\t\thtml.attr('data-group', id);\n\t\t\t\tif(data[self.settings.disabledField]) {\n\t\t\t\t\thtml.attr('data-disabled', '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\t\thtml.attr('data-value', value || '');\n\t\t\t}\n\t\n\t\t\t// update cache\n\t\t\tif (cache) {\n\t\t\t\tself.renderCache[templateName][value] = html[0];\n\t\t\t}\n\t\n\t\t\treturn html[0];\n\t\t},\n\t\n\t\t/**\n\t\t * Clears the render cache for a template. If\n\t\t * no template is given, clears all render\n\t\t * caches.\n\t\t *\n\t\t * @param {string} templateName\n\t\t */\n\t\tclearCache: function(templateName) {\n\t\t\tvar self = this;\n\t\t\tif (typeof templateName === 'undefined') {\n\t\t\t\tself.renderCache = {};\n\t\t\t} else {\n\t\t\t\tdelete self.renderCache[templateName];\n\t\t\t}\n\t\t},\n\t\n\t\t/**\n\t\t * Determines whether or not to display the\n\t\t * create item prompt, given a user input.\n\t\t *\n\t\t * @param {string} input\n\t\t * @return {boolean}\n\t\t */\n\t\tcanCreate: function(input) {\n\t\t\tvar self = this;\n\t\t\tif (!self.settings.create) return false;\n\t\t\tvar filter = self.settings.createFilter;\n\t\t\treturn input.length\n\t\t\t\t&& (typeof filter !== 'function' || filter.apply(self, [input]))\n\t\t\t\t&& (typeof filter !== 'string' || new RegExp(filter).test(input))\n\t\t\t\t&& (!(filter instanceof RegExp) || filter.test(input));\n\t\t}\n\t\n\t});\n\t\n\t\n\tSelectize.count = 0;\n\tSelectize.defaults = {\n\t\toptions: [],\n\t\toptgroups: [],\n\t\n\t\tplugins: [],\n\t\tdelimiter: ',',\n\t\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\t\tpersist: true,\n\t\tdiacritics: true,\n\t\tcreate: false,\n\t\tcreateOnBlur: false,\n\t\tcreateFilter: null,\n\t\thighlight: true,\n\t\topenOnFocus: true,\n\t\tmaxOptions: 1000,\n\t\tmaxItems: null,\n\t\thideSelected: null,\n\t\taddPrecedence: false,\n\t\tselectOnTab: false,\n\t\tpreload: false,\n\t\tallowEmptyOption: false,\n\t\tcloseAfterSelect: false,\n\t\n\t\tscrollDuration: 60,\n\t\tloadThrottle: 300,\n\t\tloadingClass: 'loading',\n\t\n\t\tdataAttr: 'data-data',\n\t\toptgroupField: 'optgroup',\n\t\tvalueField: 'value',\n\t\tlabelField: 'text',\n\t\tdisabledField: 'disabled',\n\t\toptgroupLabelField: 'label',\n\t\toptgroupValueField: 'value',\n\t\tlockOptgroupOrder: false,\n\t\n\t\tsortField: '$order',\n\t\tsearchField: ['text'],\n\t\tsearchConjunction: 'and',\n\t\n\t\tmode: null,\n\t\twrapperClass: 'selectize-control',\n\t\tinputClass: 'selectize-input',\n\t\tdropdownClass: 'selectize-dropdown',\n\t\tdropdownContentClass: 'selectize-dropdown-content',\n\t\n\t\tdropdownParent: null,\n\t\n\t\tcopyClassesToDropdown: true,\n\t\n\t\t/*\n\t\tload                 : null, // function(query, callback) { ... }\n\t\tscore                : null, // function(search) { ... }\n\t\tonInitialize         : null, // function() { ... }\n\t\tonChange             : null, // function(value) { ... }\n\t\tonItemAdd            : null, // function(value, $item) { ... }\n\t\tonItemRemove         : null, // function(value) { ... }\n\t\tonClear              : null, // function() { ... }\n\t\tonOptionAdd          : null, // function(value, data) { ... }\n\t\tonOptionRemove       : null, // function(value) { ... }\n\t\tonOptionClear        : null, // function() { ... }\n\t\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\t\tonOptionGroupRemove  : null, // function(id) { ... }\n\t\tonOptionGroupClear   : null, // function() { ... }\n\t\tonDropdownOpen       : null, // function($dropdown) { ... }\n\t\tonDropdownClose      : null, // function($dropdown) { ... }\n\t\tonType               : null, // function(str) { ... }\n\t\tonDelete             : null, // function(values) { ... }\n\t\t*/\n\t\n\t\trender: {\n\t\t\t/*\n\t\t\titem: null,\n\t\t\toptgroup: null,\n\t\t\toptgroup_header: null,\n\t\t\toption: null,\n\t\t\toption_create: null\n\t\t\t*/\n\t\t}\n\t};\n\t\n\t\n\t$.fn.selectize = function(settings_user) {\n\t\tvar defaults             = $.fn.selectize.defaults;\n\t\tvar settings             = $.extend({}, defaults, settings_user);\n\t\tvar attr_data            = settings.dataAttr;\n\t\tvar field_label          = settings.labelField;\n\t\tvar field_value          = settings.valueField;\n\t\tvar field_disabled       = settings.disabledField;\n\t\tvar field_optgroup       = settings.optgroupField;\n\t\tvar field_optgroup_label = settings.optgroupLabelField;\n\t\tvar field_optgroup_value = settings.optgroupValueField;\n\t\n\t\t/**\n\t\t * Initializes selectize from a <input type=\"text\"> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_textbox = function($input, settings_element) {\n\t\t\tvar i, n, values, option;\n\t\n\t\t\tvar data_raw = $input.attr(attr_data);\n\t\n\t\t\tif (!data_raw) {\n\t\t\t\tvar value = $.trim($input.val() || '');\n\t\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\t\tvalues = value.split(settings.delimiter);\n\t\t\t\tfor (i = 0, n = values.length; i < n; i++) {\n\t\t\t\t\toption = {};\n\t\t\t\t\toption[field_label] = values[i];\n\t\t\t\t\toption[field_value] = values[i];\n\t\t\t\t\tsettings_element.options.push(option);\n\t\t\t\t}\n\t\t\t\tsettings_element.items = values;\n\t\t\t} else {\n\t\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\t\tfor (i = 0, n = settings_element.options.length; i < n; i++) {\n\t\t\t\t\tsettings_element.items.push(settings_element.options[i][field_value]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\t/**\n\t\t * Initializes selectize from a <select> element.\n\t\t *\n\t\t * @param {object} $input\n\t\t * @param {object} settings_element\n\t\t */\n\t\tvar init_select = function($input, settings_element) {\n\t\t\tvar i, n, tagName, $children, order = 0;\n\t\t\tvar options = settings_element.options;\n\t\t\tvar optionsMap = {};\n\t\n\t\t\tvar readData = function($el) {\n\t\t\t\tvar data = attr_data && $el.attr(attr_data);\n\t\t\t\tif (typeof data === 'string' && data.length) {\n\t\t\t\t\treturn JSON.parse(data);\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\t\n\t\t\tvar addOption = function($option, group) {\n\t\t\t\t$option = $($option);\n\t\n\t\t\t\tvar value = hash_key($option.val());\n\t\t\t\tif (!value && !settings.allowEmptyOption) return;\n\t\n\t\t\t\t// if the option already exists, it's probably been\n\t\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t\t// existing option so that it's rendered in both places.\n\t\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t\t} else if (!$.isArray(arr)) {\n\t\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\tvar option             = readData($option) || {};\n\t\t\t\toption[field_label]    = option[field_label] || $option.text();\n\t\t\t\toption[field_value]    = option[field_value] || value;\n\t\t\t\toption[field_disabled] = option[field_disabled] || $option.prop('disabled');\n\t\t\t\toption[field_optgroup] = option[field_optgroup] || group;\n\t\n\t\t\t\toptionsMap[value] = option;\n\t\t\t\toptions.push(option);\n\t\n\t\t\t\tif ($option.is(':selected')) {\n\t\t\t\t\tsettings_element.items.push(value);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tvar addGroup = function($optgroup) {\n\t\t\t\tvar i, n, id, optgroup, $options;\n\t\n\t\t\t\t$optgroup = $($optgroup);\n\t\t\t\tid = $optgroup.attr('label');\n\t\n\t\t\t\tif (id) {\n\t\t\t\t\toptgroup = readData($optgroup) || {};\n\t\t\t\t\toptgroup[field_optgroup_label] = id;\n\t\t\t\t\toptgroup[field_optgroup_value] = id;\n\t\t\t\t\toptgroup[field_disabled] = $optgroup.prop('disabled');\n\t\t\t\t\tsettings_element.optgroups.push(optgroup);\n\t\t\t\t}\n\t\n\t\t\t\t$options = $('option', $optgroup);\n\t\t\t\tfor (i = 0, n = $options.length; i < n; i++) {\n\t\t\t\t\taddOption($options[i], id);\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\tsettings_element.maxItems = $input.attr('multiple') ? null : 1;\n\t\n\t\t\t$children = $input.children();\n\t\t\tfor (i = 0, n = $children.length; i < n; i++) {\n\t\t\t\ttagName = $children[i].tagName.toLowerCase();\n\t\t\t\tif (tagName === 'optgroup') {\n\t\t\t\t\taddGroup($children[i]);\n\t\t\t\t} else if (tagName === 'option') {\n\t\t\t\t\taddOption($children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\treturn this.each(function() {\n\t\t\tif (this.selectize) return;\n\t\n\t\t\tvar instance;\n\t\t\tvar $input = $(this);\n\t\t\tvar tag_name = this.tagName.toLowerCase();\n\t\t\tvar placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');\n\t\t\tif (!placeholder && !settings.allowEmptyOption) {\n\t\t\t\tplaceholder = $input.children('option[value=\"\"]').text();\n\t\t\t}\n\t\n\t\t\tvar settings_element = {\n\t\t\t\t'placeholder' : placeholder,\n\t\t\t\t'options'     : [],\n\t\t\t\t'optgroups'   : [],\n\t\t\t\t'items'       : []\n\t\t\t};\n\t\n\t\t\tif (tag_name === 'select') {\n\t\t\t\tinit_select($input, settings_element);\n\t\t\t} else {\n\t\t\t\tinit_textbox($input, settings_element);\n\t\t\t}\n\t\n\t\t\tinstance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));\n\t\t});\n\t};\n\t\n\t$.fn.selectize.defaults = Selectize.defaults;\n\t$.fn.selectize.support = {\n\t\tvalidity: SUPPORTS_VALIDITY_API\n\t};\n\t\n\t\n\tSelectize.define('drag_drop', function(options) {\n\t\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\t\tif (this.settings.mode !== 'multi') return;\n\t\tvar self = this;\n\t\n\t\tself.lock = (function() {\n\t\t\tvar original = self.lock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.disable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.unlock = (function() {\n\t\t\tvar original = self.unlock;\n\t\t\treturn function() {\n\t\t\t\tvar sortable = self.$control.data('sortable');\n\t\t\t\tif (sortable) sortable.enable();\n\t\t\t\treturn original.apply(self, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(this, arguments);\n\t\n\t\t\t\tvar $control = self.$control.sortable({\n\t\t\t\t\titems: '[data-value]',\n\t\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\t\tdisabled: self.isLocked,\n\t\t\t\t\tstart: function(e, ui) {\n\t\t\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t\t\t},\n\t\t\t\t\tstop: function() {\n\t\t\t\t\t\t$control.css({overflow: 'hidden'});\n\t\t\t\t\t\tvar active = self.$activeItems ? self.$activeItems.slice() : null;\n\t\t\t\t\t\tvar values = [];\n\t\t\t\t\t\t$control.children('[data-value]').each(function() {\n\t\t\t\t\t\t\tvalues.push($(this).attr('data-value'));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tself.setValue(values);\n\t\t\t\t\t\tself.setActiveItem(active);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('dropdown_header', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\ttitle         : 'Untitled',\n\t\t\theaderClass   : 'selectize-dropdown-header',\n\t\t\ttitleRowClass : 'selectize-dropdown-header-title',\n\t\t\tlabelClass    : 'selectize-dropdown-header-label',\n\t\t\tcloseClass    : 'selectize-dropdown-header-close',\n\t\n\t\t\thtml: function(data) {\n\t\t\t\treturn (\n\t\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t\t'<a href=\"javascript:void(0)\" class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}, options);\n\t\n\t\tself.setup = (function() {\n\t\t\tvar original = self.setup;\n\t\t\treturn function() {\n\t\t\t\toriginal.apply(self, arguments);\n\t\t\t\tself.$dropdown_header = $(options.html(options));\n\t\t\t\tself.$dropdown.prepend(self.$dropdown_header);\n\t\t\t};\n\t\t})();\n\t\n\t});\n\t\n\tSelectize.define('optgroup_columns', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions = $.extend({\n\t\t\tequalizeWidth  : true,\n\t\t\tequalizeHeight : true\n\t\t}, options);\n\t\n\t\tthis.getAdjacentOption = function($option, direction) {\n\t\t\tvar $options = $option.closest('[data-group]').find('[data-selectable]');\n\t\t\tvar index    = $options.index($option) + direction;\n\t\n\t\t\treturn index >= 0 && index < $options.length ? $options.eq(index) : $();\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, $option, $options, $optgroup;\n\t\n\t\t\t\tif (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {\n\t\t\t\t\tself.ignoreHover = true;\n\t\t\t\t\t$optgroup = this.$activeOption.closest('[data-group]');\n\t\t\t\t\tindex = $optgroup.find('[data-selectable]').index(this.$activeOption);\n\t\n\t\t\t\t\tif(e.keyCode === KEY_LEFT) {\n\t\t\t\t\t\t$optgroup = $optgroup.prev('[data-group]');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$optgroup = $optgroup.next('[data-group]');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t$options = $optgroup.find('[data-selectable]');\n\t\t\t\t\t$option  = $options.eq(Math.min($options.length - 1, index));\n\t\t\t\t\tif ($option.length) {\n\t\t\t\t\t\tthis.setActiveOption($option);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t\n\t\tvar getScrollbarWidth = function() {\n\t\t\tvar div;\n\t\t\tvar width = getScrollbarWidth.width;\n\t\t\tvar doc = document;\n\t\n\t\t\tif (typeof width === 'undefined') {\n\t\t\t\tdiv = doc.createElement('div');\n\t\t\t\tdiv.innerHTML = '<div style=\"width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;\"><div style=\"width:1px;height:100px;\"></div></div>';\n\t\t\t\tdiv = div.firstChild;\n\t\t\t\tdoc.body.appendChild(div);\n\t\t\t\twidth = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;\n\t\t\t\tdoc.body.removeChild(div);\n\t\t\t}\n\t\t\treturn width;\n\t\t};\n\t\n\t\tvar equalizeSizes = function() {\n\t\t\tvar i, n, height_max, width, width_last, width_parent, $optgroups;\n\t\n\t\t\t$optgroups = $('[data-group]', self.$dropdown_content);\n\t\t\tn = $optgroups.length;\n\t\t\tif (!n || !self.$dropdown_content.width()) return;\n\t\n\t\t\tif (options.equalizeHeight) {\n\t\t\t\theight_max = 0;\n\t\t\t\tfor (i = 0; i < n; i++) {\n\t\t\t\t\theight_max = Math.max(height_max, $optgroups.eq(i).height());\n\t\t\t\t}\n\t\t\t\t$optgroups.css({height: height_max});\n\t\t\t}\n\t\n\t\t\tif (options.equalizeWidth) {\n\t\t\t\twidth_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();\n\t\t\t\twidth = Math.round(width_parent / n);\n\t\t\t\t$optgroups.css({width: width});\n\t\t\t\tif (n > 1) {\n\t\t\t\t\twidth_last = width_parent - width * (n - 1);\n\t\t\t\t\t$optgroups.eq(n - 1).css({width: width_last});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\n\t\tif (options.equalizeHeight || options.equalizeWidth) {\n\t\t\thook.after(this, 'positionDropdown', equalizeSizes);\n\t\t\thook.after(this, 'refreshOptions', equalizeSizes);\n\t\t}\n\t\n\t\n\t});\n\t\n\tSelectize.define('remove_button', function(options) {\n\t\toptions = $.extend({\n\t\t\t\tlabel     : '&times;',\n\t\t\t\ttitle     : 'Remove',\n\t\t\t\tclassName : 'remove',\n\t\t\t\tappend    : true\n\t\t\t}, options);\n\t\n\t\t\tvar singleClose = function(thisRef, options) {\n\t\n\t\t\t\toptions.className = 'remove-single';\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\treturn $('<span>').append(html_container)\n\t\t\t\t\t\t.append(html_element);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar id = $(self.$input.context).attr('id');\n\t\t\t\t\t\t\tvar selectizer = $('#'+id);\n\t\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tself.clear();\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tvar multiClose = function(thisRef, options) {\n\t\n\t\t\t\tvar self = thisRef;\n\t\t\t\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\t\n\t\t\t\t/**\n\t\t\t\t * Appends an element as a child (with raw HTML).\n\t\t\t\t *\n\t\t\t\t * @param {string} html_container\n\t\t\t\t * @param {string} html_element\n\t\t\t\t * @return {string}\n\t\t\t\t */\n\t\t\t\tvar append = function(html_container, html_element) {\n\t\t\t\t\tvar pos = html_container.search(/(<\\/[^>]+>\\s*)$/);\n\t\t\t\t\treturn html_container.substring(0, pos) + html_element + html_container.substring(pos);\n\t\t\t\t};\n\t\n\t\t\t\tthisRef.setup = (function() {\n\t\t\t\t\tvar original = self.setup;\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\t// override the item rendering method to add the button to each\n\t\t\t\t\t\tif (options.append) {\n\t\t\t\t\t\t\tvar render_item = self.settings.render.item;\n\t\t\t\t\t\t\tself.settings.render.item = function(data) {\n\t\t\t\t\t\t\t\treturn append(render_item.apply(thisRef, arguments), html);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\toriginal.apply(thisRef, arguments);\n\t\n\t\t\t\t\t\t// add event listener\n\t\t\t\t\t\tthisRef.$control.on('click', '.' + options.className, function(e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (self.isLocked) return;\n\t\n\t\t\t\t\t\t\tvar $item = $(e.currentTarget).parent();\n\t\t\t\t\t\t\tself.setActiveItem($item);\n\t\t\t\t\t\t\tif (self.deleteSelection()) {\n\t\t\t\t\t\t\t\tself.setCaret(self.items.length);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\n\t\t\t\t\t};\n\t\t\t\t})();\n\t\t\t};\n\t\n\t\t\tif (this.settings.mode === 'single') {\n\t\t\t\tsingleClose(this, options);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tmultiClose(this, options);\n\t\t\t}\n\t});\n\t\n\t\n\tSelectize.define('restore_on_backspace', function(options) {\n\t\tvar self = this;\n\t\n\t\toptions.text = options.text || function(option) {\n\t\t\treturn option[this.settings.labelField];\n\t\t};\n\t\n\t\tthis.onKeyDown = (function() {\n\t\t\tvar original = self.onKeyDown;\n\t\t\treturn function(e) {\n\t\t\t\tvar index, option;\n\t\t\t\tif (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {\n\t\t\t\t\tindex = this.caretPos - 1;\n\t\t\t\t\tif (index >= 0 && index < this.items.length) {\n\t\t\t\t\t\toption = this.options[this.items[index]];\n\t\t\t\t\t\tif (this.deleteSelection(e)) {\n\t\t\t\t\t\t\tthis.setTextboxValue(options.text.apply(this, [option]));\n\t\t\t\t\t\t\tthis.refreshOptions(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn original.apply(this, arguments);\n\t\t\t};\n\t\t})();\n\t});\n\t\n\n\treturn Selectize;\n}));","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"scrollLock\"] = factory();\n\telse\n\t\troot[\"scrollLock\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })\n/******/ ])[\"default\"];\n});","/*!\n  * PhotoSwipe 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipe=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i){return t.x=i.x,t.y=i.y,void 0!==i.id&&(t.id=i.id),t}function s(t){t.x=Math.round(t.x),t.y=Math.round(t.y)}function h(t,i){const s=Math.abs(t.x-i.x),h=Math.abs(t.y-i.y);return Math.sqrt(s*s+h*h)}function e(t,i){return t.x===i.x&&t.y===i.y}function n(t,i,s){return Math.min(Math.max(t,i),s)}function o(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}function r(t,i,s,h){t.style.transform=o(i,s,h)}function a(t,i,s,h){t.style.transition=i?`${i} ${s}ms ${h||\"cubic-bezier(.4,0,.22,1)\"}`:\"none\"}function l(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const c=\"idle\",d=\"loading\",u=\"loaded\",p=\"error\";function m(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}let v=!1;try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:()=>{v=!0}}))}catch(t){}class f{constructor(){this.t=[]}add(t,i,s,h){this.i(t,i,s,h)}remove(t,i,s,h){this.i(t,i,s,h,!0)}removeAll(){this.t.forEach((t=>{this.i(t.target,t.type,t.listener,t.passive,!0,!0)})),this.t=[]}i(t,i,s,h,e,n){if(!t)return;const o=e?\"removeEventListener\":\"addEventListener\";i.split(\" \").forEach((i=>{if(i){n||(e?this.t=this.t.filter((h=>h.type!==i||h.listener!==s||h.target!==t)):this.t.push({target:t,type:i,listener:s,passive:h}));const r=!!v&&{passive:h||!1};t[o](i,s,r)}}))}}function w(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}function g(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}function y(t,i,s,h){return{x:i.x-g(\"left\",t,i,s,h)-g(\"right\",t,i,s,h),y:i.y-g(\"top\",t,i,s,h)-g(\"bottom\",t,i,s,h)}}class _{constructor(t){this.slide=t,this.currZoomLevel=1,this.center={x:0,y:0},this.max={x:0,y:0},this.min={x:0,y:0}}update(t){this.currZoomLevel=t,this.slide.width?(this.o(\"x\"),this.o(\"y\"),this.slide.pswp.dispatch(\"calcBounds\",{slide:this.slide})):this.reset()}o(t){const{pswp:i}=this.slide,s=this.slide[\"x\"===t?\"width\":\"height\"]*this.currZoomLevel,h=g(\"x\"===t?\"left\":\"top\",i.options,i.viewportSize,this.slide.data,this.slide.index),e=this.slide.panAreaSize[t];this.center[t]=Math.round((e-s)/2)+h,this.max[t]=s>e?Math.round(e-s)+h:this.center[t],this.min[t]=s>e?h:this.center[t]}reset(){this.center.x=0,this.center.y=0,this.max.x=0,this.max.y=0,this.min.x=0,this.min.y=0}correctPan(t,i){return n(i,this.max[t],this.min[t])}}class x{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.l(),this.secondary=this.u(),this.max=Math.max(this.initial,this.secondary,this.p()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}m(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}u(){let t=this.m(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}l(){return this.m(\"initial\")||this.fit}p(){return this.m(\"max\")||Math.max(1,4*this.fit)}}class b{constructor(i,s,h){this.data=i,this.index=s,this.pswp=h,this.isActive=s===h.currIndex,this.currentResolution=0,this.panAreaSize={x:0,y:0},this.pan={x:0,y:0},this.isFirstSlide=this.isActive&&!h.opener.isOpen,this.zoomLevels=new x(h.options,i,s,h),this.pswp.dispatch(\"gettingData\",{slide:this,data:this.data,index:s}),this.content=this.pswp.contentLoader.getContentBySlide(this),this.container=t(\"pswp__zoom-wrap\",\"div\"),this.holderElement=null,this.currZoomLevel=1,this.width=this.content.width,this.height=this.content.height,this.heavyAppended=!1,this.bounds=new _(this),this.prevDisplayedWidth=-1,this.prevDisplayedHeight=-1,this.pswp.dispatch(\"slideInit\",{slide:this})}setIsActive(t){t&&!this.isActive?this.activate():!t&&this.isActive&&this.deactivate()}append(t){this.holderElement=t,this.container.style.transformOrigin=\"0 0\",this.data&&(this.calculateSize(),this.load(),this.updateContentSize(),this.appendHeavy(),this.holderElement.appendChild(this.container),this.zoomAndPanToInitial(),this.pswp.dispatch(\"firstZoomPan\",{slide:this}),this.applyCurrentZoomPan(),this.pswp.dispatch(\"afterSetContent\",{slide:this}),this.isActive&&this.activate())}load(){this.content.load(!1),this.pswp.dispatch(\"slideLoad\",{slide:this})}appendHeavy(){const{pswp:t}=this;!this.heavyAppended&&t.opener.isOpen&&!t.mainScroll.isShifted()&&(this.isActive,1)&&(this.pswp.dispatch(\"appendHeavy\",{slide:this}).defaultPrevented||(this.heavyAppended=!0,this.content.append(),this.pswp.dispatch(\"appendHeavyContent\",{slide:this})))}activate(){this.isActive=!0,this.appendHeavy(),this.content.activate(),this.pswp.dispatch(\"slideActivate\",{slide:this})}deactivate(){this.isActive=!1,this.content.deactivate(),this.currZoomLevel!==this.zoomLevels.initial&&this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize(),this.pswp.dispatch(\"slideDeactivate\",{slide:this})}destroy(){this.content.hasSlide=!1,this.content.remove(),this.container.remove(),this.pswp.dispatch(\"slideDestroy\",{slide:this})}resize(){this.currZoomLevel!==this.zoomLevels.initial&&this.isActive?(this.calculateSize(),this.bounds.update(this.currZoomLevel),this.panTo(this.pan.x,this.pan.y)):(this.calculateSize(),this.currentResolution=0,this.zoomAndPanToInitial(),this.applyCurrentZoomPan(),this.updateContentSize())}updateContentSize(t){const i=this.currentResolution||this.zoomLevels.initial;if(!i)return;const s=Math.round(this.width*i)||this.pswp.viewportSize.x,h=Math.round(this.height*i)||this.pswp.viewportSize.y;(this.sizeChanged(s,h)||t)&&this.content.setDisplayedSize(s,h)}sizeChanged(t,i){return(t!==this.prevDisplayedWidth||i!==this.prevDisplayedHeight)&&(this.prevDisplayedWidth=t,this.prevDisplayedHeight=i,!0)}getPlaceholderElement(){var t;return null===(t=this.content.placeholder)||void 0===t?void 0:t.element}zoomTo(t,i,h,e){const{pswp:o}=this;if(!this.isZoomable()||o.mainScroll.isShifted())return;o.dispatch(\"beforeZoomTo\",{destZoomLevel:t,centerPoint:i,transitionDuration:h}),o.animations.stopAllPan();const r=this.currZoomLevel;e||(t=n(t,this.zoomLevels.min,this.zoomLevels.max)),this.setZoomLevel(t),this.pan.x=this.calculateZoomToPanOffset(\"x\",i,r),this.pan.y=this.calculateZoomToPanOffset(\"y\",i,r),s(this.pan);const a=()=>{this.v(t),this.applyCurrentZoomPan()};h?o.animations.startTransition({isPan:!0,name:\"zoomTo\",target:this.container,transform:this.getCurrentTransform(),onComplete:a,duration:h,easing:o.options.easing}):a()}toggleZoom(t){this.zoomTo(this.currZoomLevel===this.zoomLevels.initial?this.zoomLevels.secondary:this.zoomLevels.initial,t,this.pswp.options.zoomAnimationDuration)}setZoomLevel(t){this.currZoomLevel=t,this.bounds.update(this.currZoomLevel)}calculateZoomToPanOffset(t,i,s){if(0===this.bounds.max[t]-this.bounds.min[t])return this.bounds.center[t];i||(i=this.pswp.getViewportCenterPoint()),s||(s=this.zoomLevels.initial);const h=this.currZoomLevel/s;return this.bounds.correctPan(t,(this.pan[t]-i[t])*h+i[t])}panTo(t,i){this.pan.x=this.bounds.correctPan(\"x\",t),this.pan.y=this.bounds.correctPan(\"y\",i),this.applyCurrentZoomPan()}isPannable(){return Boolean(this.width)&&this.currZoomLevel>this.zoomLevels.fit}isZoomable(){return Boolean(this.width)&&this.content.isZoomable()}applyCurrentZoomPan(){this.g(this.pan.x,this.pan.y,this.currZoomLevel),this===this.pswp.currSlide&&this.pswp.dispatch(\"zoomPanUpdate\",{slide:this})}zoomAndPanToInitial(){this.currZoomLevel=this.zoomLevels.initial,this.bounds.update(this.currZoomLevel),i(this.pan,this.bounds.center),this.pswp.dispatch(\"initialZoomPan\",{slide:this})}g(t,i,s){s/=this.currentResolution||this.zoomLevels.initial,r(this.container,t,i,s)}calculateSize(){const{pswp:t}=this;i(this.panAreaSize,y(t.options,t.viewportSize,this.data,this.index)),this.zoomLevels.update(this.width,this.height,this.panAreaSize),t.dispatch(\"calcSlideSize\",{slide:this})}getCurrentTransform(){const t=this.currZoomLevel/(this.currentResolution||this.zoomLevels.initial);return o(this.pan.x,this.pan.y,t)}v(t){t!==this.currentResolution&&(this.currentResolution=t,this.updateContentSize(),this.pswp.dispatch(\"resolutionChanged\"))}}class S{constructor(t){this.gestures=t,this.pswp=t.pswp,this.startPan={x:0,y:0}}start(){this.pswp.currSlide&&i(this.startPan,this.pswp.currSlide.pan),this.pswp.animations.stopAll()}change(){const{p1:t,prevP1:i,dragAxis:h}=this.gestures,{currSlide:e}=this.pswp;if(\"y\"===h&&this.pswp.options.closeOnVerticalDrag&&e&&e.currZoomLevel<=e.zoomLevels.fit&&!this.gestures.isMultitouch){const s=e.pan.y+(t.y-i.y);if(!this.pswp.dispatch(\"verticalDrag\",{panY:s}).defaultPrevented){this._(\"y\",s,.6);const t=1-Math.abs(this.S(e.pan.y));this.pswp.applyBgOpacity(t),e.applyCurrentZoomPan()}}else{this.M(\"x\")||(this.M(\"y\"),e&&(s(e.pan),e.applyCurrentZoomPan()))}}end(){const{velocity:t}=this.gestures,{mainScroll:i,currSlide:s}=this.pswp;let h=0;if(this.pswp.animations.stopAll(),i.isShifted()){const s=(i.x-i.getCurrSlideX())/this.pswp.viewportSize.x;t.x<-.5&&s<0||t.x<.1&&s<-.5?(h=1,t.x=Math.min(t.x,0)):(t.x>.5&&s>0||t.x>-.1&&s>.5)&&(h=-1,t.x=Math.max(t.x,0)),i.moveIndexBy(h,!0,t.x)}s&&s.currZoomLevel>s.zoomLevels.max||this.gestures.isMultitouch?this.gestures.zoomLevels.correctZoomPan(!0):(this.P(\"x\"),this.P(\"y\"))}P(t){const{velocity:i}=this.gestures,{currSlide:s}=this.pswp;if(!s)return;const{pan:h,bounds:e}=s,o=h[t],r=this.pswp.bgOpacity<1&&\"y\"===t,a=o+function(t,i){return t*i/(1-i)}(i[t],.995);if(r){const t=this.S(o),i=this.S(a);if(t<0&&i<-.4||t>0&&i>.4)return void this.pswp.close()}const l=e.correctPan(t,a);if(o===l)return;const c=l===a?1:.82,d=this.pswp.bgOpacity,u=l-o;this.pswp.animations.startSpring({name:\"panGesture\"+t,isPan:!0,start:o,end:l,velocity:i[t],dampingRatio:c,onUpdate:i=>{if(r&&this.pswp.bgOpacity<1){const t=1-(l-i)/u;this.pswp.applyBgOpacity(n(d+(1-d)*t,0,1))}h[t]=Math.floor(i),s.applyCurrentZoomPan()}})}M(t){const{p1:i,dragAxis:s,prevP1:h,isMultitouch:e}=this.gestures,{currSlide:n,mainScroll:o}=this.pswp,r=i[t]-h[t],a=o.x+r;if(!r||!n)return!1;if(\"x\"===t&&!n.isPannable()&&!e)return o.moveTo(a,!0),!0;const{bounds:l}=n,c=n.pan[t]+r;if(this.pswp.options.allowPanToNext&&\"x\"===s&&\"x\"===t&&!e){const i=o.getCurrSlideX(),s=o.x-i,h=r>0,e=!h;if(c>l.min[t]&&h){if(l.min[t]<=this.startPan[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(c<l.max[t]&&e){if(this.startPan[t]<=l.max[t])return o.moveTo(a,!0),!0;this._(t,c)}else if(0!==s){if(s>0)return o.moveTo(Math.max(a,i),!0),!0;if(s<0)return o.moveTo(Math.min(a,i),!0),!0}else this._(t,c)}else\"y\"===t&&(o.isShifted()||l.min.y===l.max.y)||this._(t,c);return!1}S(t){var i,s;return(t-(null!==(i=null===(s=this.pswp.currSlide)||void 0===s?void 0:s.bounds.center.y)&&void 0!==i?i:0))/(this.pswp.viewportSize.y/3)}_(t,i,s){const{currSlide:h}=this.pswp;if(!h)return;const{pan:e,bounds:n}=h;if(n.correctPan(t,i)!==i||s){const h=Math.round(i-e[t]);e[t]+=h*(s||.35)}else e[t]=i}}function z(t,i,s){return t.x=(i.x+s.x)/2,t.y=(i.y+s.y)/2,t}class M{constructor(t){this.gestures=t,this.C={x:0,y:0},this.T={x:0,y:0},this.A={x:0,y:0},this.D=!1,this.I=1}start(){const{currSlide:t}=this.gestures.pswp;t&&(this.I=t.currZoomLevel,i(this.C,t.pan)),this.gestures.pswp.animations.stopAllPan(),this.D=!1}change(){const{p1:t,startP1:i,p2:s,startP2:e,pswp:n}=this.gestures,{currSlide:o}=n;if(!o)return;const r=o.zoomLevels.min,a=o.zoomLevels.max;if(!o.isZoomable()||n.mainScroll.isShifted())return;z(this.T,i,e),z(this.A,t,s);let l=1/h(i,e)*h(t,s)*this.I;if(l>o.zoomLevels.initial+o.zoomLevels.initial/15&&(this.D=!0),l<r)if(n.options.pinchToClose&&!this.D&&this.I<=o.zoomLevels.initial){const t=1-(r-l)/(r/1.2);n.dispatch(\"pinchClose\",{bgOpacity:t}).defaultPrevented||n.applyBgOpacity(t)}else l=r-.15*(r-l);else l>a&&(l=a+.05*(l-a));o.pan.x=this.L(\"x\",l),o.pan.y=this.L(\"y\",l),o.setZoomLevel(l),o.applyCurrentZoomPan()}end(){const{pswp:t}=this.gestures,{currSlide:i}=t;(!i||i.currZoomLevel<i.zoomLevels.initial)&&!this.D&&t.options.pinchToClose?t.close():this.correctZoomPan()}L(t,i){const s=i/this.I;return this.A[t]-(this.T[t]-this.C[t])*s}correctZoomPan(t){const{pswp:s}=this.gestures,{currSlide:h}=s;if(null==h||!h.isZoomable())return;0===this.A.x&&(t=!0);const o=h.currZoomLevel;let r,a=!0;o<h.zoomLevels.initial?r=h.zoomLevels.initial:o>h.zoomLevels.max?r=h.zoomLevels.max:(a=!1,r=o);const l=s.bgOpacity,c=s.bgOpacity<1,d=i({x:0,y:0},h.pan);let u=i({x:0,y:0},d);t&&(this.A.x=0,this.A.y=0,this.T.x=0,this.T.y=0,this.I=o,i(this.C,d)),a&&(u={x:this.L(\"x\",r),y:this.L(\"y\",r)}),h.setZoomLevel(r),u={x:h.bounds.correctPan(\"x\",u.x),y:h.bounds.correctPan(\"y\",u.y)},h.setZoomLevel(o);const p=!e(u,d);if(!p&&!a&&!c)return h.v(r),void h.applyCurrentZoomPan();s.animations.stopAllPan(),s.animations.startSpring({isPan:!0,start:0,end:1e3,velocity:0,dampingRatio:1,naturalFrequency:40,onUpdate:t=>{if(t/=1e3,p||a){if(p&&(h.pan.x=d.x+(u.x-d.x)*t,h.pan.y=d.y+(u.y-d.y)*t),a){const i=o+(r-o)*t;h.setZoomLevel(i)}h.applyCurrentZoomPan()}c&&s.bgOpacity<1&&s.applyBgOpacity(n(l+(1-l)*t,0,1))},onComplete:()=>{h.v(r),h.applyCurrentZoomPan()}})}}function P(t){return!!t.target.closest(\".pswp__container\")}class C{constructor(t){this.gestures=t}click(t,i){const s=i.target.classList,h=s.contains(\"pswp__img\"),e=s.contains(\"pswp__item\")||s.contains(\"pswp__zoom-wrap\");h?this.k(\"imageClick\",t,i):e&&this.k(\"bgClick\",t,i)}tap(t,i){P(i)&&this.k(\"tap\",t,i)}doubleTap(t,i){P(i)&&this.k(\"doubleTap\",t,i)}k(t,i,s){var h;const{pswp:e}=this.gestures,{currSlide:n}=e,o=t+\"Action\",r=e.options[o];if(!e.dispatch(o,{point:i,originalEvent:s}).defaultPrevented)if(\"function\"!=typeof r)switch(r){case\"close\":case\"next\":e[r]();break;case\"zoom\":null==n||n.toggleZoom(i);break;case\"zoom-or-close\":null!=n&&n.isZoomable()&&n.zoomLevels.secondary!==n.zoomLevels.initial?n.toggleZoom(i):e.options.clickToCloseNonZoomable&&e.close();break;case\"toggle-controls\":null===(h=this.gestures.pswp.element)||void 0===h||h.classList.toggle(\"pswp--ui-visible\")}else r.call(e,i,s)}}class T{constructor(t){this.pswp=t,this.dragAxis=null,this.p1={x:0,y:0},this.p2={x:0,y:0},this.prevP1={x:0,y:0},this.prevP2={x:0,y:0},this.startP1={x:0,y:0},this.startP2={x:0,y:0},this.velocity={x:0,y:0},this.Z={x:0,y:0},this.B={x:0,y:0},this.F=0,this.O=[],this.R=\"ontouchstart\"in window,this.N=!!window.PointerEvent,this.supportsTouch=this.R||this.N&&navigator.maxTouchPoints>1,this.F=0,this.U=0,this.V=!1,this.isMultitouch=!1,this.isDragging=!1,this.isZooming=!1,this.raf=null,this.G=null,this.supportsTouch||(t.options.allowPanToNext=!1),this.drag=new S(this),this.zoomLevels=new M(this),this.tapHandler=new C(this),t.on(\"bindEvents\",(()=>{t.events.add(t.scrollWrap,\"click\",this.$.bind(this)),this.N?this.q(\"pointer\",\"down\",\"up\",\"cancel\"):this.R?(this.q(\"touch\",\"start\",\"end\",\"cancel\"),t.scrollWrap&&(t.scrollWrap.ontouchmove=()=>{},t.scrollWrap.ontouchend=()=>{})):this.q(\"mouse\",\"down\",\"up\")}))}q(t,i,s,h){const{pswp:e}=this,{events:n}=e,o=h?t+h:\"\";n.add(e.scrollWrap,t+i,this.onPointerDown.bind(this)),n.add(window,t+\"move\",this.onPointerMove.bind(this)),n.add(window,t+s,this.onPointerUp.bind(this)),o&&n.add(e.scrollWrap,o,this.onPointerUp.bind(this))}onPointerDown(t){const s=\"mousedown\"===t.type||\"mouse\"===t.pointerType;if(s&&t.button>0)return;const{pswp:h}=this;h.opener.isOpen?h.dispatch(\"pointerDown\",{originalEvent:t}).defaultPrevented||(s&&(h.mouseDetected(),this.H(t,\"down\")),h.animations.stopAll(),this.K(t,\"down\"),1===this.F&&(this.dragAxis=null,i(this.startP1,this.p1)),this.F>1?(this.W(),this.isMultitouch=!0):this.isMultitouch=!1):t.preventDefault()}onPointerMove(t){this.H(t,\"move\"),this.F&&(this.K(t,\"move\"),this.pswp.dispatch(\"pointerMove\",{originalEvent:t}).defaultPrevented||(1!==this.F||this.isDragging?this.F>1&&!this.isZooming&&(this.j(),this.isZooming=!0,this.X(),this.zoomLevels.start(),this.Y(),this.J()):(this.dragAxis||this.tt(),this.dragAxis&&!this.isDragging&&(this.isZooming&&(this.isZooming=!1,this.zoomLevels.end()),this.isDragging=!0,this.W(),this.X(),this.U=Date.now(),this.V=!1,i(this.B,this.p1),this.velocity.x=0,this.velocity.y=0,this.drag.start(),this.Y(),this.J()))))}j(){this.isDragging&&(this.isDragging=!1,this.V||this.it(!0),this.drag.end(),this.dragAxis=null)}onPointerUp(t){this.F&&(this.K(t,\"up\"),this.pswp.dispatch(\"pointerUp\",{originalEvent:t}).defaultPrevented||(0===this.F&&(this.Y(),this.isDragging?this.j():this.isZooming||this.isMultitouch||this.st(t)),this.F<2&&this.isZooming&&(this.isZooming=!1,this.zoomLevels.end(),1===this.F&&(this.dragAxis=null,this.X()))))}J(){(this.isDragging||this.isZooming)&&(this.it(),this.isDragging?e(this.p1,this.prevP1)||this.drag.change():e(this.p1,this.prevP1)&&e(this.p2,this.prevP2)||this.zoomLevels.change(),this.ht(),this.raf=requestAnimationFrame(this.J.bind(this)))}it(t){const s=Date.now(),h=s-this.U;h<50&&!t||(this.velocity.x=this.et(\"x\",h),this.velocity.y=this.et(\"y\",h),this.U=s,i(this.B,this.p1),this.V=!0)}st(t){const{mainScroll:s}=this.pswp;if(s.isShifted())return void s.moveIndexBy(0,!0);if(t.type.indexOf(\"cancel\")>0)return;if(\"mouseup\"===t.type||\"mouse\"===t.pointerType)return void this.tapHandler.click(this.startP1,t);const e=this.pswp.options.doubleTapAction?300:0;this.G?(this.W(),h(this.Z,this.startP1)<25&&this.tapHandler.doubleTap(this.startP1,t)):(i(this.Z,this.startP1),this.G=setTimeout((()=>{this.tapHandler.tap(this.startP1,t),this.W()}),e))}W(){this.G&&(clearTimeout(this.G),this.G=null)}et(t,i){const s=this.p1[t]-this.B[t];return Math.abs(s)>1&&i>5?s/i:0}Y(){this.raf&&(cancelAnimationFrame(this.raf),this.raf=null)}H(t,i){this.pswp.applyFilters(\"preventPointerEvent\",!0,t,i)&&t.preventDefault()}K(t,s){if(this.N){const h=t,e=this.O.findIndex((t=>t.id===h.pointerId));\"up\"===s&&e>-1?this.O.splice(e,1):\"down\"===s&&-1===e?this.O.push(this.nt(h,{x:0,y:0})):e>-1&&this.nt(h,this.O[e]),this.F=this.O.length,this.F>0&&i(this.p1,this.O[0]),this.F>1&&i(this.p2,this.O[1])}else{const i=t;this.F=0,i.type.indexOf(\"touch\")>-1?i.touches&&i.touches.length>0&&(this.nt(i.touches[0],this.p1),this.F++,i.touches.length>1&&(this.nt(i.touches[1],this.p2),this.F++)):(this.nt(t,this.p1),\"up\"===s?this.F=0:this.F++)}}ht(){i(this.prevP1,this.p1),i(this.prevP2,this.p2)}X(){i(this.startP1,this.p1),i(this.startP2,this.p2),this.ht()}tt(){if(this.pswp.mainScroll.isShifted())this.dragAxis=\"x\";else{const t=Math.abs(this.p1.x-this.startP1.x)-Math.abs(this.p1.y-this.startP1.y);if(0!==t){const i=t>0?\"x\":\"y\";Math.abs(this.p1[i]-this.startP1[i])>=10&&(this.dragAxis=i)}}}nt(t,i){return i.x=t.pageX-this.pswp.offset.x,i.y=t.pageY-this.pswp.offset.y,\"pointerId\"in t?i.id=t.pointerId:void 0!==t.identifier&&(i.id=t.identifier),i}$(t){this.pswp.mainScroll.isShifted()&&(t.preventDefault(),t.stopPropagation())}}class A{constructor(t){this.pswp=t,this.x=0,this.slideWidth=0,this.ot=0,this.rt=0,this.lt=-1,this.itemHolders=[]}resize(t){const{pswp:i}=this,s=Math.round(i.viewportSize.x+i.viewportSize.x*i.options.spacing),h=s!==this.slideWidth;h&&(this.slideWidth=s,this.moveTo(this.getCurrSlideX())),this.itemHolders.forEach(((i,s)=>{h&&r(i.el,(s+this.lt)*this.slideWidth),t&&i.slide&&i.slide.resize()}))}resetPosition(){this.ot=0,this.rt=0,this.slideWidth=0,this.lt=-1}appendHolders(){this.itemHolders=[];for(let i=0;i<3;i++){const s=t(\"pswp__item\",\"div\",this.pswp.container);s.setAttribute(\"role\",\"group\"),s.setAttribute(\"aria-roledescription\",\"slide\"),s.setAttribute(\"aria-hidden\",\"true\"),s.style.display=1===i?\"block\":\"none\",this.itemHolders.push({el:s})}}canBeSwiped(){return this.pswp.getNumItems()>1}moveIndexBy(t,i,s){const{pswp:h}=this;let e=h.potentialIndex+t;const n=h.getNumItems();if(h.canLoop()){e=h.getLoopedIndex(e);const i=(t+n)%n;t=i<=n/2?i:i-n}else e<0?e=0:e>=n&&(e=n-1),t=e-h.potentialIndex;h.potentialIndex=e,this.ot-=t,h.animations.stopMainScroll();const o=this.getCurrSlideX();if(i){h.animations.startSpring({isMainScroll:!0,start:this.x,end:o,velocity:s||0,naturalFrequency:30,dampingRatio:1,onUpdate:t=>{this.moveTo(t)},onComplete:()=>{this.updateCurrItem(),h.appendHeavy()}});let t=h.potentialIndex-h.currIndex;if(h.canLoop()){const i=(t+n)%n;t=i<=n/2?i:i-n}Math.abs(t)>1&&this.updateCurrItem()}else this.moveTo(o),this.updateCurrItem();return Boolean(t)}getCurrSlideX(){return this.slideWidth*this.ot}isShifted(){return this.x!==this.getCurrSlideX()}updateCurrItem(){var t;const{pswp:i}=this,s=this.rt-this.ot;if(!s)return;this.rt=this.ot,i.currIndex=i.potentialIndex;let h,e=Math.abs(s);e>=3&&(this.lt+=s+(s>0?-3:3),e=3,this.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy(),t.slide=void 0})));for(let t=0;t<e;t++)s>0?(h=this.itemHolders.shift(),h&&(this.itemHolders[2]=h,this.lt++,r(h.el,(this.lt+2)*this.slideWidth),i.setContent(h,i.currIndex-e+t+2))):(h=this.itemHolders.pop(),h&&(this.itemHolders.unshift(h),this.lt--,r(h.el,this.lt*this.slideWidth),i.setContent(h,i.currIndex+e-t-2)));Math.abs(this.lt)>50&&!this.isShifted()&&(this.resetPosition(),this.resize()),i.animations.stopAllPan(),this.itemHolders.forEach(((t,i)=>{t.slide&&t.slide.setIsActive(1===i)})),i.currSlide=null===(t=this.itemHolders[1])||void 0===t?void 0:t.slide,i.contentLoader.updateLazy(s),i.currSlide&&i.currSlide.applyCurrentZoomPan(),i.dispatch(\"change\")}moveTo(t,i){if(!this.pswp.canLoop()&&i){let i=(this.slideWidth*this.ot-t)/this.slideWidth;i+=this.pswp.currIndex;const s=Math.round(t-this.x);(i<0&&s>0||i>=this.pswp.getNumItems()-1&&s<0)&&(t=this.x+.35*s)}this.x=t,this.pswp.container&&r(this.pswp.container,t),this.pswp.dispatch(\"moveMainScroll\",{x:t,dragging:null!=i&&i})}}const D={Escape:27,z:90,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,Tab:9},I=(t,i)=>i?t:D[t];class E{constructor(t){this.pswp=t,this.ct=!1,t.on(\"bindEvents\",(()=>{t.options.trapFocus&&(t.options.initialPointerPos||this.dt(),t.events.add(document,\"focusin\",this.ut.bind(this))),t.events.add(document,\"keydown\",this.vt.bind(this))}));const i=document.activeElement;t.on(\"destroy\",(()=>{t.options.returnFocus&&i&&this.ct&&i.focus()}))}dt(){!this.ct&&this.pswp.element&&(this.pswp.element.focus(),this.ct=!0)}vt(t){const{pswp:i}=this;if(i.dispatch(\"keydown\",{originalEvent:t}).defaultPrevented)return;if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t))return;let s,h,e=!1;const n=\"key\"in t;switch(n?t.key:t.keyCode){case I(\"Escape\",n):i.options.escKey&&(s=\"close\");break;case I(\"z\",n):s=\"toggleZoom\";break;case I(\"ArrowLeft\",n):h=\"x\";break;case I(\"ArrowUp\",n):h=\"y\";break;case I(\"ArrowRight\",n):h=\"x\",e=!0;break;case I(\"ArrowDown\",n):e=!0,h=\"y\";break;case I(\"Tab\",n):this.dt()}if(h){t.preventDefault();const{currSlide:n}=i;i.options.arrowKeys&&\"x\"===h&&i.getNumItems()>1?s=e?\"next\":\"prev\":n&&n.currZoomLevel>n.zoomLevels.fit&&(n.pan[h]+=e?-80:80,n.panTo(n.pan.x,n.pan.y))}s&&(t.preventDefault(),i[s]())}ut(t){const{template:i}=this.pswp;i&&document!==t.target&&i!==t.target&&!i.contains(t.target)&&i.focus()}}const L=\"cubic-bezier(.4,0,.22,1)\";class k{constructor(t){var i;this.props=t;const{target:s,onComplete:h,transform:e,onFinish:n=(()=>{}),duration:o=333,easing:r=L}=t;this.onFinish=n;const l=e?\"transform\":\"opacity\",c=null!==(i=t[l])&&void 0!==i?i:\"\";this.ft=s,this.wt=h,this.gt=!1,this.yt=this.yt.bind(this),this._t=setTimeout((()=>{a(s,l,o,r),this._t=setTimeout((()=>{s.addEventListener(\"transitionend\",this.yt,!1),s.addEventListener(\"transitioncancel\",this.yt,!1),this._t=setTimeout((()=>{this.xt()}),o+500),s.style[l]=c}),30)}),0)}yt(t){t.target===this.ft&&this.xt()}xt(){this.gt||(this.gt=!0,this.onFinish(),this.wt&&this.wt())}destroy(){this._t&&clearTimeout(this._t),a(this.ft),this.ft.removeEventListener(\"transitionend\",this.yt,!1),this.ft.removeEventListener(\"transitioncancel\",this.yt,!1),this.gt||this.xt()}}class Z{constructor(t,i,s){this.velocity=1e3*t,this.bt=i||.75,this.St=s||12,this.zt=this.St,this.bt<1&&(this.zt*=Math.sqrt(1-this.bt*this.bt))}easeFrame(t,i){let s,h=0;i/=1e3;const e=Math.E**(-this.bt*this.St*i);if(1===this.bt)s=this.velocity+this.St*t,h=(t+s*i)*e,this.velocity=h*-this.St+s*e;else if(this.bt<1){s=1/this.zt*(this.bt*this.St*t+this.velocity);const n=Math.cos(this.zt*i),o=Math.sin(this.zt*i);h=e*(t*n+s*o),this.velocity=h*-this.St*this.bt+e*(-this.zt*t*o+this.zt*s*n)}return h}}class B{constructor(t){this.props=t,this.Mt=0;const{start:i,end:s,velocity:h,onUpdate:e,onComplete:n,onFinish:o=(()=>{}),dampingRatio:r,naturalFrequency:a}=t;this.onFinish=o;const l=new Z(h,r,a);let c=Date.now(),d=i-s;const u=()=>{this.Mt&&(d=l.easeFrame(d,Date.now()-c),Math.abs(d)<1&&Math.abs(l.velocity)<50?(e(s),n&&n(),this.onFinish()):(c=Date.now(),e(d+s),this.Mt=requestAnimationFrame(u)))};this.Mt=requestAnimationFrame(u)}destroy(){this.Mt>=0&&cancelAnimationFrame(this.Mt),this.Mt=0}}class F{constructor(){this.activeAnimations=[]}startSpring(t){this.Pt(t,!0)}startTransition(t){this.Pt(t)}Pt(t,i){const s=i?new B(t):new k(t);return this.activeAnimations.push(s),s.onFinish=()=>this.stop(s),s}stop(t){t.destroy();const i=this.activeAnimations.indexOf(t);i>-1&&this.activeAnimations.splice(i,1)}stopAll(){this.activeAnimations.forEach((t=>{t.destroy()})),this.activeAnimations=[]}stopAllPan(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isPan||(t.destroy(),!1)))}stopMainScroll(){this.activeAnimations=this.activeAnimations.filter((t=>!t.props.isMainScroll||(t.destroy(),!1)))}isPanRunning(){return this.activeAnimations.some((t=>t.props.isPan))}}class O{constructor(t){this.pswp=t,t.events.add(t.element,\"wheel\",this.Ct.bind(this))}Ct(t){t.preventDefault();const{currSlide:i}=this.pswp;let{deltaX:s,deltaY:h}=t;if(i&&!this.pswp.dispatch(\"wheel\",{originalEvent:t}).defaultPrevented)if(t.ctrlKey||this.pswp.options.wheelToZoom){if(i.isZoomable()){let s=-h;1===t.deltaMode?s*=.05:s*=t.deltaMode?1:.002,s=2**s;const e=i.currZoomLevel*s;i.zoomTo(e,{x:t.clientX,y:t.clientY})}}else i.isPannable()&&(1===t.deltaMode&&(s*=18,h*=18),i.panTo(i.pan.x-s,i.pan.y-h))}}class R{constructor(i,s){var h;const e=s.name||s.className;let n=s.html;if(!1===i.options[e])return;\"string\"==typeof i.options[e+\"SVG\"]&&(n=i.options[e+\"SVG\"]),i.dispatch(\"uiElementCreate\",{data:s});let o=\"\";s.isButton?(o+=\"pswp__button \",o+=s.className||`pswp__button--${s.name}`):o+=s.className||`pswp__${s.name}`;let r=s.isButton?s.tagName||\"button\":s.tagName||\"div\";r=r.toLowerCase();const a=t(o,r);if(s.isButton){\"button\"===r&&(a.type=\"button\");let{title:t}=s;const{ariaLabel:h}=s;\"string\"==typeof i.options[e+\"Title\"]&&(t=i.options[e+\"Title\"]),t&&(a.title=t);const n=h||t;n&&a.setAttribute(\"aria-label\",n)}a.innerHTML=function(t){if(\"string\"==typeof t)return t;if(!t||!t.isCustomSVG)return\"\";const i=t;let s='<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';return s=s.split(\"%d\").join(i.size||32),i.outlineID&&(s+='<use class=\"pswp__icn-shadow\" xlink:href=\"#'+i.outlineID+'\"/>'),s+=i.inner,s+=\"</svg>\",s}(n),s.onInit&&s.onInit(a,i),s.onClick&&(a.onclick=t=>{\"string\"==typeof s.onClick?i[s.onClick]():\"function\"==typeof s.onClick&&s.onClick(t,a,i)});const l=s.appendTo||\"bar\";let c=i.element;\"bar\"===l?(i.topBar||(i.topBar=t(\"pswp__top-bar pswp__hide-on-close\",\"div\",i.scrollWrap)),c=i.topBar):(a.classList.add(\"pswp__hide-on-close\"),\"wrapper\"===l&&(c=i.scrollWrap)),null===(h=c)||void 0===h||h.appendChild(i.applyFilters(\"uiElement\",a,s))}}function N(t,i,s){t.classList.add(\"pswp__button--arrow\"),t.setAttribute(\"aria-controls\",\"pswp__items\"),i.on(\"change\",(()=>{i.options.loop||(t.disabled=s?!(i.currIndex<i.getNumItems()-1):!(i.currIndex>0))}))}const U={name:\"arrowPrev\",className:\"pswp__button--arrow--prev\",title:\"Previous\",order:10,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"prev\",onInit:N},V={name:\"arrowNext\",className:\"pswp__button--arrow--next\",title:\"Next\",order:11,isButton:!0,appendTo:\"wrapper\",html:{isCustomSVG:!0,size:60,inner:'<use xlink:href=\"#pswp__icn-arrow\"/>',outlineID:\"pswp__icn-arrow\"},onClick:\"next\",onInit:(t,i)=>{N(t,i,!0)}},G={name:\"close\",title:\"Close\",order:20,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',outlineID:\"pswp__icn-close\"},onClick:\"close\"},$={name:\"zoom\",title:\"Zoom\",order:10,isButton:!0,html:{isCustomSVG:!0,inner:'<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/><path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',outlineID:\"pswp__icn-zoom\"},onClick:\"toggleZoom\"},q={name:\"preloader\",appendTo:\"bar\",order:7,html:{isCustomSVG:!0,inner:'<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',outlineID:\"pswp__icn-loading\"},onInit:(t,i)=>{let s,h=null;const e=i=>{var h,e;s!==i&&(s=i,h=\"active\",e=i,t.classList.toggle(\"pswp__preloader--\"+h,e))},n=()=>{var t;if(null===(t=i.currSlide)||void 0===t||!t.content.isLoading())return e(!1),void(h&&(clearTimeout(h),h=null));h||(h=setTimeout((()=>{var t;e(Boolean(null===(t=i.currSlide)||void 0===t?void 0:t.content.isLoading())),h=null}),i.options.preloaderDelay))};i.on(\"change\",n),i.on(\"loadComplete\",(t=>{i.currSlide===t.slide&&n()})),i.ui&&(i.ui.updatePreloaderVisibility=n)}},H={name:\"counter\",order:5,onInit:(t,i)=>{i.on(\"change\",(()=>{t.innerText=i.currIndex+1+i.options.indexIndicatorSep+i.getNumItems()}))}};function K(t,i){t.classList.toggle(\"pswp--zoomed-in\",i)}class W{constructor(t){this.pswp=t,this.isRegistered=!1,this.uiElementsData=[],this.items=[],this.updatePreloaderVisibility=()=>{},this.Tt=void 0}init(){const{pswp:t}=this;this.isRegistered=!1,this.uiElementsData=[G,U,V,$,q,H],t.dispatch(\"uiRegister\"),this.uiElementsData.sort(((t,i)=>(t.order||0)-(i.order||0))),this.items=[],this.isRegistered=!0,this.uiElementsData.forEach((t=>{this.registerElement(t)})),t.on(\"change\",(()=>{var i;null===(i=t.element)||void 0===i||i.classList.toggle(\"pswp--one-slide\",1===t.getNumItems())})),t.on(\"zoomPanUpdate\",(()=>this.At()))}registerElement(t){this.isRegistered?this.items.push(new R(this.pswp,t)):this.uiElementsData.push(t)}At(){const{template:t,currSlide:i,options:s}=this.pswp;if(this.pswp.opener.isClosing||!t||!i)return;let{currZoomLevel:h}=i;if(this.pswp.opener.isOpen||(h=i.zoomLevels.initial),h===this.Tt)return;this.Tt=h;const e=i.zoomLevels.initial-i.zoomLevels.secondary;if(Math.abs(e)<.01||!i.isZoomable())return K(t,!1),void t.classList.remove(\"pswp--zoom-allowed\");t.classList.add(\"pswp--zoom-allowed\");K(t,(h===i.zoomLevels.initial?i.zoomLevels.secondary:i.zoomLevels.initial)<=h),\"zoom\"!==s.imageClickAction&&\"zoom-or-close\"!==s.imageClickAction||t.classList.add(\"pswp--click-to-zoom\")}}class j{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class X{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,i){this.element&&(\"IMG\"===this.element.tagName?(l(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=o(0,0,t/250)):l(this.element,t,i))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class Y{constructor(t,i,s){this.instance=i,this.data=t,this.index=s,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=c,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new X(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const h=this.element;this.updateSrcsetSizes(),this.data.srcset&&(h.srcset=this.data.srcset),h.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",h.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=d,h.complete?this.onLoaded():(h.onload=()=>{this.onLoaded()},h.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=u,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==u&&this.state!==p||this.removePlaceholder())}onError(){this.state=p,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===d,this)}isError(){return this.state===p}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,i){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,i),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:i}).defaultPrevented&&(l(this.element,t,i),this.isImageContent()&&!this.isError()))){const s=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=i,s?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:i,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==p,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===p)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||m())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!m()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==u&&this.state!==p||this.removePlaceholder()))}}function J(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new x(n,t,-1),o=i.pswp?i.pswp.viewportSize:w(n,i);const r=y(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}class Q{constructor(t){this.pswp=t,this.limit=Math.max(t.options.preload[0]+t.options.preload[1]+1,5),this.Dt=[]}updateLazy(t){const{pswp:i}=this;if(i.dispatch(\"lazyLoad\").defaultPrevented)return;const{preload:s}=i.options,h=void 0===t||t>=0;let e;for(e=0;e<=s[1];e++)this.loadSlideByIndex(i.currIndex+(h?e:-e));for(e=1;e<=s[0];e++)this.loadSlideByIndex(i.currIndex+(h?-e:e))}loadSlideByIndex(t){const i=this.pswp.getLoopedIndex(t);let s=this.getContentByIndex(i);s||(s=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return J(s,i,t)}(i,this.pswp),s&&this.addToCache(s))}getContentBySlide(t){let i=this.getContentByIndex(t.index);return i||(i=this.pswp.createContentFromData(t.data,t.index),this.addToCache(i)),i.setSlide(t),i}addToCache(t){if(this.removeByIndex(t.index),this.Dt.push(t),this.Dt.length>this.limit){const t=this.Dt.findIndex((t=>!t.isAttached&&!t.hasSlide));if(-1!==t){this.Dt.splice(t,1)[0].destroy()}}}removeByIndex(t){const i=this.Dt.findIndex((i=>i.index===t));-1!==i&&this.Dt.splice(i,1)}getContentByIndex(t){return this.Dt.find((i=>i.index===t))}destroy(){this.Dt.forEach((t=>t.destroy())),this.Dt=[]}}const tt=.003;class it{constructor(t){this.pswp=t,this.isClosed=!0,this.isOpen=!1,this.isClosing=!1,this.isOpening=!1,this.It=void 0,this.Et=!1,this.Lt=!1,this.kt=!1,this.Zt=!1,this.Bt=void 0,this.Ft=void 0,this.Ot=void 0,this.Rt=void 0,this.Nt=void 0,this.Ut=this.Ut.bind(this),t.on(\"firstZoomPan\",this.Ut)}open(){this.Ut(),this.Pt()}close(){if(this.isClosed||this.isClosing||this.isOpening)return;const t=this.pswp.currSlide;this.isOpen=!1,this.isOpening=!1,this.isClosing=!0,this.It=this.pswp.options.hideAnimationDuration,t&&t.currZoomLevel*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt(),setTimeout((()=>{this.Pt()}),this.Lt?30:0)}Ut(){if(this.pswp.off(\"firstZoomPan\",this.Ut),!this.isOpening){const t=this.pswp.currSlide;this.isOpening=!0,this.isClosing=!1,this.It=this.pswp.options.showAnimationDuration,t&&t.zoomLevels.initial*t.width>=this.pswp.options.maxWidthToAnimate&&(this.It=0),this.Vt()}}Vt(){const{pswp:t}=this,i=this.pswp.currSlide,{options:s}=t;var h,e;(\"fade\"===s.showHideAnimationType?(s.showHideOpacity=!0,this.Nt=void 0):\"none\"===s.showHideAnimationType?(s.showHideOpacity=!1,this.It=0,this.Nt=void 0):this.isOpening&&t.Gt?this.Nt=t.Gt:this.Nt=this.pswp.getThumbBounds(),this.Bt=null==i?void 0:i.getPlaceholderElement(),t.animations.stopAll(),this.Et=Boolean(this.It&&this.It>50),this.$t=Boolean(this.Nt)&&(null==i?void 0:i.content.usePlaceholder())&&(!this.isClosing||!t.mainScroll.isShifted()),this.$t)?this.kt=null!==(h=s.showHideOpacity)&&void 0!==h&&h:(this.kt=!0,this.isOpening&&i&&(i.zoomAndPanToInitial(),i.applyCurrentZoomPan()));if(this.Zt=!this.kt&&this.pswp.options.bgOpacity>tt,this.Ft=this.kt?t.element:t.bg,!this.Et)return this.It=0,this.$t=!1,this.Zt=!1,this.kt=!0,void(this.isOpening&&(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)));this.$t&&this.Nt&&this.Nt.innerRect?(this.Lt=!0,this.Ot=this.pswp.container,this.Rt=null===(e=this.pswp.currSlide)||void 0===e?void 0:e.holderElement,t.container&&(t.container.style.overflow=\"hidden\",t.container.style.width=t.viewportSize.x+\"px\")):this.Lt=!1;this.isOpening?(this.kt?(t.element&&(t.element.style.opacity=String(tt)),t.applyBgOpacity(1)):(this.Zt&&t.bg&&(t.bg.style.opacity=String(tt)),t.element&&(t.element.style.opacity=\"1\")),this.$t&&(this.qt(),this.Bt&&(this.Bt.style.willChange=\"transform\",this.Bt.style.opacity=String(tt)))):this.isClosing&&(t.mainScroll.itemHolders[0]&&(t.mainScroll.itemHolders[0].el.style.display=\"none\"),t.mainScroll.itemHolders[2]&&(t.mainScroll.itemHolders[2].el.style.display=\"none\"),this.Lt&&0!==t.mainScroll.x&&(t.mainScroll.resetPosition(),t.mainScroll.resize()))}Pt(){this.isOpening&&this.Et&&this.Bt&&\"IMG\"===this.Bt.tagName?new Promise((t=>{let i=!1,s=!0;var h;(h=this.Bt,\"decode\"in h?h.decode().catch((()=>{})):h.complete?Promise.resolve(h):new Promise(((t,i)=>{h.onload=()=>t(h),h.onerror=i}))).finally((()=>{i=!0,s||t(!0)})),setTimeout((()=>{s=!1,i&&t(!0)}),50),setTimeout(t,250)})).finally((()=>this.Ht())):this.Ht()}Ht(){var t,i;null===(t=this.pswp.element)||void 0===t||t.style.setProperty(\"--pswp-transition-duration\",this.It+\"ms\"),this.pswp.dispatch(this.isOpening?\"openingAnimationStart\":\"closingAnimationStart\"),this.pswp.dispatch(\"initialZoom\"+(this.isOpening?\"In\":\"Out\")),null===(i=this.pswp.element)||void 0===i||i.classList.toggle(\"pswp--ui-visible\",this.isOpening),this.isOpening?(this.Bt&&(this.Bt.style.opacity=\"1\"),this.Kt()):this.isClosing&&this.Wt(),this.Et||this.jt()}jt(){const{pswp:t}=this;if(this.isOpen=this.isOpening,this.isClosed=this.isClosing,this.isOpening=!1,this.isClosing=!1,t.dispatch(this.isOpen?\"openingAnimationEnd\":\"closingAnimationEnd\"),t.dispatch(\"initialZoom\"+(this.isOpen?\"InEnd\":\"OutEnd\")),this.isClosed)t.destroy();else if(this.isOpen){var i;this.$t&&t.container&&(t.container.style.overflow=\"visible\",t.container.style.width=\"100%\"),null===(i=t.currSlide)||void 0===i||i.applyCurrentZoomPan()}}Kt(){const{pswp:t}=this;this.$t&&(this.Lt&&this.Ot&&this.Rt&&(this.Xt(this.Ot,\"transform\",\"translate3d(0,0,0)\"),this.Xt(this.Rt,\"transform\",\"none\")),t.currSlide&&(t.currSlide.zoomAndPanToInitial(),this.Xt(t.currSlide.container,\"transform\",t.currSlide.getCurrentTransform()))),this.Zt&&t.bg&&this.Xt(t.bg,\"opacity\",String(t.options.bgOpacity)),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"1\")}Wt(){const{pswp:t}=this;this.$t&&this.qt(!0),this.Zt&&t.bgOpacity>.01&&t.bg&&this.Xt(t.bg,\"opacity\",\"0\"),this.kt&&t.element&&this.Xt(t.element,\"opacity\",\"0\")}qt(t){if(!this.Nt)return;const{pswp:s}=this,{innerRect:h}=this.Nt,{currSlide:e,viewportSize:n}=s;if(this.Lt&&h&&this.Ot&&this.Rt){const i=-n.x+(this.Nt.x-h.x)+h.w,s=-n.y+(this.Nt.y-h.y)+h.h,e=n.x-h.w,a=n.y-h.h;t?(this.Xt(this.Ot,\"transform\",o(i,s)),this.Xt(this.Rt,\"transform\",o(e,a))):(r(this.Ot,i,s),r(this.Rt,e,a))}e&&(i(e.pan,h||this.Nt),e.currZoomLevel=this.Nt.w/e.width,t?this.Xt(e.container,\"transform\",e.getCurrentTransform()):e.applyCurrentZoomPan())}Xt(t,i,s){if(!this.It)return void(t.style[i]=s);const{animations:h}=this.pswp,e={duration:this.It,easing:this.pswp.options.easing,onComplete:()=>{h.activeAnimations.length||this.jt()},target:t};e[i]=s,h.startTransition(e)}}const st={allowPanToNext:!0,spacing:.1,loop:!0,pinchToClose:!0,closeOnVerticalDrag:!0,hideAnimationDuration:333,showAnimationDuration:333,zoomAnimationDuration:333,escKey:!0,arrowKeys:!0,trapFocus:!0,returnFocus:!0,maxWidthToAnimate:4e3,clickToCloseNonZoomable:!0,imageClickAction:\"zoom-or-close\",bgClickAction:\"close\",tapAction:\"toggle-controls\",doubleTapAction:\"zoom\",indexIndicatorSep:\" / \",preloaderDelay:2e3,bgOpacity:.8,index:0,errorMsg:\"The image cannot be loaded\",preload:[1,2],easing:\"cubic-bezier(.4,0,.22,1)\"};return class extends class extends class{constructor(){this.Yt={},this.Jt={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.Jt[t]||(this.Jt[t]=[]),null===(h=this.Jt[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.Jt[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.Jt[t]&&(this.Jt[t]=this.Jt[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.Jt[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.Yt[t]||(this.Yt[t]=[]),null===(s=this.Yt[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.Yt[t]&&(this.Yt[t]=this.Yt[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new j(t,i);return null===(s=this.Yt[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new Y(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.Qt(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.ti(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}Qt(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?function(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}(this.options.children,this.options.childSelector,t)||[]:[t]}ti(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return J(t,this,i)}}{constructor(t){super(),this.options=this.ii(t||{}),this.offset={x:0,y:0},this.si={x:0,y:0},this.viewportSize={x:0,y:0},this.bgOpacity=1,this.currIndex=0,this.potentialIndex=0,this.isOpen=!1,this.isDestroying=!1,this.hasMouse=!1,this.hi={},this.Gt=void 0,this.topBar=void 0,this.element=void 0,this.template=void 0,this.container=void 0,this.scrollWrap=void 0,this.currSlide=void 0,this.events=new f,this.animations=new F,this.mainScroll=new A(this),this.gestures=new T(this),this.opener=new it(this),this.keyboard=new E(this),this.contentLoader=new Q(this)}init(){if(this.isOpen||this.isDestroying)return!1;this.isOpen=!0,this.dispatch(\"init\"),this.dispatch(\"beforeOpen\"),this.ei();let t=\"pswp--open\";return this.gestures.supportsTouch&&(t+=\" pswp--touch\"),this.options.mainClass&&(t+=\" \"+this.options.mainClass),this.element&&(this.element.className+=\" \"+t),this.currIndex=this.options.index||0,this.potentialIndex=this.currIndex,this.dispatch(\"firstUpdate\"),this.scrollWheel=new O(this),(Number.isNaN(this.currIndex)||this.currIndex<0||this.currIndex>=this.getNumItems())&&(this.currIndex=0),this.gestures.supportsTouch||this.mouseDetected(),this.updateSize(),this.offset.y=window.pageYOffset,this.hi=this.getItemData(this.currIndex),this.dispatch(\"gettingData\",{index:this.currIndex,data:this.hi,slide:void 0}),this.Gt=this.getThumbBounds(),this.dispatch(\"initialLayout\"),this.on(\"openingAnimationEnd\",(()=>{const{itemHolders:t}=this.mainScroll;t[0]&&(t[0].el.style.display=\"block\",this.setContent(t[0],this.currIndex-1)),t[2]&&(t[2].el.style.display=\"block\",this.setContent(t[2],this.currIndex+1)),this.appendHeavy(),this.contentLoader.updateLazy(),this.events.add(window,\"resize\",this.ni.bind(this)),this.events.add(window,\"scroll\",this.oi.bind(this)),this.dispatch(\"bindEvents\")})),this.mainScroll.itemHolders[1]&&this.setContent(this.mainScroll.itemHolders[1],this.currIndex),this.dispatch(\"change\"),this.opener.open(),this.dispatch(\"afterInit\"),!0}getLoopedIndex(t){const i=this.getNumItems();return this.options.loop&&(t>i-1&&(t-=i),t<0&&(t+=i)),n(t,0,i-1)}appendHeavy(){this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.appendHeavy()}))}goTo(t){this.mainScroll.moveIndexBy(this.getLoopedIndex(t)-this.potentialIndex)}next(){this.goTo(this.potentialIndex+1)}prev(){this.goTo(this.potentialIndex-1)}zoomTo(...t){var i;null===(i=this.currSlide)||void 0===i||i.zoomTo(...t)}toggleZoom(){var t;null===(t=this.currSlide)||void 0===t||t.toggleZoom()}close(){this.opener.isOpen&&!this.isDestroying&&(this.isDestroying=!0,this.dispatch(\"close\"),this.events.removeAll(),this.opener.close())}destroy(){var t;if(!this.isDestroying)return this.options.showHideAnimationType=\"none\",void this.close();this.dispatch(\"destroy\"),this.Yt={},this.scrollWrap&&(this.scrollWrap.ontouchmove=null,this.scrollWrap.ontouchend=null),null===(t=this.element)||void 0===t||t.remove(),this.mainScroll.itemHolders.forEach((t=>{var i;null===(i=t.slide)||void 0===i||i.destroy()})),this.contentLoader.destroy(),this.events.removeAll()}refreshSlideContent(t){this.contentLoader.removeByIndex(t),this.mainScroll.itemHolders.forEach(((i,s)=>{var h,e;let n=(null!==(h=null===(e=this.currSlide)||void 0===e?void 0:e.index)&&void 0!==h?h:0)-1+s;var o;(this.canLoop()&&(n=this.getLoopedIndex(n)),n===t)&&(this.setContent(i,t,!0),1===s&&(this.currSlide=i.slide,null===(o=i.slide)||void 0===o||o.setIsActive(!0)))})),this.dispatch(\"change\")}setContent(t,i,s){if(this.canLoop()&&(i=this.getLoopedIndex(i)),t.slide){if(t.slide.index===i&&!s)return;t.slide.destroy(),t.slide=void 0}if(!this.canLoop()&&(i<0||i>=this.getNumItems()))return;const h=this.getItemData(i);t.slide=new b(h,i,this),i===this.currIndex&&(this.currSlide=t.slide),t.slide.append(t.el)}getViewportCenterPoint(){return{x:this.viewportSize.x/2,y:this.viewportSize.y/2}}updateSize(t){if(this.isDestroying)return;const s=w(this.options,this);!t&&e(s,this.si)||(i(this.si,s),this.dispatch(\"beforeResize\"),i(this.viewportSize,this.si),this.oi(),this.dispatch(\"viewportSize\"),this.mainScroll.resize(this.opener.isOpen),!this.hasMouse&&window.matchMedia(\"(any-hover: hover)\").matches&&this.mouseDetected(),this.dispatch(\"resize\"))}applyBgOpacity(t){this.bgOpacity=Math.max(t,0),this.bg&&(this.bg.style.opacity=String(this.bgOpacity*this.options.bgOpacity))}mouseDetected(){var t;this.hasMouse||(this.hasMouse=!0,null===(t=this.element)||void 0===t||t.classList.add(\"pswp--has_mouse\"))}ni(){this.updateSize(),/iPhone|iPad|iPod/i.test(window.navigator.userAgent)&&setTimeout((()=>{this.updateSize()}),500)}oi(){this.setScrollOffset(0,window.pageYOffset)}setScrollOffset(t,i){this.offset.x=t,this.offset.y=i,this.dispatch(\"updateScrollOffset\")}ei(){this.element=t(\"pswp\",\"div\"),this.element.setAttribute(\"tabindex\",\"-1\"),this.element.setAttribute(\"role\",\"dialog\"),this.template=this.element,this.bg=t(\"pswp__bg\",\"div\",this.element),this.scrollWrap=t(\"pswp__scroll-wrap\",\"section\",this.element),this.container=t(\"pswp__container\",\"div\",this.scrollWrap),this.scrollWrap.setAttribute(\"aria-roledescription\",\"carousel\"),this.container.setAttribute(\"aria-live\",\"off\"),this.container.setAttribute(\"id\",\"pswp__items\"),this.mainScroll.appendHolders(),this.ui=new W(this),this.ui.init(),(this.options.appendToEl||document.body).appendChild(this.element)}getThumbBounds(){return function(t,i,s){const h=s.dispatch(\"thumbBounds\",{index:t,itemData:i,instance:s});if(h.thumbBounds)return h.thumbBounds;const{element:e}=i;let n,o;if(e&&!1!==s.options.thumbSelector){const t=s.options.thumbSelector||\"img\";o=e.matches(t)?e:e.querySelector(t)}return o=s.applyFilters(\"thumbEl\",o,i,t),o&&(n=i.thumbCropped?function(t,i,s){const h=t.getBoundingClientRect(),e=h.width/i,n=h.height/s,o=e>n?e:n,r=(h.width-i*o)/2,a=(h.height-s*o)/2,l={x:h.left+r,y:h.top+a,w:i*o};return l.innerRect={w:h.width,h:h.height,x:r,y:a},l}(o,i.width||i.w||0,i.height||i.h||0):function(t){const i=t.getBoundingClientRect();return{x:i.left,y:i.top,w:i.width}}(o)),s.applyFilters(\"thumbBounds\",n,i,t)}(this.currIndex,this.currSlide?this.currSlide.data:this.hi,this)}canLoop(){return this.options.loop&&this.getNumItems()>2}ii(t){return window.matchMedia(\"(prefers-reduced-motion), (update: slow)\").matches&&(t.showHideAnimationType=\"none\",t.zoomAnimationDuration=0),{...st,...t}}}}));\n","/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).PhotoSwipeLightbox=i()}(this,(function(){\"use strict\";function t(t,i,s){const h=document.createElement(i);return t&&(h.className=t),s&&s.appendChild(h),h}function i(t,i,s){t.style.width=\"number\"==typeof i?`${i}px`:i,t.style.height=\"number\"==typeof s?`${s}px`:s}const s=\"idle\",h=\"loading\",e=\"loaded\",n=\"error\";function o(t,i,s=document){let h=[];if(t instanceof Element)h=[t];else if(t instanceof NodeList||Array.isArray(t))h=Array.from(t);else{const e=\"string\"==typeof t?t:i;e&&(h=Array.from(s.querySelectorAll(e)))}return h}function r(){return!(!navigator.vendor||!navigator.vendor.match(/apple/i))}class l{constructor(t,i){this.type=t,this.defaultPrevented=!1,i&&Object.assign(this,i)}preventDefault(){this.defaultPrevented=!0}}class a{constructor(i,s){if(this.element=t(\"pswp__img pswp__img--placeholder\",i?\"img\":\"div\",s),i){const t=this.element;t.decoding=\"async\",t.alt=\"\",t.src=i,t.setAttribute(\"role\",\"presentation\")}this.element.setAttribute(\"aria-hidden\",\"true\")}setDisplayedSize(t,s){this.element&&(\"IMG\"===this.element.tagName?(i(this.element,250,\"auto\"),this.element.style.transformOrigin=\"0 0\",this.element.style.transform=function(t,i,s){let h=`translate3d(${t}px,${i||0}px,0)`;return void 0!==s&&(h+=` scale3d(${s},${s},1)`),h}(0,0,t/250)):i(this.element,t,s))}destroy(){var t;null!==(t=this.element)&&void 0!==t&&t.parentNode&&this.element.remove(),this.element=null}}class d{constructor(t,i,h){this.instance=i,this.data=t,this.index=h,this.element=void 0,this.placeholder=void 0,this.slide=void 0,this.displayedImageWidth=0,this.displayedImageHeight=0,this.width=Number(this.data.w)||Number(this.data.width)||0,this.height=Number(this.data.h)||Number(this.data.height)||0,this.isAttached=!1,this.hasSlide=!1,this.isDecoding=!1,this.state=s,this.data.type?this.type=this.data.type:this.data.src?this.type=\"image\":this.type=\"html\",this.instance.dispatch(\"contentInit\",{content:this})}removePlaceholder(){this.placeholder&&!this.keepPlaceholder()&&setTimeout((()=>{this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0)}),1e3)}load(i,s){if(this.slide&&this.usePlaceholder())if(this.placeholder){const t=this.placeholder.element;t&&!t.parentElement&&this.slide.container.prepend(t)}else{const t=this.instance.applyFilters(\"placeholderSrc\",!(!this.data.msrc||!this.slide.isFirstSlide)&&this.data.msrc,this);this.placeholder=new a(t,this.slide.container)}this.element&&!s||this.instance.dispatch(\"contentLoad\",{content:this,isLazy:i}).defaultPrevented||(this.isImageContent()?(this.element=t(\"pswp__img\",\"img\"),this.displayedImageWidth&&this.loadImage(i)):(this.element=t(\"pswp__content\",\"div\"),this.element.innerHTML=this.data.html||\"\"),s&&this.slide&&this.slide.updateContentSize(!0))}loadImage(t){var i,s;if(!this.isImageContent()||!this.element||this.instance.dispatch(\"contentLoadImage\",{content:this,isLazy:t}).defaultPrevented)return;const e=this.element;this.updateSrcsetSizes(),this.data.srcset&&(e.srcset=this.data.srcset),e.src=null!==(i=this.data.src)&&void 0!==i?i:\"\",e.alt=null!==(s=this.data.alt)&&void 0!==s?s:\"\",this.state=h,e.complete?this.onLoaded():(e.onload=()=>{this.onLoaded()},e.onerror=()=>{this.onError()})}setSlide(t){this.slide=t,this.hasSlide=!0,this.instance=t.pswp}onLoaded(){this.state=e,this.slide&&this.element&&(this.instance.dispatch(\"loadComplete\",{slide:this.slide,content:this}),this.slide.isActive&&this.slide.heavyAppended&&!this.element.parentNode&&(this.append(),this.slide.updateContentSize(!0)),this.state!==e&&this.state!==n||this.removePlaceholder())}onError(){this.state=n,this.slide&&(this.displayError(),this.instance.dispatch(\"loadComplete\",{slide:this.slide,isError:!0,content:this}),this.instance.dispatch(\"loadError\",{slide:this.slide,content:this}))}isLoading(){return this.instance.applyFilters(\"isContentLoading\",this.state===h,this)}isError(){return this.state===n}isImageContent(){return\"image\"===this.type}setDisplayedSize(t,s){if(this.element&&(this.placeholder&&this.placeholder.setDisplayedSize(t,s),!this.instance.dispatch(\"contentResize\",{content:this,width:t,height:s}).defaultPrevented&&(i(this.element,t,s),this.isImageContent()&&!this.isError()))){const i=!this.displayedImageWidth&&t;this.displayedImageWidth=t,this.displayedImageHeight=s,i?this.loadImage(!1):this.updateSrcsetSizes(),this.slide&&this.instance.dispatch(\"imageSizeChange\",{slide:this.slide,width:t,height:s,content:this})}}isZoomable(){return this.instance.applyFilters(\"isContentZoomable\",this.isImageContent()&&this.state!==n,this)}updateSrcsetSizes(){if(!this.isImageContent()||!this.element||!this.data.srcset)return;const t=this.element,i=this.instance.applyFilters(\"srcsetSizesWidth\",this.displayedImageWidth,this);(!t.dataset.largestUsedSize||i>parseInt(t.dataset.largestUsedSize,10))&&(t.sizes=i+\"px\",t.dataset.largestUsedSize=String(i))}usePlaceholder(){return this.instance.applyFilters(\"useContentPlaceholder\",this.isImageContent(),this)}lazyLoad(){this.instance.dispatch(\"contentLazyLoad\",{content:this}).defaultPrevented||this.load(!0)}keepPlaceholder(){return this.instance.applyFilters(\"isKeepingPlaceholder\",this.isLoading(),this)}destroy(){this.hasSlide=!1,this.slide=void 0,this.instance.dispatch(\"contentDestroy\",{content:this}).defaultPrevented||(this.remove(),this.placeholder&&(this.placeholder.destroy(),this.placeholder=void 0),this.isImageContent()&&this.element&&(this.element.onload=null,this.element.onerror=null,this.element=void 0))}displayError(){if(this.slide){var i,s;let h=t(\"pswp__error-msg\",\"div\");h.innerText=null!==(i=null===(s=this.instance.options)||void 0===s?void 0:s.errorMsg)&&void 0!==i?i:\"\",h=this.instance.applyFilters(\"contentErrorElement\",h,this),this.element=t(\"pswp__content pswp__error-msg-container\",\"div\"),this.element.appendChild(h),this.slide.container.innerText=\"\",this.slide.container.appendChild(this.element),this.slide.updateContentSize(!0),this.removePlaceholder()}}append(){if(this.isAttached||!this.element)return;if(this.isAttached=!0,this.state===n)return void this.displayError();if(this.instance.dispatch(\"contentAppend\",{content:this}).defaultPrevented)return;const t=\"decode\"in this.element;this.isImageContent()?t&&this.slide&&(!this.slide.isActive||r())?(this.isDecoding=!0,this.element.decode().catch((()=>{})).finally((()=>{this.isDecoding=!1,this.appendImage()}))):this.appendImage():this.slide&&!this.element.parentNode&&this.slide.container.appendChild(this.element)}activate(){!this.instance.dispatch(\"contentActivate\",{content:this}).defaultPrevented&&this.slide&&(this.isImageContent()&&this.isDecoding&&!r()?this.appendImage():this.isError()&&this.load(!1,!0),this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"false\"))}deactivate(){this.instance.dispatch(\"contentDeactivate\",{content:this}),this.slide&&this.slide.holderElement&&this.slide.holderElement.setAttribute(\"aria-hidden\",\"true\")}remove(){this.isAttached=!1,this.instance.dispatch(\"contentRemove\",{content:this}).defaultPrevented||(this.element&&this.element.parentNode&&this.element.remove(),this.placeholder&&this.placeholder.element&&this.placeholder.element.remove())}appendImage(){this.isAttached&&(this.instance.dispatch(\"contentAppendImage\",{content:this}).defaultPrevented||(this.slide&&this.element&&!this.element.parentNode&&this.slide.container.appendChild(this.element),this.state!==e&&this.state!==n||this.removePlaceholder()))}}function c(t,i,s,h,e){let n=0;if(i.paddingFn)n=i.paddingFn(s,h,e)[t];else if(i.padding)n=i.padding[t];else{const s=\"padding\"+t[0].toUpperCase()+t.slice(1);i[s]&&(n=i[s])}return Number(n)||0}class u{constructor(t,i,s,h){this.pswp=h,this.options=t,this.itemData=i,this.index=s,this.panAreaSize=null,this.elementSize=null,this.fit=1,this.fill=1,this.vFill=1,this.initial=1,this.secondary=1,this.max=1,this.min=1}update(t,i,s){const h={x:t,y:i};this.elementSize=h,this.panAreaSize=s;const e=s.x/h.x,n=s.y/h.y;this.fit=Math.min(1,e<n?e:n),this.fill=Math.min(1,e>n?e:n),this.vFill=Math.min(1,n),this.initial=this.t(),this.secondary=this.i(),this.max=Math.max(this.initial,this.secondary,this.o()),this.min=Math.min(this.fit,this.initial,this.secondary),this.pswp&&this.pswp.dispatch(\"zoomLevelsUpdate\",{zoomLevels:this,slideData:this.itemData})}l(t){const i=t+\"ZoomLevel\",s=this.options[i];if(s)return\"function\"==typeof s?s(this):\"fill\"===s?this.fill:\"fit\"===s?this.fit:Number(s)}i(){let t=this.l(\"secondary\");return t||(t=Math.min(1,3*this.fit),this.elementSize&&t*this.elementSize.x>4e3&&(t=4e3/this.elementSize.x),t)}t(){return this.l(\"initial\")||this.fit}o(){return this.l(\"max\")||Math.max(1,4*this.fit)}}function p(t,i,s){const h=i.createContentFromData(t,s);let e;const{options:n}=i;if(n){let o;e=new u(n,t,-1),o=i.pswp?i.pswp.viewportSize:function(t,i){if(t.getViewportSizeFn){const s=t.getViewportSizeFn(t,i);if(s)return s}return{x:document.documentElement.clientWidth,y:window.innerHeight}}(n,i);const r=function(t,i,s,h){return{x:i.x-c(\"left\",t,i,s,h)-c(\"right\",t,i,s,h),y:i.y-c(\"top\",t,i,s,h)-c(\"bottom\",t,i,s,h)}}(n,o,t,s);e.update(h.width,h.height,r)}return h.lazyLoad(),e&&h.setDisplayedSize(Math.ceil(h.width*e.initial),Math.ceil(h.height*e.initial)),h}return class extends class extends class{constructor(){this.u={},this.p={},this.pswp=void 0,this.options=void 0}addFilter(t,i,s=100){var h,e,n;this.p[t]||(this.p[t]=[]),null===(h=this.p[t])||void 0===h||h.push({fn:i,priority:s}),null===(e=this.p[t])||void 0===e||e.sort(((t,i)=>t.priority-i.priority)),null===(n=this.pswp)||void 0===n||n.addFilter(t,i,s)}removeFilter(t,i){this.p[t]&&(this.p[t]=this.p[t].filter((t=>t.fn!==i))),this.pswp&&this.pswp.removeFilter(t,i)}applyFilters(t,...i){var s;return null===(s=this.p[t])||void 0===s||s.forEach((t=>{i[0]=t.fn.apply(this,i)})),i[0]}on(t,i){var s,h;this.u[t]||(this.u[t]=[]),null===(s=this.u[t])||void 0===s||s.push(i),null===(h=this.pswp)||void 0===h||h.on(t,i)}off(t,i){var s;this.u[t]&&(this.u[t]=this.u[t].filter((t=>i!==t))),null===(s=this.pswp)||void 0===s||s.off(t,i)}dispatch(t,i){var s;if(this.pswp)return this.pswp.dispatch(t,i);const h=new l(t,i);return null===(s=this.u[t])||void 0===s||s.forEach((t=>{t.call(this,h)})),h}}{getNumItems(){var t;let i=0;const s=null===(t=this.options)||void 0===t?void 0:t.dataSource;s&&\"length\"in s?i=s.length:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),s.items&&(i=s.items.length));const h=this.dispatch(\"numItems\",{dataSource:s,numItems:i});return this.applyFilters(\"numItems\",h.numItems,s)}createContentFromData(t,i){return new d(t,this,i)}getItemData(t){var i;const s=null===(i=this.options)||void 0===i?void 0:i.dataSource;let h={};Array.isArray(s)?h=s[t]:s&&\"gallery\"in s&&(s.items||(s.items=this.v(s.gallery)),h=s.items[t]);let e=h;e instanceof Element&&(e=this.m(e));const n=this.dispatch(\"itemData\",{itemData:e||{},index:t});return this.applyFilters(\"itemData\",n.itemData,t)}v(t){var i,s;return null!==(i=this.options)&&void 0!==i&&i.children||null!==(s=this.options)&&void 0!==s&&s.childSelector?o(this.options.children,this.options.childSelector,t)||[]:[t]}m(t){const i={element:t},s=\"A\"===t.tagName?t:t.querySelector(\"a\");if(s){i.src=s.dataset.pswpSrc||s.href,s.dataset.pswpSrcset&&(i.srcset=s.dataset.pswpSrcset),i.width=s.dataset.pswpWidth?parseInt(s.dataset.pswpWidth,10):0,i.height=s.dataset.pswpHeight?parseInt(s.dataset.pswpHeight,10):0,i.w=i.width,i.h=i.height,s.dataset.pswpType&&(i.type=s.dataset.pswpType);const e=t.querySelector(\"img\");var h;if(e)i.msrc=e.currentSrc||e.src,i.alt=null!==(h=e.getAttribute(\"alt\"))&&void 0!==h?h:\"\";(s.dataset.pswpCropped||s.dataset.cropped)&&(i.thumbCropped=!0)}return this.applyFilters(\"domItemData\",i,t,s)}lazyLoadData(t,i){return p(t,this,i)}}{constructor(t){super(),this.options=t||{},this.g=0,this.shouldOpen=!1,this._=void 0,this.onThumbnailsClick=this.onThumbnailsClick.bind(this)}init(){o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.addEventListener(\"click\",this.onThumbnailsClick,!1)}))}onThumbnailsClick(t){if(function(t){return\"button\"in t&&1===t.button||t.ctrlKey||t.metaKey||t.altKey||t.shiftKey}(t)||window.pswp)return;let i={x:t.clientX,y:t.clientY};i.x||i.y||(i=null);let s=this.getClickedIndex(t);s=this.applyFilters(\"clickedIndex\",s,t,this);const h={gallery:t.currentTarget};s>=0&&(t.preventDefault(),this.loadAndOpen(s,h,i))}getClickedIndex(t){if(this.options.getClickedIndexFn)return this.options.getClickedIndexFn.call(this,t);const i=t.target,s=o(this.options.children,this.options.childSelector,t.currentTarget).findIndex((t=>t===i||t.contains(i)));return-1!==s?s:this.options.children||this.options.childSelector?-1:0}loadAndOpen(t,i,s){if(window.pswp||!this.options)return!1;if(!i&&this.options.gallery&&this.options.children){const t=o(this.options.gallery);t[0]&&(i={gallery:t[0]})}return this.options.index=t,this.options.initialPointerPos=s,this.shouldOpen=!0,this.preload(t,i),!0}preload(t,i){const{options:s}=this;i&&(s.dataSource=i);const h=[],e=typeof s.pswpModule;if(\"function\"==typeof(n=s.pswpModule)&&n.prototype&&n.prototype.goTo)h.push(Promise.resolve(s.pswpModule));else{if(\"string\"===e)throw new Error(\"pswpModule as string is no longer supported\");if(\"function\"!==e)throw new Error(\"pswpModule is not valid\");h.push(s.pswpModule())}var n;\"function\"==typeof s.openPromise&&h.push(s.openPromise()),!1!==s.preloadFirstSlide&&t>=0&&(this._=function(t,i){const s=i.getItemData(t);if(!i.dispatch(\"lazyLoadSlide\",{index:t,itemData:s}).defaultPrevented)return p(s,i,t)}(t,this));const o=++this.g;Promise.all(h).then((t=>{if(this.shouldOpen){const i=t[0];this.I(i,o)}}))}I(t,i){if(i!==this.g&&this.shouldOpen)return;if(this.shouldOpen=!1,window.pswp)return;const s=\"object\"==typeof t?new t.default(this.options):new t(this.options);this.pswp=s,window.pswp=s,Object.keys(this.u).forEach((t=>{var i;null===(i=this.u[t])||void 0===i||i.forEach((i=>{s.on(t,i)}))})),Object.keys(this.p).forEach((t=>{var i;null===(i=this.p[t])||void 0===i||i.forEach((i=>{s.addFilter(t,i.fn,i.priority)}))})),this._&&(s.contentLoader.addToCache(this._),this._=void 0),s.on(\"destroy\",(()=>{this.pswp=void 0,delete window.pswp})),s.init()}destroy(){var t;null===(t=this.pswp)||void 0===t||t.destroy(),this.shouldOpen=!1,this.u={},o(this.options.gallery,this.options.gallerySelector).forEach((t=>{t.removeEventListener(\"click\",this.onThumbnailsClick,!1)}))}}}));\n","var AMURL = {\n    build: function(parts) {\n        var url = parts.path;\n\n        parts.querystring = parts.querystring.replace('?', '');\n        if (parts.querystring !== '') {\n            url += '?' + parts.querystring;\n        }\n\n        parts.hash = parts.hash.replace('#', '');\n        if (parts.hash !== '') {\n            url += '#' + parts.hash;\n        }\n\n        return url;\n    },\n\n    parts: function(url) {\n        var parts = url.toString().split('#');\n        url = parts[0];\n        var hash = parts.length > 1 ? '#' + parts[1] : '';\n\n        parts = url.split('?');\n        var path = parts[0];\n        var qs   = parts.length > 1 ? parts[1] : '';\n\n        return {'path': path, 'querystring': qs, 'hash': hash};\n    },\n\n    paramsToQueryString: function(params) {\n        var pairs = [];\n        for (var key in params) {\n            var val = params[key];\n\n            if (key != '' && val != null && val != undefined && val != '') {\n                pairs.push(key + '=' + params[key]);\n            }\n        }\n\n        if (pairs.length > 0) {\n            return '?' + pairs.join('&');\n        } else {\n            return '';\n        }\n    },\n\n\n    queryStringToParams: function(queryString) {\n        if (queryString.indexOf('?') > -1) {\n            var queryString = queryString.split('?')[1];\n        }\n\n        var pairs = queryString.split('&');\n\n        params = [];\n        for (var i=0; i<pairs.length; i++) {\n            var pair = pairs[i].split('=');\n            params[pair[0]] = pair[1];\n        }\n\n        return params;\n    },\n\n    setQueryStringParam: function(queryString, key, value) {\n        var params = this.queryStringToParams(queryString);\n        params[key] = value;\n        return this.paramsToQueryString(params);\n    }\n};\n","var STATE = {\n    params: null,\n    enabled: true,\n\n    disable: function() {\n        this.enabled = false;\n    },\n\n    enable: function() {\n        this.enabled = true;\n    },\n\n    getParams: function(force) {\n        if (this.params == null || force) {\n            var query = window.location.search.substring(1);\n            this.params = AMURL.queryStringToParams(query);\n        }\n\n        return this.params;\n    },\n\n    getChanged: function() {\n        var oldParams = this.params;\n        this.getParams(true);\n        var changed = [];\n\n        if (oldParams) {\n            for (var key in this.params) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n\n            for (var key in oldParams) {\n                if (this.params[key] != oldParams[key]) {\n                    changed[key] = this.params[key];\n                }\n            }\n        } else {\n            changed = this.params;\n        }\n\n        return changed;\n    },\n\n    setParam: function(key, val) {\n        this.getParams();\n\n        if (val == null) {\n            delete this.params[key];\n        } else {\n            this.params[key] = val;\n        }\n\n        return this;\n    },\n\n    setState: function(state) {\n        var pair = state.split('=');\n        var key = pair[0];\n        var val = pair[1];\n\n        this.setParam(key, val);\n\n        return this;\n    },\n\n    setHash: function(hash) {\n        if (hash.indexOf('#') == -1) {\n            hash = '#' + hash;\n        }\n\n        var url = window.location.protocol + '//' + window.location.hostname + window.location.pathname + window.location.search + hash;\n\n        if (window.location != url) {\n            history.pushState({}, null, url);\n        }\n    },\n\n    getUrl: function() {\n        var url = AMURL.parts(window.location);\n        this.getParams();\n        url.querystring = AMURL.paramsToQueryString(this.params);\n\n        return url.path + url.querystring + url.hash;\n    },\n\n    pushUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            if (window.location != url) {\n                history.pushState({}, null, url);\n            }\n        }\n\n        return this;\n    },\n\n    replaceUrl: function(url) {\n        if (this.enabled) {\n            if (url == undefined) {\n                url = this.getUrl();\n            }\n\n            history.replaceState({}, null, url);\n        }\n\n        return this;\n    },\n\n    getStorage: function($option, name) {\n        if ($option.hasClass('js-store_state')) {\n            return localStorage[name];\n        } else {\n            return sessionStorage[name];\n        }\n    },\n\n    save: function($option) {\n        if (!this.enabled) {\n            return;\n        }\n\n        var name  = undefined;\n        var value = undefined;\n\n\n        if ($option.data('state')) {\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n\n            if ($option.hasClass('js-toggle_active')) {\n                var activate_sel = $option.data('activate');\n                var $activate    = activate_sel ? $(activate_sel) : $option;\n\n                if (!$activate.hasClass('js-is_active')) {\n                    value = undefined;\n                }\n            }\n        } else {\n            name  = $option.prop('name');\n            value = $option.val();\n\n            if ($option.prop('tagName') == 'INPUT') {\n                var type  = $option.prop('type');\n\n                if ((type == 'checkbox' || type == 'radio') && $option.not(':checked')) {\n                    value = undefined;\n                }\n            }\n        }\n\n        if ($option.hasClass('js-history_state')) {\n            STATE.setParam(name, value);\n            STATE.pushUrl();\n        }\n\n        if ($option.hasClass('js-store_state')) {\n            localStorage.setItem(name, value);\n        }\n\n        if ($option.hasClass('js-session_state')) {\n            sessionStorage.setItem(name, value);\n        }\n    },\n\n    load: function(scope) {\n        var $scope = $(scope);\n\n        this.disable();\n\n        $scope.find('a.js-store_state, a.js-session_state, button.js-store_state, button.js-session_state').each(function() {\n            var $option = $(this);\n            var s = $option.data('state').split('=');\n            name  = s[0];\n            value = s[1];\n            var stored  = STATE.getStorage($option, name);\n\n            if (value == stored) {\n                $option.trigger('click');\n            }\n        });\n\n        $scope.find('input.js-store_state, input.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var type    = $option.prop('type');\n            var value   = $option.val();\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                if (type == 'checkbox' || type == 'radio') {\n                    if (value == stored) {\n                        $option.trigger('click');\n                    }\n                } else {\n                    $option.val(stored).trigger('change');\n                }\n            }\n        });\n\n        $scope.find('select.js-store_state, select.js-session_state').each(function() {\n            var $option = $(this);\n            var name    = $option.prop('name');\n            var stored  = STATE.getStorage($option, name);\n\n            if (stored != undefined) {\n                $option.val(stored).trigger('change');\n            }\n        });\n\n        var changed = this.getChanged();\n\n        for (var key in changed) {\n            var val = changed[key];\n            if (val == null || val == undefined) {\n                val = '';\n            }\n            var kav = key + '=' + val;\n            var triggered = false;\n\n            $scope.find('a.js-history_state[data-state=\"' + kav + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            if (val == '') {\n                // no matches for no value, so maybe it's just the default option like house fabric\n                $scope.find('a.js-history_state[data-state^=\"' + kav + '\"]:first').each(function() {\n                    triggered  = true;\n                    $(this).trigger('click');\n                });\n\n                if (triggered) {\n                    continue;\n                }\n            }\n\n            $scope.find('input.js-history_state[name=\"' + key + '\"][value=\"' + val + '\"]').each(function() {\n                triggered  = true;\n                $(this).trigger('click');\n            });\n\n            if (triggered) {\n                continue;\n            }\n\n            $scope.find('select.js-history_state[name=\"' + key + '\"]:first').each(function() {\n                triggered  = true;\n                $(this).val(val).trigger('change');\n            });\n        }\n\n        this.enable();\n    },\n\n    loadHandlers: function(scope) {\n        var $scope = $(scope);\n\n        $scope.find('.js-history_state, .js-store_state, .js-session_state').each(function() {\n            var option  = this;\n            var $option = $(this);\n\n            if (option.tagName == 'A' || option.tagName == 'BUTTON') {\n                $option.on('click _update', function(e) {\n                    e.preventDefault();\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'INPUT') {\n                $option.on('change _update', function(e) {\n                    STATE.save($option);\n                });\n            }\n\n            if (option.tagName == 'SELECT') {\n                $option.on('change _update', function(e, initial) {\n                    if (initial) {\n                        // change is called by selectReplace on page load - not a real 'change' so ignore\n                        return;\n                    }\n                    STATE.save($option);\n                });\n            }\n        });\n\n        STATE.load(scope);\n    }\n};\n\n$(function () {\n    // eg $('#simplemodal-container').trigger('_loadHandlers');\n    $(document).on('_loadHandlers', function(e) {\n        STATE.loadHandlers(e.target);\n    });\n\n    STATE.loadHandlers(document);\n});\n","function updateHeaderBasket(price, qty) {\n    $('.header__nav__item--basket, .header__basket').each(function() {\n        $('.tag', $(this)).html(qty);\n        $('.header__basket__price', $(this)).html(price);\n    });\n}\n\nfunction disableCheckoutButton(disable) {\n    $('.basket__checkout a').toggleClass('button--disabled', disable);\n}\n\nfunction checkMaxStock() {\n\n    var disableButton = false;\n\n    $('.basket__qty__input').each(function () {\n        var input = $(this);\n        var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n        if (maximum !== false) {\n            if (parseFloat(input.val()) > maximum) {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").show()\n                disableButton = true;\n            } else {\n                input.closest( \".basket__item\" ).find(\".basket__detail__stock-warning\").hide()\n            }\n        }\n    })\n\n    if (disableButton === true) {\n        disableCheckoutButton(true);\n    } else {\n        disableCheckoutButton(false);\n    }\n}\n\nvar basketChange;\nvar basketChangeTimeout;\nvar updateBufferTime = 2000;\n\n$(document).on('change', '.basket__qty__input', function() {\n    clearTimeout(basketChangeTimeout);\n    basketChangeTimeout = setTimeout(function(){\n        if (basketChange != null) {\n            basketChange.abort();\n        }\n        basketChange = $.ajax('/basket/update', {\n            type: 'POST',\n            data: $('.basket__table input').serialize(),\n            success: function(data) {\n                if (data.result) {\n                    $('.basket__wrapper').html(data.payload.table);\n                }\n                updateHeaderBasket(data.payload.price, data.payload.qty);\n                checkMaxStock();\n            }\n        });\n    }, 1000)\n});\n\ncheckMaxStock();\n","var sliders = {};\nvar sliding = false;\nvar filterUrl = null;\n\nfunction updateAjax(url) {\n    $.ajax(url, {\n        success: function(data) {\n            window.history.pushState(null, null, url);\n            filterUrl = url;\n            var grid = $('#products_container');\n            grid.find('.product-listing').addClass('product-listing--to-load');\n\n            setTimeout(function(){\n                grid.replaceWith(data.payload.html);\n                if (typeof AndrewMartin.listingItem == 'undefined') {\n                    AndrewMartin.listingItem = new ListingItem();\n                }\n                AndrewMartin.listingItem.init();\n\n                $('#product_fromitemnum').text(data.payload.fromItemNum);\n                $('#product_toitemnum').text(data.payload.toItemNum);\n                $('.product_count').text(data.payload.productCount);\n                if ($('.filterable').hasClass('filterable--active')) {\n                    $('[hide-from-filters]').addClass('hide-from-filters');\n                }\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n                handlePaintLinks();\n            }, 300);\n        }\n    });\n}\n\nwindow.onpopstate = function(event) {\n    if (filterUrl && filterUrl !== document.location.pathname + document.location.search) {\n        document.location.reload();\n    }\n};\n\ncheckFilterCount();\n\n$(document).on('change', '.filterable :input:not(.filterable--ignore)', function () {\n\n    if (this.getAttribute('data-validation')) {\n        // If value is not a number, set it to the minimum value\n        if (isNaN(parseInt(this.value))) {\n            if (this.hasAttribute('min')) {\n                this.value = this.min;\n            } else {\n                this.value = 0;\n            }\n        }\n\n        // If value is lower than the minimum value, set it to the minimum value\n        if (this.hasAttribute('min')) {\n            if (parseInt(this.value) < parseInt(this.min)) {\n                this.value = this.min;\n            }\n        }\n\n        // If value is higher than the maximum value, set it to the maximum value\n        if (this.hasAttribute('max')) {\n            if (parseInt(this.value) > parseInt(this.max)) {\n                this.value = this.max;\n            }\n        }\n    }\n\n    if ($(this).parents('.js-filter-ranges').length > 0) {\n        new updateFilterRanges($(this).parents('.js-filter-ranges'));\n    }\n\n    var url = '';\n    var form = $('#filters_form');\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore), .filterable .filterable__option :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        var tag = $(this).prop('tagName');\n        var type = $(this).prop('type');\n        var valid = false;\n\n        if (key && value) {\n            if (tag == 'SELECT') {\n                valid = true;\n            } else if (tag == 'INPUT') {\n                if (type == 'radio' || type == 'checkbox') {\n                    if ($(this).is(':checked')) {\n                        valid = true;\n                    }\n                } else {\n                    valid = true;\n                }\n            }\n\n            if (valid) {\n                if (Array.isArray(value)) {\n                    for (var i = 0; i < value.length; i++) {\n                        (function(i) {\n                            if (url == '') {\n                                url += '?';\n                            } else {\n                                url += '&';\n                            }\n                            url += key + '[]=' + encodeURIComponent(value[i]);\n                        })(i);\n                    }\n                } else {\n                    if (rangeIsDefault($(this))) {\n                        return;\n                    }\n                    if (url == '') {\n                        url += '?';\n                    } else {\n                        url += '&';\n                    }\n                    url += key + '=' + encodeURIComponent(value);\n                }\n            }\n        }\n    });\n\n    checkFilterCount();\n\n    url = window.location.pathname + url;\n\n    $('#products_container').addClass('product-listing--loading');\n\n    // If a related slider exists, then update it\n    if (this.getAttribute('data-field')) {\n        var field = this.getAttribute('data-field');//.split('---');\n        var slider = sliders[field];\n\n        if (slider) {\n            if (!sliding) {\n                var values = this.getAttribute('data-value') == 'min' ? [this.value, null] : [null, this.value];\n                slider.noUiSlider.set(values);\n            }\n            sliding = false;\n        }\n    }\n\n    clearTimeout(form.data('timer'));\n    form.data('timer', setTimeout(function() {\n        updateAjax(url);\n    }, 750));\n});\n\n$('.js-filter-ranges').each(function() {\n    new updateFilterRanges($(this));\n});\n\nfunction updateFilterRanges(el) {\n    this.selected = {};\n    this.allRanges = {};\n    this.el = el;\n\n    var self = this;\n\n    this.updateFilterRangesOverview = function() {\n       this.el.find(':input:not(.filterable--ignore)').each(function() {\n            var value = $(this).attr('data-value');\n            var column = $(this).attr('data-column');\n            if (!rangeIsDefault($(this))) {\n                if (!self.selected[column]) {\n                    self.selected[column] = {};\n                }\n                self.selected[column][value] = $(this).val();\n            }\n            if (!self.allRanges[column]) {\n                self.allRanges[column] = {};\n            }\n            self.allRanges[column][value] = $(this).val();\n        });\n\n        if (Object.keys(this.selected).length > 0) {\n            this.el.addClass('filter-ranges--selected');\n        } else {\n            this.el.removeClass('filter-ranges--selected');\n        }\n\n        var label = Object.keys(this.selected).length > 0 ? Object.keys(this.selected).length + ' selected' : 'Select&hellip;';\n\n        this.el.find('.js-filter-ranges__overview').html(label);\n    }\n\n    this.updateFilterRangesSelection = function() {\n        var keys = Object.keys(this.selected);\n        var label = '';\n\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                var values = self.allRanges[keys[i]];\n                label += self.capitalize(keys[i]) + ': ' + values.min + '-' + values.max + 'cm';\n\n                if (i < keys.length - 1) {\n                    label += ', ';\n                }\n            })(i);\n        }\n\n        this.el.find('.js-filter-ranges__selection').html(label);\n        this.el.find('.js-filter-ranges__selection-mobile').html(keys.length);\n        this.el.find('.js-filterable__count').html(keys.length ? '(' + keys.length + ')' : '');\n\n        if (keys.length) {\n            this.el.parents('.filterable__dimension').addClass('filterable__dimension--has-selection');\n        } else {\n            this.el.parents('.filterable__dimension').removeClass('filterable__dimension--has-selection');\n        }\n    }\n\n    this.capitalize = function(string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n\n    this.updateFilterRangesOverview();\n    this.updateFilterRangesSelection();\n\n    $(document).on('click', '.js-filter-ranges__clear', function(e) {\n        sliding = true;\n\n        self.el.find('.js-filter-range__slider').each(function() {\n            var range = this.noUiSlider.options.range;\n            this.noUiSlider.set([range.min, range.max]);\n        });\n    });\n}\n\n// Toggle visibility of the clicked filter range\n$(document).on('click', '.js-filter-ranges__top', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    if (el.hasClass('filter-ranges--active')) {\n        deactivateFilterRanges(el);\n    } else {\n        activateFilterRanges(el);\n    }\n});\n\n$(document).on('click', '.js-filter-ranges__back', function(e) {\n    var el = $(this).closest('.js-filter-ranges');\n    deactivateFilterRanges(el);\n});\n\n$(document).on('click', '.js-filter-ranges label', function(e) {\n    var el = $(this).closest('.js-filter-ranges').find('.js-filter-ranges__top');\n    el.trigger('click');\n});\n\n// Deactivate any active filter ranges when document is clicked\n$(document).on('click', function(e) {\n    var el = e.target.closest('.js-filter-ranges');\n\n    if (!el && $('.filter-ranges--active').length) {\n        $('.js-filter-ranges').removeClass('filter-ranges--active');\n    }\n});\n\nfunction rangeIsDefault(el) {\n    return (el.attr('data-value') == 'min' && el.val() == el.attr('min')) || (el.attr('data-value') == 'max' && el.val() == el.attr('max'))\n}\n\n$(document).on('click', '.js-filterable-toggle', function(e) {\n    e.preventDefault();\n    $('.filterable').toggleClass('filterable--active');\n    $('#filters_form').toggleClass('filterable--absolute');\n    $('.footer').toggleClass('hide-from-filters');\n    if ($('.filterable').hasClass('filterable--active')) {\n        $('[hide-from-filters]').addClass('hide-from-filters');\n    } else {\n        $('[hide-from-filters]').removeClass('hide-from-filters');\n        deactivateFilterRanges($('.js-filter-ranges'));\n    }\n});\n\n$(document).on('click', function(e) {\n\n    if (!(e.target.closest('.js-filter-ranges'))) {\n        deactivateFilterRanges($('.js-filter-ranges'))\n    }\n})\n\nfunction activateFilterRanges(el) {\n    el.addClass('filter-ranges--active');\n    el.parents('.filterable__dimension').addClass('filterable__dimension--active');\n    el.parents('.filterable__content').addClass('filterable__content--active');\n}\n\nfunction deactivateFilterRanges(el) {\n    el.removeClass('filter-ranges--active');\n    el.parents('.filterable__dimension').removeClass('filterable__dimension--active');\n    el.parents('.filterable__content').removeClass('filterable__content--active');\n}\n\n// Check the number of filters that have been set\nfunction checkFilterCount() {\n    var filterCount = [];\n\n    $('.filterable .filterable__dimension :input:not(.filterable--ignore)').each(function() {\n        var key = this.name;\n        var value = $(this).val();\n        if (key && value) {\n            if (Array.isArray(value)) {\n                for (var i = 0; i < value.length; i++) {\n                    (function(i) {\n                        var filterType = key;\n\n                        if (filterCount.indexOf(filterType) == -1) {\n                            filterCount.push(filterType);\n                        }\n                    })(i);\n                }\n            } else {\n                if (rangeIsDefault($(this))) {\n                    return;\n                }\n\n                var filterType = $(this).attr('data-dimension');\n\n                if (filterCount.indexOf(filterType) == -1) {\n                    filterCount.push(filterType);\n                }\n            }\n        }\n    });\n\n    if (filterCount.length > 0) {\n        $('.filterable').addClass('filterable--has-filter-selected');\n    } else {\n        $('.filterable').removeClass('filterable--has-filter-selected');\n    }\n\n    $('.js-filterable__total-count').html(filterCount.length);\n}\n\n$(function() {\n    var windowResizing;\n    var mode;\n    var oldMode;\n\n    function moveElement() {\n        mode = window.matchMedia('(max-width: 580px)').matches ? 'mobile' : 'desktop';\n\n        if (mode != oldMode) {\n            var from = 'desktop';\n            var to = 'mobile';\n\n            if (mode == 'desktop') {\n                from = 'mobile';\n                to = 'desktop';\n            }\n\n            $('.js-moveable-content[data-visible=\"' + from + '\"]').children().eq(0).appendTo($('.js-moveable-content[data-visible=\"' + to + '\"]'));\n        }\n\n        oldMode = mode;\n    }\n\n    moveElement();\n\n    $(window).on('resize', function() {\n        clearTimeout(windowResizing);\n        windowResizing = setTimeout(function() {\n            moveElement();\n        }, 100);\n    });\n});\n\n$(function() {\n    var slider = document.querySelectorAll('.js-filter-range__slider');\n    var setBoth = document.querySelectorAll('.js-filter-range__set-both');\n    var input = document.querySelectorAll('.js-filter-range__input');\n    var allowed = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57] // 0-9\n    var range = {};\n\n    for (var i = 0; i < input.length; i++) {\n        (function(i) {\n            input[i].setAttribute('data-validation', 'number');\n            input[i].type = 'text';\n\n            input[i].onfocus = function() {\n                this.onkeypress = function(e) {\n                    // If the key is not in the array of allowed keys, then prevent it\n                    if (allowed.indexOf(e.charCode) == -1) {\n                        e.preventDefault();\n                    }\n                }\n            }\n\n            var dimension = input[i].getAttribute('data-dimension');\n            var column = input[i].getAttribute('data-column');\n            var min = input[i].getAttribute('min');\n            var max = input[i].getAttribute('max');\n\n            range[dimension + '-' + column] = {\n                'min': parseInt(min),\n                'max': parseInt(max)\n            };\n        })(i);\n    }\n\n    for (var i = 0; i < setBoth.length; i++) {\n        (function(i) {\n            var field = setBoth[i].getAttribute('data-field');\n            var minInput = document.querySelector('.js-filter-range__input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('.js-filter-range__input[data-value=\"max\"][data-field=\"' + field + '\"]');\n\n            setBoth[i].onchange = function() {\n                var range = this.value.split('-');\n                minInput.value = range[0];\n                maxInput.value = range[1];\n\n                $(minInput).change();\n                $(maxInput).change();\n            }\n        })(i);\n    }\n\n    for (var i = 0; i < slider.length; i++) {\n        (function(i) {\n            var field = slider[i].getAttribute('data-field');\n            var minInput = document.querySelector('input[data-value=\"min\"][data-field=\"' + field + '\"]');\n            var maxInput = document.querySelector('input[data-value=\"max\"][data-field=\"' + field + '\"]');\n            var params = {\n                start: [\n                    minInput.value,\n                    maxInput.value\n                ],\n                range: range[field],\n                format: wNumb({\n                    decimals: 0\n                }),\n                step: 1,\n                connect: true\n            }\n\n            noUiSlider.create(slider[i], params);\n\n            slider[i].noUiSlider.on('update', function(values, handle) {\n                var value = handle == 1 ? 'max' : 'min';\n                var input = document.querySelector('input[data-value=\"' + value + '\"][data-field=\"' + field + '\"]');\n\n                input.value = values[handle];\n\n                if (sliding) {\n                    $(input).change();\n                }\n            });\n\n            slider[i].noUiSlider.on('slide', function(values, handle) {\n                sliding = true;\n            });\n\n            sliders[slider[i].getAttribute('data-field')] = slider[i];\n        })(i);\n    }\n})\n","$('.js-grid-load-more').click(function(e) {\n    e.preventDefault();\n\n    var grid = $(this).siblings('.wrap').find('.grid');\n    var current = $(this).addClass('load-more--loading');\n\n    $.ajax($(this).attr('href'), {\n        success: function(data) {\n            grid.children(':hidden').children('.product-listing').addClass('product-listing--to-load');\n\n            grid.children().removeClass('s-hidden-true m-hidden-true ph-hidden-true ml-hidden-true l-hidden-true');\n            grid.append(data.payload.html);\n\n            url = new URL(window.location.href);\n\n            load_more = url.searchParams.get('load_more');\n            if (!load_more) {\n                load_more = 1;\n            }\n            load_more++;\n            url.searchParams.set('load_more', load_more);\n\n            window.history.pushState({load_more: load_more}, document.title, url.toString());\n\n            if (data.payload.page && data.payload.more) {\n                current.attr('href', data.payload.more).removeClass('load-more--loading');\n            } else {\n                current.remove();\n            }\n            setTimeout(function(){\n                $('.product-listing--to-load').removeClass('product-listing--to-load');\n            }, 100);\n        }\n    });\n});\n","var initProductGallery = function() {\n    var gallery = $('.product__gallery .product__photo');\n    var videoContainer = $('.product__gallery .product__video');\n    var video = $('.product__gallery .product__video video');\n    var thumbnail = $('.product__thumbnail');\n    var className = 'product__thumbnail--active';\n\n    if (!gallery.length) {\n        return;\n    }\n\n    if (video.length > 0) {\n        var player = videojs(video[0].id);\n    }\n\n    function update(i) {\n        thumbnail.eq(i).addClass(className);\n    }\n\n    function watchVideo() {\n        if (video.length > 0) {\n            player.aspectRatio('1:1');\n            // Not using the `video` variable as slick removes the DocElement and re-adds so breaks this listener\n            gallery.on('touchend click', '.product__video video', function(e) {\n                if (player.paused()) {\n                    playVideo();\n                } else {\n                    pauseVideo()\n                }\n            });\n        }\n    }\n\n    function playVideo() {\n        player.play();\n        videoContainer.addClass('product__video--playing');\n    }\n\n    function pauseVideo() {\n        player.pause();\n        videoContainer.removeClass('product__video--playing');\n    }\n\n    gallery.on('init', function() {\n        update(0);\n        watchVideo();\n\n        if (window.matchMedia('(min-width: 999px)').matches) {\n            $('.zoom--pdp').zoom({\n                canvas: '.zoom__canvas--pdp',\n                trigger: '.zoom__trigger--pdp',\n                backdrop: '.zoom__backdrop--pdp',\n            });\n        }\n    });\n    gallery.on('afterChange', function() {\n        $('.' + className).removeClass(className);\n        update($(this).slick('slickCurrentSlide'));\n        if (player) {\n            if (!player.paused()) {\n                pauseVideo();\n            }\n        }\n    });\n    thumbnail.on('click', function() {\n        gallery.slick('slickGoTo', $(this).index());\n    });\n\n    gallery.slick({\n        nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n        prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n        dots: true\n    });\n\n    $('button', gallery).click(function(e) {\n        e.preventDefault();\n    });\n};\n\ninitProductGallery();\n\nvar initGalery = function() {\n    var gallery = $('.carousel');\n    gallery.each(function() {\n        var el = $(this);\n        var infinite = el.data('noloop') == undefined;\n        var img = $('.carousel__item', el);\n\n        el.on('init', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.on('afterChange', function(e, slick) {\n            updateArrows(slick.currentSlide + 1, slick.slideCount);\n        });\n\n        el.slick({\n            nextArrow: '<button class=\"slick-arrow slick-next\">' +\n            '<svg class=\"icon-arrow-large-right\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-right\" />' +\n            '</svg>' +\n            '</button>',\n            prevArrow: '<button class=\"slick-arrow slick-prev\">' +\n            '<svg class=\"icon-arrow-large-left\">' +\n            '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-arrow-large-left\" />' +\n            '</svg>' +\n            '</button>',\n            dots: true,\n            infinite: infinite\n        });\n\n        function updateArrows(current, total) {\n            if (current == 1) {\n                el.addClass('carousel--at-start');\n            } else {\n                el.removeClass('carousel--at-start');\n            }\n\n            if (current == total) {\n                el.addClass('carousel--at-end');\n            } else {\n                el.removeClass('carousel--at-end');\n            }\n        }\n    });\n};\n\ninitGalery();\n\n$(function () {\n    if (document.getElementById('js-haze_viewer') !== null) {\n        if (window.HAZE !== undefined) {\n            HAZE.instantiate('js-haze_viewer', 'gallery', window.hazeGallery);\n            console.log('HAZE', 'Haze gallery will initialize on page load');\n            return;\n        } else {\n            console.error('HAZE is not defined (gallery.js)');\n        }\n    } else if (window.matchMedia('(max-width: 999px)').matches) {\n        const popupScroll = document.querySelector('.js-haze-popup');\n        $(document).on('click', '.js-haze-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $($button.data('popup'));\n\n            /** Apparently the viewer is binned off from the DOM by slick :D */\n            // var $hazeLocation = document.getElementById('js-haze_viewer_location');\n            // var $haze = document.getElementById($button.data('haze'));\n            // $haze.appendTo($hazeLocation);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (document.getElementById('js-haze_mobile') !== null) {\n                if (window.HAZE !== undefined) {\n                    HAZE.instantiate('js-haze_mobile', 'gallery', window.hazeGallery);\n                }\n\n                if (window.matchMedia('(max-width: 999px)').matches) {\n                    scrollLock.disablePageScroll(popupScroll);\n                }\n            }\n        });\n\n        $(document).on('click', '.js-haze-close', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup = $button.closest('.js-haze-popup');\n            $popup.fadeOut('fast');\n\n            scrollLock.enablePageScroll(popupScroll);\n        });\n    }\n\n    if (window.CYLINDO !== undefined) {\n        const popupScroll = document.querySelector('.js-cylindo-popup');\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            CYLINDO.instantiate('js-cylindo_mobile', 'mobile-popup', window.cylindoGallery);\n        } else {\n            CYLINDO.instantiate('js-cylindo_viewer', 'gallery', window.cylindoGallery);\n        }\n\n        $(document).on('click', '.js-cylindo-open', function(e) {\n            e.preventDefault();\n\n            var $button = $(this);\n            var $popup   = $($button.data('popup'));\n            var $cylindo = $($button.data('cylindo'));\n\n            $cylindo.appendTo($popup);\n\n            $popup.appendTo('body').fadeIn('fast');\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                scrollLock.disablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-close', function(e) {\n            e.preventDefault();\n\n            // Add unzoom functionality to the back button for mobile\n\n            if (document.querySelector('html').classList.contains('cylindo-zoom')) {\n                var cylindo = $(this).data('cylindo-mobile');\n\n                CYLINDO.zoom(cylindo, false);\n            } else {\n                var $button = $(this);\n                var $popup = $button.closest('.js-cylindo-popup');\n                $popup.fadeOut('fast');\n\n                scrollLock.enablePageScroll(popupScroll);\n            }\n        });\n\n        $(document).on('click', '.js-cylindo-zoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, true);\n        });\n\n        $(document).on('click', '.js-cylindo-unzoom', function(e) {\n            e.preventDefault();\n\n            var cylindo;\n\n            if (window.matchMedia('(max-width: 999px)').matches) {\n                cylindo = $(this).data('cylindo-mobile');\n            } else {\n                cylindo = $(this).data('cylindo');\n            }\n\n            CYLINDO.zoom(cylindo, false);\n        });\n    }\n});\n","var newsletter;\n$(document).on('submit', '.signup-form', function(e) {\n    e.preventDefault();\n\n    var form = this;\n\n    if (newsletter != null) {\n        newsletter.abort();\n    }\n    newsletter = $.ajax($(this).attr('action'), {\n        type: $(this).attr('method'),\n        data: $(this).serialize(),\n        success: function(data) {\n            if (data.result) {\n                $(form).fadeTo(400, 0, function() {\n                    $(form).parent().append('<label class=\"signup-form__thanks\">Thank you</label>');\n                });\n            }\n        }\n    });\n});\n","// $('.js-kit-price input').on('change', function() {\n//     var input = $(this);\n//     var sku = input.data('frame-sku');\n\n//     var form = $('#basket-add');\n//     form.find('button.product__button').prop('disabled', 'disabled');\n\n//     $.ajax('/products/kit-price', {\n//         type: 'post',\n//         data: $('.product-piece input').serialize(),\n//         success: function(data) {\n//             form.find(\"input.\" + sku).val(input.val());\n\n//             if (typeof(fdPrice) != 'undefined') {\n//                 fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n//                 updateFinancing();\n//                 initPopups();\n//             }\n\n//             $('.product__total-price span.value').html(data.payload.price);\n\n//             if (data.payload.price_raw > 0) {\n//                 form.find('button.product__button').prop('disabled', false).removeClass('button--disabled');\n//                 $('.product__total-price').show();\n//                 $('.product__finance-option').show();\n//             } else {\n//                 $('.product__total-price').hide();\n//                 $('.product__finance-option').hide();\n//             }\n//         }\n//     });\n// });\n","\n$(function() {\n    $('.design-directory__filters').find('input, select').on('change', function() {\n        $(this).parents('form').submit();\n    });\n\n    $(document).on('click', '.js-design-directory-load-more', function(event) {\n        event.preventDefault();\n        $('.load-more').addClass('load-more--loading');\n        $.ajax(\n            $(this).attr('href')\n        ).done(function(payload) {\n            newItems = $(payload).find('.design-directory__list .grid > *').css('display', 'none').addClass('js-should-fade-in');\n            loadMore = $(payload).find('.design-directory__load-more');\n            $('.design-directory__list .grid').append(newItems);\n            $('.js-should-fade-in').fadeIn().removeClass('js-should-fade-in');\n            $('.design-directory__load-more').replaceWith(loadMore);\n        });\n    });\n\n});\n","$(document).on('click', '.product__qty a, .product-piece__qty a, .product-piece__qty button', function(e){\n    e.preventDefault();\n    var input = $(this).siblings('.input');\n    var step = typeof input.data('step') !== 'undefined' ? input.data('step') : 1;\n    var decimal_places = typeof input.data('places') !== 'undefined' ? input.data('places') : 0;\n    var minimum = typeof input.data('min') !== 'undefined' ? input.data('min') : 1;\n    var maximum = typeof input.data('max') !== 'undefined' ? input.data('max') : false;\n\n    if ($('svg', $(this)).hasClass('icon-plus')) {\n        input.val((parseFloat(input.val()) + step).toFixed(decimal_places));\n    } else if (parseInt(input.val()) >= 0) {\n        input.val((parseFloat(input.val()) - step).toFixed(decimal_places));\n    }\n\n    if (maximum !== false && parseFloat(input.val()) > maximum) {\n        input.val(maximum);\n    }\n    if (minimum !== false && parseFloat(input.val()) < minimum) {\n        input.val(minimum);\n    }\n\n    input.trigger('change');\n});\n\n$(document).on('input change', '.product__qty input, .product-piece__qty input', function(e) {\n    if ($('.product__custom-qty').length > 0) {\n        const target = $('.js-customise-price-target');\n\n        var price = 0.00;\n        var qty = $(this).val();\n\n        price = target.data('price') * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        target.find('.value').html(target.data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    if ($('.product__multi__size__qty').length > 0) {\n        var price = 0.00;\n        var total_qty = 0;\n        const quantities = $('.product__multi__size__qty:visible');\n        let products = {};\n\n        quantities.each(function (index, element) {\n            let sku = $(element).data('sku');\n            const qty = parseInt($(element).find('input[name=qty]').val());\n            const product_price = parseFloat(parseFloat($(this).data('price')).toFixed(2));\n\n            if (qty > 0) {\n                price += (product_price * qty);\n                total_qty += qty;\n                products[sku] = qty;\n            }\n        });\n\n        const keys = Object.keys(products);\n        if (keys.length > 0) {\n            $('.js-wishlist-action').removeClass('product__wishlist--disabled');\n            $('.js-wishlist-action').attr('data-sku', keys.join(','));\n        } else {\n            $('.js-wishlist-action').addClass('product__wishlist--disabled');\n        }\n\n        if (price === 0) {\n            var fromPrice = null;\n\n            $('.product__multi__size').each(function() {\n                var sizePrice = parseFloat($(this).find('.product__multi__size__price').data('price'));\n\n                if (sizePrice < fromPrice || fromPrice === null) {\n                    fromPrice = sizePrice;\n                }\n            })\n\n            price = fromPrice;\n\n            $('.product__multi__total_label').html('From:');\n        } else {\n            $('.product__multi__total_label').html('Total Price:');\n        }\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__multi__total_value').html($('.product__multi__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n\n        var disable = total_qty <= 0;\n        $('.product__button').toggleClass('button--disabled', disable);\n    }\n\n    if ($('.product__price__total_value').length > 0) {\n        var product_price = parseFloat($('.product__qty').data('price'));\n        var qty = parseFloat($(this).val());\n\n        var price = product_price * qty;\n\n        if (price.toFixed(2) % 1 > 0) {\n            price = price.toFixed(2);\n        } else {\n            price = price.toFixed(0);\n        }\n\n        $('.product__price__total_value').html($('.product__price__total_value').data('currency') + price.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"));\n    }\n\n    var maximum = typeof $(this).data('max') !== 'undefined' ? $(this).data('max') : false;\n    var minimum = typeof $(this).data('min') !== 'undefined' ? $(this).data('min') : 1;\n    if (maximum !== false && parseFloat($(this).val()) > maximum) {\n        $(this).val(maximum);\n    }\n    if (minimum !== false && parseFloat($(this).val()) < minimum && parseFloat($(this).val()) >= 0) {\n        $(this).val(minimum);\n    }\n    if ($('.batches__totals').length > 0) {\n        updateBatchPrices();\n    }\n})\n\nvar updateBatchPrices = function() {\n    var price = 0.00;\n    var total_qty = 0;\n    var quantities = $('.batches__piece-qty:visible');\n    var product_price = parseFloat(parseFloat($('.batches').attr('data-price')).toFixed(2));\n\n    quantities.each(function(){\n        var qty = parseFloat($(this).find('input[name=qty]').val());\n\n        if (qty > 0) {\n            price += product_price * qty;\n            total_qty += qty;\n        }\n    });\n\n    $('.batches__totals-main span').html($('.batches__totals-main').data('currency') + price.toFixed(2));\n    $('.batches__totals-info span').html(total_qty.toFixed(1));\n    $('.js-material-length').html(total_qty.toFixed(1));\n\n    if (total_qty > 0) {\n        $('.product__button').toggleClass('button--disabled', false);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', false);\n    } else {\n        $('.product__button').toggleClass('button--disabled', true);\n        $('.js-wishlist-action').toggleClass('product__wishlist--disabled', true);\n    }\n}\n","function getQueryParameters() {\n    var queryString = location.search.slice(1),\n        params = {};\n\n    queryString.replace(/([^=]*)=([^&]*)&*/g, function (_, key, value) {\n        params[key] = value;\n    });\n\n    return params;\n}\n\n\nfunction setQueryParameters(params) {\n    var query = [],\n        key, value;\n\n    for (key in params) {\n        if (!params.hasOwnProperty(key)) continue;\n        value = params[key];\n        query.push(key + \"=\" + value);\n    }\n\n    location.search = query.join(\"&\");\n}\n\nfunction showAllColours(e) {\n    e.preventDefault()\n    let active = 'filterable__unslick--active'\n\n    if (this.classList.contains(active)) {\n        this.classList.remove(active);\n        this.firstElementChild.textContent = 'show more colours'\n    } else {\n        this.classList.add(active)\n        this.firstElementChild.textContent = 'show fewer colours'\n    }\n}\n\nvar showMoreButton = document.querySelector('.js-unslick');\n\nif (showMoreButton) {\n    showMoreButton.addEventListener('click', showAllColours)\n}\n","$('.product__sizes li.sizes__option').click(function() {\n    var selection = $(this);\n\n    // don't do anything if the size is already selected\n    if (selection.hasClass('sizes__option--active') && !selection.hasClass('sizes__option--active--first')) {\n        return;\n    }\n\n    $.ajax({\n        url: selection.data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n\n    $('.product__sizes .sizes__option').removeClass('sizes__option--active');\n    selection.addClass('sizes__option--active');\n    selection.removeClass('sizes__option--active--first');\n});\n\n$('.product__sizes .d3r-size-select').change(function() {\n    var select = $(this);\n\n    if (!select.find(':selected').data('url')) {\n        return;\n    }\n\n    $.ajax({\n        url: select.find(':selected').data('url'),\n        type: 'GET',\n        success: function(data) {\n            if (data.payload.specification) {\n                $.each(data.payload.specification, function(index, value) {\n                    $('#spec_key--'+index).find('.spec_value').text(value.value)\n                });\n            }\n\n            var html = '';\n            if (data.payload.offer.has_offer) {\n                html = '<span class=\"product__price--was\">was '+data.payload.price+'</span> '\n                    + '<span class=\"product__price--discount\">now '+data.payload.offer.price+'</span>'\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.offer.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            } else {\n                html = data.payload.price\n                    + '<meta itemprop=\"price\" content=\"'+data.payload.price_raw+'\">'\n                    + '<meta itemprop=\"priceCurrency\" content=\"'+data.payload.currency+'\">';\n            }\n\n            $('.product__price').html(html);\n            $('.product__form--addbasket').attr('action', data.payload.basket_url);\n            $('.product__availability__status').text(data.payload.stock_message.status);\n            $('.product__availability__information').text('- '+data.payload.stock_message.message);\n            $('.product__delivery-information__text').html(data.payload.delivery_information);\n\n            // Update the financing calculations\n            if (typeof(fdPrice) != \"undefined\") {\n                fdPrice = parseFloat(data.payload.price_raw).toFixed(2);\n                updateFinancing();\n            }\n        }\n    });\n});\n\n$('.colourways__item').on('mouseover', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $(this).data('colour'));\n});\n\n$('.colourways__item').on('mouseout', function(){\n    $('.colourways__text').html('<span>Colour: </span>' + $('.colourways__text').data('colour'));\n});\n\nfunction updateFinancing() {\n    if ($('.product__financing').length == 0 || typeof(fdOptions) == \"undefined\") {\n        return;\n    }\n\n    var $finTable  = $('#finance-calculator table tbody'),\n        price      = parseFloat(fdPrice),\n        tdDetails  = [];\n\n    if (price < fdMinPrice) {\n        $('.product__financing').hide();\n        return;\n    }\n    $('.product__financing').show();\n\n    $('select', $finTable).empty();\n\n    var i = 0;\n    for (var fdOpt in fdOptions) {\n        var code        = fdOptions[fdOpt]['code'],\n            depositPerc = fdOptions[fdOpt]['deposit'],\n            depositVal  = depositPerc / 100,\n            depositAmt  = price * depositVal;\n\n        var opt = new FinanceDetails(code, price, depositPerc, depositAmt);\n        if (opt) {\n            tdDetails.push(opt);\n\n            // Only show the first option on the PDP directly\n            if (i == 0) {\n                $('.product__financing--message').html(\n                    '&pound;' + parseFloat(opt.m_inst).toFixed(2) +\n                    ' per month with a &pound;' + parseFloat(opt.d_amount).toFixed(2) +\n                    ' deposit (' + opt.apr + '% interest).'\n                );\n                $('.product__financing').fadeIn();\n            }\n\n            $('select', $finTable).append($('<option>', {\n                value: i,\n                text: opt.p_name\n            }));\n\n            ++i;\n        }\n    }\n\n    $('select', $finTable).on('change', function() {\n        var opt = tdDetails[$(this).prop('selectedIndex')],\n            cur = '&pound;';\n\n        $('#cost_of_goods', $finTable).html(cur + parseFloat(opt.goods_val).toFixed(2));\n        $('#deposit_percentage', $finTable).html(opt.d_pc + '%');\n        $('#deposit_amount', $finTable).html(cur + parseFloat(opt.d_amount).toFixed(2));\n        $('#credit_amount', $finTable).html(cur + parseFloat(opt.l_amount).toFixed(2));\n        $('#finance_term', $finTable).html(opt.term + ' months');\n        $('#apr', $finTable).html(opt.apr + '%');\n        $('#cost_per_month', $finTable).html(cur + parseFloat(opt.m_inst).toFixed(2));\n        $('#monthly_repayment', $finTable).html(cur + parseFloat(opt.l_repay).toFixed(2));\n        $('#total', $finTable).html(cur + parseFloat(opt.total).toFixed(2));\n    }).trigger('change');\n}\n$('document').ready(updateFinancing);\n\n","/*! nouislider - 10.0.0 - 2017-05-28 14:52:48 */\r\n\r\n(function (factory) {\r\n\r\n    if ( typeof define === 'function' && define.amd ) {\r\n\r\n        // AMD. Register as an anonymous module.\r\n        define([], factory);\r\n\r\n    } else if ( typeof exports === 'object' ) {\r\n\r\n        // Node/CommonJS\r\n        module.exports = factory();\r\n\r\n    } else {\r\n\r\n        // Browser globals\r\n        window.noUiSlider = factory();\r\n    }\r\n\r\n}(function( ){\r\n\r\n\t'use strict';\r\n\r\n\tvar VERSION = '10.0.0';\r\n\r\n\r\n\tfunction isValidFormatter ( entry ) {\r\n\t\treturn typeof entry === 'object' && typeof entry.to === 'function' && typeof entry.from === 'function';\r\n\t}\r\n\r\n\tfunction removeElement ( el ) {\r\n\t\tel.parentElement.removeChild(el);\r\n\t}\r\n\r\n\t// Bindable version\r\n\tfunction preventDefault ( e ) {\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t// Removes duplicates from an array.\r\n\tfunction unique ( array ) {\r\n\t\treturn array.filter(function(a){\r\n\t\t\treturn !this[a] ? this[a] = true : false;\r\n\t\t}, {});\r\n\t}\r\n\r\n\t// Round a value to the closest 'to'.\r\n\tfunction closest ( value, to ) {\r\n\t\treturn Math.round(value / to) * to;\r\n\t}\r\n\r\n\t// Current position of an element relative to the document.\r\n\tfunction offset ( elem, orientation ) {\r\n\r\n\t\tvar rect = elem.getBoundingClientRect();\r\n\t\tvar doc = elem.ownerDocument;\r\n\t\tvar docElem = doc.documentElement;\r\n\t\tvar pageOffset = getPageOffset(doc);\r\n\r\n\t\t// getBoundingClientRect contains left scroll in Chrome on Android.\r\n\t\t// I haven't found a feature detection that proves this. Worst case\r\n\t\t// scenario on mis-match: the 'tap' feature on horizontal sliders breaks.\r\n\t\tif ( /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) ) {\r\n\t\t\tpageOffset.x = 0;\r\n\t\t}\r\n\r\n\t\treturn orientation ? (rect.top + pageOffset.y - docElem.clientTop) : (rect.left + pageOffset.x - docElem.clientLeft);\r\n\t}\r\n\r\n\t// Checks whether a value is numerical.\r\n\tfunction isNumeric ( a ) {\r\n\t\treturn typeof a === 'number' && !isNaN( a ) && isFinite( a );\r\n\t}\r\n\r\n\t// Sets a class and removes it after [duration] ms.\r\n\tfunction addClassFor ( element, className, duration ) {\r\n\t\tif (duration > 0) {\r\n\t\taddClass(element, className);\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tremoveClass(element, className);\r\n\t\t\t}, duration);\r\n\t\t}\r\n\t}\r\n\r\n\t// Limits a value to 0 - 100\r\n\tfunction limit ( a ) {\r\n\t\treturn Math.max(Math.min(a, 100), 0);\r\n\t}\r\n\r\n\t// Wraps a variable as an array, if it isn't one yet.\r\n\t// Note that an input array is returned by reference!\r\n\tfunction asArray ( a ) {\r\n\t\treturn Array.isArray(a) ? a : [a];\r\n\t}\r\n\r\n\t// Counts decimals\r\n\tfunction countDecimals ( numStr ) {\r\n\t\tnumStr = String(numStr);\r\n\t\tvar pieces = numStr.split(\".\");\r\n\t\treturn pieces.length > 1 ? pieces[1].length : 0;\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#add_class\r\n\tfunction addClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.add(className);\r\n\t\t} else {\r\n\t\t\tel.className += ' ' + className;\r\n\t\t}\r\n\t}\r\n\r\n\t// http://youmightnotneedjquery.com/#remove_class\r\n\tfunction removeClass ( el, className ) {\r\n\t\tif ( el.classList ) {\r\n\t\t\tel.classList.remove(className);\r\n\t\t} else {\r\n\t\t\tel.className = el.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n\t\t}\r\n\t}\r\n\r\n\t// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/\r\n\tfunction hasClass ( el, className ) {\r\n\t\treturn el.classList ? el.classList.contains(className) : new RegExp('\\\\b' + className + '\\\\b').test(el.className);\r\n\t}\r\n\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes\r\n\tfunction getPageOffset ( doc ) {\r\n\r\n\t\tvar supportPageOffset = window.pageXOffset !== undefined;\r\n\t\tvar isCSS1Compat = ((doc.compatMode || \"\") === \"CSS1Compat\");\r\n\t\tvar x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft;\r\n\t\tvar y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop;\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t}\r\n\r\n\t// we provide a function to compute constants instead\r\n\t// of accessing window.* as soon as the module needs it\r\n\t// so that we do not compute anything if not needed\r\n\tfunction getActions ( ) {\r\n\r\n\t\t// Determine the events to bind. IE11 implements pointerEvents without\r\n\t\t// a prefix, which breaks compatibility with the IE10 implementation.\r\n\t\treturn window.navigator.pointerEnabled ? {\r\n\t\t\tstart: 'pointerdown',\r\n\t\t\tmove: 'pointermove',\r\n\t\t\tend: 'pointerup'\r\n\t\t} : window.navigator.msPointerEnabled ? {\r\n\t\t\tstart: 'MSPointerDown',\r\n\t\t\tmove: 'MSPointerMove',\r\n\t\t\tend: 'MSPointerUp'\r\n\t\t} : {\r\n\t\t\tstart: 'mousedown touchstart',\r\n\t\t\tmove: 'mousemove touchmove',\r\n\t\t\tend: 'mouseup touchend'\r\n\t\t};\r\n\t}\r\n\r\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\r\n\t// Issue #785\r\n\tfunction getSupportsPassive ( ) {\r\n\r\n\t\tvar supportsPassive = false;\r\n\r\n\t\ttry {\r\n\r\n\t\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\tsupportsPassive = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\twindow.addEventListener('test', null, opts);\r\n\r\n\t\t} catch (e) {}\r\n\r\n\t\treturn supportsPassive;\r\n\t}\r\n\r\n\tfunction getSupportsTouchActionNone ( ) {\r\n\t\treturn window.CSS && CSS.supports && CSS.supports('touch-action', 'none');\r\n\t}\r\n\r\n\r\n// Value calculation\r\n\r\n\t// Determine the size of a sub-range in relation to a full range.\r\n\tfunction subRangeRatio ( pa, pb ) {\r\n\t\treturn (100 / (pb - pa));\r\n\t}\r\n\r\n\t// (percentage) How many percent is this value of this range?\r\n\tfunction fromPercentage ( range, value ) {\r\n\t\treturn (value * 100) / ( range[1] - range[0] );\r\n\t}\r\n\r\n\t// (percentage) Where is this value on this range?\r\n\tfunction toPercentage ( range, value ) {\r\n\t\treturn fromPercentage( range, range[0] < 0 ?\r\n\t\t\tvalue + Math.abs(range[0]) :\r\n\t\t\t\tvalue - range[0] );\r\n\t}\r\n\r\n\t// (value) How much is this percentage on this range?\r\n\tfunction isPercentage ( range, value ) {\r\n\t\treturn ((value * ( range[1] - range[0] )) / 100) + range[0];\r\n\t}\r\n\r\n\r\n// Range conversion\r\n\r\n\tfunction getJ ( value, arr ) {\r\n\r\n\t\tvar j = 1;\r\n\r\n\t\twhile ( value >= arr[j] ){\r\n\t\t\tj += 1;\r\n\t\t}\r\n\r\n\t\treturn j;\r\n\t}\r\n\r\n\t// (percentage) Input a value, find where, on a scale of 0-100, it applies.\r\n\tfunction toStepping ( xVal, xPct, value ) {\r\n\r\n\t\tif ( value >= xVal.slice(-1)[0] ){\r\n\t\t\treturn 100;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xVal ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn pa + (toPercentage([va, vb], value) / subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (value) Input a percentage, find where it is on the specified range.\r\n\tfunction fromStepping ( xVal, xPct, value ) {\r\n\r\n\t\t// There is no range group that fits 100\r\n\t\tif ( value >= 100 ){\r\n\t\t\treturn xVal.slice(-1)[0];\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), va, vb, pa, pb;\r\n\r\n\t\tva = xVal[j-1];\r\n\t\tvb = xVal[j];\r\n\t\tpa = xPct[j-1];\r\n\t\tpb = xPct[j];\r\n\r\n\t\treturn isPercentage([va, vb], (value - pa) * subRangeRatio (pa, pb));\r\n\t}\r\n\r\n\t// (percentage) Get the step that applies at a certain value.\r\n\tfunction getStep ( xPct, xSteps, snap, value ) {\r\n\r\n\t\tif ( value === 100 ) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tvar j = getJ( value, xPct ), a, b;\r\n\r\n\t\t// If 'snap' is set, steps are used as fixed points on the slider.\r\n\t\tif ( snap ) {\r\n\r\n\t\t\ta = xPct[j-1];\r\n\t\t\tb = xPct[j];\r\n\r\n\t\t\t// Find the closest position, a or b.\r\n\t\t\tif ((value - a) > ((b-a)/2)){\r\n\t\t\t\treturn b;\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tif ( !xSteps[j-1] ){\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\treturn xPct[j-1] + closest(\r\n\t\t\tvalue - xPct[j-1],\r\n\t\t\txSteps[j-1]\r\n\t\t);\r\n\t}\r\n\r\n\r\n// Entry parsing\r\n\r\n\tfunction handleEntryPoint ( index, value, that ) {\r\n\r\n\t\tvar percentage;\r\n\r\n\t\t// Wrap numerical input in an array.\r\n\t\tif ( typeof value === \"number\" ) {\r\n\t\t\tvalue = [value];\r\n\t\t}\r\n\r\n\t\t// Reject any invalid input, by testing whether value is an array.\r\n\t\tif ( Object.prototype.toString.call( value ) !== '[object Array]' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' contains invalid value.\");\r\n\t\t}\r\n\r\n\t\t// Covert min/max syntax to 0 and 100.\r\n\t\tif ( index === 'min' ) {\r\n\t\t\tpercentage = 0;\r\n\t\t} else if ( index === 'max' ) {\r\n\t\t\tpercentage = 100;\r\n\t\t} else {\r\n\t\t\tpercentage = parseFloat( index );\r\n\t\t}\r\n\r\n\t\t// Check for correct input.\r\n\t\tif ( !isNumeric( percentage ) || !isNumeric( value[0] ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' value isn't numeric.\");\r\n\t\t}\r\n\r\n\t\t// Store values.\r\n\t\tthat.xPct.push( percentage );\r\n\t\tthat.xVal.push( value[0] );\r\n\r\n\t\t// NaN will evaluate to false too, but to keep\r\n\t\t// logging clear, set step explicitly. Make sure\r\n\t\t// not to override the 'step' setting with false.\r\n\t\tif ( !percentage ) {\r\n\t\t\tif ( !isNaN( value[1] ) ) {\r\n\t\t\t\tthat.xSteps[0] = value[1];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthat.xSteps.push( isNaN(value[1]) ? false : value[1] );\r\n\t\t}\r\n\r\n\t\tthat.xHighestCompleteStep.push(0);\r\n\t}\r\n\r\n\tfunction handleStepPoint ( i, n, that ) {\r\n\r\n\t\t// Ignore 'false' stepping.\r\n\t\tif ( !n ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// Factor to range ratio\r\n\t\tthat.xSteps[i] = fromPercentage([\r\n\t\t\t that.xVal[i]\r\n\t\t\t,that.xVal[i+1]\r\n\t\t], n) / subRangeRatio (\r\n\t\t\tthat.xPct[i],\r\n\t\t\tthat.xPct[i+1] );\r\n\r\n\t\tvar totalSteps = (that.xVal[i+1] - that.xVal[i]) / that.xNumSteps[i];\r\n\t\tvar highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1);\r\n\t\tvar step = that.xVal[i] + (that.xNumSteps[i] * highestStep);\r\n\r\n\t\tthat.xHighestCompleteStep[i] = step;\r\n\t}\r\n\r\n\r\n// Interface\r\n\r\n\tfunction Spectrum ( entry, snap, singleStep ) {\r\n\r\n\t\tthis.xPct = [];\r\n\t\tthis.xVal = [];\r\n\t\tthis.xSteps = [ singleStep || false ];\r\n\t\tthis.xNumSteps = [ false ];\r\n\t\tthis.xHighestCompleteStep = [];\r\n\r\n\t\tthis.snap = snap;\r\n\r\n\t\tvar index, ordered = [ /* [0, 'min'], [1, '50%'], [2, 'max'] */ ];\r\n\r\n\t\t// Map the object keys to an array.\r\n\t\tfor ( index in entry ) {\r\n\t\t\tif ( entry.hasOwnProperty(index) ) {\r\n\t\t\t\tordered.push([entry[index], index]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sort all entries by value (numeric sort).\r\n\t\tif ( ordered.length && typeof ordered[0][0] === \"object\" ) {\r\n\t\t\tordered.sort(function(a, b) { return a[0][0] - b[0][0]; });\r\n\t\t} else {\r\n\t\t\tordered.sort(function(a, b) { return a[0] - b[0]; });\r\n\t\t}\r\n\r\n\r\n\t\t// Convert all entries to subranges.\r\n\t\tfor ( index = 0; index < ordered.length; index++ ) {\r\n\t\t\thandleEntryPoint(ordered[index][1], ordered[index][0], this);\r\n\t\t}\r\n\r\n\t\t// Store the actual step values.\r\n\t\t// xSteps is sorted in the same order as xPct and xVal.\r\n\t\tthis.xNumSteps = this.xSteps.slice(0);\r\n\r\n\t\t// Convert all numeric steps to the percentage of the subrange they represent.\r\n\t\tfor ( index = 0; index < this.xNumSteps.length; index++ ) {\r\n\t\t\thandleStepPoint(index, this.xNumSteps[index], this);\r\n\t\t}\r\n\t}\r\n\r\n\tSpectrum.prototype.getMargin = function ( value ) {\r\n\r\n\t\tvar step = this.xNumSteps[0];\r\n\r\n\t\tif ( step && ((value / step) % 1) !== 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit', 'margin' and 'padding' must be divisible by step.\");\r\n\t\t}\r\n\r\n\t\treturn this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false;\r\n\t};\r\n\r\n\tSpectrum.prototype.toStepping = function ( value ) {\r\n\r\n\t\tvalue = toStepping( this.xVal, this.xPct, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.fromStepping = function ( value ) {\r\n\r\n\t\treturn fromStepping( this.xVal, this.xPct, value );\r\n\t};\r\n\r\n\tSpectrum.prototype.getStep = function ( value ) {\r\n\r\n\t\tvalue = getStep(this.xPct, this.xSteps, this.snap, value );\r\n\r\n\t\treturn value;\r\n\t};\r\n\r\n\tSpectrum.prototype.getNearbySteps = function ( value ) {\r\n\r\n\t\tvar j = getJ(value, this.xPct);\r\n\r\n\t\treturn {\r\n\t\t\tstepBefore: { startValue: this.xVal[j-2], step: this.xNumSteps[j-2], highestStep: this.xHighestCompleteStep[j-2] },\r\n\t\t\tthisStep: { startValue: this.xVal[j-1], step: this.xNumSteps[j-1], highestStep: this.xHighestCompleteStep[j-1] },\r\n\t\t\tstepAfter: { startValue: this.xVal[j-0], step: this.xNumSteps[j-0], highestStep: this.xHighestCompleteStep[j-0] }\r\n\t\t};\r\n\t};\r\n\r\n\tSpectrum.prototype.countStepDecimals = function () {\r\n\t\tvar stepDecimals = this.xNumSteps.map(countDecimals);\r\n\t\treturn Math.max.apply(null, stepDecimals);\r\n \t};\r\n\r\n\t// Outside testing\r\n\tSpectrum.prototype.convert = function ( value ) {\r\n\t\treturn this.getStep(this.toStepping(value));\r\n\t};\r\n\r\n/*\tEvery input option is tested and parsed. This'll prevent\r\n\tendless validation in internal methods. These tests are\r\n\tstructured with an item for every option available. An\r\n\toption can be marked as required by setting the 'r' flag.\r\n\tThe testing function is provided with three arguments:\r\n\t\t- The provided value for the option;\r\n\t\t- A reference to the options object;\r\n\t\t- The name for the option;\r\n\r\n\tThe testing function returns false when an error is detected,\r\n\tor true when everything is OK. It can also modify the option\r\n\tobject, to make sure all values can be correctly looped elsewhere. */\r\n\r\n\tvar defaultFormatter = { 'to': function( value ){\r\n\t\treturn value !== undefined && value.toFixed(2);\r\n\t}, 'from': Number };\r\n\r\n\tfunction validateFormat ( entry ) {\r\n\r\n\t\t// Any object with a to and from method is supported.\r\n\t\tif ( isValidFormatter(entry) ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'format' requires 'to' and 'from' methods.\");\r\n\t}\r\n\r\n\tfunction testStep ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric( entry ) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'step' is not numeric.\");\r\n\t\t}\r\n\r\n\t\t// The step option can still be used to set stepping\r\n\t\t// for linear sliders. Overwritten if set in 'range'.\r\n\t\tparsed.singleStep = entry;\r\n\t}\r\n\r\n\tfunction testRange ( parsed, entry ) {\r\n\r\n\t\t// Filter incorrect input.\r\n\t\tif ( typeof entry !== 'object' || Array.isArray(entry) ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' is not an object.\");\r\n\t\t}\r\n\r\n\t\t// Catch missing start or end.\r\n\t\tif ( entry.min === undefined || entry.max === undefined ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Missing 'min' or 'max' in 'range'.\");\r\n\t\t}\r\n\r\n\t\t// Catch equal start or end.\r\n\t\tif ( entry.min === entry.max ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'range' 'min' and 'max' cannot be equal.\");\r\n\t\t}\r\n\r\n\t\tparsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep);\r\n\t}\r\n\r\n\tfunction testStart ( parsed, entry ) {\r\n\r\n\t\tentry = asArray(entry);\r\n\r\n\t\t// Validate input. Values aren't tested, as the public .val method\r\n\t\t// will always provide a valid location.\r\n\t\tif ( !Array.isArray( entry ) || !entry.length ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'start' option is incorrect.\");\r\n\t\t}\r\n\r\n\t\t// Store the number of handles.\r\n\t\tparsed.handles = entry.length;\r\n\r\n\t\t// When the slider is initialized, the .val method will\r\n\t\t// be called with the start options.\r\n\t\tparsed.start = entry;\r\n\t}\r\n\r\n\tfunction testSnap ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.snap = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'snap' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimate ( parsed, entry ) {\r\n\r\n\t\t// Enforce 100% stepping within subranges.\r\n\t\tparsed.animate = entry;\r\n\r\n\t\tif ( typeof entry !== 'boolean' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animate' option must be a boolean.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAnimationDuration ( parsed, entry ) {\r\n\r\n\t\tparsed.animationDuration = entry;\r\n\r\n\t\tif ( typeof entry !== 'number' ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'animationDuration' option must be a number.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testConnect ( parsed, entry ) {\r\n\r\n\t\tvar connect = [false];\r\n\t\tvar i;\r\n\r\n\t\t// Map legacy options\r\n\t\tif ( entry === 'lower' ) {\r\n\t\t\tentry = [true, false];\r\n\t\t}\r\n\r\n\t\telse if ( entry === 'upper' ) {\r\n\t\t\tentry = [false, true];\r\n\t\t}\r\n\r\n\t\t// Handle boolean options\r\n\t\tif ( entry === true || entry === false ) {\r\n\r\n\t\t\tfor ( i = 1; i < parsed.handles; i++ ) {\r\n\t\t\t\tconnect.push(entry);\r\n\t\t\t}\r\n\r\n\t\t\tconnect.push(false);\r\n\t\t}\r\n\r\n\t\t// Reject invalid input\r\n\t\telse if ( !Array.isArray( entry ) || !entry.length || entry.length !== parsed.handles + 1 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'connect' option doesn't match handle count.\");\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\tconnect = entry;\r\n\t\t}\r\n\r\n\t\tparsed.connect = connect;\r\n\t}\r\n\r\n\tfunction testOrientation ( parsed, entry ) {\r\n\r\n\t\t// Set orientation to an a numerical value for easy\r\n\t\t// array selection.\r\n\t\tswitch ( entry ){\r\n\t\t  case 'horizontal':\r\n\t\t\tparsed.ort = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'vertical':\r\n\t\t\tparsed.ort = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'orientation' option is invalid.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testMargin ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\t// Issue #582\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.margin = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.margin ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'margin' option is only supported on linear sliders.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testLimit ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tparsed.limit = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.limit || parsed.handles < 2 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'limit' option is only supported on linear sliders with 2 or more handles.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testPadding ( parsed, entry ) {\r\n\r\n\t\tif ( !isNumeric(entry) ){\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be numeric.\");\r\n\t\t}\r\n\r\n\t\tif ( entry === 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparsed.padding = parsed.spectrum.getMargin(entry);\r\n\r\n\t\tif ( !parsed.padding ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option is only supported on linear sliders.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding < 0 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be a positive number.\");\r\n\t\t}\r\n\r\n\t\tif ( parsed.padding >= 50 ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'padding' option must be less than half the range.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testDirection ( parsed, entry ) {\r\n\r\n\t\t// Set direction as a numerical value for easy parsing.\r\n\t\t// Invert connection for RTL sliders, so that the proper\r\n\t\t// handles get the connect/background classes.\r\n\t\tswitch ( entry ) {\r\n\t\t  case 'ltr':\r\n\t\t\tparsed.dir = 0;\r\n\t\t\tbreak;\r\n\t\t  case 'rtl':\r\n\t\t\tparsed.dir = 1;\r\n\t\t\tbreak;\r\n\t\t  default:\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'direction' option was not recognized.\");\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testBehaviour ( parsed, entry ) {\r\n\r\n\t\t// Make sure the input is a string.\r\n\t\tif ( typeof entry !== 'string' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'behaviour' must be a string containing options.\");\r\n\t\t}\r\n\r\n\t\t// Check if the string contains any keywords.\r\n\t\t// None are required.\r\n\t\tvar tap = entry.indexOf('tap') >= 0;\r\n\t\tvar drag = entry.indexOf('drag') >= 0;\r\n\t\tvar fixed = entry.indexOf('fixed') >= 0;\r\n\t\tvar snap = entry.indexOf('snap') >= 0;\r\n\t\tvar hover = entry.indexOf('hover') >= 0;\r\n\r\n\t\tif ( fixed ) {\r\n\r\n\t\t\tif ( parsed.handles !== 2 ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'fixed' behaviour must be used with 2 handles\");\r\n\t\t\t}\r\n\r\n\t\t\t// Use margin to enforce fixed state\r\n\t\t\ttestMargin(parsed, parsed.start[1] - parsed.start[0]);\r\n\t\t}\r\n\r\n\t\tparsed.events = {\r\n\t\t\ttap: tap || snap,\r\n\t\t\tdrag: drag,\r\n\t\t\tfixed: fixed,\r\n\t\t\tsnap: snap,\r\n\t\t\thover: hover\r\n\t\t};\r\n\t}\r\n\r\n\tfunction testTooltips ( parsed, entry ) {\r\n\r\n\t\tif ( entry === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\telse if ( entry === true ) {\r\n\r\n\t\t\tparsed.tooltips = [];\r\n\r\n\t\t\tfor ( var i = 0; i < parsed.handles; i++ ) {\r\n\t\t\t\tparsed.tooltips.push(true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\telse {\r\n\r\n\t\t\tparsed.tooltips = asArray(entry);\r\n\r\n\t\t\tif ( parsed.tooltips.length !== parsed.handles ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): must pass a formatter for all handles.\");\r\n\t\t\t}\r\n\r\n\t\t\tparsed.tooltips.forEach(function(formatter){\r\n\t\t\t\tif ( typeof formatter !== 'boolean' && (typeof formatter !== 'object' || typeof formatter.to !== 'function') ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'tooltips' must be passed a formatter or 'false'.\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testAriaFormat ( parsed, entry ) {\r\n\t\tparsed.ariaFormat = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testFormat ( parsed, entry ) {\r\n\t\tparsed.format = entry;\r\n\t\tvalidateFormat(entry);\r\n\t}\r\n\r\n\tfunction testCssPrefix ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'string' && entry !== false ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssPrefix' must be a string or `false`.\");\r\n\t\t}\r\n\r\n\t\tparsed.cssPrefix = entry;\r\n\t}\r\n\r\n\tfunction testCssClasses ( parsed, entry ) {\r\n\r\n\t\tif ( entry !== undefined && typeof entry !== 'object' ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'cssClasses' must be an object.\");\r\n\t\t}\r\n\r\n\t\tif ( typeof parsed.cssPrefix === 'string' ) {\r\n\t\t\tparsed.cssClasses = {};\r\n\r\n\t\t\tfor ( var key in entry ) {\r\n\t\t\t\tif ( !entry.hasOwnProperty(key) ) { continue; }\r\n\r\n\t\t\t\tparsed.cssClasses[key] = parsed.cssPrefix + entry[key];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparsed.cssClasses = entry;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction testUseRaf ( parsed, entry ) {\r\n\t\tif ( entry === true || entry === false ) {\r\n\t\t\tparsed.useRequestAnimationFrame = entry;\r\n\t\t} else {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'useRequestAnimationFrame' option should be true (default) or false.\");\r\n\t\t}\r\n\t}\r\n\r\n\t// Test all developer settings and parse to assumption-safe values.\r\n\tfunction testOptions ( options ) {\r\n\r\n\t\t// To prove a fix for #537, freeze options here.\r\n\t\t// If the object is modified, an error will be thrown.\r\n\t\t// Object.freeze(options);\r\n\r\n\t\tvar parsed = {\r\n\t\t\tmargin: 0,\r\n\t\t\tlimit: 0,\r\n\t\t\tpadding: 0,\r\n\t\t\tanimate: true,\r\n\t\t\tanimationDuration: 300,\r\n\t\t\tariaFormat: defaultFormatter,\r\n\t\t\tformat: defaultFormatter\r\n\t\t};\r\n\r\n\t\t// Tests are executed in the order they are presented here.\r\n\t\tvar tests = {\r\n\t\t\t'step': { r: false, t: testStep },\r\n\t\t\t'start': { r: true, t: testStart },\r\n\t\t\t'connect': { r: true, t: testConnect },\r\n\t\t\t'direction': { r: true, t: testDirection },\r\n\t\t\t'snap': { r: false, t: testSnap },\r\n\t\t\t'animate': { r: false, t: testAnimate },\r\n\t\t\t'animationDuration': { r: false, t: testAnimationDuration },\r\n\t\t\t'range': { r: true, t: testRange },\r\n\t\t\t'orientation': { r: false, t: testOrientation },\r\n\t\t\t'margin': { r: false, t: testMargin },\r\n\t\t\t'limit': { r: false, t: testLimit },\r\n\t\t\t'padding': { r: false, t: testPadding },\r\n\t\t\t'behaviour': { r: true, t: testBehaviour },\r\n\t\t\t'ariaFormat': { r: false, t: testAriaFormat },\r\n\t\t\t'format': { r: false, t: testFormat },\r\n\t\t\t'tooltips': { r: false, t: testTooltips },\r\n\t\t\t'cssPrefix': { r: false, t: testCssPrefix },\r\n\t\t\t'cssClasses': { r: false, t: testCssClasses },\r\n\t\t\t'useRequestAnimationFrame': { r: false, t: testUseRaf }\r\n\t\t};\r\n\r\n\t\tvar defaults = {\r\n\t\t\t'connect': false,\r\n\t\t\t'direction': 'ltr',\r\n\t\t\t'behaviour': 'tap',\r\n\t\t\t'orientation': 'horizontal',\r\n\t\t\t'cssPrefix' : 'noUi-',\r\n\t\t\t'cssClasses': {\r\n\t\t\t\ttarget: 'target',\r\n\t\t\t\tbase: 'base',\r\n\t\t\t\torigin: 'origin',\r\n\t\t\t\thandle: 'handle',\r\n\t\t\t\thandleLower: 'handle-lower',\r\n\t\t\t\thandleUpper: 'handle-upper',\r\n\t\t\t\thorizontal: 'horizontal',\r\n\t\t\t\tvertical: 'vertical',\r\n\t\t\t\tbackground: 'background',\r\n\t\t\t\tconnect: 'connect',\r\n\t\t\t\tltr: 'ltr',\r\n\t\t\t\trtl: 'rtl',\r\n\t\t\t\tdraggable: 'draggable',\r\n\t\t\t\tdrag: 'state-drag',\r\n\t\t\t\ttap: 'state-tap',\r\n\t\t\t\tactive: 'active',\r\n\t\t\t\ttooltip: 'tooltip',\r\n\t\t\t\tpips: 'pips',\r\n\t\t\t\tpipsHorizontal: 'pips-horizontal',\r\n\t\t\t\tpipsVertical: 'pips-vertical',\r\n\t\t\t\tmarker: 'marker',\r\n\t\t\t\tmarkerHorizontal: 'marker-horizontal',\r\n\t\t\t\tmarkerVertical: 'marker-vertical',\r\n\t\t\t\tmarkerNormal: 'marker-normal',\r\n\t\t\t\tmarkerLarge: 'marker-large',\r\n\t\t\t\tmarkerSub: 'marker-sub',\r\n\t\t\t\tvalue: 'value',\r\n\t\t\t\tvalueHorizontal: 'value-horizontal',\r\n\t\t\t\tvalueVertical: 'value-vertical',\r\n\t\t\t\tvalueNormal: 'value-normal',\r\n\t\t\t\tvalueLarge: 'value-large',\r\n\t\t\t\tvalueSub: 'value-sub'\r\n\t\t\t},\r\n\t\t\t'useRequestAnimationFrame': true\r\n\t\t};\r\n\r\n\t\t// AriaFormat defaults to regular format, if any.\r\n\t\tif ( options.format && !options.ariaFormat ) {\r\n\t\t\toptions.ariaFormat = options.format;\r\n\t\t}\r\n\r\n\t\t// Run all options through a testing mechanism to ensure correct\r\n\t\t// input. It should be noted that options might get modified to\r\n\t\t// be handled properly. E.g. wrapping integers in arrays.\r\n\t\tObject.keys(tests).forEach(function( name ){\r\n\r\n\t\t\t// If the option isn't set, but it is required, throw an error.\r\n\t\t\tif ( options[name] === undefined && defaults[name] === undefined ) {\r\n\r\n\t\t\t\tif ( tests[name].r ) {\r\n\t\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): '\" + name + \"' is required.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\ttests[name].t( parsed, options[name] === undefined ? defaults[name] : options[name] );\r\n\t\t});\r\n\r\n\t\t// Forward pips options\r\n\t\tparsed.pips = options.pips;\r\n\r\n\t\tvar styles = [['left', 'top'], ['right', 'bottom']];\r\n\r\n\t\t// Pre-define the styles.\r\n\t\tparsed.style = styles[parsed.dir][parsed.ort];\r\n\t\tparsed.styleOposite = styles[parsed.dir?0:1][parsed.ort];\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\r\nfunction closure ( target, options, originalOptions ){\r\n\r\n\tvar actions = getActions();\r\n\tvar supportsTouchActionNone = getSupportsTouchActionNone();\r\n\tvar supportsPassive = supportsTouchActionNone && getSupportsPassive();\r\n\r\n\t// All variables local to 'closure' are prefixed with 'scope_'\r\n\tvar scope_Target = target;\r\n\tvar scope_Locations = [];\r\n\tvar scope_Base;\r\n\tvar scope_Handles;\r\n\tvar scope_HandleNumbers = [];\r\n\tvar scope_ActiveHandle = false;\r\n\tvar scope_Connects;\r\n\tvar scope_Spectrum = options.spectrum;\r\n\tvar scope_Values = [];\r\n\tvar scope_Events = {};\r\n\tvar scope_Self;\r\n\tvar scope_Pips;\r\n\tvar scope_Listeners = null;\r\n\tvar scope_Document = target.ownerDocument;\r\n\tvar scope_DocumentElement = scope_Document.documentElement;\r\n\tvar scope_Body = scope_Document.body;\r\n\r\n\r\n\t// Creates a node, adds it to target, returns the new node.\r\n\tfunction addNodeTo ( target, className ) {\r\n\r\n\t\tvar div = scope_Document.createElement('div');\r\n\r\n\t\tif ( className ) {\r\n\t\t\taddClass(div, className);\r\n\t\t}\r\n\r\n\t\ttarget.appendChild(div);\r\n\r\n\t\treturn div;\r\n\t}\r\n\r\n\t// Append a origin to the base\r\n\tfunction addOrigin ( base, handleNumber ) {\r\n\r\n\t\tvar origin = addNodeTo(base, options.cssClasses.origin);\r\n\t\tvar handle = addNodeTo(origin, options.cssClasses.handle);\r\n\r\n\t\thandle.setAttribute('data-handle', handleNumber);\r\n\r\n\t\t// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n\t\t// 0 = focusable and reachable\r\n\t\thandle.setAttribute('tabindex', '0');\r\n\t\thandle.setAttribute('role', 'slider');\r\n\t\thandle.setAttribute('aria-orientation', options.ort ? 'vertical' : 'horizontal');\r\n\r\n\t\tif ( handleNumber === 0 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleLower);\r\n\t\t}\r\n\r\n\t\telse if ( handleNumber === options.handles - 1 ) {\r\n\t\t\taddClass(handle, options.cssClasses.handleUpper);\r\n\t\t}\r\n\r\n\t\treturn origin;\r\n\t}\r\n\r\n\t// Insert nodes for connect elements\r\n\tfunction addConnect ( base, add ) {\r\n\r\n\t\tif ( !add ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(base, options.cssClasses.connect);\r\n\t}\r\n\r\n\t// Add handles to the slider base.\r\n\tfunction addElements ( connectOptions, base ) {\r\n\r\n\t\tscope_Handles = [];\r\n\t\tscope_Connects = [];\r\n\r\n\t\tscope_Connects.push(addConnect(base, connectOptions[0]));\r\n\r\n\t\t// [::::O====O====O====]\r\n\t\t// connectOptions = [0, 1, 1, 1]\r\n\r\n\t\tfor ( var i = 0; i < options.handles; i++ ) {\r\n\t\t\t// Keep a list of all added handles.\r\n\t\t\tscope_Handles.push(addOrigin(base, i));\r\n\t\t\tscope_HandleNumbers[i] = i;\r\n\t\t\tscope_Connects.push(addConnect(base, connectOptions[i + 1]));\r\n\t\t}\r\n\t}\r\n\r\n\t// Initialize a single slider.\r\n\tfunction addSlider ( target ) {\r\n\r\n\t\t// Apply classes and data to the target.\r\n\t\taddClass(target, options.cssClasses.target);\r\n\r\n\t\tif ( options.dir === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.ltr);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.rtl);\r\n\t\t}\r\n\r\n\t\tif ( options.ort === 0 ) {\r\n\t\t\taddClass(target, options.cssClasses.horizontal);\r\n\t\t} else {\r\n\t\t\taddClass(target, options.cssClasses.vertical);\r\n\t\t}\r\n\r\n\t\tscope_Base = addNodeTo(target, options.cssClasses.base);\r\n\t}\r\n\r\n\r\n\tfunction addTooltip ( handle, handleNumber ) {\r\n\r\n\t\tif ( !options.tooltips[handleNumber] ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn addNodeTo(handle.firstChild, options.cssClasses.tooltip);\r\n\t}\r\n\r\n\t// The tooltips option is a shorthand for using the 'update' event.\r\n\tfunction tooltips ( ) {\r\n\r\n\t\t// Tooltips are added with options.tooltips in original order.\r\n\t\tvar tips = scope_Handles.map(addTooltip);\r\n\r\n\t\tbindEvent('update', function(values, handleNumber, unencoded) {\r\n\r\n\t\t\tif ( !tips[handleNumber] ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar formattedValue = values[handleNumber];\r\n\r\n\t\t\tif ( options.tooltips[handleNumber] !== true ) {\r\n\t\t\t\tformattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]);\r\n\t\t\t}\r\n\r\n\t\t\ttips[handleNumber].innerHTML = formattedValue;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction aria ( ) {\r\n\r\n\t\tbindEvent('update', function ( values, handleNumber, unencoded, tap, positions ) {\r\n\r\n\t\t\t// Update Aria Values for all handles, as a change in one changes min and max values for the next.\r\n\t\t\tscope_HandleNumbers.forEach(function( handleNumber ){\r\n\r\n\t\t\t\tvar handle = scope_Handles[handleNumber];\r\n\r\n\t\t\t\tvar min = checkHandlePosition(scope_Locations, handleNumber, 0, true, true, true);\r\n\t\t\t\tvar max = checkHandlePosition(scope_Locations, handleNumber, 100, true, true, true);\r\n\r\n\t\t\t\tvar now = positions[handleNumber];\r\n\t\t\t\tvar text = options.ariaFormat.to(unencoded[handleNumber]);\r\n\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemin', min.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuemax', max.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuenow', now.toFixed(1));\r\n\t\t\t\thandle.children[0].setAttribute('aria-valuetext', text);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tfunction getGroup ( mode, values, stepped ) {\r\n\r\n\t\t// Use the range.\r\n\t\tif ( mode === 'range' || mode === 'steps' ) {\r\n\t\t\treturn scope_Spectrum.xVal;\r\n\t\t}\r\n\r\n\t\tif ( mode === 'count' ) {\r\n\r\n\t\t\tif ( !values ) {\r\n\t\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): 'values' required for mode 'count'.\");\r\n\t\t\t}\r\n\r\n\t\t\t// Divide 0 - 100 in 'count' parts.\r\n\t\t\tvar spread = ( 100 / (values - 1) );\r\n\t\t\tvar v;\r\n\t\t\tvar i = 0;\r\n\r\n\t\t\tvalues = [];\r\n\r\n\t\t\t// List these parts and have them handled as 'positions'.\r\n\t\t\twhile ( (v = i++ * spread) <= 100 ) {\r\n\t\t\t\tvalues.push(v);\r\n\t\t\t}\r\n\r\n\t\t\tmode = 'positions';\r\n\t\t}\r\n\r\n\t\tif ( mode === 'positions' ) {\r\n\r\n\t\t\t// Map all percentages to on-range values.\r\n\t\t\treturn values.map(function( value ){\r\n\t\t\t\treturn scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( mode === 'values' ) {\r\n\r\n\t\t\t// If the value must be stepped, it needs to be converted to a percentage first.\r\n\t\t\tif ( stepped ) {\r\n\r\n\t\t\t\treturn values.map(function( value ){\r\n\r\n\t\t\t\t\t// Convert to percentage, apply step, return to value.\r\n\t\t\t\t\treturn scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) );\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise, we can simply use the values.\r\n\t\t\treturn values;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction generateSpread ( density, mode, group ) {\r\n\r\n\t\tfunction safeIncrement(value, increment) {\r\n\t\t\t// Avoid floating point variance by dropping the smallest decimal places.\r\n\t\t\treturn (value + increment).toFixed(7) / 1;\r\n\t\t}\r\n\r\n\t\tvar indexes = {};\r\n\t\tvar firstInRange = scope_Spectrum.xVal[0];\r\n\t\tvar lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length-1];\r\n\t\tvar ignoreFirst = false;\r\n\t\tvar ignoreLast = false;\r\n\t\tvar prevPct = 0;\r\n\r\n\t\t// Create a copy of the group, sort it and filter away all duplicates.\r\n\t\tgroup = unique(group.slice().sort(function(a, b){ return a - b; }));\r\n\r\n\t\t// Make sure the range starts with the first element.\r\n\t\tif ( group[0] !== firstInRange ) {\r\n\t\t\tgroup.unshift(firstInRange);\r\n\t\t\tignoreFirst = true;\r\n\t\t}\r\n\r\n\t\t// Likewise for the last one.\r\n\t\tif ( group[group.length - 1] !== lastInRange ) {\r\n\t\t\tgroup.push(lastInRange);\r\n\t\t\tignoreLast = true;\r\n\t\t}\r\n\r\n\t\tgroup.forEach(function ( current, index ) {\r\n\r\n\t\t\t// Get the current step and the lower + upper positions.\r\n\t\t\tvar step;\r\n\t\t\tvar i;\r\n\t\t\tvar q;\r\n\t\t\tvar low = current;\r\n\t\t\tvar high = group[index+1];\r\n\t\t\tvar newPct;\r\n\t\t\tvar pctDifference;\r\n\t\t\tvar pctPos;\r\n\t\t\tvar type;\r\n\t\t\tvar steps;\r\n\t\t\tvar realSteps;\r\n\t\t\tvar stepsize;\r\n\r\n\t\t\t// When using 'steps' mode, use the provided steps.\r\n\t\t\t// Otherwise, we'll step on to the next subrange.\r\n\t\t\tif ( mode === 'steps' ) {\r\n\t\t\t\tstep = scope_Spectrum.xNumSteps[ index ];\r\n\t\t\t}\r\n\r\n\t\t\t// Default to a 'full' step.\r\n\t\t\tif ( !step ) {\r\n\t\t\t\tstep = high-low;\r\n\t\t\t}\r\n\r\n\t\t\t// Low can be 0, so test for false. If high is undefined,\r\n\t\t\t// we are at the last subrange. Index 0 is already handled.\r\n\t\t\tif ( low === false || high === undefined ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure step isn't 0, which would cause an infinite loop (#654)\r\n\t\t\tstep = Math.max(step, 0.0000001);\r\n\r\n\t\t\t// Find all steps in the subrange.\r\n\t\t\tfor ( i = low; i <= high; i = safeIncrement(i, step) ) {\r\n\r\n\t\t\t\t// Get the percentage value for the current step,\r\n\t\t\t\t// calculate the size for the subrange.\r\n\t\t\t\tnewPct = scope_Spectrum.toStepping( i );\r\n\t\t\t\tpctDifference = newPct - prevPct;\r\n\r\n\t\t\t\tsteps = pctDifference / density;\r\n\t\t\t\trealSteps = Math.round(steps);\r\n\r\n\t\t\t\t// This ratio represents the ammount of percentage-space a point indicates.\r\n\t\t\t\t// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided.\r\n\t\t\t\t// Round the percentage offset to an even number, then divide by two\r\n\t\t\t\t// to spread the offset on both sides of the range.\r\n\t\t\t\tstepsize = pctDifference/realSteps;\r\n\r\n\t\t\t\t// Divide all points evenly, adding the correct number to this subrange.\r\n\t\t\t\t// Run up to <= so that 100% gets a point, event if ignoreLast is set.\r\n\t\t\t\tfor ( q = 1; q <= realSteps; q += 1 ) {\r\n\r\n\t\t\t\t\t// The ratio between the rounded value and the actual size might be ~1% off.\r\n\t\t\t\t\t// Correct the percentage offset by the number of points\r\n\t\t\t\t\t// per subrange. density = 1 will result in 100 points on the\r\n\t\t\t\t\t// full range, 2 for 50, 4 for 25, etc.\r\n\t\t\t\t\tpctPos = prevPct + ( q * stepsize );\r\n\t\t\t\t\tindexes[pctPos.toFixed(5)] = ['x', 0];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Determine the point type.\r\n\t\t\t\ttype = (group.indexOf(i) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 );\r\n\r\n\t\t\t\t// Enforce the 'ignoreFirst' option by overwriting the type for 0.\r\n\t\t\t\tif ( !index && ignoreFirst ) {\r\n\t\t\t\t\ttype = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( !(i === high && ignoreLast)) {\r\n\t\t\t\t\t// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.\r\n\t\t\t\t\tindexes[newPct.toFixed(5)] = [i, type];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Update the percentage count.\r\n\t\t\t\tprevPct = newPct;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn indexes;\r\n\t}\r\n\r\n\tfunction addMarking ( spread, filterFunc, formatter ) {\r\n\r\n\t\tvar element = scope_Document.createElement('div');\r\n\r\n\t\tvar valueSizeClasses = [\r\n\t\t\toptions.cssClasses.valueNormal,\r\n\t\t\toptions.cssClasses.valueLarge,\r\n\t\t\toptions.cssClasses.valueSub\r\n\t\t];\r\n\t\tvar markerSizeClasses = [\r\n\t\t\toptions.cssClasses.markerNormal,\r\n\t\t\toptions.cssClasses.markerLarge,\r\n\t\t\toptions.cssClasses.markerSub\r\n\t\t];\r\n\t\tvar valueOrientationClasses = [\r\n\t\t\toptions.cssClasses.valueHorizontal,\r\n\t\t\toptions.cssClasses.valueVertical\r\n\t\t];\r\n\t\tvar markerOrientationClasses = [\r\n\t\t\toptions.cssClasses.markerHorizontal,\r\n\t\t\toptions.cssClasses.markerVertical\r\n\t\t];\r\n\r\n\t\taddClass(element, options.cssClasses.pips);\r\n\t\taddClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical);\r\n\r\n\t\tfunction getClasses( type, source ){\r\n\t\t\tvar a = source === options.cssClasses.value;\r\n\t\t\tvar orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;\r\n\t\t\tvar sizeClasses = a ? valueSizeClasses : markerSizeClasses;\r\n\r\n\t\t\treturn source + ' ' + orientationClasses[options.ort] + ' ' + sizeClasses[type];\r\n\t\t}\r\n\r\n\t\tfunction addSpread ( offset, values ){\r\n\r\n\t\t\t// Apply the filter function, if it is set.\r\n\t\t\tvalues[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1];\r\n\r\n\t\t\t// Add a marker for every point\r\n\t\t\tvar node = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.marker);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\r\n\t\t\t// Values are only appended for points marked '1' or '2'.\r\n\t\t\tif ( values[1] ) {\r\n\t\t\t\tnode = addNodeTo(element, false);\r\n\t\t\t\tnode.className = getClasses(values[1], options.cssClasses.value);\r\n\t\t\t\tnode.style[options.style] = offset + '%';\r\n\t\t\t\tnode.innerText = formatter.to(values[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append all points.\r\n\t\tObject.keys(spread).forEach(function(a){\r\n\t\t\taddSpread(a, spread[a]);\r\n\t\t});\r\n\r\n\t\treturn element;\r\n\t}\r\n\r\n\tfunction removePips ( ) {\r\n\t\tif ( scope_Pips ) {\r\n\t\t\tremoveElement(scope_Pips);\r\n\t\t\tscope_Pips = null;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction pips ( grid ) {\r\n\r\n\t\t// Fix #669\r\n\t\tremovePips();\r\n\r\n\t\tvar mode = grid.mode;\r\n\t\tvar density = grid.density || 1;\r\n\t\tvar filter = grid.filter || false;\r\n\t\tvar values = grid.values || false;\r\n\t\tvar stepped = grid.stepped || false;\r\n\t\tvar group = getGroup( mode, values, stepped );\r\n\t\tvar spread = generateSpread( density, mode, group );\r\n\t\tvar format = grid.format || {\r\n\t\t\tto: Math.round\r\n\t\t};\r\n\r\n\t\tscope_Pips = scope_Target.appendChild(addMarking(\r\n\t\t\tspread,\r\n\t\t\tfilter,\r\n\t\t\tformat\r\n\t\t));\r\n\r\n\t\treturn scope_Pips;\r\n\t}\r\n\r\n\r\n\t// Shorthand for base dimensions.\r\n\tfunction baseSize ( ) {\r\n\t\tvar rect = scope_Base.getBoundingClientRect(), alt = 'offset' + ['Width', 'Height'][options.ort];\r\n\t\treturn options.ort === 0 ? (rect.width||scope_Base[alt]) : (rect.height||scope_Base[alt]);\r\n\t}\r\n\r\n\t// Handler for attaching events trough a proxy.\r\n\tfunction attachEvent ( events, element, callback, data ) {\r\n\r\n\t\t// This function can be used to 'filter' events to the slider.\r\n\t\t// element is a node, not a nodeList\r\n\r\n\t\tvar method = function ( e ){\r\n\r\n\t\t\tif ( scope_Target.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Stop if an active 'tap' transition is taking place.\r\n\t\t\tif ( hasClass(scope_Target, options.cssClasses.tap) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\te = fixEvent(e, data.pageOffset);\r\n\r\n\t\t\t// Handle reject of multitouch\r\n\t\t\tif ( !e ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore right or middle clicks on start #454\r\n\t\t\tif ( data.hover && e.buttons ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.\r\n\t\t\t// iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support\r\n\t\t\t// touch-action: manipulation, but that allows panning, which breaks\r\n\t\t\t// sliders after zooming/on non-responsive pages.\r\n\t\t\t// See: https://bugs.webkit.org/show_bug.cgi?id=133112\r\n\t\t\tif ( !supportsPassive ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\te.calcPoint = e.points[ options.ort ];\r\n\r\n\t\t\t// Call the event handler with the event [ and additional data ].\r\n\t\t\tcallback ( e, data );\r\n\t\t};\r\n\r\n\t\tvar methods = [];\r\n\r\n\t\t// Bind a closure on the target for every event type.\r\n\t\tevents.split(' ').forEach(function( eventName ){\r\n\t\t\telement.addEventListener(eventName, method, supportsPassive ? { passive: true } : false);\r\n\t\t\tmethods.push([eventName, method]);\r\n\t\t});\r\n\r\n\t\treturn methods;\r\n\t}\r\n\r\n\t// Provide a clean event with standardized offset values.\r\n\tfunction fixEvent ( e, pageOffset ) {\r\n\r\n\t\t// Filter the event to register the type, which can be\r\n\t\t// touch, mouse or pointer. Offset changes need to be\r\n\t\t// made on an event specific basis.\r\n\t\tvar touch = e.type.indexOf('touch') === 0;\r\n\t\tvar mouse = e.type.indexOf('mouse') === 0;\r\n\t\tvar pointer = e.type.indexOf('pointer') === 0;\r\n\r\n\t\tvar x;\r\n\t\tvar y;\r\n\r\n\t\t// IE10 implemented pointer events with a prefix;\r\n\t\tif ( e.type.indexOf('MSPointer') === 0 ) {\r\n\t\t\tpointer = true;\r\n\t\t}\r\n\r\n\t\tif ( touch ) {\r\n\r\n\t\t\t// Fix bug when user touches with two or more fingers on mobile devices.\r\n\t\t\t// It's useful when you have two or more sliders on one page,\r\n\t\t\t// that can be touched simultaneously.\r\n\t\t\t// #649, #663, #668\r\n\t\t\tif ( e.touches.length > 1 ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// noUiSlider supports one movement at a time,\r\n\t\t\t// so we can select the first 'changedTouch'.\r\n\t\t\tx = e.changedTouches[0].pageX;\r\n\t\t\ty = e.changedTouches[0].pageY;\r\n\t\t}\r\n\r\n\t\tpageOffset = pageOffset || getPageOffset(scope_Document);\r\n\r\n\t\tif ( mouse || pointer ) {\r\n\t\t\tx = e.clientX + pageOffset.x;\r\n\t\t\ty = e.clientY + pageOffset.y;\r\n\t\t}\r\n\r\n\t\te.pageOffset = pageOffset;\r\n\t\te.points = [x, y];\r\n\t\te.cursor = mouse || pointer; // Fix #435\r\n\r\n\t\treturn e;\r\n\t}\r\n\r\n\t// Translate a coordinate in the document to a percentage on the slider\r\n\tfunction calcPointToPercentage ( calcPoint ) {\r\n\t\tvar location = calcPoint - offset(scope_Base, options.ort);\r\n\t\tvar proposal = ( location * 100 ) / baseSize();\r\n\t\treturn options.dir ? 100 - proposal : proposal;\r\n\t}\r\n\r\n\t// Find handle closest to a certain percentage on the slider\r\n\tfunction getClosestHandle ( proposal ) {\r\n\r\n\t\tvar closest = 100;\r\n\t\tvar handleNumber = false;\r\n\r\n\t\tscope_Handles.forEach(function(handle, index){\r\n\r\n\t\t\t// Disabled handles are ignored\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = Math.abs(scope_Locations[index] - proposal);\r\n\r\n\t\t\tif ( pos < closest ) {\r\n\t\t\t\thandleNumber = index;\r\n\t\t\t\tclosest = pos;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn handleNumber;\r\n\t}\r\n\r\n\t// Moves handle(s) by a percentage\r\n\t// (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])\r\n\tfunction moveHandles ( upward, proposal, locations, handleNumbers ) {\r\n\r\n\t\tvar proposals = locations.slice();\r\n\r\n\t\tvar b = [!upward, upward];\r\n\t\tvar f = [upward, !upward];\r\n\r\n\t\t// Copy handleNumbers so we don't change the dataset\r\n\t\thandleNumbers = handleNumbers.slice();\r\n\r\n\t\t// Check to see which handle is 'leading'.\r\n\t\t// If that one can't move the second can't either.\r\n\t\tif ( upward ) {\r\n\t\t\thandleNumbers.reverse();\r\n\t\t}\r\n\r\n\t\t// Step 1: get the maximum percentage that any of the handles can move\r\n\t\tif ( handleNumbers.length > 1 ) {\r\n\r\n\t\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\r\n\t\t\t\tvar to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false);\r\n\r\n\t\t\t\t// Stop if one of the handles can't move.\r\n\t\t\t\tif ( to === false ) {\r\n\t\t\t\t\tproposal = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tproposal = to - proposals[handleNumber];\r\n\t\t\t\t\tproposals[handleNumber] = to;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// If using one handle, check backward AND forward\r\n\t\telse {\r\n\t\t\tb = f = [true];\r\n\t\t}\r\n\r\n\t\tvar state = false;\r\n\r\n\t\t// Step 2: Try to set the handles with the found percentage\r\n\t\thandleNumbers.forEach(function(handleNumber, o) {\r\n\t\t\tstate = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state;\r\n\t\t});\r\n\r\n\t\t// Step 3: If a handle moved, fire events\r\n\t\tif ( state ) {\r\n\t\t\thandleNumbers.forEach(function(handleNumber){\r\n\t\t\t\tfireEvent('update', handleNumber);\r\n\t\t\t\tfireEvent('slide', handleNumber);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// External event handling\r\n\tfunction fireEvent ( eventName, handleNumber, tap ) {\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\r\n\t\t\tvar eventType = targetEvent.split('.')[0];\r\n\r\n\t\t\tif ( eventName === eventType ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\r\n\t\t\t\t\tcallback.call(\r\n\t\t\t\t\t\t// Use the slider public API as the scope ('this')\r\n\t\t\t\t\t\tscope_Self,\r\n\t\t\t\t\t\t// Return values as array, so arg_1[arg_2] is always valid.\r\n\t\t\t\t\t\tscope_Values.map(options.format.to),\r\n\t\t\t\t\t\t// Handle index, 0 or 1\r\n\t\t\t\t\t\thandleNumber,\r\n\t\t\t\t\t\t// Unformatted slider values\r\n\t\t\t\t\t\tscope_Values.slice(),\r\n\t\t\t\t\t\t// Event is fired by tap, true or false\r\n\t\t\t\t\t\ttap || false,\r\n\t\t\t\t\t\t// Left offset of the handle, in relation to the slider\r\n\t\t\t\t\t\tscope_Locations.slice()\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t// Fire 'end' when a mouse or pen leaves the document.\r\n\tfunction documentLeave ( event, data ) {\r\n\t\tif ( event.type === \"mouseout\" && event.target.nodeName === \"HTML\" && event.relatedTarget === null ){\r\n\t\t\teventEnd (event, data);\r\n\t\t}\r\n\t}\r\n\r\n\t// Handle movement on document for handle and range drag.\r\n\tfunction eventMove ( event, data ) {\r\n\r\n\t\t// Fix #498\r\n\t\t// Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).\r\n\t\t// https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero\r\n\t\t// IE9 has .buttons and .which zero on mousemove.\r\n\t\t// Firefox breaks the spec MDN defines.\r\n\t\tif ( navigator.appVersion.indexOf(\"MSIE 9\") === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) {\r\n\t\t\treturn eventEnd(event, data);\r\n\t\t}\r\n\r\n\t\t// Check if we are moving up or down\r\n\t\tvar movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint);\r\n\r\n\t\t// Convert the movement into a percentage of the slider width/height\r\n\t\tvar proposal = (movement * 100) / data.baseSize;\r\n\r\n\t\tmoveHandles(movement > 0, proposal, data.locations, data.handleNumbers);\r\n\t}\r\n\r\n\t// Unbind move events on document, call callbacks.\r\n\tfunction eventEnd ( event, data ) {\r\n\r\n\t\t// The handle is no longer active, so remove the class.\r\n\t\tif ( scope_ActiveHandle ) {\r\n\t\t\tremoveClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t\tscope_ActiveHandle = false;\r\n\t\t}\r\n\r\n\t\t// Remove cursor styles and text-selection events bound to the body.\r\n\t\tif ( event.cursor ) {\r\n\t\t\tscope_Body.style.cursor = '';\r\n\t\t\tscope_Body.removeEventListener('selectstart', preventDefault);\r\n\t\t}\r\n\r\n\t\t// Unbind the move and end events, which are added on 'start'.\r\n\t\tscope_Listeners.forEach(function( c ) {\r\n\t\t\tscope_DocumentElement.removeEventListener(c[0], c[1]);\r\n\t\t});\r\n\r\n\t\t// Remove dragging class.\r\n\t\tremoveClass(scope_Target, options.cssClasses.drag);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('change', handleNumber);\r\n\t\t\tfireEvent('set', handleNumber);\r\n\t\t\tfireEvent('end', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Bind move events on document.\r\n\tfunction eventStart ( event, data ) {\r\n\r\n\t\tif ( data.handleNumbers.length === 1 ) {\r\n\r\n\t\t\tvar handle = scope_Handles[data.handleNumbers[0]];\r\n\r\n\t\t\t// Ignore 'disabled' handles\r\n\t\t\tif ( handle.hasAttribute('disabled') ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Mark the handle as 'active' so it can be styled.\r\n\t\t\tscope_ActiveHandle = handle.children[0];\r\n\t\t\taddClass(scope_ActiveHandle, options.cssClasses.active);\r\n\t\t}\r\n\r\n\t\t// A drag should never propagate up to the 'tap' event.\r\n\t\tevent.stopPropagation();\r\n\r\n\t\t// Attach the move and end events.\r\n\t\tvar moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, {\r\n\t\t\tstartCalcPoint: event.calcPoint,\r\n\t\t\tbaseSize: baseSize(),\r\n\t\t\tpageOffset: event.pageOffset,\r\n\t\t\thandleNumbers: data.handleNumbers,\r\n\t\t\tbuttonsProperty: event.buttons,\r\n\t\t\tlocations: scope_Locations.slice()\r\n\t\t});\r\n\r\n\t\tvar endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tvar outEvent = attachEvent(\"mouseout\", scope_DocumentElement, documentLeave, {\r\n\t\t\thandleNumbers: data.handleNumbers\r\n\t\t});\r\n\r\n\t\tscope_Listeners = moveEvent.concat(endEvent, outEvent);\r\n\r\n\t\t// Text selection isn't an issue on touch devices,\r\n\t\t// so adding cursor styles can be skipped.\r\n\t\tif ( event.cursor ) {\r\n\r\n\t\t\t// Prevent the 'I' cursor and extend the range-drag cursor.\r\n\t\t\tscope_Body.style.cursor = getComputedStyle(event.target).cursor;\r\n\r\n\t\t\t// Mark the target with a dragging state.\r\n\t\t\tif ( scope_Handles.length > 1 ) {\r\n\t\t\t\taddClass(scope_Target, options.cssClasses.drag);\r\n\t\t\t}\r\n\r\n\t\t\t// Prevent text selection when dragging the handles.\r\n\t\t\t// In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,\r\n\t\t\t// which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,\r\n\t\t\t// meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.\r\n\t\t\t// The 'cursor' flag is false.\r\n\t\t\t// See: http://caniuse.com/#search=selectstart\r\n\t\t\tscope_Body.addEventListener('selectstart', preventDefault, false);\r\n\t\t}\r\n\r\n\t\tdata.handleNumbers.forEach(function(handleNumber){\r\n\t\t\tfireEvent('start', handleNumber);\r\n\t\t});\r\n\t}\r\n\r\n\t// Move closest handle to tapped location.\r\n\tfunction eventTap ( event ) {\r\n\r\n\t\t// The tap event shouldn't propagate up\r\n\t\tevent.stopPropagation();\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\t\tvar handleNumber = getClosestHandle(proposal);\r\n\r\n\t\t// Tackle the case that all handles are 'disabled'.\r\n\t\tif ( handleNumber === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Flag the slider as it is now in a transitional state.\r\n\t\t// Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.\r\n\t\tif ( !options.events.snap ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\tsetHandle(handleNumber, proposal, true, true);\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tfireEvent('slide', handleNumber, true);\r\n\t\tfireEvent('update', handleNumber, true);\r\n\t\tfireEvent('change', handleNumber, true);\r\n\t\tfireEvent('set', handleNumber, true);\r\n\r\n\t\tif ( options.events.snap ) {\r\n\t\t\teventStart(event, { handleNumbers: [handleNumber] });\r\n\t\t}\r\n\t}\r\n\r\n\t// Fires a 'hover' event for a hovered mouse/pen position.\r\n\tfunction eventHover ( event ) {\r\n\r\n\t\tvar proposal = calcPointToPercentage(event.calcPoint);\r\n\r\n\t\tvar to = scope_Spectrum.getStep(proposal);\r\n\t\tvar value = scope_Spectrum.fromStepping(to);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( targetEvent ) {\r\n\t\t\tif ( 'hover' === targetEvent.split('.')[0] ) {\r\n\t\t\t\tscope_Events[targetEvent].forEach(function( callback ) {\r\n\t\t\t\t\tcallback.call( scope_Self, value );\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach events to several slider parts.\r\n\tfunction bindSliderEvents ( behaviour ) {\r\n\r\n\t\t// Attach the standard drag event to the handles.\r\n\t\tif ( !behaviour.fixed ) {\r\n\r\n\t\t\tscope_Handles.forEach(function( handle, index ){\r\n\r\n\t\t\t\t// These events are only bound to the visual handle\r\n\t\t\t\t// element, not the 'real' origin element.\r\n\t\t\t\tattachEvent ( actions.start, handle.children[0], eventStart, {\r\n\t\t\t\t\thandleNumbers: [index]\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Attach the tap event to the slider base.\r\n\t\tif ( behaviour.tap ) {\r\n\t\t\tattachEvent (actions.start, scope_Base, eventTap, {});\r\n\t\t}\r\n\r\n\t\t// Fire hover events\r\n\t\tif ( behaviour.hover ) {\r\n\t\t\tattachEvent (actions.move, scope_Base, eventHover, { hover: true });\r\n\t\t}\r\n\r\n\t\t// Make the range draggable.\r\n\t\tif ( behaviour.drag ){\r\n\r\n\t\t\tscope_Connects.forEach(function( connect, index ){\r\n\r\n\t\t\t\tif ( connect === false || index === 0 || index === scope_Connects.length - 1 ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar handleBefore = scope_Handles[index - 1];\r\n\t\t\t\tvar handleAfter = scope_Handles[index];\r\n\t\t\t\tvar eventHolders = [connect];\r\n\r\n\t\t\t\taddClass(connect, options.cssClasses.draggable);\r\n\r\n\t\t\t\t// When the range is fixed, the entire range can\r\n\t\t\t\t// be dragged by the handles. The handle in the first\r\n\t\t\t\t// origin will propagate the start event upward,\r\n\t\t\t\t// but it needs to be bound manually on the other.\r\n\t\t\t\tif ( behaviour.fixed ) {\r\n\t\t\t\t\teventHolders.push(handleBefore.children[0]);\r\n\t\t\t\t\teventHolders.push(handleAfter.children[0]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\teventHolders.forEach(function( eventHolder ) {\r\n\t\t\t\t\tattachEvent ( actions.start, eventHolder, eventStart, {\r\n\t\t\t\t\t\thandles: [handleBefore, handleAfter],\r\n\t\t\t\t\t\thandleNumbers: [index - 1, index]\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t// Split out the handle positioning logic so the Move event can use it, too\r\n\tfunction checkHandlePosition ( reference, handleNumber, to, lookBackward, lookForward, getValue ) {\r\n\r\n\t\t// For sliders with multiple handles, limit movement to the other handle.\r\n\t\t// Apply the margin option by adding it to the handle positions.\r\n\t\tif ( scope_Handles.length > 1 ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber - 1] + options.margin);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber + 1] - options.margin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The limit option has the opposite effect, limiting handles to a\r\n\t\t// maximum distance from another. Limit must be > 0, as otherwise\r\n\t\t// handles would be unmoveable.\r\n\t\tif ( scope_Handles.length > 1 && options.limit ) {\r\n\r\n\t\t\tif ( lookBackward && handleNumber > 0 ) {\r\n\t\t\t\tto = Math.min(to, reference[handleNumber - 1] + options.limit);\r\n\t\t\t}\r\n\r\n\t\t\tif ( lookForward && handleNumber < scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.max(to, reference[handleNumber + 1] - options.limit);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// The padding option keeps the handles a certain distance from the\r\n\t\t// edges of the slider. Padding must be > 0.\r\n\t\tif ( options.padding ) {\r\n\r\n\t\t\tif ( handleNumber === 0 ) {\r\n\t\t\t\tto = Math.max(to, options.padding);\r\n\t\t\t}\r\n\r\n\t\t\tif ( handleNumber === scope_Handles.length - 1 ) {\r\n\t\t\t\tto = Math.min(to, 100 - options.padding);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tto = scope_Spectrum.getStep(to);\r\n\r\n\t\t// Limit percentage to the 0 - 100 range\r\n\t\tto = limit(to);\r\n\r\n\t\t// Return false if handle can't move\r\n\t\tif ( to === reference[handleNumber] && !getValue ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn to;\r\n\t}\r\n\r\n\tfunction toPct ( pct ) {\r\n\t\treturn pct + '%';\r\n\t}\r\n\r\n\t// Updates scope_Locations and scope_Values, updates visual state\r\n\tfunction updateHandlePosition ( handleNumber, to ) {\r\n\r\n\t\t// Update locations.\r\n\t\tscope_Locations[handleNumber] = to;\r\n\r\n\t\t// Convert the value to the slider stepping/range.\r\n\t\tscope_Values[handleNumber] = scope_Spectrum.fromStepping(to);\r\n\r\n\t\t// Called synchronously or on the next animationFrame\r\n\t\tvar stateUpdate = function() {\r\n\t\t\tscope_Handles[handleNumber].style[options.style] = toPct(to);\r\n\t\t\tupdateConnect(handleNumber);\r\n\t\t\tupdateConnect(handleNumber + 1);\r\n\t\t};\r\n\r\n\t\t// Set the handle to the new position.\r\n\t\t// Use requestAnimationFrame for efficient painting.\r\n\t\t// No significant effect in Chrome, Edge sees dramatic performace improvements.\r\n\t\t// Option to disable is useful for unit tests, and single-step debugging.\r\n\t\tif ( window.requestAnimationFrame && options.useRequestAnimationFrame ) {\r\n\t\t\twindow.requestAnimationFrame(stateUpdate);\r\n\t\t} else {\r\n\t\t\tstateUpdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction setZindex ( ) {\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\t// Handles before the slider middle are stacked later = higher,\r\n\t\t\t// Handles after the middle later is lower\r\n\t\t\t// [[7] [8] .......... | .......... [5] [4]\r\n\t\t\tvar dir = (scope_Locations[handleNumber] > 50 ? -1 : 1);\r\n\t\t\tvar zIndex = 3 + (scope_Handles.length + (dir * handleNumber));\r\n\t\t\tscope_Handles[handleNumber].childNodes[0].style.zIndex = zIndex;\r\n\t\t});\r\n\t}\r\n\r\n\t// Test suggested values and apply margin, step.\r\n\tfunction setHandle ( handleNumber, to, lookBackward, lookForward ) {\r\n\r\n\t\tto = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false);\r\n\r\n\t\tif ( to === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tupdateHandlePosition(handleNumber, to);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Updates style attribute for connect nodes\r\n\tfunction updateConnect ( index ) {\r\n\r\n\t\t// Skip connects set to false\r\n\t\tif ( !scope_Connects[index] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar l = 0;\r\n\t\tvar h = 100;\r\n\r\n\t\tif ( index !== 0 ) {\r\n\t\t\tl = scope_Locations[index - 1];\r\n\t\t}\r\n\r\n\t\tif ( index !== scope_Connects.length - 1 ) {\r\n\t\t\th = scope_Locations[index];\r\n\t\t}\r\n\r\n\t\tscope_Connects[index].style[options.style] = toPct(l);\r\n\t\tscope_Connects[index].style[options.styleOposite] = toPct(100 - h);\r\n\t}\r\n\r\n\t// ...\r\n\tfunction setValue ( to, handleNumber ) {\r\n\r\n\t\t// Setting with null indicates an 'ignore'.\r\n\t\t// Inputting 'false' is invalid.\r\n\t\tif ( to === null || to === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If a formatted number was passed, attemt to decode it.\r\n\t\tif ( typeof to === 'number' ) {\r\n\t\t\tto = String(to);\r\n\t\t}\r\n\r\n\t\tto = options.format.from(to);\r\n\r\n\t\t// Request an update for all links if the value was invalid.\r\n\t\t// Do so too if setting the handle fails.\r\n\t\tif ( to !== false && !isNaN(to) ) {\r\n\t\t\tsetHandle(handleNumber, scope_Spectrum.toStepping(to), false, false);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set the slider value.\r\n\tfunction valueSet ( input, fireSetEvent ) {\r\n\r\n\t\tvar values = asArray(input);\r\n\t\tvar isInit = scope_Locations[0] === undefined;\r\n\r\n\t\t// Event fires by default\r\n\t\tfireSetEvent = (fireSetEvent === undefined ? true : !!fireSetEvent);\r\n\r\n\t\tvalues.forEach(setValue);\r\n\r\n\t\t// Animation is optional.\r\n\t\t// Make sure the initial values were set before using animated placement.\r\n\t\tif ( options.animate && !isInit ) {\r\n\t\t\taddClassFor(scope_Target, options.cssClasses.tap, options.animationDuration);\r\n\t\t}\r\n\r\n\t\t// Now that all base values are set, apply constraints\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\t\t\tsetHandle(handleNumber, scope_Locations[handleNumber], true, false);\r\n\t\t});\r\n\r\n\t\tsetZindex();\r\n\r\n\t\tscope_HandleNumbers.forEach(function(handleNumber){\r\n\r\n\t\t\tfireEvent('update', handleNumber);\r\n\r\n\t\t\t// Fire the event only for handles that received a new value, as per #579\r\n\t\t\tif ( values[handleNumber] !== null && fireSetEvent ) {\r\n\t\t\t\tfireEvent('set', handleNumber);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Reset slider to initial values\r\n\tfunction valueReset ( fireSetEvent ) {\r\n\t\tvalueSet(options.start, fireSetEvent);\r\n\t}\r\n\r\n\t// Get the slider value.\r\n\tfunction valueGet ( ) {\r\n\r\n\t\tvar values = scope_Values.map(options.format.to);\r\n\r\n\t\t// If only one handle is used, return a single value.\r\n\t\tif ( values.length === 1 ){\r\n\t\t\treturn values[0];\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n\t// Removes classes from the root and empties it.\r\n\tfunction destroy ( ) {\r\n\r\n\t\tfor ( var key in options.cssClasses ) {\r\n\t\t\tif ( !options.cssClasses.hasOwnProperty(key) ) { continue; }\r\n\t\t\tremoveClass(scope_Target, options.cssClasses[key]);\r\n\t\t}\r\n\r\n\t\twhile (scope_Target.firstChild) {\r\n\t\t\tscope_Target.removeChild(scope_Target.firstChild);\r\n\t\t}\r\n\r\n\t\tdelete scope_Target.noUiSlider;\r\n\t}\r\n\r\n\t// Get the current step size for the slider.\r\n\tfunction getCurrentStep ( ) {\r\n\r\n\t\t// Check all locations, map them to their stepping point.\r\n\t\t// Get the step point, then find it in the input list.\r\n\t\treturn scope_Locations.map(function( location, index ){\r\n\r\n\t\t\tvar nearbySteps = scope_Spectrum.getNearbySteps( location );\r\n\t\t\tvar value = scope_Values[index];\r\n\t\t\tvar increment = nearbySteps.thisStep.step;\r\n\t\t\tvar decrement = null;\r\n\r\n\t\t\t// If the next value in this step moves into the next step,\r\n\t\t\t// the increment is the start of the next step - the current value\r\n\t\t\tif ( increment !== false ) {\r\n\t\t\t\tif ( value + increment > nearbySteps.stepAfter.startValue ) {\r\n\t\t\t\t\tincrement = nearbySteps.stepAfter.startValue - value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// If the value is beyond the starting point\r\n\t\t\tif ( value > nearbySteps.thisStep.startValue ) {\r\n\t\t\t\tdecrement = nearbySteps.thisStep.step;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( nearbySteps.stepBefore.step === false ) {\r\n\t\t\t\tdecrement = false;\r\n\t\t\t}\r\n\r\n\t\t\t// If a handle is at the start of a step, it always steps back into the previous step first\r\n\t\t\telse {\r\n\t\t\t\tdecrement = value - nearbySteps.stepBefore.highestStep;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// Now, if at the slider edges, there is not in/decrement\r\n\t\t\tif ( location === 100 ) {\r\n\t\t\t\tincrement = null;\r\n\t\t\t}\r\n\r\n\t\t\telse if ( location === 0 ) {\r\n\t\t\t\tdecrement = null;\r\n\t\t\t}\r\n\r\n\t\t\t// As per #391, the comparison for the decrement step can have some rounding issues.\r\n\t\t\tvar stepDecimals = scope_Spectrum.countStepDecimals();\r\n\r\n\t\t\t// Round per #391\r\n\t\t\tif ( increment !== null && increment !== false ) {\r\n\t\t\t\tincrement = Number(increment.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\tif ( decrement !== null && decrement !== false ) {\r\n\t\t\t\tdecrement = Number(decrement.toFixed(stepDecimals));\r\n\t\t\t}\r\n\r\n\t\t\treturn [decrement, increment];\r\n\t\t});\r\n\t}\r\n\r\n\t// Attach an event to this slider, possibly including a namespace\r\n\tfunction bindEvent ( namespacedEvent, callback ) {\r\n\t\tscope_Events[namespacedEvent] = scope_Events[namespacedEvent] || [];\r\n\t\tscope_Events[namespacedEvent].push(callback);\r\n\r\n\t\t// If the event bound is 'update,' fire it immediately for all handles.\r\n\t\tif ( namespacedEvent.split('.')[0] === 'update' ) {\r\n\t\t\tscope_Handles.forEach(function(a, index){\r\n\t\t\t\tfireEvent('update', index);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Undo attachment of event\r\n\tfunction removeEvent ( namespacedEvent ) {\r\n\r\n\t\tvar event = namespacedEvent && namespacedEvent.split('.')[0];\r\n\t\tvar namespace = event && namespacedEvent.substring(event.length);\r\n\r\n\t\tObject.keys(scope_Events).forEach(function( bind ){\r\n\r\n\t\t\tvar tEvent = bind.split('.')[0],\r\n\t\t\t\ttNamespace = bind.substring(tEvent.length);\r\n\r\n\t\t\tif ( (!event || event === tEvent) && (!namespace || namespace === tNamespace) ) {\r\n\t\t\t\tdelete scope_Events[bind];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// Updateable: margin, limit, padding, step, range, animate, snap\r\n\tfunction updateOptions ( optionsToUpdate, fireSetEvent ) {\r\n\r\n\t\t// Spectrum is created using the range, snap, direction and step options.\r\n\t\t// 'snap' and 'step' can be updated.\r\n\t\t// If 'snap' and 'step' are not passed, they should remain unchanged.\r\n\t\tvar v = valueGet();\r\n\r\n\t\tvar updateAble = ['margin', 'limit', 'padding', 'range', 'animate', 'snap', 'step', 'format'];\r\n\r\n\t\t// Only change options that we're actually passed to update.\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toriginalOptions[name] = optionsToUpdate[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar newOptions = testOptions(originalOptions);\r\n\r\n\t\t// Load new options into the slider state\r\n\t\tupdateAble.forEach(function(name){\r\n\t\t\tif ( optionsToUpdate[name] !== undefined ) {\r\n\t\t\t\toptions[name] = newOptions[name];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tscope_Spectrum = newOptions.spectrum;\r\n\r\n\t\t// Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)\r\n\t\toptions.margin = newOptions.margin;\r\n\t\toptions.limit = newOptions.limit;\r\n\t\toptions.padding = newOptions.padding;\r\n\r\n\t\t// Update pips, removes existing.\r\n\t\tif ( options.pips ) {\r\n\t\t\tpips(options.pips);\r\n\t\t}\r\n\r\n\t\t// Invalidate the current positioning so valueSet forces an update.\r\n\t\tscope_Locations = [];\r\n\t\tvalueSet(optionsToUpdate.start || v, fireSetEvent);\r\n\t}\r\n\r\n\t// Throw an error if the slider was already initialized.\r\n\tif ( scope_Target.noUiSlider ) {\r\n\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): Slider was already initialized.\");\r\n\t}\r\n\r\n\t// Create the base element, initialise HTML and set classes.\r\n\t// Add handles and connect elements.\r\n\taddSlider(scope_Target);\r\n\taddElements(options.connect, scope_Base);\r\n\r\n\tscope_Self = {\r\n\t\tdestroy: destroy,\r\n\t\tsteps: getCurrentStep,\r\n\t\ton: bindEvent,\r\n\t\toff: removeEvent,\r\n\t\tget: valueGet,\r\n\t\tset: valueSet,\r\n\t\treset: valueReset,\r\n\t\t// Exposed for unit testing, don't use this in your application.\r\n\t\t__moveHandles: function(a, b, c) { moveHandles(a, b, scope_Locations, c); },\r\n\t\toptions: originalOptions, // Issue #600, #678\r\n\t\tupdateOptions: updateOptions,\r\n\t\ttarget: scope_Target, // Issue #597\r\n\t\tremovePips: removePips,\r\n\t\tpips: pips // Issue #594\r\n\t};\r\n\r\n\t// Attach user events.\r\n\tbindSliderEvents(options.events);\r\n\r\n\t// Use the public value method to set the start values.\r\n\tvalueSet(options.start);\r\n\r\n\tif ( options.pips ) {\r\n\t\tpips(options.pips);\r\n\t}\r\n\r\n\tif ( options.tooltips ) {\r\n\t\ttooltips();\r\n\t}\r\n\r\n\taria();\r\n\r\n\treturn scope_Self;\r\n\r\n}\r\n\r\n\r\n\t// Run the standard initializer\r\n\tfunction initialize ( target, originalOptions ) {\r\n\r\n\t\tif ( !target || !target.nodeName ) {\r\n\t\t\tthrow new Error(\"noUiSlider (\" + VERSION + \"): create requires a single element, got: \" + target);\r\n\t\t}\r\n\r\n\t\t// Test the options and create the slider environment;\r\n\t\tvar options = testOptions( originalOptions, target );\r\n\t\tvar api = closure( target, options, originalOptions );\r\n\r\n\t\ttarget.noUiSlider = api;\r\n\r\n\t\treturn api;\r\n\t}\r\n\r\n\t// Use an object instead of a function for future expansibility;\r\n\treturn {\r\n\t\tversion: VERSION,\r\n\t\tcreate: initialize\r\n\t};\r\n\r\n}));","AndrewMartin.carousels = [];\n\nAndrewMartin.carousel = () => {\n\n    const activeButton = '<button class=\"slick-polygon-button\">' +\n                            '<svg width=\"30px\" height=\"30px\" viewBox=\"0 0 30 30\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">' +\n                                '<polygon id=\"path-1\" points=\"15 0 14.3169392 1.99095879 1.99095879 14.3162292 0 15 1.99095879 15.6834158 14.3169392 28.0090412 15 30 15.6834158 28.0090412 28.0090412 15.6834158 30 15 28.0090412 14.3162292 15.6834158 1.99095879\"></polygon>' +\n                            '</svg>' +\n                        '</button>';\n\n    // Hero carousel\n    document.querySelectorAll('.js-carousel--hero').forEach((el, i) => {\n        el.classList.add('js-carousel--hero-' + i);\n\n        let carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            adaptiveHeight: true,\n            autoplay: true,\n            autoplaySpeed: 7000,\n            fade: true,\n            speed: 300,\n            pauseOnHover: false,\n            pauseOnFocus: false\n        }, 'hero-' + i);\n\n        $(el).on(('init reInit afterChange'), (event, slick, currentSlide) => {\n            const activeSlideIndex = typeof currentSlide === 'undefined' ? 0 : currentSlide;\n            const currentSlideElement = $(slick.$slides[activeSlideIndex]);\n            const heroItemRightExists = currentSlideElement.find('.hero__item--right').length > 0;\n            const slickDots = $(slick.$dots);\n\n            if (heroItemRightExists) {\n                slickDots.addClass('slick-dots--left');\n                slickDots.removeClass('slick-dots--right');\n            } else {\n                slickDots.addClass('slick-dots--right');\n                slickDots.removeClass('slick-dots--left');\n            }\n\n            const heroItem = currentSlideElement.get(0).querySelector('.hero__item');\n\n            if (heroItem && !heroItem.dataset.seen) {\n                const observer = new IntersectionObserver(([entry]) => {\n                    if (entry.isIntersecting) {\n                        heroItem.dataset.seen = true;\n\n                        window.dataLayer.push({\n                            event: 'hero_banner_view',\n                            hero_banner_id: heroItem.dataset.gaId,\n                            hero_banner: heroItem.dataset.gaLabel,\n                            hero_banner_position: activeSlideIndex,\n                        });\n\n                        observer.disconnect();\n                    }\n                });\n\n                observer.observe(currentSlideElement.get(0));\n            }\n        });\n\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Quote carousel\n    document.querySelectorAll('.js-carousel--quote').forEach((el, i) => {\n        el.classList.add('js-carousel--quote-' + i);\n\n        let carousel = new Carousel({\n            dots: true,\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'quote-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Review carousel\n    document.querySelectorAll('.js-carousel--reviews').forEach((el, i) => {\n        el.classList.add('js-carousel--reviews-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.overlay-reviews__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 4,\n            slidesToScroll: 4,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: {\n                        slidesToShow: 1.5,\n                        slidesToScroll: 1,\n                    }\n                }\n            ],\n            autoplay: false,\n            speed: 1000\n        }, 'reviews-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Design review carousel\n    document.querySelectorAll('.js-carousel--design-review').forEach((el, i) => {\n        el.classList.add('js-carousel--design-review-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 6,\n            responsive: [\n                {\n                    breakpoint: 1920,\n                    settings: {\n                        slidesToShow: 5,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 1680,\n                    settings: {\n                        slidesToShow: 4,\n                        slidesToScroll: 1\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1\n                    }\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: false,\n            speed: 1000\n        }, 'design-review-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Complete the look carousel (carbon copy of above)\n    document.querySelectorAll('.js-carousel--product-recommended').forEach((el, i) => {\n\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-recommended-' + i);\n\n        const title = el.previousElementSibling;\n\n        let carousel = new Carousel({\n            appendArrows: $(title),\n            slidesToShow: 4,\n            swipeToSlide: true,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2,\n                        slidesToScroll: 1,\n                        swipeToSlide: true,\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick',\n                },\n            ],\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: false,\n            speed: 200\n        }, 'product-recommended-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n\n    // Get inspired carousel\n    document.querySelectorAll('.js-carousel--inspired').forEach((el, i) => {\n        el.classList.add('js-carousel--inspired-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 1000\n        }, 'inspired-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n      // Split Feature block carousel\n      document.querySelectorAll('.js-carousel--split-feature').forEach((el, i) => {\n        el.classList.add('js-carousel--split-feature-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            swipe: true,\n            autoplay: true,\n            fade: true,\n            speed: 1000\n        }, 'split-feature-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n     // PDP callout carousel\n     document.querySelectorAll('.js-carousel--product').forEach((el, i) => {\n        el.classList.add('js-carousel--product-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            dots: false,\n            arrows: true,\n            swipe: true,\n            infinite: false,\n            autoplay: false,\n            fade: true,\n            speed: 300\n        }, 'product-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP mobile gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            dots: true,\n            filter: {\n                selector: function() { return $('.slick-show', this).length === 1; },\n                breakpoint: AndrewMartin.breakpoints.tablet.size\n            },\n            customPaging: function() {\n                return activeButton;\n            },\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            fade: true,\n            cssEase: 'linear',\n            speed: 100\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // PDP gallery carousel\n    document.querySelectorAll('.js-carousel--product-gallery-v2').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        const prevButton = document.querySelector('[data-mobile-prev]');\n        const nextButton = document.querySelector('[data-mobile-next]');\n        const count = document.querySelector('[data-carousel-count]');\n\n        if (window.matchMedia('(max-width: 999px)').matches && (nextButton || prevButton)) {\n            prevButton.addEventListener('click', () => {\n                $(el).slick('slickPrev');\n            })\n\n            nextButton.addEventListener('click', () => {\n                $(el).slick('slickNext');\n            })\n\n            $(el).on('init reInit afterChange', (event, slick, currentSlide) => {\n                //currentSlide is undefined on init -- set it to 0 in this case (currentSlide is 0 based)\n                const i = (currentSlide ? currentSlide : 0) + 1;\n\n                count.innerText = `${i}/${slick.slideCount}`\n            });\n        }\n\n        el.classList.add('js-carousel--product-gallery-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 1,\n            slidesToScroll: 1,\n            arrows: true,\n            swipe: true,\n            infinite: true,\n            autoplay: false,\n            mobileFirst: true,\n            dots: false,\n            fade: true,\n            cssEase: 'linear',\n            asNavFor: '.js-carousel--product-thumbnails',\n            speed: 100,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: {\n                        swipe: false,\n                    },\n                },\n            ],\n        }, 'product-gallery-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n\n        if (window.matchMedia('(max-width: 999px)').matches) {\n            $(el).slick('slickFilter', function() {\n                return $('.slick-show', this).length === 1;\n            });\n        }\n    });\n\n    // PDP thumbnails\n    document.querySelectorAll('.js-carousel--product-thumbnails').forEach((el, i) => {\n        if (el.classList.contains('slick-slider')) {\n            return;\n        }\n\n        el.classList.add('js-carousel--product-thumbnails-' + i);\n\n        let carousel = new Carousel({\n            slidesToShow: 4.5,\n            asNavFor: '.js-carousel--product-gallery-v2',\n            focusOnSelect: true,\n            infinite: false,\n            dots: false,\n            responsive: [\n                {\n                    breakpoint: 999,\n                    settings: \"unslick\",\n                },\n            ],\n        }, 'product-thumbnails-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n\n    // Categories Block Carousel\n    document.querySelectorAll('.js-carousel--categories').forEach((el, i) => {\n        el.classList.add('js-carousel--categories-' + i);\n\n        let carousel = new Carousel({\n            appendArrows: $('.categories-carousel__controls'),\n            dots: false,\n            swipe: true,\n            arrows: true,\n            infinite: false,\n            slidesToShow: 3.75,\n            slidesToScroll: 1,\n            responsive: [\n                {\n                    breakpoint: 1200,\n                    settings: {\n                        slidesToShow: 3.3,\n                        slidesToScroll: 3\n                    }\n                },\n                {\n                    breakpoint: 999,\n                    settings: {\n                        slidesToShow: 2.3,\n                        slidesToScroll: 2\n                    }\n                },\n                {\n                    breakpoint: 680,\n                    settings: 'unslick'\n                }\n            ],\n            autoplay: false,\n            speed: 200\n        }, 'categories-' + i);\n        carousel.init($(el));\n\n        AndrewMartin.carousels.push(carousel);\n    });\n}\n","AndrewMartin.siteNoticeMessages = [];\nAndrewMartin.siteNotice = () => {\n    AndrewMartin.siteNoticeMessages = document.querySelectorAll('.js-header-message');\n\n    function loopMessages(active)  {\n        if (AndrewMartin.siteNoticeMessages.length) {\n            AndrewMartin.siteNoticeMessages.forEach((m) => {\n                m.classList.add('notice__content--hidden');\n            })\n\n            AndrewMartin.siteNoticeMessages[active].classList.remove('notice__content--hidden')\n\n            if (++active >= AndrewMartin.siteNoticeMessages.length) {\n                active = 0;\n            }\n\n            setTimeout(() => {\n                loopMessages(active)\n            }, 7000)\n        }\n    }\n\n    if (AndrewMartin.siteNoticeMessages.length) {\n        loopMessages(0);\n    }\n}\n","AndrewMartin.bloomreach = () => {\n    $('.js-bloomreach-identify').on('submit', function() {\n        if (typeof exponea === 'undefined') {\n            console.error('Bloomreach not initialised');\n            return true;\n        }\n\n        const email = $(this).find('input[name$=\"email\"]').val() || $(this).find('input[name$=\"email]\"]').val();\n\n        if (!email) {\n            console.error('No email address to send to bloomreach');\n            return true;\n        }\n\n        exponea.identify(\n            {\n              'email_id': email\n            },\n            {\n              'email': email\n            }\n        );\n\n        return true;\n    });\n}\n","AndrewMartin.klaviyo = () => {\n    !function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return\"push\"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t=\"function\"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();\n\n    const form = document.querySelector('.js-klaviyo-identify');\n\n    if (!form) {\n        console.error('Klaviyo form not found');\n        return;\n    }\n\n    form.addEventListener('submit', (event) => {\n        if (typeof klaviyo === 'undefined') {\n            console.error('Klaviyo not initialised');\n            return true;\n        }\n\n        const email = event.currentTarget.querySelector('input[name$=\"email\"]').value || event.currentTarget.querySelector('input[name$=\"email]\"]').value;\n\n        if (!email) {\n            console.error('No email address to send to klaviyo');\n            return true;\n        }\n\n        klaviyo.identify({\n            'email': email\n        }).then(() => {\n            console.log('Klaviyo identify success');\n        });\n\n        return true;\n    });\n}\n","/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Neil Brayfield <neil@d3r.com>\n */\n$.fn.checkReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.change(function (e) {\n\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n","/**\n * I would do this in CSS but we need to add in the SVG\n * symbol anyway and we only want to show the custom\n * checkbox if this code is run so better to do it here\n *\n * @author Andy Hartley <andy.hartley@d3r.com>\n */\n$.fn.customCheckReplace = function() {\n    $(this).each(function() {\n        var current = $(this);\n        current.wrap('<div class=\"check-replace\"></div>').hide();\n\n        var wrap = $(this).parent();\n\n        wrap.append(\n            '<svg class=\"icon-tick\">' +\n                '<use xlink:href=\"' + AndrewMartin.svgSymbolsFile + '#icon-tick\" />' +\n            '</svg>'\n        );\n\n        current.change(function (e) {\n            if (current.prop('checked')) {\n                wrap.addClass('check-replace--active');\n            } else {\n                wrap.removeClass('check-replace--active');\n            }\n\n            if (e.isTrigger) {\n                return false;\n            }\n\n            return true;\n        });\n\n        $(this).trigger('change');\n    });\n};\n"],"sourceRoot":"../../../../resources/javascript"}