{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/js/controllers/AvatarFixController.js","webpack:///./assets/js/controllers/MapController.js","webpack:///./assets/js/controllers/NotesController.js","webpack:///./assets/js/controllers/NumberAnimationController.js","webpack:///./assets/js/controllers/OrganizationsController.js","webpack:///./assets/js/controllers/PublicationsFilterController.js","webpack:///./assets/js/controllers/QuizController.js","webpack:///./assets/js/controllers/ScrollToTopController.js","webpack:///./assets/js/controllers/SearchbarController.js","webpack:///./assets/js/controllers/SliderController.js","webpack:///./assets/js/controllers/StoryController.js","webpack:///./assets/js/controllers/TeamMemberController.js","webpack:///./assets/js/controllers/ToggleController.js","webpack:///./assets/js/radikal.js","webpack:///./assets/js/utils/Cookies.js","webpack:///./assets/js/utils/Utils.js","webpack:///./assets/js/utils/Whatsub.js","webpack:///./node_modules/desandro-matches-selector/matches-selector.js","webpack:///./node_modules/enquire.js/src/MediaQuery.js","webpack:///./node_modules/enquire.js/src/MediaQueryDispatch.js","webpack:///./node_modules/enquire.js/src/QueryHandler.js","webpack:///./node_modules/enquire.js/src/Util.js","webpack:///./node_modules/enquire.js/src/index.js","webpack:///./node_modules/ev-emitter/ev-emitter.js","webpack:///./node_modules/fizzy-ui-utils/utils.js","webpack:///./node_modules/flickity/js/add-remove-cell.js","webpack:///./node_modules/flickity/js/animate.js","webpack:///./node_modules/flickity/js/cell.js","webpack:///./node_modules/flickity/js/drag.js","webpack:///./node_modules/flickity/js/flickity.js","webpack:///./node_modules/flickity/js/index.js","webpack:///./node_modules/flickity/js/lazyload.js","webpack:///./node_modules/flickity/js/page-dots.js","webpack:///./node_modules/flickity/js/player.js","webpack:///./node_modules/flickity/js/prev-next-button.js","webpack:///./node_modules/flickity/js/slide.js","webpack:///./node_modules/get-size/get-size.js","webpack:///./node_modules/unidragger/unidragger.js","webpack:///./node_modules/unipointer/unipointer.js","webpack:///./node_modules/vanilla-lazyload/dist/lazyload.js"],"names":["AvatarFixController","avatars","document","querySelectorAll","avatar","img","querySelector","imgSrc","getAttribute","setAttribute","MapController","mapWrappers","mapInit","wrapper","map","countriesPaths","activeCountries","split","country","trim","toUpperCase","setMapCountriesInActive","classList","add","countryPath","countryID","geo","indexOf","style","opacity","p","timber_params","NotesController","noteBlocks","noteBlock","modal","notesContainer","close","open","form","addEventListener","e","handleModal","handleCloseButtonClick","handleFormSubmit","handleNotePositions","body","showModal","reset","message","innerHTML","contains","remove","preventDefault","formData","FormData","append","acf_nonce","fetch","ajaxurl","method","then","response","json","data","success","createElement","appendChild","alert","error","console","container","placeItems","window","gap","maxAttempts","items","containerWidth","offsetWidth","containerHeight","offsetHeight","placedPositions","item","visibility","zIndex","itemWidth","itemHeight","top","left","isValidPosition","attempts","Math","random","every","pos","xDistance","abs","yDistance","log","push","width","height","position","getRandomColor","NumberAnimationController","observeNumbers","animateNumbers","counters","forEach","counter","target","isNaN","countNumbers","cycleLetters","observer","IntersectionObserver","entries","entry","isIntersecting","closest","unobserve","root","rootMargin","threshold","observe","parseFloat","increment","current","hasDecimals","updateCounter","textContent","toFixed","round","requestAnimationFrame","targetText","targetLetters","placeholders","join","cyclingIntervals","letter","index","isUpperCase","setInterval","getRandomLetter","setTimeout","clearInterval","String","fromCharCode","floor","OrganizationsController","tabs","length","enquire","register","match","countriesFirstLetterNavigationMobile","setFirstToggleActiveMobile","countryNavigationSelect","countryTabs","unmatch","destroyMobileCountryTabs","countriesFirstLetterNavigationDesktop","list","letters","tab","charAt","listItem","button","destroyCountriesFirstLetterNavigationDesktop","selectWrapper","select","option","hiddenElements","el","setFirstToggleActiveDesktop","toggles","toggleCountries","value","countryCode","toggleOrgsByCountry","setItemActive","currentTarget","countryNavigationButtons","buttons","selects","countriesFirstLetter","allowedCountries","hideAllTabs","showTabs","hideAllOrgs","country_code","showOrgsByCountry","code","countries","PublicationsFilterController","filterPublications","addFilter","filters","key","id","getElementById","filterForm","searchSubmit","resetButton","matches","parts","page","pop","offset","loadmore","posts_per_page","getFilteredPublications","filterSelectsEventListener","attachEvent","resetFilters","tagName","selectedIndex","setLoadingState","removeLoadingState","appendFilter","cat","undefined","nonce","posts","is_search","lang","params","URLSearchParams","credentials","text","quizBlocks","c","correct","incorrect","visuallyCorrect","visuallyIncorrect","timeoutId","correctAnswersGiven","allAnswersGiven","quizStatus","finished","allCorrect","QuizController","WhatSub","subscribe","event","quizBlock","multiQuizScriptTag","multiQuizData","JSON","parse","quizDivs","submitButton","resultsModal","quizDiv","quizId","cookieName","foundCookie","getCookie","quizModal","scripTag","quizData","answers","answer","handleAnswerChange","allPopupData","popups","popupData","getPopupByCorrectAnswers","resultsModalInner","setPopupMessage","givenAnswers","dataset","submitted","dispatch","title","content","tag","size","colour","styled","align","titleClass","htmlTitle","html","element","section_id","block","scrollTo","offsetTop","behavior","handleActionCookie","answerId","messageDiv","currentAnswer","filter","correctAnswers","is_correct","userCorrectChoices","userIncorrectChoices","allow_multiple","toggleAnswerClasses","resetAnswerClasses","setAnswerClasses","mapQuestions","allCorrectChoicesAreChosen","areArraysEqual","anyAnswerIsChosen","clearTimeout","deleteCookie","noAnswers","isCorrect","handleNoAnswers","handleIncorrectAnswers","handleCorrectAnswers","highlightCorrectAnswers","correctAnswer","status","error_message","type","success_message","action","handleClickRedirect","handleAutoRedirect","createLinkNode","redirect_link","link_text","link","href","redirectButton","correct_answers","Number","find","delay","redirect_delay","location","allowCookie","cookieLifeTime","set_cookie_on_redirect","redirect_cookie_lifetime","set_cookie_on_close","close_cookie_lifetime","setCookie","toggleClass","quiz","allChoices","choice","removeClasses","inputs","Array","from","input","ScrollToTopController","scrollY","SearchbarController","openSearchForm","closeSearchForm","parentNode","focus","SliderController","initSliders","sliders","slider","autoplay","parseInt","friction","attraction","pauseOnHover","cellAlign","groupCells","dots","arrows","flkty","Flickity","contain","pageDots","prevNextButtons","wrapAround","lazyLoad","autoPlay","selectedAttraction","pauseAutoPlayOnHover","StoryController","storiesSections","storiesSection","storyModals","storyModalTriggers","storyModalTrigger","targetModal","modalDialog","TeamMemberController","bioHover","team","member","triggers","popup","trigger","ToggleController","toggle","selector","stopImmediatePropagation","menuID","menu","showMenu","hideMenu","init","unsubscribe","lazyLoadImages","cname","name","decodedCookie","decodeURIComponent","cookie","ca","i","substring","cvalue","exdays","path","date","setDateInFuture","setDateInPast","d","Date","setTime","getTime","daysInMilliSeconds","toUTCString","days","myLazyLoad","LazyLoad","elements_selector","convertRemToPixels","rem","getComputedStyle","documentElement","fontSize","array1","array2","sortedArray1","sort","sortedArray2","classNames","className","subscribers","WhatsSub","callback","priority","targets","isArray","subscriber","apply","getSubscribers","getSubscribersByEvent"],"mappings":"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CA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,4BAA4B;AAC3C,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,eAAe,SAAS;AACxB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,SAAS;;AAET;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,mBAAmB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpFA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAU,YAAY;AACtB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3CA,yBAAyB,mBAAO,CAAC,iFAAsB;AACvD;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAMN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC/GD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,qIAA4C;AAClD,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAC;AACN,GAAG,MAAM,EAYN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;AACH;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AChPD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAcN;;AAEH,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AChKD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAaN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACzMD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,mFAAmB;AACzB,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAaN;;AAEH,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC7GD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,2FAAuB;AAC7B,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAgBN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO,IAAI,YAAY,OAAO,UAAU,QAAQ;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACnYD;AACA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,2FAAuB;AAC7B,MAAM,mFAAmB;AACzB,MAAM,yFAAsB;AAC5B,MAAM,uEAAQ;AACd,MAAM,yEAAS;AACf,MAAM,6EAAW;AACjB,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,kBAwBN;;AAEH,CAAC;AACD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,+BAA+B;AAC1C,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,cAAc;AAC3B;AACA;AACA;AACA,kBAAkB,uBAAuB;AACzC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,uBAAuB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,0BAA0B;AACrC,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,sBAAsB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACv6BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,uEAAQ;AACd,MAAM,+FAAoB;AAC1B,MAAM,iFAAa;AACnB,MAAM,2EAAU;AAChB,MAAM,6FAAmB;AACzB,MAAM,+EAAY;AAClB,KAAK,oCAAE,OAAO;AAAA;AAAA;AAAA,oGAAE;AAChB,GAAG,MAAM,EAWN;;AAEH,CAAC;AACD;AACA,CAAC;;;;;;;;;;;;ACvCD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAcN;;AAEH,CAAC;AACD;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACtID;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,2FAAuB;AAC7B,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAgBN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC1LD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,2FAAuB;AAC7B,MAAM,yFAAsB;AAC5B,MAAM,+EAAY;AAClB,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAcN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC7LD;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,+EAAY;AAClB,MAAM,2FAAuB;AAC7B,MAAM,yFAAsB;AAC5B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAE;AACP,GAAG,MAAM,EAgBN;;AAEH,CAAC;AACD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACjND;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAON;;AAEH,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,CAAC;;;;;;;;;;;;ACxED;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,oCAAQ,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAE;AACrB,GAAG,MAAM,EAMN;;AAEH,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC9MD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,2FAAuB;AAC7B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAC;AACN,GAAG,MAAM,EAYN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC1RD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO,IAAyC;AAChD;AACA,IAAI,iCAAQ;AACZ,MAAM,2FAAuB;AAC7B,KAAK,mCAAE;AACP;AACA,KAAK;AAAA,oGAAC;AACN,GAAG,MAAM,EAYN;;AAEH,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;AC7SD,qHAAmD,gBAAgB,sBAAsB,OAAO,2BAA2B,0BAA0B,yDAAyD,2BAA2B,EAAE,EAAE,EAAE,eAAe;;AAE9P,oGAAoG,mBAAmB,EAAE,mBAAmB,8HAA8H;;AAE1Q;AACA,EAAE,MAA8B,GAAG,SAAW,kGAAkG,KAA0C,GAAG,oCAAO,OAAO;AAAA;AAAA;AAAA;AAAA,oGAAC,GAAG,SAA2B;AAC1O,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,UAAU,qBAAqB,EAAE;AAC1E,GAAG;AACH;AACA;AACA,qDAAqD,qBAAqB;AAC1E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,+BAA+B,0BAA0B;AACzD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,kCAAkC;AAC7D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAc,oBAAoB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC,E","file":"./../website/web/app/themes/timber/static/assets/js/radikal.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./assets/js/radikal.js\");\n","export const AvatarFixController = () => {\n  const avatars = document.querySelectorAll('.ctf-author-avatar')\n\n  for (const avatar of avatars) {\n    const img = avatar.querySelector('img')\n    const imgSrc = img.getAttribute('data-avatar')\n    img.setAttribute('src', imgSrc)\n  }\n}\n","import enquire from 'enquire.js'\n\nexport const MapController = () => {\n  const mapWrappers = document.querySelectorAll('.map-wrapper')\n  mapInit(mapWrappers)\n}\n\nconst mapInit = (mapWrappers) => {\n  for (const wrapper of mapWrappers) {\n    const map = wrapper.querySelector('.map')\n    const countriesPaths = map.querySelectorAll('.map-country')\n\n    const activeCountries = map.getAttribute('data-active-countries')\n      .split(',')\n      .map(country => country.trim().toUpperCase());\n\n    setMapCountriesInActive(countriesPaths, activeCountries)\n\n    map.classList.add('processed')\n  }\n}\n\n\nexport const setMapCountriesInActive = (countriesPaths, activeCountries) => {\n  for (const countryPath of countriesPaths) {\n    const countryID = countryPath.getAttribute('id')\n    const geo = countryPath.querySelector('.map-country__geo')\n    if (activeCountries.indexOf(countryID) === -1) {\n      geo.style.opacity = 0.3\n    }\n  }\n}\n","const p = timber_params\n\nexport const NotesController = () => {\n  const noteBlocks = document.querySelectorAll('.notes')\n\n  for (const noteBlock of noteBlocks) {\n    const modal = noteBlock.querySelector('.modal')\n    const notesContainer = noteBlock.querySelector('.notes__map-overlay')\n\n    if(modal) {\n      const close = modal.querySelector('.modal-close')\n      const open = noteBlock.querySelector('.modal-open')\n      const form = modal.querySelector('.acf-form')\n\n      open.addEventListener('click', (e) => handleModal(modal))\n      close.addEventListener('click', (e) => handleCloseButtonClick(modal, form))\n      handleFormSubmit(form)\n    }\n\n    handleNotePositions(notesContainer)\n  }\n\n\n}\n\nconst handleModal = (modal) => {\n  document.body.classList.add('modal-open')\n  modal.showModal()\n}\n\nconst handleCloseButtonClick = (modal, form) => {\n  modal.close()\n  form.reset()\n  const message = form.querySelector('.message')\n\n  if (message) {\n    message.innerHTML = ''\n  }\n\n  if(form.classList.contains('submitted')) {\n    form.classList.remove('submitted')\n  }\n\n  document.body.classList.remove('modal-open')\n}\n\n\nconst handleFormSubmit = (form) => {\n  if (form) {\n    form.addEventListener('submit', function (e) {\n      e.preventDefault()\n      const formData = new FormData(form)\n      formData.append('action', 'acf_form_submit')\n      formData.append('nonce', p.acf_nonce)\n\n      fetch(p.ajaxurl, {\n        method: 'POST',\n        body: formData,\n      })\n      .then(response => response.json())\n      .then(data => {\n        if (data.success) {\n          let message = form.querySelector('.message')\n\n          if(!message) {\n            message = document.createElement('div')\n            message.classList.add('message')\n            form.appendChild(message)\n          }\n\n          message.innerHTML = '<p>Thank you for your submission!</p>'\n          form.classList.add('submitted')\n\n          form.reset()\n        } else {\n          alert('Error: ' + (data.data.message || 'Something went wrong.'))\n        }\n      })\n      .catch(error => console.error('Error:', error))\n    })\n  }\n}\n\n\nconst handleNotePositions = (container) => {\n  placeItems(container);\n\n  window.addEventListener('resize', () => {\n    placeItems(container);\n  });\n}\n\nfunction placeItems(container, gap = 10, maxAttempts = 500) {\n  const items = container.querySelectorAll('.note');\n  const containerWidth = container.offsetWidth;\n  const containerHeight = container.offsetHeight;\n\n  const placedPositions = [];\n\n  for (const item of items) {\n    item.style.opacity = 0;\n    item.style.visibility = 'hidden';\n    item.style.zIndex = -1;\n    const itemWidth = item.offsetWidth;\n    const itemHeight = item.offsetHeight;\n    let top, left;\n    let isValidPosition = false;\n    let attempts = 0;\n\n    while (!isValidPosition && attempts < maxAttempts) {\n      attempts++;\n\n      // Y-Axis: Favor positions closer to the vertical center\n      top = Math.random() * (containerHeight * 0.5) + (containerHeight * 0.25); // Between 25% and 75% of container height\n      left = Math.random() * (containerWidth - itemWidth);\n\n      // Check for overlap and maintain a gap\n      isValidPosition = placedPositions.every(pos => {\n        const xDistance = Math.abs(left - pos.left);\n        const yDistance = Math.abs(top - pos.top);\n\n        return (\n          xDistance >= itemWidth + gap || // Ensure horizontal spacing with gap\n          yDistance >= itemHeight + gap // Ensure vertical spacing with gap\n        );\n      });\n    }\n\n    if (!isValidPosition) {\n      console.log(`Could not place item after ${maxAttempts} attempts.`);\n      continue\n    }\n\n    // Save the position\n    placedPositions.push({ left, top, width: itemWidth, height: itemHeight });\n\n    // Apply the position\n    item.style.visibility = 'visible';\n    item.style.position = 'absolute';\n    item.style.zIndex = 1;\n    item.style.opacity = 1;\n    item.style.left = `${(left / containerWidth) * 100}%`; // Percentage-based positioning\n    item.style.top = `${(top / containerHeight) * 100}%`; // Percentage-based positioning\n  }\n}\n\n\n\n\nfunction getRandomColor() {\n  return `hsl(${Math.random() * 360}, 70%, 70%)`;\n}\n","export const NumberAnimationController = () => {\n  observeNumbers()\n}\n\n// Function to animate numbers or handle strings\nconst animateNumbers = () => {\n  const counters = document.querySelectorAll(\"[data-target]\");\n  counters.forEach(counter => {\n    const target = counter.getAttribute(\"data-target\");\n\n    if (!isNaN(target)) {\n      countNumbers(counter);\n    } else {\n      cycleLetters(counter);\n    }\n  });\n}\n\nconst observeNumbers = () => {\n  const counters = document.querySelectorAll(\"[data-target]\");\n\n  const observer = new IntersectionObserver(\n    (entries, observer) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          const counter = entry.target;\n          counter.closest('.animated-stat').classList.add('show');\n\n          const target = counter.getAttribute(\"data-target\");\n          if (!isNaN(target)) {\n            countNumbers(counter);\n          } else {\n            cycleLetters(counter);\n          }\n          observer.unobserve(counter); // Stop observing once animated\n        }\n      });\n    },\n    {\n      root: null, // Use the viewport as the root\n      rootMargin: \"-30% 0px\",\n      threshold: 0 // Trigger as soon as the element enters the root margin\n    }\n  );\n\n  counters.forEach(counter => observer.observe(counter));\n};\n\n\nconst countNumbers = (counter) => {\n  const target = parseFloat(counter.getAttribute(\"data-target\"));\n  const increment = target / 100; // Adjust speed here\n  let current = 0;\n\n  const hasDecimals = target % 1 !== 0; // Check if the target number has decimals\n\n  const updateCounter = () => {\n    current += increment;\n    if (current >= target) {\n      counter.textContent = hasDecimals ? target.toFixed(1) : Math.round(target);\n    } else {\n      counter.textContent = hasDecimals ? current.toFixed(1) : Math.round(current);\n      requestAnimationFrame(updateCounter);\n    }\n  };\n\n  updateCounter();\n};\n\n\nconst cycleLetters = (counter) => {\n\n    const targetText = counter.getAttribute(\"data-target\");\n    const targetLetters = targetText.split(\"\");\n    const placeholders = targetLetters.map(() => \"\"); // Start with empty placeholders\n\n    counter.textContent = placeholders.join(\"\");\n\n    let cyclingIntervals = [];\n\n\n    // Start cycling each letter\n    targetLetters.forEach((letter, index) => {\n      const isUpperCase = letter === letter.toUpperCase();\n\n      cyclingIntervals[index] = setInterval(() => {\n        placeholders[index] = getRandomLetter(isUpperCase);\n        counter.textContent = placeholders.join(\"\");\n      }, 100); // Adjust speed of random cycling here\n\n      // Stop cycling the letter after a delay and reveal the correct one\n      setTimeout(() => {\n        clearInterval(cyclingIntervals[index]);\n        placeholders[index] = letter;\n        counter.textContent = placeholders.join(\"\");\n      }, 500 + index * 300); // Delay each letter's stopping time for a staggered effect\n    });\n}\n\n\nconst getRandomLetter = (isUpperCase) => {\n  return String.fromCharCode(\n    isUpperCase\n      ? 65 + Math.floor(Math.random() * 26) // A-Z\n      : 97 + Math.floor(Math.random() * 26) // a-z\n  );\n};\n","import enquire from 'enquire.js'\n\nexport const OrganizationsController = () => {\n  const tabs = document.querySelectorAll('.organizations-tabs-list__item')\n\n  if (tabs.length > 0) {\n    enquire.register('screen and (max-width:768px)', {\n      match: () => {\n        countriesFirstLetterNavigationMobile(tabs)\n        setFirstToggleActiveMobile()\n        countryNavigationSelect()\n        countryTabs(tabs)\n      },\n\n      unmatch: () => {\n        destroyMobileCountryTabs()\n      },\n    })\n  }\n}\n\nconst countriesFirstLetterNavigationDesktop = (tabs) => {\n  const container = document.querySelector('.country-toggle-nav')\n  const list = document.createElement('ul')\n  list.classList.add('country-toggle-list')\n  container.appendChild(list)\n  const letters = []\n\n  for (const tab of tabs) {\n    const country = tab.getAttribute('data-country-id')\n\n    if (letters.indexOf(country.charAt(0)) === -1) {\n      letters.push(country.charAt(0))\n    }\n  }\n\n  for (const letter of letters) {\n    const listItem = document.createElement('li')\n    listItem.classList.add('country-toggle-list__item')\n\n    list.appendChild(listItem)\n\n    const button = document.createElement('button')\n    button.setAttribute('data-countries', letter)\n    button.classList.add('country-toggle')\n    button.textContent = letter\n    listItem.appendChild(button)\n  }\n}\n\nconst destroyCountriesFirstLetterNavigationDesktop = (tabs) => {\n  const container = document.querySelector('.country-toggle-nav')\n  container.innerHTML = ''\n}\n\nconst countriesFirstLetterNavigationMobile = (tabs) => {\n  const container = document.querySelector('.country-toggle-nav-mobile__inner')\n\n  const selectWrapper = document.createElement('div')\n  selectWrapper.classList.add('custom-select')\n  container.appendChild(selectWrapper)\n\n  const select = document.createElement('select')\n  select.classList.add('country-toggle-select')\n  selectWrapper.appendChild(select)\n\n  const letters = []\n\n  for (const tab of tabs) {\n    const country = tab.getAttribute('data-country-id')\n\n    if (letters.indexOf(country.charAt(0)) === -1) {\n      letters.push(country.charAt(0))\n    }\n  }\n\n  for (const letter of letters) {\n    const option = document.createElement('option')\n    option.classList.add('country-toggle-list__item')\n    option.setAttribute('value', letter)\n    option.textContent = letter\n    select.appendChild(option)\n  }\n}\n\nconst destroyMobileCountryTabs = (tabs) => {\n  const container = document.querySelector('.country-toggle-nav-mobile__inner')\n  container.innerHTML = ''\n\n  const hiddenElements = document.querySelectorAll('.organizations-tabs .hide')\n\n  for (const el of hiddenElements) {\n    el.classList.remove('hide')\n  }\n}\n\nconst setFirstToggleActiveDesktop = () => {\n  const toggles = document.querySelectorAll('.country-toggle')\n  toggles[0].classList.add('active')\n  toggleCountries(toggles[0].getAttribute('data-countries'))\n}\n\nconst setFirstToggleActiveMobile = () => {\n  const toggles = document.querySelectorAll('.country-toggle-select option')\n  toggleCountries(toggles[0].value)\n}\n\nconst countryTabs = (tabs) => {\n  for (const tab of tabs) {\n    const countryCode = tab.getAttribute('data-country-id')\n    tab.addEventListener('click', (e) => {\n      toggleOrgsByCountry(countryCode)\n      setItemActive(tabs, e.currentTarget)\n    })\n  }\n}\n\nconst countryNavigationButtons = () => {\n  const buttons = document.querySelectorAll('.country-toggle')\n  for (const button of buttons) {\n    button.addEventListener('click', (e) => {\n      toggleCountries(button.getAttribute('data-countries'))\n      setItemActive(buttons, e.currentTarget)\n    })\n  }\n}\n\nconst countryNavigationSelect = () => {\n  const selects = document.querySelectorAll('.country-toggle-select')\n  for (const select of selects) {\n    select.addEventListener('change', (e) => {\n      toggleCountries(select.value)\n    })\n  }\n}\n\nconst toggleCountries = (countriesFirstLetter) => {\n  const tabs = document.querySelectorAll('.organizations-tabs-list__item')\n  const allowedCountries = []\n\n  for (const tab of tabs) {\n    const countryCode = tab.getAttribute('data-country-id')\n    if (countryCode.charAt(0) === countriesFirstLetter) {\n      allowedCountries.push(countryCode)\n    }\n  }\n\n  hideAllTabs(tabs)\n  showTabs(tabs, allowedCountries)\n}\n\nconst hideAllTabs = (tabs) => {\n  for (const tab of tabs) {\n    if (!tab.classList.contains('hide')) {\n      tab.classList.add('hide')\n    }\n  }\n\n  hideAllOrgs()\n}\n\nconst showTabs = (tabs, allowedCountries) => {\n  for (const tab of tabs) {\n    const country_code = tab.getAttribute('data-country-id')\n\n    if (allowedCountries.indexOf(country_code) != -1) {\n      if (tab.classList.contains('hide')) {\n        tab.classList.remove('hide')\n      }\n    }\n  }\n\n  showOrgsByCountry(allowedCountries[0])\n  setItemActive(\n    tabs,\n    document.querySelector(\n      '.organizations-tabs-list__item[data-country-id=\"' +\n        allowedCountries[0] +\n        '\"]'\n    )\n  )\n}\n\nconst toggleOrgsByCountry = (code) => {\n  hideAllOrgs()\n  showOrgsByCountry(code)\n}\n\nconst hideAllOrgs = () => {\n  const countries = document.querySelectorAll(\n    '.organizations-tabs .organization'\n  )\n  for (const country of countries) {\n    if (!country.classList.contains('hide')) {\n      country.classList.add('hide')\n    }\n  }\n}\n\nconst showOrgsByCountry = (code) => {\n  const countries = document.querySelectorAll(\n    '.organizations-tabs .organization[data-country-id=\"' + code + '\"]'\n  )\n  for (const country of countries) {\n    if (country.classList.contains('hide')) {\n      country.classList.remove('hide')\n    }\n  }\n}\n\nconst setItemActive = (buttons, current) => {\n  for (const button of buttons) {\n    if (button.classList.contains('active')) {\n      button.classList.remove('active')\n    }\n  }\n\n  if (!current.classList.contains('active')) {\n    current.classList.add('active')\n  }\n}\n","export const PublicationsFilterController = () => {\n  if (!document.body.classList.contains('post-type-archive-publications'))\n    return\n\n  filterPublications()\n}\n\nconst addFilter = (filters, key, id) => {\n  if (document.getElementById(id)) {\n    filters[key] = document.getElementById(id)\n  }\n}\n\nconst filterPublications = () => {\n  const filterForm = document.getElementById('publications-filter-form')\n  const searchSubmit = document.getElementById('filter-search-submit')\n  const resetButton = document.getElementById('clear-filters')\n  const filters = {}\n\n  addFilter(filters, 'yearSelect', 'filter-year')\n  addFilter(filters, 'typeSelect', 'filter-type')\n  addFilter(filters, 'topicSelect', 'filter-topic')\n  addFilter(filters, 'search', 'filter-search')\n\n  // getFilteredPublications(0, timber_params.loadmore.current_page, filters)\n\n  document.addEventListener(\n    'click',\n    (e) => {\n      if (e.target.matches('.pagination a')) {\n        e.preventDefault()\n        let parts = e.target.getAttribute('href').split('/')\n        let page = parts.pop() || parts.pop() // handle potential trailing slash\n        let offset = 0\n        if (page > 1) {\n          offset = (page - 1) * timber_params.loadmore.posts_per_page\n        }\n\n        getFilteredPublications(offset, page, filters)\n      }\n    },\n    false\n  )\n\n  filterSelectsEventListener(filters)\n\n  searchSubmit.addEventListener('click', (e) => {\n    getFilteredPublications(0, 1, filters)\n  })\n\n  if (filterForm.addEventListener) {\n    filterForm.addEventListener(\n      'submit',\n      (e) => {\n        e.preventDefault()\n        getFilteredPublications(0, 1, filters)\n      },\n      true\n    )\n  } else {\n    filterForm.attachEvent('onsubmit', (e) => {\n      e.preventDefault()\n      getFilteredPublications(0, 1, filters)\n    })\n  }\n\n  resetButton.addEventListener('click', (e) => {\n    resetFilters(filters)\n    getFilteredPublications(0, 1, filters)\n  })\n}\n\nconst filterSelectsEventListener = (filters) => {\n  for (const key in filters) {\n    if (filters[key].tagName === 'SELECT') {\n      filters[key].addEventListener('change', (e) => {\n        getFilteredPublications(0, 1, filters)\n      })\n    }\n  }\n}\n\nconst resetFilters = (filters) => {\n  for (const key in filters) {\n    if (filters[key].tagName === 'SELECT') {\n      filters[key].selectedIndex = null\n    } else if (filters[key].tagName === 'INPUT') {\n      filters[key].value = null\n    }\n  }\n}\n\nconst setLoadingState = () => {\n  const container = document.getElementById('publications-container')\n\n  container.style.opacity = 0.2\n  container.classList.add('loading')\n}\n\nconst removeLoadingState = () => {\n  const container = document.getElementById('publications-container')\n\n  container.style.opacity = ''\n  container.classList.remove('loading')\n}\n\nconst appendFilter = (filters, data, key, cat) => {\n  if (filters[key] !== undefined) {\n    data.append(cat, filters[key].value)\n  }\n}\n\nconst getFilteredPublications = (offset, page, filters) => {\n  setLoadingState()\n  const data = new FormData()\n\n  data.append('action', 'get_filtered_publications')\n  data.append('nonce', timber_params.nonce)\n  data.append('query', timber_params.loadmore.posts)\n  data.append('page', page)\n  data.append('is_search', timber_params.loadmore.is_search)\n  data.append('lang', timber_params.loadmore.lang)\n  data.append('offset', offset)\n  data.append('meta_key', 'publication_date')\n  data.append('orderby', 'meta_value')\n\n  appendFilter(filters, data, 'yearSelect', 'publication_year')\n  appendFilter(filters, data, 'typeSelect', 'publication_cat')\n  appendFilter(filters, data, 'topicSelect', 'publication_topic')\n  appendFilter(filters, data, 'search', 's')\n\n  let params = new URLSearchParams(data)\n\n  fetch(timber_params.ajaxurl, {\n    method: 'POST',\n    credentials: 'same-origin',\n    body: params,\n  })\n    .then((response) => response.text())\n    .then((data) => {\n      if (data) {\n        document.getElementById('publications-container').innerHTML = data\n        removeLoadingState()\n      }\n    })\n    .catch((error) => {\n      console.error(error)\n    })\n}\n","import { getCookie, setCookie, deleteCookie } from \"../utils/Cookies\"\nimport { areArraysEqual, removeClasses, toggleClass } from \"../utils/Utils\"\n\nconst quizBlocks = document.querySelectorAll('.quiz-block, .quiz-modal')\n\nconst c = {\n  correct: 'correct',\n  incorrect: 'incorrect',\n  visuallyCorrect: 'visually-correct',\n  visuallyIncorrect: 'visually-incorrect'\n}\n\nlet timeoutId = null\nlet correctAnswersGiven = 0\nlet allAnswersGiven = 0\nlet quizStatus = {\n  finished: false,\n  allCorrect: false\n}\n\nexport const QuizController = () => {\n  window.WhatSub.subscribe('QUIZ:submitted', (event) => {\n    quizStatus = event;\n  });\n\n  for (const quizBlock of quizBlocks) {\n    const multiQuizScriptTag = quizBlock.querySelector('script.multi-quiz')\n    const multiQuizData = multiQuizScriptTag && multiQuizScriptTag.textContent ? JSON.parse(multiQuizScriptTag.textContent) : {}\n    const quizDivs = quizBlock.querySelectorAll('.quiz')\n    const submitButton = quizBlock.querySelector('.quiz-block__submit')\n    const resultsModal = quizBlock.querySelector('.results-modal')\n\n    for (const quizDiv of quizDivs) {\n      const quizId = quizDiv.id\n      const cookieName = quizDiv ? `quiz-${quizId}` : false\n      const foundCookie = cookieName ? getCookie(cookieName) : false\n      if(foundCookie) continue\n      // if quiz is inside a modal, do modal things\n      const quizModal = quizDiv.closest('dialog')\n\n      const scripTag = quizDiv.querySelector('script.single-quiz')\n      const quizData = scripTag.textContent ? JSON.parse(scripTag.textContent) : {}\n      const answers = quizDiv.querySelectorAll('input[type=\"checkbox\"], input[type=\"radio\"]')\n      for (const answer of answers) {\n        answer.addEventListener('change', (e) => handleAnswerChange(e, answer.value, quizData, quizDiv, cookieName, quizModal, answers))\n      }\n\n      if(quizModal) handleModal(quizModal, cookieName, quizData)\n    }\n\n\n    if(submitButton) {\n      const allPopupData = multiQuizData.popups\n      submitButton.addEventListener('click', (e) => {\n        const allCorrect = quizDivs.length === correctAnswersGiven\n\n        const popupData = getPopupByCorrectAnswers(correctAnswersGiven, allPopupData)\n        const resultsModalInner = resultsModal.querySelector('.modal-inner')\n        resultsModalInner.innerHTML = setPopupMessage(popupData)\n        if(resultsModal) handleModal(resultsModal, null, null, multiQuizData)\n\n        for(const quizDiv of quizDivs) {\n          const givenAnswers = quizDiv.querySelectorAll('input.correct, input.incorrect')\n          quizDiv.dataset.submitted = true\n\n          for (const answer of givenAnswers) {\n            if(!answer.classList.contains('submitted')) answer.classList.add('submitted')\n          }\n        }\n\n        window.WhatSub.dispatch('QUIZ:submitted', {\n          finished: true,\n          allCorrect: allCorrect ? true : false\n        })\n\n      })\n    }\n  }\n}\n\nconst setPopupMessage = (data) => {\n  const title = {\n    text: data?.title?.content || null,\n    tag: data?.title?.tag && data?.title?.tag || 'h2',\n    size: data?.title?.size && data?.title?.size !== 'default' ? ` ${data?.title?.size}` : '',\n    colour: data?.title?.colour && data?.title?.colour !== 'inherit' ? ` clr-${data?.title?.colour}` : '',\n    styled: data?.title?.styled ? ' has-border' : '',\n    align: data?.title?.align ? ` text-align-${data?.title?.align}` : ''\n  }\n  const titleClass = `title${title.size}${title.colour}${title.styled}${title.align}`\n  const htmlTitle = title?.text ? `<${title.tag} class=\"${titleClass}\">${title.text}</${title.tag}>` : null\n\n  const html = `${htmlTitle}<div class=\"wysiwyg  \">${data?.text || null}</div>`\n\n  return html\n}\n\n// Handlers\nconst handleModal = (modal, cookieName = null, quizData = null, multiQuizData = null) => {\n  const close = modal.querySelector('.modal-close');\n  document.body.classList.add('modal-open');\n  close.addEventListener('click', (e) => handleCloseButtonClick(e, cookieName, quizData, multiQuizData))\n\n  modal.showModal()\n}\n\nconst handleCloseButtonClick = (e, cookieName = null, quizData = null, multiQuizData = null) => {\n  e.currentTarget.closest('dialog').close();\n  document.body.classList.remove('modal-open');\n\n  if (multiQuizData) {\n    let element = null\n    if(quizStatus.finished && quizStatus.allCorrect) {\n      element = document.getElementById(multiQuizData.section_id);\n    } else {\n      const block = e.currentTarget.closest('.quiz-block')\n      element = block.querySelector('[data-status=\"pending\"], [data-status=\"incorrect\"]')\n    }\n\n    if (element) {\n      window.scrollTo({\n        top: element.offsetTop - 80,\n        behavior: 'smooth'\n      });\n    }\n  }\n\n  if(cookieName && quizData) handleActionCookie('close', cookieName, quizData)\n}\n\nconst handleAnswerChange = (e, answerId, quizData, quizDiv, cookieName, quizModal, answers) => {\n  const messageDiv = quizDiv.querySelector('.quiz__message')\n  const currentAnswer = quizData.answers.filter(answer => answer.id === answerId)[0];\n  const correctAnswers = quizData.answers.filter(answer => answer.is_correct).map(answer => answer.id)\n\n  let userCorrectChoices = []\n  let userIncorrectChoices = []\n\n  if(quizData.allow_multiple) {\n    toggleAnswerClasses(e.currentTarget, currentAnswer)\n  } else {\n    resetAnswerClasses(quizDiv)\n    setAnswerClasses(e.currentTarget, currentAnswer, answers, correctAnswers)\n  }\n\n  userCorrectChoices = mapQuestions(c.correct, quizDiv) || []\n  userIncorrectChoices = mapQuestions(c.incorrect, quizDiv) || []\n\n\n\n  const allCorrectChoicesAreChosen = areArraysEqual(userCorrectChoices, correctAnswers)\n  const anyAnswerIsChosen = [...userCorrectChoices, ...userIncorrectChoices]\n\n\n  if (timeoutId !== null) {\n    clearTimeout(timeoutId)\n    deleteCookie(cookieName)\n  }\n\n  let noAnswers = anyAnswerIsChosen.length === 0\n  let isCorrect = allCorrectChoicesAreChosen && userIncorrectChoices.length === 0\n\n  // keep because the client tends to change their mind quite a bit\n  // if(quizModal) {\n    // should redirect regardless of the answer\n    // isCorrect = true\n    // show correct answer even if user is wrong\n    // highlightCorrectAnswers(quizData, quizDiv, correctAnswers, answers)\n  // }\n\n  if(noAnswers) handleNoAnswers(messageDiv, quizDiv)\n  else if(!isCorrect) handleIncorrectAnswers(messageDiv, quizData, cookieName, quizDiv)\n  else if(isCorrect) handleCorrectAnswers(messageDiv, quizData, cookieName, quizDiv)\n\n  correctAnswersGiven = document.querySelectorAll('.quiz[data-status=\"correct\"]').length\n  allAnswersGiven = document.querySelectorAll('.quiz[data-status]').length\n}\n\nconst highlightCorrectAnswers = (quizData, quizDiv, correctAnswers, answers) => {\n  for(const correctAnswer of correctAnswers) {\n    const element = quizDiv.querySelector(`input[value=\"${correctAnswer}\"]`)\n    if(element) setAnswerClasses(element, { is_correct: true }, answers, correctAnswers)\n  }\n}\n\nconst handleIncorrectAnswers = (messageDiv, quizData, cookieName, quizDiv) => {\n  quizDiv.dataset.status = 'incorrect'\n  messageDiv.innerHTML = quizData.error_message\n  deleteCookie(cookieName)\n  window.WhatSub.dispatch('QUIZ', {\n    type: 'answer',\n    status: 'incorrect'\n  })\n}\n\nconst handleNoAnswers = (messageDiv, quizDiv) => {\n  quizDiv.dataset.status = 'pending'\n  messageDiv.innerHTML = '';\n\n  window.WhatSub.dispatch('QUIZ', {\n    type: 'answer',\n    status: 'no-answer'\n  })\n}\n\nconst handleCorrectAnswers = (messageDiv,  quizData, cookieName, quizDiv) => {\n  quizDiv.dataset.status = 'correct'\n  messageDiv.innerHTML = quizData.success_message\n\n  switch(quizData.action) {\n    case 'link':\n      handleClickRedirect(messageDiv, quizData, cookieName)\n      break\n    case 'redirect':\n      handleAutoRedirect(messageDiv, quizData, cookieName)\n      break\n  }\n\n  window.WhatSub.dispatch('QUIZ', {\n    type: 'answer',\n    status: 'correct'\n  })\n}\n\nconst createLinkNode = (quizData) => {\n  if(quizData.redirect_link === null || quizData.link_text === null) return null\n  const link = document.createElement('a')\n  link.href = quizData.redirect_link\n  link.innerHTML = quizData.link_text\n  return link\n}\n\nconst handleClickRedirect = (message, quizData, cookieName) => {\n  const redirectButton = createLinkNode(quizData)\n  if(redirectButton === null) return\n  message.appendChild(redirectButton)\n  redirectButton.addEventListener('click', (e) => {\n    handleActionCookie('redirect', cookieName, quizData)\n  })\n}\n\nconst getPopupByCorrectAnswers = (correctAnswers, data) => {\n  data.forEach(item => item.correct_answers = Number(item.correct_answers));\n\n  return data.find(item => item.correct_answers === correctAnswers) || null;\n}\n\nconst handleAutoRedirect = (messageDiv, quizData, cookieName) => {\n  messageDiv.innerHTML += `<div class=\"loader\"></div>`;\n  const delay = quizData.redirect_delay ? quizData.redirect_delay * 1000 : 0\n\n  timeoutId = setTimeout(() => {\n    handleActionCookie('redirect', cookieName, quizData)\n    window.location.href = quizData.redirect_link;\n  }, delay);\n}\n\nconst handleActionCookie = (action, cookieName, quizData) => {\n  let { allowCookie, cookieLifeTime } = false\n  switch(action) {\n    case 'redirect':\n      allowCookie = quizData.set_cookie_on_redirect\n      cookieLifeTime = quizData.redirect_cookie_lifetime ? quizData.redirect_cookie_lifetime : 365\n      break\n    case 'close':\n      allowCookie = quizData.set_cookie_on_close\n      cookieLifeTime = quizData.close_cookie_lifetime ? quizData.close_cookie_lifetime : 365\n      break\n  }\n\n  if(allowCookie) {\n    setCookie(cookieName, action, cookieLifeTime);\n  }\n}\n\n// Classes\nconst toggleAnswerClasses = (element, currentAnswer) => {\n  if(currentAnswer.is_correct) {\n    toggleClass(element, c.correct)\n  } else {\n    toggleClass(element, c.incorrect)\n  }\n}\n\nconst setAnswerClasses = (element, currentAnswer, answers, correctAnswers) => {\n  if(currentAnswer.is_correct) {\n    element.classList.add(c.correct)\n\n    // Keep for now\n    // show all the wrong answers when user is correct\n    // for(const answer of answers) {\n    //   if(answer.value !== currentAnswer.id) {\n    //     answer.classList.add(c.visuallyIncorrect)\n    //   }\n    // }\n  } else {\n    element.classList.add(c.incorrect)\n\n    // Keep for now\n    // show correct answer when user is wrong\n    // const correctInputs = Array.from(answers).filter(node => correctAnswers.includes(node.value));\n    // for(const input of correctInputs) {\n    //   input.classList.add(c.visuallyCorrect)\n    // }\n  }\n}\n\nconst resetAnswerClasses = (quiz) => {\n  const allChoices = quiz.querySelectorAll('input')\n  allChoices.forEach(choice => removeClasses(choice, [c.correct, c.incorrect, c.visuallyCorrect, c.visuallyIncorrect]))\n}\n\nexport const mapQuestions = (type, quizDiv) => {\n  const inputs = quizDiv.querySelectorAll(`input.${type}`)\n  return inputs && inputs.length > 0 ? Array.from(inputs).map(input => input.value) : []\n}\n","export const ScrollToTopController = () => {\n  const button = document.getElementById('scroll-to-top');\n\n  if(button) {\n    button.addEventListener('click', () => {\n      window.scrollTo({\n        top: 0,\n        behavior: 'smooth'\n      });\n    });\n\n    window.addEventListener('scroll', () => {\n      if(window.scrollY > 300) {\n        button.classList.add('show');\n      } else {\n        button.classList.remove('show');\n      }\n    });\n  }\n}\n","export const SearchbarController = () => {\n  const form = document.getElementById('header_searchform');\n  const input = form.querySelector('input[type=\"text\"]');\n  const button = form.querySelector('[type=\"submit\"]');\n\n  if (input.value === '') {\n    input.classList.add('is-hidden');\n    button.classList.add('is-disabled');\n  }\n\n  button.addEventListener('click', (e) => {\n    if (button.classList.contains('is-disabled')) {\n      e.preventDefault();\n      openSearchForm(button, input);\n    } else if (input.value === '') {\n      e.preventDefault();\n      closeSearchForm(button, input);\n    }\n  });\n\n  window.addEventListener('mouseup', (e) => {\n    if (\n      e.target != form &&\n      e.target.parentNode != form &&\n      e.target.parentNode.parentNode != form &&\n      e.target.parentNode.parentNode.parentNode != form &&\n      input.value === ''\n    ) {\n      closeSearchForm(button, input);\n    }\n  });\n};\n\nconst openSearchForm = (button, input) => {\n  button.classList.remove('is-disabled');\n  input.classList.remove('is-hidden');\n  input.focus();\n};\n\nconst closeSearchForm = (button, input) => {\n  button.classList.add('is-disabled');\n  input.classList.add('is-hidden');\n};\n","import Flickity from 'flickity'\n\nexport const SliderController = () => {\n  initSliders()\n}\n\nconst initSliders = () => {\n  const sliders = document.querySelectorAll('.slider')\n\n  for (const slider of sliders) {\n    const autoplay =\n      slider.getAttribute('data-autoplay') !== 'false'\n        ? parseInt(slider.getAttribute('data-autoplay'))\n        : false\n    const friction = slider.getAttribute('data-friction')\n      ? parseFloat(slider.getAttribute('data-friction'))\n      : 0.28\n    const attraction = slider.getAttribute('data-attraction')\n      ? parseFloat(slider.getAttribute('data-attraction'))\n      : 0.025\n    const pauseOnHover =\n      slider.getAttribute('data-pause-on-hover') === 'true' ? true : false\n    const cellAlign = slider.getAttribute('data-cell-align') || 'center'\n    const groupCells = slider.getAttribute('data-group-cells') || false\n    const dots = slider.getAttribute('data-dots') === 'false' ? false : true\n    const arrows = slider.getAttribute('data-arrows') === 'false' ? false : true\n\n    let flkty\n\n    flkty = new Flickity(slider, {\n      cellAlign: cellAlign,\n      contain: false,\n      pageDots: dots,\n      prevNextButtons: arrows,\n      wrapAround: true,\n      lazyLoad: 2,\n      autoPlay: autoplay,\n      selectedAttraction: attraction,\n      friction: friction,\n      pauseAutoPlayOnHover: pauseOnHover,\n      groupCells: groupCells\n    })\n  }\n}\n","export const StoryController = () => {\n  const storiesSections = document.querySelectorAll('.stories')\n\n  if (!storiesSections) return\n\n  for (const storiesSection of storiesSections) {\n    const storyModals = storiesSection.querySelectorAll('.js-story-modal')\n    const storyModalTriggers = storiesSection.querySelectorAll(\n      '.js-story-modal-trigger'\n    )\n\n    if (!storyModals) return\n\n    for (const storyModalTrigger of storyModalTriggers) {\n      storyModalTrigger.addEventListener('click', (e) => {\n        e.preventDefault()\n        const targetModal = storiesSection.querySelector(\n          storyModalTrigger.getAttribute('href')\n        )\n\n        if (targetModal) {\n          const modalDialog = targetModal.querySelector('dialog')\n          handleModal(modalDialog)\n        }\n      })\n    }\n  }\n}\n\nconst handleModal = (modal) => {\n  const close = modal.querySelector('.modal-close')\n  document.body.classList.add('modal-open')\n  close.addEventListener('click', (e) => handleCloseButtonClick(e))\n\n  modal.showModal()\n}\n\nconst handleCloseButtonClick = (e) => {\n  e.currentTarget.closest('dialog').close()\n  document.body.classList.remove('modal-open')\n}\n","export const TeamMemberController = () => {\n  bioHover()\n}\n\nconst bioHover = () => {\n  const team = document.querySelectorAll('.team-card.has-bio')\n\n  for (const member of team) {\n    const triggers = member.querySelectorAll(\n      '.team-card__avatar, .team-card__title, .team-card__bio'\n    )\n    const popup = member.querySelector('.team-card__bio')\n\n    for (const trigger of triggers) {\n      trigger.addEventListener('mouseenter', (e) => {\n        if (!popup.classList.contains('show')) {\n          popup.classList.add('show')\n        }\n      })\n\n      trigger.addEventListener('mouseleave', (e) => {\n        if (popup.classList.contains('show')) {\n          popup.classList.remove('show')\n        }\n      })\n    }\n  }\n}\n","export const ToggleController = () => {\n  toggle('[data-toggle]')\n}\n\nconst toggle = (selector) => {\n  const buttons = document.querySelectorAll(selector)\n\n  for (const button of buttons) {\n    button.addEventListener('click', (e) => {\n      e.preventDefault()\n      e.stopImmediatePropagation()\n      const menuID = button.getAttribute('aria-controls')\n      const menu = document.getElementById(menuID)\n      if (button.getAttribute('aria-expanded') === 'false') {\n        showMenu(button, menu)\n      } else {\n        hideMenu(button, menu)\n      }\n    })\n  }\n}\n\nconst showMenu = (button, menu) => {\n  button.setAttribute('aria-expanded', 'true')\n  button.classList.add('is-expanded')\n  menu.classList.add('is-shown')\n}\n\nconst hideMenu = (button, menu) => {\n  button.setAttribute('aria-expanded', 'false')\n  button.classList.remove('is-expanded')\n  menu.classList.remove('is-shown')\n}\n","import { lazyLoadImages } from './utils/Utils'\nimport { ToggleController } from './controllers/ToggleController'\nimport { SearchbarController } from './controllers/SearchbarController'\nimport { SliderController } from './controllers/SliderController'\nimport { OrganizationsController } from './controllers/OrganizationsController'\nimport { PublicationsFilterController } from './controllers/PublicationsFilterController'\nimport { TeamMemberController } from './controllers/TeamMemberController'\nimport { MapController } from './controllers/MapController'\nimport { AvatarFixController } from './controllers/AvatarFixController'\nimport { QuizController } from './controllers/QuizController'\nimport { ScrollToTopController } from './controllers/ScrollToTopController'\nimport { NumberAnimationController } from './controllers/NumberAnimationController'\nimport { NotesController } from './controllers/NotesController'\nimport { StoryController } from './controllers/StoryController'\n\nimport { subscribe, dispatch, unsubscribe } from './utils/Whatsub'\n\n/* Constructor for app\n *\n * @return {void}\n */\nconst init = () => {\n  window.WhatSub = {\n    subscribe,\n    dispatch,\n    unsubscribe,\n  }\n  lazyLoadImages()\n  StoryController()\n  ToggleController()\n  SearchbarController()\n  SliderController()\n  OrganizationsController()\n  PublicationsFilterController()\n  TeamMemberController()\n  MapController()\n  AvatarFixController()\n  QuizController()\n  ScrollToTopController()\n  NumberAnimationController()\n  NotesController()\n}\n\nwindow.addEventListener('load', init, false)\n","export const getCookie = (cname) => {\n  let name = `${cname}=`\n  let decodedCookie = decodeURIComponent(document.cookie)\n  let ca = decodedCookie.split(';')\n  for (let i = 0; i < ca.length; i++) {\n    let c = ca[i]\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1)\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length)\n    }\n  }\n  return false\n}\n\nexport const setCookie = (cname, cvalue, exdays, path='/') => {\n  const date = setDateInFuture(exdays)\n  document.cookie = `${cname}=${cvalue}; expires=${date}; path=${path}`\n}\n\n\nexport const deleteCookie = (cname) => {\n  const cookie = getCookie(cname)\n  if(!cookie) return\n\n  const date = setDateInPast(365)\n  if(cookie) document.cookie = `${cname}=; expires=${date};`\n}\n\nconst setDateInPast = (exdays) => {\n  let d = new Date()\n  d.setTime(d.getTime() - daysInMilliSeconds(exdays))\n  return d.toUTCString()\n}\n\nconst setDateInFuture = (exdays) => {\n  let d = new Date()\n  d.setTime(d.getTime() + daysInMilliSeconds(exdays))\n  return d.toUTCString()\n}\n\nconst daysInMilliSeconds = (days) => days * 24 * 60 * 60 * 1000\n","import LazyLoad from 'vanilla-lazyload/dist/lazyload'\n\nexport const lazyLoadImages = () => {\n  var myLazyLoad = new LazyLoad({\n    elements_selector: '.lazy',\n  })\n}\n\n/**\n * Convert rem to pixels\n *\n * @param {Number} rem\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const convertRemToPixels = (rem) =>\n  rem * parseFloat(getComputedStyle(document.documentElement).fontSize)\n\n\nexport const areArraysEqual = (array1, array2) => {\n  if (array1.length !== array2.length) {\n      return false;\n  }\n\n  const sortedArray1 = [...array1].sort();\n  const sortedArray2 = [...array2].sort();\n\n  return sortedArray1.every((value, index) => value === sortedArray2[index]);\n}\n\n\nexport const removeClasses = (element, classNames) => {\n  for(const name of classNames) {\n    if(element.classList.contains(name)) element.classList.remove(name)\n  }\n}\n\nexport const toggleClass = (element, className) => {\n  if(element.classList.contains(className)) element.classList.remove(className)\n  else element.classList.add(className)\n}\n","/**\n * The WhatSub methods keep track of subscriptions to events\n * Users can create subscriptions using the `subscribe` function\n * By using `dispatch`, an event can be triggered and all subscription callbacks will be triggered\n * Lastly, you can remove a subscription from the list by using the `unsubscribe` function\n *\n * @example\n * subscribe('TEST_EVENT', testFn);\n * dispatch('TEST_EVENT', ['something', 'else']);\n * unsubscribe('TEST_EVENT', testFn);\n */\n\nconst subscribers = {}\nexport default function WhatsSub() {}\n\n/**\n * Subscribe to a new event\n * @param {String} event\n * @param {Function} callback\n * @param {int} priority\n *\n * @return {void}\n */\nexport const subscribe = (event, callback, priority = 0) => {\n  if (!subscribers[event]) {\n    subscribers[event] = []\n  }\n\n  subscribers[event].push({\n    callback,\n    priority,\n  })\n}\n\n/**\n * Trigger all required actions based on an event\n * @param {String} event\n * @param {Object} target\n *\n * @return {void}\n */\nexport const dispatch = (event, target) => {\n  let targets = target\n  if (!Array.isArray(target)) {\n    targets = [target]\n  }\n\n  if (subscribers[event]) {\n    subscribers[event].forEach((subscriber) => {\n      subscriber.callback.apply(null, targets)\n    })\n  }\n}\n\n/**\n * Unsubscribe from an event\n * @param {String} event\n * @param {Function} callback\n *\n * @return {void}\n */\nexport const unsubscribe = (event, callback) => {\n  if (subscribers[event]) {\n    subscribers[event] = subscribers[event].filter(\n      (subscriber) => subscriber.callback !== callback\n    )\n  }\n}\n\n/**\n * Show a list of all the subscriptions\n *\n * @return {Object}\n */\nexport const getSubscribers = () => subscribers\n\n/**\n * Show of a list of all the subscriptions by event\n *\n * @param {String} event\n *\n * @return {Object}\n */\nexport const getSubscribersByEvent = (event) => subscribers[event]\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n","var QueryHandler = require('./QueryHandler');\nvar each = require('./Util').each;\n\n/**\n * Represents a single media query, manages it's state and registered handlers for this query\n *\n * @constructor\n * @param {string} query the media query string\n * @param {boolean} [isUnconditional=false] whether the media query should run regardless of whether the conditions are met. Primarily for helping older browsers deal with mobile-first design\n */\nfunction MediaQuery(query, isUnconditional) {\n    this.query = query;\n    this.isUnconditional = isUnconditional;\n    this.handlers = [];\n    this.mql = window.matchMedia(query);\n\n    var self = this;\n    this.listener = function(mql) {\n        // Chrome passes an MediaQueryListEvent object, while other browsers pass MediaQueryList directly\n        self.mql = mql.currentTarget || mql;\n        self.assess();\n    };\n    this.mql.addListener(this.listener);\n}\n\nMediaQuery.prototype = {\n\n    constuctor : MediaQuery,\n\n    /**\n     * add a handler for this query, triggering if already active\n     *\n     * @param {object} handler\n     * @param {function} handler.match callback for when query is activated\n     * @param {function} [handler.unmatch] callback for when query is deactivated\n     * @param {function} [handler.setup] callback for immediate execution when a query handler is registered\n     * @param {boolean} [handler.deferSetup=false] should the setup callback be deferred until the first time the handler is matched?\n     */\n    addHandler : function(handler) {\n        var qh = new QueryHandler(handler);\n        this.handlers.push(qh);\n\n        this.matches() && qh.on();\n    },\n\n    /**\n     * removes the given handler from the collection, and calls it's destroy methods\n     *\n     * @param {object || function} handler the handler to remove\n     */\n    removeHandler : function(handler) {\n        var handlers = this.handlers;\n        each(handlers, function(h, i) {\n            if(h.equals(handler)) {\n                h.destroy();\n                return !handlers.splice(i,1); //remove from array and exit each early\n            }\n        });\n    },\n\n    /**\n     * Determine whether the media query should be considered a match\n     *\n     * @return {Boolean} true if media query can be considered a match, false otherwise\n     */\n    matches : function() {\n        return this.mql.matches || this.isUnconditional;\n    },\n\n    /**\n     * Clears all handlers and unbinds events\n     */\n    clear : function() {\n        each(this.handlers, function(handler) {\n            handler.destroy();\n        });\n        this.mql.removeListener(this.listener);\n        this.handlers.length = 0; //clear array\n    },\n\n    /*\n        * Assesses the query, turning on all handlers if it matches, turning them off if it doesn't match\n        */\n    assess : function() {\n        var action = this.matches() ? 'on' : 'off';\n\n        each(this.handlers, function(handler) {\n            handler[action]();\n        });\n    }\n};\n\nmodule.exports = MediaQuery;\n","var MediaQuery = require('./MediaQuery');\nvar Util = require('./Util');\nvar each = Util.each;\nvar isFunction = Util.isFunction;\nvar isArray = Util.isArray;\n\n/**\n * Allows for registration of query handlers.\n * Manages the query handler's state and is responsible for wiring up browser events\n *\n * @constructor\n */\nfunction MediaQueryDispatch () {\n    if(!window.matchMedia) {\n        throw new Error('matchMedia not present, legacy browsers require a polyfill');\n    }\n\n    this.queries = {};\n    this.browserIsIncapable = !window.matchMedia('only all').matches;\n}\n\nMediaQueryDispatch.prototype = {\n\n    constructor : MediaQueryDispatch,\n\n    /**\n     * Registers a handler for the given media query\n     *\n     * @param {string} q the media query\n     * @param {object || Array || Function} options either a single query handler object, a function, or an array of query handlers\n     * @param {function} options.match fired when query matched\n     * @param {function} [options.unmatch] fired when a query is no longer matched\n     * @param {function} [options.setup] fired when handler first triggered\n     * @param {boolean} [options.deferSetup=false] whether setup should be run immediately or deferred until query is first matched\n     * @param {boolean} [shouldDegrade=false] whether this particular media query should always run on incapable browsers\n     */\n    register : function(q, options, shouldDegrade) {\n        var queries         = this.queries,\n            isUnconditional = shouldDegrade && this.browserIsIncapable;\n\n        if(!queries[q]) {\n            queries[q] = new MediaQuery(q, isUnconditional);\n        }\n\n        //normalise to object in an array\n        if(isFunction(options)) {\n            options = { match : options };\n        }\n        if(!isArray(options)) {\n            options = [options];\n        }\n        each(options, function(handler) {\n            if (isFunction(handler)) {\n                handler = { match : handler };\n            }\n            queries[q].addHandler(handler);\n        });\n\n        return this;\n    },\n\n    /**\n     * unregisters a query and all it's handlers, or a specific handler for a query\n     *\n     * @param {string} q the media query to target\n     * @param {object || function} [handler] specific handler to unregister\n     */\n    unregister : function(q, handler) {\n        var query = this.queries[q];\n\n        if(query) {\n            if(handler) {\n                query.removeHandler(handler);\n            }\n            else {\n                query.clear();\n                delete this.queries[q];\n            }\n        }\n\n        return this;\n    }\n};\n\nmodule.exports = MediaQueryDispatch;\n","/**\n * Delegate to handle a media query being matched and unmatched.\n *\n * @param {object} options\n * @param {function} options.match callback for when the media query is matched\n * @param {function} [options.unmatch] callback for when the media query is unmatched\n * @param {function} [options.setup] one-time callback triggered the first time a query is matched\n * @param {boolean} [options.deferSetup=false] should the setup callback be run immediately, rather than first time query is matched?\n * @constructor\n */\nfunction QueryHandler(options) {\n    this.options = options;\n    !options.deferSetup && this.setup();\n}\n\nQueryHandler.prototype = {\n\n    constructor : QueryHandler,\n\n    /**\n     * coordinates setup of the handler\n     *\n     * @function\n     */\n    setup : function() {\n        if(this.options.setup) {\n            this.options.setup();\n        }\n        this.initialised = true;\n    },\n\n    /**\n     * coordinates setup and triggering of the handler\n     *\n     * @function\n     */\n    on : function() {\n        !this.initialised && this.setup();\n        this.options.match && this.options.match();\n    },\n\n    /**\n     * coordinates the unmatch event for the handler\n     *\n     * @function\n     */\n    off : function() {\n        this.options.unmatch && this.options.unmatch();\n    },\n\n    /**\n     * called when a handler is to be destroyed.\n     * delegates to the destroy or unmatch callbacks, depending on availability.\n     *\n     * @function\n     */\n    destroy : function() {\n        this.options.destroy ? this.options.destroy() : this.off();\n    },\n\n    /**\n     * determines equality by reference.\n     * if object is supplied compare options, if function, compare match callback\n     *\n     * @function\n     * @param {object || function} [target] the target for comparison\n     */\n    equals : function(target) {\n        return this.options === target || this.options.match === target;\n    }\n\n};\n\nmodule.exports = QueryHandler;\n","/**\n * Helper function for iterating over a collection\n *\n * @param collection\n * @param fn\n */\nfunction each(collection, fn) {\n    var i      = 0,\n        length = collection.length,\n        cont;\n\n    for(i; i < length; i++) {\n        cont = fn(collection[i], i);\n        if(cont === false) {\n            break; //allow early exit\n        }\n    }\n}\n\n/**\n * Helper function for determining whether target object is an array\n *\n * @param target the object under test\n * @return {Boolean} true if array, false otherwise\n */\nfunction isArray(target) {\n    return Object.prototype.toString.apply(target) === '[object Array]';\n}\n\n/**\n * Helper function for determining whether target object is a function\n *\n * @param target the object under test\n * @return {Boolean} true if function, false otherwise\n */\nfunction isFunction(target) {\n    return typeof target === 'function';\n}\n\nmodule.exports = {\n    isFunction : isFunction,\n    isArray : isArray,\n    each : each\n};\n","var MediaQueryDispatch = require('./MediaQueryDispatch');\nmodule.exports = new MediaQueryDispatch();\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'desandro-matches-selector/matches-selector'\n    ], function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    return obj;\n  }\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) {\n    return [];\n  }\n\n  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  if ( isArrayLike ) {\n    // convert nodeList to array\n    return arraySlice.call( obj );\n  }\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    clearTimeout( timeout );\n\n    var args = arguments;\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils',\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./flickity'),\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  var fragment = document.createDocumentFragment();\n  cells.forEach( function( cell ) {\n    fragment.appendChild( cell.element );\n  } );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  var cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  var len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  var fragment = getCellsFragment( cells );\n  // append to slider\n  var isAppend = index == len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    var insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    var endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  var cells = this.getCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n\n  var minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( function( cell ) {\n    cell.remove();\n    var index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  }, this );\n\n  this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  var cell = this.getCell( elem );\n  if ( !cell ) {\n    return;\n  }\n  cell.getSize();\n\n  var index = this.cells.indexOf( cell );\n  this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n * @param {Boolean} isPositioningSlider - Positions slider after selection\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n  var prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex\n  // try to maintain position & select previous selected element\n  var cell = this.getCell( prevSelectedElem );\n  if ( cell ) {\n    this.selectedIndex = this.getCellSlideIndex( cell );\n  }\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n  // do not position slider after lazy load\n  if ( isPositioningSlider ) {\n    this.positionSliderAtSelected();\n  }\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'fizzy-ui-utils/utils',\n    ], function( utils ) {\n      return factory( window, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory(\n        window,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) {\n    return;\n  }\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  var previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) {\n    var _this = this;\n    requestAnimationFrame( function animateFrame() {\n      _this.animate();\n    } );\n  }\n};\n\nproto.positionSlider = function() {\n  var x = this.x;\n  // wrap position around\n  if ( this.options.wrapAround && this.cells.length > 1 ) {\n    x = utils.modulo( x, this.slideableWidth );\n    x -= this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  x = this.options.rightToLeft ? -x : x;\n  var translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    'translate3d(' + translateX + ',0,0)' : 'translateX(' + translateX + ')';\n};\n\nproto.dispatchScrollEvent = function() {\n  var firstSlide = this.slides[0];\n  if ( !firstSlide ) {\n    return;\n  }\n  var positionX = -this.x - firstSlide.target;\n  var progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) {\n    return;\n  }\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  var isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) == Math.round( previousX * 100 );\n  if ( isResting ) {\n    this.restingFrames++;\n  }\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  var beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  for ( var i = 0; i < cells.length; i++ ) {\n    var cell = cells[i];\n    var cellShift = gap > 0 ? shift : 0;\n    cell.wrapShift( cellShift );\n    gap -= cell.size.outerWidth;\n  }\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  for ( var i = 0; i < cells.length; i++ ) {\n    cells[i].wrapShift( 0 );\n  }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) {\n    return;\n  }\n  // change the position to drag position by applying force\n  var dragVelocity = this.dragX - this.x;\n  var dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  var dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n    return;\n  }\n  var distance = this.selectedSlide.target * -1 - this.x;\n  var force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'get-size/get-size',\n    ], function( getSize ) {\n      return factory( window, getSize );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('get-size')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory(\n        window,\n        window.getSize\n    );\n  }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n  this.element = elem;\n  this.parent = parent;\n\n  this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n  this.element.style.position = 'absolute';\n  this.element.setAttribute( 'aria-hidden', 'true' );\n  this.x = 0;\n  this.shift = 0;\n  this.element.style[ this.parent.originSide ] = 0;\n};\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.style.position = '';\n  var side = this.parent.originSide;\n  this.element.style[ side ] = '';\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n  this.x = x;\n  this.updateTarget();\n  this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n  var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n  this.target = this.x + this.size[ marginProperty ] +\n    this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n  // render position of cell with in slider\n  var sideOffset = this.parent.originSide === 'left' ? 1 : -1;\n\n  var adjustedX = this.parent.options.percentPosition ?\n    x * sideOffset * ( this.parent.size.innerWidth / this.size.width ) :\n    x * sideOffset;\n\n  this.element.style.transform = 'translateX(' +\n    this.parent.getPositionValue( adjustedX ) + ')';\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\n/**\n * @param {Integer} shift - 0, 1, or -1\n */\nproto.wrapShift = function( shift ) {\n  this.shift = shift;\n  this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n  this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'unidragger/unidragger',\n      'fizzy-ui-utils/utils',\n    ], function( Flickity, Unidragger, utils ) {\n      return factory( window, Flickity, Unidragger, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./flickity'),\n        require('unidragger'),\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// --------------------------  -------------------------- //\n\nproto._createDrag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable == '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  if ( this.isDraggable ) {\n    this.element.classList.add('is-draggable');\n  } else {\n    this.element.classList.remove('is-draggable');\n  }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n  this.options.draggable = true;\n  this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n  this.options.draggable = false;\n  this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    this._pointerDownDefault( event, pointer );\n    return;\n  }\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n\n  this._pointerDownPreventDefault( event );\n  this.pointerDownFocus( event );\n  // blur\n  if ( document.activeElement != this.element ) {\n    // do not blur if already focused\n    this.pointerDownBlur();\n  }\n\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n\n  this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. #779\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n  INPUT: true,\n  TEXTAREA: true,\n  SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isFocusNode ) {\n    this.focus();\n  }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n  var isTouchStart = event.type == 'touchstart';\n  var isTouchPointer = event.pointerType == 'touch';\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n    event.preventDefault();\n  }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n  this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n  this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  var direction = this.options.rightToLeft ? -1 : 1;\n  if ( this.options.wrapAround ) {\n    // wrap around move. #589\n    moveVector.x %= this.slideableWidth;\n  }\n  var dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.options.wrapAround && this.slides.length ) {\n    // slow drag\n    var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n\n  this.dragMoveTime = new Date();\n  this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  if ( this.options.freeScroll ) {\n    this.isFreeScrolling = true;\n  }\n  // set selectedIndex based on where flick will end up\n  var index = this.dragEndRestingSelect();\n\n  if ( this.options.freeScroll && !this.options.wrapAround ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    var restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // TODO refactor this, selecting here feels weird\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.options.wrapAround;\n  this.select( index );\n  delete this.isDragSelect;\n  this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n  var restingX = this.getRestingPosition();\n  // how far away from selected slide\n  var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  var positiveResting = this._getClosestResting( restingX, distance, 1 );\n  var negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  var index = positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n  return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  var index = this.selectedIndex;\n  var minDistance = Infinity;\n  var condition = this.options.contain && !this.options.wrapAround ?\n    // if contain, keep going if distance is equal to minDistance\n    function( dist, minDist ) {\n      return dist <= minDist;\n    } : function( dist, minDist ) {\n      return dist < minDist;\n    };\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) {\n      break;\n    }\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  var len = this.slides.length;\n  // wrap around if at least 2 slides\n  var isWrapAround = this.options.wrapAround && len > 1;\n  var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  var slide = this.slides[ slideIndex ];\n  if ( !slide ) {\n    return null;\n  }\n  // add distance for wrap-around slides\n  var wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  var delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n  // get clickedCell, if cell was clicked\n  var clickedCell = this.getParentCell( event.target );\n  var cellElem = clickedCell && clickedCell.element;\n  var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n  this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  var scroll = getScrollPosition();\n  var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this._pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'get-size/get-size',\n      'fizzy-ui-utils/utils',\n      './cell',\n      './slide',\n      './animate',\n    ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n      return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate')\n    );\n  } else {\n    // browser global\n    var _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize,\n    utils, Cell, Slide, animatePrototype ) {\n\n/* eslint-enable max-params */\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n  elems = utils.makeArray( elems );\n  while ( elems.length ) {\n    toElem.appendChild( elems.shift() );\n  }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    var instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  // add id for Flickity.data\n  var id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.originSide = this.options.rightToLeft ? 'right' : 'left';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n\n  if ( this.options.resize || this.options.watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( var eventName in this.options.on ) {\n    var listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  Flickity.createMethods.forEach( function( method ) {\n    this[ method ]();\n  }, this );\n\n  if ( this.options.watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) {\n    return;\n  }\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  var cellElems = this._filterFindCellElements( this.element.children );\n  moveElements( cellElems, this.slider );\n  this.viewport.appendChild( this.slider );\n  this.element.appendChild( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  var slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  slider.style[ this.originSide ] = 0;\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  var cellElems = this._filterFindCellElements( elems );\n\n  // create new Flickity for collection\n  var cells = cellElems.map( function( cellElem ) {\n    return new Cell( cellElem, this );\n  }, this );\n\n  return cells;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  var cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    var startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n  var len = this.cells.length;\n  for ( var i = index; i < len; i++ ) {\n    var cell = this.cells[i];\n    cell.setPosition( cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  }\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( function( cell ) {\n    cell.getSize();\n  } );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) {\n    return;\n  }\n\n  var slide = new Slide( this );\n  this.slides.push( slide );\n  var isOriginLeft = this.originSide == 'left';\n  var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n  var canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( function( cell, i ) {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n    if ( canCellFit.call( this, i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( this );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  }, this );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  var groupCells = this.options.groupCells;\n  if ( !groupCells ) {\n    return function() {\n      return false;\n    };\n  } else if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    var number = parseInt( groupCells, 10 );\n    return function( i ) {\n      return ( i % number ) !== 0;\n    };\n  }\n  // default, group by width of slide\n  // parse '75%\n  var percentMatch = typeof groupCells == 'string' &&\n    groupCells.match( /^(\\d+)%$/ );\n  var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n  return function( i, slideWidth ) {\n    /* eslint-disable-next-line no-invalid-this */\n    return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n  };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n  // cell align, then based on origin side\n  center: {\n    left: 0.5,\n    right: 0.5,\n  },\n  left: {\n    left: 0,\n    right: 1,\n  },\n  right: {\n    right: 0,\n    left: 1,\n  },\n};\n\nproto.setCellAlign = function() {\n  var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n  this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( this.options.setGallerySize ) {\n    var height = this.options.adaptiveHeight && this.selectedSlide ?\n      this.selectedSlide.height : this.maxCellHeight;\n    this.viewport.style.height = height + 'px';\n  }\n};\n\nproto._getWrapShiftCells = function() {\n  // only for wrap-around\n  if ( !this.options.wrapAround ) {\n    return;\n  }\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  var gapX = this.cursorPosition;\n  var cellIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  gapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  var cells = [];\n  while ( gapX > 0 ) {\n    var cell = this.cells[ cellIndex ];\n    if ( !cell ) {\n      break;\n    }\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n    return;\n  }\n  var isRightToLeft = this.options.rightToLeft;\n  var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n  var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n  var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n  // content is less than gallery size\n  var isContentSmaller = contentWidth < this.size.innerWidth;\n  // bounds\n  var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n  var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n  // contain each cell target\n  this.slides.forEach( function( slide ) {\n    if ( isContentSmaller ) {\n      // all cells fit inside gallery\n      slide.target = contentWidth * this.cellAlign;\n    } else {\n      // contain to bounds\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    }\n  }, this );\n};\n\n// -----  ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    var $event = type;\n    if ( event ) {\n      // create jQuery event\n      var jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) {\n    return;\n  }\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.options.wrapAround || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) {\n    return;\n  }\n  var prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index != prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n  // old v1 event name, remove in v3\n  this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  var len = this.slides.length;\n  var isWrapping = this.options.wrapAround && len > 1;\n  if ( !isWrapping ) {\n    return index;\n  }\n  var wrapIndex = utils.modulo( index, len );\n  // go to shortest\n  var delta = Math.abs( wrapIndex - this.selectedIndex );\n  var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n  var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n  if ( !this.isDragSelect && backWrapDelta < delta ) {\n    index += len;\n  } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n    index -= len;\n  }\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= this.slideableWidth;\n  } else if ( index >= len ) {\n    this.x += this.slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  var slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) {\n    return;\n  }\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  // Remove in v3?\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) {\n    this.selectedSlide.unselect();\n  }\n};\n\nproto.selectInitialIndex = function() {\n  var initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    var cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  var index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  var cell = this.queryCell( value );\n  if ( !cell ) {\n    return;\n  }\n\n  var index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slides that has cell\n  for ( var i = 0; i < this.slides.length; i++ ) {\n    var slide = this.slides[i];\n    var index = slide.cells.indexOf( cell );\n    if ( index != -1 ) {\n      return i;\n    }\n  }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( var i = 0; i < this.cells.length; i++ ) {\n    var cell = this.cells[i];\n    if ( cell.element == elem ) {\n      return cell;\n    }\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  var cells = [];\n  elems.forEach( function( elem ) {\n    var cell = this.getCell( elem );\n    if ( cell ) {\n      cells.push( cell );\n    }\n  }, this );\n  return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  } );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  var cell = this.getCell( elem );\n  if ( cell ) {\n    return cell;\n  }\n  // try to get parent cell elem\n  elem = utils.getParent( elem, '.flickity-slider > *' );\n  return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) {\n    return this.selectedSlide.getCellElements();\n  }\n  index = index === undefined ? this.selectedIndex : index;\n\n  var len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements();\n  }\n\n  var cellElems = [];\n  for ( var i = index - adjCount; i <= index + adjCount; i++ ) {\n    var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n    var slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  if ( typeof selector == 'string' ) {\n    // do not select invalid selectors from hash: #123, #/. #791\n    if ( selector.match( /^[#.]?[\\d/]/ ) ) {\n      return;\n    }\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// keep focus on element when child UI elements are clicked\nproto.childUIPointerDown = function( event ) {\n  // HACK iOS does not allow touch events to bubble up?!\n  if ( event.type != 'touchstart' ) {\n    event.preventDefault();\n  }\n  this.focus();\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) {\n    return;\n  }\n  this.getSize();\n  // wrap values\n  if ( this.options.wrapAround ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  var selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  var watchOption = this.options.watchCSS;\n  if ( !watchOption ) {\n    return;\n  }\n\n  var afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.indexOf('flickity') != -1 ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  // only work if element is in focus\n  var isNotFocused = document.activeElement && document.activeElement != this.element;\n  if ( !this.options.accessibility || isNotFocused ) {\n    return;\n  }\n\n  var handler = Flickity.keyboardHandlers[ event.keyCode ];\n  if ( handler ) {\n    handler.call( this );\n  }\n};\n\nFlickity.keyboardHandlers = {\n  // left arrow\n  37: function() {\n    var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this.uiChange();\n    this[ leftMethod ]();\n  },\n  // right arrow\n  39: function() {\n    var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this.uiChange();\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  // TODO remove scrollTo once focus options gets more support\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus ...\n  //    #Browser_compatibility\n  var prevScrollY = window.pageYOffset;\n  this.element.focus({ preventScroll: true });\n  // hack to fix scroll jump after focus, #76\n  if ( window.pageYOffset != prevScrollY ) {\n    window.scrollTo( window.pageXOffset, prevScrollY );\n  }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( function( cell ) {\n    cell.destroy();\n  } );\n  this.element.removeChild( this.viewport );\n  // move child elements back into element\n  moveElements( this.slider.children, this.element );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.flickityGUID;\n  return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n  jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v2.3.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2021 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      './drag',\n      './prev-next-button',\n      './page-dots',\n      './player',\n      './add-remove-cell',\n      './lazyload',\n    ], factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./flickity'),\n        require('./drag'),\n        require('./prev-next-button'),\n        require('./page-dots'),\n        require('./player'),\n        require('./add-remove-cell'),\n        require('./lazyload')\n    );\n  }\n\n} )( window, function factory( Flickity ) {\n  return Flickity;\n} );\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils',\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./flickity'),\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n  this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n  var lazyLoad = this.options.lazyLoad;\n  if ( !lazyLoad ) {\n    return;\n  }\n  // get adjacent cells, use lazyLoad option for adjacent count\n  var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  var cellElems = this.getAdjacentCellElements( adjCount );\n  // get lazy images in those cells\n  var lazyImages = [];\n  cellElems.forEach( function( cellElem ) {\n    var lazyCellImages = getCellLazyImages( cellElem );\n    lazyImages = lazyImages.concat( lazyCellImages );\n  } );\n  // load lazy images\n  lazyImages.forEach( function( img ) {\n    new LazyLoader( img, this );\n  }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.nodeName == 'IMG' ) {\n    var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n    var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n    var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n    if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n      return [ cellElem ];\n    }\n  }\n  // select lazy images in cell\n  var lazySelector = 'img[data-flickity-lazyload], ' +\n    'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n  var imgs = cellElem.querySelectorAll( lazySelector );\n  return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Flickity} flickity - Flickity instance\n */\nfunction LazyLoader( img, flickity ) {\n  this.img = img;\n  this.flickity = flickity;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  var src = this.img.getAttribute('data-flickity-lazyload') ||\n    this.img.getAttribute('data-flickity-lazyload-src');\n  var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) {\n    this.img.setAttribute( 'srcset', srcset );\n  }\n  // remove attr\n  this.img.removeAttribute('data-flickity-lazyload');\n  this.img.removeAttribute('data-flickity-lazyload-src');\n  this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n\n  var cell = this.flickity.getParentCell( this.img );\n  var cellElem = cell && cell.element;\n  this.flickity.cellSizeChange( cellElem );\n\n  this.img.classList.add( className );\n  this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'unipointer/unipointer',\n      'fizzy-ui-utils/utils',\n    ], function( Flickity, Unipointer, utils ) {\n      return factory( window, Flickity, Unipointer, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./flickity'),\n        require('unipointer'),\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.Unipointer,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n  this.parent = parent;\n  this._create();\n}\n\nPageDots.prototype = Object.create( Unipointer.prototype );\n\nPageDots.prototype._create = function() {\n  // create holder element\n  this.holder = document.createElement('ol');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n  // events\n  this.handleClick = this.onClick.bind( this );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n  this.setDots();\n  this.holder.addEventListener( 'click', this.handleClick );\n  this.bindStartEvent( this.holder );\n  // add to DOM\n  this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n  this.holder.removeEventListener( 'click', this.handleClick );\n  this.unbindStartEvent( this.holder );\n  // remove from DOM\n  this.parent.element.removeChild( this.holder );\n};\n\nPageDots.prototype.setDots = function() {\n  // get difference between number of slides and number of dots\n  var delta = this.parent.slides.length - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  var fragment = document.createDocumentFragment();\n  var newDots = [];\n  var length = this.dots.length;\n  var max = length + count;\n\n  for ( var i = length; i < max; i++ ) {\n    var dot = document.createElement('li');\n    dot.className = 'dot';\n    dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n    fragment.appendChild( dot );\n    newDots.push( dot );\n  }\n\n  this.holder.appendChild( fragment );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  var removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( function( dot ) {\n    this.holder.removeChild( dot );\n  }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.className = 'dot';\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) {\n    return;\n  }\n  this.selectedDot = this.dots[ this.parent.selectedIndex ];\n  this.selectedDot.className = 'dot is-selected';\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = // old method name, backwards-compatible\nPageDots.prototype.onClick = function( event ) {\n  var target = event.target;\n  // only care about dot clicks\n  if ( target.nodeName != 'LI' ) {\n    return;\n  }\n\n  this.parent.uiChange();\n  var index = this.dots.indexOf( target );\n  this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n  if ( !this.options.pageDots ) {\n    return;\n  }\n  this.pageDots = new PageDots( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n  this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.deactivate();\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'fizzy-ui-utils/utils',\n      './flickity',\n    ], function( EvEmitter, utils, Flickity ) {\n      return factory( EvEmitter, utils, Flickity );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('ev-emitter'),\n        require('fizzy-ui-utils'),\n        require('./flickity')\n    );\n  } else {\n    // browser global\n    factory(\n        window.EvEmitter,\n        window.fizzyUIUtils,\n        window.Flickity\n    );\n  }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n  this.parent = parent;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state == 'playing' ) {\n    return;\n  }\n  // do not play if page is hidden, start playing when page is visible\n  var isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state != 'playing' ) {\n    return;\n  }\n\n  var time = this.parent.options.autoPlay;\n  // default to 3 seconds\n  time = typeof time == 'number' ? time : 3000;\n  var _this = this;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( function() {\n    _this.parent.next( true );\n    _this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state == 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state == 'paused' ) {\n    this.play();\n  }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  var isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n  this.player = new Player( this );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) {\n    return;\n  }\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) {\n    return;\n  }\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'unipointer/unipointer',\n      'fizzy-ui-utils/utils',\n    ], function( Flickity, Unipointer, utils ) {\n      return factory( window, Flickity, Unipointer, utils );\n    } );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./flickity'),\n        require('unipointer'),\n        require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n        window,\n        window.Flickity,\n        window.Unipointer,\n        window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unipointer, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n  this.direction = direction;\n  this.parent = parent;\n  this._create();\n}\n\nPrevNextButton.prototype = Object.create( Unipointer.prototype );\n\nPrevNextButton.prototype._create = function() {\n  // properties\n  this.isEnabled = true;\n  this.isPrevious = this.direction == -1;\n  var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n  this.isLeft = this.direction == leftDirection;\n\n  var element = this.element = document.createElement('button');\n  element.className = 'flickity-button flickity-prev-next-button';\n  element.className += this.isPrevious ? ' previous' : ' next';\n  // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  // init as disabled\n  this.disable();\n\n  element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n  // create arrow\n  var svg = this.createSVG();\n  element.appendChild( svg );\n  // events\n  this.parent.on( 'select', this.update.bind( this ) );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n  this.bindStartEvent( this.element );\n  this.element.addEventListener( 'click', this );\n  // add to DOM\n  this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.element );\n  // click events\n  this.unbindStartEvent( this.element );\n  this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n  var svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  var path = document.createElementNS( svgURI, 'path' );\n  var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n  }\n  svg.appendChild( path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) {\n    return shape;\n  }\n  // create movement string\n  return 'M ' + shape.x0 + ',50' +\n    ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n    ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n    ' L ' + shape.x3 + ',50 ' +\n    ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n    ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n    ' Z';\n}\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.parent.uiChange();\n  var method = this.isPrevious ? 'previous' : 'next';\n  this.parent[ method ]();\n};\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  if ( this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = false;\n  this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = true;\n  this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n  // index of first or last slide, if previous or next\n  var slides = this.parent.slides;\n  // enable is wrapAround and at least 2 slides\n  if ( this.parent.options.wrapAround && slides.length > 1 ) {\n    this.enable();\n    return;\n  }\n  var lastIndex = slides.length ? slides.length - 1 : 0;\n  var boundIndex = this.isPrevious ? 0 : lastIndex;\n  var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n  this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n  this.deactivate();\n  this.allOff();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) {\n    return;\n  }\n\n  this.prevButton = new PrevNextButton( -1, this );\n  this.nextButton = new PrevNextButton( 1, this );\n\n  this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.activate();\n  this.nextButton.activate();\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.deactivate();\n  this.nextButton.deactivate();\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n  this.parent = parent;\n  this.isOriginLeft = parent.originSide == 'left';\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length == 1 ) {\n    this.x = cell.x; // x comes from first cell\n    var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n    this.firstMargin = cell.size[ beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n  var lastCell = this.getLastCell();\n  var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n  var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( function( cell ) {\n    cell.select();\n  } );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( function( cell ) {\n    cell.unselect();\n  } );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  } );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * getSize v2.0.3\n * measure size of elements\n * MIT license\n */\n\n/* jshint browser: true, strict: true, undef: true, unused: true */\n/* globals console: false */\n\n( function( window, factory ) {\n  /* jshint strict: false */ /* globals define, module */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See https://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * Chrome & Safari measure the outer-width on style.width on border-box elems\n   * IE11 & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n  // round value for browser zoom. desandro/masonry#928\n  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;\n  getSize.isBoxSizeOuter = isBoxSizeOuter;\n\n  body.removeChild( div );\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n","/*!\n * Unidragger v2.4.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'unipointer/unipointer'\n    ], function( Unipointer ) {\n      return factory( window, Unipointer );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('unipointer')\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n  this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  // bind each handle\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n  var touchAction = isAdd ? this._touchActionValue : '';\n  for ( var i=0; i < this.handles.length; i++ ) {\n    var handle = this.handles[i];\n    this._bindStartEvent( handle, isAdd );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) {\n      handle.style.touchAction = touchAction;\n    }\n  }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n  // track start event position\n  // Safari 9 overrides pageX and pageY. These values needs to be copied. flickity#842\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  event.preventDefault();\n  this.pointerDownBlur();\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n  TEXTAREA: true,\n  INPUT: true,\n  SELECT: true,\n  OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n  radio: true,\n  checkbox: true,\n  button: true,\n  submit: true,\n  image: true,\n  file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n  var isCursorNode = cursorNodes[ event.target.nodeName ];\n  var isClickType = clickTypes[ event.target.type ];\n  var isOkay = !isCursorNode || isClickType;\n  if ( !isOkay ) {\n    this._pointerReset();\n  }\n  return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n  var focused = document.activeElement;\n  // do not blur body for IE10, metafizzy/flickity#117\n  var canBlur = focused && focused.blur && focused != document.body;\n  if ( canBlur ) {\n    focused.blur();\n  }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n  var moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY\n  };\n  // start drag if pointer has moved far enough to start drag\n  if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n    this._dragStart( event, pointer );\n  }\n  return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n  if ( this.isDragging ) {\n    this._dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this._staticClick( event, pointer );\n  }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  // prevent clicks\n  this.isPreventingClicks = true;\n  this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n  // do not drag if not dragging yet\n  if ( !this.isDragging ) {\n    return;\n  }\n\n  this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n  // set flags\n  this.isDragging = false;\n  // re-enable clicking async\n  setTimeout( function() {\n    delete this.isPreventingClicks;\n  }.bind( this ) );\n\n  this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) {\n    event.preventDefault();\n  }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  this.staticClick( event, pointer );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    setTimeout( function() {\n      delete this.isIgnoringMouseUp;\n    }.bind( this ), 400 );\n  }\n};\n\nproto.staticClick = function( event, pointer ) {\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// -----  ----- //\n\nreturn Unidragger;\n\n}));\n","/*!\n * Unipointer v2.4.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*global define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter'\n    ], function( EvEmitter ) {\n      return factory( window, EvEmitter );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('ev-emitter')\n    );\n  } else {\n    // browser global\n    window.Unipointer = factory(\n      window,\n      window.EvEmitter\n    );\n  }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n  // default to mouse events\n  var startEvent = 'mousedown';\n  if ( 'ontouchstart' in window ) {\n    // HACK prefer Touch Events as you can preventDefault on touchstart to\n    // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n    startEvent = 'touchstart';\n  } else if ( window.PointerEvent ) {\n    // Pointer Events\n    startEvent = 'pointerdown';\n  }\n  elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n  for ( var i=0; i < touches.length; i++ ) {\n    var touch = touches[i];\n    if ( touch.identifier == this.pointerIdentifier ) {\n      return touch;\n    }\n  }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  // dismiss clicks from right or middle buttons\n  var button = event.button;\n  if ( button && ( button !== 0 && button !== 1 ) ) {\n    return;\n  }\n  this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n  // dismiss right click and other pointers\n  // button = 0 is okay, 1-4 not\n  if ( event.button || this.isPointerDown ) {\n    return;\n  }\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n\n  this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n  mousedown: [ 'mousemove', 'mouseup' ],\n  touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n  pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n  if ( !event ) {\n    return;\n  }\n  // get proper events to match start event\n  var events = postStartEvents[ event.type ];\n  // bind events to node\n  events.forEach( function( eventName ) {\n    window.addEventListener( eventName, this );\n  }, this );\n  // save these arguments\n  this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n  // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n  if ( !this._boundPointerEvents ) {\n    return;\n  }\n  this._boundPointerEvents.forEach( function( eventName ) {\n    window.removeEventListener( eventName, this );\n  }, this );\n\n  delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n  this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerMove( event, event );\n  }\n};\n\nproto.ontouchmove = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerMove( event, touch );\n  }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n  this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n  this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n  this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerUp( event, event );\n  }\n};\n\nproto.ontouchend = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerUp( event, touch );\n  }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n  this._pointerReset();\n  this._unbindPostStartEvents();\n  this.pointerDone();\n};\n\nproto._pointerReset = function() {\n  // reset properties\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerCancel( event, event );\n  }\n};\n\nproto.ontouchcancel = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerCancel( event, touch );\n  }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// -----  ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n  return {\n    x: pointer.pageX,\n    y: pointer.pageY\n  };\n};\n\n// -----  ----- //\n\nreturn Unipointer;\n\n}));\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (global, factory) {\n\t(typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.LazyLoad = factory();\n})(this, function () {\n\t'use strict';\n\n\tvar getDefaultSettings = function getDefaultSettings() {\n\t\treturn {\n\t\t\telements_selector: \"img\",\n\t\t\tcontainer: window,\n\t\t\tthreshold: 300,\n\t\t\tthrottle: 150,\n\t\t\tdata_src: \"src\",\n\t\t\tdata_srcset: \"srcset\",\n\t\t\tdata_sizes: \"sizes\",\n\t\t\tdata_bg: \"bg\",\n\t\t\tclass_loading: \"loading\",\n\t\t\tclass_loaded: \"loaded\",\n\t\t\tclass_error: \"error\",\n\t\t\tclass_initial: \"initial\",\n\t\t\tskip_invisible: true,\n\t\t\tcallback_load: null,\n\t\t\tcallback_error: null,\n\t\t\tcallback_set: null,\n\t\t\tcallback_enter: null,\n\t\t\tcallback_finish: null,\n\t\t\tto_webp: false\n\t\t};\n\t};\n\n\tvar dataPrefix = \"data-\";\n\tvar processedDataName = \"was-processed\";\n\tvar processedDataValue = \"true\";\n\n\tvar getData = function getData(element, attribute) {\n\t\treturn element.getAttribute(dataPrefix + attribute);\n\t};\n\n\tvar setData = function setData(element, attribute, value) {\n\t\tvar attrName = dataPrefix + attribute;\n\t\tif (value === null) {\n\t\t\telement.removeAttribute(attrName);\n\t\t\treturn;\n\t\t}\n\t\telement.setAttribute(attrName, value);\n\t};\n\n\tvar setWasProcessedData = function setWasProcessedData(element) {\n\t\treturn setData(element, processedDataName, processedDataValue);\n\t};\n\n\tvar getWasProcessedData = function getWasProcessedData(element) {\n\t\treturn getData(element, processedDataName) === processedDataValue;\n\t};\n\n\tvar purgeProcessedElements = function purgeProcessedElements(elements) {\n\t\treturn elements.filter(function (element) {\n\t\t\treturn !getWasProcessedData(element);\n\t\t});\n\t};\n\n\tvar purgeOneElement = function purgeOneElement(elements, elementToPurge) {\n\t\treturn elements.filter(function (element) {\n\t\t\treturn element !== elementToPurge;\n\t\t});\n\t};\n\n\tvar getTopOffset = function getTopOffset(element) {\n\t\treturn element.getBoundingClientRect().top + window.pageYOffset - element.ownerDocument.documentElement.clientTop;\n\t};\n\n\tvar isBelowViewport = function isBelowViewport(element, container, threshold) {\n\t\tvar fold = container === window ? window.innerHeight + window.pageYOffset : getTopOffset(container) + container.offsetHeight;\n\t\treturn fold <= getTopOffset(element) - threshold;\n\t};\n\n\tvar getLeftOffset = function getLeftOffset(element) {\n\t\treturn element.getBoundingClientRect().left + window.pageXOffset - element.ownerDocument.documentElement.clientLeft;\n\t};\n\n\tvar isAtRightOfViewport = function isAtRightOfViewport(element, container, threshold) {\n\t\tvar documentWidth = window.innerWidth;\n\t\tvar fold = container === window ? documentWidth + window.pageXOffset : getLeftOffset(container) + documentWidth;\n\t\treturn fold <= getLeftOffset(element) - threshold;\n\t};\n\n\tvar isAboveViewport = function isAboveViewport(element, container, threshold) {\n\t\tvar fold = container === window ? window.pageYOffset : getTopOffset(container);\n\t\treturn fold >= getTopOffset(element) + threshold + element.offsetHeight;\n\t};\n\n\tvar isAtLeftOfViewport = function isAtLeftOfViewport(element, container, threshold) {\n\t\tvar fold = container === window ? window.pageXOffset : getLeftOffset(container);\n\t\treturn fold >= getLeftOffset(element) + threshold + element.offsetWidth;\n\t};\n\n\tfunction isInsideViewport(element, container, threshold) {\n\t\treturn !isBelowViewport(element, container, threshold) && !isAboveViewport(element, container, threshold) && !isAtRightOfViewport(element, container, threshold) && !isAtLeftOfViewport(element, container, threshold);\n\t}\n\n\t/* Creates instance and notifies it through the window element */\n\tvar createInstance = function createInstance(classObj, options) {\n\t\tvar event;\n\t\tvar eventString = \"LazyLoad::Initialized\";\n\t\tvar instance = new classObj(options);\n\t\ttry {\n\t\t\t// Works in modern browsers\n\t\t\tevent = new CustomEvent(eventString, { detail: { instance: instance } });\n\t\t} catch (err) {\n\t\t\t// Works in Internet Explorer (all versions)\n\t\t\tevent = document.createEvent(\"CustomEvent\");\n\t\t\tevent.initCustomEvent(eventString, false, false, { instance: instance });\n\t\t}\n\t\twindow.dispatchEvent(event);\n\t};\n\n\t/* Auto initialization of one or more instances of lazyload, depending on the \n     options passed in (plain object or an array) */\n\tfunction autoInitialize(classObj, options) {\n\t\tif (!options) {\n\t\t\treturn;\n\t\t}\n\t\tif (!options.length) {\n\t\t\t// Plain object\n\t\t\tcreateInstance(classObj, options);\n\t\t} else {\n\t\t\t// Array of objects\n\t\t\tfor (var i = 0, optionsItem; optionsItem = options[i]; i += 1) {\n\t\t\t\tcreateInstance(classObj, optionsItem);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar replaceExtToWebp = function replaceExtToWebp(value, condition) {\n\t\treturn condition ? value.replace(/\\.(jpe?g|png)/gi, \".webp\") : value;\n\t};\n\n\tvar detectWebp = function detectWebp() {\n\t\tvar webpString = \"image/webp\";\n\t\tvar canvas = document.createElement(\"canvas\");\n\n\t\tif (canvas.getContext && canvas.getContext(\"2d\")) {\n\t\t\treturn canvas.toDataURL(webpString).indexOf('data:' + webpString) === 0;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tvar runningOnBrowser = typeof window !== \"undefined\";\n\n\tvar isBot = runningOnBrowser && !(\"onscroll\" in window) || /(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent);\n\tvar supportsClassList = runningOnBrowser && \"classList\" in document.createElement(\"p\");\n\n\tvar supportsWebp = runningOnBrowser && detectWebp();\n\n\tvar addClass = function addClass(element, className) {\n\t\tif (supportsClassList) {\n\t\t\telement.classList.add(className);\n\t\t\treturn;\n\t\t}\n\t\telement.className += (element.className ? \" \" : \"\") + className;\n\t};\n\n\tvar removeClass = function removeClass(element, className) {\n\t\tif (supportsClassList) {\n\t\t\telement.classList.remove(className);\n\t\t\treturn;\n\t\t}\n\t\telement.className = element.className.replace(new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), \" \").replace(/^\\s+/, \"\").replace(/\\s+$/, \"\");\n\t};\n\n\tvar setSourcesInChildren = function setSourcesInChildren(parentTag, attrName, dataAttrName, toWebpFlag) {\n\t\tfor (var i = 0, childTag; childTag = parentTag.children[i]; i += 1) {\n\t\t\tif (childTag.tagName === \"SOURCE\") {\n\t\t\t\tvar attrValue = getData(childTag, dataAttrName);\n\t\t\t\tsetAttributeIfValue(childTag, attrName, attrValue, toWebpFlag);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar setAttributeIfValue = function setAttributeIfValue(element, attrName, value, toWebpFlag) {\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\telement.setAttribute(attrName, replaceExtToWebp(value, toWebpFlag));\n\t};\n\n\tvar setSourcesImg = function setSourcesImg(element, settings) {\n\t\tvar toWebpFlag = supportsWebp && settings.to_webp;\n\t\tvar srcsetDataName = settings.data_srcset;\n\t\tvar parent = element.parentNode;\n\n\t\tif (parent && parent.tagName === \"PICTURE\") {\n\t\t\tsetSourcesInChildren(parent, \"srcset\", srcsetDataName, toWebpFlag);\n\t\t}\n\t\tvar sizesDataValue = getData(element, settings.data_sizes);\n\t\tsetAttributeIfValue(element, \"sizes\", sizesDataValue);\n\t\tvar srcsetDataValue = getData(element, srcsetDataName);\n\t\tsetAttributeIfValue(element, \"srcset\", srcsetDataValue, toWebpFlag);\n\t\tvar srcDataValue = getData(element, settings.data_src);\n\t\tsetAttributeIfValue(element, \"src\", srcDataValue, toWebpFlag);\n\t};\n\n\tvar setSourcesIframe = function setSourcesIframe(element, settings) {\n\t\tvar srcDataValue = getData(element, settings.data_src);\n\n\t\tsetAttributeIfValue(element, \"src\", srcDataValue);\n\t};\n\n\tvar setSourcesVideo = function setSourcesVideo(element, settings) {\n\t\tvar srcDataName = settings.data_src;\n\t\tvar srcDataValue = getData(element, srcDataName);\n\n\t\tsetSourcesInChildren(element, \"src\", srcDataName);\n\t\tsetAttributeIfValue(element, \"src\", srcDataValue);\n\t\telement.load();\n\t};\n\n\tvar setSourcesBgImage = function setSourcesBgImage(element, settings) {\n\t\tvar toWebpFlag = supportsWebp && settings.to_webp;\n\t\tvar srcDataValue = getData(element, settings.data_src);\n\t\tvar bgDataValue = getData(element, settings.data_bg);\n\n\t\tif (srcDataValue) {\n\t\t\tvar setValue = replaceExtToWebp(srcDataValue, toWebpFlag);\n\t\t\telement.style.backgroundImage = 'url(\"' + setValue + '\")';\n\t\t}\n\n\t\tif (bgDataValue) {\n\t\t\tvar _setValue = replaceExtToWebp(bgDataValue, toWebpFlag);\n\t\t\telement.style.backgroundImage = _setValue;\n\t\t}\n\t};\n\n\tvar setSourcesFunctions = {\n\t\tIMG: setSourcesImg,\n\t\tIFRAME: setSourcesIframe,\n\t\tVIDEO: setSourcesVideo\n\t};\n\n\tvar setSources = function setSources(element, instance) {\n\t\tvar settings = instance._settings;\n\t\tvar tagName = element.tagName;\n\t\tvar setSourcesFunction = setSourcesFunctions[tagName];\n\t\tif (setSourcesFunction) {\n\t\t\tsetSourcesFunction(element, settings);\n\t\t\tinstance._updateLoadingCount(1);\n\t\t\tinstance._elements = purgeOneElement(instance._elements, element);\n\t\t\treturn;\n\t\t}\n\t\tsetSourcesBgImage(element, settings);\n\t};\n\n\tvar callbackIfSet = function callbackIfSet(callback, argument) {\n\t\tif (callback) {\n\t\t\tcallback(argument);\n\t\t}\n\t};\n\n\tvar genericLoadEventName = \"load\";\n\tvar mediaLoadEventName = \"loadeddata\";\n\tvar errorEventName = \"error\";\n\n\tvar addEventListener = function addEventListener(element, eventName, handler) {\n\t\telement.addEventListener(eventName, handler);\n\t};\n\n\tvar removeEventListener = function removeEventListener(element, eventName, handler) {\n\t\telement.removeEventListener(eventName, handler);\n\t};\n\n\tvar addAllEventListeners = function addAllEventListeners(element, loadHandler, errorHandler) {\n\t\taddEventListener(element, genericLoadEventName, loadHandler);\n\t\taddEventListener(element, mediaLoadEventName, loadHandler);\n\t\taddEventListener(element, errorEventName, errorHandler);\n\t};\n\n\tvar removeAllEventListeners = function removeAllEventListeners(element, loadHandler, errorHandler) {\n\t\tremoveEventListener(element, genericLoadEventName, loadHandler);\n\t\tremoveEventListener(element, mediaLoadEventName, loadHandler);\n\t\tremoveEventListener(element, errorEventName, errorHandler);\n\t};\n\n\tvar eventHandler = function eventHandler(event, success, instance) {\n\t\tvar settings = instance._settings;\n\t\tvar className = success ? settings.class_loaded : settings.class_error;\n\t\tvar callback = success ? settings.callback_load : settings.callback_error;\n\t\tvar element = event.target;\n\n\t\tremoveClass(element, settings.class_loading);\n\t\taddClass(element, className);\n\t\tcallbackIfSet(callback, element);\n\n\t\tinstance._updateLoadingCount(-1);\n\t};\n\n\tvar addOneShotEventListeners = function addOneShotEventListeners(element, instance) {\n\t\tvar loadHandler = function loadHandler(event) {\n\t\t\teventHandler(event, true, instance);\n\t\t\tremoveAllEventListeners(element, loadHandler, errorHandler);\n\t\t};\n\t\tvar errorHandler = function errorHandler(event) {\n\t\t\teventHandler(event, false, instance);\n\t\t\tremoveAllEventListeners(element, loadHandler, errorHandler);\n\t\t};\n\t\taddAllEventListeners(element, loadHandler, errorHandler);\n\t};\n\n\tvar managedTags = [\"IMG\", \"IFRAME\", \"VIDEO\"];\n\n\tfunction revealElement(element, instance, force) {\n\t\tvar settings = instance._settings;\n\t\tif (!force && getWasProcessedData(element)) {\n\t\t\treturn; // element has already been processed and force wasn't true\n\t\t}\n\t\tcallbackIfSet(settings.callback_enter, element);\n\t\tif (managedTags.indexOf(element.tagName) > -1) {\n\t\t\taddOneShotEventListeners(element, instance);\n\t\t\taddClass(element, settings.class_loading);\n\t\t}\n\t\tsetSources(element, instance);\n\t\tsetWasProcessedData(element);\n\t\tcallbackIfSet(settings.callback_set, element);\n\t}\n\n\tvar removeFromArray = function removeFromArray(elements, indexes) {\n\t\twhile (indexes.length) {\n\t\t\telements.splice(indexes.pop(), 1);\n\t\t}\n\t};\n\n\t/*\n  * Constructor\n  */\n\n\tvar LazyLoad = function LazyLoad(instanceSettings) {\n\t\tthis._settings = _extends({}, getDefaultSettings(), instanceSettings);\n\t\tthis._loadingCount = 0;\n\t\tthis._queryOriginNode = this._settings.container === window ? document : this._settings.container;\n\n\t\tthis._previousLoopTime = 0;\n\t\tthis._loopTimeout = null;\n\t\tthis._boundHandleScroll = this.handleScroll.bind(this);\n\n\t\tthis._isFirstLoop = true;\n\t\twindow.addEventListener(\"resize\", this._boundHandleScroll);\n\t\tthis.update();\n\t};\n\n\tLazyLoad.prototype = {\n\t\t_loopThroughElements: function _loopThroughElements(forceDownload) {\n\t\t\tvar settings = this._settings,\n\t\t\t    elements = this._elements,\n\t\t\t    elementsLength = !elements ? 0 : elements.length;\n\t\t\tvar i = void 0,\n\t\t\t    processedIndexes = [],\n\t\t\t    isFirstLoop = this._isFirstLoop;\n\n\t\t\tif (isFirstLoop) {\n\t\t\t\tthis._isFirstLoop = false;\n\t\t\t}\n\n\t\t\tif (elementsLength === 0) {\n\t\t\t\tthis._stopScrollHandler();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < elementsLength; i++) {\n\t\t\t\tvar element = elements[i];\n\t\t\t\t/* If must skip_invisible and element is invisible, skip it */\n\t\t\t\tif (settings.skip_invisible && element.offsetParent === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (forceDownload || isInsideViewport(element, settings.container, settings.threshold)) {\n\t\t\t\t\tif (isFirstLoop) {\n\t\t\t\t\t\taddClass(element, settings.class_initial);\n\t\t\t\t\t}\n\t\t\t\t\tthis.load(element);\n\t\t\t\t\tprocessedIndexes.push(i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Removing processed elements from this._elements.\n\t\t\tremoveFromArray(elements, processedIndexes);\n\t\t},\n\n\t\t_startScrollHandler: function _startScrollHandler() {\n\t\t\tif (!this._isHandlingScroll) {\n\t\t\t\tthis._isHandlingScroll = true;\n\t\t\t\tthis._settings.container.addEventListener(\"scroll\", this._boundHandleScroll);\n\t\t\t}\n\t\t},\n\n\t\t_stopScrollHandler: function _stopScrollHandler() {\n\t\t\tif (this._isHandlingScroll) {\n\t\t\t\tthis._isHandlingScroll = false;\n\t\t\t\tthis._settings.container.removeEventListener(\"scroll\", this._boundHandleScroll);\n\t\t\t}\n\t\t},\n\n\t\t_updateLoadingCount: function _updateLoadingCount(plusMinus) {\n\t\t\tthis._loadingCount += plusMinus;\n\t\t\tif (this._elements.length === 0 && this._loadingCount === 0) {\n\t\t\t\tcallbackIfSet(this._settings.callback_finish);\n\t\t\t}\n\t\t},\n\n\t\thandleScroll: function handleScroll() {\n\t\t\tvar throttle = this._settings.throttle;\n\n\t\t\tif (throttle !== 0) {\n\t\t\t\tvar now = Date.now();\n\t\t\t\tvar remainingTime = throttle - (now - this._previousLoopTime);\n\t\t\t\tif (remainingTime <= 0 || remainingTime > throttle) {\n\t\t\t\t\tif (this._loopTimeout) {\n\t\t\t\t\t\tclearTimeout(this._loopTimeout);\n\t\t\t\t\t\tthis._loopTimeout = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis._previousLoopTime = now;\n\t\t\t\t\tthis._loopThroughElements();\n\t\t\t\t} else if (!this._loopTimeout) {\n\t\t\t\t\tthis._loopTimeout = setTimeout(function () {\n\t\t\t\t\t\tthis._previousLoopTime = Date.now();\n\t\t\t\t\t\tthis._loopTimeout = null;\n\t\t\t\t\t\tthis._loopThroughElements();\n\t\t\t\t\t}.bind(this), remainingTime);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._loopThroughElements();\n\t\t\t}\n\t\t},\n\n\t\tloadAll: function loadAll() {\n\t\t\tthis._loopThroughElements(true);\n\t\t},\n\n\t\tupdate: function update(elements) {\n\t\t\tvar settings = this._settings;\n\t\t\tvar nodeSet = elements || this._queryOriginNode.querySelectorAll(settings.elements_selector);\n\n\t\t\tthis._elements = purgeProcessedElements(Array.prototype.slice.call(nodeSet) // NOTE: nodeset to array for IE compatibility\n\t\t\t);\n\n\t\t\tif (isBot) {\n\t\t\t\tthis.loadAll();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._loopThroughElements();\n\t\t\tthis._startScrollHandler();\n\t\t},\n\n\t\tdestroy: function destroy() {\n\t\t\twindow.removeEventListener(\"resize\", this._boundHandleScroll);\n\t\t\tif (this._loopTimeout) {\n\t\t\t\tclearTimeout(this._loopTimeout);\n\t\t\t\tthis._loopTimeout = null;\n\t\t\t}\n\t\t\tthis._stopScrollHandler();\n\t\t\tthis._elements = null;\n\t\t\tthis._queryOriginNode = null;\n\t\t\tthis._settings = null;\n\t\t},\n\n\t\tload: function load(element, force) {\n\t\t\trevealElement(element, this, force);\n\t\t}\n\t};\n\n\t/* Automatic instances creation if required (useful for async script loading) */\n\tif (runningOnBrowser) {\n\t\tautoInitialize(LazyLoad, window.lazyLoadOptions);\n\t}\n\n\treturn LazyLoad;\n});"],"sourceRoot":""}