{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///mdl-ext.min.js?c961","webpack:///webpack/bootstrap 82005ea981e272a97aa0?b88c","webpack:///./~/babel-runtime/~/core-js/library/modules/_core.js?d611","webpack:///./src/utils/constants.js?14df","webpack:///./~/babel-runtime/~/core-js/library/modules/_export.js?8e40","webpack:///./~/babel-runtime/~/core-js/library/modules/_wks.js?2014","webpack:///./~/babel-runtime/~/core-js/library/modules/_global.js?3c52","webpack:///./~/babel-runtime/~/core-js/library/modules/_an-object.js?3af2","webpack:///./~/babel-runtime/~/core-js/library/modules/_iterators.js?f3f3","webpack:///./~/babel-runtime/helpers/toConsumableArray.js?1825","webpack:///./~/babel-runtime/~/core-js/library/modules/_descriptors.js?c0f5","webpack:///./~/babel-runtime/~/core-js/library/modules/_fails.js?c6dd","webpack:///./~/babel-runtime/~/core-js/library/modules/_hide.js?0d2e","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-dp.js?5986","webpack:///./src/utils/full-throttle.js?dc07","webpack:///./src/utils/json-utils.js?45f0","webpack:///./src/utils/string-utils.js?37f8","webpack:///./~/babel-runtime/~/core-js/library/modules/_has.js?ddd0","webpack:///./~/babel-runtime/~/core-js/library/modules/_is-object.js?cfda","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-keys.js?5d2e","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-iobject.js?527c","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-object.js?ca4f","webpack:///./src/utils/dom-utils.js?0816","webpack:///./~/babel-runtime/helpers/classCallCheck.js?21af","webpack:///./~/babel-runtime/helpers/createClass.js?1dfe","webpack:///./~/babel-runtime/~/core-js/library/modules/_defined.js?932b","webpack:///./~/babel-runtime/~/core-js/library/modules/_property-desc.js?256b","webpack:///./~/babel-runtime/~/core-js/library/modules/_shared-key.js?5602","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-integer.js?09ce","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.string.iterator.js?ae27","webpack:///./src/utils/easing.js?f6e9","webpack:///./src/utils/interval-function.js?c7e7","webpack:///./~/babel-runtime/core-js/get-iterator.js?1b08","webpack:///./~/babel-runtime/core-js/number/is-integer.js?14ca","webpack:///./~/babel-runtime/core-js/object/assign.js?e6ca","webpack:///./~/babel-runtime/~/core-js/library/modules/_a-function.js?0699","webpack:///./~/babel-runtime/~/core-js/library/modules/_classof.js?4e04","webpack:///./~/babel-runtime/~/core-js/library/modules/_cof.js?7381","webpack:///./~/babel-runtime/~/core-js/library/modules/_ctx.js?4e59","webpack:///./~/babel-runtime/~/core-js/library/modules/_dom-create.js?612f","webpack:///./~/babel-runtime/~/core-js/library/modules/_enum-bug-keys.js?3254","webpack:///./~/babel-runtime/~/core-js/library/modules/_iobject.js?34ed","webpack:///./~/babel-runtime/~/core-js/library/modules/_iter-define.js?4272","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-pie.js?a26b","webpack:///./~/babel-runtime/~/core-js/library/modules/_set-to-string-tag.js?57a7","webpack:///./~/babel-runtime/~/core-js/library/modules/_shared.js?f1ee","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-length.js?f510","webpack:///./~/babel-runtime/~/core-js/library/modules/_uid.js?c10a","webpack:///./~/babel-runtime/~/core-js/library/modules/core.get-iterator-method.js?8a45","webpack:///./~/babel-runtime/~/core-js/library/modules/web.dom.iterable.js?7e82","webpack:///./src/accordion/accordion.js?021c","webpack:///./src/carousel/carousel.js?7189","webpack:///./src/collapsible/collapsible.js?8da8","webpack:///./src/formatfield/formatfield.js?602e","webpack:///./src/index.js?9552","webpack:///./src/lightboard/lightboard.js?4a51","webpack:///./src/lightbox/lightbox.js?4a9b","webpack:///./src/menu-button/menu-button.js?292f","webpack:///./src/selectfield/selectfield.js?4310","webpack:///./src/sticky-header/sticky-header.js?0ce9","webpack:///./src/utils/index.js?d310","webpack:///./~/babel-runtime/core-js/array/from.js?efc2","webpack:///./~/babel-runtime/core-js/is-iterable.js?350e","webpack:///./~/babel-runtime/core-js/number/is-nan.js?f039","webpack:///./~/babel-runtime/core-js/object/define-property.js?5f70","webpack:///./~/babel-runtime/core-js/object/entries.js?41f9","webpack:///./~/babel-runtime/core-js/object/keys.js?fe06","webpack:///./~/babel-runtime/core-js/reflect/apply.js?a3c1","webpack:///./~/babel-runtime/helpers/slicedToArray.js?39c4","webpack:///./~/babel-runtime/~/core-js/library/fn/array/from.js?56e0","webpack:///./~/babel-runtime/~/core-js/library/fn/get-iterator.js?cf7c","webpack:///./~/babel-runtime/~/core-js/library/fn/is-iterable.js?f64a","webpack:///./~/babel-runtime/~/core-js/library/fn/number/is-integer.js?17db","webpack:///./~/babel-runtime/~/core-js/library/fn/number/is-nan.js?e8e9","webpack:///./~/babel-runtime/~/core-js/library/fn/object/assign.js?2fc7","webpack:///./~/babel-runtime/~/core-js/library/fn/object/define-property.js?4d33","webpack:///./~/babel-runtime/~/core-js/library/fn/object/entries.js?eb23","webpack:///./~/babel-runtime/~/core-js/library/fn/object/keys.js?0e2b","webpack:///./~/babel-runtime/~/core-js/library/fn/reflect/apply.js?1fe6","webpack:///./~/babel-runtime/~/core-js/library/modules/_add-to-unscopables.js?7da3","webpack:///./~/babel-runtime/~/core-js/library/modules/_array-includes.js?3a79","webpack:///./~/babel-runtime/~/core-js/library/modules/_create-property.js?f892","webpack:///./~/babel-runtime/~/core-js/library/modules/_html.js?8916","webpack:///./~/babel-runtime/~/core-js/library/modules/_ie8-dom-define.js?b102","webpack:///./~/babel-runtime/~/core-js/library/modules/_is-array-iter.js?a9d0","webpack:///./~/babel-runtime/~/core-js/library/modules/_is-integer.js?9053","webpack:///./~/babel-runtime/~/core-js/library/modules/_iter-call.js?45cd","webpack:///./~/babel-runtime/~/core-js/library/modules/_iter-create.js?0359","webpack:///./~/babel-runtime/~/core-js/library/modules/_iter-detect.js?e400","webpack:///./~/babel-runtime/~/core-js/library/modules/_iter-step.js?8944","webpack:///./~/babel-runtime/~/core-js/library/modules/_library.js?08a9","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-assign.js?82ff","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-create.js?9175","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-dps.js?73bc","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-gops.js?a865","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-gpo.js?5ec8","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-keys-internal.js?6fa8","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-sap.js?2605","webpack:///./~/babel-runtime/~/core-js/library/modules/_object-to-array.js?205b","webpack:///./~/babel-runtime/~/core-js/library/modules/_redefine.js?350a","webpack:///./~/babel-runtime/~/core-js/library/modules/_string-at.js?8678","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-index.js?7bea","webpack:///./~/babel-runtime/~/core-js/library/modules/_to-primitive.js?1a65","webpack:///./~/babel-runtime/~/core-js/library/modules/core.get-iterator.js?74ea","webpack:///./~/babel-runtime/~/core-js/library/modules/core.is-iterable.js?be30","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.array.from.js?f8ab","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.array.iterator.js?8359","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.number.is-integer.js?a48c","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.number.is-nan.js?7944","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.object.assign.js?07f0","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.object.define-property.js?8bde","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.object.keys.js?dfa4","webpack:///./~/babel-runtime/~/core-js/library/modules/es6.reflect.apply.js?2b77","webpack:///./~/babel-runtime/~/core-js/library/modules/es7.object.entries.js?872a"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","core","version","__e","Object","defineProperty","value","VK_TAB","VK_ENTER","VK_ESC","VK_SPACE","VK_PAGE_UP","VK_PAGE_DOWN","VK_END","VK_HOME","VK_ARROW_LEFT","VK_ARROW_UP","VK_ARROW_RIGHT","VK_ARROW_DOWN","ARIA_EXPANDED","ARIA_HIDDEN","ARIA_MULTISELECTABLE","ARIA_SELECTED","IS_DIRTY","IS_DISABLED","IS_EXPANDED","IS_FOCUSED","IS_INVALID","IS_UPGRADED","DATA_UPGRADED","MDL_RIPPLE","MDL_RIPPLE_COMPONENT","MDL_RIPPLE_EFFECT","MDL_RIPPLE_EFFECT_IGNORE_EVENTS","global","ctx","hide","PROTOTYPE","$export","type","name","source","key","own","out","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","S","IS_PROTO","P","IS_BIND","B","IS_WRAP","W","expProto","target","undefined","C","a","b","arguments","length","apply","Function","virtual","R","U","store","uid","Symbol","USE_SYMBOL","$exports","window","Math","self","__g","isObject","it","TypeError","_interopRequireDefault","obj","__esModule","default","_from","_from2","arr","Array","isArray","i","arr2","get","exec","e","dP","createDesc","object","f","anObject","IE8_DOM_DEFINE","toPrimitive","O","Attributes","_apply","_apply2","fullThrottle","callback","context","throttling","_len","args","_key","requestAnimationFrame","jsonStringToObject","_assign","_assign2","jsonString","s","replace","JSON","parse","Error","message","stringList","randomString","joinStrings","_keys","_keys2","isString","str","flatten","list","reduce","concat","objectToStrings","arg","filter","map","result","_len2","_key2","delimiter","join","n","random","toString","slice","hasOwnProperty","$keys","enumBugKeys","keys","IObject","defined","tether","removeChildElements","moveElements","isRectInsideWindowViewport","isFocusable","getScrollParents","getParentElements","getWindowViewport","_isNan","_isNan2","element","forceReflow","lastChild","removeChild","d","style","display","ownerDocument","createDocumentFragment","firstChild","appendChild","viewportWidth","max","document","documentElement","clientWidth","innerWidth","viewportHeight","clientHeight","innerHeight","_ref","top","left","bottom","right","_getWindowViewport","el","elements","parentNode","cs","getComputedStyle","overflowY","overflowX","unshift","body","from","to","controlledBy","controlRect","getBoundingClientRect","_getWindowViewport2","height","offsetHeight","width","offsetWidth","elementRect","dy","dx","ddy","ddx","r","offsetTop","offsetLeft","hasAttribute","tabindex","getAttribute","parseInt","selector","nodeName","test","toLowerCase","disabled","href","getPropertyValue","instance","Constructor","_defineProperty","_defineProperty2","defineProperties","props","descriptor","enumerable","configurable","writable","protoProps","staticProps","prototype","bitmap","shared","ceil","floor","isNaN","$at","String","iterated","_t","_i","point","index","done","easeInOutQuad","t","inOutQuintic","ts","tc","MIN_INERVAL","intervalFunction","interval","lapse","cb","next","timeElapsed","execute","cancel","cancelAnimationFrame","start","timeStart","Date","now","loop","started","immediate","ReferenceError","stop","cof","TAG","ARG","tryGet","T","callee","aFunction","fn","that","is","createElement","split","propertyIsEnumerable","LIBRARY","redefine","has","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","Base","NAME","DEFAULT","IS_SET","FORCED","methods","IteratorPrototype","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","def","tag","stat","SHARED","toInteger","min","px","classof","getIteratorMethod","TO_STRING_TAG","collections","Collection","_toConsumableArray2","_toConsumableArray3","_constants","ACCORDION","ACCORDION_VERTICAL","ACCORDION_HORIZONTAL","PANEL","PANEL_ROLE","TAB","TAB_CAPTION","TAB_ROLE","TABPANEL","TABPANEL_ROLE","RIPPLE_EFFECT","RIPPLE","ANIMATION_EFFECT","ANIMATION","MaterialExtAccordion","element_","init","accordionPanelElements","classList","contains","panel","tab","querySelector","tabpanel","commandHandler_","event","preventDefault","stopPropagation","detail","command","dispatchToggleEvent_","state","ce","CustomEvent","bubbles","cancelable","dispatchEvent","openTab_","add","setAttribute","removeAttribute","closeTab_","remove","toggleTab_","closeTabs_","openTabs_","_this","querySelectorAll","forEach","closedItem","_this2","upgradeTab","tabElement","_this3","_accordionPanelElemen","disableTab","enableTab","calcMaxTabCaptionWidth","tabCaption","w","children","v","maxWidth","selectTab","selectedTab","tabClickHandler","tabFocusHandler","tabpanelClickHandler","tabpanelFocusHandler","tabKeydownHandler","keyCode","nextTab","nextPanel","previousElementSibling","nextElementSibling","focus","removeEventListener","addEventListener","_this4","openTab","_accordionPanelElemen2","closeTab","_accordionPanelElemen3","toggleTab","_accordionPanelElemen4","action","_this5","bind","componentHandler","register","constructor","classAsString","cssClass","widget","_isInteger","_isInteger2","_intervalFunction","_intervalFunction2","_easing","_jsonUtils","MDL_RIPPLE_CONTAINER","SLIDE","ROLE","SLIDE_ROLE","MaterialExtCarousel","config_","interactive","autostart","animationLoop","scrollAnimation_","startSlideShow_","nextSlide","slide","animateScroll_","moveSlideIntoViewport_","emitSelectEvent_","nextScroll","direction","nextDirection","scrollLeft","scrollWidth","x","cancelSlideShow_","newPosition","newDuration","completedCallback","distance","duration","abs","command_","setAriaSelected_","slides","getSlidesInViewport_","keyDownHandler_","cmd","getSlide_","shiftKey","setFocus_","dragHandler_","updating","rAFDragId","startX","clientX","touches","prevX","targetElement","update","currentX","drag","endDrag","clickHandler_","focusHandler_","blurHandler_","evt","carouselRect","slidesInViewport","slideRect","removeListeners_","mdlDowngrade_","closest","addRipple_","rippleContainer","ripple","img","title","upgradeElement","stopAnimation","upgradeSlides","hasRippleEffect","getConfig","_classCallCheck2","_classCallCheck3","_createClass2","_createClass3","_stringUtils","_domUtils","JS_COLLAPSIBLE","COLLAPSIBLE_CONTROL_CLASS","COLLAPSIBLE_GROUP_CLASS","COLLAPSIBLE_REGION_CLASS","Collapsible","controlElement_","keyDownHandler","controlElement","MouseEvent","view","clickHandler","isDisabled","push","find","toggle","isExpanded","dispatchToggleEvent","regions","regionElements","region","collapse","expand","regionId","ids","regionIds","role","addRegionId","initControl","initRegions","addRegionElement","addListeners","removeListeners","MaterialExtCollapsible","collapsible","downgrade","getControlElement","getRegionElements","addRegionElements","removeRegionElements","removeRegionElement","disableToggle","enableToggle","_class","_temp","JS_FORMAT_FIELD","FORMAT_FIELD_COMPONENT","browserLanguage","navigator","languages","language","userLanguage","FormatField","options_","clearTimeout","timer","focusInHandler","input","readOnly","unformatInput","setTimeout","select","focusOutHandler","formatValue","doReplace","RegExp","options","groupSeparator","decimalSeparator","intlGroupSeparator_","intlDecimalSeparator_","Intl","NumberFormat","locales","format","stripSeparatorsFromValue","fixSeparators","_this6","addOptions","opts","addLocale","addGrouping","toLocaleString","useGrouping","minimumFractionDigits","maximumFractionDigits","charAt","input_","MaterialExtFormatfield","formatField_","getOptions","getUnformattedValue","unformat","LIGHTBOARD_ROLE","SLIDE_TABSTOP","MaterialExtLightboard","getSlide","selectSlide_","selectedSlide","dispatchSelectEvent_","addRipple","firstSlide","lastSlide","prevSlide","keydownHandler","focusHandler","_slicedToArray2","_slicedToArray3","_entries","_entries2","_getIterator2","_getIterator3","_fullThrottle","_fullThrottle2","LIGHTBOX","LIGHTBOX_SLIDER","LIGHTBOX_SLIDER_SLIDE","STICKY_FOOTER","BUTTON","MaterialExtLightbox","dispatchAction_","buttonClickHandler_","repositionDialog_","lightboxElement","footerHeight","footer","isSticky","reposition","dialog","fh","position","scrollTop","topValue","naturalWidth","vh","imgLoadHandler_","imgDragHandler_","setStyles","properties","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_step$value","err","return","opacity","slider","textContent","line-height","font-size","text-align","background-image","src","button","figcaption","JS_MENU_BUTTON","MENU_BUTTON_MENU","MENU_BUTTON_MENU_ITEM","MENU_BUTTON_MENU_ITEM_SEPARATOR","menuFactory","ariaControls","removeAllSelected","selectedItem","setSelected","item","force","getSelected","isSeparator","nextItem","current","firstElementChild","previousItem","lastElementChild","firstItem","lastItem","selectItem","close","blurHandler","relatedTarget","explicitOriginalTarget","activeElement","shouldClose","touchStartHandler","open","btn","forceFocus","addWaiAria","menuitem","selected","MenuButton","openMenu","closeMenu","recalcMenuPosition","focusElement","focusElementLastScrollPosition","parseFloat","menu","positionChangeHandler","closeMenuHandler","dispatchMenuSelect","scrollElements","addFocusElement","tagName","moveElementToDocumentBody","findMenuElement","menuElement","menuElementId","addMenu","componentInstance","related","indexOf","MaterialExtMenuButton","menuButton_","getMenuElement","getSelectedMenuItem","setSelectedMenuItem","LABEL","INPUT","MaterialExtSelectfield","onFocus_","onBlur_","onReset_","updateClasses_","checkDisabled","checkValidity","checkDirty","checkFocus","select_","Boolean","disable","enable","change","label_","invalid","MDL_LAYOUT_CONTENT","IS_SCROLL_CLASS","MaterialExtStickyHeader","header_","content_","lastScrollTop_","visibleAtScrollEnd","mutationObserver_","drawing_","recalcWidth_","throttleResize","resizeHandler_","reposition_","currentContentScrollTop","scrollDiff","headerTop","scrollHeight","throttleScroll","scrollHandler_","updatePosition_","addMutationObserver_","MutationObserver","observe","attributes","childList","characterData","subtree","disconnect","paddingTop","_isIterable2","_isIterable3","sliceIterator","_arr","_n","_d","_e","_s","Number","isInteger","assign","$Object","desc","Reflect","toIObject","toLength","toIndex","IS_INCLUDES","$this","fromIndex","$defineProperty","ArrayProto","isFinite","iterator","ret","create","SAFE_CLOSING","riter","skipClosing","safe","iter","getKeys","gOPS","pIE","toObject","$assign","A","K","k","aLen","getSymbols","isEnum","j","dPs","IE_PROTO","Empty","createDict","iframeDocument","iframe","lt","gt","contentWindow","write","Properties","getOwnPropertySymbols","ObjectProto","arrayIndexOf","names","fails","KEY","exp","isEntries","TO_STRING","pos","l","charCodeAt","val","valueOf","getIterator","iterFn","isIterable","isArrayIter","createProperty","getIterFn","arrayLike","step","mapfn","mapping","addToUnscopables","_k","Arguments","number","rApply","fApply","thisArgument","argumentsList","L"],"mappings":"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","file":"mdl-ext.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"mdl-ext\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mdl-ext\"] = factory();\n\telse\n\t\troot[\"mdl-ext\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"mdl-ext\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mdl-ext\"] = factory();\n\telse\n\t\troot[\"mdl-ext\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(113);\n\tmodule.exports = __webpack_require__(53);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tvar core = module.exports = {version: '2.4.0'};\n\tif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\tvar VK_TAB = 9;\n\tvar VK_ENTER = 13;\n\tvar VK_ESC = 27;\n\tvar VK_SPACE = 32;\n\tvar VK_PAGE_UP = 33;\n\tvar VK_PAGE_DOWN = 34;\n\tvar VK_END = 35;\n\tvar VK_HOME = 36;\n\tvar VK_ARROW_LEFT = 37;\n\tvar VK_ARROW_UP = 38;\n\tvar VK_ARROW_RIGHT = 39;\n\tvar VK_ARROW_DOWN = 40;\n\t\n\tvar ARIA_EXPANDED = 'aria-expanded';\n\tvar ARIA_HIDDEN = 'aria-hidden';\n\tvar ARIA_MULTISELECTABLE = 'aria-multiselectable';\n\tvar ARIA_SELECTED = 'aria-selected';\n\t\n\tvar IS_DIRTY = 'is-dirty';\n\tvar IS_DISABLED = 'is-disabled';\n\tvar IS_EXPANDED = 'is-expanded';\n\tvar IS_FOCUSED = 'is-focused';\n\tvar IS_INVALID = 'is-invalid';\n\tvar IS_UPGRADED = 'is-upgraded';\n\tvar DATA_UPGRADED = 'data-upgraded';\n\t\n\tvar MDL_RIPPLE = 'mdl-ripple';\n\tvar MDL_RIPPLE_COMPONENT = 'MaterialRipple';\n\tvar MDL_RIPPLE_EFFECT = 'mdl-js-ripple-effect';\n\tvar MDL_RIPPLE_EFFECT_IGNORE_EVENTS = 'mdl-js-ripple-effect--ignore-events';\n\t\n\texports.VK_TAB = VK_TAB;\n\texports.VK_ENTER = VK_ENTER;\n\texports.VK_ESC = VK_ESC;\n\texports.VK_SPACE = VK_SPACE;\n\texports.VK_PAGE_UP = VK_PAGE_UP;\n\texports.VK_PAGE_DOWN = VK_PAGE_DOWN;\n\texports.VK_END = VK_END;\n\texports.VK_HOME = VK_HOME;\n\texports.VK_ARROW_LEFT = VK_ARROW_LEFT;\n\texports.VK_ARROW_UP = VK_ARROW_UP;\n\texports.VK_ARROW_RIGHT = VK_ARROW_RIGHT;\n\texports.VK_ARROW_DOWN = VK_ARROW_DOWN;\n\texports.ARIA_EXPANDED = ARIA_EXPANDED;\n\texports.ARIA_HIDDEN = ARIA_HIDDEN;\n\texports.ARIA_MULTISELECTABLE = ARIA_MULTISELECTABLE;\n\texports.ARIA_SELECTED = ARIA_SELECTED;\n\texports.IS_DIRTY = IS_DIRTY;\n\texports.IS_DISABLED = IS_DISABLED;\n\texports.IS_EXPANDED = IS_EXPANDED;\n\texports.IS_FOCUSED = IS_FOCUSED;\n\texports.IS_INVALID = IS_INVALID;\n\texports.IS_UPGRADED = IS_UPGRADED;\n\texports.DATA_UPGRADED = DATA_UPGRADED;\n\texports.MDL_RIPPLE = MDL_RIPPLE;\n\texports.MDL_RIPPLE_COMPONENT = MDL_RIPPLE_COMPONENT;\n\texports.MDL_RIPPLE_EFFECT = MDL_RIPPLE_EFFECT;\n\texports.MDL_RIPPLE_EFFECT_IGNORE_EVENTS = MDL_RIPPLE_EFFECT_IGNORE_EVENTS;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global    = __webpack_require__(5)\n\t  , core      = __webpack_require__(1)\n\t  , ctx       = __webpack_require__(37)\n\t  , hide      = __webpack_require__(11)\n\t  , PROTOTYPE = 'prototype';\n\t\n\tvar $export = function(type, name, source){\n\t  var IS_FORCED = type & $export.F\n\t    , IS_GLOBAL = type & $export.G\n\t    , IS_STATIC = type & $export.S\n\t    , IS_PROTO  = type & $export.P\n\t    , IS_BIND   = type & $export.B\n\t    , IS_WRAP   = type & $export.W\n\t    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})\n\t    , expProto  = exports[PROTOTYPE]\n\t    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n\t    , key, own, out;\n\t  if(IS_GLOBAL)source = name;\n\t  for(key in source){\n\t    // contains in native\n\t    own = !IS_FORCED && target && target[key] !== undefined;\n\t    if(own && key in exports)continue;\n\t    // export native or passed\n\t    out = own ? target[key] : source[key];\n\t    // prevent global pollution for namespaces\n\t    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n\t    // bind timers to global for call from export context\n\t    : IS_BIND && own ? ctx(out, global)\n\t    // wrap global constructors for prevent change them in library\n\t    : IS_WRAP && target[key] == out ? (function(C){\n\t      var F = function(a, b, c){\n\t        if(this instanceof C){\n\t          switch(arguments.length){\n\t            case 0: return new C;\n\t            case 1: return new C(a);\n\t            case 2: return new C(a, b);\n\t          } return new C(a, b, c);\n\t        } return C.apply(this, arguments);\n\t      };\n\t      F[PROTOTYPE] = C[PROTOTYPE];\n\t      return F;\n\t    // make static versions for prototype methods\n\t    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n\t    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n\t    if(IS_PROTO){\n\t      (exports.virtual || (exports.virtual = {}))[key] = out;\n\t      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n\t      if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n\t    }\n\t  }\n\t};\n\t// type bitmap\n\t$export.F = 1;   // forced\n\t$export.G = 2;   // global\n\t$export.S = 4;   // static\n\t$export.P = 8;   // proto\n\t$export.B = 16;  // bind\n\t$export.W = 32;  // wrap\n\t$export.U = 64;  // safe\n\t$export.R = 128; // real proto method for `library` \n\tmodule.exports = $export;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar store      = __webpack_require__(44)('wks')\n\t  , uid        = __webpack_require__(46)\n\t  , Symbol     = __webpack_require__(5).Symbol\n\t  , USE_SYMBOL = typeof Symbol == 'function';\n\t\n\tvar $exports = module.exports = function(name){\n\t  return store[name] || (store[name] =\n\t    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n\t};\n\t\n\t$exports.store = store;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n\t  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\tif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(17);\n\tmodule.exports = function(it){\n\t  if(!isObject(it))throw TypeError(it + ' is not an object!');\n\t  return it;\n\t};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _from = __webpack_require__(60);\n\t\n\tvar _from2 = _interopRequireDefault(_from);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = function (arr) {\n\t  if (Array.isArray(arr)) {\n\t    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t      arr2[i] = arr[i];\n\t    }\n\t\n\t    return arr2;\n\t  } else {\n\t    return (0, _from2.default)(arr);\n\t  }\n\t};\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Thank's IE8 for his funny defineProperty\n\tmodule.exports = !__webpack_require__(10)(function(){\n\t  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n\t});\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(exec){\n\t  try {\n\t    return !!exec();\n\t  } catch(e){\n\t    return true;\n\t  }\n\t};\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar dP         = __webpack_require__(12)\n\t  , createDesc = __webpack_require__(25);\n\tmodule.exports = __webpack_require__(9) ? function(object, key, value){\n\t  return dP.f(object, key, createDesc(1, value));\n\t} : function(object, key, value){\n\t  object[key] = value;\n\t  return object;\n\t};\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar anObject       = __webpack_require__(6)\n\t  , IE8_DOM_DEFINE = __webpack_require__(82)\n\t  , toPrimitive    = __webpack_require__(101)\n\t  , dP             = Object.defineProperty;\n\t\n\texports.f = __webpack_require__(9) ? Object.defineProperty : function defineProperty(O, P, Attributes){\n\t  anObject(O);\n\t  P = toPrimitive(P, true);\n\t  anObject(Attributes);\n\t  if(IE8_DOM_DEFINE)try {\n\t    return dP(O, P, Attributes);\n\t  } catch(e){ /* empty */ }\n\t  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n\t  if('value' in Attributes)O[P] = Attributes.value;\n\t  return O;\n\t};\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tvar _apply = __webpack_require__(66);\n\t\n\tvar _apply2 = _interopRequireDefault(_apply);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Since some events can fire at a high rate, the event handler should be limited to execute computationally\n\t * expensive operations, such as DOM modifications, inside a single rendered frame.\n\t * When listening to e.g. scroll and resize events, the browser tends to fire off more events per\n\t * second than are actually useful. For instance, if your event listener sets some element positions, then it\n\t * is possible for those positions to be updated multiple times in a single rendered frame. In this case, all of\n\t * the layout calculations triggered by setting the elements' positions will be wasted except for the one time that\n\t * it runs immediately prior to the browser rendering the updated layout to the screen.\n\t * To avoid wasting cycles, we can use requestAnimationFrame to only run the event listener once just before the page\n\t * is rendered to the screen.\n\t * *\n\t * @param callback the function to throttle\n\t * @param context  optional context of this, default to global\n\t * @return {function(...[*])}\n\t */\n\tvar fullThrottle = function fullThrottle(callback, context) {\n\t\n\t  if (!context) {\n\t    context = undefined || window;\n\t  }\n\t\n\t  var throttling = false;\n\t\n\t  return function () {\n\t    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t      args[_key] = arguments[_key];\n\t    }\n\t\n\t    if (!throttling) {\n\t      throttling = true;\n\t      window.requestAnimationFrame(function () {\n\t        throttling = false;\n\t        return (0, _apply2.default)(callback, context, args);\n\t      });\n\t    }\n\t  };\n\t};\n\t\n\texports.default = fullThrottle;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t/**\n\t * Converts a JSON string to object\n\t * @param jsonString\n\t * @param source\n\t */\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.jsonStringToObject = undefined;\n\t\n\tvar _assign = __webpack_require__(33);\n\t\n\tvar _assign2 = _interopRequireDefault(_assign);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar jsonStringToObject = function jsonStringToObject(jsonString) {\n\t  var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\n\t  var s = jsonString.replace(/'/g, '\"');\n\t  try {\n\t    return (0, _assign2.default)(source, JSON.parse(s));\n\t  } catch (e) {\n\t    throw new Error('Failed to parse json string: ' + s + '. Error: ' + e.message);\n\t  }\n\t};\n\t\n\texports.jsonStringToObject = jsonStringToObject;\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t/**\n\t * @license\n\t * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t *      http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t */\n\t\n\t/**\n\t * A javascript utility for conditionally creating a list of strings.\n\t * The function takes any number of arguments which can be a string or object.\n\t * Inspired by (but not copied from) JedWatson/classnames, https://github.com/JedWatson/classnames\n\t *\n\t * @param  {*} args the strings and/or objects to\n\t * @return {Array} a list of strings\n\t * @example\n\t * // Returns ['foo', 'bar', 'baz', 'quux']\n\t * stringList(', ', 'foo', { bar: true, duck: false }, 'baz', { quux: true });\n\t * @example see the tests for more examples\n\t */\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.stringList = exports.randomString = exports.joinStrings = undefined;\n\t\n\tvar _keys = __webpack_require__(65);\n\t\n\tvar _keys2 = _interopRequireDefault(_keys);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar stringList = function stringList() {\n\t  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t    args[_key] = arguments[_key];\n\t  }\n\t\n\t  var isString = function isString(str) {\n\t    return str != null && typeof str === 'string';\n\t  };\n\t\n\t  var flatten = function flatten(list) {\n\t    return list.reduce(function (a, b) {\n\t      return a.concat(Array.isArray(b) ? flatten(b) : b);\n\t    }, []);\n\t  };\n\t\n\t  var objectToStrings = function objectToStrings(arg) {\n\t    return (0, _keys2.default)(arg).filter(function (key) {\n\t      return arg[key];\n\t    }).map(function (key) {\n\t      return key;\n\t    });\n\t  };\n\t\n\t  return args.filter(function (arg) {\n\t    return !!arg;\n\t  }).map(function (arg) {\n\t    return isString(arg) ? arg : objectToStrings(arg);\n\t  }).reduce(function (result, arg) {\n\t    return result.concat(Array.isArray(arg) ? flatten(arg) : arg);\n\t  }, []);\n\t};\n\t\n\t/**\n\t * A simple javascript utility for conditionally joining strings together.\n\t * The function takes a delimiter string and any number of arguments which can be a string or object.\n\t *\n\t * @param delimiter delimiter to separate joined strings\n\t * @param  {*} args the strings and/or objects to join\n\t * @return {String} the joined strings\n\t * @example\n\t * // Returns 'foo, bar, baz, quux'\n\t * joinStrings(', ', 'foo', { bar: true, duck: false }, 'baz', { quux: true });\n\t * @example see the tests for more examples\n\t */\n\tvar joinStrings = function joinStrings() {\n\t  for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n\t    args[_key2 - 1] = arguments[_key2];\n\t  }\n\t\n\t  var delimiter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ' ';\n\t  return stringList.apply(undefined, args).join(delimiter);\n\t};\n\t\n\t/**\n\t * Generates a random string with a given length\n\t * @param n {Integer} length of generated string\n\t * @see http://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript\n\t * @return {String} the random string\n\t * @example\n\t * // Returns e.g. 'pd781w0y'\n\t * randomString(8);\n\t * @example see the tests for more examples\n\t */\n\tvar randomString = function randomString() {\n\t  var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 12;\n\t  return Array(n + 1).join((Math.random().toString(36) + '00000000000000000').slice(2, 18)).slice(0, n);\n\t};\n\t\n\texports.joinStrings = joinStrings;\n\texports.randomString = randomString;\n\texports.stringList = stringList;\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\tmodule.exports = function(it, key){\n\t  return hasOwnProperty.call(it, key);\n\t};\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it){\n\t  return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.14 / 15.2.3.14 Object.keys(O)\n\tvar $keys       = __webpack_require__(95)\n\t  , enumBugKeys = __webpack_require__(39);\n\t\n\tmodule.exports = Object.keys || function keys(O){\n\t  return $keys(O, enumBugKeys);\n\t};\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// to indexed object, toObject with fallback for non-array-like ES3 strings\n\tvar IObject = __webpack_require__(40)\n\t  , defined = __webpack_require__(24);\n\tmodule.exports = function(it){\n\t  return IObject(defined(it));\n\t};\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.13 ToObject(argument)\n\tvar defined = __webpack_require__(24);\n\tmodule.exports = function(it){\n\t  return Object(defined(it));\n\t};\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.tether = exports.removeChildElements = exports.moveElements = exports.isRectInsideWindowViewport = exports.isFocusable = exports.getScrollParents = exports.getParentElements = exports.getWindowViewport = undefined;\n\t\n\tvar _isNan = __webpack_require__(62);\n\t\n\tvar _isNan2 = _interopRequireDefault(_isNan);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * Remove child element(s)\n\t * element.innerHTNL = '' has a performance penality!\n\t * @see http://jsperf.com/empty-an-element/16\n\t * @see http://jsperf.com/force-reflow\n\t * @param element\n\t * @param forceReflow\n\t */\n\tvar removeChildElements = function removeChildElements(element) {\n\t  var forceReflow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t\n\t\n\t  // See: http://jsperf.com/empty-an-element/16\n\t  while (element.lastChild) {\n\t    element.removeChild(element.lastChild);\n\t  }\n\t  if (forceReflow) {\n\t    // See: http://jsperf.com/force-reflow\n\t    var d = element.style.display;\n\t\n\t    element.style.display = 'none';\n\t    element.style.display = d;\n\t  }\n\t};\n\t\n\t/**\n\t * Moves child elements from a DOM node to another dom node.\n\t * @param source {HTMLElement}\n\t * @param target {HTMLElement} If the target parameter is ommited, a document fragment is created\n\t * @return {HTMLElement} The target node\n\t *\n\t * @example\n\t * // Moves child elements from a DOM node to another dom node.\n\t * moveElements(source, destination);\n\t *\n\t * @example\n\t * // If the second parameter is ommited, a document fragment is created:\n\t * let fragment = moveElements(source);\n\t *\n\t * @See: https://github.com/webmodules/dom-move\n\t */\n\tvar moveElements = function moveElements(source, target) {\n\t  if (!target) {\n\t    target = source.ownerDocument.createDocumentFragment();\n\t  }\n\t  while (source.firstChild) {\n\t    target.appendChild(source.firstChild);\n\t  }\n\t  return target;\n\t};\n\t\n\t/**\n\t * Get the browser viewport dimensions\n\t * @see http://stackoverflow.com/questions/1248081/get-the-browser-viewport-dimensions-with-javascript\n\t * @return {{windowWidth: number, windowHeight: number}}\n\t */\n\tvar getWindowViewport = function getWindowViewport() {\n\t  return {\n\t    viewportWidth: Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t    viewportHeight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)\n\t  };\n\t};\n\t\n\t/**\n\t * Check whether an element is in the window viewport\n\t * @see http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport/\n\t * @param top\n\t * @param left\n\t * @param bottom\n\t * @param right\n\t * @return {boolean} true if rectangle is inside window viewport, otherwise false\n\t */\n\tvar isRectInsideWindowViewport = function isRectInsideWindowViewport(_ref) {\n\t  var top = _ref.top,\n\t      left = _ref.left,\n\t      bottom = _ref.bottom,\n\t      right = _ref.right;\n\t\n\t  var _getWindowViewport = getWindowViewport(),\n\t      viewportWidth = _getWindowViewport.viewportWidth,\n\t      viewportHeight = _getWindowViewport.viewportHeight;\n\t\n\t  return top >= 0 && left >= 0 && bottom <= viewportHeight && right <= viewportWidth;\n\t};\n\t\n\t/**\n\t * Get a list of parent elements that can possibly scroll\n\t * @param el the element to get parents for\n\t * @returns {Array}\n\t */\n\tvar getScrollParents = function getScrollParents(el) {\n\t  var elements = [];\n\t\n\t  /*\n\t  for (el = el.parentNode; el; el = el.parentNode) {\n\t    const cs = window.getComputedStyle(el);\n\t    if(!(cs.overflowY === 'hidden' && cs.overflowX === 'hidden')) {\n\t      elements.unshift(el);\n\t    }\n\t    if(el === document.body) {\n\t      break;\n\t    }\n\t  }\n\t  */\n\t\n\t  var element = el.parentNode;\n\t  while (element) {\n\t    var cs = window.getComputedStyle(element);\n\t    if (!(cs.overflowY === 'hidden' && cs.overflowX === 'hidden')) {\n\t      elements.unshift(element);\n\t    }\n\t    if (element === document.body) {\n\t      break;\n\t    }\n\t    element = element.parentNode;\n\t  }\n\t\n\t  return elements;\n\t};\n\t\n\t/**\n\t * Get a list of parent elements, from a given element to a given element\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @return {Array<HTMLElement>} the parent elements, not including from and to\n\t */\n\tvar getParentElements = function getParentElements(from, to) {\n\t  var result = [];\n\t  var element = from.parentNode;\n\t  while (element) {\n\t    if (element === to) {\n\t      break;\n\t    }\n\t    result.unshift(element);\n\t    element = element.parentNode;\n\t  }\n\t  return result;\n\t};\n\t\n\t/**\n\t * Position element next to button\n\t *\n\t * Positioning strategy\n\t *  1. element.height > viewport.height\n\t *     let element.height = viewport.heigt\n\t *     let element.overflow-y = auto\n\t *  2. element.width > viewport.width\n\t *     let element.width = viewport.width\n\t *  3. position element below button, align left edge of element with button left\n\t *       done if element inside viewport\n\t *  4. position element below button, align right edge of element with button right\n\t *       done if element inside viewport\n\t *  5. positions element above button, aligns left edge of element with button left\n\t *       done if element inside viewport\n\t *  6. position element above the control element, aligned to its right.\n\t *       done if element inside viewport\n\t *  7. position element at button right hand side, aligns element top with button top\n\t *       done if element inside viewport\n\t *  8. position element at button left hand side, aligns element top with button top\n\t *       done if element inside viewport\n\t *  9. position element inside viewport\n\t *     1. position element at viewport bottom\n\t *     2. position element at button right hand side\n\t *        done if element inside viewport\n\t *     3. position element at button left hand side\n\t *       done if element inside viewport\n\t *     4. position element at viewport right\n\t * 10. done\n\t *\n\t */\n\tvar tether = function tether(controlledBy, element) {\n\t  var controlRect = controlledBy.getBoundingClientRect();\n\t\n\t  // 1. will element height fit inside window viewport?\n\t\n\t  var _getWindowViewport2 = getWindowViewport(),\n\t      viewportWidth = _getWindowViewport2.viewportWidth,\n\t      viewportHeight = _getWindowViewport2.viewportHeight;\n\t\n\t  element.style.height = 'auto';\n\t  //element.style.overflowY = 'hidden';\n\t  if (element.offsetHeight > viewportHeight) {\n\t    element.style.height = viewportHeight + 'px';\n\t    element.style.overflowY = 'auto';\n\t  }\n\t\n\t  // 2. will element width fit inside window viewport?\n\t  element.style.width = 'auto';\n\t  if (element.offsetWidth > viewportWidth) {\n\t    element.style.width = viewportWidth + 'px';\n\t  }\n\t\n\t  var elementRect = element.getBoundingClientRect();\n\t\n\t  // element to control distance\n\t  var dy = controlRect.top - elementRect.top;\n\t  var dx = controlRect.left - elementRect.left;\n\t\n\t  // element rect, window coordinates relative to top,left of control\n\t  var top = elementRect.top + dy;\n\t  var left = elementRect.left + dx;\n\t  var bottom = top + elementRect.height;\n\t  var right = left + elementRect.width;\n\t\n\t  // Position relative to control\n\t  var ddy = dy;\n\t  var ddx = dx;\n\t\n\t  if (isRectInsideWindowViewport({\n\t    top: top + controlRect.height,\n\t    left: left,\n\t    bottom: bottom + controlRect.height,\n\t    right: right\n\t  })) {\n\t    // 3 position element below the control element, aligned to its left\n\t    ddy = controlRect.height + dy;\n\t    //console.log('***** 3');\n\t  } else if (isRectInsideWindowViewport({\n\t    top: top + controlRect.height,\n\t    left: left + controlRect.width - elementRect.width,\n\t    bottom: bottom + controlRect.height,\n\t    right: left + controlRect.width\n\t  })) {\n\t    // 4 position element below the control element, aligned to its right\n\t    ddy = controlRect.height + dy;\n\t    ddx = dx + controlRect.width - elementRect.width;\n\t    //console.log('***** 4');\n\t  } else if (isRectInsideWindowViewport({\n\t    top: top - elementRect.height,\n\t    left: left,\n\t    bottom: bottom - elementRect.height,\n\t    right: right\n\t  })) {\n\t    // 5. position element above the control element, aligned to its left.\n\t    ddy = dy - elementRect.height;\n\t    //console.log('***** 5');\n\t  } else if (isRectInsideWindowViewport({\n\t    top: top - elementRect.height,\n\t    left: left + controlRect.width - elementRect.width,\n\t    bottom: bottom - elementRect.height,\n\t    right: left + controlRect.width\n\t  })) {\n\t    // 6. position element above the control element, aligned to its right.\n\t    ddy = dy - elementRect.height;\n\t    ddx = dx + controlRect.width - elementRect.width;\n\t    //console.log('***** 6');\n\t  } else if (isRectInsideWindowViewport({\n\t    top: top,\n\t    left: left + controlRect.width,\n\t    bottom: bottom,\n\t    right: right + controlRect.width\n\t  })) {\n\t    // 7. position element at button right hand side\n\t    ddx = controlRect.width + dx;\n\t    //console.log('***** 7');\n\t  } else if (isRectInsideWindowViewport({\n\t    top: top,\n\t    left: left - controlRect.width,\n\t    bottom: bottom,\n\t    right: right - controlRect.width\n\t  })) {\n\t    // 8. position element at button left hand side\n\t    ddx = dx - elementRect.width;\n\t    //console.log('***** 8');\n\t  } else {\n\t    // 9. position element inside viewport, near controlrect if possible\n\t    //console.log('***** 9');\n\t\n\t    // 9.1 position element near controlrect bottom\n\t    ddy = dy - bottom + viewportHeight;\n\t    if (top + controlRect.height >= 0 && bottom + controlRect.height <= viewportHeight) {\n\t      ddy = controlRect.height + dy;\n\t    } else if (top - elementRect.height >= 0 && bottom - elementRect.height <= viewportHeight) {\n\t      ddy = dy - elementRect.height;\n\t    }\n\t\n\t    if (left + elementRect.width + controlRect.width <= viewportWidth) {\n\t      // 9.2 Position element at button right hand side\n\t      ddx = controlRect.width + dx;\n\t      //console.log('***** 9.2');\n\t    } else if (left - elementRect.width >= 0) {\n\t      // 9.3 Position element at button left hand side\n\t      ddx = dx - elementRect.width;\n\t      //console.log('***** 9.3');\n\t    } else {\n\t      // 9.4 position element at (near) viewport right\n\t      var r = left + elementRect.width - viewportWidth;\n\t      ddx = dx - r;\n\t      //console.log('***** 9.4');\n\t    }\n\t  }\n\t\n\t  // 10. done\n\t  element.style.top = element.offsetTop + ddy + 'px';\n\t  element.style.left = element.offsetLeft + ddx + 'px';\n\t  //console.log('***** 10. done');\n\t};\n\t\n\t/**\n\t * Check if the given element can receive focus\n\t * @param {HTMLElement} element the element to check\n\t * @return {boolean} true if the element is focusable, otherwise false\n\t */\n\tvar isFocusable = function isFocusable(element) {\n\t  // https://github.com/stephenmathieson/is-focusable/blob/master/index.js\n\t  // http://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus\n\t\n\t  if (element.hasAttribute('tabindex')) {\n\t    var tabindex = element.getAttribute('tabindex');\n\t    if (!(0, _isNan2.default)(tabindex)) {\n\t      return parseInt(tabindex) > -1;\n\t    }\n\t  }\n\t\n\t  if (element.hasAttribute('contenteditable') && element.getAttribute('contenteditable') !== 'false') {\n\t    // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-contenteditable\n\t    return true;\n\t  }\n\t\n\t  // natively focusable, but only when enabled\n\t  var selector = /input|select|textarea|button|details/i;\n\t  var name = element.nodeName;\n\t  if (selector.test(name)) {\n\t    return element.type.toLowerCase() !== 'hidden' && !element.disabled;\n\t  }\n\t\n\t  // anchors and area must have an href\n\t  if (name === 'A' || name === 'AREA') {\n\t    return !!element.href;\n\t  }\n\t\n\t  if (name === 'IFRAME') {\n\t    // Check visible iframe\n\t    var cs = window.getComputedStyle(element);\n\t    return cs.getPropertyValue('display').toLowerCase() !== 'none';\n\t  }\n\t\n\t  return false;\n\t};\n\t\n\t/**\n\t * Get a list of offset parents for given element\n\t * @see https://www.benpickles.com/articles/51-finding-a-dom-nodes-common-ancestor-using-javascript\n\t * @param el the element\n\t * @return {Array} a list of offset parents\n\t */\n\t/*\n\tconst offsetParents = (el) => {\n\t  const elements = [];\n\t  for (; el; el = el.offsetParent) {\n\t    elements.unshift(el);\n\t  }\n\t  if(!elements.find(e => e === document.body)) {\n\t    elements.unshift(document.body);\n\t  }\n\t  return elements;\n\t};\n\t*/\n\t\n\t/**\n\t * Finds the common offset ancestor of two DOM nodes\n\t * @see https://www.benpickles.com/articles/51-finding-a-dom-nodes-common-ancestor-using-javascript\n\t * @see https://gist.github.com/benpickles/4059636\n\t * @param a\n\t * @param b\n\t * @return {Element} The common offset ancestor of a and b\n\t */\n\t/*\n\tconst commonOffsetAncestor = (a, b) => {\n\t  const parentsA = offsetParents(a);\n\t  const parentsB = offsetParents(b);\n\t\n\t  for (let i = 0; i < parentsA.length; i++) {\n\t    if (parentsA[i] !== parentsB[i]) return parentsA[i-1];\n\t  }\n\t};\n\t*/\n\t\n\t/**\n\t * Calculate position relative to a target element\n\t * @see http://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n\t * @param target\n\t * @param el\n\t * @return {{top: number, left: number}}\n\t */\n\t/*\n\tconst calcPositionRelativeToTarget = (target, el) => {\n\t  let top = 0;\n\t  let left = 0;\n\t\n\t  while(el) {\n\t    top += (el.offsetTop - el.scrollTop + el.clientTop) || 0;\n\t    left += (el.offsetLeft - el.scrollLeft + el.clientLeft) || 0;\n\t    el = el.offsetParent;\n\t\n\t    if(el === target) {\n\t      break;\n\t    }\n\t  }\n\t  return { top: top, left: left };\n\t};\n\t*/\n\t\n\texports.getWindowViewport = getWindowViewport;\n\texports.getParentElements = getParentElements;\n\texports.getScrollParents = getScrollParents;\n\texports.isFocusable = isFocusable;\n\texports.isRectInsideWindowViewport = isRectInsideWindowViewport;\n\texports.moveElements = moveElements;\n\texports.removeChildElements = removeChildElements;\n\texports.tether = tether;\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\texports.default = function (instance, Constructor) {\n\t  if (!(instance instanceof Constructor)) {\n\t    throw new TypeError(\"Cannot call a class as a function\");\n\t  }\n\t};\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _defineProperty = __webpack_require__(63);\n\t\n\tvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = function () {\n\t  function defineProperties(target, props) {\n\t    for (var i = 0; i < props.length; i++) {\n\t      var descriptor = props[i];\n\t      descriptor.enumerable = descriptor.enumerable || false;\n\t      descriptor.configurable = true;\n\t      if (\"value\" in descriptor) descriptor.writable = true;\n\t      (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n\t    }\n\t  }\n\t\n\t  return function (Constructor, protoProps, staticProps) {\n\t    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n\t    if (staticProps) defineProperties(Constructor, staticProps);\n\t    return Constructor;\n\t  };\n\t}();\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\t// 7.2.1 RequireObjectCoercible(argument)\n\tmodule.exports = function(it){\n\t  if(it == undefined)throw TypeError(\"Can't call method on  \" + it);\n\t  return it;\n\t};\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(bitmap, value){\n\t  return {\n\t    enumerable  : !(bitmap & 1),\n\t    configurable: !(bitmap & 2),\n\t    writable    : !(bitmap & 4),\n\t    value       : value\n\t  };\n\t};\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar shared = __webpack_require__(44)('keys')\n\t  , uid    = __webpack_require__(46);\n\tmodule.exports = function(key){\n\t  return shared[key] || (shared[key] = uid(key));\n\t};\n\n/***/ },\n/* 27 */\n/***/ function(module, exports) {\n\n\t// 7.1.4 ToInteger\n\tvar ceil  = Math.ceil\n\t  , floor = Math.floor;\n\tmodule.exports = function(it){\n\t  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n\t};\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $at  = __webpack_require__(99)(true);\n\t\n\t// 21.1.3.27 String.prototype[@@iterator]()\n\t__webpack_require__(41)(String, 'String', function(iterated){\n\t  this._t = String(iterated); // target\n\t  this._i = 0;                // next index\n\t// 21.1.5.2.1 %StringIteratorPrototype%.next()\n\t}, function(){\n\t  var O     = this._t\n\t    , index = this._i\n\t    , point;\n\t  if(index >= O.length)return {value: undefined, done: true};\n\t  point = $at(O, index);\n\t  this._i += point.length;\n\t  return {value: point, done: false};\n\t});\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// See: http://robertpenner.com/easing/\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\tvar easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n\t  t /= d / 2;\n\t  if (t < 1) return c / 2 * t * t + b;\n\t  t--;\n\t  return -c / 2 * (t * (t - 2) - 1) + b;\n\t};\n\t\n\tvar inOutQuintic = function inOutQuintic(t, b, c, d) {\n\t  var ts = (t /= d) * t;\n\t  var tc = ts * t;\n\t  return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc);\n\t};\n\t\n\texports.easeInOutQuad = easeInOutQuad;\n\texports.inOutQuintic = inOutQuintic;\n\n/***/ },\n/* 30 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\tvar MIN_INERVAL = 1000 / 60;\n\t\n\t/**\n\t * Trigger a callback at a given interval\n\t * @param interval defaults to 1000/60 ms\n\t * @return {function()} reference to start, stop, immediate and started\n\t */\n\t\n\tvar intervalFunction = function intervalFunction() {\n\t  var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : MIN_INERVAL;\n\t\n\t\n\t  var lapse = interval < MIN_INERVAL ? MIN_INERVAL : interval;\n\t  var cb = undefined;\n\t  var next = null;\n\t  var timeElapsed = 0;\n\t\n\t  var execute = function execute() {\n\t    var f = cb(timeElapsed);\n\t    if (!f) {\n\t      cancel();\n\t    }\n\t  };\n\t\n\t  var cancel = function cancel() {\n\t    if (next) {\n\t      window.cancelAnimationFrame(next);\n\t    }\n\t    next = null;\n\t    timeElapsed = 0;\n\t  };\n\t\n\t  var _start = function _start() {\n\t    var timeStart = Date.now();\n\t\n\t    var loop = function loop(now) {\n\t      if (next) {\n\t        next = window.requestAnimationFrame(function () {\n\t          return loop(Date.now());\n\t        });\n\t\n\t        timeElapsed += now - timeStart;\n\t\n\t        if (timeElapsed >= lapse) {\n\t          execute();\n\t          if ((timeElapsed -= lapse) > lapse) {\n\t            // time elapsed - interval_ > interval_ , indicates inactivity\n\t            // Could be due to browser minimized, tab changed, screen saver started, computer sleep, and so on\n\t            timeElapsed = 0;\n\t          }\n\t        }\n\t        timeStart = now;\n\t      }\n\t    };\n\t\n\t    next = 1; // a truthy value for first loop\n\t    loop(timeStart);\n\t  };\n\t\n\t  return {\n\t    get started() {\n\t      return next != null;\n\t    },\n\t    get interval() {\n\t      return lapse;\n\t    },\n\t    set interval(value) {\n\t      lapse = value < MIN_INERVAL ? MIN_INERVAL : value;\n\t    },\n\t    start: function start(callback) {\n\t      if (typeof callback !== 'function') {\n\t        throw new TypeError('callback parameter must be a function');\n\t      }\n\t      cb = callback;\n\t      _start();\n\t    },\n\t    immediate: function immediate() {\n\t      if (!cb) {\n\t        throw new ReferenceError('callback parameter is not defined. Call start before immediate.');\n\t      }\n\t      execute();\n\t    },\n\t\n\t    stop: function stop() {\n\t      return cancel();\n\t    }\n\t  };\n\t};\n\t\n\texports.default = intervalFunction;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(69), __esModule: true };\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(71), __esModule: true };\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(73), __esModule: true };\n\n/***/ },\n/* 34 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(it){\n\t  if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n\t  return it;\n\t};\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// getting tag from 19.1.3.6 Object.prototype.toString()\n\tvar cof = __webpack_require__(36)\n\t  , TAG = __webpack_require__(4)('toStringTag')\n\t  // ES3 wrong here\n\t  , ARG = cof(function(){ return arguments; }()) == 'Arguments';\n\t\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet = function(it, key){\n\t  try {\n\t    return it[key];\n\t  } catch(e){ /* empty */ }\n\t};\n\t\n\tmodule.exports = function(it){\n\t  var O, T, B;\n\t  return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t    // @@toStringTag case\n\t    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n\t    // builtinTag case\n\t    : ARG ? cof(O)\n\t    // ES3 arguments fallback\n\t    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n\t};\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\tvar toString = {}.toString;\n\t\n\tmodule.exports = function(it){\n\t  return toString.call(it).slice(8, -1);\n\t};\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// optional / simple context binding\n\tvar aFunction = __webpack_require__(34);\n\tmodule.exports = function(fn, that, length){\n\t  aFunction(fn);\n\t  if(that === undefined)return fn;\n\t  switch(length){\n\t    case 1: return function(a){\n\t      return fn.call(that, a);\n\t    };\n\t    case 2: return function(a, b){\n\t      return fn.call(that, a, b);\n\t    };\n\t    case 3: return function(a, b, c){\n\t      return fn.call(that, a, b, c);\n\t    };\n\t  }\n\t  return function(/* ...args */){\n\t    return fn.apply(that, arguments);\n\t  };\n\t};\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isObject = __webpack_require__(17)\n\t  , document = __webpack_require__(5).document\n\t  // in old IE typeof document.createElement is 'object'\n\t  , is = isObject(document) && isObject(document.createElement);\n\tmodule.exports = function(it){\n\t  return is ? document.createElement(it) : {};\n\t};\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\t// IE 8- don't enum bug keys\n\tmodule.exports = (\n\t  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n\t).split(',');\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar cof = __webpack_require__(36);\n\tmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n\t  return cof(it) == 'String' ? it.split('') : Object(it);\n\t};\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar LIBRARY        = __webpack_require__(89)\n\t  , $export        = __webpack_require__(3)\n\t  , redefine       = __webpack_require__(98)\n\t  , hide           = __webpack_require__(11)\n\t  , has            = __webpack_require__(16)\n\t  , Iterators      = __webpack_require__(7)\n\t  , $iterCreate    = __webpack_require__(86)\n\t  , setToStringTag = __webpack_require__(43)\n\t  , getPrototypeOf = __webpack_require__(94)\n\t  , ITERATOR       = __webpack_require__(4)('iterator')\n\t  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n\t  , FF_ITERATOR    = '@@iterator'\n\t  , KEYS           = 'keys'\n\t  , VALUES         = 'values';\n\t\n\tvar returnThis = function(){ return this; };\n\t\n\tmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n\t  $iterCreate(Constructor, NAME, next);\n\t  var getMethod = function(kind){\n\t    if(!BUGGY && kind in proto)return proto[kind];\n\t    switch(kind){\n\t      case KEYS: return function keys(){ return new Constructor(this, kind); };\n\t      case VALUES: return function values(){ return new Constructor(this, kind); };\n\t    } return function entries(){ return new Constructor(this, kind); };\n\t  };\n\t  var TAG        = NAME + ' Iterator'\n\t    , DEF_VALUES = DEFAULT == VALUES\n\t    , VALUES_BUG = false\n\t    , proto      = Base.prototype\n\t    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n\t    , $default   = $native || getMethod(DEFAULT)\n\t    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined\n\t    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native\n\t    , methods, key, IteratorPrototype;\n\t  // Fix native\n\t  if($anyNative){\n\t    IteratorPrototype = getPrototypeOf($anyNative.call(new Base));\n\t    if(IteratorPrototype !== Object.prototype){\n\t      // Set @@toStringTag to native iterators\n\t      setToStringTag(IteratorPrototype, TAG, true);\n\t      // fix for some old engines\n\t      if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n\t    }\n\t  }\n\t  // fix Array#{values, @@iterator}.name in V8 / FF\n\t  if(DEF_VALUES && $native && $native.name !== VALUES){\n\t    VALUES_BUG = true;\n\t    $default = function values(){ return $native.call(this); };\n\t  }\n\t  // Define iterator\n\t  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n\t    hide(proto, ITERATOR, $default);\n\t  }\n\t  // Plug for library\n\t  Iterators[NAME] = $default;\n\t  Iterators[TAG]  = returnThis;\n\t  if(DEFAULT){\n\t    methods = {\n\t      values:  DEF_VALUES ? $default : getMethod(VALUES),\n\t      keys:    IS_SET     ? $default : getMethod(KEYS),\n\t      entries: $entries\n\t    };\n\t    if(FORCED)for(key in methods){\n\t      if(!(key in proto))redefine(proto, key, methods[key]);\n\t    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n\t  }\n\t  return methods;\n\t};\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\texports.f = {}.propertyIsEnumerable;\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar def = __webpack_require__(12).f\n\t  , has = __webpack_require__(16)\n\t  , TAG = __webpack_require__(4)('toStringTag');\n\t\n\tmodule.exports = function(it, tag, stat){\n\t  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n\t};\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(5)\n\t  , SHARED = '__core-js_shared__'\n\t  , store  = global[SHARED] || (global[SHARED] = {});\n\tmodule.exports = function(key){\n\t  return store[key] || (store[key] = {});\n\t};\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.15 ToLength\n\tvar toInteger = __webpack_require__(27)\n\t  , min       = Math.min;\n\tmodule.exports = function(it){\n\t  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n\t};\n\n/***/ },\n/* 46 */\n/***/ function(module, exports) {\n\n\tvar id = 0\n\t  , px = Math.random();\n\tmodule.exports = function(key){\n\t  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n\t};\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar classof   = __webpack_require__(35)\n\t  , ITERATOR  = __webpack_require__(4)('iterator')\n\t  , Iterators = __webpack_require__(7);\n\tmodule.exports = __webpack_require__(1).getIteratorMethod = function(it){\n\t  if(it != undefined)return it[ITERATOR]\n\t    || it['@@iterator']\n\t    || Iterators[classof(it)];\n\t};\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(105);\n\tvar global        = __webpack_require__(5)\n\t  , hide          = __webpack_require__(11)\n\t  , Iterators     = __webpack_require__(7)\n\t  , TO_STRING_TAG = __webpack_require__(4)('toStringTag');\n\t\n\tfor(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){\n\t  var NAME       = collections[i]\n\t    , Collection = global[NAME]\n\t    , proto      = Collection && Collection.prototype;\n\t  if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);\n\t  Iterators[NAME] = Iterators.Array;\n\t}\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _toConsumableArray2 = __webpack_require__(8);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  var ACCORDION = 'mdlext-accordion';\n\t  var ACCORDION_VERTICAL = 'mdlext-accordion--vertical';\n\t  var ACCORDION_HORIZONTAL = 'mdlext-accordion--horizontal';\n\t  var PANEL = 'mdlext-accordion__panel';\n\t  var PANEL_ROLE = 'presentation';\n\t  var TAB = 'mdlext-accordion__tab';\n\t  var TAB_CAPTION = 'mdlext-accordion__tab__caption';\n\t  var TAB_ROLE = 'tab';\n\t  var TABPANEL = 'mdlext-accordion__tabpanel';\n\t  var TABPANEL_ROLE = 'tabpanel';\n\t  var RIPPLE_EFFECT = 'mdlext-js-ripple-effect';\n\t  var RIPPLE = 'mdlext-accordion__tab--ripple';\n\t  var ANIMATION_EFFECT = 'mdlext-js-animation-effect';\n\t  var ANIMATION = 'mdlext-accordion__tabpanel--animation';\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtAccordion = function MaterialExtAccordion(element) {\n\t\n\t    // Stores the Accordion HTML element.\n\t    this.element_ = element;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtAccordion'] = MaterialExtAccordion;\n\t\n\t  // Helpers\n\t  var accordionPanelElements = function accordionPanelElements(element) {\n\t    if (!element) {\n\t      return {\n\t        panel: null,\n\t        tab: null,\n\t        tabpanel: null\n\t      };\n\t    } else if (element.classList.contains(PANEL)) {\n\t      return {\n\t        panel: element,\n\t        tab: element.querySelector('.' + TAB),\n\t        tabpanel: element.querySelector('.' + TABPANEL)\n\t      };\n\t    } else {\n\t      return {\n\t        panel: element.parentNode,\n\t        tab: element.parentNode.querySelector('.' + TAB),\n\t        tabpanel: element.parentNode.querySelector('.' + TABPANEL)\n\t      };\n\t    }\n\t  };\n\t\n\t  // Private methods.\n\t\n\t  /**\n\t   * Handles custom command event, 'open', 'close', 'toggle' or upgrade\n\t   * @param event. A custom event\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.commandHandler_ = function (event) {\n\t    event.preventDefault();\n\t    event.stopPropagation();\n\t\n\t    if (event && event.detail) {\n\t      this.command(event.detail);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Dispatch toggle event\n\t   * @param {string} state\n\t   * @param {Element} tab\n\t   * @param {Element} tabpanel\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.dispatchToggleEvent_ = function (state, tab, tabpanel) {\n\t    var ce = new CustomEvent('toggle', {\n\t      bubbles: true,\n\t      cancelable: true,\n\t      detail: { state: state, tab: tab, tabpanel: tabpanel }\n\t    });\n\t    this.element_.dispatchEvent(ce);\n\t  };\n\t\n\t  /**\n\t   * Open tab\n\t   * @param {Element} panel\n\t   * @param {Element} tab\n\t   * @param {Element} tabpanel\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.openTab_ = function (panel, tab, tabpanel) {\n\t    panel.classList.add(_constants.IS_EXPANDED);\n\t    tab.setAttribute(_constants.ARIA_EXPANDED, 'true');\n\t    tabpanel.removeAttribute('hidden');\n\t    tabpanel.setAttribute(_constants.ARIA_HIDDEN, 'false');\n\t    this.dispatchToggleEvent_('open', tab, tabpanel);\n\t  };\n\t\n\t  /**\n\t   * Close tab\n\t   * @param {Element} panel\n\t   * @param {Element} tab\n\t   * @param {Element} tabpanel\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.closeTab_ = function (panel, tab, tabpanel) {\n\t    panel.classList.remove(_constants.IS_EXPANDED);\n\t    tab.setAttribute(_constants.ARIA_EXPANDED, 'false');\n\t    tabpanel.setAttribute('hidden', '');\n\t    tabpanel.setAttribute(_constants.ARIA_HIDDEN, 'true');\n\t    this.dispatchToggleEvent_('close', tab, tabpanel);\n\t  };\n\t\n\t  /**\n\t   * Toggle tab\n\t   * @param {Element} panel\n\t   * @param {Element} tab\n\t   * @param {Element} tabpanel\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.toggleTab_ = function (panel, tab, tabpanel) {\n\t    if (!(this.element_.hasAttribute('disabled') || tab.hasAttribute('disabled'))) {\n\t      if (tab.getAttribute(_constants.ARIA_EXPANDED).toLowerCase() === 'true') {\n\t        this.closeTab_(panel, tab, tabpanel);\n\t      } else {\n\t        if (this.element_.getAttribute(_constants.ARIA_MULTISELECTABLE).toLowerCase() !== 'true') {\n\t          this.closeTabs_();\n\t        }\n\t        this.openTab_(panel, tab, tabpanel);\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Open tabs\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.openTabs_ = function () {\n\t    var _this = this;\n\t\n\t    if (this.element_.getAttribute(_constants.ARIA_MULTISELECTABLE).toLowerCase() === 'true') {\n\t      [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + ACCORDION + ' > .' + PANEL))).filter(function (panel) {\n\t        return !panel.classList.contains(_constants.IS_EXPANDED);\n\t      }).forEach(function (closedItem) {\n\t        var tab = closedItem.querySelector('.' + TAB);\n\t        if (!tab.hasAttribute('disabled')) {\n\t          _this.openTab_(closedItem, tab, closedItem.querySelector('.' + TABPANEL));\n\t        }\n\t      });\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Close tabs\n\t   * @private\n\t   */\n\t  MaterialExtAccordion.prototype.closeTabs_ = function () {\n\t    var _this2 = this;\n\t\n\t    [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + ACCORDION + ' > .' + PANEL + '.' + _constants.IS_EXPANDED))).forEach(function (panel) {\n\t      var tab = panel.querySelector('.' + TAB);\n\t      if (!tab.hasAttribute('disabled')) {\n\t        _this2.closeTab_(panel, tab, panel.querySelector('.' + TABPANEL));\n\t      }\n\t    });\n\t  };\n\t\n\t  // Public methods.\n\t\n\t  /**\n\t   * Upgrade an individual accordion tab\n\t   * @public\n\t   * @param {Element} tabElement The HTML element for the accordion panel.\n\t   */\n\t  MaterialExtAccordion.prototype.upgradeTab = function (tabElement) {\n\t    var _this3 = this;\n\t\n\t    var _accordionPanelElemen = accordionPanelElements(tabElement),\n\t        panel = _accordionPanelElemen.panel,\n\t        tab = _accordionPanelElemen.tab,\n\t        tabpanel = _accordionPanelElemen.tabpanel;\n\t\n\t    var disableTab = function disableTab() {\n\t      panel.classList.remove(_constants.IS_EXPANDED);\n\t      tab.setAttribute('tabindex', '-1');\n\t      tab.setAttribute(_constants.ARIA_EXPANDED, 'false');\n\t      tabpanel.setAttribute('hidden', '');\n\t      tabpanel.setAttribute(_constants.ARIA_HIDDEN, 'true');\n\t    };\n\t\n\t    var enableTab = function enableTab() {\n\t      if (!tab.hasAttribute(_constants.ARIA_EXPANDED)) {\n\t        tab.setAttribute(_constants.ARIA_EXPANDED, 'false');\n\t      }\n\t\n\t      tab.setAttribute('tabindex', '0');\n\t\n\t      if (tab.getAttribute(_constants.ARIA_EXPANDED).toLowerCase() === 'true') {\n\t        panel.classList.add(_constants.IS_EXPANDED);\n\t        tabpanel.removeAttribute('hidden');\n\t        tabpanel.setAttribute(_constants.ARIA_HIDDEN, 'false');\n\t      } else {\n\t        panel.classList.remove(_constants.IS_EXPANDED);\n\t        tabpanel.setAttribute('hidden', '');\n\t        tabpanel.setAttribute(_constants.ARIA_HIDDEN, 'true');\n\t      }\n\t    };\n\t\n\t    // In horizontal layout, caption must have a max-width defined to prevent pushing elements to the right of the caption out of view.\n\t    // In JsDom, offsetWidth and offsetHeight properties do not work, so this function is not testable.\n\t    /* istanbul ignore next */\n\t    var calcMaxTabCaptionWidth = function calcMaxTabCaptionWidth() {\n\t\n\t      var tabCaption = tab.querySelector('.' + TAB_CAPTION);\n\t      if (tabCaption !== null) {\n\t        var w = [].concat((0, _toConsumableArray3.default)(tab.children)).filter(function (el) {\n\t          return el.classList && !el.classList.contains(TAB_CAPTION);\n\t        }).reduce(function (v, el) {\n\t          return v + el.offsetWidth;\n\t        }, 0);\n\t\n\t        var maxWidth = tab.clientHeight - w;\n\t        if (maxWidth > 0) {\n\t          tabCaption.style['max-width'] = maxWidth + 'px';\n\t        }\n\t      }\n\t    };\n\t\n\t    var selectTab = function selectTab() {\n\t      if (!tab.hasAttribute(_constants.ARIA_SELECTED)) {\n\t        [].concat((0, _toConsumableArray3.default)(_this3.element_.querySelectorAll('.' + TAB + '[aria-selected=\"true\"]'))).forEach(function (selectedTab) {\n\t          return selectedTab.removeAttribute(_constants.ARIA_SELECTED);\n\t        });\n\t        tab.setAttribute(_constants.ARIA_SELECTED, 'true');\n\t      }\n\t    };\n\t\n\t    var tabClickHandler = function tabClickHandler() {\n\t      _this3.toggleTab_(panel, tab, tabpanel);\n\t      selectTab();\n\t    };\n\t\n\t    var tabFocusHandler = function tabFocusHandler() {\n\t      selectTab();\n\t    };\n\t\n\t    var tabpanelClickHandler = function tabpanelClickHandler() {\n\t      selectTab();\n\t    };\n\t\n\t    var tabpanelFocusHandler = function tabpanelFocusHandler() {\n\t      selectTab();\n\t    };\n\t\n\t    var tabKeydownHandler = function tabKeydownHandler(e) {\n\t\n\t      if (_this3.element_.hasAttribute('disabled')) {\n\t        return;\n\t      }\n\t\n\t      if (e.keyCode === _constants.VK_END || e.keyCode === _constants.VK_HOME || e.keyCode === _constants.VK_ARROW_UP || e.keyCode === _constants.VK_ARROW_LEFT || e.keyCode === _constants.VK_ARROW_DOWN || e.keyCode === _constants.VK_ARROW_RIGHT) {\n\t\n\t        var nextTab = null;\n\t        var keyCode = e.keyCode;\n\t\n\t        if (keyCode === _constants.VK_HOME) {\n\t          nextTab = _this3.element_.querySelector('.' + PANEL + ':first-child > .' + TAB);\n\t          if (nextTab && nextTab.hasAttribute('disabled')) {\n\t            nextTab = null;\n\t            keyCode = _constants.VK_ARROW_DOWN;\n\t          }\n\t        } else if (keyCode === _constants.VK_END) {\n\t          nextTab = _this3.element_.querySelector('.' + PANEL + ':last-child > .' + TAB);\n\t          if (nextTab && nextTab.hasAttribute('disabled')) {\n\t            nextTab = null;\n\t            keyCode = _constants.VK_ARROW_UP;\n\t          }\n\t        }\n\t\n\t        if (!nextTab) {\n\t          var nextPanel = panel;\n\t\n\t          do {\n\t            if (keyCode === _constants.VK_ARROW_UP || keyCode === _constants.VK_ARROW_LEFT) {\n\t              nextPanel = nextPanel.previousElementSibling;\n\t              if (!nextPanel) {\n\t                nextPanel = _this3.element_.querySelector('.' + PANEL + ':last-child');\n\t              }\n\t              if (nextPanel) {\n\t                nextTab = nextPanel.querySelector('.' + PANEL + ' > .' + TAB);\n\t              }\n\t            } else if (keyCode === _constants.VK_ARROW_DOWN || keyCode === _constants.VK_ARROW_RIGHT) {\n\t              nextPanel = nextPanel.nextElementSibling;\n\t              if (!nextPanel) {\n\t                nextPanel = _this3.element_.querySelector('.' + PANEL + ':first-child');\n\t              }\n\t              if (nextPanel) {\n\t                nextTab = nextPanel.querySelector('.' + PANEL + ' > .' + TAB);\n\t              }\n\t            }\n\t\n\t            if (nextTab && nextTab.hasAttribute('disabled')) {\n\t              nextTab = null;\n\t            } else {\n\t              break;\n\t            }\n\t          } while (nextPanel !== panel);\n\t        }\n\t\n\t        if (nextTab) {\n\t          e.preventDefault();\n\t          e.stopPropagation();\n\t          nextTab.focus();\n\t\n\t          // Workaround for JSDom testing:\n\t          // In JsDom 'element.focus()' does not trigger any focus event\n\t          if (!nextTab.hasAttribute(_constants.ARIA_SELECTED)) {\n\t\n\t            [].concat((0, _toConsumableArray3.default)(_this3.element_.querySelectorAll('.' + TAB + '[aria-selected=\"true\"]'))).forEach(function (selectedTab) {\n\t              return selectedTab.removeAttribute(_constants.ARIA_SELECTED);\n\t            });\n\t\n\t            nextTab.setAttribute(_constants.ARIA_SELECTED, 'true');\n\t          }\n\t        }\n\t      } else if (e.keyCode === _constants.VK_ENTER || e.keyCode === _constants.VK_SPACE) {\n\t        e.preventDefault();\n\t        e.stopPropagation();\n\t        _this3.toggleTab_(panel, tab, tabpanel);\n\t      }\n\t    };\n\t\n\t    if (tab === null) {\n\t      throw new Error('There must be a tab element for each accordion panel.');\n\t    }\n\t\n\t    if (tabpanel === null) {\n\t      throw new Error('There must be a tabpanel element for each accordion panel.');\n\t    }\n\t\n\t    panel.setAttribute('role', PANEL_ROLE);\n\t    tab.setAttribute('role', TAB_ROLE);\n\t    tabpanel.setAttribute('role', TABPANEL_ROLE);\n\t\n\t    if (tab.hasAttribute('disabled')) {\n\t      disableTab();\n\t    } else {\n\t      enableTab();\n\t    }\n\t\n\t    if (this.element_.classList.contains(ACCORDION_HORIZONTAL)) {\n\t      calcMaxTabCaptionWidth();\n\t    }\n\t\n\t    if (this.element_.classList.contains(RIPPLE_EFFECT)) {\n\t      tab.classList.add(RIPPLE);\n\t    }\n\t\n\t    if (this.element_.classList.contains(ANIMATION_EFFECT)) {\n\t      tabpanel.classList.add(ANIMATION);\n\t    }\n\t\n\t    // Remove listeners, just in case ...\n\t    tab.removeEventListener('click', tabClickHandler);\n\t    tab.removeEventListener('focus', tabFocusHandler);\n\t    tab.removeEventListener('keydown', tabKeydownHandler);\n\t    tabpanel.removeEventListener('click', tabpanelClickHandler);\n\t    tabpanel.removeEventListener('focus', tabpanelFocusHandler);\n\t\n\t    tab.addEventListener('click', tabClickHandler);\n\t    tab.addEventListener('focus', tabFocusHandler);\n\t    tab.addEventListener('keydown', tabKeydownHandler);\n\t    tabpanel.addEventListener('click', tabpanelClickHandler, true);\n\t    tabpanel.addEventListener('focus', tabpanelFocusHandler, true);\n\t  };\n\t  MaterialExtAccordion.prototype['upgradeTab'] = MaterialExtAccordion.prototype.upgradeTab;\n\t\n\t  /**\n\t   * Execute command\n\t   * @param detail\n\t   */\n\t  MaterialExtAccordion.prototype.command = function (detail) {\n\t    var _this4 = this;\n\t\n\t    var openTab = function openTab(tabElement) {\n\t\n\t      if (tabElement === undefined) {\n\t        _this4.openTabs_();\n\t      } else if (tabElement !== null) {\n\t        var _accordionPanelElemen2 = accordionPanelElements(tabElement),\n\t            panel = _accordionPanelElemen2.panel,\n\t            tab = _accordionPanelElemen2.tab,\n\t            tabpanel = _accordionPanelElemen2.tabpanel;\n\t\n\t        if (tab.getAttribute(_constants.ARIA_EXPANDED).toLowerCase() !== 'true') {\n\t          _this4.toggleTab_(panel, tab, tabpanel);\n\t        }\n\t      }\n\t    };\n\t\n\t    var closeTab = function closeTab(tabElement) {\n\t      if (tabElement === undefined) {\n\t        _this4.closeTabs_();\n\t      } else if (tabElement !== null) {\n\t        var _accordionPanelElemen3 = accordionPanelElements(tabElement),\n\t            panel = _accordionPanelElemen3.panel,\n\t            tab = _accordionPanelElemen3.tab,\n\t            tabpanel = _accordionPanelElemen3.tabpanel;\n\t\n\t        if (tab.getAttribute(_constants.ARIA_EXPANDED).toLowerCase() === 'true') {\n\t          _this4.toggleTab_(panel, tab, tabpanel);\n\t        }\n\t      }\n\t    };\n\t\n\t    var toggleTab = function toggleTab(tabElement) {\n\t      if (tabElement) {\n\t        var _accordionPanelElemen4 = accordionPanelElements(tabElement),\n\t            panel = _accordionPanelElemen4.panel,\n\t            tab = _accordionPanelElemen4.tab,\n\t            tabpanel = _accordionPanelElemen4.tabpanel;\n\t\n\t        _this4.toggleTab_(panel, tab, tabpanel);\n\t      }\n\t    };\n\t\n\t    if (detail && detail.action) {\n\t      var action = detail.action,\n\t          target = detail.target;\n\t\n\t\n\t      switch (action.toLowerCase()) {\n\t        case 'open':\n\t          openTab(target);\n\t          break;\n\t        case 'close':\n\t          closeTab(target);\n\t          break;\n\t        case 'toggle':\n\t          toggleTab(target);\n\t          break;\n\t        case 'upgrade':\n\t          if (target) {\n\t            this.upgradeTab(target);\n\t          }\n\t          break;\n\t        default:\n\t          throw new Error('Unknown action \"' + action + '\". Action must be one of \"open\", \"close\", \"toggle\" or \"upgrade\"');\n\t      }\n\t    }\n\t  };\n\t  MaterialExtAccordion.prototype['command'] = MaterialExtAccordion.prototype.command;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtAccordion.prototype.init = function () {\n\t    var _this5 = this;\n\t\n\t    if (this.element_) {\n\t      // Do the init required for this component to work\n\t      if (!(this.element_.classList.contains(ACCORDION_HORIZONTAL) || this.element_.classList.contains(ACCORDION_VERTICAL))) {\n\t        throw new Error('Accordion must have one of the classes \"' + ACCORDION_HORIZONTAL + '\" or \"' + ACCORDION_VERTICAL + '\"');\n\t      }\n\t\n\t      this.element_.setAttribute('role', 'tablist');\n\t\n\t      if (!this.element_.hasAttribute(_constants.ARIA_MULTISELECTABLE)) {\n\t        this.element_.setAttribute(_constants.ARIA_MULTISELECTABLE, 'false');\n\t      }\n\t\n\t      this.element_.removeEventListener('command', this.commandHandler_);\n\t      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n\t\n\t      [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + ACCORDION + ' > .' + PANEL))).forEach(function (panel) {\n\t        return _this5.upgradeTab(panel);\n\t      });\n\t\n\t      // Set upgraded flag\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t    }\n\t  };\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   *\n\t   * Nothing to downgrade\n\t   *\n\t   MaterialExtAccordion.prototype.mdlDowngrade_ = function() {\n\t     'use strict';\n\t     console.log('***** MaterialExtAccordion.mdlDowngrade');\n\t   };\n\t   */\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtAccordion,\n\t    classAsString: 'MaterialExtAccordion',\n\t    cssClass: 'mdlext-js-accordion',\n\t    widget: true\n\t  });\n\t})(); /**\n\t       * @license\n\t       * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t       *\n\t       * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t       * you may not use this file except in compliance with the License.\n\t       * You may obtain a copy of the License at\n\t       *\n\t       *      http://www.apache.org/licenses/LICENSE-2.0\n\t       *\n\t       * Unless required by applicable law or agreed to in writing, software\n\t       * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t       * See the License for the specific language governing permissions and\n\t       * limitations under the License.\n\t       *\n\t       * This code is built with Google Material Design Lite,\n\t       * which is Licensed under the Apache License, Version 2.0\n\t       */\n\t\n\t/**\n\t * A WAI-ARIA friendly accordion component.\n\t * An accordion is a collection of expandable panels associated with a common outer container. Panels consist\n\t * of a header and an associated content region or tabpanel. The primary use of an Accordion is to present multiple sections\n\t * of content on a single page without scrolling, where all of the sections are peers in the application or object hierarchy.\n\t * The general look is similar to a tree where each root tree node is an expandable accordion header. The user navigates\n\t * and makes the contents of each panel visible (or not) by interacting with the Accordion Header\n\t */\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _isInteger = __webpack_require__(32);\n\t\n\tvar _isInteger2 = _interopRequireDefault(_isInteger);\n\t\n\tvar _toConsumableArray2 = __webpack_require__(8);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _assign = __webpack_require__(33);\n\t\n\tvar _assign2 = _interopRequireDefault(_assign);\n\t\n\tvar _intervalFunction = __webpack_require__(30);\n\t\n\tvar _intervalFunction2 = _interopRequireDefault(_intervalFunction);\n\t\n\tvar _easing = __webpack_require__(29);\n\t\n\tvar _jsonUtils = __webpack_require__(14);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * @license\n\t * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t *      http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * This code is built with Google Material Design Lite,\n\t * which is Licensed under the Apache License, Version 2.0\n\t */\n\t\n\t/**\n\t * Image carousel\n\t */\n\t\n\tvar MDL_RIPPLE_CONTAINER = 'mdlext-carousel__slide__ripple-container';\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  //const CAROUSEL = 'mdlext-carousel';\n\t\n\t  var SLIDE = 'mdlext-carousel__slide';\n\t  var ROLE = 'list';\n\t  var SLIDE_ROLE = 'listitem';\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtCarousel = function MaterialExtCarousel(element) {\n\t    // Stores the element.\n\t    this.element_ = element;\n\t\n\t    // Default config\n\t    this.config_ = {\n\t      interactive: true,\n\t      autostart: false,\n\t      type: 'slide',\n\t      interval: 1000,\n\t      animationLoop: (0, _intervalFunction2.default)(1000)\n\t    };\n\t\n\t    this.scrollAnimation_ = (0, _intervalFunction2.default)(33);\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t\n\t  window['MaterialExtCarousel'] = MaterialExtCarousel;\n\t\n\t  /**\n\t   * Start slideshow animation\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.startSlideShow_ = function () {\n\t    var _this = this;\n\t\n\t    var nextSlide = function nextSlide() {\n\t      var slide = _this.element_.querySelector('.' + SLIDE + '[aria-selected]');\n\t      if (slide) {\n\t        slide.removeAttribute('aria-selected');\n\t        slide = slide.nextElementSibling;\n\t      }\n\t      if (!slide) {\n\t        slide = _this.element_.querySelector('.' + SLIDE + ':first-child');\n\t        _this.animateScroll_(0);\n\t      }\n\t      if (slide) {\n\t        _this.moveSlideIntoViewport_(slide);\n\t        slide.setAttribute('aria-selected', '');\n\t        _this.emitSelectEvent_('next', null, slide);\n\t        return true;\n\t      }\n\t      return false;\n\t    };\n\t\n\t    var nextScroll = function nextScroll(direction) {\n\t      var nextDirection = direction;\n\t\n\t      if ('next' === direction && _this.element_.scrollLeft === _this.element_.scrollWidth - _this.element_.clientWidth) {\n\t        nextDirection = 'prev';\n\t      } else if (_this.element_.scrollLeft === 0) {\n\t        nextDirection = 'next';\n\t      }\n\t      var x = 'next' === nextDirection ? Math.min(_this.element_.scrollLeft + _this.element_.clientWidth, _this.element_.scrollWidth - _this.element_.clientWidth) : Math.max(_this.element_.scrollLeft - _this.element_.clientWidth, 0);\n\t\n\t      _this.animateScroll_(x, 1000);\n\t      return nextDirection;\n\t    };\n\t\n\t    if (!this.config_.animationLoop.started) {\n\t      (function () {\n\t        _this.config_.animationLoop.interval = _this.config_.interval;\n\t        var direction = 'next';\n\t\n\t        if ('scroll' === _this.config_.type) {\n\t          _this.config_.animationLoop.start(function () {\n\t            direction = nextScroll(direction);\n\t            return true; // It runs until cancelSlideShow_ is triggered\n\t          });\n\t        } else {\n\t          nextSlide();\n\t          _this.config_.animationLoop.start(function () {\n\t            return nextSlide(); // It runs until cancelSlideShow_ is triggered\n\t          });\n\t        }\n\t      })();\n\t    }\n\t\n\t    // TODO: Pause animation when carousel is not in browser viewport or user changes tab\n\t  };\n\t\n\t  /**\n\t   * Cancel slideshow if running. Emmits a 'pause' event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.cancelSlideShow_ = function () {\n\t    if (this.config_.animationLoop.started) {\n\t      this.config_.animationLoop.stop();\n\t      this.emitSelectEvent_('pause', _constants.VK_ESC, this.element_.querySelector('.' + SLIDE + '[aria-selected]'));\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Animate scroll\n\t   * @param newPosition\n\t   * @param newDuration\n\t   * @param completedCallback\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.animateScroll_ = function (newPosition, newDuration, completedCallback) {\n\t    var _this2 = this;\n\t\n\t    var start = this.element_.scrollLeft;\n\t    var distance = newPosition - start;\n\t\n\t    if (distance !== 0) {\n\t      (function () {\n\t        var duration = Math.max(Math.min(Math.abs(distance), newDuration || 400), 100); // duration is between 100 and newDuration||400ms||distance\n\t        var t = 0;\n\t        _this2.scrollAnimation_.stop();\n\t        _this2.scrollAnimation_.start(function (timeElapsed) {\n\t          t += timeElapsed;\n\t          if (t < duration) {\n\t            _this2.element_.scrollLeft = (0, _easing.inOutQuintic)(t, start, distance, duration);\n\t            return true;\n\t          } else {\n\t            _this2.element_.scrollLeft = newPosition;\n\t            if (completedCallback) {\n\t              completedCallback();\n\t            }\n\t            return false;\n\t          }\n\t        });\n\t      })();\n\t    } else {\n\t      if (completedCallback) {\n\t        completedCallback();\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Execute commend\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.command_ = function (event) {\n\t    var _this3 = this;\n\t\n\t    var x = 0;\n\t    var slide = null;\n\t    var a = event.detail.action.toLowerCase();\n\t\n\t    // Cancel slideshow if running\n\t    this.cancelSlideShow_();\n\t\n\t    switch (a) {\n\t      case 'first':\n\t        slide = this.element_.querySelector('.' + SLIDE + ':first-child');\n\t        break;\n\t\n\t      case 'last':\n\t        x = this.element_.scrollWidth - this.element_.clientWidth;\n\t        slide = this.element_.querySelector('.' + SLIDE + ':last-child');\n\t        break;\n\t\n\t      case 'scroll-prev':\n\t        x = Math.max(this.element_.scrollLeft - this.element_.clientWidth, 0);\n\t        break;\n\t\n\t      case 'scroll-next':\n\t        x = Math.min(this.element_.scrollLeft + this.element_.clientWidth, this.element_.scrollWidth - this.element_.clientWidth);\n\t        break;\n\t\n\t      case 'next':\n\t      case 'prev':\n\t        slide = this.element_.querySelector('.' + SLIDE + '[aria-selected]');\n\t        if (slide) {\n\t          slide = a === 'next' ? slide.nextElementSibling : slide.previousElementSibling;\n\t          this.setAriaSelected_(slide);\n\t          this.emitSelectEvent_(a, null, slide);\n\t        }\n\t        return;\n\t\n\t      case 'play':\n\t        (0, _assign2.default)(this.config_, event.detail);\n\t        this.startSlideShow_();\n\t        return;\n\t\n\t      case 'pause':\n\t        return;\n\t\n\t      default:\n\t        return;\n\t    }\n\t\n\t    this.animateScroll_(x, undefined, function () {\n\t      if ('scroll-next' === a || 'scroll-prev' === a) {\n\t        var slides = _this3.getSlidesInViewport_();\n\t        if (slides.length > 0) {\n\t          slide = 'scroll-next' === a ? slides[0] : slides[slides.length - 1];\n\t        }\n\t      }\n\t      _this3.setAriaSelected_(slide);\n\t      _this3.emitSelectEvent_(a, null, slide);\n\t    });\n\t  };\n\t\n\t  /**\n\t   * Handles custom command event, 'scroll-prev', 'scroll-next', 'first', 'last', next, prev, play, pause\n\t   * @param event. A custom event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.commandHandler_ = function (event) {\n\t    event.preventDefault();\n\t    event.stopPropagation();\n\t    if (event.detail && event.detail.action) {\n\t      this.command_(event);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Handle keypress\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.keyDownHandler_ = function (event) {\n\t\n\t    if (event && event.target && event.target !== this.element_) {\n\t\n\t      var action = 'first';\n\t\n\t      if (event.keyCode === _constants.VK_HOME || event.keyCode === _constants.VK_END || event.keyCode === _constants.VK_PAGE_UP || event.keyCode === _constants.VK_PAGE_DOWN) {\n\t\n\t        event.preventDefault();\n\t        if (event.keyCode === _constants.VK_END) {\n\t          action = 'last';\n\t        } else if (event.keyCode === _constants.VK_PAGE_UP) {\n\t          action = 'scroll-prev';\n\t        } else if (event.keyCode === _constants.VK_PAGE_DOWN) {\n\t          action = 'scroll-next';\n\t        }\n\t\n\t        var cmd = new CustomEvent('select', {\n\t          detail: {\n\t            action: action\n\t          }\n\t        });\n\t        this.command_(cmd);\n\t      } else if (event.keyCode === _constants.VK_TAB || event.keyCode === _constants.VK_ENTER || event.keyCode === _constants.VK_SPACE || event.keyCode === _constants.VK_ARROW_UP || event.keyCode === _constants.VK_ARROW_LEFT || event.keyCode === _constants.VK_ARROW_DOWN || event.keyCode === _constants.VK_ARROW_RIGHT) {\n\t\n\t        var slide = getSlide_(event.target);\n\t\n\t        if (!slide) {\n\t          return;\n\t        }\n\t\n\t        // Cancel slideshow if running\n\t        this.cancelSlideShow_();\n\t\n\t        switch (event.keyCode) {\n\t          case _constants.VK_ARROW_UP:\n\t          case _constants.VK_ARROW_LEFT:\n\t            action = 'prev';\n\t            slide = slide.previousElementSibling;\n\t            break;\n\t\n\t          case _constants.VK_ARROW_DOWN:\n\t          case _constants.VK_ARROW_RIGHT:\n\t            action = 'next';\n\t            slide = slide.nextElementSibling;\n\t            break;\n\t\n\t          case _constants.VK_TAB:\n\t            if (event.shiftKey) {\n\t              action = 'prev';\n\t              slide = slide.previousElementSibling;\n\t            } else {\n\t              action = 'next';\n\t              slide = slide.nextElementSibling;\n\t            }\n\t            break;\n\t\n\t          case _constants.VK_SPACE:\n\t          case _constants.VK_ENTER:\n\t            action = 'select';\n\t            break;\n\t        }\n\t\n\t        if (slide) {\n\t          event.preventDefault();\n\t          setFocus_(slide);\n\t          this.emitSelectEvent_(action, event.keyCode, slide);\n\t        }\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Handle dragging\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.dragHandler_ = function (event) {\n\t    var _this4 = this;\n\t\n\t    event.preventDefault();\n\t\n\t    // Cancel slideshow if running\n\t    this.cancelSlideShow_();\n\t\n\t    var updating = false;\n\t    var rAFDragId = 0;\n\t\n\t    var startX = event.clientX || (event.touches !== undefined ? event.touches[0].clientX : 0);\n\t    var prevX = startX;\n\t    var targetElement = event.target;\n\t\n\t    var update = function update(e) {\n\t      var currentX = e.clientX || (e.touches !== undefined ? e.touches[0].clientX : 0);\n\t      var dx = prevX - currentX;\n\t\n\t      if (dx < 0) {\n\t        _this4.element_.scrollLeft = Math.max(_this4.element_.scrollLeft + dx, 0);\n\t      } else if (dx > 0) {\n\t        _this4.element_.scrollLeft = Math.min(_this4.element_.scrollLeft + dx, _this4.element_.scrollWidth - _this4.element_.clientWidth);\n\t      }\n\t\n\t      prevX = currentX;\n\t      updating = false;\n\t    };\n\t\n\t    // drag handler\n\t    var drag = function drag(e) {\n\t      e.preventDefault();\n\t\n\t      if (!updating) {\n\t        rAFDragId = window.requestAnimationFrame(function () {\n\t          return update(e);\n\t        });\n\t        updating = true;\n\t      }\n\t    };\n\t\n\t    // end drag handler\n\t    var endDrag = function endDrag(e) {\n\t      e.preventDefault();\n\t\n\t      _this4.element_.removeEventListener('mousemove', drag);\n\t      _this4.element_.removeEventListener('touchmove', drag);\n\t      window.removeEventListener('mouseup', endDrag);\n\t      window.removeEventListener('touchend', endDrag);\n\t\n\t      // cancel any existing drag rAF, see: http://www.html5rocks.com/en/tutorials/speed/animations/\n\t      window.cancelAnimationFrame(rAFDragId);\n\t\n\t      var slide = getSlide_(targetElement);\n\t      setFocus_(slide);\n\t      _this4.emitSelectEvent_('click', null, slide);\n\t    };\n\t\n\t    this.element_.addEventListener('mousemove', drag);\n\t    this.element_.addEventListener('touchmove', drag);\n\t    window.addEventListener('mouseup', endDrag);\n\t    window.addEventListener('touchend', endDrag);\n\t  };\n\t\n\t  /**\n\t   * Handle click\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.clickHandler_ = function (event) {\n\t    // Click is handled by drag\n\t    event.preventDefault();\n\t  };\n\t\n\t  /**\n\t   * Handle focus\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.focusHandler_ = function (event) {\n\t    var slide = getSlide_(event.target);\n\t    if (slide) {\n\t      // The last focused/selected slide has 'aria-selected', even if focus is lost\n\t      this.setAriaSelected_(slide);\n\t      slide.classList.add(_constants.IS_FOCUSED);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Handle blur\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.blurHandler_ = function (event) {\n\t    var slide = getSlide_(event.target);\n\t    if (slide) {\n\t      slide.classList.remove(_constants.IS_FOCUSED);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Emits a custeom 'select' event\n\t   * @param command\n\t   * @param keyCode\n\t   * @param slide\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.emitSelectEvent_ = function (command, keyCode, slide) {\n\t\n\t    if (slide) {\n\t      this.moveSlideIntoViewport_(slide);\n\t\n\t      var evt = new CustomEvent('select', {\n\t        bubbles: true,\n\t        cancelable: true,\n\t        detail: {\n\t          command: command,\n\t          keyCode: keyCode,\n\t          source: slide\n\t        }\n\t      });\n\t      this.element_.dispatchEvent(evt);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Get the first visible slide in component viewport\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.getSlidesInViewport_ = function () {\n\t    var carouselRect = this.element_.getBoundingClientRect();\n\t\n\t    var slidesInViewport = [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + SLIDE))).filter(function (slide) {\n\t      var slideRect = slide.getBoundingClientRect();\n\t      return slideRect.left >= carouselRect.left && slideRect.right <= carouselRect.right;\n\t    });\n\t    return slidesInViewport;\n\t  };\n\t\n\t  /**\n\t   * Move slide into component viewport - if needed\n\t   * @param slide\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.moveSlideIntoViewport_ = function (slide) {\n\t    var carouselRect = this.element_.getBoundingClientRect();\n\t    var slideRect = slide.getBoundingClientRect();\n\t\n\t    if (slideRect.left < carouselRect.left) {\n\t      var x = this.element_.scrollLeft - (carouselRect.left - slideRect.left);\n\t      this.animateScroll_(x);\n\t    } else if (slideRect.right > carouselRect.right) {\n\t      var _x = this.element_.scrollLeft - (carouselRect.right - slideRect.right);\n\t      this.animateScroll_(_x);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Removes 'aria-selected' from all slides in carousel\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.setAriaSelected_ = function (slide) {\n\t    if (slide) {\n\t      [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + SLIDE + '[aria-selected]'))).forEach(function (slide) {\n\t        return slide.removeAttribute('aria-selected');\n\t      });\n\t      slide.setAttribute('aria-selected', '');\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Removes event listeners\n\t   * @private\n\t   */\n\t  MaterialExtCarousel.prototype.removeListeners_ = function () {\n\t    this.element_.removeEventListener('focus', this.focusHandler_);\n\t    this.element_.removeEventListener('blur', this.blurHandler_);\n\t    this.element_.removeEventListener('keydown', this.keyDownHandler_);\n\t    this.element_.removeEventListener('mousedown', this.dragHandler_);\n\t    this.element_.removeEventListener('touchstart', this.dragHandler_);\n\t    this.element_.removeEventListener('click', this.clickHandler_, false);\n\t    this.element_.removeEventListener('command', this.commandHandler_);\n\t    this.element_.removeEventListener('mdl-componentdowngraded', this.mdlDowngrade_);\n\t  };\n\t\n\t  // Helpers\n\t  var getSlide_ = function getSlide_(element) {\n\t    return element.closest('.' + SLIDE);\n\t  };\n\t\n\t  var setFocus_ = function setFocus_(slide) {\n\t    if (slide) {\n\t      slide.focus();\n\t    }\n\t  };\n\t\n\t  var addRipple_ = function addRipple_(slide) {\n\t    if (!slide.querySelector('.' + MDL_RIPPLE_CONTAINER)) {\n\t      var rippleContainer = document.createElement('span');\n\t      rippleContainer.classList.add(MDL_RIPPLE_CONTAINER);\n\t      rippleContainer.classList.add(_constants.MDL_RIPPLE_EFFECT);\n\t      var ripple = document.createElement('span');\n\t      ripple.classList.add(_constants.MDL_RIPPLE);\n\t      rippleContainer.appendChild(ripple);\n\t\n\t      var img = slide.querySelector('img');\n\t      if (img) {\n\t        // rippleContainer blocks image title\n\t        rippleContainer.title = img.title;\n\t      }\n\t      slide.appendChild(rippleContainer);\n\t      componentHandler.upgradeElement(rippleContainer, _constants.MDL_RIPPLE_COMPONENT);\n\t    }\n\t  };\n\t  // End helpers\n\t\n\t\n\t  // Public methods.\n\t\n\t  /**\n\t   * Cancel animation - if running.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtCarousel.prototype.stopAnimation = function () {\n\t    this.config_.animationLoop.stop();\n\t  };\n\t  MaterialExtCarousel.prototype['stopAnimation'] = MaterialExtCarousel.prototype.stopAnimation;\n\t\n\t  /**\n\t   * Upgrade slides\n\t   * Use if more list elements are added later (dynamically)\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtCarousel.prototype.upgradeSlides = function () {\n\t    var _this5 = this;\n\t\n\t    var hasRippleEffect = this.element_.classList.contains(_constants.MDL_RIPPLE_EFFECT);\n\t\n\t    [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + SLIDE))).forEach(function (slide) {\n\t\n\t      slide.setAttribute('role', SLIDE_ROLE);\n\t\n\t      if (_this5.config_.interactive) {\n\t        if (!slide.getAttribute('tabindex')) {\n\t          slide.setAttribute('tabindex', '0');\n\t        }\n\t        if (hasRippleEffect) {\n\t          addRipple_(slide);\n\t        }\n\t      } else {\n\t        slide.setAttribute('tabindex', '-1');\n\t      }\n\t    });\n\t  };\n\t  MaterialExtCarousel.prototype['upgradeSlides'] = MaterialExtCarousel.prototype.upgradeSlides;\n\t\n\t  /**\n\t   * Get config object\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtCarousel.prototype.getConfig = function () {\n\t    return this.config_;\n\t  };\n\t  MaterialExtCarousel.prototype['getConfig'] = MaterialExtCarousel.prototype.getConfig;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtCarousel.prototype.init = function () {\n\t\n\t    if (this.element_) {\n\t      // Config\n\t      if (this.element_.hasAttribute('data-config')) {\n\t        this.config_ = (0, _jsonUtils.jsonStringToObject)(this.element_.getAttribute('data-config'), this.config_);\n\t      }\n\t\n\t      // Wai-Aria\n\t      this.element_.setAttribute('role', ROLE);\n\t\n\t      // Prefer tabindex -1\n\t      if (!(0, _isInteger2.default)(this.element_.getAttribute('tabindex'))) {\n\t        this.element_.setAttribute('tabindex', -1);\n\t      }\n\t\n\t      // Remove listeners, just in case ...\n\t      this.removeListeners_();\n\t\n\t      if (this.config_.interactive) {\n\t\n\t        // Ripple\n\t        var hasRippleEffect = this.element_.classList.contains(_constants.MDL_RIPPLE_EFFECT);\n\t        if (hasRippleEffect) {\n\t          this.element_.classList.add(_constants.MDL_RIPPLE_EFFECT_IGNORE_EVENTS);\n\t        }\n\t\n\t        // Listen to focus/blur events\n\t        this.element_.addEventListener('focus', this.focusHandler_.bind(this), true);\n\t        this.element_.addEventListener('blur', this.blurHandler_.bind(this), true);\n\t\n\t        // Listen to keyboard events\n\t        this.element_.addEventListener('keydown', this.keyDownHandler_.bind(this), false);\n\t\n\t        // Listen to drag events\n\t        this.element_.addEventListener('mousedown', this.dragHandler_.bind(this), false);\n\t        this.element_.addEventListener('touchstart', this.dragHandler_.bind(this), false);\n\t\n\t        // Listen to click events\n\t        this.element_.addEventListener('click', this.clickHandler_.bind(this), false);\n\t      }\n\t\n\t      // Listen to custom 'command' event\n\t      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n\t\n\t      // Listen to 'mdl-componentdowngraded' event\n\t      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n\t\n\t      // Slides collection\n\t      this.upgradeSlides();\n\t\n\t      // Set upgraded flag\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t\n\t      if (this.config_.autostart) {\n\t        // Start slideshow\n\t        this.startSlideShow_();\n\t      }\n\t    }\n\t  };\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   */\n\t  MaterialExtCarousel.prototype.mdlDowngrade_ = function () {\n\t    'use strict';\n\t    //console.log('***** MaterialExtCarousel.mdlDowngrade_');\n\t\n\t    // Stop animation - if any\n\t\n\t    this.stopAnimation();\n\t\n\t    // Remove listeners\n\t    this.removeListeners_();\n\t  };\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtCarousel,\n\t    classAsString: 'MaterialExtCarousel',\n\t    cssClass: 'mdlext-js-carousel',\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _classCallCheck2 = __webpack_require__(22);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _createClass2 = __webpack_require__(23);\n\t\n\tvar _createClass3 = _interopRequireDefault(_createClass2);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tvar _stringUtils = __webpack_require__(15);\n\t\n\tvar _domUtils = __webpack_require__(21);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar JS_COLLAPSIBLE = 'mdlext-js-collapsible'; /**\n\t                                               * @license\n\t                                               * Copyright 2016-2017 Leif Olsen. All Rights Reserved.\n\t                                               *\n\t                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t                                               * you may not use this file except in compliance with the License.\n\t                                               * You may obtain a copy of the License at\n\t                                               *\n\t                                               *      http://www.apache.org/licenses/LICENSE-2.0\n\t                                               *\n\t                                               * Unless required by applicable law or agreed to in writing, software\n\t                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t                                               * See the License for the specific language governing permissions and\n\t                                               * limitations under the License.\n\t                                               *\n\t                                               * This code is built with Google Material Design Lite,\n\t                                               * which is Licensed under the Apache License, Version 2.0\n\t                                               */\n\t\n\t/**\n\t * A collapsible is a component to mark expandable and collapsible regions.\n\t * The component use the aria-expanded state to indicate whether regions of\n\t * the content are collapsible, and to expose whether a region is currently\n\t * expanded or collapsed.\n\t * @see https://www.w3.org/WAI/GL/wiki/Using_the_WAI-ARIA_aria-expanded_state_to_mark_expandable_and_collapsible_regions\n\t */\n\t\n\tvar COLLAPSIBLE_CONTROL_CLASS = 'mdlext-collapsible';\n\tvar COLLAPSIBLE_GROUP_CLASS = 'mdlext-collapsible-group';\n\tvar COLLAPSIBLE_REGION_CLASS = 'mdlext-collapsible-region';\n\t\n\t/**\n\t * The collapsible component\n\t */\n\t\n\tvar Collapsible = function () {\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {HTMLElement} element The element that this component is connected to.\n\t   */\n\t  function Collapsible(element) {\n\t    var _this = this;\n\t\n\t    (0, _classCallCheck3.default)(this, Collapsible);\n\t    this.element_ = null;\n\t    this.controlElement_ = null;\n\t\n\t    this.keyDownHandler = function (event) {\n\t      if (event.keyCode === _constants.VK_ENTER || event.keyCode === _constants.VK_SPACE) {\n\t        event.preventDefault();\n\t\n\t        // Trigger click\n\t        (event.target || _this.controlElement).dispatchEvent(new MouseEvent('click', {\n\t          bubbles: true,\n\t          cancelable: true,\n\t          view: window\n\t        }));\n\t      }\n\t    };\n\t\n\t    this.clickHandler = function (event) {\n\t      if (!_this.isDisabled) {\n\t        if (event.target !== _this.controlElement) {\n\t          // Do not toggle if a focusable element inside the control element triggered the event\n\t          var p = (0, _domUtils.getParentElements)(event.target, _this.controlElement);\n\t          p.push(event.target);\n\t          if (p.find(function (el) {\n\t            return (0, _domUtils.isFocusable)(el);\n\t          })) {\n\t            return;\n\t          }\n\t        }\n\t        _this.toggle();\n\t      }\n\t    };\n\t\n\t    this.element_ = element;\n\t    this.init();\n\t  }\n\t\n\t  (0, _createClass3.default)(Collapsible, [{\n\t    key: 'collapse',\n\t    value: function collapse() {\n\t      if (!this.isDisabled && this.isExpanded) {\n\t        if (this.dispatchToggleEvent('collapse')) {\n\t          this.controlElement.setAttribute('aria-expanded', 'false');\n\t          var regions = this.regionElements.slice(0);\n\t          for (var i = regions.length - 1; i >= 0; --i) {\n\t            regions[i].setAttribute('hidden', '');\n\t          }\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: 'expand',\n\t    value: function expand() {\n\t      if (!this.isDisabled && !this.isExpanded) {\n\t        if (this.dispatchToggleEvent('expand')) {\n\t          this.controlElement.setAttribute('aria-expanded', 'true');\n\t          this.regionElements.forEach(function (region) {\n\t            return region.removeAttribute('hidden');\n\t          });\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: 'toggle',\n\t    value: function toggle() {\n\t      if (this.isExpanded) {\n\t        this.collapse();\n\t      } else {\n\t        this.expand();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'dispatchToggleEvent',\n\t    value: function dispatchToggleEvent(action) {\n\t      return this.element.dispatchEvent(new CustomEvent('toggle', {\n\t        bubbles: true,\n\t        cancelable: true,\n\t        detail: {\n\t          action: action\n\t        }\n\t      }));\n\t    }\n\t  }, {\n\t    key: 'disableToggle',\n\t    value: function disableToggle() {\n\t      this.controlElement.setAttribute('aria-disabled', true);\n\t    }\n\t  }, {\n\t    key: 'enableToggle',\n\t    value: function enableToggle() {\n\t      this.controlElement.removeAttribute('aria-disabled');\n\t    }\n\t  }, {\n\t    key: 'addRegionId',\n\t    value: function addRegionId(regionId) {\n\t      var ids = this.regionIds;\n\t      if (!ids.find(function (id) {\n\t        return regionId === id;\n\t      })) {\n\t        ids.push(regionId);\n\t        this.controlElement.setAttribute('aria-controls', ids.join(' '));\n\t      }\n\t    }\n\t  }, {\n\t    key: 'addRegionElement',\n\t    value: function addRegionElement(region) {\n\t      if (!(region.classList.contains(COLLAPSIBLE_GROUP_CLASS) || region.classList.contains(COLLAPSIBLE_REGION_CLASS))) {\n\t        region.classList.add(COLLAPSIBLE_GROUP_CLASS);\n\t      }\n\t\n\t      if (!region.hasAttribute('role')) {\n\t        var role = region.classList.contains(COLLAPSIBLE_GROUP_CLASS) ? 'group' : 'region';\n\t        region.setAttribute('role', role);\n\t      }\n\t\n\t      if (!region.hasAttribute('id')) {\n\t        region.id = region.getAttribute('role') + '-' + (0, _stringUtils.randomString)();\n\t      }\n\t\n\t      if (this.isExpanded) {\n\t        region.removeAttribute('hidden');\n\t      } else {\n\t        region.setAttribute('hidden', '');\n\t      }\n\t      this.addRegionId(region.id);\n\t    }\n\t  }, {\n\t    key: 'removeRegionElement',\n\t    value: function removeRegionElement(region) {\n\t      if (region && region.id) {\n\t        var ids = this.regionIds.filter(function (id) {\n\t          return id === region.id;\n\t        });\n\t        this.controlElement.setAttribute('aria-controls', ids.join(' '));\n\t      }\n\t    }\n\t  }, {\n\t    key: 'removeListeners',\n\t    value: function removeListeners() {\n\t      this.controlElement.removeEventListener('keydown', this.keyDownHandler);\n\t      this.controlElement.removeEventListener('click', this.clickHandler);\n\t    }\n\t  }, {\n\t    key: 'init',\n\t    value: function init() {\n\t      var _this2 = this;\n\t\n\t      var initControl = function initControl() {\n\t        // Find the button element\n\t        _this2.controlElement_ = _this2.element.querySelector('.' + COLLAPSIBLE_CONTROL_CLASS) || _this2.element;\n\t\n\t        // Add \"aria-expanded\" attribute if not present\n\t        if (!_this2.controlElement.hasAttribute('aria-expanded')) {\n\t          _this2.controlElement.setAttribute('aria-expanded', 'false');\n\t        }\n\t\n\t        // Add role=button if control != <button>\n\t        if (_this2.controlElement.nodeName.toLowerCase() !== 'button') {\n\t          _this2.controlElement.setAttribute('role', 'button');\n\t        }\n\t\n\t        // Add tabindex\n\t        if (!(0, _domUtils.isFocusable)(_this2.controlElement) && !_this2.controlElement.hasAttribute('tabindex')) {\n\t          _this2.controlElement.setAttribute('tabindex', '0');\n\t        }\n\t      };\n\t\n\t      var initRegions = function initRegions() {\n\t        var regions = [];\n\t        if (!_this2.controlElement.hasAttribute('aria-controls')) {\n\t          // Add siblings as collapsible region(s)\n\t          var r = _this2.element.nextElementSibling;\n\t          while (r) {\n\t            if (r.classList.contains(COLLAPSIBLE_GROUP_CLASS) || r.classList.contains(COLLAPSIBLE_REGION_CLASS)) {\n\t              regions.push(r);\n\t            } else if (r.classList.contains(JS_COLLAPSIBLE)) {\n\t              // A new collapsible component\n\t              break;\n\t            }\n\t            r = r.nextElementSibling;\n\t          }\n\t        } else {\n\t          regions = _this2.regionElements;\n\t        }\n\t        regions.forEach(function (region) {\n\t          return _this2.addRegionElement(region);\n\t        });\n\t      };\n\t\n\t      var addListeners = function addListeners() {\n\t        _this2.controlElement.addEventListener('keydown', _this2.keyDownHandler);\n\t        _this2.controlElement.addEventListener('click', _this2.clickHandler);\n\t      };\n\t\n\t      initControl();\n\t      initRegions();\n\t      this.removeListeners();\n\t      addListeners();\n\t    }\n\t  }, {\n\t    key: 'downgrade',\n\t    value: function downgrade() {\n\t      this.removeListeners();\n\t    }\n\t  }, {\n\t    key: 'element',\n\t    get: function get() {\n\t      return this.element_;\n\t    }\n\t  }, {\n\t    key: 'controlElement',\n\t    get: function get() {\n\t      return this.controlElement_;\n\t    }\n\t  }, {\n\t    key: 'isDisabled',\n\t    get: function get() {\n\t      return this.controlElement.hasAttribute('disabled') && this.controlElement.getAttribute('disabled').toLowerCase() !== 'false' || this.controlElement.hasAttribute('aria-disabled') && this.controlElement.getAttribute('aria-disabled').toLowerCase() !== 'false';\n\t    }\n\t  }, {\n\t    key: 'isExpanded',\n\t    get: function get() {\n\t      return this.controlElement.hasAttribute('aria-expanded') && this.controlElement.getAttribute('aria-expanded').toLowerCase() === 'true';\n\t    }\n\t  }, {\n\t    key: 'regionIds',\n\t    get: function get() {\n\t      return this.controlElement.hasAttribute('aria-controls') ? this.controlElement.getAttribute('aria-controls').split(' ') : [];\n\t    }\n\t  }, {\n\t    key: 'regionElements',\n\t    get: function get() {\n\t      return this.regionIds.map(function (id) {\n\t        return document.querySelector('#' + id);\n\t      }).filter(function (el) {\n\t        return el != null;\n\t      });\n\t    }\n\t  }]);\n\t  return Collapsible;\n\t}();\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {HTMLElement} element The element that will be upgraded.\n\t   */\n\t\n\t  var MaterialExtCollapsible = function MaterialExtCollapsible(element) {\n\t    this.element_ = element;\n\t    this.collapsible = null;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtCollapsible'] = MaterialExtCollapsible;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtCollapsible.prototype.init = function () {\n\t    if (this.element_) {\n\t      this.collapsible = new Collapsible(this.element_);\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t\n\t      // Listen to 'mdl-componentdowngraded' event\n\t      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n\t    }\n\t  };\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   */\n\t  MaterialExtCollapsible.prototype.mdlDowngrade_ = function () {\n\t    this.collapsible.downgrade();\n\t  };\n\t\n\t  // Public methods.\n\t\n\t  /**\n\t   * Get control element.\n\t   * @return {HTMLElement} element The element that controls the collapsible region.\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.getControlElement = function () {\n\t    return this.collapsible.controlElement;\n\t  };\n\t  MaterialExtCollapsible.prototype['getControlElement'] = MaterialExtCollapsible.prototype.getControlElement;\n\t\n\t  /**\n\t   * Get region elements controlled by this collapsible\n\t   * @returns {Array<HTMLElement>} the collapsible region elements\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.getRegionElements = function () {\n\t    return this.collapsible.regionElements;\n\t  };\n\t  MaterialExtCollapsible.prototype['getRegionElements'] = MaterialExtCollapsible.prototype.getRegionElements;\n\t\n\t  /**\n\t   * Add region elements.\n\t   * @param {Array<HTMLElement>} elements The element that will be upgraded.\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.addRegionElements = function () {\n\t    var _this3 = this;\n\t\n\t    for (var _len = arguments.length, elements = Array(_len), _key = 0; _key < _len; _key++) {\n\t      elements[_key] = arguments[_key];\n\t    }\n\t\n\t    elements.forEach(function (element) {\n\t      return _this3.collapsible.addRegionElement(element);\n\t    });\n\t  };\n\t  MaterialExtCollapsible.prototype['addRegionElements'] = MaterialExtCollapsible.prototype.addRegionElements;\n\t\n\t  /**\n\t   * Remove collapsible region(s) from component.\n\t   * Note: This operation does not delete the element from the DOM tree.\n\t   * @param {Array<HTMLElement>} elements The element that will be upgraded.\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.removeRegionElements = function () {\n\t    var _this4 = this;\n\t\n\t    for (var _len2 = arguments.length, elements = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t      elements[_key2] = arguments[_key2];\n\t    }\n\t\n\t    elements.forEach(function (element) {\n\t      return _this4.collapsible.removeRegionElement(element);\n\t    });\n\t  };\n\t  MaterialExtCollapsible.prototype['removeRegionElements'] = MaterialExtCollapsible.prototype.removeRegionElements;\n\t\n\t  /**\n\t   * Expand collapsible region(s)\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.expand = function () {\n\t    this.collapsible.expand();\n\t  };\n\t  MaterialExtCollapsible.prototype['expand'] = MaterialExtCollapsible.prototype.expand;\n\t\n\t  /**\n\t   * Collapse collapsible region(s)\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.collapse = function () {\n\t    this.collapsible.collapse();\n\t  };\n\t  MaterialExtCollapsible.prototype['collapse'] = MaterialExtCollapsible.prototype.collapse;\n\t\n\t  /**\n\t   * Toggle collapsible region(s)\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.toggle = function () {\n\t    this.collapsible.toggle();\n\t  };\n\t  MaterialExtCollapsible.prototype['toggle'] = MaterialExtCollapsible.prototype.toggle;\n\t\n\t  /**\n\t   * Check whether component has aria-expanded state true\n\t   * @return {Boolean} true if aria-expanded=\"true\", otherwise false\n\t   */\n\t  MaterialExtCollapsible.prototype.isExpanded = function () {\n\t    return this.collapsible.isExpanded;\n\t  };\n\t  MaterialExtCollapsible.prototype['isExpanded'] = MaterialExtCollapsible.prototype.isExpanded;\n\t\n\t  /**\n\t   * Check whether component has aria-disabled state set to true\n\t   * @return {Boolean} true if aria-disabled=\"true\", otherwise false\n\t   */\n\t  MaterialExtCollapsible.prototype.isDisabled = function () {\n\t    return this.collapsible.isDisabled;\n\t  };\n\t  MaterialExtCollapsible.prototype['isDisabled'] = MaterialExtCollapsible.prototype.isDisabled;\n\t\n\t  /**\n\t   * Disables toggling of collapsible region(s)\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.disableToggle = function () {\n\t    this.collapsible.disableToggle();\n\t  };\n\t  MaterialExtCollapsible.prototype['disableToggle'] = MaterialExtCollapsible.prototype.disableToggle;\n\t\n\t  /**\n\t   * Enables toggling of collapsible region(s)\n\t   * @return {void}\n\t   * @public\n\t   */\n\t  MaterialExtCollapsible.prototype.enableToggle = function () {\n\t    this.collapsible.enableToggle();\n\t  };\n\t  MaterialExtCollapsible.prototype['enableToggle'] = MaterialExtCollapsible.prototype.enableToggle;\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtCollapsible,\n\t    classAsString: 'MaterialExtCollapsible',\n\t    cssClass: JS_COLLAPSIBLE,\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _classCallCheck2 = __webpack_require__(22);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _createClass2 = __webpack_require__(23);\n\t\n\tvar _createClass3 = _interopRequireDefault(_createClass2);\n\t\n\tvar _class, _temp; /**\n\t                    * @license\n\t                    * Copyright 2016-2017 Leif Olsen. All Rights Reserved.\n\t                    *\n\t                    * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t                    * you may not use this file except in compliance with the License.\n\t                    * You may obtain a copy of the License at\n\t                    *\n\t                    *      http://www.apache.org/licenses/LICENSE-2.0\n\t                    *\n\t                    * Unless required by applicable law or agreed to in writing, software\n\t                    * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t                    * See the License for the specific language governing permissions and\n\t                    * limitations under the License.\n\t                    *\n\t                    * This code is built with Google Material Design Lite,\n\t                    * which is Licensed under the Apache License, Version 2.0\n\t                    */\n\t\n\tvar _jsonUtils = __webpack_require__(14);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar JS_FORMAT_FIELD = 'mdlext-js-formatfield';\n\tvar FORMAT_FIELD_COMPONENT = 'MaterialExtFormatfield';\n\t\n\t/**\n\t * Detect browser locale\n\t * @returns {string} the locale\n\t * @see http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference\n\t */\n\tvar browserLanguage = function browserLanguage() {\n\t  return navigator.languages ? navigator.languages[0] : navigator.language || navigator.userLanguage;\n\t};\n\t\n\t/**\n\t * The formatfield  formats an input field  using language sensitive number formatting.\n\t */\n\t\n\tvar FormatField = (_temp = _class = function () {\n\t  function FormatField(element) {\n\t    var _this = this;\n\t\n\t    (0, _classCallCheck3.default)(this, FormatField);\n\t    this.options_ = {};\n\t\n\t    this.clickHandler = function () {\n\t      clearTimeout(FormatField.timer);\n\t    };\n\t\n\t    this.focusInHandler = function () {\n\t      if (!(_this.input.readOnly || _this.input.disabled)) {\n\t        _this.input.value = _this.unformatInput();\n\t        //setTimeout(() => this.input.setSelectionRange(0, this.input.value.length), 20);\n\t        FormatField.timer = setTimeout(function () {\n\t          return _this.input.select();\n\t        }, 200);\n\t      }\n\t    };\n\t\n\t    this.focusOutHandler = function () {\n\t      clearTimeout(FormatField.timer);\n\t\n\t      if (!(_this.input.readOnly || _this.input.disabled)) {\n\t        _this.formatValue();\n\t      }\n\t    };\n\t\n\t    this.element_ = element;\n\t    this.init();\n\t  }\n\t\n\t  (0, _createClass3.default)(FormatField, [{\n\t    key: 'stripSeparatorsFromValue',\n\t    value: function stripSeparatorsFromValue() {\n\t      var _this2 = this;\n\t\n\t      var doReplace = function doReplace() {\n\t        return _this2.input.value.replace(/\\s/g, '').replace(new RegExp(_this2.options.groupSeparator, 'g'), '').replace(_this2.options.decimalSeparator, '.');\n\t      };\n\t      //.replace(this.intlGroupSeparator_, ''),\n\t      //.replace(this.intlDecimalSeparator_, '.');\n\t\n\t      return this.input.value ? doReplace() : this.input.value;\n\t    }\n\t  }, {\n\t    key: 'fixSeparators',\n\t    value: function fixSeparators(value) {\n\t      var _this3 = this;\n\t\n\t      var doReplace = function doReplace() {\n\t        return value.replace(new RegExp(_this3.intlGroupSeparator_, 'g'), _this3.options.groupSeparator).replace(_this3.intlDecimalSeparator_, _this3.options.decimalSeparator);\n\t      };\n\t\n\t      return value ? doReplace() : value;\n\t    }\n\t  }, {\n\t    key: 'formatValue',\n\t    value: function formatValue() {\n\t      if (this.input.value) {\n\t        var v = new Intl.NumberFormat(this.options.locales, this.options).format(this.stripSeparatorsFromValue());\n\t\n\t        if ('NaN' !== v) {\n\t          this.input.value = this.fixSeparators(v);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: 'unformat',\n\t    value: function unformat() {\n\t      var _this4 = this;\n\t\n\t      var doReplace = function doReplace() {\n\t        return _this4.input.value.replace(/\\s/g, '').replace(new RegExp(_this4.options.groupSeparator, 'g'), '').replace(_this4.options.decimalSeparator, '.');\n\t      };\n\t\n\t      return this.input.value ? doReplace() : this.input.value;\n\t    }\n\t  }, {\n\t    key: 'unformatInput',\n\t    value: function unformatInput() {\n\t      var _this5 = this;\n\t\n\t      var doReplace = function doReplace() {\n\t        return _this5.input.value.replace(/\\s/g, '').replace(new RegExp(_this5.options.groupSeparator, 'g'), '');\n\t      };\n\t\n\t      return this.input.value ? doReplace() : this.input.value;\n\t    }\n\t  }, {\n\t    key: 'removeListeners',\n\t    value: function removeListeners() {\n\t      this.input.removeEventListener('click', this.clickHandler);\n\t      this.input.removeEventListener('focusin', this.focusInHandler);\n\t      this.input.removeEventListener('focusout', this.focusOutHandler);\n\t    }\n\t  }, {\n\t    key: 'init',\n\t    value: function init() {\n\t      var _this6 = this;\n\t\n\t      var addListeners = function addListeners() {\n\t        _this6.input.addEventListener('click', _this6.clickHandler);\n\t        _this6.input.addEventListener('focusin', _this6.focusInHandler);\n\t        _this6.input.addEventListener('focusout', _this6.focusOutHandler);\n\t      };\n\t\n\t      var addOptions = function addOptions() {\n\t        var opts = _this6.element.getAttribute('data-formatfield-options') || _this6.input.getAttribute('data-formatfield-options');\n\t        if (opts) {\n\t          _this6.options_ = (0, _jsonUtils.jsonStringToObject)(opts, _this6.options);\n\t        }\n\t      };\n\t\n\t      var addLocale = function addLocale() {\n\t        if (!_this6.options.locales) {\n\t          _this6.options.locales = browserLanguage() || 'en-US'; //'nb-NO', //'en-US',\n\t        }\n\t      };\n\t\n\t      var addGrouping = function addGrouping() {\n\t        var s = 1234.5.toLocaleString(_this6.options.locales, {\n\t          style: 'decimal',\n\t          useGrouping: true,\n\t          minimumFractionDigits: 1,\n\t          maximumFractionDigits: 1\n\t        });\n\t\n\t        _this6.intlGroupSeparator_ = s.charAt(1);\n\t        _this6.intlDecimalSeparator_ = s.charAt(s.length - 2);\n\t        _this6.options.groupSeparator = _this6.options.groupSeparator || _this6.intlGroupSeparator_;\n\t        _this6.options.decimalSeparator = _this6.options.decimalSeparator || _this6.intlDecimalSeparator_;\n\t\n\t        if (_this6.options.groupSeparator === _this6.options.decimalSeparator) {\n\t          var e = 'Error! options.groupSeparator, \"' + _this6.options.groupSeparator + '\" ' + 'and options.decimalSeparator, ' + ('\"' + _this6.options.decimalSeparator + '\" should not be equal');\n\t          throw new Error(e);\n\t        }\n\t      };\n\t\n\t      this.input_ = this.element.querySelector('input') || this.element;\n\t\n\t      addOptions();\n\t      addLocale();\n\t      addGrouping();\n\t      this.formatValue();\n\t      addListeners();\n\t    }\n\t  }, {\n\t    key: 'downgrade',\n\t    value: function downgrade() {\n\t      this.removeListeners();\n\t    }\n\t  }, {\n\t    key: 'element',\n\t    get: function get() {\n\t      return this.element_;\n\t    }\n\t  }, {\n\t    key: 'input',\n\t    get: function get() {\n\t      return this.input_;\n\t    }\n\t  }, {\n\t    key: 'options',\n\t    get: function get() {\n\t      return this.options_;\n\t    }\n\t  }]);\n\t  return FormatField;\n\t}(), _class.timer = null, _temp);\n\t\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {HTMLElement} element The element that will be upgraded.\n\t   */\n\t\n\t  var MaterialExtFormatfield = function MaterialExtFormatfield(element) {\n\t    this.element_ = element;\n\t    this.formatField_ = null;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtFormatfield'] = MaterialExtFormatfield;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtFormatfield.prototype.init = function () {\n\t    if (this.element_) {\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t      this.formatField_ = new FormatField(this.element_);\n\t\n\t      // Listen to 'mdl-componentdowngraded' event\n\t      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Get options object\n\t   *\n\t   * @public\n\t   *\n\t   * @returns {Object} the options object\n\t   */\n\t  MaterialExtFormatfield.prototype.getOptions = function () {\n\t    return this.formatField_.options;\n\t  };\n\t  MaterialExtFormatfield.prototype['getOptions'] = MaterialExtFormatfield.prototype.getOptions;\n\t\n\t  /**\n\t   * A unformatted value is a string value where the locale specific decimal separator\n\t   * is replaced with a '.' separator and group separators are stripped.\n\t   * The returned value is suitable for parsing to a JavaScript numerical value.\n\t   *\n\t   * @example\n\t   * input.value = '1 234,5';\n\t   * inputElement.MaterialExtFormatfield.getUnformattedValue();\n\t   * // Returns '1234.5'\n\t   *\n\t   * @public\n\t   *\n\t   * @returns {String} the unformatted value\n\t   */\n\t  MaterialExtFormatfield.prototype.getUnformattedValue = function () {\n\t    return this.formatField_.unformat();\n\t  };\n\t  MaterialExtFormatfield.prototype['getUnformattedValue'] = MaterialExtFormatfield.prototype.getUnformattedValue;\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   */\n\t  MaterialExtFormatfield.prototype.mdlDowngrade_ = function () {\n\t    this.formatField_.downgrade();\n\t  };\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtFormatfield,\n\t    classAsString: FORMAT_FIELD_COMPONENT,\n\t    cssClass: JS_FORMAT_FIELD,\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t__webpack_require__(59);\n\t\n\t__webpack_require__(49);\n\t\n\t__webpack_require__(51);\n\t\n\t__webpack_require__(50);\n\t\n\t__webpack_require__(54);\n\t\n\t__webpack_require__(55);\n\t\n\t__webpack_require__(56);\n\t\n\t__webpack_require__(57);\n\t\n\t__webpack_require__(52);\n\t\n\t__webpack_require__(58);\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _toConsumableArray2 = __webpack_require__(8);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar MDL_RIPPLE_CONTAINER = 'mdlext-lightboard__slide__ripple-container'; /**\n\t                                                                          * @license\n\t                                                                          * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t                                                                          *\n\t                                                                          * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t                                                                          * you may not use this file except in compliance with the License.\n\t                                                                          * You may obtain a copy of the License at\n\t                                                                          *\n\t                                                                          *      http://www.apache.org/licenses/LICENSE-2.0\n\t                                                                          *\n\t                                                                          * Unless required by applicable law or agreed to in writing, software\n\t                                                                          * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t                                                                          * See the License for the specific language governing permissions and\n\t                                                                          * limitations under the License.\n\t                                                                          *\n\t                                                                          * This code is built with Google Material Design Lite,\n\t                                                                          * which is Licensed under the Apache License, Version 2.0\n\t                                                                          */\n\t\n\t/**\n\t * A lightboard is a translucent surface illuminated from behind, used for situations\n\t * where a shape laid upon the surface needs to be seen with high contrast. In the \"old days\" of photography\n\t * photograpers used a lightboard to get a quick view of their slides. The goal is to create a responsive lightbox\n\t * design, based on flex layout, similar to what is used in Adobe LightRoom to browse images.\n\t */\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  //const LIGHTBOARD = 'mdlext-lightboard';\n\t\n\t  var LIGHTBOARD_ROLE = 'grid';\n\t  var SLIDE = 'mdlext-lightboard__slide';\n\t  var SLIDE_ROLE = 'gridcell';\n\t  var SLIDE_TABSTOP = 'mdlext-lightboard__slide__frame';\n\t  /**\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtLightboard = function MaterialExtLightboard(element) {\n\t    // Stores the element.\n\t    this.element_ = element;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtLightboard'] = MaterialExtLightboard;\n\t\n\t  // Helpers\n\t  var getSlide = function getSlide(element) {\n\t    return element ? element.closest('.' + SLIDE) : null;\n\t  };\n\t\n\t  // Private methods.\n\t\n\t  /**\n\t   * Select a slide, i.e. set aria-selected=\"true\"\n\t   * @param element\n\t   * @private\n\t   */\n\t  MaterialExtLightboard.prototype.selectSlide_ = function (element) {\n\t    var slide = getSlide(element);\n\t    if (slide && !slide.hasAttribute('aria-selected')) {\n\t      [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + SLIDE + '[aria-selected=\"true\"]'))).forEach(function (selectedSlide) {\n\t        return selectedSlide.removeAttribute('aria-selected');\n\t      });\n\t\n\t      slide.setAttribute('aria-selected', 'true');\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Dispatch select event\n\t   * @param {Element} slide The slide that caused the event\n\t   * @private\n\t   */\n\t  MaterialExtLightboard.prototype.dispatchSelectEvent_ = function (slide) {\n\t    this.element_.dispatchEvent(new CustomEvent('select', {\n\t      bubbles: true,\n\t      cancelable: true,\n\t      detail: { source: slide }\n\t    }));\n\t  };\n\t\n\t  /**\n\t   * Handles custom command event, 'first', 'next', 'prev', 'last', 'select' or upgrade\n\t   * @param event. A custom event\n\t   * @private\n\t   */\n\t  MaterialExtLightboard.prototype.commandHandler_ = function (event) {\n\t    event.preventDefault();\n\t    event.stopPropagation();\n\t\n\t    if (event && event.detail) {\n\t      this.command(event.detail);\n\t    }\n\t  };\n\t\n\t  // Public methods\n\t\n\t  /**\n\t   * Initialize lightboard slides\n\t   * @public\n\t   */\n\t  MaterialExtLightboard.prototype.upgradeSlides = function () {\n\t\n\t    var addRipple = function addRipple(slide) {\n\t      // Use slide frame as ripple container\n\t      if (!slide.querySelector('.' + MDL_RIPPLE_CONTAINER)) {\n\t        var a = slide.querySelector('.' + SLIDE_TABSTOP);\n\t        if (a) {\n\t          var rippleContainer = a;\n\t          rippleContainer.classList.add(MDL_RIPPLE_CONTAINER);\n\t          rippleContainer.classList.add(_constants.MDL_RIPPLE_EFFECT);\n\t          var ripple = document.createElement('span');\n\t          ripple.classList.add(_constants.MDL_RIPPLE);\n\t          rippleContainer.appendChild(ripple);\n\t          componentHandler.upgradeElement(rippleContainer, _constants.MDL_RIPPLE_COMPONENT);\n\t        }\n\t      }\n\t    };\n\t\n\t    var hasRippleEffect = this.element_.classList.contains(_constants.MDL_RIPPLE_EFFECT);\n\t\n\t    [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + SLIDE))).forEach(function (slide) {\n\t\n\t      slide.setAttribute('role', SLIDE_ROLE);\n\t\n\t      if (!slide.querySelector('a')) {\n\t        slide.setAttribute('tabindex', '0');\n\t      }\n\t      if (hasRippleEffect) {\n\t        addRipple(slide);\n\t      }\n\t    });\n\t  };\n\t  MaterialExtLightboard.prototype['upgradeSlides'] = MaterialExtLightboard.prototype.upgradeSlides;\n\t\n\t  /**\n\t   * Execute command\n\t   * @param detail\n\t   * @public\n\t   */\n\t  MaterialExtLightboard.prototype.command = function (detail) {\n\t    var _this = this;\n\t\n\t    var firstSlide = function firstSlide() {\n\t      return _this.element_.querySelector('.' + SLIDE + ':first-child');\n\t    };\n\t\n\t    var lastSlide = function lastSlide() {\n\t      return _this.element_.querySelector('.' + SLIDE + ':last-child');\n\t    };\n\t\n\t    var nextSlide = function nextSlide() {\n\t      var slide = _this.element_.querySelector('.' + SLIDE + '[aria-selected=\"true\"]').nextElementSibling;\n\t      return slide ? slide : firstSlide();\n\t    };\n\t\n\t    var prevSlide = function prevSlide() {\n\t      var slide = _this.element_.querySelector('.' + SLIDE + '[aria-selected=\"true\"]').previousElementSibling;\n\t      return slide ? slide : lastSlide();\n\t    };\n\t\n\t    if (detail && detail.action) {\n\t      var action = detail.action,\n\t          target = detail.target;\n\t\n\t\n\t      var slide = void 0;\n\t      switch (action.toLowerCase()) {\n\t        case 'select':\n\t          slide = getSlide(target);\n\t          this.dispatchSelectEvent_(slide);\n\t          break;\n\t        case 'first':\n\t          slide = firstSlide();\n\t          break;\n\t        case 'next':\n\t          slide = nextSlide();\n\t          break;\n\t        case 'prev':\n\t          slide = prevSlide();\n\t          break;\n\t        case 'last':\n\t          slide = lastSlide();\n\t          break;\n\t        case 'upgrade':\n\t          this.upgradeSlides();\n\t          break;\n\t        default:\n\t          throw new Error('Unknown action \"' + action + '\". Action must be one of \"first\", \"next\", \"prev\", \"last\", \"select\" or \"upgrade\"');\n\t      }\n\t\n\t      if (slide) {\n\t        var a = slide.querySelector('a');\n\t        if (a) {\n\t          a.focus();\n\t        } else {\n\t          slide.focus();\n\t        }\n\t\n\t        // Workaround for JSDom testing:\n\t        // In JsDom 'element.focus()' does not trigger any focus event\n\t        if (!slide.hasAttribute('aria-selected')) {\n\t          this.selectSlide_(slide);\n\t        }\n\t      }\n\t    }\n\t  };\n\t  MaterialExtLightboard.prototype['command'] = MaterialExtLightboard.prototype.command;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtLightboard.prototype.init = function () {\n\t    var _this2 = this;\n\t\n\t    var keydownHandler = function keydownHandler(event) {\n\t\n\t      if (event.target !== _this2.element_) {\n\t        var action = void 0;\n\t        var target = void 0;\n\t        switch (event.keyCode) {\n\t          case _constants.VK_HOME:\n\t            action = 'first';\n\t            break;\n\t          case _constants.VK_END:\n\t            action = 'last';\n\t            break;\n\t          case _constants.VK_ARROW_UP:\n\t          case _constants.VK_ARROW_LEFT:\n\t            action = 'prev';\n\t            break;\n\t          case _constants.VK_ARROW_DOWN:\n\t          case _constants.VK_ARROW_RIGHT:\n\t            action = 'next';\n\t            break;\n\t          case _constants.VK_ENTER:\n\t          case _constants.VK_SPACE:\n\t            action = 'select';\n\t            target = event.target;\n\t            break;\n\t        }\n\t        if (action) {\n\t          event.preventDefault();\n\t          event.stopPropagation();\n\t          _this2.command({ action: action, target: target });\n\t        }\n\t      }\n\t    };\n\t\n\t    var clickHandler = function clickHandler(event) {\n\t      event.preventDefault();\n\t      event.stopPropagation();\n\t\n\t      if (event.target !== _this2.element_) {\n\t        _this2.command({ action: 'select', target: event.target });\n\t      }\n\t    };\n\t\n\t    var focusHandler = function focusHandler(event) {\n\t      event.preventDefault();\n\t      event.stopPropagation();\n\t\n\t      if (event.target !== _this2.element_) {\n\t        _this2.selectSlide_(event.target);\n\t      }\n\t    };\n\t\n\t    if (this.element_) {\n\t      this.element_.setAttribute('role', LIGHTBOARD_ROLE);\n\t\n\t      if (this.element_.classList.contains(_constants.MDL_RIPPLE_EFFECT)) {\n\t        this.element_.classList.add(_constants.MDL_RIPPLE_EFFECT_IGNORE_EVENTS);\n\t      }\n\t\n\t      // Remove listeners, just in case ...\n\t      this.element_.removeEventListener('command', this.commandHandler_);\n\t      this.element_.removeEventListener('keydown', keydownHandler);\n\t      this.element_.removeEventListener('click', clickHandler);\n\t      this.element_.removeEventListener('focus', focusHandler);\n\t\n\t      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n\t      this.element_.addEventListener('keydown', keydownHandler, true);\n\t      this.element_.addEventListener('click', clickHandler, true);\n\t      this.element_.addEventListener('focus', focusHandler, true);\n\t\n\t      this.upgradeSlides();\n\t\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t    }\n\t  };\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  /* jshint undef:false */\n\t  componentHandler.register({\n\t    constructor: MaterialExtLightboard,\n\t    classAsString: 'MaterialExtLightboard',\n\t    cssClass: 'mdlext-js-lightboard',\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _toConsumableArray2 = __webpack_require__(8);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _isInteger = __webpack_require__(32);\n\t\n\tvar _isInteger2 = _interopRequireDefault(_isInteger);\n\t\n\tvar _slicedToArray2 = __webpack_require__(67);\n\t\n\tvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\t\n\tvar _entries = __webpack_require__(64);\n\t\n\tvar _entries2 = _interopRequireDefault(_entries);\n\t\n\tvar _getIterator2 = __webpack_require__(31);\n\t\n\tvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\t\n\tvar _fullThrottle = __webpack_require__(13);\n\t\n\tvar _fullThrottle2 = _interopRequireDefault(_fullThrottle);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * @license\n\t * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t *      http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * This code is built with Google Material Design Lite,\n\t * which is Licensed under the Apache License, Version 2.0\n\t */\n\t\n\t/**\n\t * Responsive Lightbox\n\t */\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  var LIGHTBOX = 'mdlext-lightbox';\n\t  var LIGHTBOX_SLIDER = 'mdlext-lightbox__slider';\n\t  var LIGHTBOX_SLIDER_SLIDE = 'mdlext-lightbox__slider__slide';\n\t  var STICKY_FOOTER = 'mdlext-lightbox--sticky-footer';\n\t  var BUTTON = 'mdl-button';\n\t\n\t  /**\n\t   * https://github.com/google/material-design-lite/issues/4205\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtLightbox = function MaterialExtLightbox(element) {\n\t    // Stores the element.\n\t    this.element_ = element;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtLightbox'] = MaterialExtLightbox;\n\t\n\t  /**\n\t   * Handle keypress\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtLightbox.prototype.keyDownHandler_ = function (event) {\n\t\n\t    if (event) {\n\t      if (event.keyCode === _constants.VK_ESC || event.keyCode === _constants.VK_SPACE || event.keyCode === _constants.VK_END || event.keyCode === _constants.VK_HOME || event.keyCode === _constants.VK_ARROW_UP || event.keyCode === _constants.VK_ARROW_LEFT || event.keyCode === _constants.VK_ARROW_DOWN || event.keyCode === _constants.VK_ARROW_RIGHT) {\n\t\n\t        if (event.keyCode !== _constants.VK_ESC) {\n\t          event.preventDefault();\n\t          event.stopPropagation();\n\t        }\n\t\n\t        var action = 'first';\n\t        if (event.keyCode === _constants.VK_END) {\n\t          action = 'last';\n\t        } else if (event.keyCode === _constants.VK_ARROW_UP || event.keyCode === _constants.VK_ARROW_LEFT) {\n\t          action = 'prev';\n\t        } else if (event.keyCode === _constants.VK_ARROW_DOWN || event.keyCode === _constants.VK_ARROW_RIGHT) {\n\t          action = 'next';\n\t        } else if (event.keyCode === _constants.VK_SPACE) {\n\t          action = 'select';\n\t        } else if (event.keyCode === _constants.VK_ESC) {\n\t          action = 'cancel';\n\t        }\n\t\n\t        dispatchAction_(action, this);\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Handle button clicks\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtLightbox.prototype.buttonClickHandler_ = function (event) {\n\t\n\t    if (event) {\n\t      event.preventDefault();\n\t      event.stopPropagation();\n\t\n\t      dispatchAction_(this.getAttribute('data-action') || '', this);\n\t\n\t      var n = this.closest('.' + LIGHTBOX);\n\t      if (n) {\n\t        n.focus();\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Dispatches an action custom event\n\t   * @param action\n\t   * @param source\n\t   * @param target\n\t   * @private\n\t   */\n\t  var dispatchAction_ = function dispatchAction_(action, source) {\n\t    var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : source;\n\t\n\t\n\t    target.dispatchEvent(new CustomEvent('action', {\n\t      bubbles: true,\n\t      cancelable: true,\n\t      detail: {\n\t        action: action || '',\n\t        source: source\n\t      }\n\t    }));\n\t  };\n\t\n\t  /**\n\t   * Reposition dialog if component parent element is \"DIALOG\"\n\t   * @param lightboxElement\n\t   * @private\n\t   */\n\t  var repositionDialog_ = function repositionDialog_(lightboxElement) {\n\t    var footerHeight = function footerHeight(footer, isSticky) {\n\t      return isSticky && footer ? footer.offsetHeight : 0;\n\t    };\n\t\n\t    var reposition = function reposition(dialog, fh) {\n\t      if (window.getComputedStyle(dialog).position === 'absolute') {\n\t        var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n\t        var topValue = scrollTop + (window.innerHeight - dialog.offsetHeight - fh) / 2;\n\t        dialog.style.top = Math.max(scrollTop, topValue) + 'px';\n\t      }\n\t    };\n\t\n\t    var p = lightboxElement.parentNode;\n\t    var dialog = p && p.nodeName === 'DIALOG' ? p : null;\n\t\n\t    if (dialog && dialog.hasAttribute('open')) {\n\t      lightboxElement.style.width = 'auto';\n\t      lightboxElement.style.maxWidth = '100%';\n\t      var img = lightboxElement.querySelector('img');\n\t      if (img) {\n\t        lightboxElement.style.maxWidth = img.naturalWidth !== undefined ? img.naturalWidth + 'px' : img.width + 'px' || '100%';\n\t      }\n\t\n\t      var fh = footerHeight(lightboxElement.querySelector('footer'), lightboxElement.classList.contains(STICKY_FOOTER));\n\t      var vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0) - fh;\n\t      if (dialog.offsetHeight > vh) {\n\t        var n = 0;\n\t        while (dialog.offsetHeight > vh && ++n < 4) {\n\t          lightboxElement.style.width = lightboxElement.offsetWidth * vh / lightboxElement.offsetHeight + 'px';\n\t        }\n\t      }\n\t      reposition(dialog, fh);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Handle image load\n\t   * @param event\n\t   * @private\n\t   */\n\t\n\t  MaterialExtLightbox.prototype.imgLoadHandler_ = function () /*event*/{\n\t    repositionDialog_(this);\n\t  };\n\t\n\t  /**\n\t   * Handle image drag\n\t   * @param event\n\t   * @private\n\t     */\n\t  MaterialExtLightbox.prototype.imgDragHandler_ = function (event) {\n\t\n\t    var setStyles = function setStyles(element, properties) {\n\t      //noinspection JSAnnotator\n\t      var _iteratorNormalCompletion = true;\n\t      var _didIteratorError = false;\n\t      var _iteratorError = undefined;\n\t\n\t      try {\n\t        for (var _iterator = (0, _getIterator3.default)((0, _entries2.default)(properties)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t          var _step$value = (0, _slicedToArray3.default)(_step.value, 2),\n\t              key = _step$value[0],\n\t              value = _step$value[1];\n\t\n\t          element.style[key] = value;\n\t        }\n\t        // ... or:\n\t        //for (const key in properties) {\n\t        //  element.style[key] = properties[key];\n\t        //}\n\t      } catch (err) {\n\t        _didIteratorError = true;\n\t        _iteratorError = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion && _iterator.return) {\n\t            _iterator.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError) {\n\t            throw _iteratorError;\n\t          }\n\t        }\n\t      }\n\t    };\n\t\n\t    event.preventDefault();\n\t    //event.stopPropagation();\n\t\n\t    var x = event.clientX || (event.touches !== undefined ? event.touches[0].clientX : 0);\n\t\n\t    var img = this;\n\t    img.style.opacity = '0.2';\n\t\n\t    var slider = document.createElement('div');\n\t    slider.classList.add(LIGHTBOX_SLIDER);\n\t    setStyles(slider, { 'width': img.offsetWidth + 'px', 'height': img.offsetHeight + 'px' });\n\t\n\t    var slide = document.createElement('div');\n\t    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n\t    slide.textContent = '>';\n\t    setStyles(slide, {\n\t      'width': img.offsetWidth + 'px',\n\t      'height': img.offsetHeight + 'px',\n\t      'line-height': img.offsetHeight + 'px',\n\t      'font-size': img.offsetHeight / 4 + 'px',\n\t      'text-align': 'right',\n\t      'background-image': 'url(\"' + (img.getAttribute('data-img-url-prev') || '') + '\")'\n\t    });\n\t    slider.appendChild(slide);\n\t\n\t    slide = document.createElement('div');\n\t    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n\t    setStyles(slide, {\n\t      'width': img.offsetWidth + 'px',\n\t      'height': img.offsetHeight + 'px',\n\t      'background-image': 'url(\"' + img.src + '\")'\n\t    });\n\t    slider.appendChild(slide);\n\t\n\t    slide = document.createElement('div');\n\t    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n\t    slide.textContent = '<';\n\t    setStyles(slide, {\n\t      'width': img.offsetWidth + 'px',\n\t      'height': img.offsetHeight + 'px',\n\t      'line-height': img.offsetHeight + 'px',\n\t      'font-size': img.offsetHeight / 4 + 'px',\n\t      'text-align': 'left',\n\t      'background-image': 'url(\"' + (img.getAttribute('data-img-url-next') || '') + '\")'\n\t    });\n\t    slider.appendChild(slide);\n\t\n\t    img.parentNode.appendChild(slider);\n\t\n\t    // drag handler\n\t    var drag = function drag(e) {\n\t      e.preventDefault();\n\t      var dx = (e.clientX || (e.touches !== undefined ? e.touches[0].clientX : 0)) - x; // TODO: maybe rewrite to improve performance\n\t\n\t      if (slider.offsetWidth - Math.abs(dx) > 19) {\n\t        slider.style.left = dx + 'px';\n\t      }\n\t    };\n\t\n\t    // end drag handler\n\t    var endDrag = function endDrag(e) {\n\t      e.preventDefault();\n\t      //e.stopPropagation();\n\t\n\t      window.removeEventListener('mousemove', drag);\n\t      window.removeEventListener('touchmove', drag);\n\t      window.removeEventListener('mouseup', endDrag);\n\t      window.removeEventListener('touchend', endDrag);\n\t\n\t      var dx = slider.offsetLeft;\n\t      img.parentNode.removeChild(slider);\n\t      img.style.opacity = '1.0';\n\t\n\t      if (Math.abs(dx) > 19) {\n\t        dispatchAction_(dx > 0 ? 'prev' : 'next', img);\n\t      }\n\t    };\n\t\n\t    window.addEventListener('mousemove', drag);\n\t    window.addEventListener('touchmove', drag);\n\t    window.addEventListener('mouseup', endDrag);\n\t    window.addEventListener('touchend', endDrag);\n\t  };\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtLightbox.prototype.init = function () {\n\t    var _this = this;\n\t\n\t    if (this.element_) {\n\t      // Do the init required for this component to work\n\t      this.element_.addEventListener('keydown', this.keyDownHandler_.bind(this.element_), true);\n\t\n\t      if (!(0, _isInteger2.default)(this.element_.getAttribute('tabindex'))) {\n\t        this.element_.setAttribute('tabindex', 1);\n\t      }\n\t\n\t      [].concat((0, _toConsumableArray3.default)(this.element_.querySelectorAll('.' + BUTTON))).forEach(function (button) {\n\t        return button.addEventListener('click', _this.buttonClickHandler_.bind(button), false);\n\t      });\n\t\n\t      var figcaption = this.element_.querySelector('figcaption');\n\t      if (figcaption) {\n\t        figcaption.addEventListener('click', this.buttonClickHandler_.bind(figcaption), false);\n\t      }\n\t\n\t      var footer = this.element_.querySelector('footer');\n\t      if (footer) {\n\t        footer.addEventListener('click', this.buttonClickHandler_.bind(footer), false);\n\t      }\n\t\n\t      var img = this.element_.querySelector('img');\n\t      if (img) {\n\t        img.addEventListener('load', this.imgLoadHandler_.bind(this.element_), false);\n\t        img.addEventListener('click', function (e) {\n\t          return e.preventDefault();\n\t        }, true);\n\t        img.addEventListener('mousedown', this.imgDragHandler_.bind(img), true);\n\t        img.addEventListener('touchstart', this.imgDragHandler_.bind(img), true);\n\t      }\n\t      window.addEventListener('resize', (0, _fullThrottle2.default)(function () {\n\t        return repositionDialog_(_this.element_);\n\t      }));\n\t      window.addEventListener('orientationchange', function () {\n\t        return repositionDialog_(_this.element_);\n\t      });\n\t\n\t      // Set upgraded flag\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t    }\n\t  };\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   *\n\t   * Nothing to downgrade\n\t   *\n\t  MaterialExtLightbox.prototype.mdlDowngrade_ = function() {\n\t  };\n\t  */\n\t\n\t  /**\n\t   * The component registers itself. It can assume componentHandler is available in the global scope.\n\t   */\n\t  /* jshint undef:false */\n\t  componentHandler.register({\n\t    constructor: MaterialExtLightbox,\n\t    classAsString: 'MaterialExtLightbox',\n\t    cssClass: 'mdlext-js-lightbox'\n\t  });\n\t})();\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _classCallCheck2 = __webpack_require__(22);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _createClass2 = __webpack_require__(23);\n\t\n\tvar _createClass3 = _interopRequireDefault(_createClass2);\n\t\n\tvar _toConsumableArray2 = __webpack_require__(8);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _stringUtils = __webpack_require__(15);\n\t\n\tvar _fullThrottle = __webpack_require__(13);\n\t\n\tvar _fullThrottle2 = _interopRequireDefault(_fullThrottle);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tvar _domUtils = __webpack_require__(21);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * @license\n\t * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t *      http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * This code is built with Google Material Design Lite,\n\t * which is Licensed under the Apache License, Version 2.0\n\t */\n\t\n\t/**\n\t * A menu button is a button that opens a menu. It is often styled as a\n\t * typical push button with a downward pointing arrow or triangle to hint\n\t * that activating the button will display a menu.\n\t */\n\tvar JS_MENU_BUTTON = 'mdlext-js-menu-button';\n\tvar MENU_BUTTON_MENU = 'mdlext-menu';\n\tvar MENU_BUTTON_MENU_ITEM = 'mdlext-menu__item';\n\tvar MENU_BUTTON_MENU_ITEM_SEPARATOR = 'mdlext-menu__item-separator';\n\t//const MDL_LAYOUT_CONTENT = 'mdl-layout__content';\n\t\n\t/**\n\t * Creates the menu controlled by the menu button\n\t * @param element\n\t * @return {{element: Element, selected: Element, open: (function(*=)), removeListeners: (function()), downgrade: (function())}}\n\t */\n\t\n\tvar menuFactory = function menuFactory(element) {\n\t\n\t  var ariaControls = null;\n\t  var parentNode = null;\n\t\n\t  var removeAllSelected = function removeAllSelected() {\n\t    [].concat((0, _toConsumableArray3.default)(element.querySelectorAll('.' + MENU_BUTTON_MENU_ITEM + '[aria-selected=\"true\"]'))).forEach(function (selectedItem) {\n\t      return selectedItem.removeAttribute('aria-selected');\n\t    });\n\t  };\n\t\n\t  var setSelected = function setSelected(item) {\n\t    var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t\n\t    if (force || item && !item.hasAttribute('aria-selected')) {\n\t      removeAllSelected();\n\t      if (item) {\n\t        item.setAttribute('aria-selected', 'true');\n\t      }\n\t    }\n\t  };\n\t\n\t  var getSelected = function getSelected() {\n\t    return element.querySelector('.' + MENU_BUTTON_MENU_ITEM + '[aria-selected=\"true\"]');\n\t  };\n\t\n\t  var isDisabled = function isDisabled(item) {\n\t    return item && item.hasAttribute('disabled');\n\t  };\n\t\n\t  var isSeparator = function isSeparator(item) {\n\t    return item && item.classList.contains(MENU_BUTTON_MENU_ITEM_SEPARATOR);\n\t  };\n\t\n\t  var focus = function focus(item) {\n\t    if (item) {\n\t      item = item.closest('.' + MENU_BUTTON_MENU_ITEM);\n\t    }\n\t    if (item) {\n\t      item.focus();\n\t    }\n\t  };\n\t\n\t  var nextItem = function nextItem(current) {\n\t    var n = current.nextElementSibling;\n\t    if (!n) {\n\t      n = element.firstElementChild;\n\t    }\n\t    if (!isDisabled(n) && !isSeparator(n)) {\n\t      focus(n);\n\t    } else {\n\t      var i = element.children.length;\n\t      while (n && i-- > 0) {\n\t        if (isDisabled(n) || isSeparator(n)) {\n\t          n = n.nextElementSibling;\n\t          if (!n) {\n\t            n = element.firstElementChild;\n\t          }\n\t        } else {\n\t          focus(n);\n\t          break;\n\t        }\n\t      }\n\t    }\n\t  };\n\t\n\t  var previousItem = function previousItem(current) {\n\t    var p = current.previousElementSibling;\n\t    if (!p) {\n\t      p = element.lastElementChild;\n\t    }\n\t    if (!isDisabled(p) && !isSeparator(p)) {\n\t      focus(p);\n\t    } else {\n\t      var i = element.children.length;\n\t      while (p && i-- > 0) {\n\t        if (isDisabled(p) || isSeparator(p)) {\n\t          p = p.previousElementSibling;\n\t          if (!p) {\n\t            p = element.lastElementChild;\n\t          }\n\t        } else {\n\t          focus(p);\n\t          break;\n\t        }\n\t      }\n\t    }\n\t  };\n\t\n\t  var firstItem = function firstItem() {\n\t    var item = element.firstElementChild;\n\t    if (isDisabled(item) || isSeparator(item)) {\n\t      nextItem(item);\n\t    } else {\n\t      focus(item);\n\t    }\n\t  };\n\t\n\t  var lastItem = function lastItem() {\n\t    var item = element.lastElementChild;\n\t    if (isDisabled(item) || isSeparator(item)) {\n\t      previousItem(item);\n\t    } else {\n\t      focus(item);\n\t    }\n\t  };\n\t\n\t  var selectItem = function selectItem(item) {\n\t    if (item && !isDisabled(item) && !isSeparator(item)) {\n\t      setSelected(item);\n\t      close(true, item);\n\t    }\n\t  };\n\t\n\t  var keyDownHandler = function keyDownHandler(event) {\n\t\n\t    var item = event.target.closest('.' + MENU_BUTTON_MENU_ITEM);\n\t\n\t    switch (event.keyCode) {\n\t      case _constants.VK_ARROW_UP:\n\t      case _constants.VK_ARROW_LEFT:\n\t        if (item) {\n\t          previousItem(item);\n\t        } else {\n\t          firstItem();\n\t        }\n\t        break;\n\t\n\t      case _constants.VK_ARROW_DOWN:\n\t      case _constants.VK_ARROW_RIGHT:\n\t        if (item) {\n\t          nextItem(item);\n\t        } else {\n\t          lastItem();\n\t        }\n\t        break;\n\t\n\t      case _constants.VK_HOME:\n\t        firstItem();\n\t        break;\n\t\n\t      case _constants.VK_END:\n\t        lastItem();\n\t        break;\n\t\n\t      case _constants.VK_SPACE:\n\t      case _constants.VK_ENTER:\n\t        selectItem(item);\n\t        break;\n\t\n\t      case _constants.VK_ESC:\n\t        close(true);\n\t        break;\n\t\n\t      case _constants.VK_TAB:\n\t        // We do not have a \"natural\" tab order from menu, so the best we can do is to set focus back to the button\n\t        close(true);\n\t        break;\n\t\n\t      default:\n\t        return;\n\t    }\n\t    event.preventDefault();\n\t  };\n\t\n\t  var blurHandler = function blurHandler(event) {\n\t\n\t    // See: https://github.com/facebook/react/issues/2011\n\t    var t = event.relatedTarget || event.explicitOriginalTarget || // FF\n\t    document.activeElement; // IE11\n\t\n\t    //console.log('***** blur, target, relatedTarget', event.target, t);\n\t\n\t    try {\n\t      if (t) {\n\t        if (t.closest('.' + MENU_BUTTON_MENU) !== element && shouldClose(t)) {\n\t          close();\n\t        }\n\t      } else {\n\t        close();\n\t      }\n\t    } catch (err) {\n\t      // FF throws error: \"TypeError: n.closest is not a function\" if related target is a text node\n\t      close();\n\t    }\n\t  };\n\t\n\t  var clickHandler = function clickHandler(event) {\n\t    //console.log('***** click, target', event.target);\n\t\n\t    event.preventDefault();\n\t    var t = event.target;\n\t    if (t && t.closest('.' + MENU_BUTTON_MENU) === element) {\n\t      var item = t.closest('.' + MENU_BUTTON_MENU_ITEM);\n\t      if (item) {\n\t        selectItem(item);\n\t      }\n\t    } else {\n\t      if (shouldClose(t)) {\n\t        close();\n\t      }\n\t    }\n\t  };\n\t\n\t  var touchStartHandler = function touchStartHandler(event) {\n\t    //console.log('***** touchStart, target', event.target);\n\t\n\t    var t = event.target;\n\t    if (!(t && t.closest('.' + MENU_BUTTON_MENU) === element)) {\n\t      if (event.type === 'touchstart') {\n\t        event.preventDefault();\n\t      }\n\t      close();\n\t    }\n\t  };\n\t\n\t  var addListeners = function addListeners() {\n\t    element.addEventListener('keydown', keyDownHandler, false);\n\t    element.addEventListener('blur', blurHandler, true);\n\t    element.addEventListener('click', clickHandler, true);\n\t    document.documentElement.addEventListener('touchstart', touchStartHandler, true);\n\t  };\n\t\n\t  var _removeListeners = function _removeListeners() {\n\t    element.removeEventListener('keydown', keyDownHandler, false);\n\t    element.removeEventListener('blur', blurHandler, true);\n\t    element.removeEventListener('click', clickHandler, true);\n\t    document.documentElement.removeEventListener('touchstart', touchStartHandler, true);\n\t  };\n\t\n\t  var _open = function _open(controlElement) {\n\t    var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'first';\n\t\n\t\n\t    ariaControls = controlElement.closest('.' + JS_MENU_BUTTON);\n\t\n\t    element.style['min-width'] = Math.max(124, controlElement.getBoundingClientRect().width) + 'px';\n\t    element.removeAttribute('hidden');\n\t    (0, _domUtils.tether)(controlElement, element);\n\t\n\t    var item = void 0;\n\t    switch (position.toLowerCase()) {\n\t      case 'first':\n\t        firstItem();\n\t        break;\n\t\n\t      case 'last':\n\t        lastItem();\n\t        break;\n\t\n\t      case 'selected':\n\t        item = getSelected();\n\t        if (item && !item.hasAttribute('disabled')) {\n\t          focus(item);\n\t        } else {\n\t          firstItem();\n\t        }\n\t        break;\n\t    }\n\t\n\t    addListeners();\n\t  };\n\t\n\t  var shouldClose = function shouldClose(target) {\n\t    //console.log('***** shouldClose');\n\t\n\t    var result = false;\n\t    var btn = target && target.closest('.' + JS_MENU_BUTTON) || null;\n\t    if (!btn) {\n\t      result = true;\n\t    } else if (btn.getAttribute('aria-controls') === element.id) {\n\t      if (btn !== ariaControls) {\n\t        result = true;\n\t      }\n\t    } else {\n\t      result = true;\n\t    }\n\t    return result;\n\t  };\n\t\n\t  var close = function close() {\n\t    var forceFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t    var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t\n\t    _removeListeners();\n\t\n\t    element.dispatchEvent(new CustomEvent('_closemenu', {\n\t      bubbles: true,\n\t      cancelable: true,\n\t      detail: { forceFocus: forceFocus, item: item }\n\t    }));\n\t  };\n\t\n\t  var addWaiAria = function addWaiAria() {\n\t    if (!element.hasAttribute('id')) {\n\t      // Generate a random id\n\t      element.id = 'menu-button-' + (0, _stringUtils.randomString)();\n\t    }\n\t    element.setAttribute('tabindex', '-1');\n\t    element.setAttribute('role', 'menu');\n\t    element.setAttribute('hidden', '');\n\t\n\t    [].concat((0, _toConsumableArray3.default)(element.querySelectorAll('.' + MENU_BUTTON_MENU_ITEM))).forEach(function (menuitem) {\n\t      menuitem.setAttribute('tabindex', '-1');\n\t      menuitem.setAttribute('role', 'menuitem');\n\t    });\n\t\n\t    [].concat((0, _toConsumableArray3.default)(element.querySelectorAll('.' + MENU_BUTTON_MENU_ITEM_SEPARATOR))).forEach(function (menuitem) {\n\t      menuitem.setAttribute('role', 'separator');\n\t    });\n\t  };\n\t\n\t  var init = function init() {\n\t    addWaiAria();\n\t    parentNode = element.parentNode;\n\t    element.classList.add('is-upgraded');\n\t  };\n\t\n\t  var _downgrade = function _downgrade() {\n\t    _removeListeners();\n\t    if (element.parentNode !== parentNode) {\n\t      parentNode.appendChild(element);\n\t    }\n\t    element.classList.remove('is-upgraded');\n\t  };\n\t\n\t  init();\n\t\n\t  return {\n\t    /**\n\t     * Get the menu element\n\t     * @returns {Element} the menu element\n\t     */\n\t    get element() {\n\t      return element;\n\t    },\n\t\n\t    /**\n\t     * Set selected menu item\n\t     * @param item\n\t     */\n\t    set selected(item) {\n\t      setSelected(item, true);\n\t    },\n\t\n\t    /**\n\t     * Open menu\n\t     * @param {Element} controlElement the element where the menu should be aligned to\n\t     * @param {String} position menuElement item to receive focus after menu element is opened\n\t     */\n\t    open: function open(controlElement) {\n\t      var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'first';\n\t      return _open(controlElement, position);\n\t    },\n\t\n\t    /**\n\t     * Remove event listeners.\n\t     */\n\t    removeListeners: function removeListeners() {\n\t      return _removeListeners();\n\t    },\n\t\n\t    /**\n\t     * Downgrade menu\n\t     */\n\t    downgrade: function downgrade() {\n\t      return _downgrade();\n\t    }\n\t  };\n\t};\n\t\n\t/**\n\t * The menubutton component\n\t */\n\t\n\tvar MenuButton = function () {\n\t  function MenuButton(element) {\n\t    var _this = this;\n\t\n\t    (0, _classCallCheck3.default)(this, MenuButton);\n\t\n\t    this.keyDownHandler = function (event) {\n\t      if (!_this.isDisabled()) {\n\t        switch (event.keyCode) {\n\t          case _constants.VK_ARROW_UP:\n\t            _this.openMenu('last');\n\t            break;\n\t\n\t          case _constants.VK_ARROW_DOWN:\n\t            _this.openMenu();\n\t            break;\n\t\n\t          case _constants.VK_SPACE:\n\t          case _constants.VK_ENTER:\n\t            _this.openMenu('selected');\n\t            break;\n\t\n\t          case _constants.VK_ESC:\n\t            _this.closeMenu();\n\t            break;\n\t\n\t          case _constants.VK_TAB:\n\t            _this.closeMenu();\n\t            return;\n\t\n\t          default:\n\t            return;\n\t        }\n\t      }\n\t      //event.stopPropagation();\n\t      event.preventDefault();\n\t    };\n\t\n\t    this.clickHandler = function () {\n\t      if (!_this.isDisabled()) {\n\t        if (_this.element.getAttribute('aria-expanded').toLowerCase() === 'true') {\n\t          _this.closeMenu(true);\n\t        } else {\n\t          _this.openMenu('selected');\n\t        }\n\t      }\n\t    };\n\t\n\t    this.recalcMenuPosition = (0, _fullThrottle2.default)(function () {\n\t      var c = _this.focusElement.getBoundingClientRect();\n\t      var dx = _this.focusElementLastScrollPosition.left - c.left;\n\t      var dy = _this.focusElementLastScrollPosition.top - c.top;\n\t      var left = (parseFloat(_this.menu.element.style.left) || 0) - dx;\n\t      var top = (parseFloat(_this.menu.element.style.top) || 0) - dy;\n\t\n\t      _this.menu.element.style.left = left + 'px';\n\t      _this.menu.element.style.top = top + 'px';\n\t      _this.focusElementLastScrollPosition = c;\n\t    });\n\t\n\t    this.positionChangeHandler = function () {\n\t      _this.recalcMenuPosition(_this);\n\t    };\n\t\n\t    this.closeMenuHandler = function (event) {\n\t      if (event && event.detail) {\n\t        if (event.detail.item && event.detail.item !== _this.selectedItem) {\n\t          _this.selectedItem = event.detail.item;\n\t          _this.dispatchMenuSelect();\n\t        }\n\t        _this.closeMenu(event.detail.forceFocus);\n\t      }\n\t    };\n\t\n\t    this.element = element;\n\t    this.focusElement = undefined;\n\t    this.focusElementLastScrollPosition = undefined;\n\t    this.scrollElements = [];\n\t    this.menu = undefined;\n\t    this.selectedItem = null;\n\t    this.init();\n\t  }\n\t\n\t  /**\n\t   * Re-position menu if content is scrolled, window is resized or orientation change\n\t   * @see https://javascriptweblog.wordpress.com/2015/11/02/of-classes-and-arrow-functions-a-cautionary-tale/\n\t   */\n\t\n\t\n\t  (0, _createClass3.default)(MenuButton, [{\n\t    key: 'dispatchMenuSelect',\n\t    value: function dispatchMenuSelect() {\n\t      this.element.dispatchEvent(new CustomEvent('menuselect', {\n\t        bubbles: true,\n\t        cancelable: true,\n\t        detail: { source: this.selectedItem }\n\t      }));\n\t    }\n\t  }, {\n\t    key: 'isDisabled',\n\t    value: function isDisabled() {\n\t      return this.element.hasAttribute('disabled');\n\t    }\n\t  }, {\n\t    key: 'removeListeners',\n\t    value: function removeListeners() {\n\t      this.element.removeEventListener('keydown', this.keyDownHandler);\n\t      this.element.removeEventListener('click', this.clickHandler);\n\t    }\n\t  }, {\n\t    key: 'openMenu',\n\t    value: function openMenu() {\n\t      var _this2 = this;\n\t\n\t      var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'first';\n\t\n\t\n\t      if (!this.isDisabled() && this.menu) {\n\t\n\t        // Close the menu if button position change\n\t        this.scrollElements = (0, _domUtils.getScrollParents)(this.element);\n\t        this.scrollElements.forEach(function (el) {\n\t          return el.addEventListener('scroll', _this2.positionChangeHandler);\n\t        });\n\t\n\t        window.addEventListener('resize', this.positionChangeHandler);\n\t        window.addEventListener('orientationchange', this.positionChangeHandler);\n\t        this.menu.element.addEventListener('_closemenu', this.closeMenuHandler);\n\t\n\t        this.menu.selected = this.selectedItem;\n\t        this.menu.open(this.focusElement, position);\n\t        this.element.setAttribute('aria-expanded', 'true');\n\t\n\t        this.focusElementLastScrollPosition = this.focusElement.getBoundingClientRect();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'closeMenu',\n\t    value: function closeMenu() {\n\t      var _this3 = this;\n\t\n\t      var forceFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t\n\t      if (this.menu) {\n\t        this.menu.removeListeners();\n\t        this.scrollElements.forEach(function (el) {\n\t          return el.removeEventListener('scroll', _this3.positionChangeHandler);\n\t        });\n\t        window.removeEventListener('resize', this.positionChangeHandler);\n\t        window.removeEventListener('orientationchange', this.positionChangeHandler);\n\t        this.menu.element.removeEventListener('_closemenu', this.closeMenuHandler);\n\t\n\t        if (forceFocus) {\n\t          this.focus();\n\t        }\n\t        this.element.setAttribute('aria-expanded', 'false');\n\t        this.menu.element.setAttribute('hidden', '');\n\t      }\n\t    }\n\t  }, {\n\t    key: 'focus',\n\t    value: function focus() {\n\t      if (!this.isDisabled()) {\n\t        this.focusElement.focus();\n\t      }\n\t    }\n\t  }, {\n\t    key: 'init',\n\t    value: function init() {\n\t      var _this4 = this;\n\t\n\t      var addListeners = function addListeners() {\n\t        _this4.element.addEventListener('keydown', _this4.keyDownHandler);\n\t        _this4.element.addEventListener('click', _this4.clickHandler);\n\t      };\n\t\n\t      var addWaiAria = function addWaiAria() {\n\t        _this4.element.setAttribute('role', 'button');\n\t        _this4.element.setAttribute('aria-expanded', 'false');\n\t        _this4.element.setAttribute('aria-haspopup', 'true');\n\t      };\n\t\n\t      var addFocusElement = function addFocusElement() {\n\t        _this4.focusElement = _this4.element.querySelector('input[type=\"text\"]');\n\t        if (!_this4.focusElement) {\n\t          _this4.focusElement = _this4.element;\n\t\n\t          if (!(_this4.focusElement.tagName.toLowerCase() === 'button' || _this4.focusElement.tagName.toLowerCase() === 'input')) {\n\t            if (!_this4.focusElement.hasAttribute('tabindex')) {\n\t              _this4.focusElement.setAttribute('tabindex', '0');\n\t            }\n\t          }\n\t        }\n\t      };\n\t\n\t      var moveElementToDocumentBody = function moveElementToDocumentBody(element) {\n\t        // To position an element on top of all other z-indexed elements, the element should be moved to document.body\n\t        //       See: https://philipwalton.com/articles/what-no-one-told-you-about-z-index/\n\t\n\t        if (element.parentNode !== document.body) {\n\t          return document.body.appendChild(element);\n\t        }\n\t        return element;\n\t      };\n\t\n\t      var findMenuElement = function findMenuElement() {\n\t        var menuElement = void 0;\n\t        var menuElementId = _this4.element.getAttribute('aria-controls');\n\t        if (menuElementId !== null) {\n\t          menuElement = document.querySelector('#' + menuElementId);\n\t        } else {\n\t          menuElement = _this4.element.parentNode.querySelector('.' + MENU_BUTTON_MENU);\n\t        }\n\t        return menuElement;\n\t      };\n\t\n\t      var addMenu = function addMenu() {\n\t        var menuElement = findMenuElement();\n\t        if (menuElement) {\n\t          if (menuElement.componentInstance) {\n\t            _this4.menu = menuElement.componentInstance;\n\t          } else {\n\t            _this4.menu = menuFactory(menuElement);\n\t            menuElement.componentInstance = _this4.menu;\n\t            moveElementToDocumentBody(menuElement);\n\t          }\n\t          _this4.element.setAttribute('aria-controls', _this4.menu.element.id);\n\t        }\n\t      };\n\t\n\t      addFocusElement();\n\t      addWaiAria();\n\t      addMenu();\n\t      this.removeListeners();\n\t      addListeners();\n\t    }\n\t  }, {\n\t    key: 'downgrade',\n\t    value: function downgrade() {\n\t      var _this5 = this;\n\t\n\t      if (this.menu) {\n\t        // Do not downgrade menu if there are other buttons sharing this menu\n\t        var related = [].concat((0, _toConsumableArray3.default)(document.querySelectorAll('.' + JS_MENU_BUTTON + '[aria-controls=\"' + this.element.getAttribute('aria-controls') + '\"]')));\n\t        if (related.filter(function (c) {\n\t          return c !== _this5.element && c.getAttribute('data-upgraded').indexOf('MaterialExtMenuButton') >= 0;\n\t        }).length === 0) {\n\t          this.menu.downgrade();\n\t        }\n\t      }\n\t      this.removeListeners();\n\t    }\n\t  }]);\n\t  return MenuButton;\n\t}();\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  /**\n\t   * https://github.com/google/material-design-lite/issues/4205\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t\n\t  var MaterialExtMenuButton = function MaterialExtMenuButton(element) {\n\t    this.element_ = element;\n\t    this.menuButton_ = null;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t  window['MaterialExtMenuButton'] = MaterialExtMenuButton;\n\t\n\t  // Public methods.\n\t\n\t  /**\n\t   * Get the menu element controlled by this button, null if no menu is controlled by this button\n\t   * @public\n\t   */\n\t  MaterialExtMenuButton.prototype.getMenuElement = function () {\n\t    return this.menuButton_.menu ? this.menuButton_.menu.element : null;\n\t  };\n\t  MaterialExtMenuButton.prototype['getMenuElement'] = MaterialExtMenuButton.prototype.getMenuElement;\n\t\n\t  /**\n\t   * Open menu\n\t   * @public\n\t   * @param {String} position one of \"first\", \"last\" or \"selected\"\n\t   */\n\t  MaterialExtMenuButton.prototype.openMenu = function (position) {\n\t    this.menuButton_.openMenu(position);\n\t  };\n\t  MaterialExtMenuButton.prototype['openMenu'] = MaterialExtMenuButton.prototype.openMenu;\n\t\n\t  /**\n\t   * Close menu\n\t   * @public\n\t   */\n\t  MaterialExtMenuButton.prototype.closeMenu = function () {\n\t    this.menuButton_.closeMenu(true);\n\t  };\n\t  MaterialExtMenuButton.prototype['closeMenu'] = MaterialExtMenuButton.prototype.closeMenu;\n\t\n\t  /**\n\t   * Get selected menu item\n\t   * @public\n\t   * @returns {Element} The selected menu item or null if no item selected\n\t   */\n\t  MaterialExtMenuButton.prototype.getSelectedMenuItem = function () {\n\t    return this.menuButton_.selectedItem;\n\t  };\n\t  MaterialExtMenuButton.prototype['getSelectedMenuItem'] = MaterialExtMenuButton.prototype.getSelectedMenuItem;\n\t\n\t  /**\n\t   * Set (default) selected menu item\n\t   * @param {Element} item\n\t   */\n\t  MaterialExtMenuButton.prototype.setSelectedMenuItem = function (item) {\n\t    this.menuButton_.selectedItem = item;\n\t  };\n\t  MaterialExtMenuButton.prototype['setSelectedMenuItem'] = MaterialExtMenuButton.prototype.setSelectedMenuItem;\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtMenuButton.prototype.init = function () {\n\t    if (this.element_) {\n\t      this.menuButton_ = new MenuButton(this.element_);\n\t      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n\t      this.element_.classList.add(_constants.IS_UPGRADED);\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   */\n\t  MaterialExtMenuButton.prototype.mdlDowngrade_ = function () {\n\t    this.menuButton_.downgrade();\n\t  };\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtMenuButton,\n\t    classAsString: 'MaterialExtMenuButton',\n\t    cssClass: JS_MENU_BUTTON,\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _stringUtils = __webpack_require__(15);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\t/**\n\t * @license\n\t * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t *      http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t *\n\t * This code is built with Google Material Design Lite,\n\t * which is Licensed under the Apache License, Version 2.0\n\t */\n\t\n\t/*\n\t * Copied/Modified from https://github.com/google/material-design-lite/tree/master/src/textfield\n\t */\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  var LABEL = 'mdlext-selectfield__label';\n\t  var INPUT = 'mdlext-selectfield__select';\n\t\n\t  /**\n\t   * Class constructor for Selectfield MDLEXT component.\n\t   * Implements MDL component design pattern defined at:\n\t   * https://github.com/jasonmayes/mdl-component-design-pattern\n\t   *\n\t   * @constructor\n\t   * @param {HTMLElement} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtSelectfield = function MaterialExtSelectfield(element) {\n\t    this.element_ = element;\n\t    this.init(); // Initialize instance.\n\t  };\n\t\n\t  window['MaterialExtSelectfield'] = MaterialExtSelectfield;\n\t\n\t  /**\n\t   * Handle focus.\n\t   *\n\t   * @param {Event} event The event that fired.\n\t   * @private\n\t   */\n\t  /*eslint no-unused-vars: 0*/\n\t  MaterialExtSelectfield.prototype.onFocus_ = function () /*event*/{\n\t    this.element_.classList.add(_constants.IS_FOCUSED);\n\t  };\n\t\n\t  /**\n\t   * Handle lost focus.\n\t   *\n\t   * @param {Event} event The event that fired.\n\t   * @private\n\t   */\n\t  /*eslint no-unused-vars: 0*/\n\t  MaterialExtSelectfield.prototype.onBlur_ = function () /*event*/{\n\t    this.element_.classList.remove(_constants.IS_FOCUSED);\n\t  };\n\t\n\t  /**\n\t   * Handle reset event from out side.\n\t   *\n\t   * @param {Event} event The event that fired.\n\t   * @private\n\t   */\n\t  MaterialExtSelectfield.prototype.onReset_ = function () /*event*/{\n\t    this.updateClasses_();\n\t  };\n\t\n\t  /**\n\t   * Handle class updates.\n\t   *\n\t   * @private\n\t   */\n\t  MaterialExtSelectfield.prototype.updateClasses_ = function () {\n\t    this.checkDisabled();\n\t    this.checkValidity();\n\t    this.checkDirty();\n\t    this.checkFocus();\n\t  };\n\t\n\t  // Public methods.\n\t\n\t  /**\n\t   * Check the disabled state and update field accordingly.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.checkDisabled = function () {\n\t    if (this.select_.disabled) {\n\t      this.element_.classList.add(_constants.IS_DISABLED);\n\t    } else {\n\t      this.element_.classList.remove(_constants.IS_DISABLED);\n\t    }\n\t  };\n\t  MaterialExtSelectfield.prototype['checkDisabled'] = MaterialExtSelectfield.prototype.checkDisabled;\n\t\n\t  /**\n\t   * Check the focus state and update field accordingly.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.checkFocus = function () {\n\t    // Note: element.querySelector(':focus') always return null in JsDom, even if select element has focus\n\t    /*eslint no-extra-boolean-cast: 0*/\n\t    if (Boolean(this.element_.querySelector(':focus'))) {\n\t      this.element_.classList.add(_constants.IS_FOCUSED);\n\t    } else {\n\t      this.element_.classList.remove(_constants.IS_FOCUSED);\n\t    }\n\t  };\n\t\n\t  MaterialExtSelectfield.prototype['checkFocus'] = MaterialExtSelectfield.prototype.checkFocus;\n\t\n\t  /**\n\t   * Check the validity state and update field accordingly.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.checkValidity = function () {\n\t\n\t    /* Don't think it makes any sense to check validity.\n\t       Tests I've done, so far, indicates that setting an illegal value via JS returns selectedIndex=0\n\t     if (this.select_.validity) {\n\t      if (this.select_.validity.valid) {\n\t        this.element_.classList.remove(this.CssClasses_.IS_INVALID);\n\t      } else {\n\t        this.element_.classList.add(this.CssClasses_.IS_INVALID);\n\t      }\n\t    }\n\t    */\n\t  };\n\t\n\t  MaterialExtSelectfield.prototype['checkValidity'] = MaterialExtSelectfield.prototype.checkValidity;\n\t\n\t  /**\n\t   * Check the dirty state and update field accordingly.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.checkDirty = function () {\n\t    if (this.select_.value && this.select_.value.length > 0) {\n\t      this.element_.classList.add(_constants.IS_DIRTY);\n\t    } else {\n\t      this.element_.classList.remove(_constants.IS_DIRTY);\n\t    }\n\t  };\n\t\n\t  MaterialExtSelectfield.prototype['checkDirty'] = MaterialExtSelectfield.prototype.checkDirty;\n\t\n\t  /**\n\t   * Disable select field.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.disable = function () {\n\t    this.select_.disabled = true;\n\t    this.updateClasses_();\n\t  };\n\t\n\t  MaterialExtSelectfield.prototype['disable'] = MaterialExtSelectfield.prototype.disable;\n\t\n\t  /**\n\t   * Enable select field.\n\t   *\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.enable = function () {\n\t    this.select_.disabled = false;\n\t    this.updateClasses_();\n\t  };\n\t\n\t  MaterialExtSelectfield.prototype['enable'] = MaterialExtSelectfield.prototype.enable;\n\t\n\t  /**\n\t   * Update select field value.\n\t   *\n\t   * @param {string} value The value to which to set the control (optional).\n\t   * @public\n\t   */\n\t  MaterialExtSelectfield.prototype.change = function (value) {\n\t    this.select_.value = value || '';\n\t    this.updateClasses_();\n\t  };\n\t  MaterialExtSelectfield.prototype['change'] = MaterialExtSelectfield.prototype.change;\n\t\n\t  /**\n\t   * Initialize element.\n\t   */\n\t  MaterialExtSelectfield.prototype.init = function () {\n\t    if (this.element_) {\n\t      this.label_ = this.element_.querySelector('.' + LABEL);\n\t      this.select_ = this.element_.querySelector('.' + INPUT);\n\t\n\t      if (this.select_) {\n\t        // Remove listeners, just in case ...\n\t        this.select_.removeEventListener('change', this.updateClasses_);\n\t        this.select_.removeEventListener('focus', this.onFocus_);\n\t        this.select_.removeEventListener('blur', this.onBlur_);\n\t        this.select_.removeEventListener('reset', this.onReset_);\n\t\n\t        this.select_.addEventListener('change', this.updateClasses_.bind(this));\n\t        this.select_.addEventListener('focus', this.onFocus_.bind(this));\n\t        this.select_.addEventListener('blur', this.onBlur_.bind(this));\n\t        this.select_.addEventListener('reset', this.onReset_.bind(this));\n\t\n\t        if (this.label_) {\n\t          var id = void 0;\n\t          if (!this.select_.hasAttribute('id')) {\n\t            id = 'select-' + (0, _stringUtils.randomString)();\n\t            this.select_.id = id;\n\t          } else {\n\t            id = this.select_.id;\n\t          }\n\t\n\t          if (!this.label_.hasAttribute('for')) {\n\t            this.label_.setAttribute('for', id);\n\t          }\n\t        }\n\t\n\t        var invalid = this.element_.classList.contains(_constants.IS_INVALID);\n\t        this.updateClasses_();\n\t        this.element_.classList.add(_constants.IS_UPGRADED);\n\t\n\t        if (invalid) {\n\t          this.element_.classList.add(_constants.IS_INVALID);\n\t        }\n\t        if (this.select_.hasAttribute('autofocus')) {\n\t          this.element_.focus();\n\t          this.checkFocus();\n\t        }\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   *\n\t   * Nothing to downgrade\n\t   *\n\t  MaterialExtSelectfield.prototype.mdlDowngrade_ = function() {\n\t    'use strict';\n\t    console.log('***** MaterialExtSelectfield.mdlDowngrade ');\n\t  };\n\t  */\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /*eslint no-undef: 0*/\n\t  componentHandler.register({\n\t    constructor: MaterialExtSelectfield,\n\t    classAsString: 'MaterialExtSelectfield',\n\t    cssClass: 'mdlext-js-selectfield',\n\t    widget: true\n\t  });\n\t})();\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _fullThrottle = __webpack_require__(13);\n\t\n\tvar _fullThrottle2 = _interopRequireDefault(_fullThrottle);\n\t\n\tvar _jsonUtils = __webpack_require__(14);\n\t\n\tvar _constants = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t(function () {\n\t  'use strict';\n\t\n\t  var MDL_LAYOUT_CONTENT = 'mdl-layout__content';\n\t  var IS_SCROLL_CLASS = 'mdlext-is-scroll';\n\t\n\t  /**\n\t   * @constructor\n\t   * @param {Element} element The element that will be upgraded.\n\t   */\n\t  var MaterialExtStickyHeader = function MaterialExtStickyHeader(element) {\n\t    // Stores the element.\n\t    this.header_ = element;\n\t\n\t    // Heder listens to scroll events from content\n\t    this.content_ = null;\n\t    this.lastScrollTop_ = 0;\n\t\n\t    // Default config\n\t    this.config_ = {\n\t      visibleAtScrollEnd: false\n\t    };\n\t\n\t    this.mutationObserver_ = null;\n\t\n\t    this.drawing_ = false;\n\t\n\t    // Initialize instance.\n\t    this.init();\n\t  };\n\t\n\t  window['MaterialExtStickyHeader'] = MaterialExtStickyHeader;\n\t\n\t  /**\n\t   * Update header width\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.recalcWidth_ = function () {\n\t    this.header_.style.width = this.content_.clientWidth + 'px';\n\t  };\n\t\n\t  var throttleResize = (0, _fullThrottle2.default)(function (self) {\n\t    return self.recalcWidth_();\n\t  });\n\t\n\t  /**\n\t   * Adjust header width when window resizes or oreientation changes\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.resizeHandler_ = function () /* event */{\n\t    throttleResize(this);\n\t  };\n\t\n\t  /**\n\t   * Update header position\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.reposition_ = function () {\n\t\n\t    var currentContentScrollTop = this.content_.scrollTop;\n\t    var scrollDiff = this.lastScrollTop_ - currentContentScrollTop;\n\t\n\t    if (currentContentScrollTop <= 0) {\n\t      // Scrolled to the top. Header sticks to the top\n\t      this.header_.style.top = '0';\n\t      this.header_.classList.remove(IS_SCROLL_CLASS);\n\t    } else if (scrollDiff > 0) {\n\t\n\t      if (scrollDiff >= this.header_.offsetHeight) {\n\t\n\t        // Scrolled up. Header slides in\n\t        var headerTop = parseInt(window.getComputedStyle(this.header_).getPropertyValue('top')) || 0;\n\t        if (headerTop != 0) {\n\t          this.header_.style.top = '0';\n\t          this.header_.classList.add(IS_SCROLL_CLASS);\n\t        }\n\t        this.lastScrollTop_ = currentContentScrollTop;\n\t      }\n\t      return;\n\t    } else if (scrollDiff < 0) {\n\t      // Scrolled down\n\t      this.header_.classList.add(IS_SCROLL_CLASS);\n\t      var _headerTop = parseInt(window.getComputedStyle(this.header_).getPropertyValue('top')) || 0;\n\t\n\t      if (this.content_.scrollHeight - this.content_.scrollTop <= this.content_.offsetHeight) {\n\t        // Bottom of content\n\t        if (_headerTop != 0) {\n\t          this.header_.style.top = this.config_.visibleAtScrollEnd ? '0' : '-' + this.header_.offsetHeight + 'px';\n\t        }\n\t      } else {\n\t        _headerTop += scrollDiff;\n\t        var offsetHeight = this.header_.offsetHeight;\n\t        this.header_.style.top = (Math.abs(_headerTop) > offsetHeight ? -offsetHeight : _headerTop) + 'px';\n\t      }\n\t    }\n\t\n\t    this.lastScrollTop_ = currentContentScrollTop;\n\t  };\n\t\n\t  var throttleScroll = (0, _fullThrottle2.default)(function (self) {\n\t    return self.reposition_();\n\t  });\n\t\n\t  /**\n\t   * Scroll header when content scrolls\n\t   * @param event\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.scrollHandler_ = function () /* event */{\n\t    throttleScroll(this);\n\t  };\n\t\n\t  /**\n\t   * Init header position\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.updatePosition_ = function () /* event */{\n\t    this.recalcWidth_();\n\t    this.reposition_();\n\t  };\n\t\n\t  /**\n\t   * Add mutation observer\n\t   * @private\n\t   */\n\t  MaterialExtStickyHeader.prototype.addMutationObserver_ = function () {\n\t    var _this = this;\n\t\n\t    // jsdom does not support MutationObserver - so this is not testable\n\t    /* istanbul ignore next */\n\t    this.mutationObserver_ = new MutationObserver(function () /*mutations*/{\n\t      // Adjust header width if content changes (e.g. in a SPA)\n\t      _this.updatePosition_();\n\t    });\n\t\n\t    this.mutationObserver_.observe(this.content_, {\n\t      attributes: false,\n\t      childList: true,\n\t      characterData: false,\n\t      subtree: true\n\t    });\n\t  };\n\t\n\t  /**\n\t  * Removes event listeners\n\t  * @private\n\t  */\n\t  MaterialExtStickyHeader.prototype.removeListeners_ = function () {\n\t\n\t    window.removeEventListener('resize', this.resizeHandler_);\n\t    window.removeEventListener('orientationchange', this.resizeHandler_);\n\t\n\t    if (this.content_) {\n\t      this.content_.removeEventListener('scroll', this.scrollHandler_);\n\t    }\n\t\n\t    if (this.mutationObserver_) {\n\t      this.mutationObserver_.disconnect();\n\t      this.mutationObserver_ = null;\n\t    }\n\t  };\n\t\n\t  /**\n\t   * Initialize component\n\t   */\n\t  MaterialExtStickyHeader.prototype.init = function () {\n\t\n\t    if (this.header_) {\n\t\n\t      this.removeListeners_();\n\t\n\t      if (this.header_.hasAttribute('data-config')) {\n\t        this.config_ = (0, _jsonUtils.jsonStringToObject)(this.header_.getAttribute('data-config'));\n\t      }\n\t\n\t      this.content_ = this.header_.parentNode.querySelector('.' + MDL_LAYOUT_CONTENT) || null;\n\t\n\t      if (this.content_) {\n\t        this.content_.style.paddingTop = this.header_.offsetHeight + 'px'; // Make room for sticky header\n\t        this.lastScrollTop_ = this.content_.scrollTop;\n\t\n\t        this.content_.addEventListener('scroll', this.scrollHandler_.bind(this));\n\t        window.addEventListener('resize', this.resizeHandler_.bind(this));\n\t        window.addEventListener('orientationchange', this.resizeHandler_.bind(this));\n\t\n\t        this.addMutationObserver_();\n\t        this.updatePosition_();\n\t\n\t        // Set upgraded flag\n\t        this.header_.classList.add(_constants.IS_UPGRADED);\n\t      }\n\t    }\n\t  };\n\t\n\t  /*\n\t   * Downgrade component\n\t   * E.g remove listeners and clean up resources\n\t   *\n\t   * Nothing to clean\n\t   *\n\t   MaterialExtStickyHeader.prototype.mdlDowngrade_ = function() {\n\t     'use strict';\n\t     console.log('***** MaterialExtStickyHeader.prototype.mdlDowngrade_');\n\t   };\n\t   */\n\t\n\t  // The component registers itself. It can assume componentHandler is available\n\t  // in the global scope.\n\t  /* eslint no-undef: 0 */\n\t  componentHandler.register({\n\t    constructor: MaterialExtStickyHeader,\n\t    classAsString: 'MaterialExtStickyHeader',\n\t    cssClass: 'mdlext-js-sticky-header'\n\t  });\n\t})(); /**\n\t       * @license\n\t       * Copyright 2016 Leif Olsen. All Rights Reserved.\n\t       *\n\t       * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t       * you may not use this file except in compliance with the License.\n\t       * You may obtain a copy of the License at\n\t       *\n\t       *      http://www.apache.org/licenses/LICENSE-2.0\n\t       *\n\t       * Unless required by applicable law or agreed to in writing, software\n\t       * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t       * See the License for the specific language governing permissions and\n\t       * limitations under the License.\n\t       *\n\t       * This code is built with Google Material Design Lite,\n\t       * which is Licensed under the Apache License, Version 2.0\n\t       */\n\t\n\t/**\n\t * A sticky header makes site navigation easily accessible anywhere on the page and saves content space at the same.\n\t * The header should auto-hide, i.e. hiding the header automatically when a user starts scrolling down the page and\n\t * bringing the header back when a user might need it: they reach the bottom of the page or start scrolling up.\n\t */\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t__webpack_require__(2);\n\t\n\t__webpack_require__(21);\n\t\n\t__webpack_require__(15);\n\t\n\t__webpack_require__(14);\n\t\n\t__webpack_require__(13);\n\t\n\t__webpack_require__(29);\n\t\n\t__webpack_require__(30);\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(68), __esModule: true };\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(70), __esModule: true };\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(72), __esModule: true };\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(74), __esModule: true };\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(75), __esModule: true };\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(76), __esModule: true };\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(77), __esModule: true };\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _isIterable2 = __webpack_require__(61);\n\t\n\tvar _isIterable3 = _interopRequireDefault(_isIterable2);\n\t\n\tvar _getIterator2 = __webpack_require__(31);\n\t\n\tvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = function () {\n\t  function sliceIterator(arr, i) {\n\t    var _arr = [];\n\t    var _n = true;\n\t    var _d = false;\n\t    var _e = undefined;\n\t\n\t    try {\n\t      for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t        _arr.push(_s.value);\n\t\n\t        if (i && _arr.length === i) break;\n\t      }\n\t    } catch (err) {\n\t      _d = true;\n\t      _e = err;\n\t    } finally {\n\t      try {\n\t        if (!_n && _i[\"return\"]) _i[\"return\"]();\n\t      } finally {\n\t        if (_d) throw _e;\n\t      }\n\t    }\n\t\n\t    return _arr;\n\t  }\n\t\n\t  return function (arr, i) {\n\t    if (Array.isArray(arr)) {\n\t      return arr;\n\t    } else if ((0, _isIterable3.default)(Object(arr))) {\n\t      return sliceIterator(arr, i);\n\t    } else {\n\t      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t    }\n\t  };\n\t}();\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(28);\n\t__webpack_require__(104);\n\tmodule.exports = __webpack_require__(1).Array.from;\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(48);\n\t__webpack_require__(28);\n\tmodule.exports = __webpack_require__(102);\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(48);\n\t__webpack_require__(28);\n\tmodule.exports = __webpack_require__(103);\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(106);\n\tmodule.exports = __webpack_require__(1).Number.isInteger;\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(107);\n\tmodule.exports = __webpack_require__(1).Number.isNaN;\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(108);\n\tmodule.exports = __webpack_require__(1).Object.assign;\n\n/***/ },\n/* 74 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(109);\n\tvar $Object = __webpack_require__(1).Object;\n\tmodule.exports = function defineProperty(it, key, desc){\n\t  return $Object.defineProperty(it, key, desc);\n\t};\n\n/***/ },\n/* 75 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(112);\n\tmodule.exports = __webpack_require__(1).Object.entries;\n\n/***/ },\n/* 76 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(110);\n\tmodule.exports = __webpack_require__(1).Object.keys;\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(111);\n\tmodule.exports = __webpack_require__(1).Reflect.apply;\n\n/***/ },\n/* 78 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(){ /* empty */ };\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// false -> Array#indexOf\n\t// true  -> Array#includes\n\tvar toIObject = __webpack_require__(19)\n\t  , toLength  = __webpack_require__(45)\n\t  , toIndex   = __webpack_require__(100);\n\tmodule.exports = function(IS_INCLUDES){\n\t  return function($this, el, fromIndex){\n\t    var O      = toIObject($this)\n\t      , length = toLength(O.length)\n\t      , index  = toIndex(fromIndex, length)\n\t      , value;\n\t    // Array#includes uses SameValueZero equality algorithm\n\t    if(IS_INCLUDES && el != el)while(length > index){\n\t      value = O[index++];\n\t      if(value != value)return true;\n\t    // Array#toIndex ignores holes, Array#includes - not\n\t    } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n\t      if(O[index] === el)return IS_INCLUDES || index || 0;\n\t    } return !IS_INCLUDES && -1;\n\t  };\n\t};\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar $defineProperty = __webpack_require__(12)\n\t  , createDesc      = __webpack_require__(25);\n\t\n\tmodule.exports = function(object, index, value){\n\t  if(index in object)$defineProperty.f(object, index, createDesc(0, value));\n\t  else object[index] = value;\n\t};\n\n/***/ },\n/* 81 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(5).document && document.documentElement;\n\n/***/ },\n/* 82 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = !__webpack_require__(9) && !__webpack_require__(10)(function(){\n\t  return Object.defineProperty(__webpack_require__(38)('div'), 'a', {get: function(){ return 7; }}).a != 7;\n\t});\n\n/***/ },\n/* 83 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// check on default Array iterator\n\tvar Iterators  = __webpack_require__(7)\n\t  , ITERATOR   = __webpack_require__(4)('iterator')\n\t  , ArrayProto = Array.prototype;\n\t\n\tmodule.exports = function(it){\n\t  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n\t};\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar isObject = __webpack_require__(17)\n\t  , floor    = Math.floor;\n\tmodule.exports = function isInteger(it){\n\t  return !isObject(it) && isFinite(it) && floor(it) === it;\n\t};\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// call something on iterator step with safe closing on error\n\tvar anObject = __webpack_require__(6);\n\tmodule.exports = function(iterator, fn, value, entries){\n\t  try {\n\t    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n\t  // 7.4.6 IteratorClose(iterator, completion)\n\t  } catch(e){\n\t    var ret = iterator['return'];\n\t    if(ret !== undefined)anObject(ret.call(iterator));\n\t    throw e;\n\t  }\n\t};\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar create         = __webpack_require__(91)\n\t  , descriptor     = __webpack_require__(25)\n\t  , setToStringTag = __webpack_require__(43)\n\t  , IteratorPrototype = {};\n\t\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\t__webpack_require__(11)(IteratorPrototype, __webpack_require__(4)('iterator'), function(){ return this; });\n\t\n\tmodule.exports = function(Constructor, NAME, next){\n\t  Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});\n\t  setToStringTag(Constructor, NAME + ' Iterator');\n\t};\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar ITERATOR     = __webpack_require__(4)('iterator')\n\t  , SAFE_CLOSING = false;\n\t\n\ttry {\n\t  var riter = [7][ITERATOR]();\n\t  riter['return'] = function(){ SAFE_CLOSING = true; };\n\t  Array.from(riter, function(){ throw 2; });\n\t} catch(e){ /* empty */ }\n\t\n\tmodule.exports = function(exec, skipClosing){\n\t  if(!skipClosing && !SAFE_CLOSING)return false;\n\t  var safe = false;\n\t  try {\n\t    var arr  = [7]\n\t      , iter = arr[ITERATOR]();\n\t    iter.next = function(){ return {done: safe = true}; };\n\t    arr[ITERATOR] = function(){ return iter; };\n\t    exec(arr);\n\t  } catch(e){ /* empty */ }\n\t  return safe;\n\t};\n\n/***/ },\n/* 88 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function(done, value){\n\t  return {value: value, done: !!done};\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports) {\n\n\tmodule.exports = true;\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// 19.1.2.1 Object.assign(target, source, ...)\n\tvar getKeys  = __webpack_require__(18)\n\t  , gOPS     = __webpack_require__(93)\n\t  , pIE      = __webpack_require__(42)\n\t  , toObject = __webpack_require__(20)\n\t  , IObject  = __webpack_require__(40)\n\t  , $assign  = Object.assign;\n\t\n\t// should work with symbols and should have deterministic property order (V8 bug)\n\tmodule.exports = !$assign || __webpack_require__(10)(function(){\n\t  var A = {}\n\t    , B = {}\n\t    , S = Symbol()\n\t    , K = 'abcdefghijklmnopqrst';\n\t  A[S] = 7;\n\t  K.split('').forEach(function(k){ B[k] = k; });\n\t  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n\t}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n\t  var T     = toObject(target)\n\t    , aLen  = arguments.length\n\t    , index = 1\n\t    , getSymbols = gOPS.f\n\t    , isEnum     = pIE.f;\n\t  while(aLen > index){\n\t    var S      = IObject(arguments[index++])\n\t      , keys   = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n\t      , length = keys.length\n\t      , j      = 0\n\t      , key;\n\t    while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n\t  } return T;\n\t} : $assign;\n\n/***/ },\n/* 91 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\tvar anObject    = __webpack_require__(6)\n\t  , dPs         = __webpack_require__(92)\n\t  , enumBugKeys = __webpack_require__(39)\n\t  , IE_PROTO    = __webpack_require__(26)('IE_PROTO')\n\t  , Empty       = function(){ /* empty */ }\n\t  , PROTOTYPE   = 'prototype';\n\t\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar createDict = function(){\n\t  // Thrash, waste and sodomy: IE GC bug\n\t  var iframe = __webpack_require__(38)('iframe')\n\t    , i      = enumBugKeys.length\n\t    , lt     = '<'\n\t    , gt     = '>'\n\t    , iframeDocument;\n\t  iframe.style.display = 'none';\n\t  __webpack_require__(81).appendChild(iframe);\n\t  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n\t  // createDict = iframe.contentWindow.Object;\n\t  // html.removeChild(iframe);\n\t  iframeDocument = iframe.contentWindow.document;\n\t  iframeDocument.open();\n\t  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n\t  iframeDocument.close();\n\t  createDict = iframeDocument.F;\n\t  while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];\n\t  return createDict();\n\t};\n\t\n\tmodule.exports = Object.create || function create(O, Properties){\n\t  var result;\n\t  if(O !== null){\n\t    Empty[PROTOTYPE] = anObject(O);\n\t    result = new Empty;\n\t    Empty[PROTOTYPE] = null;\n\t    // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t    result[IE_PROTO] = O;\n\t  } else result = createDict();\n\t  return Properties === undefined ? result : dPs(result, Properties);\n\t};\n\n\n/***/ },\n/* 92 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar dP       = __webpack_require__(12)\n\t  , anObject = __webpack_require__(6)\n\t  , getKeys  = __webpack_require__(18);\n\t\n\tmodule.exports = __webpack_require__(9) ? Object.defineProperties : function defineProperties(O, Properties){\n\t  anObject(O);\n\t  var keys   = getKeys(Properties)\n\t    , length = keys.length\n\t    , i = 0\n\t    , P;\n\t  while(length > i)dP.f(O, P = keys[i++], Properties[P]);\n\t  return O;\n\t};\n\n/***/ },\n/* 93 */\n/***/ function(module, exports) {\n\n\texports.f = Object.getOwnPropertySymbols;\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n\tvar has         = __webpack_require__(16)\n\t  , toObject    = __webpack_require__(20)\n\t  , IE_PROTO    = __webpack_require__(26)('IE_PROTO')\n\t  , ObjectProto = Object.prototype;\n\t\n\tmodule.exports = Object.getPrototypeOf || function(O){\n\t  O = toObject(O);\n\t  if(has(O, IE_PROTO))return O[IE_PROTO];\n\t  if(typeof O.constructor == 'function' && O instanceof O.constructor){\n\t    return O.constructor.prototype;\n\t  } return O instanceof Object ? ObjectProto : null;\n\t};\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar has          = __webpack_require__(16)\n\t  , toIObject    = __webpack_require__(19)\n\t  , arrayIndexOf = __webpack_require__(79)(false)\n\t  , IE_PROTO     = __webpack_require__(26)('IE_PROTO');\n\t\n\tmodule.exports = function(object, names){\n\t  var O      = toIObject(object)\n\t    , i      = 0\n\t    , result = []\n\t    , key;\n\t  for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n\t  // Don't enum bug & hidden keys\n\t  while(names.length > i)if(has(O, key = names[i++])){\n\t    ~arrayIndexOf(result, key) || result.push(key);\n\t  }\n\t  return result;\n\t};\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// most Object methods by ES6 should accept primitives\n\tvar $export = __webpack_require__(3)\n\t  , core    = __webpack_require__(1)\n\t  , fails   = __webpack_require__(10);\n\tmodule.exports = function(KEY, exec){\n\t  var fn  = (core.Object || {})[KEY] || Object[KEY]\n\t    , exp = {};\n\t  exp[KEY] = exec(fn);\n\t  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n\t};\n\n/***/ },\n/* 97 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar getKeys   = __webpack_require__(18)\n\t  , toIObject = __webpack_require__(19)\n\t  , isEnum    = __webpack_require__(42).f;\n\tmodule.exports = function(isEntries){\n\t  return function(it){\n\t    var O      = toIObject(it)\n\t      , keys   = getKeys(O)\n\t      , length = keys.length\n\t      , i      = 0\n\t      , result = []\n\t      , key;\n\t    while(length > i)if(isEnum.call(O, key = keys[i++])){\n\t      result.push(isEntries ? [key, O[key]] : O[key]);\n\t    } return result;\n\t  };\n\t};\n\n/***/ },\n/* 98 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(11);\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toInteger = __webpack_require__(27)\n\t  , defined   = __webpack_require__(24);\n\t// true  -> String#at\n\t// false -> String#codePointAt\n\tmodule.exports = function(TO_STRING){\n\t  return function(that, pos){\n\t    var s = String(defined(that))\n\t      , i = toInteger(pos)\n\t      , l = s.length\n\t      , a, b;\n\t    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n\t    a = s.charCodeAt(i);\n\t    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n\t      ? TO_STRING ? s.charAt(i) : a\n\t      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n\t  };\n\t};\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toInteger = __webpack_require__(27)\n\t  , max       = Math.max\n\t  , min       = Math.min;\n\tmodule.exports = function(index, length){\n\t  index = toInteger(index);\n\t  return index < 0 ? max(index + length, 0) : min(index, length);\n\t};\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.1.1 ToPrimitive(input [, PreferredType])\n\tvar isObject = __webpack_require__(17);\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tmodule.exports = function(it, S){\n\t  if(!isObject(it))return it;\n\t  var fn, val;\n\t  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n\t  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n\t  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n\t  throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n/***/ },\n/* 102 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar anObject = __webpack_require__(6)\n\t  , get      = __webpack_require__(47);\n\tmodule.exports = __webpack_require__(1).getIterator = function(it){\n\t  var iterFn = get(it);\n\t  if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');\n\t  return anObject(iterFn.call(it));\n\t};\n\n/***/ },\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar classof   = __webpack_require__(35)\n\t  , ITERATOR  = __webpack_require__(4)('iterator')\n\t  , Iterators = __webpack_require__(7);\n\tmodule.exports = __webpack_require__(1).isIterable = function(it){\n\t  var O = Object(it);\n\t  return O[ITERATOR] !== undefined\n\t    || '@@iterator' in O\n\t    || Iterators.hasOwnProperty(classof(O));\n\t};\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar ctx            = __webpack_require__(37)\n\t  , $export        = __webpack_require__(3)\n\t  , toObject       = __webpack_require__(20)\n\t  , call           = __webpack_require__(85)\n\t  , isArrayIter    = __webpack_require__(83)\n\t  , toLength       = __webpack_require__(45)\n\t  , createProperty = __webpack_require__(80)\n\t  , getIterFn      = __webpack_require__(47);\n\t\n\t$export($export.S + $export.F * !__webpack_require__(87)(function(iter){ Array.from(iter); }), 'Array', {\n\t  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n\t  from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){\n\t    var O       = toObject(arrayLike)\n\t      , C       = typeof this == 'function' ? this : Array\n\t      , aLen    = arguments.length\n\t      , mapfn   = aLen > 1 ? arguments[1] : undefined\n\t      , mapping = mapfn !== undefined\n\t      , index   = 0\n\t      , iterFn  = getIterFn(O)\n\t      , length, result, step, iterator;\n\t    if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n\t    // if object isn't iterable or it's array with default iterator - use simple case\n\t    if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){\n\t      for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){\n\t        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n\t      }\n\t    } else {\n\t      length = toLength(O.length);\n\t      for(result = new C(length); length > index; index++){\n\t        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n\t      }\n\t    }\n\t    result.length = index;\n\t    return result;\n\t  }\n\t});\n\n\n/***/ },\n/* 105 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar addToUnscopables = __webpack_require__(78)\n\t  , step             = __webpack_require__(88)\n\t  , Iterators        = __webpack_require__(7)\n\t  , toIObject        = __webpack_require__(19);\n\t\n\t// 22.1.3.4 Array.prototype.entries()\n\t// 22.1.3.13 Array.prototype.keys()\n\t// 22.1.3.29 Array.prototype.values()\n\t// 22.1.3.30 Array.prototype[@@iterator]()\n\tmodule.exports = __webpack_require__(41)(Array, 'Array', function(iterated, kind){\n\t  this._t = toIObject(iterated); // target\n\t  this._i = 0;                   // next index\n\t  this._k = kind;                // kind\n\t// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n\t}, function(){\n\t  var O     = this._t\n\t    , kind  = this._k\n\t    , index = this._i++;\n\t  if(!O || index >= O.length){\n\t    this._t = undefined;\n\t    return step(1);\n\t  }\n\t  if(kind == 'keys'  )return step(0, index);\n\t  if(kind == 'values')return step(0, O[index]);\n\t  return step(0, [index, O[index]]);\n\t}, 'values');\n\t\n\t// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n\tIterators.Arguments = Iterators.Array;\n\t\n\taddToUnscopables('keys');\n\taddToUnscopables('values');\n\taddToUnscopables('entries');\n\n/***/ },\n/* 106 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar $export = __webpack_require__(3);\n\t\n\t$export($export.S, 'Number', {isInteger: __webpack_require__(84)});\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.4 Number.isNaN(number)\n\tvar $export = __webpack_require__(3);\n\t\n\t$export($export.S, 'Number', {\n\t  isNaN: function isNaN(number){\n\t    return number != number;\n\t  }\n\t});\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.3.1 Object.assign(target, source)\n\tvar $export = __webpack_require__(3);\n\t\n\t$export($export.S + $export.F, 'Object', {assign: __webpack_require__(90)});\n\n/***/ },\n/* 109 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar $export = __webpack_require__(3);\n\t// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n\t$export($export.S + $export.F * !__webpack_require__(9), 'Object', {defineProperty: __webpack_require__(12).f});\n\n/***/ },\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 19.1.2.14 Object.keys(O)\n\tvar toObject = __webpack_require__(20)\n\t  , $keys    = __webpack_require__(18);\n\t\n\t__webpack_require__(96)('keys', function(){\n\t  return function keys(it){\n\t    return $keys(toObject(it));\n\t  };\n\t});\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\n\tvar $export   = __webpack_require__(3)\n\t  , aFunction = __webpack_require__(34)\n\t  , anObject  = __webpack_require__(6)\n\t  , rApply    = (__webpack_require__(5).Reflect || {}).apply\n\t  , fApply    = Function.apply;\n\t// MS Edge argumentsList argument is optional\n\t$export($export.S + $export.F * !__webpack_require__(10)(function(){\n\t  rApply(function(){});\n\t}), 'Reflect', {\n\t  apply: function apply(target, thisArgument, argumentsList){\n\t    var T = aFunction(target)\n\t      , L = anObject(argumentsList);\n\t    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n\t  }\n\t});\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// https://github.com/tc39/proposal-object-values-entries\n\tvar $export  = __webpack_require__(3)\n\t  , $entries = __webpack_require__(97)(true);\n\t\n\t$export($export.S, 'Object', {\n\t  entries: function entries(it){\n\t    return $entries(it);\n\t  }\n\t});\n\n/***/ },\n/* 113 */\n/***/ function(module, exports) {\n\n\t// removed by extract-text-webpack-plugin\n\n/***/ }\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// mdl-ext.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 82005ea981e272a97aa0","var core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_core.js\n// module id = 1\n// module chunks = 0 1","'use strict';\n\nconst VK_TAB         = 9;\nconst VK_ENTER       = 13;\nconst VK_ESC         = 27;\nconst VK_SPACE       = 32;\nconst VK_PAGE_UP     = 33;\nconst VK_PAGE_DOWN   = 34;\nconst VK_END         = 35;\nconst VK_HOME        = 36;\nconst VK_ARROW_LEFT  = 37;\nconst VK_ARROW_UP    = 38;\nconst VK_ARROW_RIGHT = 39;\nconst VK_ARROW_DOWN  = 40;\n\nconst ARIA_EXPANDED        = 'aria-expanded';\nconst ARIA_HIDDEN          = 'aria-hidden';\nconst ARIA_MULTISELECTABLE = 'aria-multiselectable';\nconst ARIA_SELECTED        = 'aria-selected';\n\nconst IS_DIRTY      = 'is-dirty';\nconst IS_DISABLED   = 'is-disabled';\nconst IS_EXPANDED   = 'is-expanded';\nconst IS_FOCUSED    = 'is-focused';\nconst IS_INVALID    = 'is-invalid';\nconst IS_UPGRADED   = 'is-upgraded';\nconst DATA_UPGRADED = 'data-upgraded';\n\nconst MDL_RIPPLE                      = 'mdl-ripple';\nconst MDL_RIPPLE_COMPONENT            = 'MaterialRipple';\nconst MDL_RIPPLE_EFFECT               = 'mdl-js-ripple-effect';\nconst MDL_RIPPLE_EFFECT_IGNORE_EVENTS = 'mdl-js-ripple-effect--ignore-events';\n\nexport {\n  VK_TAB,\n  VK_ENTER,\n  VK_ESC,\n  VK_SPACE,\n  VK_PAGE_UP,\n  VK_PAGE_DOWN ,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN ,\n  ARIA_EXPANDED,\n  ARIA_HIDDEN,\n  ARIA_MULTISELECTABLE,\n  ARIA_SELECTED,\n  IS_DIRTY,\n  IS_DISABLED,\n  IS_EXPANDED,\n  IS_FOCUSED,\n  IS_INVALID,\n  IS_UPGRADED,\n  DATA_UPGRADED ,\n  MDL_RIPPLE,\n  MDL_RIPPLE_COMPONENT,\n  MDL_RIPPLE_EFFECT,\n  MDL_RIPPLE_EFFECT_IGNORE_EVENTS\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/constants.js","var global    = require('./_global')\n  , core      = require('./_core')\n  , ctx       = require('./_ctx')\n  , hide      = require('./_hide')\n  , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n  var IS_FORCED = type & $export.F\n    , IS_GLOBAL = type & $export.G\n    , IS_STATIC = type & $export.S\n    , IS_PROTO  = type & $export.P\n    , IS_BIND   = type & $export.B\n    , IS_WRAP   = type & $export.W\n    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})\n    , expProto  = exports[PROTOTYPE]\n    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n    , key, own, out;\n  if(IS_GLOBAL)source = name;\n  for(key in source){\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if(own && key in exports)continue;\n    // export native or passed\n    out = own ? target[key] : source[key];\n    // prevent global pollution for namespaces\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n    // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global)\n    // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? (function(C){\n      var F = function(a, b, c){\n        if(this instanceof C){\n          switch(arguments.length){\n            case 0: return new C;\n            case 1: return new C(a);\n            case 2: return new C(a, b);\n          } return new C(a, b, c);\n        } return C.apply(this, arguments);\n      };\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F;\n    // make static versions for prototype methods\n    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n    if(IS_PROTO){\n      (exports.virtual || (exports.virtual = {}))[key] = out;\n      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n      if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n    }\n  }\n};\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_export.js\n// module id = 3\n// module chunks = 0 1","var store      = require('./_shared')('wks')\n  , uid        = require('./_uid')\n  , Symbol     = require('./_global').Symbol\n  , USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function(name){\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_wks.js\n// module id = 4\n// module chunks = 0 1","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_global.js\n// module id = 5\n// module chunks = 0 1","var isObject = require('./_is-object');\nmodule.exports = function(it){\n  if(!isObject(it))throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_an-object.js\n// module id = 6\n// module chunks = 0 1","module.exports = {};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iterators.js\n// module id = 7\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\n\nvar _from = require(\"../core-js/array/from\");\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  } else {\n    return (0, _from2.default)(arr);\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/toConsumableArray.js\n// module id = 8\n// module chunks = 0 1","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_descriptors.js\n// module id = 9\n// module chunks = 0 1","module.exports = function(exec){\n  try {\n    return !!exec();\n  } catch(e){\n    return true;\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_fails.js\n// module id = 10\n// module chunks = 0 1","var dP         = require('./_object-dp')\n  , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n  return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n  object[key] = value;\n  return object;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_hide.js\n// module id = 11\n// module chunks = 0 1","var anObject       = require('./_an-object')\n  , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n  , toPrimitive    = require('./_to-primitive')\n  , dP             = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if(IE8_DOM_DEFINE)try {\n    return dP(O, P, Attributes);\n  } catch(e){ /* empty */ }\n  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n  if('value' in Attributes)O[P] = Attributes.value;\n  return O;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-dp.js\n// module id = 12\n// module chunks = 0 1","/**\n * Since some events can fire at a high rate, the event handler should be limited to execute computationally\n * expensive operations, such as DOM modifications, inside a single rendered frame.\n * When listening to e.g. scroll and resize events, the browser tends to fire off more events per\n * second than are actually useful. For instance, if your event listener sets some element positions, then it\n * is possible for those positions to be updated multiple times in a single rendered frame. In this case, all of\n * the layout calculations triggered by setting the elements' positions will be wasted except for the one time that\n * it runs immediately prior to the browser rendering the updated layout to the screen.\n * To avoid wasting cycles, we can use requestAnimationFrame to only run the event listener once just before the page\n * is rendered to the screen.\n * *\n * @param callback the function to throttle\n * @param context  optional context of this, default to global\n * @return {function(...[*])}\n */\nconst fullThrottle = (callback, context) => {\n\n  if (!context) {\n    context = this || window;\n  }\n\n  let throttling = false;\n\n  return (...args) => {\n    if(!throttling) {\n      throttling = true;\n      window.requestAnimationFrame( () => {\n        throttling = false;\n        return Reflect.apply(callback, context, args);\n      });\n    }\n  };\n};\n\nexport default fullThrottle;\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/full-throttle.js","'use strict';\n\n/**\n * Converts a JSON string to object\n * @param jsonString\n * @param source\n */\nconst jsonStringToObject = (jsonString, source = {} ) => {\n  const s = jsonString.replace(/'/g, '\"');\n  try {\n    return Object.assign(source, JSON.parse(s));\n  }\n  catch (e) {\n    throw new Error(`Failed to parse json string: ${s}. Error: ${e.message}`);\n  }\n};\n\nexport { jsonStringToObject };\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/json-utils.js","'use strict';\n\n/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A javascript utility for conditionally creating a list of strings.\n * The function takes any number of arguments which can be a string or object.\n * Inspired by (but not copied from) JedWatson/classnames, https://github.com/JedWatson/classnames\n *\n * @param  {*} args the strings and/or objects to\n * @return {Array} a list of strings\n * @example\n * // Returns ['foo', 'bar', 'baz', 'quux']\n * stringList(', ', 'foo', { bar: true, duck: false }, 'baz', { quux: true });\n * @example see the tests for more examples\n */\nconst stringList = (...args) => {\n\n  const isString = str => str != null && typeof str === 'string';\n\n  const flatten = list => list.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n\n  const objectToStrings = arg =>\n    Object.keys(arg)\n      .filter(key => arg[key])\n      .map(key => key);\n\n  return args\n    .filter(arg => !!arg)\n    .map(arg => isString(arg) ? arg : objectToStrings(arg))\n    .reduce((result, arg) => result.concat(Array.isArray(arg) ? flatten(arg) : arg), []);\n};\n\n/**\n * A simple javascript utility for conditionally joining strings together.\n * The function takes a delimiter string and any number of arguments which can be a string or object.\n *\n * @param delimiter delimiter to separate joined strings\n * @param  {*} args the strings and/or objects to join\n * @return {String} the joined strings\n * @example\n * // Returns 'foo, bar, baz, quux'\n * joinStrings(', ', 'foo', { bar: true, duck: false }, 'baz', { quux: true });\n * @example see the tests for more examples\n */\nconst joinStrings = (delimiter = ' ', ...args) => stringList(...args).join(delimiter);\n\n/**\n * Generates a random string with a given length\n * @param n {Integer} length of generated string\n * @see http://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript\n * @return {String} the random string\n * @example\n * // Returns e.g. 'pd781w0y'\n * randomString(8);\n * @example see the tests for more examples\n */\nconst randomString = ( n=12 ) => Array( n+1 ).join((`${Math.random().toString(36)}00000000000000000`).slice(2, 18)).slice(0, n);\n\nexport { joinStrings, randomString, stringList };\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/string-utils.js","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n  return hasOwnProperty.call(it, key);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_has.js\n// module id = 16\n// module chunks = 0 1","module.exports = function(it){\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_is-object.js\n// module id = 17\n// module chunks = 0 1","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys       = require('./_object-keys-internal')\n  , enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O){\n  return $keys(O, enumBugKeys);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-keys.js\n// module id = 18\n// module chunks = 0 1","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject')\n  , defined = require('./_defined');\nmodule.exports = function(it){\n  return IObject(defined(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-iobject.js\n// module id = 19\n// module chunks = 0 1","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function(it){\n  return Object(defined(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-object.js\n// module id = 20\n// module chunks = 0 1","/**\n * Remove child element(s)\n * element.innerHTNL = '' has a performance penality!\n * @see http://jsperf.com/empty-an-element/16\n * @see http://jsperf.com/force-reflow\n * @param element\n * @param forceReflow\n */\nconst removeChildElements = (element, forceReflow = true) => {\n\n  // See: http://jsperf.com/empty-an-element/16\n  while (element.lastChild) {\n    element.removeChild(element.lastChild);\n  }\n  if(forceReflow) {\n    // See: http://jsperf.com/force-reflow\n    const d = element.style.display;\n\n    element.style.display = 'none';\n    element.style.display = d;\n  }\n};\n\n/**\n * Moves child elements from a DOM node to another dom node.\n * @param source {HTMLElement}\n * @param target {HTMLElement} If the target parameter is ommited, a document fragment is created\n * @return {HTMLElement} The target node\n *\n * @example\n * // Moves child elements from a DOM node to another dom node.\n * moveElements(source, destination);\n *\n * @example\n * // If the second parameter is ommited, a document fragment is created:\n * let fragment = moveElements(source);\n *\n * @See: https://github.com/webmodules/dom-move\n */\nconst moveElements = (source, target) => {\n  if (!target) {\n    target = source.ownerDocument.createDocumentFragment();\n  }\n  while (source.firstChild) {\n    target.appendChild(source.firstChild);\n  }\n  return target;\n};\n\n\n/**\n * Get the browser viewport dimensions\n * @see http://stackoverflow.com/questions/1248081/get-the-browser-viewport-dimensions-with-javascript\n * @return {{windowWidth: number, windowHeight: number}}\n */\nconst getWindowViewport = () => {\n  return {\n    viewportWidth: Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n    viewportHeight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)\n  };\n};\n\n\n/**\n * Check whether an element is in the window viewport\n * @see http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport/\n * @param top\n * @param left\n * @param bottom\n * @param right\n * @return {boolean} true if rectangle is inside window viewport, otherwise false\n */\nconst isRectInsideWindowViewport = ({ top, left, bottom, right }) => {\n  const { viewportWidth, viewportHeight } = getWindowViewport();\n  return top >= 0 &&\n    left >= 0 &&\n    bottom <= viewportHeight &&\n    right <= viewportWidth;\n};\n\n\n/**\n * Get a list of parent elements that can possibly scroll\n * @param el the element to get parents for\n * @returns {Array}\n */\nconst getScrollParents = el => {\n  const elements = [];\n\n  /*\n  for (el = el.parentNode; el; el = el.parentNode) {\n    const cs = window.getComputedStyle(el);\n    if(!(cs.overflowY === 'hidden' && cs.overflowX === 'hidden')) {\n      elements.unshift(el);\n    }\n    if(el === document.body) {\n      break;\n    }\n  }\n  */\n\n  let element = el.parentNode;\n  while (element) {\n    const cs = window.getComputedStyle(element);\n    if(!(cs.overflowY === 'hidden' && cs.overflowX === 'hidden')) {\n      elements.unshift(element);\n    }\n    if(element === document.body) {\n      break;\n    }\n    element = element.parentNode;\n  }\n\n  return elements;\n};\n\n/**\n * Get a list of parent elements, from a given element to a given element\n * @param {HTMLElement} from\n * @param {HTMLElement} to\n * @return {Array<HTMLElement>} the parent elements, not including from and to\n */\nconst getParentElements = (from, to) => {\n  const result = [];\n  let element = from.parentNode;\n  while (element) {\n    if(element === to) {\n      break;\n    }\n    result.unshift(element);\n    element = element.parentNode;\n  }\n  return result;\n};\n\n/**\n * Position element next to button\n *\n * Positioning strategy\n *  1. element.height > viewport.height\n *     let element.height = viewport.heigt\n *     let element.overflow-y = auto\n *  2. element.width > viewport.width\n *     let element.width = viewport.width\n *  3. position element below button, align left edge of element with button left\n *       done if element inside viewport\n *  4. position element below button, align right edge of element with button right\n *       done if element inside viewport\n *  5. positions element above button, aligns left edge of element with button left\n *       done if element inside viewport\n *  6. position element above the control element, aligned to its right.\n *       done if element inside viewport\n *  7. position element at button right hand side, aligns element top with button top\n *       done if element inside viewport\n *  8. position element at button left hand side, aligns element top with button top\n *       done if element inside viewport\n *  9. position element inside viewport\n *     1. position element at viewport bottom\n *     2. position element at button right hand side\n *        done if element inside viewport\n *     3. position element at button left hand side\n *       done if element inside viewport\n *     4. position element at viewport right\n * 10. done\n *\n */\nconst tether = (controlledBy, element) => {\n  const controlRect = controlledBy.getBoundingClientRect();\n\n  // 1. will element height fit inside window viewport?\n  const { viewportWidth, viewportHeight } = getWindowViewport();\n\n  element.style.height = 'auto';\n  //element.style.overflowY = 'hidden';\n  if(element.offsetHeight > viewportHeight) {\n    element.style.height = `${viewportHeight}px`;\n    element.style.overflowY = 'auto';\n  }\n\n  // 2. will element width fit inside window viewport?\n  element.style.width = 'auto';\n  if(element.offsetWidth > viewportWidth) {\n    element.style.width = `${viewportWidth}px`;\n  }\n\n  const elementRect = element.getBoundingClientRect();\n\n  // element to control distance\n  const dy = controlRect.top - elementRect.top;\n  const dx = controlRect.left - elementRect.left;\n\n  // element rect, window coordinates relative to top,left of control\n  const top = elementRect.top + dy;\n  const left = elementRect.left + dx;\n  const bottom = top + elementRect.height;\n  const right = left + elementRect.width;\n\n  // Position relative to control\n  let ddy = dy;\n  let ddx = dx;\n\n  if(isRectInsideWindowViewport({\n    top: top + controlRect.height,\n    left: left,\n    bottom: bottom + controlRect.height,\n    right: right\n  })) {\n    // 3 position element below the control element, aligned to its left\n    ddy = controlRect.height + dy;\n    //console.log('***** 3');\n  }\n  else if(isRectInsideWindowViewport({\n    top: top + controlRect.height,\n    left: left + controlRect.width - elementRect.width,\n    bottom: bottom + controlRect.height,\n    right: left + controlRect.width\n  })) {\n    // 4 position element below the control element, aligned to its right\n    ddy = controlRect.height + dy;\n    ddx = dx + controlRect.width - elementRect.width;\n    //console.log('***** 4');\n  }\n  else if(isRectInsideWindowViewport({\n    top: top - elementRect.height,\n    left: left,\n    bottom: bottom - elementRect.height,\n    right: right\n  })) {\n    // 5. position element above the control element, aligned to its left.\n    ddy = dy - elementRect.height;\n    //console.log('***** 5');\n  }\n  else if(isRectInsideWindowViewport({\n    top: top - elementRect.height,\n    left: left + controlRect.width - elementRect.width,\n    bottom: bottom - elementRect.height,\n    right: left + controlRect.width\n  })) {\n    // 6. position element above the control element, aligned to its right.\n    ddy = dy - elementRect.height;\n    ddx = dx + controlRect.width - elementRect.width;\n    //console.log('***** 6');\n  }\n  else if(isRectInsideWindowViewport({\n    top: top,\n    left: left + controlRect.width,\n    bottom: bottom,\n    right: right + controlRect.width\n  })) {\n    // 7. position element at button right hand side\n    ddx = controlRect.width + dx;\n    //console.log('***** 7');\n  }\n  else if(isRectInsideWindowViewport({\n    top: top,\n    left: left - controlRect.width,\n    bottom: bottom,\n    right: right - controlRect.width\n  })) {\n    // 8. position element at button left hand side\n    ddx = dx - elementRect.width;\n    //console.log('***** 8');\n  }\n  else {\n    // 9. position element inside viewport, near controlrect if possible\n    //console.log('***** 9');\n\n    // 9.1 position element near controlrect bottom\n    ddy =  dy - bottom + viewportHeight;\n    if(top + controlRect.height >= 0 && bottom + controlRect.height <= viewportHeight) {\n      ddy = controlRect.height + dy;\n    }\n    else if(top - elementRect.height >= 0 && bottom - elementRect.height <= viewportHeight) {\n      ddy = dy - elementRect.height;\n    }\n\n    if(left + elementRect.width + controlRect.width <= viewportWidth) {\n      // 9.2 Position element at button right hand side\n      ddx = controlRect.width + dx;\n      //console.log('***** 9.2');\n    }\n    else if(left - elementRect.width >= 0) {\n      // 9.3 Position element at button left hand side\n      ddx = dx - elementRect.width;\n      //console.log('***** 9.3');\n    }\n    else {\n      // 9.4 position element at (near) viewport right\n      const r = left + elementRect.width - viewportWidth;\n      ddx = dx - r;\n      //console.log('***** 9.4');\n    }\n  }\n\n  // 10. done\n  element.style.top = `${element.offsetTop + ddy}px`;\n  element.style.left = `${element.offsetLeft + ddx}px`;\n  //console.log('***** 10. done');\n};\n\n/**\n * Check if the given element can receive focus\n * @param {HTMLElement} element the element to check\n * @return {boolean} true if the element is focusable, otherwise false\n */\nconst isFocusable = (element) => {\n  // https://github.com/stephenmathieson/is-focusable/blob/master/index.js\n  // http://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus\n\n  if (element.hasAttribute('tabindex')) {\n    const tabindex = element.getAttribute('tabindex');\n    if (!Number.isNaN(tabindex)) {\n      return parseInt(tabindex) > -1;\n    }\n  }\n\n  if (element.hasAttribute('contenteditable') &&\n    element.getAttribute('contenteditable') !== 'false') {\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-contenteditable\n    return true;\n  }\n\n  // natively focusable, but only when enabled\n  const selector = /input|select|textarea|button|details/i;\n  const name = element.nodeName;\n  if (selector.test(name)) {\n    return element.type.toLowerCase() !== 'hidden' && !element.disabled;\n  }\n\n  // anchors and area must have an href\n  if (name === 'A' || name === 'AREA') {\n    return !!element.href;\n  }\n\n  if (name === 'IFRAME') {\n    // Check visible iframe\n    const cs = window.getComputedStyle(element);\n    return cs.getPropertyValue('display').toLowerCase() !== 'none';\n  }\n\n  return false;\n};\n\n\n/**\n * Get a list of offset parents for given element\n * @see https://www.benpickles.com/articles/51-finding-a-dom-nodes-common-ancestor-using-javascript\n * @param el the element\n * @return {Array} a list of offset parents\n */\n/*\nconst offsetParents = (el) => {\n  const elements = [];\n  for (; el; el = el.offsetParent) {\n    elements.unshift(el);\n  }\n  if(!elements.find(e => e === document.body)) {\n    elements.unshift(document.body);\n  }\n  return elements;\n};\n*/\n\n/**\n * Finds the common offset ancestor of two DOM nodes\n * @see https://www.benpickles.com/articles/51-finding-a-dom-nodes-common-ancestor-using-javascript\n * @see https://gist.github.com/benpickles/4059636\n * @param a\n * @param b\n * @return {Element} The common offset ancestor of a and b\n */\n/*\nconst commonOffsetAncestor = (a, b) => {\n  const parentsA = offsetParents(a);\n  const parentsB = offsetParents(b);\n\n  for (let i = 0; i < parentsA.length; i++) {\n    if (parentsA[i] !== parentsB[i]) return parentsA[i-1];\n  }\n};\n*/\n\n/**\n * Calculate position relative to a target element\n * @see http://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n * @param target\n * @param el\n * @return {{top: number, left: number}}\n */\n/*\nconst calcPositionRelativeToTarget = (target, el) => {\n  let top = 0;\n  let left = 0;\n\n  while(el) {\n    top += (el.offsetTop - el.scrollTop + el.clientTop) || 0;\n    left += (el.offsetLeft - el.scrollLeft + el.clientLeft) || 0;\n    el = el.offsetParent;\n\n    if(el === target) {\n      break;\n    }\n  }\n  return { top: top, left: left };\n};\n*/\n\nexport {\n  getWindowViewport,\n  getParentElements,\n  getScrollParents,\n  isFocusable,\n  isRectInsideWindowViewport,\n  moveElements,\n  removeChildElements,\n  tether,\n};\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/dom-utils.js","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/classCallCheck.js\n// module id = 22\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/createClass.js\n// module id = 23\n// module chunks = 0 1","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n  if(it == undefined)throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_defined.js\n// module id = 24\n// module chunks = 0 1","module.exports = function(bitmap, value){\n  return {\n    enumerable  : !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable    : !(bitmap & 4),\n    value       : value\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_property-desc.js\n// module id = 25\n// module chunks = 0 1","var shared = require('./_shared')('keys')\n  , uid    = require('./_uid');\nmodule.exports = function(key){\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_shared-key.js\n// module id = 26\n// module chunks = 0 1","// 7.1.4 ToInteger\nvar ceil  = Math.ceil\n  , floor = Math.floor;\nmodule.exports = function(it){\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-integer.js\n// module id = 27\n// module chunks = 0 1","'use strict';\nvar $at  = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function(iterated){\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , index = this._i\n    , point;\n  if(index >= O.length)return {value: undefined, done: true};\n  point = $at(O, index);\n  this._i += point.length;\n  return {value: point, done: false};\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.string.iterator.js\n// module id = 28\n// module chunks = 0 1","'use strict';\n\n// See: http://robertpenner.com/easing/\n\nconst easeInOutQuad = (t, b, c, d) => {\n  t /= d / 2;\n  if(t < 1) return c / 2 * t * t + b;\n  t--;\n  return -c / 2 * (t * (t - 2) - 1) + b;\n};\n\nconst inOutQuintic = (t, b, c, d) => {\n  const ts = (t/=d)*t;\n  const tc = ts*t;\n  return b+c*(6*tc*ts + -15*ts*ts + 10*tc);\n};\n\nexport { easeInOutQuad, inOutQuintic };\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/easing.js","const MIN_INERVAL = 1000/60;\n\n/**\n * Trigger a callback at a given interval\n * @param interval defaults to 1000/60 ms\n * @return {function()} reference to start, stop, immediate and started\n */\n\nconst intervalFunction = ( interval = MIN_INERVAL ) => {\n\n  let lapse = interval < MIN_INERVAL ? MIN_INERVAL : interval;\n  let cb = undefined;\n  let next = null;\n  let timeElapsed = 0;\n\n  const execute = () => {\n    const f = cb(timeElapsed);\n    if (!f) {\n      cancel();\n    }\n  };\n\n  const cancel = () => {\n    if(next) {\n      window.cancelAnimationFrame(next);\n    }\n    next = null;\n    timeElapsed = 0;\n  };\n\n  const start = () => {\n    let timeStart = Date.now();\n\n    const loop = now => {\n      if (next) {\n        next = window.requestAnimationFrame( () => loop( Date.now() ));\n\n        timeElapsed += now - timeStart;\n\n        if(timeElapsed >= lapse) {\n          execute();\n          if( (timeElapsed -= lapse) > lapse) {\n            // time elapsed - interval_ > interval_ , indicates inactivity\n            // Could be due to browser minimized, tab changed, screen saver started, computer sleep, and so on\n            timeElapsed = 0;\n          }\n        }\n        timeStart = now;\n      }\n    };\n\n    next = 1;  // a truthy value for first loop\n    loop( timeStart );\n  };\n\n  return {\n    get started() {\n      return next != null;\n    },\n    get interval() {\n      return lapse;\n    },\n    set interval(value) {\n      lapse = value < MIN_INERVAL ? MIN_INERVAL : value;\n    },\n    start(callback) {\n      if(typeof callback !== 'function') {\n        throw new TypeError('callback parameter must be a function');\n      }\n      cb = callback;\n      start();\n    },\n    immediate() {\n      if(!cb) {\n        throw new ReferenceError('callback parameter is not defined. Call start before immediate.');\n      }\n      execute();\n    },\n    stop: () => cancel(),\n  };\n};\n\nexport default intervalFunction;\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/interval-function.js","module.exports = { \"default\": require(\"core-js/library/fn/get-iterator\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/get-iterator.js\n// module id = 31\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/number/is-integer\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/number/is-integer.js\n// module id = 32\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/assign.js\n// module id = 33\n// module chunks = 0 1","module.exports = function(it){\n  if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_a-function.js\n// module id = 34\n// module chunks = 0 1","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof')\n  , TAG = require('./_wks')('toStringTag')\n  // ES3 wrong here\n  , ARG = cof(function(){ return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function(it, key){\n  try {\n    return it[key];\n  } catch(e){ /* empty */ }\n};\n\nmodule.exports = function(it){\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_classof.js\n// module id = 35\n// module chunks = 0 1","var toString = {}.toString;\n\nmodule.exports = function(it){\n  return toString.call(it).slice(8, -1);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_cof.js\n// module id = 36\n// module chunks = 0 1","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n  aFunction(fn);\n  if(that === undefined)return fn;\n  switch(length){\n    case 1: return function(a){\n      return fn.call(that, a);\n    };\n    case 2: return function(a, b){\n      return fn.call(that, a, b);\n    };\n    case 3: return function(a, b, c){\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function(/* ...args */){\n    return fn.apply(that, arguments);\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_ctx.js\n// module id = 37\n// module chunks = 0 1","var isObject = require('./_is-object')\n  , document = require('./_global').document\n  // in old IE typeof document.createElement is 'object'\n  , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n  return is ? document.createElement(it) : {};\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_dom-create.js\n// module id = 38\n// module chunks = 0 1","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_enum-bug-keys.js\n// module id = 39\n// module chunks = 0 1","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iobject.js\n// module id = 40\n// module chunks = 0 1","'use strict';\nvar LIBRARY        = require('./_library')\n  , $export        = require('./_export')\n  , redefine       = require('./_redefine')\n  , hide           = require('./_hide')\n  , has            = require('./_has')\n  , Iterators      = require('./_iterators')\n  , $iterCreate    = require('./_iter-create')\n  , setToStringTag = require('./_set-to-string-tag')\n  , getPrototypeOf = require('./_object-gpo')\n  , ITERATOR       = require('./_wks')('iterator')\n  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n  , FF_ITERATOR    = '@@iterator'\n  , KEYS           = 'keys'\n  , VALUES         = 'values';\n\nvar returnThis = function(){ return this; };\n\nmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function(kind){\n    if(!BUGGY && kind in proto)return proto[kind];\n    switch(kind){\n      case KEYS: return function keys(){ return new Constructor(this, kind); };\n      case VALUES: return function values(){ return new Constructor(this, kind); };\n    } return function entries(){ return new Constructor(this, kind); };\n  };\n  var TAG        = NAME + ' Iterator'\n    , DEF_VALUES = DEFAULT == VALUES\n    , VALUES_BUG = false\n    , proto      = Base.prototype\n    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n    , $default   = $native || getMethod(DEFAULT)\n    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined\n    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native\n    , methods, key, IteratorPrototype;\n  // Fix native\n  if($anyNative){\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base));\n    if(IteratorPrototype !== Object.prototype){\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if(DEF_VALUES && $native && $native.name !== VALUES){\n    VALUES_BUG = true;\n    $default = function values(){ return $native.call(this); };\n  }\n  // Define iterator\n  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG]  = returnThis;\n  if(DEFAULT){\n    methods = {\n      values:  DEF_VALUES ? $default : getMethod(VALUES),\n      keys:    IS_SET     ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if(FORCED)for(key in methods){\n      if(!(key in proto))redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iter-define.js\n// module id = 41\n// module chunks = 0 1","exports.f = {}.propertyIsEnumerable;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-pie.js\n// module id = 42\n// module chunks = 0 1","var def = require('./_object-dp').f\n  , has = require('./_has')\n  , TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function(it, tag, stat){\n  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_set-to-string-tag.js\n// module id = 43\n// module chunks = 0 1","var global = require('./_global')\n  , SHARED = '__core-js_shared__'\n  , store  = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n  return store[key] || (store[key] = {});\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_shared.js\n// module id = 44\n// module chunks = 0 1","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer')\n  , min       = Math.min;\nmodule.exports = function(it){\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-length.js\n// module id = 45\n// module chunks = 0 1","var id = 0\n  , px = Math.random();\nmodule.exports = function(key){\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_uid.js\n// module id = 46\n// module chunks = 0 1","var classof   = require('./_classof')\n  , ITERATOR  = require('./_wks')('iterator')\n  , Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function(it){\n  if(it != undefined)return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/core.get-iterator-method.js\n// module id = 47\n// module chunks = 0 1","require('./es6.array.iterator');\nvar global        = require('./_global')\n  , hide          = require('./_hide')\n  , Iterators     = require('./_iterators')\n  , TO_STRING_TAG = require('./_wks')('toStringTag');\n\nfor(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){\n  var NAME       = collections[i]\n    , Collection = global[NAME]\n    , proto      = Collection && Collection.prototype;\n  if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);\n  Iterators[NAME] = Iterators.Array;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/web.dom.iterable.js\n// module id = 48\n// module chunks = 0 1","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n/**\n * A WAI-ARIA friendly accordion component.\n * An accordion is a collection of expandable panels associated with a common outer container. Panels consist\n * of a header and an associated content region or tabpanel. The primary use of an Accordion is to present multiple sections\n * of content on a single page without scrolling, where all of the sections are peers in the application or object hierarchy.\n * The general look is similar to a tree where each root tree node is an expandable accordion header. The user navigates\n * and makes the contents of each panel visible (or not) by interacting with the Accordion Header\n */\n\nimport {\n  VK_ENTER,\n  VK_SPACE,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN,\n  IS_EXPANDED,\n  IS_UPGRADED,\n  ARIA_MULTISELECTABLE,\n  ARIA_EXPANDED,\n  ARIA_HIDDEN,\n  ARIA_SELECTED\n} from '../utils/constants';\n\n\n(function() {\n  'use strict';\n  const ACCORDION            = 'mdlext-accordion';\n  const ACCORDION_VERTICAL   = 'mdlext-accordion--vertical';\n  const ACCORDION_HORIZONTAL = 'mdlext-accordion--horizontal';\n  const PANEL                = 'mdlext-accordion__panel';\n  const PANEL_ROLE           = 'presentation';\n  const TAB                  = 'mdlext-accordion__tab';\n  const TAB_CAPTION          = 'mdlext-accordion__tab__caption';\n  const TAB_ROLE             = 'tab';\n  const TABPANEL             = 'mdlext-accordion__tabpanel';\n  const TABPANEL_ROLE        = 'tabpanel';\n  const RIPPLE_EFFECT        = 'mdlext-js-ripple-effect';\n  const RIPPLE               = 'mdlext-accordion__tab--ripple';\n  const ANIMATION_EFFECT     = 'mdlext-js-animation-effect';\n  const ANIMATION            = 'mdlext-accordion__tabpanel--animation';\n\n  /**\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtAccordion = function MaterialExtAccordion( element ) {\n\n    // Stores the Accordion HTML element.\n    this.element_ = element;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtAccordion'] = MaterialExtAccordion;\n\n\n  // Helpers\n  const accordionPanelElements = ( element ) => {\n    if(!element) {\n      return {\n        panel: null,\n        tab: null,\n        tabpanel: null\n      };\n    }\n    else if (element.classList.contains(PANEL)) {\n      return {\n        panel: element,\n        tab: element.querySelector(`.${TAB}`),\n        tabpanel: element.querySelector(`.${TABPANEL}`)\n      };\n    }\n    else {\n      return {\n        panel: element.parentNode,\n        tab: element.parentNode.querySelector(`.${TAB}`),\n        tabpanel: element.parentNode.querySelector(`.${TABPANEL}`)\n      };\n    }\n  };\n\n\n  // Private methods.\n\n  /**\n   * Handles custom command event, 'open', 'close', 'toggle' or upgrade\n   * @param event. A custom event\n   * @private\n   */\n  MaterialExtAccordion.prototype.commandHandler_ = function( event ) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if(event && event.detail) {\n      this.command(event.detail);\n    }\n  };\n\n  /**\n   * Dispatch toggle event\n   * @param {string} state\n   * @param {Element} tab\n   * @param {Element} tabpanel\n   * @private\n   */\n  MaterialExtAccordion.prototype.dispatchToggleEvent_ = function ( state, tab, tabpanel ) {\n    const ce = new CustomEvent('toggle', {\n      bubbles: true,\n      cancelable: true,\n      detail: { state: state, tab: tab, tabpanel: tabpanel }\n    });\n    this.element_.dispatchEvent(ce);\n  };\n\n  /**\n   * Open tab\n   * @param {Element} panel\n   * @param {Element} tab\n   * @param {Element} tabpanel\n   * @private\n   */\n  MaterialExtAccordion.prototype.openTab_ = function( panel, tab, tabpanel ) {\n    panel.classList.add(IS_EXPANDED);\n    tab.setAttribute(ARIA_EXPANDED, 'true');\n    tabpanel.removeAttribute('hidden');\n    tabpanel.setAttribute(ARIA_HIDDEN, 'false');\n    this.dispatchToggleEvent_('open', tab, tabpanel);\n  };\n\n  /**\n   * Close tab\n   * @param {Element} panel\n   * @param {Element} tab\n   * @param {Element} tabpanel\n   * @private\n   */\n  MaterialExtAccordion.prototype.closeTab_ = function( panel, tab, tabpanel ) {\n    panel.classList.remove(IS_EXPANDED);\n    tab.setAttribute(ARIA_EXPANDED, 'false');\n    tabpanel.setAttribute('hidden', '');\n    tabpanel.setAttribute(ARIA_HIDDEN, 'true');\n    this.dispatchToggleEvent_('close', tab, tabpanel);\n  };\n\n  /**\n   * Toggle tab\n   * @param {Element} panel\n   * @param {Element} tab\n   * @param {Element} tabpanel\n   * @private\n   */\n  MaterialExtAccordion.prototype.toggleTab_ = function( panel, tab, tabpanel ) {\n    if( !(this.element_.hasAttribute('disabled') || tab.hasAttribute('disabled')) ) {\n      if (tab.getAttribute(ARIA_EXPANDED).toLowerCase() === 'true') {\n        this.closeTab_(panel, tab, tabpanel);\n      }\n      else {\n        if (this.element_.getAttribute(ARIA_MULTISELECTABLE).toLowerCase() !== 'true') {\n          this.closeTabs_();\n        }\n        this.openTab_(panel, tab, tabpanel);\n      }\n    }\n  };\n\n  /**\n   * Open tabs\n   * @private\n   */\n  MaterialExtAccordion.prototype.openTabs_ = function() {\n    if (this.element_.getAttribute(ARIA_MULTISELECTABLE).toLowerCase() === 'true') {\n      [...this.element_.querySelectorAll(`.${ACCORDION} > .${PANEL}`)]\n        .filter(panel => !panel.classList.contains(IS_EXPANDED))\n        .forEach(closedItem => {\n          const tab = closedItem.querySelector(`.${TAB}`);\n          if (!tab.hasAttribute('disabled')) {\n            this.openTab_(closedItem, tab, closedItem.querySelector(`.${TABPANEL}`));\n          }\n        });\n    }\n  };\n\n  /**\n   * Close tabs\n   * @private\n   */\n  MaterialExtAccordion.prototype.closeTabs_ = function() {\n    [...this.element_.querySelectorAll(`.${ACCORDION} > .${PANEL}.${IS_EXPANDED}`)]\n      .forEach( panel => {\n        const tab = panel.querySelector(`.${TAB}`);\n        if(!tab.hasAttribute('disabled')) {\n          this.closeTab_(panel, tab, panel.querySelector(`.${TABPANEL}`));\n        }\n      });\n  };\n\n\n  // Public methods.\n\n  /**\n   * Upgrade an individual accordion tab\n   * @public\n   * @param {Element} tabElement The HTML element for the accordion panel.\n   */\n  MaterialExtAccordion.prototype.upgradeTab = function( tabElement ) {\n\n    const { panel, tab, tabpanel } = accordionPanelElements( tabElement );\n\n    const disableTab = () => {\n      panel.classList.remove(IS_EXPANDED);\n      tab.setAttribute('tabindex', '-1');\n      tab.setAttribute(ARIA_EXPANDED, 'false');\n      tabpanel.setAttribute('hidden', '');\n      tabpanel.setAttribute(ARIA_HIDDEN, 'true');\n    };\n\n    const enableTab = () => {\n      if(!tab.hasAttribute(ARIA_EXPANDED)) {\n        tab.setAttribute(ARIA_EXPANDED, 'false');\n      }\n\n      tab.setAttribute('tabindex', '0');\n\n      if(tab.getAttribute(ARIA_EXPANDED).toLowerCase() === 'true') {\n        panel.classList.add(IS_EXPANDED);\n        tabpanel.removeAttribute('hidden');\n        tabpanel.setAttribute(ARIA_HIDDEN, 'false');\n      }\n      else {\n        panel.classList.remove(IS_EXPANDED);\n        tabpanel.setAttribute('hidden', '');\n        tabpanel.setAttribute(ARIA_HIDDEN, 'true');\n      }\n    };\n\n    // In horizontal layout, caption must have a max-width defined to prevent pushing elements to the right of the caption out of view.\n    // In JsDom, offsetWidth and offsetHeight properties do not work, so this function is not testable.\n    /* istanbul ignore next */\n    const calcMaxTabCaptionWidth = () => {\n\n      const tabCaption = tab.querySelector(`.${TAB_CAPTION}`);\n      if(tabCaption !== null) {\n        const w = [...tab.children]\n          .filter( el => el.classList && !el.classList.contains(TAB_CAPTION) )\n          .reduce( (v, el) => v + el.offsetWidth, 0 );\n\n        const maxWidth = tab.clientHeight - w;\n        if(maxWidth > 0) {\n          tabCaption.style['max-width'] = `${maxWidth}px`;\n        }\n      }\n    };\n\n    const selectTab = () => {\n      if( !tab.hasAttribute(ARIA_SELECTED) ) {\n        [...this.element_.querySelectorAll(`.${TAB}[aria-selected=\"true\"]`)].forEach(\n          selectedTab => selectedTab.removeAttribute(ARIA_SELECTED)\n        );\n        tab.setAttribute(ARIA_SELECTED, 'true');\n      }\n    };\n\n    const tabClickHandler = () => {\n      this.toggleTab_(panel, tab, tabpanel);\n      selectTab();\n    };\n\n    const tabFocusHandler = () => {\n      selectTab();\n    };\n\n    const tabpanelClickHandler = () => {\n      selectTab();\n    };\n\n    const tabpanelFocusHandler = () => {\n      selectTab();\n    };\n\n    const tabKeydownHandler = e => {\n\n      if(this.element_.hasAttribute('disabled')) {\n        return;\n      }\n\n      if ( e.keyCode === VK_END        || e.keyCode === VK_HOME\n        || e.keyCode === VK_ARROW_UP   || e.keyCode === VK_ARROW_LEFT\n        || e.keyCode === VK_ARROW_DOWN || e.keyCode === VK_ARROW_RIGHT ) {\n\n        let nextTab = null;\n        let keyCode = e.keyCode;\n\n        if (keyCode === VK_HOME) {\n          nextTab = this.element_.querySelector(`.${PANEL}:first-child > .${TAB}`);\n          if(nextTab && nextTab.hasAttribute('disabled')) {\n            nextTab = null;\n            keyCode = VK_ARROW_DOWN;\n          }\n        }\n        else if (keyCode === VK_END) {\n          nextTab = this.element_.querySelector(`.${PANEL}:last-child > .${TAB}`);\n          if(nextTab && nextTab.hasAttribute('disabled')) {\n            nextTab = null;\n            keyCode = VK_ARROW_UP;\n          }\n        }\n\n        if(!nextTab) {\n          let nextPanel = panel;\n\n          do {\n            if (keyCode === VK_ARROW_UP || keyCode === VK_ARROW_LEFT) {\n              nextPanel = nextPanel.previousElementSibling;\n              if(!nextPanel) {\n                nextPanel = this.element_.querySelector(`.${PANEL}:last-child`);\n              }\n              if (nextPanel) {\n                nextTab = nextPanel.querySelector(`.${PANEL} > .${TAB}`);\n              }\n            }\n            else if (keyCode === VK_ARROW_DOWN || keyCode === VK_ARROW_RIGHT) {\n              nextPanel = nextPanel.nextElementSibling;\n              if(!nextPanel) {\n                nextPanel = this.element_.querySelector(`.${PANEL}:first-child`);\n              }\n              if (nextPanel) {\n                nextTab = nextPanel.querySelector(`.${PANEL} > .${TAB}`);\n              }\n            }\n\n            if(nextTab && nextTab.hasAttribute('disabled')) {\n              nextTab = null;\n            }\n            else {\n              break;\n            }\n          }\n          while(nextPanel !== panel);\n        }\n\n        if (nextTab) {\n          e.preventDefault();\n          e.stopPropagation();\n          nextTab.focus();\n\n          // Workaround for JSDom testing:\n          // In JsDom 'element.focus()' does not trigger any focus event\n          if(!nextTab.hasAttribute(ARIA_SELECTED)) {\n\n            [...this.element_.querySelectorAll(`.${TAB}[aria-selected=\"true\"]`)]\n              .forEach( selectedTab => selectedTab.removeAttribute(ARIA_SELECTED) );\n\n            nextTab.setAttribute(ARIA_SELECTED, 'true');\n          }\n        }\n      }\n      else if (e.keyCode === VK_ENTER || e.keyCode === VK_SPACE) {\n        e.preventDefault();\n        e.stopPropagation();\n        this.toggleTab_(panel, tab, tabpanel);\n      }\n    };\n\n    if(tab === null) {\n      throw new Error('There must be a tab element for each accordion panel.');\n    }\n\n    if(tabpanel === null) {\n      throw new Error('There must be a tabpanel element for each accordion panel.');\n    }\n\n    panel.setAttribute('role', PANEL_ROLE);\n    tab.setAttribute('role', TAB_ROLE);\n    tabpanel.setAttribute('role', TABPANEL_ROLE);\n\n    if(tab.hasAttribute('disabled')) {\n      disableTab();\n    }\n    else {\n      enableTab();\n    }\n\n    if( this.element_.classList.contains(ACCORDION_HORIZONTAL)) {\n      calcMaxTabCaptionWidth();\n    }\n\n    if (this.element_.classList.contains(RIPPLE_EFFECT)) {\n      tab.classList.add(RIPPLE);\n    }\n\n    if (this.element_.classList.contains(ANIMATION_EFFECT)) {\n      tabpanel.classList.add(ANIMATION);\n    }\n\n    // Remove listeners, just in case ...\n    tab.removeEventListener('click', tabClickHandler);\n    tab.removeEventListener('focus', tabFocusHandler);\n    tab.removeEventListener('keydown', tabKeydownHandler);\n    tabpanel.removeEventListener('click', tabpanelClickHandler);\n    tabpanel.removeEventListener('focus', tabpanelFocusHandler);\n\n    tab.addEventListener('click', tabClickHandler);\n    tab.addEventListener('focus', tabFocusHandler);\n    tab.addEventListener('keydown', tabKeydownHandler);\n    tabpanel.addEventListener('click', tabpanelClickHandler, true);\n    tabpanel.addEventListener('focus', tabpanelFocusHandler, true);\n  };\n  MaterialExtAccordion.prototype['upgradeTab'] = MaterialExtAccordion.prototype.upgradeTab;\n\n\n  /**\n   * Execute command\n   * @param detail\n   */\n  MaterialExtAccordion.prototype.command = function( detail ) {\n\n    const openTab = tabElement => {\n\n      if(tabElement === undefined) {\n        this.openTabs_();\n      }\n      else if(tabElement !== null) {\n        const { panel, tab, tabpanel } = accordionPanelElements( tabElement );\n        if(tab.getAttribute(ARIA_EXPANDED).toLowerCase() !== 'true') {\n          this.toggleTab_(panel, tab, tabpanel);\n        }\n      }\n    };\n\n    const closeTab = tabElement => {\n      if(tabElement === undefined) {\n        this.closeTabs_();\n      }\n      else if(tabElement !== null) {\n        const { panel, tab, tabpanel } = accordionPanelElements( tabElement );\n\n        if(tab.getAttribute(ARIA_EXPANDED).toLowerCase() === 'true') {\n          this.toggleTab_(panel, tab, tabpanel);\n        }\n      }\n    };\n\n    const toggleTab = tabElement => {\n      if(tabElement) {\n        const { panel, tab, tabpanel } = accordionPanelElements( tabElement );\n        this.toggleTab_(panel, tab, tabpanel);\n      }\n    };\n\n\n    if(detail && detail.action) {\n      const { action, target } = detail;\n\n      switch (action.toLowerCase()) {\n        case 'open':\n          openTab(target);\n          break;\n        case 'close':\n          closeTab(target);\n          break;\n        case 'toggle':\n          toggleTab(target);\n          break;\n        case 'upgrade':\n          if(target) {\n            this.upgradeTab(target);\n          }\n          break;\n        default:\n          throw new Error(`Unknown action \"${action}\". Action must be one of \"open\", \"close\", \"toggle\" or \"upgrade\"`);\n      }\n    }\n  };\n  MaterialExtAccordion.prototype['command'] = MaterialExtAccordion.prototype.command;\n\n\n  /**\n   * Initialize component\n   */\n  MaterialExtAccordion.prototype.init = function() {\n    if (this.element_) {\n      // Do the init required for this component to work\n      if( !(this.element_.classList.contains(ACCORDION_HORIZONTAL) || this.element_.classList.contains(ACCORDION_VERTICAL))) {\n        throw new Error(`Accordion must have one of the classes \"${ACCORDION_HORIZONTAL}\" or \"${ACCORDION_VERTICAL}\"`);\n      }\n\n      this.element_.setAttribute('role', 'tablist');\n\n      if(!this.element_.hasAttribute(ARIA_MULTISELECTABLE)) {\n        this.element_.setAttribute(ARIA_MULTISELECTABLE, 'false');\n      }\n\n      this.element_.removeEventListener('command', this.commandHandler_);\n      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n\n      [...this.element_.querySelectorAll(`.${ACCORDION} > .${PANEL}`)].forEach( panel => this.upgradeTab(panel) );\n\n      // Set upgraded flag\n      this.element_.classList.add(IS_UPGRADED);\n    }\n  };\n\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   *\n   * Nothing to downgrade\n   *\n   MaterialExtAccordion.prototype.mdlDowngrade_ = function() {\n     'use strict';\n     console.log('***** MaterialExtAccordion.mdlDowngrade');\n   };\n   */\n\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtAccordion,\n    classAsString: 'MaterialExtAccordion',\n    cssClass: 'mdlext-js-accordion',\n    widget: true\n  });\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/accordion/accordion.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n/**\n * Image carousel\n */\n\nimport intervalFunction from '../utils/interval-function';\nimport { inOutQuintic } from '../utils/easing';\nimport { jsonStringToObject} from '../utils/json-utils';\nimport {\n  VK_TAB,\n  VK_ENTER,\n  VK_ESC,\n  VK_SPACE,\n  VK_PAGE_UP,\n  VK_PAGE_DOWN,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN,\n  IS_UPGRADED,\n  IS_FOCUSED,\n  MDL_RIPPLE,\n  MDL_RIPPLE_COMPONENT,\n  MDL_RIPPLE_EFFECT,\n  MDL_RIPPLE_EFFECT_IGNORE_EVENTS\n} from '../utils/constants';\n\nconst MDL_RIPPLE_CONTAINER = 'mdlext-carousel__slide__ripple-container';\n\n\n(function() {\n  'use strict';\n\n  //const CAROUSEL = 'mdlext-carousel';\n  const SLIDE      = 'mdlext-carousel__slide';\n  const ROLE       = 'list';\n  const SLIDE_ROLE = 'listitem';\n\n\n  /**\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtCarousel = function MaterialExtCarousel(element) {\n    // Stores the element.\n    this.element_ = element;\n\n    // Default config\n    this.config_ = {\n      interactive  : true,\n      autostart    : false,\n      type         : 'slide',\n      interval     : 1000,\n      animationLoop: intervalFunction(1000)\n    };\n\n    this.scrollAnimation_ = intervalFunction(33);\n\n    // Initialize instance.\n    this.init();\n  };\n\n  window['MaterialExtCarousel'] = MaterialExtCarousel;\n\n\n  /**\n   * Start slideshow animation\n   * @private\n   */\n  MaterialExtCarousel.prototype.startSlideShow_ = function() {\n\n    const nextSlide = () => {\n      let slide = this.element_.querySelector(`.${SLIDE}[aria-selected]`);\n      if(slide) {\n        slide.removeAttribute('aria-selected');\n        slide = slide.nextElementSibling;\n      }\n      if(!slide) {\n        slide = this.element_.querySelector(`.${SLIDE}:first-child`);\n        this.animateScroll_(0);\n      }\n      if(slide) {\n        this.moveSlideIntoViewport_(slide);\n        slide.setAttribute('aria-selected', '');\n        this.emitSelectEvent_('next', null, slide);\n        return true;\n      }\n      return false;\n    };\n\n    const nextScroll = direction => {\n      let nextDirection = direction;\n\n      if('next' === direction &&  this.element_.scrollLeft === this.element_.scrollWidth - this.element_.clientWidth) {\n        nextDirection = 'prev';\n      }\n      else if(this.element_.scrollLeft === 0) {\n        nextDirection = 'next';\n      }\n      const x = 'next' === nextDirection\n        ?  Math.min(this.element_.scrollLeft + this.element_.clientWidth, this.element_.scrollWidth - this.element_.clientWidth)\n        :  Math.max(this.element_.scrollLeft - this.element_.clientWidth, 0);\n\n      this.animateScroll_(x, 1000);\n      return nextDirection;\n    };\n\n\n    if(!this.config_.animationLoop.started) {\n      this.config_.animationLoop.interval = this.config_.interval;\n      let direction = 'next';\n\n      if('scroll' === this.config_.type) {\n        this.config_.animationLoop.start( () => {\n          direction = nextScroll(direction);\n          return true; // It runs until cancelSlideShow_ is triggered\n        });\n      }\n      else {\n        nextSlide();\n        this.config_.animationLoop.start( () => {\n          return nextSlide(); // It runs until cancelSlideShow_ is triggered\n        });\n      }\n    }\n\n    // TODO: Pause animation when carousel is not in browser viewport or user changes tab\n  };\n\n  /**\n   * Cancel slideshow if running. Emmits a 'pause' event\n   * @private\n   */\n  MaterialExtCarousel.prototype.cancelSlideShow_ = function() {\n    if(this.config_.animationLoop.started) {\n      this.config_.animationLoop.stop();\n      this.emitSelectEvent_('pause', VK_ESC, this.element_.querySelector(`.${SLIDE}[aria-selected]`));\n    }\n  };\n\n  /**\n   * Animate scroll\n   * @param newPosition\n   * @param newDuration\n   * @param completedCallback\n   * @private\n   */\n  MaterialExtCarousel.prototype.animateScroll_ = function( newPosition, newDuration, completedCallback ) {\n\n    const start = this.element_.scrollLeft;\n    const distance = newPosition - start;\n\n    if(distance !== 0) {\n      const duration = Math.max(Math.min(Math.abs(distance), newDuration||400), 100); // duration is between 100 and newDuration||400ms||distance\n      let t = 0;\n      this.scrollAnimation_.stop();\n      this.scrollAnimation_.start( timeElapsed => {\n        t += timeElapsed;\n        if(t < duration) {\n          this.element_.scrollLeft = inOutQuintic(t, start, distance, duration);\n          return true;\n        }\n        else {\n          this.element_.scrollLeft = newPosition;\n          if(completedCallback) {\n            completedCallback();\n          }\n          return false;\n        }\n      });\n    }\n    else {\n      if(completedCallback) {\n        completedCallback();\n      }\n    }\n  };\n\n  /**\n   * Execute commend\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.command_ = function( event ) {\n    let x = 0;\n    let slide = null;\n    const a = event.detail.action.toLowerCase();\n\n    // Cancel slideshow if running\n    this.cancelSlideShow_();\n\n    switch (a) {\n      case 'first':\n        slide = this.element_.querySelector(`.${SLIDE}:first-child`);\n        break;\n\n      case 'last':\n        x = this.element_.scrollWidth - this.element_.clientWidth;\n        slide = this.element_.querySelector(`.${SLIDE}:last-child`);\n        break;\n\n      case 'scroll-prev':\n        x = Math.max(this.element_.scrollLeft - this.element_.clientWidth, 0);\n        break;\n\n      case 'scroll-next':\n        x = Math.min(this.element_.scrollLeft + this.element_.clientWidth, this.element_.scrollWidth - this.element_.clientWidth);\n        break;\n\n      case 'next':\n      case 'prev':\n        slide = this.element_.querySelector(`.${SLIDE}[aria-selected]`);\n        if(slide) {\n          slide = a === 'next' ? slide.nextElementSibling : slide.previousElementSibling;\n          this.setAriaSelected_(slide);\n          this.emitSelectEvent_(a, null,  slide);\n        }\n        return;\n\n      case 'play':\n        Object.assign(this.config_, event.detail);\n        this.startSlideShow_();\n        return;\n\n      case 'pause':\n        return;\n\n      default:\n        return;\n    }\n\n    this.animateScroll_(x, undefined, () => {\n      if ('scroll-next' === a || 'scroll-prev' === a) {\n        const slides = this.getSlidesInViewport_();\n        if (slides.length > 0) {\n          slide = 'scroll-next' === a ? slides[0] : slides[slides.length - 1];\n        }\n      }\n      this.setAriaSelected_(slide);\n      this.emitSelectEvent_(a, null, slide);\n    });\n  };\n\n  /**\n   * Handles custom command event, 'scroll-prev', 'scroll-next', 'first', 'last', next, prev, play, pause\n   * @param event. A custom event\n   * @private\n   */\n  MaterialExtCarousel.prototype.commandHandler_ = function( event ) {\n    event.preventDefault();\n    event.stopPropagation();\n    if(event.detail && event.detail.action) {\n      this.command_(event);\n    }\n  };\n\n  /**\n   * Handle keypress\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.keyDownHandler_ = function(event) {\n\n    if (event && event.target && event.target !== this.element_) {\n\n      let action = 'first';\n\n      if ( event.keyCode === VK_HOME    || event.keyCode === VK_END\n        || event.keyCode === VK_PAGE_UP || event.keyCode === VK_PAGE_DOWN) {\n\n        event.preventDefault();\n        if (event.keyCode === VK_END) {\n          action = 'last';\n        }\n        else if (event.keyCode === VK_PAGE_UP) {\n          action = 'scroll-prev';\n        }\n        else if (event.keyCode === VK_PAGE_DOWN) {\n          action = 'scroll-next';\n        }\n\n        const cmd = new CustomEvent('select', {\n          detail: {\n            action: action,\n          }\n        });\n        this.command_(cmd);\n      }\n      else if ( event.keyCode === VK_TAB\n        || event.keyCode === VK_ENTER      || event.keyCode === VK_SPACE\n        || event.keyCode === VK_ARROW_UP   || event.keyCode === VK_ARROW_LEFT\n        || event.keyCode === VK_ARROW_DOWN || event.keyCode === VK_ARROW_RIGHT) {\n\n        let slide = getSlide_(event.target);\n\n        if(!slide) {\n          return;\n        }\n\n        // Cancel slideshow if running\n        this.cancelSlideShow_();\n\n        switch (event.keyCode) {\n          case VK_ARROW_UP:\n          case VK_ARROW_LEFT:\n            action = 'prev';\n            slide = slide.previousElementSibling;\n            break;\n\n          case VK_ARROW_DOWN:\n          case VK_ARROW_RIGHT:\n            action = 'next';\n            slide = slide.nextElementSibling;\n            break;\n\n          case VK_TAB:\n            if (event.shiftKey) {\n              action = 'prev';\n              slide = slide.previousElementSibling;\n            }\n            else {\n              action = 'next';\n              slide = slide.nextElementSibling;\n            }\n            break;\n\n          case VK_SPACE:\n          case VK_ENTER:\n            action = 'select';\n            break;\n        }\n\n        if(slide) {\n          event.preventDefault();\n          setFocus_(slide);\n          this.emitSelectEvent_(action, event.keyCode, slide);\n        }\n      }\n    }\n  };\n\n  /**\n   * Handle dragging\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.dragHandler_ = function(event) {\n    event.preventDefault();\n\n    // Cancel slideshow if running\n    this.cancelSlideShow_();\n\n    let updating = false;\n    let rAFDragId = 0;\n\n    const startX = event.clientX || (event.touches !== undefined ? event.touches[0].clientX : 0);\n    let prevX = startX;\n    const targetElement = event.target;\n\n    const update = e => {\n      const currentX = (e.clientX || (e.touches !== undefined ? e.touches[0].clientX : 0));\n      const dx = prevX - currentX;\n\n      if(dx < 0) {\n        this.element_.scrollLeft = Math.max(this.element_.scrollLeft + dx, 0);\n      }\n      else if(dx > 0) {\n        this.element_.scrollLeft = Math.min(this.element_.scrollLeft + dx, this.element_.scrollWidth - this.element_.clientWidth);\n      }\n\n      prevX = currentX;\n      updating = false;\n    };\n\n    // drag handler\n    const drag = e => {\n      e.preventDefault();\n\n      if(!updating) {\n        rAFDragId = window.requestAnimationFrame( () => update(e));\n        updating = true;\n      }\n    };\n\n    // end drag handler\n    const endDrag = e => {\n      e.preventDefault();\n\n      this.element_.removeEventListener('mousemove', drag);\n      this.element_.removeEventListener('touchmove', drag);\n      window.removeEventListener('mouseup', endDrag);\n      window.removeEventListener('touchend', endDrag);\n\n      // cancel any existing drag rAF, see: http://www.html5rocks.com/en/tutorials/speed/animations/\n      window.cancelAnimationFrame(rAFDragId);\n\n      const slide = getSlide_(targetElement);\n      setFocus_(slide);\n      this.emitSelectEvent_('click', null,  slide);\n    };\n\n    this.element_.addEventListener('mousemove', drag);\n    this.element_.addEventListener('touchmove', drag);\n    window.addEventListener('mouseup', endDrag);\n    window.addEventListener('touchend',endDrag);\n  };\n\n  /**\n   * Handle click\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.clickHandler_ = function(event) {\n    // Click is handled by drag\n    event.preventDefault();\n  };\n\n  /**\n   * Handle focus\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.focusHandler_ = function(event) {\n    const slide = getSlide_(event.target);\n    if(slide) {\n      // The last focused/selected slide has 'aria-selected', even if focus is lost\n      this.setAriaSelected_(slide);\n      slide.classList.add(IS_FOCUSED);\n    }\n  };\n\n  /**\n   * Handle blur\n   * @param event\n   * @private\n   */\n  MaterialExtCarousel.prototype.blurHandler_ = function(event) {\n    const slide = getSlide_(event.target);\n    if(slide) {\n      slide.classList.remove(IS_FOCUSED);\n    }\n  };\n\n  /**\n   * Emits a custeom 'select' event\n   * @param command\n   * @param keyCode\n   * @param slide\n   * @private\n   */\n  MaterialExtCarousel.prototype.emitSelectEvent_ = function(command, keyCode, slide) {\n\n    if(slide) {\n      this.moveSlideIntoViewport_(slide);\n\n      const evt = new CustomEvent('select', {\n        bubbles: true,\n        cancelable: true,\n        detail: {\n          command: command,\n          keyCode: keyCode,\n          source: slide\n        }\n      });\n      this.element_.dispatchEvent(evt);\n    }\n  };\n\n  /**\n   * Get the first visible slide in component viewport\n   * @private\n   */\n  MaterialExtCarousel.prototype.getSlidesInViewport_ = function() {\n    const carouselRect = this.element_.getBoundingClientRect();\n\n    const slidesInViewport = [...this.element_.querySelectorAll(`.${SLIDE}`)].filter( slide => {\n      const slideRect = slide.getBoundingClientRect();\n      return slideRect.left >= carouselRect.left && slideRect.right <= carouselRect.right;\n    });\n    return slidesInViewport;\n  };\n\n  /**\n   * Move slide into component viewport - if needed\n   * @param slide\n   * @private\n   */\n  MaterialExtCarousel.prototype.moveSlideIntoViewport_ = function(slide) {\n    const carouselRect = this.element_.getBoundingClientRect();\n    const slideRect = slide.getBoundingClientRect();\n\n    if(slideRect.left < carouselRect.left) {\n      const x = this.element_.scrollLeft - (carouselRect.left - slideRect.left);\n      this.animateScroll_(x);\n    }\n    else if(slideRect.right > carouselRect.right) {\n      const x = this.element_.scrollLeft - (carouselRect.right - slideRect.right);\n      this.animateScroll_(x);\n    }\n  };\n\n\n  /**\n   * Removes 'aria-selected' from all slides in carousel\n   * @private\n   */\n  MaterialExtCarousel.prototype.setAriaSelected_ = function(slide) {\n    if(slide) {\n      [...this.element_.querySelectorAll(`.${SLIDE}[aria-selected]`)].forEach(\n        slide => slide.removeAttribute('aria-selected')\n      );\n      slide.setAttribute('aria-selected', '');\n    }\n  };\n\n  /**\n   * Removes event listeners\n   * @private\n   */\n  MaterialExtCarousel.prototype.removeListeners_ = function() {\n    this.element_.removeEventListener('focus', this.focusHandler_);\n    this.element_.removeEventListener('blur', this.blurHandler_);\n    this.element_.removeEventListener('keydown', this.keyDownHandler_);\n    this.element_.removeEventListener('mousedown', this.dragHandler_);\n    this.element_.removeEventListener('touchstart', this.dragHandler_);\n    this.element_.removeEventListener('click', this.clickHandler_, false);\n    this.element_.removeEventListener('command', this.commandHandler_);\n    this.element_.removeEventListener('mdl-componentdowngraded', this.mdlDowngrade_);\n  };\n\n\n  // Helpers\n  const getSlide_ = element => {\n    return element.closest(`.${SLIDE}`);\n  };\n\n  const setFocus_ = slide => {\n    if(slide) {\n      slide.focus();\n    }\n  };\n\n  const addRipple_ = slide => {\n    if(!slide.querySelector(`.${MDL_RIPPLE_CONTAINER}`)) {\n      const rippleContainer = document.createElement('span');\n      rippleContainer.classList.add(MDL_RIPPLE_CONTAINER);\n      rippleContainer.classList.add(MDL_RIPPLE_EFFECT);\n      const ripple = document.createElement('span');\n      ripple.classList.add(MDL_RIPPLE);\n      rippleContainer.appendChild(ripple);\n\n      const img = slide.querySelector('img');\n      if (img) {\n        // rippleContainer blocks image title\n        rippleContainer.title = img.title;\n      }\n      slide.appendChild(rippleContainer);\n      componentHandler.upgradeElement(rippleContainer, MDL_RIPPLE_COMPONENT);\n    }\n  };\n  // End helpers\n\n\n  // Public methods.\n\n  /**\n   * Cancel animation - if running.\n   *\n   * @public\n   */\n  MaterialExtCarousel.prototype.stopAnimation = function() {\n    this.config_.animationLoop.stop();\n  };\n  MaterialExtCarousel.prototype['stopAnimation'] = MaterialExtCarousel.prototype.stopAnimation;\n\n\n  /**\n   * Upgrade slides\n   * Use if more list elements are added later (dynamically)\n   *\n   * @public\n   */\n  MaterialExtCarousel.prototype.upgradeSlides = function() {\n\n    const hasRippleEffect = this.element_.classList.contains(MDL_RIPPLE_EFFECT);\n\n    [...this.element_.querySelectorAll(`.${SLIDE}`)].forEach( slide => {\n\n      slide.setAttribute('role', SLIDE_ROLE);\n\n      if(this.config_.interactive) {\n        if(!slide.getAttribute('tabindex')) {\n          slide.setAttribute('tabindex', '0');\n        }\n        if (hasRippleEffect) {\n          addRipple_(slide);\n        }\n      }\n      else {\n        slide.setAttribute('tabindex', '-1');\n      }\n    });\n  };\n  MaterialExtCarousel.prototype['upgradeSlides'] = MaterialExtCarousel.prototype.upgradeSlides;\n\n\n  /**\n   * Get config object\n   *\n   * @public\n   */\n  MaterialExtCarousel.prototype.getConfig = function() {\n    return this.config_;\n  };\n  MaterialExtCarousel.prototype['getConfig'] = MaterialExtCarousel.prototype.getConfig;\n\n  /**\n   * Initialize component\n   */\n  MaterialExtCarousel.prototype.init = function() {\n\n    if (this.element_) {\n      // Config\n      if(this.element_.hasAttribute('data-config')) {\n        this.config_ = jsonStringToObject(this.element_.getAttribute('data-config'), this.config_);\n      }\n\n      // Wai-Aria\n      this.element_.setAttribute('role', ROLE);\n\n      // Prefer tabindex -1\n      if(!Number.isInteger(this.element_.getAttribute('tabindex'))) {\n        this.element_.setAttribute('tabindex', -1);\n      }\n\n      // Remove listeners, just in case ...\n      this.removeListeners_();\n\n      if(this.config_.interactive) {\n\n        // Ripple\n        const hasRippleEffect = this.element_.classList.contains(MDL_RIPPLE_EFFECT);\n        if (hasRippleEffect) {\n          this.element_.classList.add(MDL_RIPPLE_EFFECT_IGNORE_EVENTS);\n        }\n\n        // Listen to focus/blur events\n        this.element_.addEventListener('focus', this.focusHandler_.bind(this), true);\n        this.element_.addEventListener('blur', this.blurHandler_.bind(this), true);\n\n        // Listen to keyboard events\n        this.element_.addEventListener('keydown', this.keyDownHandler_.bind(this), false);\n\n        // Listen to drag events\n        this.element_.addEventListener('mousedown', this.dragHandler_.bind(this), false);\n        this.element_.addEventListener('touchstart', this.dragHandler_.bind(this), false);\n\n        // Listen to click events\n        this.element_.addEventListener('click', this.clickHandler_.bind(this), false);\n      }\n\n      // Listen to custom 'command' event\n      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n\n      // Listen to 'mdl-componentdowngraded' event\n      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n\n      // Slides collection\n      this.upgradeSlides();\n\n      // Set upgraded flag\n      this.element_.classList.add(IS_UPGRADED);\n\n      if(this.config_.autostart) {\n        // Start slideshow\n        this.startSlideShow_();\n      }\n    }\n  };\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   */\n  MaterialExtCarousel.prototype.mdlDowngrade_ = function() {\n    'use strict';\n    //console.log('***** MaterialExtCarousel.mdlDowngrade_');\n\n    // Stop animation - if any\n    this.stopAnimation();\n\n    // Remove listeners\n    this.removeListeners_();\n  };\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtCarousel,\n    classAsString: 'MaterialExtCarousel',\n    cssClass: 'mdlext-js-carousel',\n    widget: true\n  });\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/carousel/carousel.js","/**\n * @license\n * Copyright 2016-2017 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n\n/**\n * A collapsible is a component to mark expandable and collapsible regions.\n * The component use the aria-expanded state to indicate whether regions of\n * the content are collapsible, and to expose whether a region is currently\n * expanded or collapsed.\n * @see https://www.w3.org/WAI/GL/wiki/Using_the_WAI-ARIA_aria-expanded_state_to_mark_expandable_and_collapsible_regions\n */\n\nimport {\n  IS_UPGRADED,\n  VK_SPACE,\n  VK_ENTER,\n} from '../utils/constants';\n\nimport { randomString } from '../utils/string-utils';\nimport { getParentElements, isFocusable } from '../utils/dom-utils';\n\nconst JS_COLLAPSIBLE = 'mdlext-js-collapsible';\nconst COLLAPSIBLE_CONTROL_CLASS = 'mdlext-collapsible';\nconst COLLAPSIBLE_GROUP_CLASS = 'mdlext-collapsible-group';\nconst COLLAPSIBLE_REGION_CLASS = 'mdlext-collapsible-region';\n\n/**\n * The collapsible component\n */\n\nclass Collapsible {\n  element_ = null;\n  controlElement_ = null;\n\n  /**\n   * @constructor\n   * @param {HTMLElement} element The element that this component is connected to.\n   */\n  constructor(element) {\n    this.element_ = element;\n    this.init();\n  }\n\n  keyDownHandler = event => {\n    if (event.keyCode === VK_ENTER || event.keyCode === VK_SPACE) {\n      event.preventDefault();\n\n      // Trigger click\n      (event.target || this.controlElement).dispatchEvent(\n        new MouseEvent('click', {\n          bubbles: true,\n          cancelable: true,\n          view: window\n        })\n      );\n    }\n  };\n\n  clickHandler = event => {\n    if(!this.isDisabled) {\n      if(event.target !== this.controlElement) {\n        // Do not toggle if a focusable element inside the control element triggered the event\n        const p = getParentElements(event.target, this.controlElement);\n        p.push(event.target);\n        if(p.find( el => isFocusable(el))) {\n          return;\n        }\n      }\n      this.toggle();\n    }\n  };\n\n  get element() {\n    return this.element_;\n  }\n\n  get controlElement() {\n    return this.controlElement_;\n  }\n\n  get isDisabled() {\n    return (this.controlElement.hasAttribute('disabled') &&\n      this.controlElement.getAttribute('disabled').toLowerCase() !== 'false') ||\n      (this.controlElement.hasAttribute('aria-disabled') &&\n      this.controlElement.getAttribute('aria-disabled').toLowerCase() !== 'false');\n  }\n\n  get isExpanded() {\n    return this.controlElement.hasAttribute('aria-expanded') &&\n      this.controlElement.getAttribute('aria-expanded').toLowerCase() === 'true';\n  }\n\n  get regionIds() {\n    return this.controlElement.hasAttribute('aria-controls')\n      ? this.controlElement.getAttribute('aria-controls').split(' ')\n      : [];\n  }\n\n  get regionElements() {\n    return this.regionIds\n      .map(id => document.querySelector(`#${id}`))\n      .filter( el => el != null);\n  }\n\n  collapse() {\n    if(!this.isDisabled && this.isExpanded) {\n      if(this.dispatchToggleEvent('collapse')) {\n        this.controlElement.setAttribute('aria-expanded', 'false');\n        const regions = this.regionElements.slice(0);\n        for (let i = regions.length - 1; i >= 0; --i) {\n          regions[i].setAttribute('hidden', '');\n        }\n      }\n    }\n  }\n\n  expand() {\n    if(!this.isDisabled && !this.isExpanded) {\n      if(this.dispatchToggleEvent('expand')) {\n        this.controlElement.setAttribute('aria-expanded', 'true');\n        this.regionElements.forEach(region => region.removeAttribute('hidden'));\n      }\n    }\n  }\n\n  toggle() {\n    if (this.isExpanded) {\n      this.collapse();\n    }\n    else {\n      this.expand();\n    }\n  }\n\n  dispatchToggleEvent(action) {\n    return this.element.dispatchEvent(\n      new CustomEvent('toggle', {\n        bubbles: true,\n        cancelable: true,\n        detail: {\n          action: action\n        }\n      })\n    );\n  }\n\n  disableToggle() {\n    this.controlElement.setAttribute('aria-disabled', true);\n  }\n\n  enableToggle() {\n    this.controlElement.removeAttribute('aria-disabled');\n  }\n\n  addRegionId(regionId) {\n    const ids = this.regionIds;\n    if(!ids.find(id => regionId === id)) {\n      ids.push(regionId);\n      this.controlElement.setAttribute('aria-controls', ids.join(' '));\n    }\n  }\n\n  addRegionElement(region) {\n    if(!(region.classList.contains(COLLAPSIBLE_GROUP_CLASS) ||\n      region.classList.contains(COLLAPSIBLE_REGION_CLASS))) {\n      region.classList.add(COLLAPSIBLE_GROUP_CLASS);\n    }\n\n    if(!region.hasAttribute('role')) {\n      const role = region.classList.contains(COLLAPSIBLE_GROUP_CLASS) ? 'group' : 'region';\n      region.setAttribute('role', role);\n    }\n\n    if(!region.hasAttribute('id')) {\n      region.id = `${region.getAttribute('role')}-${randomString()}`;\n    }\n\n    if(this.isExpanded) {\n      region.removeAttribute('hidden');\n    }\n    else {\n      region.setAttribute('hidden', '');\n    }\n    this.addRegionId(region.id);\n  }\n\n  removeRegionElement(region) {\n    if(region && region.id) {\n      const ids = this.regionIds.filter(id => id === region.id);\n      this.controlElement.setAttribute('aria-controls', ids.join(' '));\n    }\n  }\n\n  removeListeners() {\n    this.controlElement.removeEventListener('keydown', this.keyDownHandler);\n    this.controlElement.removeEventListener('click', this.clickHandler);\n  }\n\n  init() {\n    const initControl = () => {\n      // Find the button element\n      this.controlElement_ = this.element.querySelector(`.${COLLAPSIBLE_CONTROL_CLASS}`) || this.element;\n\n      // Add \"aria-expanded\" attribute if not present\n      if(!this.controlElement.hasAttribute('aria-expanded')) {\n        this.controlElement.setAttribute('aria-expanded', 'false');\n      }\n\n      // Add role=button if control != <button>\n      if(this.controlElement.nodeName.toLowerCase() !== 'button') {\n        this.controlElement.setAttribute('role', 'button');\n      }\n\n      // Add tabindex\n      if(!isFocusable(this.controlElement) && !this.controlElement.hasAttribute('tabindex')) {\n        this.controlElement.setAttribute('tabindex', '0');\n      }\n    };\n\n    const initRegions = () => {\n      let regions = [];\n      if(!this.controlElement.hasAttribute('aria-controls')) {\n        // Add siblings as collapsible region(s)\n        let r = this.element.nextElementSibling;\n        while(r) {\n          if(r.classList.contains(COLLAPSIBLE_GROUP_CLASS) ||\n            r.classList.contains(COLLAPSIBLE_REGION_CLASS)) {\n            regions.push(r);\n          }\n          else if(r.classList.contains(JS_COLLAPSIBLE)) {\n            // A new collapsible component\n            break;\n          }\n          r = r.nextElementSibling;\n        }\n      }\n      else {\n        regions = this.regionElements;\n      }\n      regions.forEach(region => this.addRegionElement(region));\n    };\n\n    const addListeners = () => {\n      this.controlElement.addEventListener('keydown', this.keyDownHandler);\n      this.controlElement.addEventListener('click', this.clickHandler);\n    };\n\n    initControl();\n    initRegions();\n    this.removeListeners();\n    addListeners();\n  }\n\n  downgrade() {\n    this.removeListeners();\n  }\n\n}\n\n(function() {\n  'use strict';\n\n  /**\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\n  const MaterialExtCollapsible = function MaterialExtCollapsible(element) {\n    this.element_ = element;\n    this.collapsible = null;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtCollapsible'] = MaterialExtCollapsible;\n\n  /**\n   * Initialize component\n   */\n  MaterialExtCollapsible.prototype.init = function() {\n    if (this.element_) {\n      this.collapsible = new Collapsible(this.element_);\n      this.element_.classList.add(IS_UPGRADED);\n\n      // Listen to 'mdl-componentdowngraded' event\n      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n    }\n  };\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   */\n  MaterialExtCollapsible.prototype.mdlDowngrade_ = function() {\n    this.collapsible.downgrade();\n  };\n\n\n  // Public methods.\n\n  /**\n   * Get control element.\n   * @return {HTMLElement} element The element that controls the collapsible region.\n   * @public\n   */\n  MaterialExtCollapsible.prototype.getControlElement = function() {\n    return this.collapsible.controlElement;\n  };\n  MaterialExtCollapsible.prototype['getControlElement'] = MaterialExtCollapsible.prototype.getControlElement;\n\n  /**\n   * Get region elements controlled by this collapsible\n   * @returns {Array<HTMLElement>} the collapsible region elements\n   * @public\n   */\n  MaterialExtCollapsible.prototype.getRegionElements = function() {\n    return this.collapsible.regionElements;\n  };\n  MaterialExtCollapsible.prototype['getRegionElements'] = MaterialExtCollapsible.prototype.getRegionElements;\n\n  /**\n   * Add region elements.\n   * @param {Array<HTMLElement>} elements The element that will be upgraded.\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.addRegionElements = function(...elements) {\n    elements.forEach(element => this.collapsible.addRegionElement(element));\n  };\n  MaterialExtCollapsible.prototype['addRegionElements'] = MaterialExtCollapsible.prototype.addRegionElements;\n\n  /**\n   * Remove collapsible region(s) from component.\n   * Note: This operation does not delete the element from the DOM tree.\n   * @param {Array<HTMLElement>} elements The element that will be upgraded.\n   * @public\n   */\n  MaterialExtCollapsible.prototype.removeRegionElements = function(...elements) {\n    elements.forEach(element => this.collapsible.removeRegionElement(element));\n  };\n  MaterialExtCollapsible.prototype['removeRegionElements'] = MaterialExtCollapsible.prototype.removeRegionElements;\n\n  /**\n   * Expand collapsible region(s)\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.expand = function() {\n    this.collapsible.expand();\n  };\n  MaterialExtCollapsible.prototype['expand'] = MaterialExtCollapsible.prototype.expand;\n\n  /**\n   * Collapse collapsible region(s)\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.collapse = function() {\n    this.collapsible.collapse();\n  };\n  MaterialExtCollapsible.prototype['collapse'] = MaterialExtCollapsible.prototype.collapse;\n\n  /**\n   * Toggle collapsible region(s)\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.toggle = function() {\n    this.collapsible.toggle();\n  };\n  MaterialExtCollapsible.prototype['toggle'] = MaterialExtCollapsible.prototype.toggle;\n\n  /**\n   * Check whether component has aria-expanded state true\n   * @return {Boolean} true if aria-expanded=\"true\", otherwise false\n   */\n  MaterialExtCollapsible.prototype.isExpanded = function() {\n    return this.collapsible.isExpanded;\n  };\n  MaterialExtCollapsible.prototype['isExpanded'] = MaterialExtCollapsible.prototype.isExpanded;\n\n  /**\n   * Check whether component has aria-disabled state set to true\n   * @return {Boolean} true if aria-disabled=\"true\", otherwise false\n   */\n  MaterialExtCollapsible.prototype.isDisabled = function() {\n    return this.collapsible.isDisabled;\n  };\n  MaterialExtCollapsible.prototype['isDisabled'] = MaterialExtCollapsible.prototype.isDisabled;\n\n  /**\n   * Disables toggling of collapsible region(s)\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.disableToggle = function() {\n    this.collapsible.disableToggle();\n  };\n  MaterialExtCollapsible.prototype['disableToggle'] = MaterialExtCollapsible.prototype.disableToggle;\n\n  /**\n   * Enables toggling of collapsible region(s)\n   * @return {void}\n   * @public\n   */\n  MaterialExtCollapsible.prototype.enableToggle = function() {\n    this.collapsible.enableToggle();\n  };\n  MaterialExtCollapsible.prototype['enableToggle'] = MaterialExtCollapsible.prototype.enableToggle;\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtCollapsible,\n    classAsString: 'MaterialExtCollapsible',\n    cssClass: JS_COLLAPSIBLE,\n    widget: true\n  });\n\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/collapsible/collapsible.js","/**\n * @license\n * Copyright 2016-2017 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n\nimport {jsonStringToObject} from '../utils/json-utils';\nimport {\n  IS_UPGRADED,\n} from '../utils/constants';\n\nconst JS_FORMAT_FIELD = 'mdlext-js-formatfield';\nconst FORMAT_FIELD_COMPONENT = 'MaterialExtFormatfield';\n\n/**\n * Detect browser locale\n * @returns {string} the locale\n * @see http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference\n */\nconst browserLanguage = () => {\n  return navigator.languages\n    ? navigator.languages[0]\n    : navigator.language || navigator.userLanguage;\n};\n\n/**\n * The formatfield  formats an input field  using language sensitive number formatting.\n */\n\nclass FormatField {\n  static timer = null;\n\n  element_;\n  input_;\n  options_ = {};\n  intlGroupSeparator_;\n  intlDecimalSeparator_;\n\n  constructor(element) {\n    this.element_ = element;\n    this.init();\n  }\n\n  clickHandler = () => {\n    clearTimeout(FormatField.timer);\n  };\n\n  focusInHandler = () => {\n    if(!(this.input.readOnly || this.input.disabled)) {\n      this.input.value = this.unformatInput();\n      //setTimeout(() => this.input.setSelectionRange(0, this.input.value.length), 20);\n      FormatField.timer = setTimeout(() => this.input.select(), 200);\n    }\n  };\n\n  focusOutHandler = () => {\n    clearTimeout(FormatField.timer);\n\n    if(!(this.input.readOnly || this.input.disabled)) {\n      this.formatValue();\n    }\n  };\n\n  get element() {\n    return this.element_;\n  }\n\n  get input() {\n    return this.input_;\n  }\n\n  get options() {\n    return this.options_;\n  }\n\n  stripSeparatorsFromValue() {\n    const doReplace = () => this.input.value\n      .replace(/\\s/g, '')\n      .replace(new RegExp(this.options.groupSeparator, 'g'), '')\n      .replace(this.options.decimalSeparator, '.');\n      //.replace(this.intlGroupSeparator_, ''),\n      //.replace(this.intlDecimalSeparator_, '.');\n\n    return this.input.value ? doReplace() : this.input.value;\n  }\n\n  fixSeparators(value) {\n    const doReplace = () => value\n      .replace(new RegExp(this.intlGroupSeparator_, 'g'), this.options.groupSeparator)\n      .replace(this.intlDecimalSeparator_, this.options.decimalSeparator);\n\n    return value ? doReplace() : value;\n  }\n\n  formatValue() {\n    if(this.input.value) {\n      const v = new Intl.NumberFormat(this.options.locales, this.options)\n        .format(this.stripSeparatorsFromValue());\n\n      if('NaN' !== v) {\n        this.input.value = this.fixSeparators(v);\n      }\n    }\n  }\n\n  unformat() {\n    const doReplace = () => this.input.value\n      .replace(/\\s/g, '')\n      .replace(new RegExp(this.options.groupSeparator, 'g'), '')\n      .replace(this.options.decimalSeparator, '.');\n\n    return this.input.value ? doReplace() : this.input.value;\n  }\n\n  unformatInput() {\n    const doReplace = () => this.input.value\n      .replace(/\\s/g, '')\n      .replace(new RegExp(this.options.groupSeparator, 'g'), '');\n\n    return this.input.value ? doReplace() : this.input.value;\n  }\n\n  removeListeners() {\n    this.input.removeEventListener('click', this.clickHandler);\n    this.input.removeEventListener('focusin', this.focusInHandler);\n    this.input.removeEventListener('focusout', this.focusOutHandler);\n  }\n\n  init() {\n    const addListeners = () => {\n      this.input.addEventListener('click', this.clickHandler);\n      this.input.addEventListener('focusin', this.focusInHandler);\n      this.input.addEventListener('focusout', this.focusOutHandler);\n    };\n\n    const addOptions = () => {\n      const opts = this.element.getAttribute('data-formatfield-options') ||\n        this.input.getAttribute('data-formatfield-options');\n      if(opts) {\n        this.options_ = jsonStringToObject(opts, this.options);\n      }\n    };\n\n    const addLocale = () => {\n      if(!this.options.locales) {\n        this.options.locales = browserLanguage() || 'en-US'; //'nb-NO', //'en-US',\n      }\n    };\n\n    const addGrouping = () => {\n      const s = (1234.5).toLocaleString(this.options.locales, {\n        style: 'decimal',\n        useGrouping: true,\n        minimumFractionDigits: 1,\n        maximumFractionDigits: 1\n      });\n\n      this.intlGroupSeparator_ = s.charAt(1);\n      this.intlDecimalSeparator_ = s.charAt(s.length-2);\n      this.options.groupSeparator = this.options.groupSeparator || this.intlGroupSeparator_;\n      this.options.decimalSeparator = this.options.decimalSeparator || this.intlDecimalSeparator_;\n\n      if(this.options.groupSeparator === this.options.decimalSeparator) {\n        const e = `Error! options.groupSeparator, \"${this.options.groupSeparator}\" ` +\n          'and options.decimalSeparator, ' +\n          `\"${this.options.decimalSeparator}\" should not be equal`;\n        throw new Error(e);\n      }\n    };\n\n    this.input_ = this.element.querySelector('input') || this.element;\n\n    addOptions();\n    addLocale();\n    addGrouping();\n    this.formatValue();\n    addListeners();\n  }\n\n  downgrade() {\n    this.removeListeners();\n  }\n\n}\n\n(function() {\n  'use strict';\n\n  /**\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\n  const MaterialExtFormatfield = function MaterialExtFormatfield(element) {\n    this.element_ = element;\n    this.formatField_ = null;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtFormatfield'] = MaterialExtFormatfield;\n\n  /**\n   * Initialize component\n   */\n  MaterialExtFormatfield.prototype.init = function() {\n    if (this.element_) {\n      this.element_.classList.add(IS_UPGRADED);\n      this.formatField_ = new FormatField(this.element_);\n\n      // Listen to 'mdl-componentdowngraded' event\n      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n    }\n  };\n\n  /**\n   * Get options object\n   *\n   * @public\n   *\n   * @returns {Object} the options object\n   */\n  MaterialExtFormatfield.prototype.getOptions = function() {\n    return this.formatField_.options;\n  };\n  MaterialExtFormatfield.prototype['getOptions'] = MaterialExtFormatfield.prototype.getOptions;\n\n\n  /**\n   * A unformatted value is a string value where the locale specific decimal separator\n   * is replaced with a '.' separator and group separators are stripped.\n   * The returned value is suitable for parsing to a JavaScript numerical value.\n   *\n   * @example\n   * input.value = '1 234,5';\n   * inputElement.MaterialExtFormatfield.getUnformattedValue();\n   * // Returns '1234.5'\n   *\n   * @public\n   *\n   * @returns {String} the unformatted value\n   */\n  MaterialExtFormatfield.prototype.getUnformattedValue = function() {\n    return this.formatField_.unformat();\n  };\n  MaterialExtFormatfield.prototype['getUnformattedValue'] = MaterialExtFormatfield.prototype.getUnformattedValue;\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   */\n  MaterialExtFormatfield.prototype.mdlDowngrade_ = function() {\n    this.formatField_.downgrade();\n  };\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtFormatfield,\n    classAsString: FORMAT_FIELD_COMPONENT,\n    cssClass: JS_FORMAT_FIELD,\n    widget: true\n  });\n\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/formatfield/formatfield.js","import './utils';\nimport './accordion/accordion';\nimport './collapsible/collapsible';\nimport './carousel/carousel';\nimport './lightboard/lightboard';\nimport './lightbox/lightbox';\nimport './menu-button/menu-button';\nimport './selectfield/selectfield';\nimport './formatfield/formatfield';\nimport './sticky-header/sticky-header';\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n/**\n * A lightboard is a translucent surface illuminated from behind, used for situations\n * where a shape laid upon the surface needs to be seen with high contrast. In the \"old days\" of photography\n * photograpers used a lightboard to get a quick view of their slides. The goal is to create a responsive lightbox\n * design, based on flex layout, similar to what is used in Adobe LightRoom to browse images.\n */\n\nimport {\n  VK_ENTER,\n  VK_SPACE,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN,\n  IS_UPGRADED,\n  MDL_RIPPLE,\n  MDL_RIPPLE_COMPONENT,\n  MDL_RIPPLE_EFFECT,\n  MDL_RIPPLE_EFFECT_IGNORE_EVENTS\n} from '../utils/constants';\n\nconst MDL_RIPPLE_CONTAINER = 'mdlext-lightboard__slide__ripple-container';\n\n(function() {\n  'use strict';\n\n  //const LIGHTBOARD = 'mdlext-lightboard';\n  const LIGHTBOARD_ROLE = 'grid';\n  const SLIDE = 'mdlext-lightboard__slide';\n  const SLIDE_ROLE  = 'gridcell';\n  const SLIDE_TABSTOP = 'mdlext-lightboard__slide__frame';\n  /**\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtLightboard = function MaterialExtLightboard(element) {\n    // Stores the element.\n    this.element_ = element;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtLightboard'] = MaterialExtLightboard;\n\n\n  // Helpers\n  const getSlide = element => {\n    return element ? element.closest(`.${SLIDE}`) : null;\n  };\n\n\n\n  // Private methods.\n\n  /**\n   * Select a slide, i.e. set aria-selected=\"true\"\n   * @param element\n   * @private\n   */\n  MaterialExtLightboard.prototype.selectSlide_ = function(element) {\n    const slide = getSlide(element);\n    if( slide && !slide.hasAttribute('aria-selected') ) {\n      [...this.element_.querySelectorAll(`.${SLIDE}[aria-selected=\"true\"]`)]\n        .forEach(selectedSlide => selectedSlide.removeAttribute('aria-selected'));\n\n      slide.setAttribute('aria-selected', 'true');\n    }\n  };\n\n\n  /**\n   * Dispatch select event\n   * @param {Element} slide The slide that caused the event\n   * @private\n   */\n  MaterialExtLightboard.prototype.dispatchSelectEvent_ = function ( slide ) {\n    this.element_.dispatchEvent(\n      new CustomEvent('select', {\n        bubbles: true,\n        cancelable: true,\n        detail: { source: slide }\n      })\n    );\n  };\n\n  /**\n   * Handles custom command event, 'first', 'next', 'prev', 'last', 'select' or upgrade\n   * @param event. A custom event\n   * @private\n   */\n  MaterialExtLightboard.prototype.commandHandler_ = function( event ) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if(event && event.detail) {\n      this.command(event.detail);\n    }\n  };\n\n\n  // Public methods\n\n  /**\n   * Initialize lightboard slides\n   * @public\n   */\n  MaterialExtLightboard.prototype.upgradeSlides = function() {\n\n    const addRipple = slide => {\n      // Use slide frame as ripple container\n      if(!slide.querySelector(`.${MDL_RIPPLE_CONTAINER}`)) {\n        const a = slide.querySelector(`.${SLIDE_TABSTOP}`);\n        if(a) {\n          const rippleContainer = a;\n          rippleContainer.classList.add(MDL_RIPPLE_CONTAINER);\n          rippleContainer.classList.add(MDL_RIPPLE_EFFECT);\n          const ripple = document.createElement('span');\n          ripple.classList.add(MDL_RIPPLE);\n          rippleContainer.appendChild(ripple);\n          componentHandler.upgradeElement(rippleContainer, MDL_RIPPLE_COMPONENT);\n        }\n      }\n    };\n\n    const hasRippleEffect = this.element_.classList.contains(MDL_RIPPLE_EFFECT);\n\n    [...this.element_.querySelectorAll(`.${SLIDE}`)].forEach( slide => {\n\n      slide.setAttribute('role', SLIDE_ROLE);\n\n      if(!slide.querySelector('a')) {\n        slide.setAttribute('tabindex', '0');\n      }\n      if(hasRippleEffect) {\n        addRipple(slide);\n      }\n    });\n  };\n  MaterialExtLightboard.prototype['upgradeSlides'] = MaterialExtLightboard.prototype.upgradeSlides;\n\n\n  /**\n   * Execute command\n   * @param detail\n   * @public\n   */\n  MaterialExtLightboard.prototype.command = function( detail ) {\n\n    const firstSlide = () => {\n      return this.element_.querySelector(`.${SLIDE}:first-child`);\n    };\n\n    const lastSlide = () => {\n      return this.element_.querySelector(`.${SLIDE}:last-child`);\n    };\n\n    const nextSlide = () => {\n      const slide = this.element_.querySelector(`.${SLIDE}[aria-selected=\"true\"]`).nextElementSibling;\n      return slide ? slide : firstSlide();\n    };\n\n    const prevSlide = () => {\n      const slide = this.element_.querySelector(`.${SLIDE}[aria-selected=\"true\"]`).previousElementSibling;\n      return slide ? slide : lastSlide();\n    };\n\n    if(detail && detail.action) {\n\n      const { action, target } = detail;\n\n      let slide;\n      switch (action.toLowerCase()) {\n        case 'select':\n          slide = getSlide(target);\n          this.dispatchSelectEvent_(slide);\n          break;\n        case 'first':\n          slide = firstSlide();\n          break;\n        case 'next':\n          slide = nextSlide();\n          break;\n        case 'prev':\n          slide = prevSlide();\n          break;\n        case 'last':\n          slide = lastSlide();\n          break;\n        case 'upgrade':\n          this.upgradeSlides();\n          break;\n        default:\n          throw new Error(`Unknown action \"${action}\". Action must be one of \"first\", \"next\", \"prev\", \"last\", \"select\" or \"upgrade\"`);\n      }\n\n      if (slide) {\n        const a = slide.querySelector('a');\n        if (a) {\n          a.focus();\n        }\n        else {\n          slide.focus();\n        }\n\n        // Workaround for JSDom testing:\n        // In JsDom 'element.focus()' does not trigger any focus event\n        if(!slide.hasAttribute('aria-selected')) {\n          this.selectSlide_(slide);\n        }\n\n      }\n    }\n  };\n  MaterialExtLightboard.prototype['command'] = MaterialExtLightboard.prototype.command;\n\n\n  /**\n   * Initialize component\n   */\n  MaterialExtLightboard.prototype.init = function() {\n\n    const keydownHandler = event => {\n\n      if(event.target !== this.element_) {\n        let action;\n        let target;\n        switch (event.keyCode) {\n          case VK_HOME:\n            action = 'first';\n            break;\n          case VK_END:\n            action = 'last';\n            break;\n          case VK_ARROW_UP:\n          case VK_ARROW_LEFT:\n            action = 'prev';\n            break;\n          case VK_ARROW_DOWN:\n          case VK_ARROW_RIGHT:\n            action = 'next';\n            break;\n          case VK_ENTER:\n          case VK_SPACE:\n            action = 'select';\n            target = event.target;\n            break;\n        }\n        if(action)  {\n          event.preventDefault();\n          event.stopPropagation();\n          this.command( { action: action, target: target } );\n        }\n      }\n    };\n\n    const clickHandler = event => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      if(event.target !== this.element_) {\n        this.command( { action: 'select', target: event.target } );\n      }\n    };\n\n    const focusHandler = event => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      if(event.target !== this.element_) {\n        this.selectSlide_(event.target);\n      }\n    };\n\n\n    if (this.element_) {\n      this.element_.setAttribute('role', LIGHTBOARD_ROLE);\n\n      if (this.element_.classList.contains(MDL_RIPPLE_EFFECT)) {\n        this.element_.classList.add(MDL_RIPPLE_EFFECT_IGNORE_EVENTS);\n      }\n\n      // Remove listeners, just in case ...\n      this.element_.removeEventListener('command', this.commandHandler_);\n      this.element_.removeEventListener('keydown', keydownHandler);\n      this.element_.removeEventListener('click', clickHandler);\n      this.element_.removeEventListener('focus', focusHandler);\n\n      this.element_.addEventListener('command', this.commandHandler_.bind(this), false);\n      this.element_.addEventListener('keydown', keydownHandler, true);\n      this.element_.addEventListener('click', clickHandler, true);\n      this.element_.addEventListener('focus', focusHandler, true);\n\n      this.upgradeSlides();\n\n      this.element_.classList.add(IS_UPGRADED);\n    }\n  };\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  /* jshint undef:false */\n  componentHandler.register({\n    constructor: MaterialExtLightboard,\n    classAsString: 'MaterialExtLightboard',\n    cssClass: 'mdlext-js-lightboard',\n    widget: true\n  });\n\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/lightboard/lightboard.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n\n/**\n * Responsive Lightbox\n */\n\nimport fullThrottle from '../utils/full-throttle';\nimport {\n  VK_ESC,\n  VK_SPACE,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN,\n  IS_UPGRADED\n} from '../utils/constants';\n\n(function() {\n  'use strict';\n\n  const LIGHTBOX = 'mdlext-lightbox';\n  const LIGHTBOX_SLIDER = 'mdlext-lightbox__slider';\n  const LIGHTBOX_SLIDER_SLIDE = 'mdlext-lightbox__slider__slide';\n  const STICKY_FOOTER = 'mdlext-lightbox--sticky-footer';\n  const BUTTON = 'mdl-button';\n\n  /**\n   * https://github.com/google/material-design-lite/issues/4205\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtLightbox = function MaterialExtLightbox(element) {\n    // Stores the element.\n    this.element_ = element;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtLightbox'] = MaterialExtLightbox;\n\n\n  /**\n   * Handle keypress\n   * @param event\n   * @private\n   */\n  MaterialExtLightbox.prototype.keyDownHandler_ = function(event) {\n\n    if (event) {\n      if ( event.keyCode === VK_ESC || event.keyCode === VK_SPACE\n        || event.keyCode === VK_END || event.keyCode === VK_HOME\n        || event.keyCode === VK_ARROW_UP || event.keyCode === VK_ARROW_LEFT\n        || event.keyCode === VK_ARROW_DOWN || event.keyCode === VK_ARROW_RIGHT) {\n\n        if(event.keyCode !== VK_ESC) {\n          event.preventDefault();\n          event.stopPropagation();\n        }\n\n        let action = 'first';\n        if (event.keyCode === VK_END) {\n          action = 'last';\n        }\n        else if (event.keyCode === VK_ARROW_UP || event.keyCode === VK_ARROW_LEFT) {\n          action = 'prev';\n        }\n        else if (event.keyCode === VK_ARROW_DOWN || event.keyCode === VK_ARROW_RIGHT) {\n          action = 'next';\n        }\n        else if (event.keyCode === VK_SPACE) {\n          action = 'select';\n        }\n        else if (event.keyCode === VK_ESC) {\n          action = 'cancel';\n        }\n\n        dispatchAction_(action, this);\n      }\n    }\n  };\n\n  /**\n   * Handle button clicks\n   * @param event\n   * @private\n   */\n  MaterialExtLightbox.prototype.buttonClickHandler_ = function(event) {\n\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      dispatchAction_(this.getAttribute('data-action') || '', this);\n\n      const n = this.closest(`.${LIGHTBOX}`);\n      if(n) {\n        n.focus();\n      }\n    }\n  };\n\n  /**\n   * Dispatches an action custom event\n   * @param action\n   * @param source\n   * @param target\n   * @private\n   */\n  const dispatchAction_ = (action, source, target = source) => {\n\n    target.dispatchEvent(new CustomEvent('action', {\n      bubbles: true,\n      cancelable: true,\n      detail: {\n        action: action || '',\n        source: source\n      }\n    }));\n  };\n\n  /**\n   * Reposition dialog if component parent element is \"DIALOG\"\n   * @param lightboxElement\n   * @private\n   */\n  const repositionDialog_ = lightboxElement => {\n    const footerHeight = (footer, isSticky) => isSticky && footer ? footer.offsetHeight : 0;\n\n    const reposition = (dialog, fh) => {\n      if (window.getComputedStyle(dialog).position === 'absolute') {\n        const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n        const topValue = scrollTop + (window.innerHeight - dialog.offsetHeight - fh) / 2;\n        dialog.style.top = `${Math.max(scrollTop, topValue)}px`;\n      }\n    };\n\n    const p = lightboxElement.parentNode;\n    const dialog = p && p.nodeName === 'DIALOG' ? p : null;\n\n    if(dialog && dialog.hasAttribute('open')) {\n      lightboxElement.style.width = 'auto';\n      lightboxElement.style.maxWidth = '100%';\n      const img = lightboxElement.querySelector('img');\n      if(img) {\n        lightboxElement.style.maxWidth = img.naturalWidth !== undefined ? `${img.naturalWidth}px` : `${img.width}px` || '100%';\n      }\n\n      const fh = footerHeight(lightboxElement.querySelector('footer'), lightboxElement.classList.contains(STICKY_FOOTER));\n      const vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0) - fh;\n      if (dialog.offsetHeight > vh) {\n        let n = 0;\n        while(dialog.offsetHeight > vh && ++n < 4) {\n          lightboxElement.style.width = `${lightboxElement.offsetWidth * vh / lightboxElement.offsetHeight}px`;\n        }\n      }\n      reposition(dialog, fh);\n    }\n  };\n\n  /**\n   * Handle image load\n   * @param event\n   * @private\n   */\n\n  MaterialExtLightbox.prototype.imgLoadHandler_ = function( /*event*/ ) {\n    repositionDialog_(this);\n  };\n\n\n  /**\n   * Handle image drag\n   * @param event\n   * @private\n     */\n  MaterialExtLightbox.prototype.imgDragHandler_ = function(event ) {\n\n    const setStyles = ( element, properties ) => {\n      //noinspection JSAnnotator\n      for(const [key, value] of Object.entries(properties)) {\n        element.style[key] = value;\n      }\n      // ... or:\n      //for (const key in properties) {\n      //  element.style[key] = properties[key];\n      //}\n    };\n\n    event.preventDefault();\n    //event.stopPropagation();\n\n    const x = event.clientX || (event.touches !== undefined ? event.touches[0].clientX : 0);\n\n    const img = this;\n    img.style.opacity = '0.2';\n\n    const slider = document.createElement('div');\n    slider.classList.add(LIGHTBOX_SLIDER);\n    setStyles(slider, {'width': `${img.offsetWidth}px`, 'height': `${img.offsetHeight}px`} );\n\n    let slide  = document.createElement('div');\n    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n    slide.textContent = '>';\n    setStyles(slide, {\n      'width'           : `${img.offsetWidth}px`,\n      'height'          : `${img.offsetHeight}px`,\n      'line-height'     : `${img.offsetHeight}px`,\n      'font-size'       : `${img.offsetHeight/4}px`,\n      'text-align'      : 'right',\n      'background-image': `url(\"${img.getAttribute('data-img-url-prev') || ''}\")`\n    });\n    slider.appendChild(slide);\n\n    slide  = document.createElement('div');\n    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n    setStyles(slide, {\n      'width'           : `${img.offsetWidth}px`,\n      'height'          : `${img.offsetHeight}px`,\n      'background-image': `url(\"${img.src}\")`\n    });\n    slider.appendChild(slide);\n\n    slide  = document.createElement('div');\n    slide.classList.add(LIGHTBOX_SLIDER_SLIDE);\n    slide.textContent = '<';\n    setStyles(slide, {\n      'width'           : `${img.offsetWidth}px`,\n      'height'          : `${img.offsetHeight}px`,\n      'line-height'     : `${img.offsetHeight}px`,\n      'font-size'       : `${img.offsetHeight/4}px`,\n      'text-align'      : 'left',\n      'background-image': `url(\"${img.getAttribute('data-img-url-next') || ''}\")`\n    });\n    slider.appendChild(slide);\n\n    img.parentNode.appendChild(slider);\n\n\n    // drag handler\n    const drag = e => {\n      e.preventDefault();\n      const dx = (e.clientX || (e.touches !== undefined ? e.touches[0].clientX : 0)) - x; // TODO: maybe rewrite to improve performance\n\n      if(slider.offsetWidth - Math.abs(dx) > 19) {\n        slider.style.left = `${dx}px`;\n      }\n    };\n\n    // end drag handler\n    const endDrag = e => {\n      e.preventDefault();\n      //e.stopPropagation();\n\n      window.removeEventListener('mousemove', drag);\n      window.removeEventListener('touchmove', drag);\n      window.removeEventListener('mouseup', endDrag);\n      window.removeEventListener('touchend', endDrag);\n\n      const dx = slider.offsetLeft;\n      img.parentNode.removeChild(slider);\n      img.style.opacity = '1.0';\n\n      if(Math.abs(dx) > 19) {\n        dispatchAction_( (dx > 0 ? 'prev' : 'next') , img);\n      }\n    };\n\n    window.addEventListener('mousemove', drag);\n    window.addEventListener('touchmove', drag);\n    window.addEventListener('mouseup', endDrag);\n    window.addEventListener('touchend',endDrag);\n  };\n\n\n  /**\n   * Initialize component\n   */\n  MaterialExtLightbox.prototype.init = function() {\n\n    if (this.element_) {\n      // Do the init required for this component to work\n      this.element_.addEventListener('keydown', this.keyDownHandler_.bind(this.element_), true);\n\n      if(!Number.isInteger(this.element_.getAttribute('tabindex'))) {\n        this.element_.setAttribute('tabindex', 1);\n      }\n\n      [...this.element_.querySelectorAll(`.${BUTTON}`)].forEach( button =>\n        button.addEventListener('click', this.buttonClickHandler_.bind(button), false)\n      );\n\n      const figcaption = this.element_.querySelector('figcaption');\n      if(figcaption) {\n        figcaption.addEventListener('click', this.buttonClickHandler_.bind(figcaption), false);\n      }\n\n      const footer = this.element_.querySelector('footer');\n      if(footer) {\n        footer.addEventListener('click', this.buttonClickHandler_.bind(footer), false);\n      }\n\n      const img = this.element_.querySelector('img');\n      if(img) {\n        img.addEventListener('load', this.imgLoadHandler_.bind(this.element_), false);\n        img.addEventListener('click', e => e.preventDefault(), true);\n        img.addEventListener('mousedown', this.imgDragHandler_.bind(img), true);\n        img.addEventListener('touchstart', this.imgDragHandler_.bind(img), true);\n      }\n      window.addEventListener('resize', fullThrottle( () => repositionDialog_(this.element_) ));\n      window.addEventListener('orientationchange', () => repositionDialog_(this.element_));\n\n      // Set upgraded flag\n      this.element_.classList.add(IS_UPGRADED);\n    }\n  };\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   *\n   * Nothing to downgrade\n   *\n  MaterialExtLightbox.prototype.mdlDowngrade_ = function() {\n  };\n  */\n\n  /**\n   * The component registers itself. It can assume componentHandler is available in the global scope.\n   */\n  /* jshint undef:false */\n  componentHandler.register({\n    constructor: MaterialExtLightbox,\n    classAsString: 'MaterialExtLightbox',\n    cssClass: 'mdlext-js-lightbox'\n  });\n\n})();\n\n\n\n\n// WEBPACK FOOTER //\n// ./src/lightbox/lightbox.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n\n/**\n * A menu button is a button that opens a menu. It is often styled as a\n * typical push button with a downward pointing arrow or triangle to hint\n * that activating the button will display a menu.\n */\nimport { randomString } from '../utils/string-utils';\nimport fullThrottle from '../utils/full-throttle';\nimport {\n  VK_TAB,\n  VK_ENTER,\n  VK_ESC,\n  VK_SPACE,\n  VK_END,\n  VK_HOME,\n  VK_ARROW_LEFT,\n  VK_ARROW_UP,\n  VK_ARROW_RIGHT,\n  VK_ARROW_DOWN,\n  IS_UPGRADED,\n} from '../utils/constants';\n\nimport { getScrollParents, tether } from '../utils/dom-utils';\n\nconst JS_MENU_BUTTON = 'mdlext-js-menu-button';\nconst MENU_BUTTON_MENU = 'mdlext-menu';\nconst MENU_BUTTON_MENU_ITEM = 'mdlext-menu__item';\nconst MENU_BUTTON_MENU_ITEM_SEPARATOR = 'mdlext-menu__item-separator';\n//const MDL_LAYOUT_CONTENT = 'mdl-layout__content';\n\n/**\n * Creates the menu controlled by the menu button\n * @param element\n * @return {{element: Element, selected: Element, open: (function(*=)), removeListeners: (function()), downgrade: (function())}}\n */\n\nconst menuFactory = element => {\n\n  let ariaControls = null;\n  let parentNode = null;\n\n  const removeAllSelected = () => {\n    [...element.querySelectorAll(`.${MENU_BUTTON_MENU_ITEM}[aria-selected=\"true\"]`)]\n      .forEach(selectedItem => selectedItem.removeAttribute('aria-selected'));\n  };\n\n  const setSelected = (item, force=false) => {\n    if(force || (item && !item.hasAttribute('aria-selected'))) {\n      removeAllSelected();\n      if(item) {\n        item.setAttribute('aria-selected', 'true');\n      }\n    }\n  };\n\n  const getSelected = () => {\n    return element.querySelector(`.${MENU_BUTTON_MENU_ITEM}[aria-selected=\"true\"]`);\n  };\n\n  const isDisabled = item => item && item.hasAttribute('disabled');\n\n  const isSeparator = item => item && item.classList.contains(MENU_BUTTON_MENU_ITEM_SEPARATOR);\n\n  const focus = item => {\n    if(item) {\n      item = item.closest(`.${MENU_BUTTON_MENU_ITEM}`);\n    }\n    if(item) {\n      item.focus();\n    }\n  };\n\n  const nextItem = current => {\n    let n = current.nextElementSibling;\n    if(!n) {\n      n = element.firstElementChild;\n    }\n    if(!isDisabled(n) && !isSeparator(n)) {\n      focus(n);\n    }\n    else {\n      let i = element.children.length;\n      while(n && i-- > 0) {\n        if(isDisabled(n) || isSeparator(n)) {\n          n = n.nextElementSibling;\n          if(!n) {\n            n = element.firstElementChild;\n          }\n        }\n        else {\n          focus(n);\n          break;\n        }\n      }\n    }\n  };\n\n  const previousItem = current => {\n    let p = current.previousElementSibling;\n    if(!p) {\n      p = element.lastElementChild;\n    }\n    if(!isDisabled(p) && !isSeparator(p)) {\n      focus(p);\n    }\n    else {\n      let i = element.children.length;\n      while(p && i-- > 0) {\n        if(isDisabled(p) || isSeparator(p)) {\n          p = p.previousElementSibling;\n          if(!p) {\n            p = element.lastElementChild;\n          }\n        }\n        else {\n          focus(p);\n          break;\n        }\n      }\n    }\n  };\n\n  const firstItem = () => {\n    const item = element.firstElementChild;\n    if(isDisabled(item) || isSeparator(item) ) {\n      nextItem(item);\n    }\n    else {\n      focus(item);\n    }\n  };\n\n  const lastItem = () => {\n    const item = element.lastElementChild;\n    if(isDisabled(item) || isSeparator(item)) {\n      previousItem(item);\n    }\n    else {\n      focus(item);\n    }\n  };\n\n  const selectItem = item => {\n    if(item && !isDisabled(item) && !isSeparator(item)) {\n      setSelected(item);\n      close(true, item);\n    }\n  };\n\n  const keyDownHandler = event => {\n\n    const item = event.target.closest(`.${MENU_BUTTON_MENU_ITEM}`);\n\n    switch (event.keyCode) {\n      case VK_ARROW_UP:\n      case VK_ARROW_LEFT:\n        if(item) {\n          previousItem(item);\n        }\n        else {\n          firstItem();\n        }\n        break;\n\n      case VK_ARROW_DOWN:\n      case VK_ARROW_RIGHT:\n        if(item) {\n          nextItem(item);\n        }\n        else {\n          lastItem();\n        }\n        break;\n\n      case VK_HOME:\n        firstItem();\n        break;\n\n      case VK_END:\n        lastItem();\n        break;\n\n      case VK_SPACE:\n      case VK_ENTER:\n        selectItem(item);\n        break;\n\n      case VK_ESC:\n        close(true);\n        break;\n\n      case VK_TAB:\n        // We do not have a \"natural\" tab order from menu, so the best we can do is to set focus back to the button\n        close(true);\n        break;\n\n      default:\n        return;\n    }\n    event.preventDefault();\n  };\n\n\n  const blurHandler = event => {\n\n    // See: https://github.com/facebook/react/issues/2011\n    const t = event.relatedTarget ||\n      event.explicitOriginalTarget || // FF\n      document.activeElement;         // IE11\n\n    //console.log('***** blur, target, relatedTarget', event.target, t);\n\n    try {\n      if (t) {\n        if (t.closest(`.${MENU_BUTTON_MENU}`) !== element && shouldClose(t)) {\n          close();\n        }\n      }\n      else {\n        close();\n      }\n    }\n    catch(err) {\n      // FF throws error: \"TypeError: n.closest is not a function\" if related target is a text node\n      close();\n    }\n  };\n\n  const clickHandler = event => {\n    //console.log('***** click, target', event.target);\n\n    event.preventDefault();\n    const t = event.target;\n    if (t && t.closest(`.${MENU_BUTTON_MENU}`) === element) {\n      const item = t.closest(`.${MENU_BUTTON_MENU_ITEM}`);\n      if (item) {\n        selectItem(item);\n      }\n    }\n    else {\n      if (shouldClose(t)) {\n        close();\n      }\n    }\n  };\n\n  const touchStartHandler = event => {\n    //console.log('***** touchStart, target', event.target);\n\n    const t = event.target;\n    if(!(t && t.closest(`.${MENU_BUTTON_MENU}`) === element)) {\n      if (event.type === 'touchstart') {\n        event.preventDefault();\n      }\n      close();\n    }\n  };\n\n  const addListeners = () => {\n    element.addEventListener('keydown', keyDownHandler, false);\n    element.addEventListener('blur', blurHandler, true);\n    element.addEventListener('click', clickHandler, true);\n    document.documentElement.addEventListener('touchstart', touchStartHandler, true);\n  };\n\n  const removeListeners = () => {\n    element.removeEventListener('keydown', keyDownHandler, false);\n    element.removeEventListener('blur', blurHandler, true);\n    element.removeEventListener('click', clickHandler, true);\n    document.documentElement.removeEventListener('touchstart', touchStartHandler, true);\n  };\n\n  const open = (controlElement, position='first') => {\n\n    ariaControls = controlElement.closest(`.${JS_MENU_BUTTON}`);\n\n    element.style['min-width'] = `${Math.max(124, controlElement.getBoundingClientRect().width)}px`;\n    element.removeAttribute('hidden');\n    tether(controlElement, element);\n\n    let item;\n    switch (position.toLowerCase()) {\n      case 'first':\n        firstItem();\n        break;\n\n      case 'last':\n        lastItem();\n        break;\n\n      case 'selected':\n        item = getSelected();\n        if(item && !item.hasAttribute('disabled')) {\n          focus(item);\n        }\n        else {\n          firstItem();\n        }\n        break;\n    }\n\n    addListeners();\n  };\n\n\n  const shouldClose = target => {\n    //console.log('***** shouldClose');\n\n    let result = false;\n    const btn = (target && target.closest(`.${JS_MENU_BUTTON}`)) || null;\n    if(!btn) {\n      result = true;\n    }\n    else if(btn.getAttribute('aria-controls') === element.id) {\n      if(btn !== ariaControls) {\n        result = true;\n      }\n    }\n    else {\n      result = true;\n    }\n    return result;\n  };\n\n  const close = (forceFocus = false, item = null) => {\n    removeListeners();\n\n    element.dispatchEvent(\n      new CustomEvent('_closemenu', {\n        bubbles: true,\n        cancelable: true,\n        detail: { forceFocus: forceFocus, item: item }\n      })\n    );\n  };\n\n  const addWaiAria = () => {\n    if (!element.hasAttribute('id')) {\n      // Generate a random id\n      element.id = `menu-button-${randomString()}`;\n    }\n    element.setAttribute('tabindex', '-1');\n    element.setAttribute('role', 'menu');\n    element.setAttribute('hidden', '');\n\n    [...element.querySelectorAll(`.${MENU_BUTTON_MENU_ITEM}`)].forEach( menuitem => {\n      menuitem.setAttribute('tabindex', '-1');\n      menuitem.setAttribute('role', 'menuitem');\n    });\n\n    [...element.querySelectorAll(`.${MENU_BUTTON_MENU_ITEM_SEPARATOR}`)].forEach( menuitem => {\n      menuitem.setAttribute('role', 'separator');\n    });\n  };\n\n  const init = () => {\n    addWaiAria();\n    parentNode = element.parentNode;\n    element.classList.add('is-upgraded');\n  };\n\n  const downgrade = () => {\n    removeListeners();\n    if(element.parentNode !== parentNode) {\n      parentNode.appendChild(element);\n    }\n    element.classList.remove('is-upgraded');\n  };\n\n  init();\n\n  return {\n    /**\n     * Get the menu element\n     * @returns {Element} the menu element\n     */\n    get element() {\n      return element;\n    },\n\n    /**\n     * Set selected menu item\n     * @param item\n     */\n    set selected(item) {\n      setSelected(item, true);\n    },\n\n    /**\n     * Open menu\n     * @param {Element} controlElement the element where the menu should be aligned to\n     * @param {String} position menuElement item to receive focus after menu element is opened\n     */\n    open: (controlElement, position='first') => open(controlElement, position),\n\n    /**\n     * Remove event listeners.\n     */\n    removeListeners: () => removeListeners(),\n\n    /**\n     * Downgrade menu\n     */\n    downgrade: () => downgrade(),\n  };\n};\n\n\n/**\n * The menubutton component\n */\n\nclass MenuButton {\n\n  constructor(element) {\n    this.element = element;\n    this.focusElement = undefined;\n    this.focusElementLastScrollPosition = undefined;\n    this.scrollElements = [];\n    this.menu = undefined;\n    this.selectedItem = null;\n    this.init();\n  }\n\n  keyDownHandler = event => {\n    if(!this.isDisabled()) {\n      switch (event.keyCode) {\n        case VK_ARROW_UP:\n          this.openMenu('last');\n          break;\n\n        case VK_ARROW_DOWN:\n          this.openMenu();\n          break;\n\n        case VK_SPACE:\n        case VK_ENTER:\n          this.openMenu('selected');\n          break;\n\n        case VK_ESC:\n          this.closeMenu();\n          break;\n\n        case VK_TAB:\n          this.closeMenu();\n          return;\n\n        default:\n          return;\n      }\n    }\n    //event.stopPropagation();\n    event.preventDefault();\n  };\n\n  clickHandler = () => {\n    if(!this.isDisabled()) {\n      if(this.element.getAttribute('aria-expanded').toLowerCase() === 'true') {\n        this.closeMenu(true);\n      }\n      else {\n        this.openMenu('selected');\n      }\n    }\n  };\n\n  /**\n   * Re-position menu if content is scrolled, window is resized or orientation change\n   * @see https://javascriptweblog.wordpress.com/2015/11/02/of-classes-and-arrow-functions-a-cautionary-tale/\n   */\n  recalcMenuPosition = fullThrottle( () => {\n    const c = this.focusElement.getBoundingClientRect();\n    const dx = this.focusElementLastScrollPosition.left - c.left;\n    const dy = this.focusElementLastScrollPosition.top - c.top;\n    const left = (parseFloat(this.menu.element.style.left) || 0) - dx;\n    const top = (parseFloat(this.menu.element.style.top) || 0) - dy;\n\n    this.menu.element.style.left = `${left}px`;\n    this.menu.element.style.top = `${top}px`;\n    this.focusElementLastScrollPosition = c;\n  });\n\n\n  positionChangeHandler = () => {\n    this.recalcMenuPosition(this);\n  };\n\n  closeMenuHandler = event => {\n    if(event && event.detail) {\n      if(event.detail.item && event.detail.item !== this.selectedItem) {\n        this.selectedItem = event.detail.item;\n        this.dispatchMenuSelect();\n      }\n      this.closeMenu(event.detail.forceFocus);\n    }\n  };\n\n  dispatchMenuSelect() {\n    this.element.dispatchEvent(\n      new CustomEvent('menuselect', {\n        bubbles: true,\n        cancelable: true,\n        detail: { source: this.selectedItem }\n      })\n    );\n  }\n\n  isDisabled() {\n    return this.element.hasAttribute('disabled');\n  }\n\n  removeListeners() {\n    this.element.removeEventListener('keydown', this.keyDownHandler);\n    this.element.removeEventListener('click', this.clickHandler);\n  }\n\n  openMenu(position='first') {\n\n    if(!this.isDisabled() && this.menu) {\n\n      // Close the menu if button position change\n      this.scrollElements = getScrollParents(this.element);\n      this.scrollElements.forEach(el => el.addEventListener('scroll', this.positionChangeHandler));\n\n      window.addEventListener('resize', this.positionChangeHandler);\n      window.addEventListener('orientationchange', this.positionChangeHandler);\n      this.menu.element.addEventListener('_closemenu', this.closeMenuHandler);\n\n      this.menu.selected = this.selectedItem;\n      this.menu.open(this.focusElement, position);\n      this.element.setAttribute('aria-expanded', 'true');\n\n      this.focusElementLastScrollPosition = this.focusElement.getBoundingClientRect();\n    }\n  }\n\n  closeMenu(forceFocus = false) {\n    if(this.menu) {\n      this.menu.removeListeners();\n      this.scrollElements.forEach(el => el.removeEventListener('scroll', this.positionChangeHandler));\n      window.removeEventListener('resize', this.positionChangeHandler);\n      window.removeEventListener('orientationchange', this.positionChangeHandler);\n      this.menu.element.removeEventListener('_closemenu', this.closeMenuHandler);\n\n      if (forceFocus) {\n        this.focus();\n      }\n      this.element.setAttribute('aria-expanded', 'false');\n      this.menu.element.setAttribute('hidden', '');\n    }\n  }\n\n  focus() {\n    if(!this.isDisabled()) {\n      this.focusElement.focus();\n    }\n  }\n\n  init() {\n    const addListeners = () => {\n      this.element.addEventListener('keydown', this.keyDownHandler);\n      this.element.addEventListener('click', this.clickHandler);\n    };\n\n    const addWaiAria = () => {\n      this.element.setAttribute('role', 'button');\n      this.element.setAttribute('aria-expanded', 'false');\n      this.element.setAttribute('aria-haspopup', 'true');\n    };\n\n    const addFocusElement = () => {\n      this.focusElement = this.element.querySelector('input[type=\"text\"]');\n      if(!this.focusElement) {\n        this.focusElement = this.element;\n\n        if(!(this.focusElement.tagName.toLowerCase() === 'button' || this.focusElement.tagName.toLowerCase() === 'input')) {\n          if (!this.focusElement.hasAttribute('tabindex')) {\n            this.focusElement.setAttribute('tabindex', '0');\n          }\n        }\n      }\n    };\n\n    const moveElementToDocumentBody = (element) => {\n      // To position an element on top of all other z-indexed elements, the element should be moved to document.body\n      //       See: https://philipwalton.com/articles/what-no-one-told-you-about-z-index/\n\n      if(element.parentNode !== document.body) {\n        return document.body.appendChild(element);\n      }\n      return element;\n    };\n\n    const findMenuElement = () => {\n      let menuElement;\n      const menuElementId = this.element.getAttribute('aria-controls');\n      if(menuElementId !== null) {\n        menuElement = document.querySelector(`#${menuElementId }`);\n      }\n      else {\n        menuElement = this.element.parentNode.querySelector(`.${MENU_BUTTON_MENU}`);\n      }\n      return menuElement;\n    };\n\n    const addMenu = () => {\n      const menuElement = findMenuElement();\n      if(menuElement) {\n        if(menuElement.componentInstance) {\n          this.menu = menuElement.componentInstance;\n        }\n        else {\n          this.menu = menuFactory(menuElement);\n          menuElement.componentInstance = this.menu;\n          moveElementToDocumentBody(menuElement);\n        }\n        this.element.setAttribute('aria-controls', this.menu.element.id);\n      }\n    };\n\n    addFocusElement();\n    addWaiAria();\n    addMenu();\n    this.removeListeners();\n    addListeners();\n  }\n\n  downgrade() {\n    if(this.menu) {\n      // Do not downgrade menu if there are other buttons sharing this menu\n      const related = [...document.querySelectorAll(`.${JS_MENU_BUTTON}[aria-controls=\"${this.element.getAttribute('aria-controls')}\"]`)];\n      if(related.filter( c => c !== this.element && c.getAttribute('data-upgraded').indexOf('MaterialExtMenuButton') >= 0).length === 0) {\n        this.menu.downgrade();\n      }\n    }\n    this.removeListeners();\n  }\n\n}\n\n(function() {\n  'use strict';\n\n  /**\n   * https://github.com/google/material-design-lite/issues/4205\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtMenuButton = function MaterialExtMenuButton(element) {\n    this.element_ = element;\n    this.menuButton_ = null;\n\n    // Initialize instance.\n    this.init();\n  };\n  window['MaterialExtMenuButton'] = MaterialExtMenuButton;\n\n\n  // Public methods.\n\n  /**\n   * Get the menu element controlled by this button, null if no menu is controlled by this button\n   * @public\n   */\n  MaterialExtMenuButton.prototype.getMenuElement = function() {\n    return this.menuButton_.menu ? this.menuButton_.menu.element : null;\n  };\n  MaterialExtMenuButton.prototype['getMenuElement'] = MaterialExtMenuButton.prototype.getMenuElement;\n\n  /**\n   * Open menu\n   * @public\n   * @param {String} position one of \"first\", \"last\" or \"selected\"\n   */\n  MaterialExtMenuButton.prototype.openMenu = function(position) {\n    this.menuButton_.openMenu(position);\n  };\n  MaterialExtMenuButton.prototype['openMenu'] = MaterialExtMenuButton.prototype.openMenu;\n\n  /**\n   * Close menu\n   * @public\n   */\n  MaterialExtMenuButton.prototype.closeMenu = function() {\n    this.menuButton_.closeMenu(true);\n  };\n  MaterialExtMenuButton.prototype['closeMenu'] = MaterialExtMenuButton.prototype.closeMenu;\n\n  /**\n   * Get selected menu item\n   * @public\n   * @returns {Element} The selected menu item or null if no item selected\n   */\n  MaterialExtMenuButton.prototype.getSelectedMenuItem = function() {\n    return this.menuButton_.selectedItem;\n  };\n  MaterialExtMenuButton.prototype['getSelectedMenuItem'] = MaterialExtMenuButton.prototype.getSelectedMenuItem;\n\n\n  /**\n   * Set (default) selected menu item\n   * @param {Element} item\n   */\n  MaterialExtMenuButton.prototype.setSelectedMenuItem = function(item) {\n    this.menuButton_.selectedItem = item;\n  };\n  MaterialExtMenuButton.prototype['setSelectedMenuItem'] = MaterialExtMenuButton.prototype.setSelectedMenuItem;\n\n  /**\n   * Initialize component\n   */\n  MaterialExtMenuButton.prototype.init = function() {\n    if (this.element_) {\n      this.menuButton_ = new MenuButton(this.element_);\n      this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));\n      this.element_.classList.add(IS_UPGRADED);\n    }\n  };\n\n  /**\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   */\n  MaterialExtMenuButton.prototype.mdlDowngrade_ = function() {\n    this.menuButton_.downgrade();\n  };\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtMenuButton,\n    classAsString: 'MaterialExtMenuButton',\n    cssClass: JS_MENU_BUTTON,\n    widget: true\n  });\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/menu-button/menu-button.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n/*\n * Copied/Modified from https://github.com/google/material-design-lite/tree/master/src/textfield\n */\n\nimport { randomString } from '../utils/string-utils';\nimport {\n  IS_DIRTY,\n  IS_FOCUSED,\n  IS_DISABLED,\n  IS_INVALID,\n  IS_UPGRADED\n} from '../utils/constants';\n\n(function() {\n  'use strict';\n  const LABEL = 'mdlext-selectfield__label';\n  const INPUT = 'mdlext-selectfield__select';\n\n  /**\n   * Class constructor for Selectfield MDLEXT component.\n   * Implements MDL component design pattern defined at:\n   * https://github.com/jasonmayes/mdl-component-design-pattern\n   *\n   * @constructor\n   * @param {HTMLElement} element The element that will be upgraded.\n   */\n  const MaterialExtSelectfield = function MaterialExtSelectfield(element) {\n    this.element_ = element;\n    this.init(); // Initialize instance.\n  };\n\n  window['MaterialExtSelectfield'] = MaterialExtSelectfield;\n\n  /**\n   * Handle focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\n  /*eslint no-unused-vars: 0*/\n  MaterialExtSelectfield.prototype.onFocus_ = function( /*event*/ ) {\n    this.element_.classList.add(IS_FOCUSED);\n  };\n\n  /**\n   * Handle lost focus.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\n  /*eslint no-unused-vars: 0*/\n  MaterialExtSelectfield.prototype.onBlur_ = function( /*event*/ ) {\n    this.element_.classList.remove(IS_FOCUSED);\n  };\n\n  /**\n   * Handle reset event from out side.\n   *\n   * @param {Event} event The event that fired.\n   * @private\n   */\n  MaterialExtSelectfield.prototype.onReset_ = function( /*event*/ ) {\n    this.updateClasses_();\n  };\n\n  /**\n   * Handle class updates.\n   *\n   * @private\n   */\n  MaterialExtSelectfield.prototype.updateClasses_ = function() {\n    this.checkDisabled();\n    this.checkValidity();\n    this.checkDirty();\n    this.checkFocus();\n  };\n\n  // Public methods.\n\n  /**\n   * Check the disabled state and update field accordingly.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.checkDisabled = function() {\n    if (this.select_.disabled) {\n      this.element_.classList.add(IS_DISABLED);\n    } else {\n      this.element_.classList.remove(IS_DISABLED);\n    }\n  };\n  MaterialExtSelectfield.prototype['checkDisabled'] = MaterialExtSelectfield.prototype.checkDisabled;\n\n\n  /**\n   * Check the focus state and update field accordingly.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.checkFocus = function() {\n    // Note: element.querySelector(':focus') always return null in JsDom, even if select element has focus\n    /*eslint no-extra-boolean-cast: 0*/\n    if (Boolean(this.element_.querySelector(':focus'))) {\n      this.element_.classList.add(IS_FOCUSED);\n    } else {\n      this.element_.classList.remove(IS_FOCUSED);\n    }\n  };\n\n  MaterialExtSelectfield.prototype['checkFocus'] = MaterialExtSelectfield.prototype.checkFocus;\n\n\n  /**\n   * Check the validity state and update field accordingly.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.checkValidity = function() {\n\n    /* Don't think it makes any sense to check validity.\n       Tests I've done, so far, indicates that setting an illegal value via JS returns selectedIndex=0\n\n    if (this.select_.validity) {\n      if (this.select_.validity.valid) {\n        this.element_.classList.remove(this.CssClasses_.IS_INVALID);\n      } else {\n        this.element_.classList.add(this.CssClasses_.IS_INVALID);\n      }\n    }\n    */\n  };\n\n  MaterialExtSelectfield.prototype['checkValidity'] = MaterialExtSelectfield.prototype.checkValidity;\n\n  /**\n   * Check the dirty state and update field accordingly.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.checkDirty = function() {\n    if (this.select_.value && this.select_.value.length > 0) {\n      this.element_.classList.add(IS_DIRTY);\n    } else {\n      this.element_.classList.remove(IS_DIRTY);\n    }\n  };\n\n  MaterialExtSelectfield.prototype['checkDirty'] = MaterialExtSelectfield.prototype.checkDirty;\n\n  /**\n   * Disable select field.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.disable = function() {\n    this.select_.disabled = true;\n    this.updateClasses_();\n  };\n\n  MaterialExtSelectfield.prototype['disable'] = MaterialExtSelectfield.prototype.disable;\n\n  /**\n   * Enable select field.\n   *\n   * @public\n   */\n  MaterialExtSelectfield.prototype.enable = function() {\n    this.select_.disabled = false;\n    this.updateClasses_();\n  };\n\n  MaterialExtSelectfield.prototype['enable'] = MaterialExtSelectfield.prototype.enable;\n\n  /**\n   * Update select field value.\n   *\n   * @param {string} value The value to which to set the control (optional).\n   * @public\n   */\n  MaterialExtSelectfield.prototype.change = function(value) {\n    this.select_.value = value || '';\n    this.updateClasses_();\n  };\n  MaterialExtSelectfield.prototype['change'] = MaterialExtSelectfield.prototype.change;\n\n  /**\n   * Initialize element.\n   */\n  MaterialExtSelectfield.prototype.init = function() {\n    if (this.element_) {\n      this.label_ = this.element_.querySelector(`.${LABEL}`);\n      this.select_ = this.element_.querySelector(`.${INPUT}`);\n\n      if (this.select_) {\n        // Remove listeners, just in case ...\n        this.select_.removeEventListener('change', this.updateClasses_);\n        this.select_.removeEventListener('focus', this.onFocus_);\n        this.select_.removeEventListener('blur', this.onBlur_);\n        this.select_.removeEventListener('reset', this.onReset_);\n\n        this.select_.addEventListener('change', this.updateClasses_.bind(this));\n        this.select_.addEventListener('focus', this.onFocus_.bind(this));\n        this.select_.addEventListener('blur', this.onBlur_.bind(this));\n        this.select_.addEventListener('reset', this.onReset_.bind(this));\n\n        if(this.label_) {\n          let id;\n          if(!this.select_.hasAttribute('id')) {\n            id = `select-${randomString()}`;\n            this.select_.id = id;\n          }\n          else {\n            id = this.select_.id;\n          }\n\n          if(!this.label_.hasAttribute('for')) {\n            this.label_.setAttribute('for', id);\n          }\n        }\n\n        const invalid = this.element_.classList.contains(IS_INVALID);\n        this.updateClasses_();\n        this.element_.classList.add(IS_UPGRADED);\n\n        if (invalid) {\n          this.element_.classList.add(IS_INVALID);\n        }\n        if (this.select_.hasAttribute('autofocus')) {\n          this.element_.focus();\n          this.checkFocus();\n        }\n      }\n    }\n  };\n\n  /**\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   *\n   * Nothing to downgrade\n   *\n  MaterialExtSelectfield.prototype.mdlDowngrade_ = function() {\n    'use strict';\n    console.log('***** MaterialExtSelectfield.mdlDowngrade ');\n  };\n  */\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /*eslint no-undef: 0*/\n  componentHandler.register({\n    constructor: MaterialExtSelectfield,\n    classAsString: 'MaterialExtSelectfield',\n    cssClass: 'mdlext-js-selectfield',\n    widget: true\n  });\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/selectfield/selectfield.js","/**\n * @license\n * Copyright 2016 Leif Olsen. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * This code is built with Google Material Design Lite,\n * which is Licensed under the Apache License, Version 2.0\n */\n\n/**\n * A sticky header makes site navigation easily accessible anywhere on the page and saves content space at the same.\n * The header should auto-hide, i.e. hiding the header automatically when a user starts scrolling down the page and\n * bringing the header back when a user might need it: they reach the bottom of the page or start scrolling up.\n */\n\nimport fullThrottle from '../utils/full-throttle';\nimport { jsonStringToObject } from '../utils/json-utils';\nimport {\n  IS_UPGRADED\n} from '../utils/constants';\n\n\n(function() {\n  'use strict';\n  const MDL_LAYOUT_CONTENT  = 'mdl-layout__content';\n  const IS_SCROLL_CLASS  = 'mdlext-is-scroll';\n\n\n  /**\n   * @constructor\n   * @param {Element} element The element that will be upgraded.\n   */\n  const MaterialExtStickyHeader = function MaterialExtStickyHeader(element) {\n    // Stores the element.\n    this.header_ = element;\n\n    // Heder listens to scroll events from content\n    this.content_ = null;\n    this.lastScrollTop_ = 0;\n\n    // Default config\n    this.config_ = {\n      visibleAtScrollEnd: false\n    };\n\n    this.mutationObserver_ = null;\n\n    this.drawing_ = false;\n\n    // Initialize instance.\n    this.init();\n  };\n\n  window['MaterialExtStickyHeader'] = MaterialExtStickyHeader;\n\n\n  /**\n   * Update header width\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.recalcWidth_ = function() {\n    this.header_.style.width = `${this.content_.clientWidth}px`;\n  };\n\n  const throttleResize = fullThrottle(self => self.recalcWidth_() );\n\n  /**\n   * Adjust header width when window resizes or oreientation changes\n   * @param event\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.resizeHandler_ = function( /* event */ ) {\n    throttleResize(this);\n  };\n\n\n  /**\n   * Update header position\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.reposition_ = function() {\n\n    const currentContentScrollTop = this.content_.scrollTop;\n    const scrollDiff = this.lastScrollTop_ - currentContentScrollTop;\n\n    if(currentContentScrollTop <= 0) {\n      // Scrolled to the top. Header sticks to the top\n      this.header_.style.top = '0';\n      this.header_.classList.remove(IS_SCROLL_CLASS);\n    }\n    else if(scrollDiff > 0) {\n\n      if(scrollDiff >= this.header_.offsetHeight) {\n\n        // Scrolled up. Header slides in\n        const headerTop = (parseInt( window.getComputedStyle( this.header_ ).getPropertyValue( 'top' ) ) || 0);\n        if(headerTop != 0) {\n          this.header_.style.top = '0';\n          this.header_.classList.add(IS_SCROLL_CLASS);\n        }\n        this.lastScrollTop_ = currentContentScrollTop;\n      }\n      return;\n    }\n    else if(scrollDiff < 0) {\n      // Scrolled down\n      this.header_.classList.add(IS_SCROLL_CLASS);\n      let headerTop = (parseInt( window.getComputedStyle( this.header_ ).getPropertyValue( 'top' ) ) || 0);\n\n      if (this.content_.scrollHeight - this.content_.scrollTop <= this.content_.offsetHeight) {\n        // Bottom of content\n        if(headerTop != 0) {\n          this.header_.style.top = this.config_.visibleAtScrollEnd ? '0' : `-${this.header_.offsetHeight}px`;\n        }\n      }\n      else {\n        headerTop += scrollDiff;\n        const offsetHeight = this.header_.offsetHeight;\n        this.header_.style.top = `${( Math.abs( headerTop ) > offsetHeight ? -offsetHeight : headerTop )}px`;\n      }\n    }\n\n    this.lastScrollTop_ = currentContentScrollTop;\n  };\n\n\n  const throttleScroll = fullThrottle((self) => self.reposition_());\n\n  /**\n   * Scroll header when content scrolls\n   * @param event\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.scrollHandler_ = function( /* event */ ) {\n    throttleScroll(this);\n  };\n\n  /**\n   * Init header position\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.updatePosition_ = function( /* event */ ) {\n    this.recalcWidth_();\n    this.reposition_();\n  };\n\n  /**\n   * Add mutation observer\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.addMutationObserver_ = function() {\n\n    // jsdom does not support MutationObserver - so this is not testable\n    /* istanbul ignore next */\n    this.mutationObserver_ = new MutationObserver( ( /*mutations*/ ) => {\n      // Adjust header width if content changes (e.g. in a SPA)\n      this.updatePosition_();\n    });\n\n    this.mutationObserver_.observe( this.content_, {\n      attributes: false,\n      childList: true,\n      characterData: false,\n      subtree: true\n    });\n  };\n\n    /**\n   * Removes event listeners\n   * @private\n   */\n  MaterialExtStickyHeader.prototype.removeListeners_ = function() {\n\n    window.removeEventListener('resize', this.resizeHandler_);\n    window.removeEventListener('orientationchange', this.resizeHandler_);\n\n    if(this.content_) {\n      this.content_.removeEventListener('scroll', this.scrollHandler_);\n    }\n\n    if(this.mutationObserver_) {\n      this.mutationObserver_.disconnect();\n      this.mutationObserver_ = null;\n    }\n  };\n\n  /**\n   * Initialize component\n   */\n  MaterialExtStickyHeader.prototype.init = function() {\n\n    if (this.header_) {\n\n      this.removeListeners_();\n\n      if(this.header_.hasAttribute('data-config')) {\n        this.config_ = jsonStringToObject(this.header_.getAttribute('data-config'));\n      }\n\n      this.content_ = this.header_.parentNode.querySelector(`.${MDL_LAYOUT_CONTENT}`) || null;\n\n      if(this.content_) {\n        this.content_.style.paddingTop = `${this.header_.offsetHeight}px`;  // Make room for sticky header\n        this.lastScrollTop_ = this.content_.scrollTop;\n\n        this.content_.addEventListener('scroll', this.scrollHandler_.bind(this));\n        window.addEventListener('resize', this.resizeHandler_.bind(this));\n        window.addEventListener('orientationchange', this.resizeHandler_.bind(this));\n\n        this.addMutationObserver_();\n        this.updatePosition_();\n\n        // Set upgraded flag\n        this.header_.classList.add(IS_UPGRADED);\n      }\n    }\n  };\n\n  /*\n   * Downgrade component\n   * E.g remove listeners and clean up resources\n   *\n   * Nothing to clean\n   *\n   MaterialExtStickyHeader.prototype.mdlDowngrade_ = function() {\n     'use strict';\n     console.log('***** MaterialExtStickyHeader.prototype.mdlDowngrade_');\n   };\n   */\n\n\n  // The component registers itself. It can assume componentHandler is available\n  // in the global scope.\n  /* eslint no-undef: 0 */\n  componentHandler.register({\n    constructor: MaterialExtStickyHeader,\n    classAsString: 'MaterialExtStickyHeader',\n    cssClass: 'mdlext-js-sticky-header'\n  });\n})();\n\n\n\n// WEBPACK FOOTER //\n// ./src/sticky-header/sticky-header.js","import './constants';\nimport './dom-utils';\nimport './string-utils';\nimport './json-utils';\nimport './full-throttle';\nimport './easing';\nimport './interval-function';\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/index.js","module.exports = { \"default\": require(\"core-js/library/fn/array/from\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/array/from.js\n// module id = 60\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/is-iterable\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/is-iterable.js\n// module id = 61\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/number/is-nan\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/number/is-nan.js\n// module id = 62\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/object/define-property\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/define-property.js\n// module id = 63\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/object/entries\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/entries.js\n// module id = 64\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/object/keys\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/object/keys.js\n// module id = 65\n// module chunks = 0 1","module.exports = { \"default\": require(\"core-js/library/fn/reflect/apply\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/core-js/reflect/apply.js\n// module id = 66\n// module chunks = 0 1","\"use strict\";\n\nexports.__esModule = true;\n\nvar _isIterable2 = require(\"../core-js/is-iterable\");\n\nvar _isIterable3 = _interopRequireDefault(_isIterable2);\n\nvar _getIterator2 = require(\"../core-js/get-iterator\");\n\nvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if ((0, _isIterable3.default)(Object(arr))) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/helpers/slicedToArray.js\n// module id = 67\n// module chunks = 0 1","require('../../modules/es6.string.iterator');\nrequire('../../modules/es6.array.from');\nmodule.exports = require('../../modules/_core').Array.from;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/array/from.js\n// module id = 68\n// module chunks = 0 1","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/get-iterator.js\n// module id = 69\n// module chunks = 0 1","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.is-iterable');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/is-iterable.js\n// module id = 70\n// module chunks = 0 1","require('../../modules/es6.number.is-integer');\nmodule.exports = require('../../modules/_core').Number.isInteger;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/number/is-integer.js\n// module id = 71\n// module chunks = 0 1","require('../../modules/es6.number.is-nan');\nmodule.exports = require('../../modules/_core').Number.isNaN;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/number/is-nan.js\n// module id = 72\n// module chunks = 0 1","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/object/assign.js\n// module id = 73\n// module chunks = 0 1","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc){\n  return $Object.defineProperty(it, key, desc);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/object/define-property.js\n// module id = 74\n// module chunks = 0 1","require('../../modules/es7.object.entries');\nmodule.exports = require('../../modules/_core').Object.entries;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/object/entries.js\n// module id = 75\n// module chunks = 0 1","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/object/keys.js\n// module id = 76\n// module chunks = 0 1","require('../../modules/es6.reflect.apply');\nmodule.exports = require('../../modules/_core').Reflect.apply;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/fn/reflect/apply.js\n// module id = 77\n// module chunks = 0 1","module.exports = function(){ /* empty */ };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_add-to-unscopables.js\n// module id = 78\n// module chunks = 0 1","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject')\n  , toLength  = require('./_to-length')\n  , toIndex   = require('./_to-index');\nmodule.exports = function(IS_INCLUDES){\n  return function($this, el, fromIndex){\n    var O      = toIObject($this)\n      , length = toLength(O.length)\n      , index  = toIndex(fromIndex, length)\n      , value;\n    // Array#includes uses SameValueZero equality algorithm\n    if(IS_INCLUDES && el != el)while(length > index){\n      value = O[index++];\n      if(value != value)return true;\n    // Array#toIndex ignores holes, Array#includes - not\n    } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n      if(O[index] === el)return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_array-includes.js\n// module id = 79\n// module chunks = 0 1","'use strict';\nvar $defineProperty = require('./_object-dp')\n  , createDesc      = require('./_property-desc');\n\nmodule.exports = function(object, index, value){\n  if(index in object)$defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_create-property.js\n// module id = 80\n// module chunks = 0 1","module.exports = require('./_global').document && document.documentElement;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_html.js\n// module id = 81\n// module chunks = 0 1","module.exports = !require('./_descriptors') && !require('./_fails')(function(){\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_ie8-dom-define.js\n// module id = 82\n// module chunks = 0 1","// check on default Array iterator\nvar Iterators  = require('./_iterators')\n  , ITERATOR   = require('./_wks')('iterator')\n  , ArrayProto = Array.prototype;\n\nmodule.exports = function(it){\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_is-array-iter.js\n// module id = 83\n// module chunks = 0 1","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object')\n  , floor    = Math.floor;\nmodule.exports = function isInteger(it){\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_is-integer.js\n// module id = 84\n// module chunks = 0 1","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function(iterator, fn, value, entries){\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch(e){\n    var ret = iterator['return'];\n    if(ret !== undefined)anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iter-call.js\n// module id = 85\n// module chunks = 0 1","'use strict';\nvar create         = require('./_object-create')\n  , descriptor     = require('./_property-desc')\n  , setToStringTag = require('./_set-to-string-tag')\n  , IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function(){ return this; });\n\nmodule.exports = function(Constructor, NAME, next){\n  Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iter-create.js\n// module id = 86\n// module chunks = 0 1","var ITERATOR     = require('./_wks')('iterator')\n  , SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function(){ SAFE_CLOSING = true; };\n  Array.from(riter, function(){ throw 2; });\n} catch(e){ /* empty */ }\n\nmodule.exports = function(exec, skipClosing){\n  if(!skipClosing && !SAFE_CLOSING)return false;\n  var safe = false;\n  try {\n    var arr  = [7]\n      , iter = arr[ITERATOR]();\n    iter.next = function(){ return {done: safe = true}; };\n    arr[ITERATOR] = function(){ return iter; };\n    exec(arr);\n  } catch(e){ /* empty */ }\n  return safe;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iter-detect.js\n// module id = 87\n// module chunks = 0 1","module.exports = function(done, value){\n  return {value: value, done: !!done};\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_iter-step.js\n// module id = 88\n// module chunks = 0 1","module.exports = true;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_library.js\n// module id = 89\n// module chunks = 0 1","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys  = require('./_object-keys')\n  , gOPS     = require('./_object-gops')\n  , pIE      = require('./_object-pie')\n  , toObject = require('./_to-object')\n  , IObject  = require('./_iobject')\n  , $assign  = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function(){\n  var A = {}\n    , B = {}\n    , S = Symbol()\n    , K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function(k){ B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n  var T     = toObject(target)\n    , aLen  = arguments.length\n    , index = 1\n    , getSymbols = gOPS.f\n    , isEnum     = pIE.f;\n  while(aLen > index){\n    var S      = IObject(arguments[index++])\n      , keys   = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n      , length = keys.length\n      , j      = 0\n      , key;\n    while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-assign.js\n// module id = 90\n// module chunks = 0 1","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject    = require('./_an-object')\n  , dPs         = require('./_object-dps')\n  , enumBugKeys = require('./_enum-bug-keys')\n  , IE_PROTO    = require('./_shared-key')('IE_PROTO')\n  , Empty       = function(){ /* empty */ }\n  , PROTOTYPE   = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function(){\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe')\n    , i      = enumBugKeys.length\n    , lt     = '<'\n    , gt     = '>'\n    , iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties){\n  var result;\n  if(O !== null){\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty;\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-create.js\n// module id = 91\n// module chunks = 0 1","var dP       = require('./_object-dp')\n  , anObject = require('./_an-object')\n  , getKeys  = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){\n  anObject(O);\n  var keys   = getKeys(Properties)\n    , length = keys.length\n    , i = 0\n    , P;\n  while(length > i)dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-dps.js\n// module id = 92\n// module chunks = 0 1","exports.f = Object.getOwnPropertySymbols;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-gops.js\n// module id = 93\n// module chunks = 0 1","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has         = require('./_has')\n  , toObject    = require('./_to-object')\n  , IE_PROTO    = require('./_shared-key')('IE_PROTO')\n  , ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function(O){\n  O = toObject(O);\n  if(has(O, IE_PROTO))return O[IE_PROTO];\n  if(typeof O.constructor == 'function' && O instanceof O.constructor){\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-gpo.js\n// module id = 94\n// module chunks = 0 1","var has          = require('./_has')\n  , toIObject    = require('./_to-iobject')\n  , arrayIndexOf = require('./_array-includes')(false)\n  , IE_PROTO     = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function(object, names){\n  var O      = toIObject(object)\n    , i      = 0\n    , result = []\n    , key;\n  for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while(names.length > i)if(has(O, key = names[i++])){\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-keys-internal.js\n// module id = 95\n// module chunks = 0 1","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export')\n  , core    = require('./_core')\n  , fails   = require('./_fails');\nmodule.exports = function(KEY, exec){\n  var fn  = (core.Object || {})[KEY] || Object[KEY]\n    , exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-sap.js\n// module id = 96\n// module chunks = 0 1","var getKeys   = require('./_object-keys')\n  , toIObject = require('./_to-iobject')\n  , isEnum    = require('./_object-pie').f;\nmodule.exports = function(isEntries){\n  return function(it){\n    var O      = toIObject(it)\n      , keys   = getKeys(O)\n      , length = keys.length\n      , i      = 0\n      , result = []\n      , key;\n    while(length > i)if(isEnum.call(O, key = keys[i++])){\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_object-to-array.js\n// module id = 97\n// module chunks = 0 1","module.exports = require('./_hide');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_redefine.js\n// module id = 98\n// module chunks = 0 1","var toInteger = require('./_to-integer')\n  , defined   = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function(TO_STRING){\n  return function(that, pos){\n    var s = String(defined(that))\n      , i = toInteger(pos)\n      , l = s.length\n      , a, b;\n    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_string-at.js\n// module id = 99\n// module chunks = 0 1","var toInteger = require('./_to-integer')\n  , max       = Math.max\n  , min       = Math.min;\nmodule.exports = function(index, length){\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-index.js\n// module id = 100\n// module chunks = 0 1","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n  if(!isObject(it))return it;\n  var fn, val;\n  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/_to-primitive.js\n// module id = 101\n// module chunks = 0 1","var anObject = require('./_an-object')\n  , get      = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function(it){\n  var iterFn = get(it);\n  if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');\n  return anObject(iterFn.call(it));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/core.get-iterator.js\n// module id = 102\n// module chunks = 0 1","var classof   = require('./_classof')\n  , ITERATOR  = require('./_wks')('iterator')\n  , Iterators = require('./_iterators');\nmodule.exports = require('./_core').isIterable = function(it){\n  var O = Object(it);\n  return O[ITERATOR] !== undefined\n    || '@@iterator' in O\n    || Iterators.hasOwnProperty(classof(O));\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/core.is-iterable.js\n// module id = 103\n// module chunks = 0 1","'use strict';\nvar ctx            = require('./_ctx')\n  , $export        = require('./_export')\n  , toObject       = require('./_to-object')\n  , call           = require('./_iter-call')\n  , isArrayIter    = require('./_is-array-iter')\n  , toLength       = require('./_to-length')\n  , createProperty = require('./_create-property')\n  , getIterFn      = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function(iter){ Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){\n    var O       = toObject(arrayLike)\n      , C       = typeof this == 'function' ? this : Array\n      , aLen    = arguments.length\n      , mapfn   = aLen > 1 ? arguments[1] : undefined\n      , mapping = mapfn !== undefined\n      , index   = 0\n      , iterFn  = getIterFn(O)\n      , length, result, step, iterator;\n    if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){\n      for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for(result = new C(length); length > index; index++){\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.array.from.js\n// module id = 104\n// module chunks = 0 1","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables')\n  , step             = require('./_iter-step')\n  , Iterators        = require('./_iterators')\n  , toIObject        = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function(iterated, kind){\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , kind  = this._k\n    , index = this._i++;\n  if(!O || index >= O.length){\n    this._t = undefined;\n    return step(1);\n  }\n  if(kind == 'keys'  )return step(0, index);\n  if(kind == 'values')return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.array.iterator.js\n// module id = 105\n// module chunks = 0 1","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {isInteger: require('./_is-integer')});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.number.is-integer.js\n// module id = 106\n// module chunks = 0 1","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number){\n    return number != number;\n  }\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.number.is-nan.js\n// module id = 107\n// module chunks = 0 1","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', {assign: require('./_object-assign')});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.object.assign.js\n// module id = 108\n// module chunks = 0 1","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', {defineProperty: require('./_object-dp').f});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.object.define-property.js\n// module id = 109\n// module chunks = 0 1","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object')\n  , $keys    = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function(){\n  return function keys(it){\n    return $keys(toObject(it));\n  };\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.object.keys.js\n// module id = 110\n// module chunks = 0 1","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export   = require('./_export')\n  , aFunction = require('./_a-function')\n  , anObject  = require('./_an-object')\n  , rApply    = (require('./_global').Reflect || {}).apply\n  , fApply    = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function(){\n  rApply(function(){});\n}), 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList){\n    var T = aFunction(target)\n      , L = anObject(argumentsList);\n    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n  }\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es6.reflect.apply.js\n// module id = 111\n// module chunks = 0 1","// https://github.com/tc39/proposal-object-values-entries\nvar $export  = require('./_export')\n  , $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it){\n    return $entries(it);\n  }\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/babel-runtime/~/core-js/library/modules/es7.object.entries.js\n// module id = 112\n// module chunks = 0 1"],"sourceRoot":""}