\n * \t\t
\n * \t\t
\n * \t\t
\n * \t
\n *
\n * ```\n * @example\n * An example where only one panel is defined and created with a circular.\n * 패널을 하나만 정의하고 순환으로 생성하는 예.\n * ```html\n *
\n * ```\n * ```javascript\n * // If the number of defined panels is less than the minimum number required for the circulation operation, the necessary number of panel elements are generated.\n * // 정의된 패널의 수가 순환동작에 필요한 최소 개수보다 적으면 필요한 수만큼의 패널 요소가 생성된다.\n * new eg.Flicking(\"#flick\", {\n * \tcircular: true\n * })\n * ```\n * @example\n * For error occurrence example. There is no panel element.\n * 오류 발생 예. 패널 요소가 하나도 없는 경우.\n * ```html\n *
\n * ```\n * ```javascript\n * try{\n * \tnew eg.Flicking(\"#flick\");\n * } catch(e) {\n * \t// An error occurs because there are no child elements in the reference element.\n *\t// 기준 요소안에 자식 요소가 하나도 없으므로 에러가 발생한다.\n * }\n * ```\n */\nexport default class Flicking extends Mixin(Component).with(eventHandler) {\n\t/**\n\t * Constructor\n\t * @param {HTMLElement|String} element A base element for the eg.Flicking module. When specifying a value as a `String` type, you must specify a css selector string to select the element.
eg.Flicking 모듈을 사용할 기준 요소. `String`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n\t * @param {Object} [options] The option object of the eg.Flicking module
eg.Flicking 모듈의 옵션 객체\n\t * @param {Boolean} [options.hwAccelerable=true] Force hardware compositing.
하드웨어 가속 사용 여부.\n\t * @param {String} [options.prefix=\"eg-flick\"] A prefix for class names of the panel elements.
패널 요소의 클래스 이름 접두사.\n\t * @param {Number} [options.deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time.
사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n\t * @param {Boolean} [options.horizontal=true] Direction of the panel movement. (true: horizontal, false: vertical)
패널 이동 방향. (true 가로방향, false 세로방향)\n\t * @param {Boolean} [options.circular=false] Whether to let the first panel flick right to the end panel (let the left panel flick from the end panel to move to the first panel). (The term 'circulation')
첫 패널에서 우 액션 입력하여 끝 패널로 이동하게 할지와 끝 패널에서 우 액션 입력하여 첫 패널로 이동할하게 할지 여부. (통칭 '순환')\n\t * @param {Number|Array} [options.previewPadding=[0,0]] The preview size value(unit: pixel) for the previous or next panel. If direction is set to \"horizontal\", the preview section will be displayed on the left and right of the panel. If direction is set to \"vertical\", it will be displayed on the top and bottom of the panel.
이전 패널과 다음 패널을 미리 보는 영역의 크기값(단위: 픽셀). 패널 이동 방향이 가로 방향이면 패널 좌우에, 세로 방향이면 패널 상하에 미리 보는 영역이 나타난다.\n\t * @param {Number|Array} [options.bounce=[10,10]] The size value(unit: pixel) of the bounce area. If `circular=false`, the panel can be moved by this value when inputting a right gesture in the first panel or inputting a left gesture in the end panel. When the input is completed while moving, it returns to its original position.
바운스 영역의 크기값(단위: 픽셀). `circular=false`인 경우, 첫 패널에서 우 액션 입력시, 끝 패널에서 좌 액션 입력시 이 값 만큼만 패널이 이동할 수 있고 이동한 상태에서 입력을 마치면 원래 자리로 돌아온다.\n\t * @param {Number} [options.threshold=40] Movement threshold to destination panel(unit: pixel). A panel element must be dragged beyond the threshold to move to the destination panel.
목적 패널로의 이동 임계값 (단위: 픽셀). 패널 요소를 임계값 이상으로 끌어다 놓아야만이 목적 패널로 이동한다.\n\t * @param {Number} [options.duration=100] Duration of the panel movement. (unit: ms)
패널 이동 애니메이션 진행 시간.(단위: ms)\n\t * @param {Function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] The easing function to apply to a panel moving animation. The default function is easeOutCubic.
패널 이동 애니메이션에 적용할 `easing`함수. 기본값은 `easeOutCubic`이다.\n\t * @param {Number} [options.defaultIndex=0] The panel index number to specify when initializing the module. A zero-based integer.
모듈 초기화시 지정할 패널 인덱스 번호. 0부터 시작하는 정수.\n\t * @param {Array} [options.inputType=[\"touch,\"mouse\"]] Types of input devices. ({@link https://naver.github.io/egjs-axes/release/latest/doc/eg.Axes.PanInput.html|eg.Axes.PanInput Reference})
- \"touch\": A touch input device.
- \"mouse\": A mouse.
입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/eg.Axes.PanInput.html|eg.Axes.PanInput 참고})
- \"touch\": 터치 입력 장치.
- \"mouse\": 마우스.\n\t * @param {Number} [options.thresholdAngle=45] The threshold value that determines whether user input is horizontal or vertical. (0 ~ 90)
사용자의 입력이 가로 방향인지 세로 방향인지 판단하는 기준 각도 (0 ~ 90)\n\t * @param {Boolean} [options.adaptiveHeight=false] Whether the height of the container element reflects the height value of the panel after completing the movement.
(Note: on Android 4.1.x stock browser, has rendering bug which not correctly render height value on panel with single node. To avoid just append another empty node at the end.)
목적 패널로 이동한 후 그 패널의 높이값을 컨테이너 요소의 높이값에 반영할지 여부.
(참고: Android 4.1.x 스톡 브라우저에서 단일 노드로 구성된 패널의 높이값 변경이 제대로 렌더링 되지 않는 버그가 있음. 비어있는 노드를 추가하면 해결이 가능하다.)\n\t*/\n\tconstructor(element, options, _prefix) {\n\t\tsuper();\n\n\t\tthis.$wrapper = utils.$(element);\n\t\tconst $children = this.$wrapper && this.$wrapper.children;\n\n\t\tif (!this.$wrapper || !$children || !$children.length) {\n\t\t\t// eslint-disable validateLineBreaks, maximumLineLength\n\t\t\tthrow new Error(\"Given base element doesn't exist or it hasn't proper DOM structure to be initialized.\");\n\n\t\t\t// eslint-enable validateLineBreaks, maximumLineLength\n\t\t}\n\n\t\tthis._setOptions(options);\n\t\tthis._setConfig($children, _prefix);\n\n\t\t!utils.hasClickBug() && (this._setPointerEvents = () => {});\n\n\t\tthis._build();\n\t\tthis._bindEvents(true);\n\n\t\tthis._applyPanelsCss();\n\t\tthis._arrangePanels();\n\n\t\tthis.options.hwAccelerable && consts.SUPPORT_WILLCHANGE && this._setHint();\n\t\tthis.options.adaptiveHeight && this._setAdaptiveHeight();\n\n\t\tthis._adjustContainerCss(\"end\");\n\t}\n\n\t/**\n\t * Set options values\n\t * @private\n\t * @param {Object} options\n\t */\n\t_setOptions(options) {\n\t\t// default value of previewPadding and bounce\n\t\tconst arrVal = {\n\t\t\tpreviewPadding: [0, 0],\n\t\t\tbounce: [10, 10]\n\t\t};\n\n\t\tthis.options = utils.extend(utils.extend({}, OPTIONS), arrVal, options);\n\n\t\tfor (const key in arrVal) {\n\t\t\tlet val = this.options[key];\n\n\t\t\tif (typeof val === \"number\") {\n\t\t\t\tval = [val, val];\n\t\t\t} else if (!utils.isArray(val)) {\n\t\t\t\tval = arrVal[key];\n\t\t\t}\n\n\t\t\tthis.options[key] = val;\n\t\t}\n\t}\n\n\t/**\n\t * Set config values\n\t * @private\n\t * @param {HTMLCollection} $children wrappers' children elements\n\t * @param {String} _prefix event prefix\n\t * @return {HTMLElement}\n\t */\n\t_setConfig($children, _prefix) {\n\t\tconst options = this.options;\n\t\tconst padding = options.previewPadding;\n\t\tlet $nodes = $children;\n\n\t\tif (utils.classList($nodes[0], `${options.prefix}-container`)) {\n\t\t\t$nodes = $nodes[0];\n\t\t\tthis.$container = $nodes;\n\t\t\t$nodes = $nodes.children;\n\t\t}\n\n\t\t// convert to array\n\t\t$nodes = [].slice.call($nodes);\n\n\t\t// config value\n\t\tconst conf = this._conf = utils.extend(utils.extend({}, CONFIG), {\n\t\t\tpanel: {\n\t\t\t\t$list: $nodes,\n\t\t\t\tminCount: padding[0] + padding[1] > 0 ? 5 : 3 // minimum panel count\n\t\t\t},\n\t\t\t// remember original class and inline style in case of restoration on destroy()\n\t\t\torigPanelStyle: {\n\t\t\t\twrapper: {\n\t\t\t\t\tclassName: this.$wrapper.getAttribute(\"class\") || null,\n\t\t\t\t\tstyle: this.$wrapper.getAttribute(\"style\") || null\n\t\t\t\t},\n\t\t\t\tcontainer: {\n\t\t\t\t\tclassName: (this.$container && this.$container.getAttribute(\"class\")) || null,\n\t\t\t\t\tstyle: (this.$container && this.$container.getAttribute(\"style\")) || null\n\t\t\t\t},\n\t\t\t\tlist: $nodes.map(v => ({\n\t\t\t\t\tclassName: v.getAttribute(\"class\") || null,\n\t\t\t\t\tstyle: v.getAttribute(\"style\") || null\n\t\t\t\t}))\n\t\t\t},\n\t\t\tuseLayerHack: options.hwAccelerable && !consts.SUPPORT_WILLCHANGE,\n\t\t\teventPrefix: _prefix || \"\"\n\t\t});\n\n\t\t[[\"LEFT\", \"RIGHT\"], [\"UP\", \"DOWN\"]][+!options.horizontal]\n\t\t\t.forEach(v => conf.dirData.push(Axes[`DIRECTION_${v}`]));\n\t}\n\n\t/**\n\t * Build and set panel nodes to make flicking structure\n\t * @private\n\t */\n\t_build() {\n\t\tconst panel = this._conf.panel;\n\t\tconst options = this.options;\n\t\tconst $children = panel.$list;\n\t\tconst padding = options.previewPadding.concat();\n\t\tconst prefix = options.prefix;\n\t\tconst horizontal = options.horizontal;\n\t\tlet panelCount = panel.count = panel.origCount = $children.length;\n\t\tconst bounce = options.bounce;\n\n\t\tthis._setPadding(padding, true);\n\t\tconst sizeValue = this._getDataByDirection([panel.size, \"100%\"]);\n\n\t\t// container element style\n\t\tconst cssValue = {\n\t\t\tposition: \"relative\",\n\t\t\tzIndex: 2000,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\"\n\t\t};\n\n\t\thorizontal && (cssValue.top = \"0px\");\n\n\t\tif (this.$container) {\n\t\t\tutils.css(this.$container, cssValue);\n\t\t} else {\n\t\t\tconst $parent = $children[0].parentNode;\n\t\t\tconst $container = document.createElement(\"div\");\n\n\t\t\t$container.className = `${prefix}-container`;\n\t\t\tutils.css($container, cssValue);\n\n\t\t\t$children.forEach(v => $container.appendChild(v));\n\n\t\t\t$parent.appendChild($container);\n\t\t\tthis.$container = $container;\n\t\t}\n\n\t\t// panels' css values\n\t\t$children.forEach(v => {\n\t\t\tutils.classList(v, `${prefix}-panel`, true);\n\n\t\t\tutils.css(v, {\n\t\t\t\tposition: \"absolute\",\n\t\t\t\twidth: utils.getUnitValue(sizeValue[0]),\n\t\t\t\theight: utils.getUnitValue(sizeValue[1]),\n\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t});\n\t\t});\n\n\t\tif (this._addClonePanels()) {\n\t\t\tpanelCount = panel.count = (\n\t\t\t\tpanel.$list = [].slice.call(this.$container.children)\n\t\t\t).length;\n\t\t}\n\n\t\t// create Axes instance\n\t\tthis._axesInst = new Axes({\n\t\t\tflick: {\n\t\t\t\trange: [0, panel.size * (panelCount - 1)],\n\t\t\t\tbounce\n\t\t\t}\n\t\t}, {\n\t\t\teasing: options.panelEffect,\n\t\t\tdeceleration: options.deceleration,\n\t\t\tinterruptable: false\n\t\t});\n\n\t\tthis._setDefaultPanel(options.defaultIndex);\n\t}\n\n\t/**\n\t * Set preview padding value\n\t * @private\n\t * @param {Array} padding\n\t * @param {Boolean} build\n\t */\n\t_setPadding(padding, build) {\n\t\tconst horizontal = this.options.horizontal;\n\t\tconst panel = this._conf.panel;\n\t\tconst paddingSum = padding[0] + padding[1];\n\t\tconst cssValue = {};\n\n\t\tif (paddingSum || !build) {\n\t\t\tcssValue.padding = horizontal ?\n\t\t\t\t`0 ${padding.reverse().join(\"px 0 \")}px` :\n\t\t\t\t`${padding.join(\"px 0 \")}px`;\n\t\t}\n\n\t\tif (build) {\n\t\t\tcssValue.overflow = \"hidden\";\n\t\t\tcssValue.boxSizing = \"border-box\";\n\t\t}\n\n\t\tObject.keys(cssValue).length &&\n\t\t\tutils.css(this.$wrapper, cssValue);\n\n\t\tconst wrapperStyle = getComputedStyle(this.$wrapper);\n\t\tconst paddingType = horizontal ? [\"Left\", \"Right\"] : [\"Top\", \"Bottom\"];\n\t\tconst wrapperSize = Math.max(\n\t\t\tthis.$wrapper[`offset${horizontal ? \"Width\" : \"Height\"}`],\n\t\t\tutils.getNumValue(wrapperStyle[horizontal ? \"width\" : \"height\"])\n\t\t);\n\n\t\tpanel.size = wrapperSize - (\n\t\t\tutils.getNumValue(wrapperStyle[`padding${paddingType[0]}`]) +\n\t\t\tutils.getNumValue(wrapperStyle[`padding${paddingType[1]}`])\n\t\t);\n\t}\n\n\t/**\n\t * To fulfill minimum panel count cloning original node when circular or previewPadding option are set\n\t * @private\n\t * @return {Boolean} true : added clone node, false : not added\n\t */\n\t_addClonePanels() {\n\t\tconst panel = this._conf.panel;\n\t\tconst panelCount = panel.origCount;\n\t\tconst cloneCount = panel.minCount - panelCount;\n\t\tconst list = panel.$list;\n\t\tlet cloneNodes;\n\n\t\t// if panels are given less than required when circular option is set, then clone node to apply circular mode\n\t\tif (this.options.circular && panelCount < panel.minCount) {\n\t\t\tcloneNodes = list.map(v => v.cloneNode(true));\n\n\t\t\twhile (cloneNodes.length < cloneCount) {\n\t\t\t\tcloneNodes = cloneNodes.concat(\n\t\t\t\t\tlist.map(v => v.cloneNode(true))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcloneNodes.forEach(v => this.$container.appendChild(v));\n\n\t\t\treturn !!cloneNodes.length;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Move panel's position within array\n\t * @private\n\t * @param {Number} count element counts to move\n\t * @param {Boolean} append where the list to be appended(moved) (true: to the end, false: to the beginning)\n\t */\n\t_movePanelPosition(count, append) {\n\t\tconst panel = this._conf.panel;\n\t\tconst list = panel.$list;\n\t\tconst listToMove = list.splice(append ? 0 : panel.count - count, count);\n\n\t\tpanel.$list = append ?\n\t\t\tlist.concat(listToMove) :\n\t\t\tlistToMove.concat(list);\n\t}\n\n\t/**\n\t * Set default panel to show\n\t * @private\n\t * @param {Number} index\n\t */\n\t_setDefaultPanel(index) {\n\t\tconst panel = this._conf.panel;\n\t\tconst lastIndex = panel.count - 1;\n\t\tlet coords;\n\t\tlet baseIndex;\n\n\t\tif (this.options.circular) {\n\t\t\t// if default index is given, then move correspond panel to the first position\n\t\t\tif (index > 0 && index <= lastIndex) {\n\t\t\t\tthis._movePanelPosition(index, true);\n\t\t\t}\n\n\t\t\t// set first panel's position according physical node length\n\t\t\tbaseIndex = this._getBasePositionIndex();\n\t\t\tthis._movePanelPosition(baseIndex, false);\n\n\t\t\tthis._setPanelNo({\n\t\t\t\tno: index,\n\t\t\t\tcurrNo: index\n\t\t\t});\n\t\t\t// if defaultIndex option is given, then move to that index panel\n\t\t} else if (index > 0 && index <= lastIndex) {\n\t\t\tthis._setPanelNo({\n\t\t\t\tindex,\n\t\t\t\tno: index,\n\t\t\t\tcurrIndex: index,\n\t\t\t\tcurrNo: index\n\t\t\t});\n\n\t\t\tcoords = [-(panel.size * index), 0];\n\n\t\t\tthis._setTranslate(coords);\n\t\t\tthis._setAxes(\"setTo\", Math.abs(coords[0]), 0);\n\t\t}\n\t}\n\n\t/**\n\t * Arrange panels' position\n\t * @private\n\t * @param {Boolean} sort Need to sort panel's position\n\t * @param {Number} indexToMove Number to move from current position (negative: left, positive: right)\n\t */\n\t_arrangePanels(sort, indexToMove) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst touch = conf.touch;\n\t\tconst dirData = conf.dirData;\n\t\tlet baseIndex;\n\n\t\tif (this.options.circular) {\n\t\t\t// when arranging panels, set flag to not trigger flick custom event\n\t\t\tconf.customEvent.flick = false;\n\n\t\t\t// move elements according direction\n\t\t\tif (sort) {\n\t\t\t\tindexToMove && (touch.direction = dirData[+!(indexToMove > 0)]);\n\t\t\t\tthis._arrangePanelPosition(touch.direction, indexToMove);\n\t\t\t}\n\n\t\t\t// set index for base element's position\n\t\t\tbaseIndex = this._getBasePositionIndex();\n\n\t\t\tthis._setPanelNo({\n\t\t\t\tindex: baseIndex,\n\t\t\t\tcurrIndex: baseIndex\n\t\t\t});\n\n\t\t\t// arrange Axes' coord position\n\t\t\tconf.customEvent.flick = !!this._setAxes(\"setTo\", panel.size * panel.index, 0);\n\t\t}\n\n\t\tthis._applyPanelsPos();\n\t}\n\n\t/**\n\t * Set each panel's position in DOM\n\t * @private\n\t */\n\t_applyPanelsPos() {\n\t\tthis._conf.panel.$list.forEach(this._applyPanelsCss.bind(this));\n\t}\n\n\t/**\n\t * Set CSS style values to move elements\n\t *\n\t * Initialize setting up checking if browser support transform css property.\n\t * If browser doesn't support transform, then use left/top properties instead.\n\t * @private\n\t * @param {HTMLElement} $el\n\t * @param {Array} coordsValue\n\t */\n\t_setMoveStyle($el, coordsValue) {\n\t\tconst transform = consts.TRANSFORM;\n\n\t\tthis._setMoveStyle = transform.support ?\n\t\t\tfunction($element, coords) {\n\t\t\t\tutils.css($element, {\n\t\t\t\t\t[transform.name]: utils.translate(coords[0], coords[1], this._conf.useLayerHack)\n\t\t\t\t});\n\t\t\t} : ($element, coords) => {\n\t\t\t\tutils.css($element, {left: coords[0], top: coords[1]});\n\t\t\t};\n\n\t\tthis._setMoveStyle($el, coordsValue);\n\t}\n\n\t/**\n\t * Callback function for applying CSS values to each panels\n\t * Need to be initialized before use, to set up for Android 2.x browsers or others.\n\t * @private\n\t */\n\t_applyPanelsCss() {\n\t\tconst conf = this._conf;\n\t\tconst dummyAnchorClassName = \"__dummy_anchor\";\n\n\t\tif (consts.IS_ANDROID2) {\n\t\t\tconf.$dummyAnchor = utils.$(`.${dummyAnchorClassName}`);\n\n\t\t\t!conf.$dummyAnchor && this.$wrapper.appendChild(\n\t\t\t\tconf.$dummyAnchor = utils.$(`
`)\n\t\t\t);\n\n\t\t\tthis._applyPanelsCss = function applyCss(v, i) {\n\t\t\t\tconst coords = this._getDataByDirection(\n\t\t\t\t\t[`${this._conf.panel.size * i}px`, 0]\n\t\t\t\t);\n\n\t\t\t\tutils.css(v, {\n\t\t\t\t\tleft: coords[0],\n\t\t\t\t\ttop: coords[1]\n\t\t\t\t});\n\t\t\t};\n\t\t} else {\n\t\t\tthis._applyPanelsCss = function applyCss(v, i) {\n\t\t\t\tconst coords = this._getDataByDirection([\n\t\t\t\t\tconsts.TRANSFORM.support ?\n\t\t\t\t\t\t`${100 * i}%` :\n\t\t\t\t\t\t`${this._conf.panel.size * i}px`, 0\n\t\t\t\t]);\n\n\t\t\t\tthis._setMoveStyle(v, coords);\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Adjust container's css value to handle Android 2.x link highlighting bug\n\t * @private\n\t * @param {String} phase\n\t * start - set left/top value to 0\n\t * end - set translate value to 0\n\t * @param {Array} toValue coordinate value\n\t */\n\t_adjustContainerCss(phase, toValue) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst options = this.options;\n\t\tconst horizontal = options.horizontal;\n\t\tconst paddingTop = options.previewPadding[0];\n\t\tlet container = this.$container;\n\t\tlet to = toValue;\n\t\tlet value;\n\n\t\tif (consts.IS_ANDROID2) {\n\t\t\tif (!to) {\n\t\t\t\tto = -panel.size * panel.index;\n\t\t\t}\n\n\t\t\tif (phase === \"start\") {\n\t\t\t\tcontainer = container.style;\n\t\t\t\tvalue = parseInt(container[horizontal ? \"left\" : \"top\"], 10);\n\n\t\t\t\tif (horizontal) {\n\t\t\t\t\tvalue && (container.left = \"0px\");\n\t\t\t\t} else {\n\t\t\t\t\tvalue !== paddingTop && (container.top = \"0px\");\n\t\t\t\t}\n\n\t\t\t\tthis._setTranslate([-to, 0]);\n\t\t\t} else if (phase === \"end\") {\n\t\t\t\tto = this._getCoordsValue([to, 0]);\n\n\t\t\t\tutils.css(container, {\n\t\t\t\t\tleft: to.x,\n\t\t\t\t\ttop: to.y,\n\t\t\t\t\t[consts.TRANSFORM.name]: utils.translate(0, 0, conf.useLayerHack)\n\t\t\t\t});\n\n\t\t\t\tconf.$dummyAnchor.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set Axes coord value\n\t * @private\n\t * @param {String} method\n\t * @param {Number} flick destination value\n\t * @param {Number} duration\n\t * @return {eg.Axes} Axes instance\n\t */\n\t_setAxes(method, flick, duration) {\n\t\treturn this._axesInst[method]({flick}, duration);\n\t}\n\n\t/**\n\t * Set hint for browser to decide efficient way of doing transform changes(or animation)\n\t * https://dev.opera.com/articles/css-will-change-property/\n\t * @private\n\t */\n\t_setHint() {\n\t\tconst style = {willChange: \"transform\"};\n\n\t\tutils.css(this.$container, style);\n\t\tutils.css(this._conf.panel.$list, style);\n\t}\n\n\t/**\n\t * Get data according options.horizontal value\n\t * @private\n\t * @param {Array} value primary data to handle\n\t * @return {Array}\n\t */\n\t_getDataByDirection(value) {\n\t\tconst data = value.concat();\n\n\t\t!this.options.horizontal && data.reverse();\n\t\treturn data;\n\t}\n\n\t/**\n\t * Move nodes\n\t * @private\n\t * @param {Boolean} direction\n\t * @param {Number} indexToMove\n\t */\n\t_arrangePanelPosition(direction, indexToMove) {\n\t\tconst next = direction === this._conf.dirData[0];\n\n\t\tthis._movePanelPosition(Math.abs(indexToMove || 1), next);\n\t}\n\n\t/**\n\t * Get the base position index of the panel\n\t * @private\n\t */\n\t_getBasePositionIndex() {\n\t\treturn Math.floor(this._conf.panel.count / 2 - 0.1);\n\t}\n\n\t/**\n\t * Bind events\n\t * @private\n\t * @param {Boolean} bind\n\t */\n\t_bindEvents(bind) {\n\t\tconst options = this.options;\n\t\tconst $wrapper = this.$wrapper;\n\t\tconst axesInst = this._axesInst;\n\n\t\tif (bind) {\n\t\t\tthis._panInput = new PanInput($wrapper, {\n\t\t\t\tinputType: options.inputType,\n\t\t\t\tthresholdAngle: options.thresholdAngle,\n\t\t\t\tscale: this._getDataByDirection([-1, 0])\n\t\t\t});\n\n\t\t\taxesInst.on({\n\t\t\t\thold: this._holdHandler.bind(this),\n\t\t\t\tchange: this._changeHandler.bind(this),\n\t\t\t\trelease: this._releaseHandler.bind(this),\n\t\t\t\tanimationStart: this._animationStartHandler.bind(this),\n\t\t\t\tanimationEnd: this._animationEndHandler.bind(this)\n\t\t\t}).connect(this._getDataByDirection([\"flick\", \"\"]), this._panInput);\n\t\t} else {\n\t\t\tthis.disableInput();\n\t\t\taxesInst.off();\n\t\t}\n\t}\n\n\t/**\n\t * Set container's height value according to children's height\n\t * @private\n\t * @param {Number} direction\n\t */\n\t_setAdaptiveHeight(direction) {\n\t\tconst conf = this._conf;\n\t\tconst indexToMove = conf.indexToMove;\n\t\tlet $children;\n\t\tlet height;\n\n\t\tconst $panel = indexToMove === 0 ?\n\n\t\t\t// panel moved by 1\n\t\t\tthis[`get${\n\t\t\t\t(direction === Axes.DIRECTION_LEFT && \"Next\") ||\n\t\t\t\t(direction === Axes.DIRECTION_RIGHT && \"Prev\") || \"\"\n\t\t\t}Element`]() :\n\n\t\t\t// panel moved by .moveTo()\n\t\t\tconf.panel.$list[\n\t\t\t\tconf.panel.currIndex + indexToMove\n\t\t\t];\n\n\t\tconst $first = $panel.querySelector(\":first-child\");\n\n\t\tif ($first) {\n\t\t\theight = $first.getAttribute(consts.DATA_HEIGHT);\n\n\t\t\tif (!height) {\n\t\t\t\t$children = $panel.children;\n\n\t\t\t\theight = utils.outerHeight(\n\t\t\t\t\t$children.length > 1 ? ($panel.style.height = \"auto\", $panel) : $first\n\t\t\t\t);\n\n\t\t\t\theight > 0 && $first.setAttribute(consts.DATA_HEIGHT, height);\n\t\t\t}\n\n\t\t\theight > 0 && (this.$wrapper.style.height = `${height}px`);\n\t\t}\n\t}\n\n\t/**\n\t * Trigger beforeRestore event\n\t * @private\n\t * @param {Object} e event object\n\t */\n\t_triggerBeforeRestore(e) {\n\t\tconst conf = this._conf;\n\t\tconst touch = conf.touch;\n\n\t\t// reverse direction value when restore\n\t\ttouch.direction = +conf.dirData.join(\"\").replace(touch.direction, \"\");\n\n\t\t/**\n\t\t * This event occurs before the current panel starts to return to its original position. Followes [flick]{@link eg.Flicking#event:flick} and [restore]{@link eg.Flicking#event:restore} events. The conditions of occurrence are as follows.
1. The user has finished input but does not exceed the panel movement threshold.
2. Call the [restore()]{@link eg.Flicking#restore} method. (Prevent the default behavior of the [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} event.)\n\t\t * @ko 현재 패널이 원래 위치로 되돌아가기 시작전에 발생하는 이벤트이다. 뒤이어 [flick]{@link eg.Flicking#event:flick}과 [restore]{@link eg.Flicking#event:restore}이벤트가 발생한다. 발생조건은 아래와 같다.
1. 사용자 입력이 끝났는데 패널 이동 임계점을 넘지 않은 경우.
2. [restore()]{@link eg.Flicking#restore} 메서드 호출.([beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} 이벤트의 기본동작 방지 전제)\n\t\t * @name eg.Flicking#beforeRestore\n\t\t * @event\n\t\t * @property {String} eventType The name of the event 이벤트 명\n\t\t * @property {Boolean} isTrusted `true` when the event was generated by a user action(\"mouse\" or \"touch\") otherwise `false`.사용자 액션(\"mouse\" 또는 \"touch\")에 의해 이벤트가 생성된 경우 `true`. 그 외는 `false`.\n\t\t * @property {Number} no Index number of the current panel element. See the [getIndex()]{@link eg.Flicking#getIndex} method.현재 패널 요소의 인덱스 번호. [getIndex()]{@link eg.Flicking#getIndex}메서드 참조.\n\t\t * @property {Number} direction of the panel movement. If `horizontal=true` is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_RIGHT}. If `horizontal=false` is {@link eg.Flicking.DIRECTION_UP} or {@link eg.Flicking.DIRECTION_DOWN}.패널 이동 방향. `horizontal=true` 이면 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_RIGHT}. `horizontal=false` 이면 {@link eg.Flicking.DIRECTION_UP} 혹은 {@link eg.Flicking.DIRECTION_DOWN}.\n\t\t * @property {Number} depaPos Starting coordinate. 출발점 좌표.\n\t\t * @property {Number} destPos Destination coordinate. 도착점 좌표.\n\t\t * @see eg.Flicking#event:flick\n\t\t * @see eg.Flicking#event:restore\n\t\t * @see eg.Flicking#restore\n\t\t * @example\n\t\t * // The order of event occurrence.\n\t\t * // 이벤트 발생 순서\n\t\t * beforeRestore (once) > flick (many times) > restore (once)\n\t\t */\n\t\tconf.customEvent.restore = this._triggerEvent(consts.EVENTS.beforeRestore, {\n\t\t\tdepaPos: e.depaPos.flick,\n\t\t\tdestPos: e.destPos.flick\n\t\t});\n\n\t\tif (!conf.customEvent.restore) {\n\t\t\t\"stop\" in e && e.stop();\n\t\t\tconf.panel.animating = false;\n\t\t}\n\t}\n\n\t/**\n\t * Trigger restore event\n\t * @private\n\t */\n\t_triggerRestore() {\n\t\tconst customEvent = this._conf.customEvent;\n\n\t\t/**\n\t\t * The event that occurs after completing the move by [restore()]{@link eg.Flicking#restore} method.\n\t\t * @ko [restore()]{@link eg.Flicking#restore} 메서드에 의해 패널이 원래 위치로 이동을 완료한 다음 발생하는 이벤트.\n\t\t * @name eg.Flicking#restore\n\t\t * @event\n\t\t * @property {String} eventType The name of the event 이벤트 명\n\t\t * @property {Boolean} isTrusted `true` when the event was generated by a user action(\"mouse\" or \"touch\") otherwise `false`.사용자 액션(\"mouse\" 또는 \"touch\")에 의해 이벤트가 생성된 경우 `true`. 그 외는 `false`.\n\t\t * @property {Number} no Index number of the current panel element. See the [getIndex()]{@link eg.Flicking#getIndex} method.현재 패널 요소의 인덱스 번호. [getIndex()]{@link eg.Flicking#getIndex}메서드 참조.\n\t\t * @property {Number} direction of the panel movement. If `horizontal=true` is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_RIGHT}. If `horizontal=false` is {@link eg.Flicking.DIRECTION_UP} or {@link eg.Flicking.DIRECTION_DOWN}.패널 이동 방향. `horizontal=true` 이면 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_RIGHT}. `horizontal=false` 이면 {@link eg.Flicking.DIRECTION_UP} 혹은 {@link eg.Flicking.DIRECTION_DOWN}.\n\t\t * @see eg.Flicking#event:beforeRestore\n\t\t * @see eg.Flicking#event:flick\n\t\t * @see eg.Flicking#restore\n\t\t * @example\n\t\t * // The order of event occurrence.\n\t\t * // 이벤트 발생 순서\n\t\t * beforeRestore (once) > flick (many times) > restore (once)\n\t\t */\n\t\tcustomEvent.restore && this._triggerEvent(consts.EVENTS.restore);\n\t\tcustomEvent.restore = customEvent.restoreCall = false;\n\t}\n\n\t/**\n\t * Set value when panel changes\n\t * @private\n\t * @param {String} phase - [start|end]\n\t * @param {Object} pos\n\t */\n\t_setPhaseValue(phase, pos) {\n\t\tconst conf = this._conf;\n\t\tconst options = this.options;\n\t\tconst panel = conf.panel;\n\n\t\tif (phase === \"start\" && (panel.changed = this._isMovable())) {\n\t\t\t/**\n\t\t\t * An event that occurs before a user action or [moveTo()]{@link eg.Flicking#moveTo}, [prev()]{@link eg.Flicking#prev}, [next()]{@link eg.Flicking#next} method initiates a move to the destination panel. If you do not prevent the default behavior, then many [flick]{@link eg.Flicking#event:flick} events and one [flickEnd]{@link eg.Flicking#event:flickEnd} event will occur.\n\t\t\t * @ko 사용자 액션 혹은 [moveTo()]{@link eg.Flicking#moveTo}, [prev()]{@link eg.Flicking#prev}, [next()]{@link eg.Flicking#next} 메서드에 의해 목적 패널로의 이동 시작전 발생하는 이벤트. 기본동작을 막지 않는다면 뒤이어 다수의 [flick]{@link eg.Flicking#event:flick}이벤트와 그 뒤 한 번의 [flickEnd]{@link eg.Flicking#event:flickEnd}이벤트가 발생한다.\n\t\t\t * @name eg.Flicking#beforeFlickStart\n\t\t\t * @event\n\t\t\t * @property {String} eventType The name of the event 이벤트 명\n\t\t\t * @property {Boolean} isTrusted `true` when the event was generated by a user action(\"mouse\" or \"touch\") otherwise `false`.사용자 액션(\"mouse\" 또는 \"touch\")에 의해 이벤트가 생성된 경우 `true`. 그 외는 `false`\n\t\t\t * @property {Number} no Index number of the current panel element. See the [getIndex()]{@link eg.Flicking#getIndex} method.현재 패널 요소의 인덱스 번호. [getIndex()]{@link eg.Flicking#getIndex}메서드 참조.\n\t\t\t * @property {Number} direction of the panel movement. If `horizontal=true` is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_RIGHT}. If `horizontal=false` is {@link eg.Flicking.DIRECTION_UP} or {@link eg.Flicking.DIRECTION_DOWN}.패널 이동 방향. `horizontal=true` 이면 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_RIGHT}. `horizontal=false` 이면 {@link eg.Flicking.DIRECTION_UP} 혹은 {@link eg.Flicking.DIRECTION_DOWN}.\n\t\t\t * @property {Number} depaPos Starting coordinate. 출발점 좌표.\n\t\t\t * @property {Number} destPos Destination coordinate. 도착점 좌표.\n\t\t\t * @property {Function} stop Cancels the default action. (Default action: Move to destination panel.) The panel element stays at the position of the call to `stop()`. To return to the original position, you must call the [restore()]{@link eg.Flicking#restore} method.기본동작을 취소한다. (기본동작: 목적 패널로의 이동.) 패널 요소가 `stop()`호출시점의 위치에 머물러 있는다. 원래 자리로 되돌리려면 [restore()]{@link eg.Flicking#restore} 메서드를 호출해야 한다.\n\t\t\t * @see eg.Flicking#event:flick\n\t\t\t * @see eg.Flicking#event:flickEnd\n\t\t\t * @see eg.Flicking#moveTo\n\t\t\t * @see eg.Flicking#prev\n\t\t\t * @see eg.Flicking#next\n\t\t\t * @example\n\t\t\t * // The order of event occurrence.\n\t\t\t * // 이벤트 발생 순서\n\t\t\t * beforeFlickStart (once) > flick (many times) > flickEnd (once)\n\t\t\t * @example\n\t\t\t * // An example to prevent the default behavior.\n\t\t\t * // 기본동작을 막는 예.\n\t\t\t * new eg.Flicking(\"#flick\").on(\"beforeFlickStart\", e => {\n\t\t\t * \te.stop();\n\t\t\t * });\n\t\t\t */\n\t\t\tif (!this._triggerEvent(consts.EVENTS.beforeFlickStart, pos)) {\n\t\t\t\tpanel.changed = panel.animating = false;\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\toptions.adaptiveHeight && this._setAdaptiveHeight(conf.touch.direction);\n\t\t\t}\n\n\t\t\tconf.indexToMove === 0 && this._setPanelNo();\n\t\t} else if (phase === \"end\") {\n\t\t\tif (options.circular && panel.changed) {\n\t\t\t\tthis._arrangePanels(true, conf.indexToMove);\n\t\t\t}\n\n\t\t\t!consts.IS_ANDROID2 && this._setTranslate([-panel.size * panel.index, 0]);\n\t\t\tconf.touch.distance = conf.indexToMove = 0;\n\n\t\t\t/**\n\t\t\t * The event that occurs after completing the move to the destination panel. It occurs in the following cases.
- After completing the movement to the destination panel by user's move input.
- `moveTo()`, `prev()`, `next()` method call. (It does not occur if you have disabled the default behavior of the [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} event.)\n\t\t\t * @ko 목적 패널로의 이동을 완료한 다음 발생하는 이벤트. 아래의 경우에 발생한다.
- 사용자의 이동(move) 액션 입력에 의한 목적 패널로의 이동완료 후.
- `moveTo()`, `prev()`, `next()` 메서드 호출.([beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart}이벤트의 기본동작을 막았다면 발생하지 않는다.)\n\t\t\t * @name eg.Flicking#flickEnd\n\t\t\t * @event\n\t\t\t * @property {String} eventType The name of the event.이벤트 명\n\t\t\t * @property {Boolean} isTrusted `true` when the event was generated by a user action(\"mouse\" or \"touch\") otherwise `false`.사용자 액션(\"mouse\" 또는 \"touch\")에 의해 이벤트가 생성된 경우 `true`. 그 외는 `false`.\n\t\t\t * @property {Number} no Index number of the current panel element. See the [getIndex()]{@link eg.Flicking#getIndex} method.현재 패널 요소의 인덱스 번호. [getIndex()]{@link eg.Flicking#getIndex}메서드 참조.\n\t\t\t * @property {Number} direction of the panel movement. If `horizontal=true` is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_RIGHT}. If `horizontal=false` is {@link eg.Flicking.DIRECTION_UP} or {@link eg.Flicking.DIRECTION_DOWN}.패널 이동 방향. `horizontal=true` 이면 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_RIGHT}. `horizontal=false` 이면 {@link eg.Flicking.DIRECTION_UP} 혹은 {@link eg.Flicking.DIRECTION_DOWN}.\n\t\t\t * @see eg.Flicking#event:beforeFlickStart\n\t\t\t * @see eg.Flicking#event:flick\n\t\t\t * @see eg.Flicking#moveTo\n\t\t\t * @see eg.Flicking#prev\n\t\t\t * @see eg.Flicking#next\n\t\t\t * @example\n\t\t\t * // The order of event occurrence.\n\t\t\t * // 이벤트 발생 순서\n\t\t\t * beforeFlickStart (once) > flick (many times) > flickEnd (once)\n\t\t\t */\n\t\t\tpanel.changed && this._triggerEvent(consts.EVENTS.flickEnd);\n\t\t}\n\n\t\tthis._adjustContainerCss(phase);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get positive or negative according direction\n\t * @private\n\t */\n\t_getNumByDirection() {\n\t\tconst conf = this._conf;\n\n\t\treturn conf.touch.direction === conf.dirData[0] ? 1 : -1;\n\t}\n\n\t/**\n\t * Revert panel number\n\t * @private\n\t */\n\t_revertPanelNo() {\n\t\tconst panel = this._conf.panel;\n\t\tconst num = this._getNumByDirection();\n\n\t\tconst index = panel.currIndex >= 0 ? panel.currIndex : panel.index - num;\n\t\tconst no = panel.currNo >= 0 ? panel.currNo : panel.no - num;\n\n\t\tthis._setPanelNo({\n\t\t\tindex,\n\t\t\tno\n\t\t});\n\t}\n\n\t/**\n\t * Set the panel number\n\t * @private\n\t * @param {Object} obj number object\n\t */\n\t_setPanelNo(obj) {\n\t\tconst panel = this._conf.panel;\n\t\tconst count = panel.origCount - 1;\n\t\tconst num = this._getNumByDirection();\n\n\t\tif (utils.isObject(obj)) {\n\t\t\tfor (const key in obj) {\n\t\t\t\tpanel[key] = obj[key];\n\t\t\t}\n\t\t} else {\n\t\t\t// remember current value\n\t\t\tpanel.currIndex = panel.index;\n\t\t\tpanel.currNo = panel.no;\n\n\t\t\tpanel.index += num;\n\t\t\tpanel.no += num;\n\t\t}\n\n\t\tif (panel.no > count) {\n\t\t\tpanel.no = 0;\n\t\t} else if (panel.no < 0) {\n\t\t\tpanel.no = count;\n\t\t}\n\t}\n\n\t/**\n\t * Set pointerEvents css property on container element due to the iOS click bug\n\t * @private\n\t * @param {Event} e\n\t */\n\t_setPointerEvents(e) {\n\t\tconst pointer = utils.css(this.$container, \"pointerEvents\");\n\t\tlet val;\n\n\t\tif (e && e.holding &&\n\t\t\te.inputEvent && e.inputEvent.preventSystemEvent &&\n\t\t\tpointer !== \"none\"\n\t\t) {\n\t\t\tval = \"none\";\n\t\t} else if (!e && pointer !== \"auto\") {\n\t\t\tval = \"auto\";\n\t\t}\n\n\t\tval && utils.css(this.$container, {pointerEvents: val});\n\t}\n\n\t/**\n\t * Get coordinate value with unit\n\t * @private\n\t * @param coordsValue {Array} x,y numeric value\n\t * @return {Object} x,y coordinate value with unit\n\t */\n\t_getCoordsValue(coordsValue) {\n\t\t// the param comes as [ val, 0 ], whatever the direction. So reorder the value depend the direction.\n\t\tconst coords = this._getDataByDirection(coordsValue);\n\n\t\treturn {\n\t\t\tx: utils.getUnitValue(coords[0]),\n\t\t\ty: utils.getUnitValue(coords[1])\n\t\t};\n\t}\n\n\t/**\n\t * Set translate property value\n\t * @private\n\t * @param {Array} coordsValue coordinate x,y value\n\t */\n\t_setTranslate(coordsValue) {\n\t\tconst coords = this._getCoordsValue(coordsValue);\n\n\t\tthis._setMoveStyle(this.$container, [coords.x, coords.y]);\n\t}\n\n\t/**\n\t * Check if panel passed through threshold pixel\n\t * @private\n\t */\n\t_isMovable() {\n\t\tconst options = this.options;\n\t\tconst axesInst = this._axesInst;\n\t\tconst isMovable = Math.abs(this._conf.touch.distance) >= options.threshold;\n\t\tlet max;\n\t\tlet currPos;\n\n\t\tif (!options.circular && isMovable) {\n\t\t\tmax = axesInst.axis.flick.range[1];\n\t\t\tcurrPos = axesInst.get().flick;\n\n\t\t\t// if current position out of range\n\t\t\tif (currPos < 0 || currPos > max) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn isMovable;\n\t}\n\n\t/**\n\t * Trigger custom events\n\t * @private\n\t * @param {String} name - event name\n\t * @param {Object} param - additional event value\n\t * @return {Boolean}\n\t */\n\t_triggerEvent(name, param) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\n\t\t// pass changed panel no only on 'flickEnd' event\n\t\tif (name === consts.EVENTS.flickEnd) {\n\t\t\tpanel.currNo = panel.no;\n\t\t\tpanel.currIndex = panel.index;\n\t\t}\n\n\t\treturn this.trigger(conf.eventPrefix + name, utils.extend({\n\t\t\teventType: name,\n\t\t\tno: panel.currNo,\n\t\t\tdirection: conf.touch.direction,\n\t\t\tisTrusted: conf.touch.isTrusted\n\t\t}, param));\n\t}\n\n\t/**\n\t * Get next/prev panel element/index.\n\t * @private\n\t * @param {Boolean} direction\n\t * @param {Boolean} element - true:to get element, false:to get index\n\t * @param {Number} physical - true : physical, false : logical (@deprecated since 2.2.0)\n\t * @return {HTMLElement|Number}\n\t */\n\t_getElement(direction, element, physical) {\n\t\tconst panel = this._conf.panel;\n\t\tconst circular = this.options.circular;\n\t\tconst pos = panel.currIndex;\n\t\tconst next = direction === this._conf.dirData[0];\n\t\tlet result = null;\n\t\tlet total;\n\t\tlet index;\n\n\t\tif (physical) {\n\t\t\ttotal = panel.count;\n\t\t\tindex = pos;\n\t\t} else {\n\t\t\ttotal = panel.origCount;\n\t\t\tindex = panel.currNo;\n\t\t}\n\n\t\tconst currentIndex = index;\n\n\t\tif (next) {\n\t\t\tif (index < total - 1) {\n\t\t\t\tindex++;\n\t\t\t} else if (circular) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t} else {\n\t\t\tif (index > 0) {\n\t\t\t\tindex--;\n\t\t\t} else if (circular) {\n\t\t\t\tindex = total - 1;\n\t\t\t}\n\t\t}\n\n\t\tif (currentIndex !== index) {\n\t\t\tresult = element ? panel.$list[next ? pos + 1 : pos - 1] : index;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Set value to force move panels when duration is 0\n\t * @private\n\t * @param {Boolean} next\n\t */\n\t_setValueToMove(next) {\n\t\tconst conf = this._conf;\n\n\t\tconf.touch.distance = this.options.threshold + 1;\n\t\tconf.touch.direction = conf.dirData[+!next];\n\t}\n\n\t/**\n\t * Returns the index number of the current panel element.\n\t * @ko 현재 패널 요소의 인덱스 번호를 반환한다.\n\t * @method eg.Flicking#getIndex\n\t * @param {Boolean} [physical=false] @deprecated since 2.2.0
Types of index numbers.
- true (Physical): Math.floor({Total number of panels} / 2 - 0.1) value. (Increase by 1 for every two panels.) If the circular option is false, it equals physical=false.
- false (Logical): The value of how the content(innerHTML) of the current panel element is in the defined order of the panel elements.@deprecated since 2.2.0
인덱스 번호의 종류.
- true (물리적): `Math.floor({패널 총 개수} / 2 - 0.1)` 값. (패널이 2개 늘어날 때마다 1씩 증가) `circular`옵션이 `false`이면 `physical=false`와 동일한 값.
- false (논리적): 현재 패널 요소의 컨텐트(innerHTML)가 '패널 요소들의 정의된 순서'에서 몇 번째인지에 대한 값.\n\t * @return {Number} Index number of the current panel element. A zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n\t * @see eg.Flicking#getPrevIndex\n\t * @see eg.Flicking#getNextIndex\n\t * @example\n\t * ```html\n\t * \n\t * \t
\n\t * \t
\n\t * \t
\n\t * \t
\n\t *
\n\t * ```\n\t * ```javascript\n\t * // circular off and left flicking.\n\t * // 순환을 끄고 좌 플리킹.\n\t * new eg.Flicking(\"#flick\").on(\"flickEnd\", {currentTarget} => {\n\t * \tconsole.log(currentTarget.getIndex()); // 1 > 2 > 3\n\t * \tconsole.log(currentTarget.getIndex(true)); // 1 > 2 > 3\n\t * };\n\t *\n\t * // circular on and left flicking.\n\t * // 순환을 켜고 좌 플리킹.\n\t * new eg.Flicking(\"#flick\", {circular: true}).on(\"flickEnd\", {currentTarget} => {\n\t * \tconsole.log(currentTarget.getIndex()); // 1 > 2 > 3 > 0 > 1 > 2 > 3 > 0 ...\n\t * \tconsole.log(currentTarget.getIndex(true)); // 1 > 1 > 1 > 1 > 1 > 1 > 1 > 1 ...\n\t * };\n\t * ```\n\t * @example\n\t * ```html\n\t * \n\t * \n\t * \n\t * ```\n\t * ```javascript\n\t * // (In the case of circulation) If the number of defined panel elements is less than the minimum number required, the number of panels is created.\n\t * // Therefore, it is described as 'the number of panel definitions of the contents of the panel.'\n\t * // (순환인 경우) 정의된 패널 요소의 개수가 필요 최소개수보다 적으면 그 수만큼의 패널을 생성한다.\n\t * // 그렇기 때문에 '패널이 담고 있는 컨텐트의 패널 정의 순성상의 번호'라고 설명한다.\n\t * const flick = new eg.Flicking(\"flick2\", {\n\t * \tcircular: true\n\t * });\n\t *\n\t * // The content of the current panel is the first in the panel definition order.\n\t * // 현재 패널이 담고 있는 컨텐트는 패널 정의 순서상 첫 번째이다.\n\t * flick.getIndex(); // 0\n\t *\n\t * // The content of the next panel is the second in the panel definition order.\n\t * // 다음 패널이 담고 있는 컨텐트는 패널 정의 순서상 두 번째이다.\n\t * flick.getNextIndex(); // 1\n\t *\n\t * // The content of the previous panel is the second in the panel definition order.\n\t * // 이전 패널이 담고 있는 컨텐트는 패널 정의 순서상 두 번째이다.\n\t * flick.getPrevIndex(); // 1\n\t * ```\n\t */\n\tgetIndex(physical) {\n\t\treturn this._conf.panel[physical ? \"currIndex\" : \"currNo\"];\n\t}\n\n\t/**\n\t * Returns the reference of the current panel element.\n\t * @ko 현재 패널 요소의 레퍼런스를 반환한다.\n\t * @method eg.Flicking#getElement\n\t * @return {HTMLElement} Current panel element.현재 패널 요소.\n\t * @see eg.Flicking#getPrevElement\n\t * @see eg.Flicking#getNextElement\n\t */\n\tgetElement() {\n\t\tconst panel = this._conf.panel;\n\n\t\treturn panel.$list[panel.currIndex];\n\t}\n\n\t/**\n\t * Returns the reference of the next panel element.\n\t * @ko 다음 패널 요소의 레퍼런스를 반환한다.\n\t * @method eg.Flicking#getNextElement\n\t * @return {HTMLElement|null} Next panel element or `null` if it does not exist.다음 패널 요소. 패널이 없으면 `null`을 반환한다.\n\t * @see eg.Flicking#getElement\n\t * @see eg.Flicking#getPrevElement\n\t */\n\tgetNextElement() {\n\t\treturn this._getElement(this._conf.dirData[0], true);\n\t}\n\n\t/**\n\t * Returns the index number of the next panel element.\n\t * @ko 다음 패널 요소의 인덱스 번호를 반환한다.\n\t * @method eg.Flicking#getNextIndex\n\t * @param {Boolean} [physical=false] @deprecated since 2.2.0
Types of index numbers
- true (Physical): Plus one of [getIndex()]{@link eg.Flicking#getIndex} return value.
- false (Logical): The value of how the content(innerHTML) of the next panel element is in the defined order of the panel elements.@deprecated since 2.2.0
인덱스 번호의 종류.
- true (물리적): [getIndex()]{@link eg.Flicking#getIndex} 반환값에 1을 더한 값.
- false (논리적): 다음 패널 요소의 컨텐트(innerHTML)가 '패널 요소들의 정의된 순서'에서 몇 번째인지에 대한 값.\n\t * @return {Number|null} Index number of the next panel element or null if it does not exist. A zero-based integer.다음 패널 요소의 인덱스 번호. 0부터 시작하는 정수. 패널이 없으면 `null`을 반환한다.\n\t * @see eg.Flicking#getIndex\n\t * @see eg.Flicking#getPrevIndex\n\t */\n\tgetNextIndex(physical) {\n\t\treturn this._getElement(this._conf.dirData[0], false, physical);\n\t}\n\n\t/**\n\t * Returns a reference to all panel elements.\n\t * @ko 모든 패널 요소의 레퍼런스를 반환한다.\n\t * @method eg.Flicking#getAllElements\n\t * @return {HTMLElement[]} Whole panel elements.모든 패널 요소.\n\t */\n\tgetAllElements() {\n\t\treturn this._conf.panel.$list;\n\t}\n\n\t/**\n\t * Returns the reference of the previous panel element.\n\t * @ko 이전 패널 요소의 레퍼런스를 반환한다.\n\t * @method eg.Flicking#getPrevElement\n\t * @return {HTMLElement|null} Previous panel element or `null` if it does not exist.이전 패널 요소. 패널이 없으면 `null`을 반환한다.\n\t * @see eg.Flicking#getElement\n\t * @see eg.Flicking#getNextElement\n\t */\n\tgetPrevElement() {\n\t\treturn this._getElement(this._conf.dirData[1], true);\n\t}\n\n\t/**\n\t * Returns the index number of the previous panel element.\n\t * @ko 이전 패널 요소의 인덱스 번호를 반환한다.\n\t * @method eg.Flicking#getPrevIndex\n\t * @param {Boolean} [physical=false] @deprecated since 2.2.0
Types of index numbers
- true (Physical): Minus one of [getIndex()]{@link eg.Flicking#getIndex} return value.
- false (Logical): The value of how the content(innerHTML) of the current panel element is in the defined order of the panel elements.@deprecated since 2.2.0
인덱스 번호의 종류
- true (물리적): [getIndex()]{@link eg.Flicking#getIndex} 반환값에 1을 뺀 값.
- false (논리적): 이전 패널 요소의 컨텐트(innerHTML)가 '패널 요소들의 정의된 순서'에서 몇 번째인지에 대한 값.\n\t * @return {Number|null} Previous element index value or null if no more element exist. A zero-based integer.이전 패널 요소의 인덱스 번호. 0부터 시작하는 정수. 패널이 없는 경우는 `null`.\n\t * @see eg.Flicking#getIndex\n\t * @see eg.Flicking#getNextIndex\n\t */\n\tgetPrevIndex(physical) {\n\t\treturn this._getElement(this._conf.dirData[1], false, physical);\n\t}\n\n\t/**\n\t * Checks whether the animated panel is playing.\n\t * @ko 패널 이동 애니메이션이 진행 중인지 확인한다.\n\t * @method eg.Flicking#isPlaying\n\t * @return {Boolean} Indicates whether the animated panel is playing 패널 이동 애니메이션 진행 중 여부\n\t */\n\tisPlaying() {\n\t\treturn this._conf.panel.animating;\n\t}\n\n\t/**\n\t * Move panel to the given direction\n\t * @private\n\t * @param {Boolean} next\n\t * @param {Number} duration\n\t */\n\t_movePanel(next, duration) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst options = this.options;\n\n\t\tif (panel.animating || conf.touch.holding) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis._setValueToMove(next);\n\n\t\tif (options.circular ||\n\t\t\tthis[`get${next ? \"Next\" : \"Prev\"}Index`]() !== null\n\t\t) {\n\t\t\tthis._movePanelByPhase(\"setBy\", panel.size * (next ? 1 : -1), duration);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Move panel applying start/end phase value\n\t * @private\n\t * @param {String} method Axes' method name\n\t * @param {Number} to destination value\n\t * @param {Number} durationValue duration value\n\t */\n\t_movePanelByPhase(method, to, durationValue) {\n\t\tconst duration = utils.getNumValue(durationValue, this.options.duration);\n\n\t\tif (this._setPhaseValue(\"start\") !== false) {\n\t\t\tthis._setAxes(method, to, duration);\n\t\t\t!duration && this._setPhaseValue(\"end\");\n\t\t}\n\t}\n\n\t/**\n\t * Moves an element to the next panel. If `horizontal=true`is right panel. If `horizontal=false`is lower panel.\n\t * @ko 다음 패널로 이동한다. `horizontal=true`이면 우측 패널. `horizontal=false`이면 하측 패널.\n\t * @method eg.Flicking#next\n\t * @param {Number} [duration=options.duration] Duration of the panel movement (unit: ms) 패널 이동 애니메이션 진행 시간(단위: ms)\n\t * @return {eg.Flicking} An instance of a module itself 모듈 자신의 인스턴스\n\t * @fires eg.Flicking#beforeFlickStart\n\t * @fires eg.Flicking#flick\n\t * @fires eg.Flicking#flickEnd\n\t * @see eg.Flicking#moveTo\n\t * @see eg.Flicking#prev\n\t */\n\tnext(duration) {\n\t\treturn this._movePanel(true, duration);\n\t}\n\n\t/**\n\t * Moves an element to the previous panel. If `horizontal=true`is left panel. If `horizontal=false`is upper panel.\n\t * @ko 이전 패널로 이동한다. `horizontal=true`이면 좌측 패널. `horizontal=false`이면 상측 패널.\n\t * @method eg.Flicking#prev\n\t * @param {Number} [duration=options.duration] Duration of the panel movement (unit: ms) 패널 이동 애니메이션 진행 시간(단위: ms)\n\t * @return {eg.Flicking} An instance of a module itself모듈 자신의 인스턴스\n\t * @fires eg.Flicking#beforeFlickStart\n\t * @fires eg.Flicking#flick\n\t * @fires eg.Flicking#flickEnd\n\t * @see eg.Flicking#moveTo\n\t * @see eg.Flicking#next\n\t */\n\tprev(duration) {\n\t\treturn this._movePanel(false, duration);\n\t}\n\n\t/**\n\t * Moves to the panel in the order specified in `noValue`. If noValue is equal to the current logical index numbering, no action is taken. [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart}, [flick]{@link eg.Flicking#event:flick}, [flickEnd]{@link eg.Flicking#event:flickEnd} events occur one after the other.\n\t * @ko `noValue`에 지정한 순서의 패널로 이동한다. `noValue`값이 현재의 논리적 인덱스 번호와 같다면 아무동작 하지 않는다. [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart}, [flick]{@link eg.Flicking#event:flick}, [flickEnd]{@link eg.Flicking#event:flickEnd} 이벤트가 차례로 발생한다.\n\t * @method eg.Flicking#moveTo\n\t * @param {Number} noValue The logical index number of the panel element to be moved. (Based on the defined order of the panel elements.)이동할 패널 요소의 논리적 인덱스 번호. ([getIndex()]{@link eg.Flicking#getIndex}메서드 참조.)\n\t * @param {Number} [duration=options.duration] Duration of the panel movement (unit: ms) 패널 이동 애니메이션 진행 시간(단위: ms)\n\t * @return {eg.Flicking} An instance of a module itself모듈 자신의 인스턴스\n\t * @fires eg.Flicking#beforeFlickStart\n\t * @fires eg.Flicking#flick\n\t * @fires eg.Flicking#flickEnd\n\t * @see eg.Flicking#prev\n\t * @see eg.Flicking#next\n\t */\n\tmoveTo(noValue, duration) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst circular = this.options.circular;\n\t\tconst currentIndex = panel.index;\n\t\tlet indexToMove;\n\t\tlet isPositive;\n\t\tlet no = noValue;\n\n\t\tno = utils.getNumValue(no, -1);\n\n\t\tif (no < 0 || no >= panel.origCount || no === panel.no ||\n\t\t\tpanel.animating || conf.touch.holding) {\n\t\t\treturn this;\n\t\t}\n\n\t\tindexToMove = no - (circular ? panel.no : currentIndex);\n\t\tisPositive = indexToMove > 0;\n\n\t\t// check for real panel count which can be moved on each sides in circular mode\n\t\tif (circular &&\n\t\t\tMath.abs(indexToMove) >\n\t\t\t(isPositive ? panel.count - (currentIndex + 1) : currentIndex)) {\n\t\t\tindexToMove += (isPositive ? -1 : 1) * panel.count;\n\t\t\tisPositive = indexToMove > 0;\n\t\t}\n\n\t\tthis._setPanelNo(circular ? {no} : {no, index: no});\n\t\tthis._conf.indexToMove = indexToMove;\n\t\tthis._setValueToMove(isPositive);\n\n\t\tthis._movePanelByPhase(\n\t\t\tcircular ? \"setBy\" : \"setTo\",\n\t\t\tpanel.size * (circular ? indexToMove : no),\n\t\t\tduration\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * The horizontal or vertical length of the panel is updated according to the base element. If `horizontal=true` is horizontal. If `horizontal=false` is vertical.\n\t * @ko 패널의 가로 혹은 세로 길이를 기준요소에 맞춰 갱신한다. `horizontal=true`이면 가로, `horizontal=false`이면 세로.\n\t * @method eg.Flicking#resize\n\t * @return {eg.Flicking} An instance of a module itself모듈 자신의 인스턴스\n\t * @example\n\t * const flick = new eg.Flicking(\"#flick\", {\n\t * \tpreviewPadding: [10, 10]\n\t * });\n\t *\n\t * // When device orientaion changes.\n\t * // 단말기를 회전했을 때.\n\t * flick.resize();\n\t *\n\t * // Or when changes previewPadding option from its original value.\n\t * // 또는 previewPadding옵션값을 변경했을 때.\n\t * flick.options.previewPadding = [20, 30];\n\t * flick.resize();\n\t */\n\tresize() {\n\t\tconst conf = this._conf;\n\t\tconst options = this.options;\n\t\tconst panel = conf.panel;\n\t\tconst horizontal = options.horizontal;\n\t\tlet panelSize;\n\n\t\tif (!this.isPlaying()) {\n\t\t\tif (utils.isArray(options.previewPadding) && typeof +options.previewPadding.join(\"\") === \"number\") {\n\t\t\t\tthis._setPadding(options.previewPadding.concat());\n\t\t\t\tpanelSize = panel.size;\n\t\t\t} else if (horizontal) {\n\t\t\t\tpanelSize = panel.size = utils.css(this.$wrapper, \"width\", true);\n\t\t\t}\n\n\t\t\tconst max = panelSize * (panel.count - 1);\n\t\t\tconst maxCoords = this._getDataByDirection([max, 0]);\n\n\t\t\t// resize elements\n\t\t\thorizontal && utils.css(this.$container, {width: `${maxCoords[0] + panelSize}px`});\n\t\t\tutils.css(panel.$list, {\n\t\t\t\t[horizontal ? \"width\" : \"height\"]: utils.getUnitValue(panelSize)\n\t\t\t});\n\n\t\t\t// remove data-height attribute and re-evaluate panel's height\n\t\t\tif (options.adaptiveHeight) {\n\t\t\t\tconst $panel = this.$container.querySelectorAll(`[${consts.DATA_HEIGHT}]`);\n\n\t\t\t\tif ($panel.length) {\n\t\t\t\t\t[].slice.call($panel)\n\t\t\t\t\t\t.forEach(v => v.removeAttribute(consts.DATA_HEIGHT));\n\n\t\t\t\t\tthis._setAdaptiveHeight();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._axesInst.axis.flick.range = [0, max];\n\t\t\tthis._setAxes(\"setTo\", panelSize * panel.index, 0);\n\n\t\t\tif (consts.IS_ANDROID2) {\n\t\t\t\tthis._applyPanelsPos();\n\t\t\t\tthis._adjustContainerCss(\"end\");\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Return the panel to its original position. (It only works when the default behavior of the [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} event is canceled.) [beforeRestore]{@link eg.Flicking#event:beforeRestore}, [flick]{@link eg.Flicking#event:flick}, [restore]{@link eg.Flicking#event:restore} events are occur in order.\n\t * @ko 패널의 위치를 원래 자리로 되돌린다. ([beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} 이벤트의 기본동작을 취소한 경우에만 동작함.) [beforeRestore]{@link eg.Flicking#event:beforeRestore}, [flick]{@link eg.Flicking#event:flick}, [restore]{@link eg.Flicking#event:restore} 이벤트가 차례로 발생한다.\n\t * @method eg.Flicking#restore\n\t * @param {Number} [durationValue=options.duration] Duration of the panel movement (unit: ms)패널 이동 애니메이션 진행 시간(단위: ms)\n\t * @return {eg.Flicking} An instance of a module itself모듈 자신의 인스턴스\n\t * @fires eg.Flicking#event:beforeRestore\n\t * @fires eg.Flicking#event:flick\n\t * @fires eg.Flicking#event:restore\n\t * @example\n\t * new eg.Flicking(\"#flick\").on(\"beforeFlickStart\", e => {\n\t * \tif (e.no === 2) {\n\t * \t\t// Cancels the default behavior of the 'beforeFlickStart' event.\n\t * \t\t// 'beforeFlickStart' 이벤트 기본동작 취소.\n\t * \t\te.stop();\n\t *\n\t * \t\t// Return to original position.\n\t * \t\t// 원래 자리로 되돌림.\n\t * \t\tthis.restore(100);\n\t * \t}\n\t * });\n\t */\n\trestore(durationValue) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst currPos = this._axesInst.get().flick;\n\t\tlet duration = durationValue;\n\t\tlet destPos;\n\n\t\t// check if the panel isn't in right position\n\t\tif (currPos !== panel.currIndex * panel.size) {\n\t\t\tconf.customEvent.restoreCall = true;\n\t\t\tduration = utils.getNumValue(duration, this.options.duration);\n\n\t\t\tthis._revertPanelNo();\n\t\t\tdestPos = panel.size * panel.index;\n\n\t\t\tthis._triggerBeforeRestore({depaPos: currPos, destPos});\n\t\t\tthis._setAxes(\"setTo\", destPos, duration);\n\n\t\t\tif (!duration) {\n\t\t\t\tthis._adjustContainerCss(\"end\");\n\t\t\t\tthis._triggerRestore();\n\t\t\t}\n\n\t\t\t// to handle on api call\n\t\t} else if (panel.changed) {\n\t\t\tthis._revertPanelNo();\n\t\t\tconf.touch.distance = conf.indexToMove = 0;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * The input from the input device is not blocked so that the panel can be moved by the input device.\n\t * @ko 막았던 입력 장치로부터의 입력을 푼다.\n\t * @method eg.Flicking#enableInput\n\t * @return {eg.Flicking} An instance of a module itself 모듈 자신의 인스턴스\n\t * @see eg.Flicking#disableInput\n\t */\n\tenableInput() {\n\t\tthis._panInput.enable();\n\t\treturn this;\n\t}\n\n\t/**\n\t * The input from the input device is blocked so that the panel is not moved by the input device.\n\t * @ko 패널이 입력 장치에 의해 움직이지 않도록 입력 장치로부터의 입력을 막는다.\n\t * @method eg.Flicking#disableInput\n\t * @return {eg.Flicking} An instance of a module itself 모듈 자신의 인스턴스\n\t * @see eg.Flicking#enableInput\n\t */\n\tdisableInput() {\n\t\tthis._panInput.disable();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get current flicking status. If the returned value is specified as a [setStatus()]{@link eg.Flicking#setStatus} method argument, it can be returned to its value state.\n\t * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메서드 인자로 지정하면 그 값 상태로 되돌릴 수 있다.\n\t * @method eg.Flicking#getStatus\n\t * @param {Boolean} [stringify] Set true if want get stringified status value.true 지정시 json문자열 형태로 반환한다.\n\t * @return {Status|String} An object with current state value information.현재 상태값 정보를 가진 객체.\n\t * @see eg.Flicking#setStatus\n\t * @example\n\t * const flick = new eg.Flicking(\"flick\");\n\t * const status = flick.getStatus();\n\t * const jsonStaus = flick.getStatus(true);\n\t *\n\t * console.log(status); // {panel: {...}, $list: Array(7)}\n\t * console.log(jsonStatus); // \"{\\\"panel\\\":{\\\"index\\\":3,\\\"no\\\":6,\\\"currIndex\\\":3,\\\"currNo\\\":6},\\\"$list\\\":[{\\\"style\\\":\\\"background-color: rgb(155, 49, 137); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 3</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(51, 172, 91); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 4</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(116, 38, 241); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 5</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(141, 139, 24); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 6</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(204, 102, 204); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 0</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(54, 53, 156); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 1</p>\\n\\t\\t\\t\\t\\t\\t\\\"},{\\\"style\\\":\\\"background-color: rgb(196, 218, 72); position: absolute; height: 100%;\\\",\\\"className\\\":\\\"eg-flick-panel\\\",\\\"html\\\":\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>panel 2</p>\\n\\t\\t\\t\\t\\t\\t\\\"}]}\"\n\t */\n\t/**\n\t * The return value specification of the getStatus () method.\n\t * @ko getStatus() 메서드의 반환값 명세.\n\t * @typedef {Object} Status\n\t * @property {Object} panel current panel position현재 패널 위치\n\t * @property {Number} panel.index Physical index number.물리적 인덱스 번호.\n\t * @property {Number} panel.currIndex Current physical index number.현재 물리적 인덱스 번호.\n\t * @property {Number} panel.no Logical index number.논리적 인덱스 번호.\n\t * @property {Number} panel.currNo Current logical index number.현재 논리적 인덱스 번호.\n\t * @property {Array.<{style: String, className: String, html: String}>} $list panel's html패널 정보\n\t * @property {Object} $list.obj For convenience, the element is denoted by obj.편의상 원소를 obj로 표기함\n\t * @property {String} $list.obj.style The value of the style attribute of the panel element. ('transform', 'left', 'top', 'will-change', 'box-sizing', 'width' style has been deleted.)패널 요소의 style 속성 값. ('transform', 'left', 'top', 'will-change', 'box-sizing', 'width' style은 삭제됨)\n\t * @property {String} $list.obj.className The class name of the panel element.패널 요소의 class 이름.\n\t * @property {String} $list.obj.html The innerHTML value of the panel element.패널 요소의 innerHTML 값.\n\t * @see eg.Flicking#getIndex\n\t */\n\tgetStatus(stringify) {\n\t\tconst panel = this._conf.panel;\n\t\tconst rxStyle = /((?:-webkit-)?transform|left|top|will-change|box-sizing|width):[^;]*;/g;\n\t\tconst status = {\n\t\t\t// current panel position\n\t\t\tpanel: {\n\t\t\t\tindex: panel.index,\n\t\t\t\tno: panel.no,\n\t\t\t\tcurrIndex: panel.currIndex,\n\t\t\t\tcurrNo: panel.currNo\n\t\t\t},\n\n\t\t\t// panel's html\n\t\t\t$list: panel.$list.map(v => ({\n\t\t\t\tstyle: v.style.cssText.replace(rxStyle, \"\").trim(),\n\t\t\t\tclassName: v.className,\n\t\t\t\thtml: v.innerHTML\n\t\t\t}))\n\t\t};\n\n\t\treturn stringify ?\n\t\t\tJSON.stringify(status) : status;\n\t}\n\n\t/**\n\t * Restore to the state of the `statusValue`.\n\t * @ko `statusValue`의 상태로 복원한다.\n\t * @method eg.Flicking#setStatus\n\t * @param {Status|String} statusValue Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드 반환값을 지정하면 된다.\n\t * @see eg.Flicking#getStatus\n\t * @example\n\t * const flick = new eg.Flicking(\"flick\");\n\t * const status = flick.getStatus();\n\t *\n\t * // Move to arbitrary panel.\n\t * // 임의 패널로 이동\n\t * flick.moveTo(2);\n\t *\n\t * // Restore to status.\n\t * // status 상태로 복원\n\t * flick.setStatus(status);\n\t */\n\tsetStatus(statusValue) {\n\t\tconst panel = this._conf.panel;\n\t\tconst isAdaptiveHeight = this.options.adaptiveHeight;\n\t\tconst status = typeof statusValue === \"string\" ?\n\t\t\tJSON.parse(statusValue) : statusValue;\n\n\t\tif (status) {\n\t\t\tfor (const x in status.panel) {\n\t\t\t\tx in panel && (panel[x] = status.panel[x]);\n\t\t\t}\n\n\t\t\tpanel.$list.forEach((v, i) => {\n\t\t\t\tconst data = status.$list[i];\n\t\t\t\tconst style = data.style;\n\t\t\t\tconst className = data.className;\n\t\t\t\tconst html = data.html;\n\n\t\t\t\tstyle && (v.style.cssText += style);\n\t\t\t\tclassName && (v.className = className);\n\t\t\t\thtml && (v.innerHTML = html);\n\t\t\t});\n\n\t\t\tisAdaptiveHeight && this._setAdaptiveHeight();\n\t\t}\n\t}\n\n\t/**\n\t * Returns the reference element and its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n\t * @ko 기준 요소와 그 하위 요소를 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n\t * @method eg.Flicking#destroy\n\t * @example\n\t * const flick = new eg.Flicking(\"flick\");\n\t * flick.destroy();\n\t * console.log(flick.moveTo); // null\n\t */\n\tdestroy() {\n\t\tconst conf = this._conf;\n\t\tconst origPanelStyle = conf.origPanelStyle;\n\t\tconst wrapper = origPanelStyle.wrapper;\n\t\tconst container = origPanelStyle.container;\n\t\tconst list = origPanelStyle.list;\n\n\t\t// unwrap container element and restore original inline style\n\t\t// restore wrapper style\n\t\tconst $wrapper = this.$wrapper;\n\n\t\t$wrapper.setAttribute(\"class\", wrapper.className);\n\t\t$wrapper[wrapper.style ? \"setAttribute\" : \"removeAttribute\"](\"style\", wrapper.style);\n\n\t\t// restore container style\n\t\tconst $container = this.$container;\n\t\tconst $children = []\n\t\t\t.slice.call($container.children);\n\n\t\tif (origPanelStyle.container.className) {\n\t\t\t$container.setAttribute(\"class\", container.className);\n\t\t\t$container[container.style ? \"setAttribute\" : \"removeAttribute\"](\"style\", container.style);\n\t\t} else {\n\t\t\t$children.forEach(v => $wrapper.appendChild(v));\n\t\t\t$container.parentNode.removeChild($container);\n\t\t}\n\n\t\tfor (let i = 0, $el; ($el = $children[i]); i++) {\n\t\t\tif (i > list.length - 1) {\n\t\t\t\t$el.parentNode.removeChild($el);\n\t\t\t} else {\n\t\t\t\tconst className = list[i].className;\n\t\t\t\tconst style = list[i].style;\n\n\t\t\t\t$el[className ? \"setAttribute\" : \"removeAttribute\"](\"class\", className);\n\t\t\t\t$el[style ? \"setAttribute\" : \"removeAttribute\"](\"style\", style);\n\t\t\t}\n\t\t}\n\n\t\t// unbind events\n\t\tthis._bindEvents(false);\n\t\tthis.off();\n\n\t\t// destroy eg.Axes instance\n\t\tthis._axesInst.destroy();\n\t\tthis._panInput.destroy();\n\n\t\t// release resources\n\t\tfor (const x in this) {\n\t\t\tthis[x] = null;\n\t\t}\n\t}\n\n\t/**\n\t * Constant value for none direction.\n\t * @ko none 방향에 대한 상수 값.\n\t * @name DIRECTION_NONE\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 1\n\t */\n\tstatic DIRECTION_NONE = Axes.DIRECTION_NONE;\n\n\t/**\n\t * Constant value for left direction.\n\t * @ko left 방향에 대한 상수 값.\n\t * @name DIRECTION_LEFT\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 2\n\t */\n\tstatic DIRECTION_LEFT = Axes.DIRECTION_LEFT;\n\n\t/**\n\t * Constant value for right direction.\n\t * @ko right 방향에 대한 상수 값.\n\t * @name DIRECTION_RIGHT\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 4\n\t */\n\tstatic DIRECTION_RIGHT = Axes.DIRECTION_RIGHT;\n\n\t/**\n\t * Constant value for up direction.\n\t * @ko up 방향에 대한 상수 값.\n\t * @name DIRECTION_UP\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 8\n\t */\n\tstatic DIRECTION_UP = Axes.DIRECTION_UP;\n\n\t/**\n\t * Constant value for down direction.\n\t * @ko down 방향에 대한 상수 값.\n\t * @name DIRECTION_DOWN\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 16\n\t */\n\tstatic DIRECTION_DOWN = Axes.DIRECTION_DOWN;\n\n\t/**\n\t * Constant value for horizontal direction.\n\t * @ko horizontal 방향에 대한 상수 값.\n\t * @name DIRECTION_HORIZONTAL\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 6\n\t */\n\tstatic DIRECTION_HORIZONTAL = Axes.DIRECTION_HORIZONTAL;\n\n\t/**\n\t * Constant value for vertical direction.\n\t * @ko vertical 방향에 대한 상수 값.\n\t * @name DIRECTION_VERTICAL\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 24\n\t */\n\tstatic DIRECTION_VERTICAL = Axes.DIRECTION_VERTICAL;\n\n\t/**\n\t * Constant value for all direction.\n\t * @ko all 방향에 대한 상수 값.\n\t * @name DIRECTION_ALL\n\t * @memberof eg.Flicking\n\t * @static\n\t * @constant\n\t * @type {Number}\n\t * @default 30\n\t */\n\tstatic DIRECTION_ALL = Axes.DIRECTION_ALL;\n}\n\n\n\n// WEBPACK FOOTER //\n// src/Flicking.js","\"use strict\";\nexports.__esModule = true;\nvar Axes_1 = require(\"./Axes\");\nvar PanInput_1 = require(\"./inputType/PanInput\");\nexports.PanInput = PanInput_1.PanInput;\nvar PinchInput_1 = require(\"./inputType/PinchInput\");\nexports.PinchInput = PinchInput_1.PinchInput;\nvar WheelInput_1 = require(\"./inputType/WheelInput\");\nexports.WheelInput = WheelInput_1.WheelInput;\nvar MoveKeyInput_1 = require(\"./inputType/MoveKeyInput\");\nexports.MoveKeyInput = MoveKeyInput_1.MoveKeyInput;\nexports[\"default\"] = Axes_1[\"default\"];\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/index.js\n// module id = 11\n// module chunks = 0 1","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar Component = require(\"@egjs/component\");\nvar AnimationManager_1 = require(\"./AnimationManager\");\nvar EventManager_1 = require(\"./EventManager\");\nvar InterruptManager_1 = require(\"./InterruptManager\");\nvar AxisManager_1 = require(\"./AxisManager\");\nvar InputObserver_1 = require(\"./InputObserver\");\nvar const_1 = require(\"./const\");\n/**\n * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system.\n * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\n * @property {Number[]} [range] The coordinate of range 좌표 범위\n * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표\n * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표\n * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다\n * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기\n * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기\n * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to \"true\" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다\n * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부\n * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부\n**/\n/**\n * @typedef {Object} AxesOption The option object of the eg.Axes module\n * @ko eg.Axes 모듈의 옵션 객체\n * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수\n * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간\n * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간\n * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다\n * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다\n**/\n/**\n * @class eg.Axes\n * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions.\n * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다.\n * @extends eg.Component\n *\n * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다.\n * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체\n * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음.\n *\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\", \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n * @example\n *\n * // 1. Initialize eg.Axes\n * const axes = new eg.Axes({\n *\tsomething1: {\n *\t\trange: [0, 150],\n *\t\tbounce: 50\n *\t},\n *\tsomething2: {\n *\t\trange: [0, 200],\n *\t\tbounce: 100\n *\t},\n *\tsomethingN: {\n *\t\trange: [1, 10],\n *\t}\n * }, {\n * deceleration : 0.0024\n * });\n *\n * // 2. attach event handler\n * axes.on({\n *\t\"hold\" : function(evt) {\n *\t},\n *\t\"release\" : function(evt) {\n *\t},\n *\t\"animationStart\" : function(evt) {\n *\t},\n *\t\"animationEnd\" : function(evt) {\n *\t},\n *\t\"change\" : function(evt) {\n *\t}\n * });\n *\n * // 3. Initialize inputTypes\n * const panInputArea = new eg.Axes.PanInput(\"#area\", {\n *\tscale: [0.5, 1]\n * });\n * const panInputHmove = new eg.Axes.PanInput(\"#hmove\");\n * const panInputVmove = new eg.Axes.PanInput(\"#vmove\");\n * const pinchInputArea = new eg.Axes.PinchInput(\"#area\", {\n *\tscale: 1.5\n * });\n *\n * // 4. Connect eg.Axes and InputTypes\n * // [PanInput] When the mouse or touchscreen is down and moved.\n * // Connect the 'something2' axis to the mouse or touchscreen x position and\n * // connect the 'somethingN' axis to the mouse or touchscreen y position.\n * axes.connect([\"something2\", \"somethingN\"], panInputArea); // or axes.connect(\"something2 somethingN\", panInputArea);\n *\n * // Connect only one 'something1' axis to the mouse or touchscreen x position.\n * axes.connect([\"something1\"], panInputHmove); // or axes.connect(\"something1\", panInputHmove);\n *\n * // Connect only one 'something2' axis to the mouse or touchscreen y position.\n * axes.connect([\"\", \"something2\"], panInputVmove); // or axes.connect(\" something2\", panInputVmove);\n *\n * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * axes.connect(\"something2\", pinchInputArea);\n */\nvar Axes = /** @class */ (function (_super) {\n __extends(Axes, _super);\n function Axes(axis, options, startPos) {\n if (axis === void 0) { axis = {}; }\n var _this = _super.call(this) || this;\n _this.axis = axis;\n _this._inputs = [];\n _this.options = __assign({\n easing: function easeOutCubic(x) {\n return 1 - Math.pow(1 - x, 3);\n },\n interruptable: true,\n maximumDuration: Infinity,\n minimumDuration: 0,\n deceleration: 0.0006\n }, options);\n _this.itm = new InterruptManager_1.InterruptManager(_this.options);\n _this.axm = new AxisManager_1.AxisManager(_this.axis, _this.options);\n _this.em = new EventManager_1.EventManager(_this);\n _this.am = new AnimationManager_1.AnimationManager(_this);\n _this.io = new InputObserver_1.InputObserver(_this);\n _this.em.setAnimationManager(_this.am);\n startPos && _this.em.triggerChange(startPos);\n return _this;\n }\n /**\n * Connect the axis of eg.Axes to the inputType.\n * @ko eg.Axes의 축과 inputType을 연결한다\n * @method eg.Axes#connect\n * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름\n * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * }\n * });\n *\n * axes.connect(\"x\", new eg.Axes.PanInput(\"#area1\"))\n * .connect(\"x xOther\", new eg.Axes.PanInput(\"#area2\"))\n * .connect(\" xOther\", new eg.Axes.PanInput(\"#area3\"))\n * .connect([\"x\"], new eg.Axes.PanInput(\"#area4\"))\n * .connect([\"xOther\", \"x\"], new eg.Axes.PanInput(\"#area5\"))\n * .connect([\"\", \"xOther\"], new eg.Axes.PanInput(\"#area6\"));\n */\n Axes.prototype.connect = function (axes, inputType) {\n var mapped;\n if (typeof axes === \"string\") {\n mapped = axes.split(\" \");\n }\n else {\n mapped = axes.concat();\n }\n // check same instance\n if (~this._inputs.indexOf(inputType)) {\n this.disconnect(inputType);\n }\n // check same element in hammer type for share\n if (\"hammer\" in inputType) {\n var targets = this._inputs.filter(function (v) { return v.hammer && v.element === inputType.element; });\n if (targets.length) {\n inputType.hammer = targets[0].hammer;\n }\n }\n inputType.mapAxes(mapped);\n inputType.connect(this.io);\n this._inputs.push(inputType);\n return this;\n };\n /**\n * Disconnect the axis of eg.Axes from the inputType.\n * @ko eg.Axes의 축과 inputType의 연결을 끊는다.\n * @method eg.Axes#disconnect\n * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * }\n * });\n *\n * const input1 = new eg.Axes.PanInput(\"#area1\");\n * const input2 = new eg.Axes.PanInput(\"#area2\");\n * const input3 = new eg.Axes.PanInput(\"#area3\");\n *\n * axes.connect(\"x\", input1);\n * .connect(\"x xOther\", input2)\n * .connect([\"xOther\", \"x\"], input3);\n *\n * axes.disconnect(input1); // disconnects input1\n * axes.disconnect(); // disconnects all of them\n */\n Axes.prototype.disconnect = function (inputType) {\n if (inputType) {\n var index = this._inputs.indexOf(inputType);\n if (index >= 0) {\n this._inputs[index].disconnect();\n this._inputs.splice(index, 1);\n }\n }\n else {\n this._inputs.forEach(function (v) { return v.disconnect(); });\n this._inputs = [];\n }\n return this;\n };\n /**\n * Returns the current position of the coordinates.\n * @ko 좌표의 현재 위치를 반환한다\n * @method eg.Axes#get\n * @param {Object} [axes] The names of the axis 축 이름들\n * @return {Object.} Axis coordinate information 축 좌표 정보\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * },\n * \t \"zoom\": {\n * range: [50, 30]\n * }\n * });\n *\n * axes.get(); // {\"x\": 0, \"xOther\": -100, \"zoom\": 50}\n * axes.get([\"x\", \"zoom\"]); // {\"x\": 0, \"zoom\": 50}\n */\n Axes.prototype.get = function (axes) {\n return this.axm.get(axes);\n };\n /**\n * Moves an axis to specific coordinates.\n * @ko 좌표를 이동한다.\n * @method eg.Axes#setTo\n * @param {Object.} pos The coordinate to move to 이동할 좌표\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * },\n * \t \"zoom\": {\n * range: [50, 30]\n * }\n * });\n *\n * axes.setTo({\"x\": 30, \"zoom\": 60});\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\n *\n * axes.setTo({\"x\": 100, \"xOther\": 60}, 1000); // animatation\n *\n * // after 1000 ms\n * axes.get(); // {\"x\": 100, \"xOther\": 60, \"zoom\": 60}\n */\n Axes.prototype.setTo = function (pos, duration) {\n if (duration === void 0) { duration = 0; }\n this.am.setTo(pos, duration);\n return this;\n };\n /**\n * Moves an axis from the current coordinates to specific coordinates.\n * @ko 현재 좌표를 기준으로 좌표를 이동한다.\n * @method eg.Axes#setBy\n * @param {Object.} pos The coordinate to move to 이동할 좌표\n * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\n * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * },\n * \t \"zoom\": {\n * range: [50, 30]\n * }\n * });\n *\n * axes.setBy({\"x\": 30, \"zoom\": 10});\n * axes.get(); // {\"x\": 30, \"xOther\": -100, \"zoom\": 60}\n *\n * axes.setBy({\"x\": 70, \"xOther\": 60}, 1000); // animatation\n *\n * // after 1000 ms\n * axes.get(); // {\"x\": 100, \"xOther\": -40, \"zoom\": 60}\n */\n Axes.prototype.setBy = function (pos, duration) {\n if (duration === void 0) { duration = 0; }\n this.am.setBy(pos, duration);\n return this;\n };\n /**\n * Returns whether there is a coordinate in the bounce area of the target axis.\n * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다\n * @method eg.Axes#isBounceArea\n * @param {Object} [axes] The names of the axis 축 이름들\n * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"xOther\": {\n * range: [-100, 100]\n * },\n * \t \"zoom\": {\n * range: [50, 30]\n * }\n * });\n *\n * axes.isBounceArea([\"x\"]);\n * axes.isBounceArea([\"x\", \"zoom\"]);\n * axes.isBounceArea();\n */\n Axes.prototype.isBounceArea = function (axes) {\n return this.axm.isOutside(axes);\n };\n /**\n * Destroys properties, and events used in a module and disconnect all connections to inputTypes.\n * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다.\n * @method eg.Axes#destroy\n */\n Axes.prototype.destroy = function () {\n this.disconnect();\n this.em.destroy();\n };\n Axes.VERSION = \"2.2.0\";\n /**\n * @name eg.Axes.TRANSFORM\n * @desc Returns the transform attribute with CSS vendor prefixes.\n * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다.\n *\n * @constant\n * @type {String}\n * @example\n * eg.Axes.TRANSFORM; // \"transform\" or \"webkitTransform\"\n */\n Axes.TRANSFORM = const_1.TRANSFORM;\n /**\n * @name eg.Axes.DIRECTION_NONE\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_NONE = const_1.DIRECTION.DIRECTION_NONE;\n /**\n * @name eg.Axes.DIRECTION_LEFT\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_LEFT = const_1.DIRECTION.DIRECTION_LEFT;\n /**\n * @name eg.Axes.DIRECTION_RIGHT\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_RIGHT = const_1.DIRECTION.DIRECTION_RIGHT;\n /**\n * @name eg.Axes.DIRECTION_UP\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_UP = const_1.DIRECTION.DIRECTION_UP;\n /**\n * @name eg.Axes.DIRECTION_DOWN\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_DOWN = const_1.DIRECTION.DIRECTION_DOWN;\n /**\n * @name eg.Axes.DIRECTION_HORIZONTAL\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_HORIZONTAL = const_1.DIRECTION.DIRECTION_HORIZONTAL;\n /**\n * @name eg.Axes.DIRECTION_VERTICAL\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_VERTICAL = const_1.DIRECTION.DIRECTION_VERTICAL;\n /**\n * @name eg.Axes.DIRECTION_ALL\n * @constant\n * @type {Number}\n */\n Axes.DIRECTION_ALL = const_1.DIRECTION.DIRECTION_ALL;\n return Axes;\n}(Component));\nexports[\"default\"] = Axes;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/Axes.js\n// module id = 12\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar Coordinate_1 = require(\"./Coordinate\");\nvar AxisManager_1 = require(\"./AxisManager\");\nvar utils_1 = require(\"./utils\");\nvar AnimationManager = /** @class */ (function () {\n function AnimationManager(_a) {\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm;\n this.options = options;\n this.itm = itm;\n this.em = em;\n this.axm = axm;\n this.animationEnd = this.animationEnd.bind(this);\n }\n AnimationManager.getDuration = function (duration, min, max) {\n return Math.max(Math.min(duration, max), min);\n };\n AnimationManager.prototype.getDuration = function (depaPos, destPos, wishDuration) {\n var _this = this;\n var duration;\n if (typeof wishDuration !== \"undefined\") {\n duration = wishDuration;\n }\n else {\n var durations_1 = this.axm.map(destPos, function (v, k) { return Coordinate_1[\"default\"].getDuration(Math.abs(Math.abs(v) - Math.abs(depaPos[k])), _this.options.deceleration); });\n duration = Object.keys(durations_1).reduce(function (max, v) { return Math.max(max, durations_1[v]); }, -Infinity);\n }\n return AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration);\n };\n AnimationManager.prototype.createAnimationParam = function (pos, duration, option) {\n var depaPos = this.axm.get();\n var destPos = pos;\n var inputEvent = option && option.event || null;\n return {\n depaPos: depaPos,\n destPos: destPos,\n duration: AnimationManager.getDuration(duration, this.options.minimumDuration, this.options.maximumDuration),\n delta: this.axm.getDelta(depaPos, destPos),\n inputEvent: inputEvent,\n input: option && option.input || null,\n isTrusted: !!inputEvent,\n done: this.animationEnd\n };\n };\n AnimationManager.prototype.grab = function (axes, option) {\n if (this._animateParam && axes.length) {\n var orgPos_1 = this.axm.get(axes);\n var pos = this.axm.map(orgPos_1, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\n if (!this.axm.every(pos, function (v, k) { return orgPos_1[k] === v; })) {\n this.em.triggerChange(pos, option, !!option);\n }\n this._animateParam = null;\n this._raf && utils_1.cancelAnimationFrame(this._raf);\n this._raf = null;\n this.em.triggerAnimationEnd(!!(option && option.event));\n }\n };\n AnimationManager.prototype.getEventInfo = function () {\n if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) {\n return {\n input: this._animateParam.input,\n event: this._animateParam.inputEvent\n };\n }\n else {\n return null;\n }\n };\n AnimationManager.prototype.restore = function (option) {\n var pos = this.axm.get();\n var destPos = this.axm.map(pos, function (v, k, opt) { return Math.min(opt.range[1], Math.max(opt.range[0], v)); });\n this.animateTo(destPos, this.getDuration(pos, destPos), option);\n };\n AnimationManager.prototype.animationEnd = function () {\n var beforeParam = this.getEventInfo();\n this._animateParam = null;\n // for Circular\n var circularTargets = this.axm.filter(this.axm.get(), function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); });\n Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); }));\n this.itm.setInterrupt(false);\n this.em.triggerAnimationEnd(!!beforeParam);\n if (this.axm.isOutside()) {\n this.restore(beforeParam);\n }\n else {\n this.em.triggerFinish(!!beforeParam);\n }\n };\n AnimationManager.prototype.animateLoop = function (param, complete) {\n this._animateParam = __assign({}, param);\n this._animateParam.startTime = new Date().getTime();\n if (param.duration) {\n var info_1 = this._animateParam;\n var self_1 = this;\n (function loop() {\n self_1._raf = null;\n if (self_1.frame(info_1) >= 1) {\n if (!AxisManager_1.AxisManager.equal(param.destPos, self_1.axm.get(Object.keys(param.destPos)))) {\n self_1.em.triggerChange(param.destPos);\n }\n complete();\n return;\n } // animationEnd\n self_1._raf = utils_1.requestAnimationFrame(loop);\n })();\n }\n else {\n this.em.triggerChange(param.destPos);\n complete();\n }\n };\n AnimationManager.prototype.getUserControll = function (param) {\n var userWish = param.setTo();\n userWish.destPos = this.axm.get(userWish.destPos);\n userWish.duration = AnimationManager.getDuration(userWish.duration, this.options.minimumDuration, this.options.maximumDuration);\n return userWish;\n };\n AnimationManager.prototype.animateTo = function (destPos, duration, option) {\n var _this = this;\n var param = this.createAnimationParam(destPos, duration, option);\n var depaPos = __assign({}, param.depaPos);\n var retTrigger = this.em.triggerAnimationStart(param);\n // to control\n var userWish = this.getUserControll(param);\n // You can't stop the 'animationStart' event when 'circular' is true.\n if (!retTrigger && this.axm.every(userWish.destPos, function (v, k, opt) { return Coordinate_1[\"default\"].isCircularable(v, opt.range, opt.circular); })) {\n console.warn(\"You can't stop the 'animation' event when 'circular' is true.\");\n }\n if (retTrigger && !AxisManager_1.AxisManager.equal(userWish.destPos, depaPos)) {\n var inputEvent = option && option.event || null;\n this.animateLoop({\n depaPos: depaPos,\n destPos: userWish.destPos,\n duration: userWish.duration,\n delta: this.axm.getDelta(depaPos, userWish.destPos),\n isTrusted: !!inputEvent,\n inputEvent: inputEvent,\n input: option && option.input || null\n }, function () { return _this.animationEnd(); });\n }\n };\n // animation frame (0~1)\n AnimationManager.prototype.frame = function (param) {\n var curTime = new Date().getTime() - param.startTime;\n var easingPer = this.easing(curTime / param.duration);\n var toPos = param.depaPos;\n toPos = this.axm.map(toPos, function (v, k, opt) {\n v += param.delta[k] * easingPer;\n return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\n });\n this.em.triggerChange(toPos);\n return easingPer;\n };\n AnimationManager.prototype.easing = function (p) {\n return p > 1 ? 1 : this.options.easing(p);\n };\n AnimationManager.prototype.setTo = function (pos, duration) {\n if (duration === void 0) { duration = 0; }\n var axes = Object.keys(pos);\n this.grab(axes);\n var orgPos = this.axm.get(axes);\n if (AxisManager_1.AxisManager.equal(pos, orgPos)) {\n return this;\n }\n this.itm.setInterrupt(true);\n var movedPos = this.axm.filter(pos, function (v, k) { return orgPos[k] !== v; });\n if (!Object.keys(movedPos).length) {\n return this;\n }\n movedPos = this.axm.map(movedPos, function (v, k, opt) {\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\n return duration > 0 ? v : Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular);\n }\n else {\n return Coordinate_1[\"default\"].getInsidePosition(v, opt.range, opt.circular);\n }\n });\n if (AxisManager_1.AxisManager.equal(movedPos, orgPos)) {\n return this;\n }\n if (duration > 0) {\n this.animateTo(movedPos, duration);\n }\n else {\n this.em.triggerChange(movedPos);\n this.itm.setInterrupt(false);\n }\n return this;\n };\n AnimationManager.prototype.setBy = function (pos, duration) {\n if (duration === void 0) { duration = 0; }\n return this.setTo(this.axm.map(this.axm.get(Object.keys(pos)), function (v, k) { return v + pos[k]; }), duration);\n };\n return AnimationManager;\n}());\nexports.AnimationManager = AnimationManager;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/AnimationManager.js\n// module id = 13\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar EventManager = /** @class */ (function () {\n function EventManager(axes) {\n this.axes = axes;\n }\n /**\n * This event is fired when a user holds an element on the screen of the device.\n * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트\n * @name eg.Axes#hold\n * @event\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Object.} pos coordinate 좌표 정보\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"hold\", function(event) {\n * // event.pos\n * // event.input\n * // event.inputEvent\n * // isTrusted\n * });\n */\n EventManager.prototype.triggerHold = function (pos, option) {\n this.axes.trigger(\"hold\", {\n pos: pos,\n input: option.input || null,\n inputEvent: option.event || null,\n isTrusted: true\n });\n };\n /** Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true.\n * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다\n * @name set\n * @function\n * @param {Object.} pos The coordinate to move to 이동할 좌표\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"change\", function(event) {\n * event.holding && event.set({x: 10});\n * });\n */\n /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events.\n * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다.\n * @name setTo\n * @function\n * @param {Object.} pos The coordinate to move to 이동할 좌표\n * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms)\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"animationStart\", function(event) {\n * event.setTo({x: 10}, 2000);\n * });\n */\n /**\n * This event is fired when a user release an element on the screen of the device.\n * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트\n * @name eg.Axes#release\n * @event\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 \n * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\n * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"release\", function(event) {\n * // event.depaPos\n * // event.destPos\n * // event.delta\n * // event.input\n * // event.inputEvent\n * // event.setTo\n * // event.isTrusted\n *\n * // if you want to change the animation coordinates to move after the 'release' event.\n * event.setTo({x: 10}, 2000);\n * });\n */\n EventManager.prototype.triggerRelease = function (param) {\n param.setTo = this.createUserControll(param.destPos, param.duration);\n this.axes.trigger(\"release\", param);\n };\n /**\n * This event is fired when coordinate changes.\n * @ko 좌표가 변경됐을 때 발생하는 이벤트\n * @name eg.Axes#change\n * @event\n * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Object.} pos The coordinate 좌표\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\n * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\n * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\n * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다.\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"change\", function(event) {\n * // event.pos\n * // event.delta\n * // event.input\n * // event.inputEvent\n * // event.holding\n * // event.set\n * // event.isTrusted\n *\n * // if you want to change the coordinates to move after the 'change' event.\n * // it works when the holding value of the change event is true.\n * event.holding && event.set({x: 10});\n * });\n */\n EventManager.prototype.triggerChange = function (pos, option, holding) {\n if (option === void 0) { option = null; }\n if (holding === void 0) { holding = false; }\n var eventInfo = this.am.getEventInfo();\n var moveTo = this.am.axm.moveTo(pos);\n var inputEvent = option && option.event || eventInfo && eventInfo.event || null;\n var param = {\n pos: moveTo.pos,\n delta: moveTo.delta,\n holding: holding,\n inputEvent: inputEvent,\n isTrusted: !!inputEvent,\n input: option && option.input || eventInfo && eventInfo.input || null,\n set: inputEvent ? this.createUserControll(moveTo.pos) : function () { }\n };\n this.axes.trigger(\"change\", param);\n inputEvent && this.am.axm.set(param.set()[\"destPos\"]);\n };\n /**\n * This event is fired when animation starts.\n * @ko 에니메이션이 시작할 때 발생한다.\n * @name eg.Axes#animationStart\n * @event\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 \n * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다\n * @property {Object.} delta The movement variation of coordinate 좌표의 변화량\n * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다.\n * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다.\n * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체\n * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"release\", function(event) {\n * // event.depaPos\n * // event.destPos\n * // event.delta\n * // event.input\n * // event.inputEvent\n * // event.setTo\n * // event.isTrusted\n *\n * // if you want to change the animation coordinates to move after the 'animationStart' event.\n * event.setTo({x: 10}, 2000);\n * });\n */\n EventManager.prototype.triggerAnimationStart = function (param) {\n param.setTo = this.createUserControll(param.destPos, param.duration);\n return this.axes.trigger(\"animationStart\", param);\n };\n /**\n * This event is fired when animation ends.\n * @ko 에니메이션이 끝났을 때 발생한다.\n * @name eg.Axes#animationEnd\n * @event\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"animationEnd\", function(event) {\n * // event.isTrusted\n * });\n */\n EventManager.prototype.triggerAnimationEnd = function (isTrusted) {\n if (isTrusted === void 0) { isTrusted = false; }\n this.axes.trigger(\"animationEnd\", {\n isTrusted: isTrusted\n });\n };\n /**\n * This event is fired when all actions have been completed.\n * @ko 에니메이션이 끝났을 때 발생한다.\n * @name eg.Axes#finish\n * @event\n * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체\n * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다.\n *\n * @example\n * const axes = new eg.Axes({\n * \"x\": {\n * range: [0, 100]\n * },\n * \"zoom\": {\n * range: [50, 30]\n * }\n * }).on(\"finish\", function(event) {\n * // event.isTrusted\n * });\n */\n EventManager.prototype.triggerFinish = function (isTrusted) {\n if (isTrusted === void 0) { isTrusted = false; }\n this.axes.trigger(\"finish\", {\n isTrusted: isTrusted\n });\n };\n EventManager.prototype.createUserControll = function (pos, duration) {\n if (duration === void 0) { duration = 0; }\n // to controll\n var userControl = {\n destPos: __assign({}, pos),\n duration: duration\n };\n return function (toPos, userDuration) {\n toPos && (userControl.destPos = __assign({}, toPos));\n (userDuration !== undefined) && (userControl.duration = userDuration);\n return userControl;\n };\n };\n EventManager.prototype.setAnimationManager = function (am) {\n this.am = am;\n };\n EventManager.prototype.destroy = function () {\n this.axes.off();\n };\n return EventManager;\n}());\nexports.EventManager = EventManager;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/EventManager.js\n// module id = 14\n// module chunks = 0 1","\"use strict\";\nexports.__esModule = true;\nvar InterruptManager = /** @class */ (function () {\n function InterruptManager(options) {\n this.options = options;\n this._prevented = false; // check whether the animation event was prevented\n }\n InterruptManager.prototype.isInterrupting = function () {\n // when interruptable is 'true', return value is always 'true'.\n return this.options.interruptable || this._prevented;\n };\n InterruptManager.prototype.isInterrupted = function () {\n return !this.options.interruptable && this._prevented;\n };\n InterruptManager.prototype.setInterrupt = function (prevented) {\n !this.options.interruptable && (this._prevented = prevented);\n };\n return InterruptManager;\n}());\nexports.InterruptManager = InterruptManager;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/InterruptManager.js\n// module id = 15\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar AxisManager_1 = require(\"./AxisManager\");\nvar Coordinate_1 = require(\"./Coordinate\");\nvar InputObserver = /** @class */ (function () {\n function InputObserver(_a) {\n var options = _a.options, itm = _a.itm, em = _a.em, axm = _a.axm, am = _a.am;\n this.isOutside = false;\n this.moveDistance = null;\n this.options = options;\n this.itm = itm;\n this.em = em;\n this.axm = axm;\n this.am = am;\n }\n // when move pointer is held in outside\n InputObserver.prototype.atOutside = function (pos) {\n var _this = this;\n if (this.isOutside) {\n return this.axm.map(pos, function (v, k, opt) {\n var tn = opt.range[0] - opt.bounce[0];\n var tx = opt.range[1] + opt.bounce[1];\n return v > tx ? tx : (v < tn ? tn : v);\n });\n }\n else {\n // when start pointer is held in inside\n // get a initialization slope value to prevent smooth animation.\n var initSlope_1 = this.am.easing(0.00001) / 0.00001;\n return this.axm.map(pos, function (v, k, opt) {\n var min = opt.range[0];\n var max = opt.range[1];\n var out = opt.bounce;\n if (v < min) {\n return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0];\n }\n else if (v > max) {\n return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1];\n }\n return v;\n });\n }\n };\n InputObserver.prototype.get = function (input) {\n return this.axm.get(input.axes);\n };\n InputObserver.prototype.hold = function (input, event) {\n if (this.itm.isInterrupted() || !input.axes.length) {\n return;\n }\n var changeOption = {\n input: input,\n event: event\n };\n this.itm.setInterrupt(true);\n this.am.grab(input.axes, changeOption);\n !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption);\n this.isOutside = this.axm.isOutside(input.axes);\n this.moveDistance = this.axm.get(input.axes);\n };\n InputObserver.prototype.change = function (input, event, offset) {\n if (!this.itm.isInterrupting() || this.axm.every(offset, function (v) { return v === 0; })) {\n return;\n }\n var depaPos = this.axm.get(input.axes);\n var destPos;\n // for outside logic\n destPos = this.axm.map(this.moveDistance || depaPos, function (v, k) { return v + (offset[k] || 0); });\n this.moveDistance && (this.moveDistance = destPos);\n destPos = this.axm.map(destPos, function (v, k, opt) { return Coordinate_1[\"default\"].getCirculatedPos(v, opt.range, opt.circular); });\n // from outside to inside\n if (this.isOutside &&\n this.axm.every(depaPos, function (v, k, opt) { return !Coordinate_1[\"default\"].isOutside(v, opt.range); })) {\n this.isOutside = false;\n }\n destPos = this.atOutside(destPos);\n this.em.triggerChange(destPos, {\n input: input,\n event: event\n }, true);\n };\n InputObserver.prototype.release = function (input, event, offset, inputDuration) {\n if (!this.itm.isInterrupting()) {\n return;\n }\n if (!this.moveDistance) {\n return;\n }\n var pos = this.axm.get(input.axes);\n var depaPos = this.axm.get();\n var destPos = this.axm.get(this.axm.map(offset, function (v, k, opt) {\n if (opt.circular && (opt.circular[0] || opt.circular[1])) {\n return pos[k] + v;\n }\n else {\n return Coordinate_1[\"default\"].getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce);\n }\n }));\n var duration = this.am.getDuration(destPos, pos, inputDuration);\n if (duration === 0) {\n destPos = __assign({}, depaPos);\n }\n // prepare params\n var param = {\n depaPos: depaPos,\n destPos: destPos,\n duration: duration,\n delta: this.axm.getDelta(depaPos, destPos),\n inputEvent: event,\n input: input,\n isTrusted: true\n };\n this.em.triggerRelease(param);\n this.moveDistance = null;\n // to contol\n var userWish = this.am.getUserControll(param);\n var isEqual = AxisManager_1.AxisManager.equal(userWish.destPos, depaPos);\n var changeOption = {\n input: input,\n event: event\n };\n if (isEqual || userWish.duration === 0) {\n !isEqual && this.em.triggerChange(userWish.destPos, changeOption, true);\n this.itm.setInterrupt(false);\n if (this.axm.isOutside()) {\n this.am.restore(changeOption);\n }\n else {\n this.em.triggerFinish(true);\n }\n }\n else {\n this.am.animateTo(userWish.destPos, userWish.duration, changeOption);\n }\n };\n return InputObserver;\n}());\nexports.InputObserver = InputObserver;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/InputObserver.js\n// module id = 16\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar Hammer = require(\"hammerjs\");\nvar const_1 = require(\"../const\");\nvar utils_1 = require(\"../utils\");\nvar InputType_1 = require(\"./InputType\");\n/**\n * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module.\n * @ko eg.Axes.PanInput 모듈의 옵션 객체\n * @property {String[]} [inputType=[\"touch\",\"mouse\", \"pointer\"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스\n * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\n * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율\n * @property {Number} [scale.1=1] vertical axis scale 수직축 배율\n * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90)\n * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\n**/\n/**\n * @class eg.Axes.PanInput\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes.\n * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다.\n *\n * @example\n * const pan = new eg.Axes.PanInput(\"#area\", {\n * \t\tinputType: [\"touch\"],\n * \t\tscale: [1, 1.3],\n * });\n *\n * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\n * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\n * axes.connect([\"something2\", \"somethingN\"], pan); // or axes.connect(\"something2 somethingN\", pan);\n *\n * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved.\n * axes.connect([\"something1\"], pan); // or axes.connect(\"something1\", pan);\n *\n * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved.\n * axes.connect([\"\", \"something2\"], pan); // or axes.connect(\" something2\", pan);\n *\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트\n * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체\n */\nvar PanInput = /** @class */ (function () {\n function PanInput(el, options) {\n this.axes = [];\n this.hammer = null;\n this.element = null;\n /**\n * Hammer helps you add support for touch gestures to your page\n *\n * @external Hammer\n * @see {@link http://hammerjs.github.io|Hammer.JS}\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\n */\n if (typeof Hammer === \"undefined\") {\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PanInput.\\nhttp://hammerjs.github.io/\");\n }\n this.element = utils_1.$(el);\n this.options = __assign({\n inputType: [\"touch\", \"mouse\", \"pointer\"],\n scale: [1, 1],\n thresholdAngle: 45,\n threshold: 0,\n hammerManagerOptions: {\n // css properties were removed due to usablility issue\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\n cssProps: {\n userSelect: \"none\",\n touchSelect: \"none\",\n touchCallout: \"none\",\n userDrag: \"none\"\n }\n }\n }, options);\n this.onHammerInput = this.onHammerInput.bind(this);\n this.onPanmove = this.onPanmove.bind(this);\n this.onPanend = this.onPanend.bind(this);\n }\n // get user's direction\n PanInput.getDirectionByAngle = function (angle, thresholdAngle) {\n if (thresholdAngle < 0 || thresholdAngle > 90) {\n return const_1.DIRECTION.DIRECTION_NONE;\n }\n var toAngle = Math.abs(angle);\n return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ?\n const_1.DIRECTION.DIRECTION_VERTICAL : const_1.DIRECTION.DIRECTION_HORIZONTAL;\n };\n PanInput.getNextOffset = function (speeds, deceleration) {\n var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]);\n var duration = Math.abs(normalSpeed / -deceleration);\n return [\n speeds[0] / 2 * duration,\n speeds[1] / 2 * duration\n ];\n };\n PanInput.useDirection = function (checkType, direction, userDirection) {\n if (userDirection) {\n return !!((direction === const_1.DIRECTION.DIRECTION_ALL) ||\n ((direction & checkType) && (userDirection & checkType)));\n }\n else {\n return !!(direction & checkType);\n }\n };\n PanInput.prototype.mapAxes = function (axes) {\n var useHorizontal = !!axes[0];\n var useVertical = !!axes[1];\n if (useHorizontal && useVertical) {\n this._direction = const_1.DIRECTION.DIRECTION_ALL;\n }\n else if (useHorizontal) {\n this._direction = const_1.DIRECTION.DIRECTION_HORIZONTAL;\n }\n else if (useVertical) {\n this._direction = const_1.DIRECTION.DIRECTION_VERTICAL;\n }\n else {\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\n }\n this.axes = axes;\n };\n PanInput.prototype.connect = function (observer) {\n var hammerOption = {\n direction: this._direction,\n threshold: this.options.threshold\n };\n if (this.hammer) {\n this.dettachEvent();\n // hammer remove previous PanRecognizer.\n this.hammer.add(new Hammer.Pan(hammerOption));\n }\n else {\n var keyValue = this.element[InputType_1.UNIQUEKEY];\n if (keyValue) {\n this.hammer && this.hammer.destroy();\n }\n else {\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\n }\n var inputClass = InputType_1.convertInputType(this.options.inputType);\n if (!inputClass) {\n throw new Error(\"Wrong inputType parameter!\");\n }\n this.hammer = InputType_1.createHammer(this.element, __assign({\n recognizers: [\n [Hammer.Pan, hammerOption],\n ],\n inputClass: inputClass\n }, this.options.hammerManagerOptions));\n this.element[InputType_1.UNIQUEKEY] = keyValue;\n }\n this.attachEvent(observer);\n return this;\n };\n PanInput.prototype.disconnect = function () {\n if (this.hammer) {\n this.dettachEvent();\n }\n this._direction = const_1.DIRECTION.DIRECTION_NONE;\n return this;\n };\n /**\n * Destroys elements, properties, and events used in a module.\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\n * @method eg.Axes.PanInput#destroy\n */\n PanInput.prototype.destroy = function () {\n this.disconnect();\n if (this.hammer) {\n this.hammer.destroy();\n }\n delete this.element[InputType_1.UNIQUEKEY];\n this.element = null;\n this.hammer = null;\n };\n /**\n * Enables input devices\n * @ko 입력 장치를 사용할 수 있게 한다\n * @method eg.Axes.PanInput#enable\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n PanInput.prototype.enable = function () {\n this.hammer && (this.hammer.get(\"pan\").options.enable = true);\n return this;\n };\n /**\n * Disables input devices\n * @ko 입력 장치를 사용할 수 없게 한다.\n * @method eg.Axes.PanInput#disable\n * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n PanInput.prototype.disable = function () {\n this.hammer && (this.hammer.get(\"pan\").options.enable = false);\n return this;\n };\n /**\n * Returns whether to use an input device\n * @ko 입력 장치를 사용 여부를 반환한다.\n * @method eg.Axes.PanInput#isEnable\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\n */\n PanInput.prototype.isEnable = function () {\n return !!(this.hammer && this.hammer.get(\"pan\").options.enable);\n };\n PanInput.prototype.onHammerInput = function (event) {\n if (this.isEnable()) {\n if (event.isFirst) {\n this.observer.hold(this, event);\n }\n else if (event.isFinal) {\n this.onPanend(event);\n }\n }\n };\n PanInput.prototype.onPanmove = function (event) {\n var userDirection = PanInput.getDirectionByAngle(event.angle, this.options.thresholdAngle);\n // not support offset properties in Hammerjs - start\n var prevInput = this.hammer.session.prevInput;\n /* eslint-disable no-param-reassign */\n if (prevInput) {\n event.offsetX = event.deltaX - prevInput.deltaX;\n event.offsetY = event.deltaY - prevInput.deltaY;\n }\n else {\n event.offsetX = 0;\n event.offsetY = 0;\n }\n var offset = this.getOffset([event.offsetX, event.offsetY], [\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction, userDirection),\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction, userDirection)\n ]);\n var prevent = offset.some(function (v) { return v !== 0; });\n if (prevent) {\n event.srcEvent.preventDefault();\n event.srcEvent.stopPropagation();\n }\n event.preventSystemEvent = prevent;\n prevent && this.observer.change(this, event, InputType_1.toAxis(this.axes, offset));\n };\n PanInput.prototype.onPanend = function (event) {\n var offset = this.getOffset([\n Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1),\n Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)\n ], [\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_HORIZONTAL, this._direction),\n PanInput.useDirection(const_1.DIRECTION.DIRECTION_VERTICAL, this._direction)\n ]);\n offset = PanInput.getNextOffset(offset, this.observer.options.deceleration);\n this.observer.release(this, event, InputType_1.toAxis(this.axes, offset));\n };\n PanInput.prototype.attachEvent = function (observer) {\n this.observer = observer;\n this.hammer.on(\"hammer.input\", this.onHammerInput)\n .on(\"panstart panmove\", this.onPanmove);\n };\n PanInput.prototype.dettachEvent = function () {\n this.hammer.off(\"hammer.input\", this.onHammerInput)\n .off(\"panstart panmove\", this.onPanmove);\n this.observer = null;\n };\n PanInput.prototype.getOffset = function (properties, useDirection) {\n var offset = [0, 0];\n var scale = this.options.scale;\n if (useDirection[0]) {\n offset[0] = (properties[0] * scale[0]);\n }\n if (useDirection[1]) {\n offset[1] = (properties[1] * scale[1]);\n }\n return offset;\n };\n return PanInput;\n}());\nexports.PanInput = PanInput;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/inputType/PanInput.js\n// module id = 17\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar Hammer = require(\"hammerjs\");\nvar utils_1 = require(\"../utils\");\nvar InputType_1 = require(\"./InputType\");\n/**\n * @typedef {Object} PinchInputOption The option object of the eg.Axes.PinchInput module\n * @ko eg.Axes.PinchInput 모듈의 옵션 객체\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\n * @property {Number} [threshold=0] Minimal scale before recognizing 사용자의 Pinch 동작을 인식하기 위해산 최소한의 배율\n * @property {Object} [hammerManagerOptions={cssProps: {userSelect: \"none\",touchSelect: \"none\",touchCallout: \"none\",userDrag: \"none\"}] Options of Hammer.Manager Hammer.Manager의 옵션\n**/\n/**\n * @class eg.Axes.PinchInput\n * @classdesc A module that passes the amount of change to eg.Axes when two pointers are moving toward (zoom-in) or away from each other (zoom-out). use one axis.\n * @ko 2개의 pointer를 이용하여 zoom-in하거나 zoom-out 하는 동작의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\n * @example\n * const pinch = new eg.Axes.PinchInput(\"#area\", {\n * \t\tscale: 1\n * });\n *\n * // Connect 'something' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * axes.connect(\"something\", pinch);\n *\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PinchInput module eg.Axes.PinchInput 모듈을 사용할 엘리먼트\n * @param {PinchInputOption} [options] The option object of the eg.Axes.PinchInput moduleeg.Axes.PinchInput 모듈의 옵션 객체\n */\nvar PinchInput = /** @class */ (function () {\n function PinchInput(el, options) {\n this.axes = [];\n this.hammer = null;\n this.element = null;\n this._base = null;\n this._prev = null;\n /**\n * Hammer helps you add support for touch gestures to your page\n *\n * @external Hammer\n * @see {@link http://hammerjs.github.io|Hammer.JS}\n * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents}\n * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS\n */\n if (typeof Hammer === \"undefined\") {\n throw new Error(\"The Hammerjs must be loaded before eg.Axes.PinchInput.\\nhttp://hammerjs.github.io/\");\n }\n this.element = utils_1.$(el);\n this.options = __assign({\n scale: 1,\n threshold: 0,\n hammerManagerOptions: {\n // css properties were removed due to usablility issue\n // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html\n cssProps: {\n userSelect: \"none\",\n touchSelect: \"none\",\n touchCallout: \"none\",\n userDrag: \"none\"\n }\n }\n }, options);\n this.onPinchStart = this.onPinchStart.bind(this);\n this.onPinchMove = this.onPinchMove.bind(this);\n this.onPinchEnd = this.onPinchEnd.bind(this);\n }\n PinchInput.prototype.mapAxes = function (axes) {\n this.axes = axes;\n };\n PinchInput.prototype.connect = function (observer) {\n var hammerOption = {\n threshold: this.options.threshold\n };\n if (this.hammer) {\n this.dettachEvent();\n // hammer remove previous PinchRecognizer.\n this.hammer.add(new Hammer.Pinch(hammerOption));\n }\n else {\n var keyValue = this.element[InputType_1.UNIQUEKEY];\n if (keyValue) {\n this.hammer.destroy();\n }\n else {\n keyValue = String(Math.round(Math.random() * new Date().getTime()));\n }\n this.hammer = InputType_1.createHammer(this.element, __assign({\n recognizers: [\n [Hammer.Pinch, hammerOption],\n ],\n inputClass: Hammer.TouchInput\n }, this.options.hammerManagerOptions));\n this.element[InputType_1.UNIQUEKEY] = keyValue;\n }\n this.attachEvent(observer);\n return this;\n };\n PinchInput.prototype.disconnect = function () {\n if (this.hammer) {\n this.dettachEvent();\n }\n return this;\n };\n /**\n * Destroys elements, properties, and events used in a module.\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\n * @method eg.Axes.PinchInput#destroy\n */\n PinchInput.prototype.destroy = function () {\n this.disconnect();\n if (this.hammer) {\n this.hammer.destroy();\n }\n delete this.element[InputType_1.UNIQUEKEY];\n this.element = null;\n this.hammer = null;\n };\n PinchInput.prototype.onPinchStart = function (event) {\n this._base = this.observer.get(this)[this.axes[0]];\n var offset = this.getOffset(event.scale);\n this.observer.hold(this, event);\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\n this._prev = event.scale;\n };\n PinchInput.prototype.onPinchMove = function (event) {\n var offset = this.getOffset(event.scale, this._prev);\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\n this._prev = event.scale;\n };\n PinchInput.prototype.onPinchEnd = function (event) {\n var offset = this.getOffset(event.scale, this._prev);\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\n this.observer.release(this, event, InputType_1.toAxis(this.axes, [0]), 0);\n this._base = null;\n this._prev = null;\n };\n PinchInput.prototype.getOffset = function (pinchScale, prev) {\n if (prev === void 0) { prev = 1; }\n return this._base * (pinchScale - prev) * this.options.scale;\n };\n PinchInput.prototype.attachEvent = function (observer) {\n this.observer = observer;\n this.hammer.on(\"pinchstart\", this.onPinchStart)\n .on(\"pinchmove\", this.onPinchMove)\n .on(\"pinchend\", this.onPinchEnd);\n };\n PinchInput.prototype.dettachEvent = function () {\n this.hammer.off(\"pinchstart\", this.onPinchStart)\n .off(\"pinchmove\", this.onPinchMove)\n .off(\"pinchend\", this.onPinchEnd);\n this.observer = null;\n this._prev = null;\n };\n /**\n * Enables input devices\n * @ko 입력 장치를 사용할 수 있게 한다\n * @method eg.Axes.PinchInput#enable\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n PinchInput.prototype.enable = function () {\n this.hammer && (this.hammer.get(\"pinch\").options.enable = true);\n return this;\n };\n /**\n * Disables input devices\n * @ko 입력 장치를 사용할 수 없게 한다.\n * @method eg.Axes.PinchInput#disable\n * @return {eg.Axes.PinchInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n PinchInput.prototype.disable = function () {\n this.hammer && (this.hammer.get(\"pinch\").options.enable = false);\n return this;\n };\n /**\n * Returns whether to use an input device\n * @ko 입력 장치를 사용 여부를 반환한다.\n * @method eg.Axes.PinchInput#isEnable\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\n */\n PinchInput.prototype.isEnable = function () {\n return !!(this.hammer && this.hammer.get(\"pinch\").options.enable);\n };\n return PinchInput;\n}());\nexports.PinchInput = PinchInput;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/inputType/PinchInput.js\n// module id = 18\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar utils_1 = require(\"../utils\");\nvar InputType_1 = require(\"./InputType\");\n/**\n * @typedef {Object} WheelInputOption The option object of the eg.Axes.WheelInput module\n * @ko eg.Axes.WheelInput 모듈의 옵션 객체\n * @property {Number} [scale=1] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\n**/\n/**\n * @class eg.Axes.WheelInput\n * @classdesc A module that passes the amount of change to eg.Axes when the mouse wheel is moved. use one axis.\n * @ko 마우스 휠이 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 한 개 의 축을 사용한다.\n *\n * @example\n * const wheel = new eg.Axes.WheelInput(\"#area\", {\n * \t\tscale: 1\n * });\n *\n * // Connect 'something' axis when the mousewheel is moved.\n * axes.connect(\"something\", wheel);\n *\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.WheelInput module eg.Axes.WheelInput 모듈을 사용할 엘리먼트\n * @param {WheelInputOption} [options] The option object of the eg.Axes.WheelInput moduleeg.Axes.WheelInput 모듈의 옵션 객체\n */\nvar WheelInput = /** @class */ (function () {\n function WheelInput(el, options) {\n this.axes = [];\n this.element = null;\n this._isEnabled = false;\n this._isHolded = false;\n this._timer = null;\n this.element = utils_1.$(el);\n this.options = __assign({\n scale: 1,\n useNormalized: true\n }, options);\n this.onWheel = this.onWheel.bind(this);\n }\n WheelInput.prototype.mapAxes = function (axes) {\n this.axes = axes;\n };\n WheelInput.prototype.connect = function (observer) {\n this.dettachEvent();\n this.attachEvent(observer);\n return this;\n };\n WheelInput.prototype.disconnect = function () {\n this.dettachEvent();\n return this;\n };\n /**\n * Destroys elements, properties, and events used in a module.\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\n * @method eg.Axes.WheelInput#destroy\n */\n WheelInput.prototype.destroy = function () {\n this.disconnect();\n this.element = null;\n };\n WheelInput.prototype.onWheel = function (event) {\n var _this = this;\n if (!this._isEnabled) {\n return;\n }\n event.preventDefault();\n if (event.deltaY === 0) {\n return;\n }\n if (!this._isHolded) {\n this.observer.hold(this, event);\n this._isHolded = true;\n }\n var offset = (event.deltaY > 0 ? -1 : 1) * this.options.scale * (this.options.useNormalized ? 1 : Math.abs(event.deltaY));\n this.observer.change(this, event, InputType_1.toAxis(this.axes, [offset]));\n clearTimeout(this._timer);\n var inst = this;\n this._timer = setTimeout(function () {\n if (_this._isHolded) {\n _this._isHolded = false;\n _this.observer.release(_this, event, InputType_1.toAxis(_this.axes, [0]));\n }\n }, 50);\n };\n WheelInput.prototype.attachEvent = function (observer) {\n this.observer = observer;\n this.element.addEventListener(\"wheel\", this.onWheel);\n this._isEnabled = true;\n };\n WheelInput.prototype.dettachEvent = function () {\n this.element.removeEventListener(\"wheel\", this.onWheel);\n this._isEnabled = false;\n this.observer = null;\n };\n /**\n * Enables input devices\n * @ko 입력 장치를 사용할 수 있게 한다\n * @method eg.Axes.WheelInput#enable\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n WheelInput.prototype.enable = function () {\n this._isEnabled = true;\n return this;\n };\n /**\n * Disables input devices\n * @ko 입력 장치를 사용할 수 없게 한다.\n * @method eg.Axes.WheelInput#disable\n * @return {eg.Axes.WheelInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n WheelInput.prototype.disable = function () {\n this._isEnabled = false;\n return this;\n };\n /**\n * Returns whether to use an input device\n * @ko 입력 장치를 사용 여부를 반환한다.\n * @method eg.Axes.WheelInput#isEnable\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\n */\n WheelInput.prototype.isEnable = function () {\n return this._isEnabled;\n };\n return WheelInput;\n}());\nexports.WheelInput = WheelInput;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/inputType/WheelInput.js\n// module id = 19\n// module chunks = 0 1","\"use strict\";\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nexports.__esModule = true;\nvar utils_1 = require(\"../utils\");\nvar InputType_1 = require(\"./InputType\");\nexports.KEYMAP = {\n LEFT_ARROW: 37,\n A: 65,\n UP_ARROW: 38,\n W: 87,\n RIGHT_ARROW: 39,\n D: 68,\n DOWN_ARROW: 40,\n S: 83\n};\nvar DIRECTION_REVERSE = -1;\nvar DIRECTION_FORWARD = 1;\nvar DELAY = 80;\n/**\n * @typedef {Object} MoveKeyInputOption The option object of the eg.Axes.MoveKeyInput module\n * @ko eg.Axes.MoveKeyInput 모듈의 옵션 객체\n * @property {Array} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율\n * @property {Number} [scale[0]=1] Coordinate scale for the first axis첫번째 축의 배율\n * @property {Number} [scale[1]=1] Coordinate scale for the decond axis두번째 축의 배율\n**/\n/**\n * @class eg.Axes.MoveKeyInput\n * @classdesc A module that passes the amount of change to eg.Axes when the move key stroke is occured. use two axis.\n * @ko 이동키 입력이 발생했을 때의 변화량을 eg.Axes에 전달하는 모듈. 두 개 의 축을 사용한다.\n *\n * @example\n * const moveKey = new eg.Axes.MoveKeyInput(\"#area\", {\n * \t\tscale: [1, 1]\n * });\n *\n * // Connect 'x', 'y' axes when the moveKey is pressed.\n * axes.connect([\"x\", \"y\"], moveKey);\n *\n * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.MoveKeyInput module eg.Axes.MoveKeyInput 모듈을 사용할 엘리먼트\n * @param {MoveKeyInputOption} [options] The option object of the eg.Axes.MoveKeyInput moduleeg.Axes.MoveKeyInput 모듈의 옵션 객체\n */\nvar MoveKeyInput = /** @class */ (function () {\n function MoveKeyInput(el, options) {\n this.axes = [];\n this.element = null;\n this._isEnabled = false;\n this._isHolded = false;\n this._timer = null;\n this.element = utils_1.$(el);\n this.options = __assign({\n scale: [1, 1]\n }, options);\n this.onKeydown = this.onKeydown.bind(this);\n this.onKeyup = this.onKeyup.bind(this);\n }\n MoveKeyInput.prototype.mapAxes = function (axes) {\n this.axes = axes;\n };\n MoveKeyInput.prototype.connect = function (observer) {\n this.dettachEvent();\n // add tabindex=\"0\" to the container for making it focusable\n if (this.element.getAttribute(\"tabindex\") !== \"0\") {\n this.element.setAttribute(\"tabindex\", \"0\");\n }\n this.attachEvent(observer);\n return this;\n };\n MoveKeyInput.prototype.disconnect = function () {\n this.dettachEvent();\n return this;\n };\n /**\n * Destroys elements, properties, and events used in a module.\n * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다.\n * @method eg.Axes.MoveKeyInput#destroy\n */\n MoveKeyInput.prototype.destroy = function () {\n this.disconnect();\n this.element = null;\n };\n MoveKeyInput.prototype.onKeydown = function (e) {\n if (!this._isEnabled) {\n return;\n }\n var isMoveKey = true;\n var direction = DIRECTION_FORWARD;\n var offsets;\n switch (e.keyCode) {\n case exports.KEYMAP.LEFT_ARROW:\n case exports.KEYMAP.A:\n direction = DIRECTION_REVERSE;\n case exports.KEYMAP.RIGHT_ARROW:\n case exports.KEYMAP.D:\n if (!this.axes[0]) {\n isMoveKey = false;\n break;\n }\n offsets = [+this.options.scale[0] * direction, 0];\n break;\n case exports.KEYMAP.DOWN_ARROW:\n case exports.KEYMAP.S:\n direction = DIRECTION_REVERSE;\n case exports.KEYMAP.UP_ARROW:\n case exports.KEYMAP.W:\n if (!this.axes[1]) {\n isMoveKey = false;\n break;\n }\n offsets = [0, +this.options.scale[1] * direction];\n break;\n default:\n isMoveKey = false;\n }\n if (!isMoveKey) {\n return;\n }\n if (!this._isHolded) {\n this.observer.hold(this, event);\n this._isHolded = true;\n }\n clearTimeout(this._timer);\n this.observer.change(this, event, InputType_1.toAxis(this.axes, offsets));\n };\n MoveKeyInput.prototype.onKeyup = function (e) {\n var _this = this;\n if (!this._isHolded) {\n return;\n }\n clearTimeout(this._timer);\n this._timer = setTimeout(function () {\n _this.observer.release(_this, e, InputType_1.toAxis(_this.axes, [0, 0]));\n _this._isHolded = false;\n }, DELAY);\n };\n MoveKeyInput.prototype.attachEvent = function (observer) {\n this.observer = observer;\n this.element.addEventListener(\"keydown\", this.onKeydown, false);\n this.element.addEventListener(\"keypress\", this.onKeydown, false);\n this.element.addEventListener(\"keyup\", this.onKeyup, false);\n this._isEnabled = true;\n };\n MoveKeyInput.prototype.dettachEvent = function () {\n this.element.removeEventListener(\"keydown\", this.onKeydown, false);\n this.element.removeEventListener(\"keypress\", this.onKeydown, false);\n this.element.removeEventListener(\"keyup\", this.onKeyup, false);\n this._isEnabled = false;\n this.observer = null;\n };\n /**\n * Enables input devices\n * @ko 입력 장치를 사용할 수 있게 한다\n * @method eg.Axes.MoveKeyInput#enable\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n MoveKeyInput.prototype.enable = function () {\n this._isEnabled = true;\n return this;\n };\n /**\n * Disables input devices\n * @ko 입력 장치를 사용할 수 없게 한다.\n * @method eg.Axes.MoveKeyInput#disable\n * @return {eg.Axes.MoveKeyInput} An instance of a module itself 모듈 자신의 인스턴스\n */\n MoveKeyInput.prototype.disable = function () {\n this._isEnabled = false;\n return this;\n };\n /**\n * Returns whether to use an input device\n * @ko 입력 장치를 사용 여부를 반환한다.\n * @method eg.Axes.MoveKeyInput#isEnable\n * @return {Boolean} Whether to use an input device 입력장치 사용여부\n */\n MoveKeyInput.prototype.isEnable = function () {\n return this._isEnabled;\n };\n return MoveKeyInput;\n}());\nexports.MoveKeyInput = MoveKeyInput;\n;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@egjs/axes/outjs/inputType/MoveKeyInput.js\n// module id = 20\n// module chunks = 0 1","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport {window, document} from \"./browser\";\n\nconst utils = {\n\t/**\n\t * Select or create element\n\t * @param {String|HTMLElement} param\n\t * when string given is as HTML tag, then create element\n\t * otherwise it returns selected elements\n\t * @returns {HTMLElement}\n\t */\n\t$(param) {\n\t\tlet el = null;\n\n\t\tif (typeof param === \"string\") {\n\t\t\t// check if string is HTML tag format\n\t\t\tconst match = param.match(/^<([a-z]+)\\s*([^>]*)>/);\n\n\t\t\t// creating element\n\t\t\tif (match) {\n\t\t\t\tel = document.createElement(match[1]);\n\n\t\t\t\t// attributes\n\t\t\t\tmatch.length === 3 &&\n\t\t\t\t\tmatch[2].split(\" \").forEach(v => {\n\t\t\t\t\t\tconst attr = v.split(\"=\");\n\n\t\t\t\t\t\tel.setAttribute(attr[0], attr[1].trim().replace(/(^[\"']|[\"']$)/g, \"\"));\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tel = document.querySelectorAll(param);\n\n\t\t\t\tif (!el.length) {\n\t\t\t\t\tel = null;\n\t\t\t\t} else if (el.length === 1) {\n\t\t\t\t\tel = el[0];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (param.nodeName && param.nodeType === 1) {\n\t\t\tel = param;\n\t\t}\n\n\t\treturn el;\n\t},\n\n\t/**\n\t * Check if is array\n\t * @param arr\n\t * @returns {Boolean}\n\t */\n\tisArray(arr) {\n\t\treturn arr && arr.constructor === Array;\n\t},\n\n\t/**\n\t * Check if is object\n\t * @param {Object} obj\n\t * @returns {Boolean}\n\t */\n\tisObject(obj) {\n\t\treturn obj && !obj.nodeType && typeof obj === \"object\" && !this.isArray(obj);\n\t},\n\n\t/**\n\t * Merge object returning new object\n\t * @param {Object} target\n\t * @param {Object} objectN\n\t * @returns {Object} merged target object\n\t * @example\n\t * var target = { a: 1 };\n\t * utils.extend(target, { b: 2, c: 3 });\n\t * target; // { a: 1, b: 2, c: 3 };\n\t */\n\textend(target, ...objectN) {\n\t\tif (!objectN.length || (objectN.length === 1 && !objectN[0])) {\n\t\t\treturn target;\n\t\t}\n\n\t\tconst source = objectN.shift();\n\n\t\tif (this.isObject(target) && this.isObject(source)) {\n\t\t\tObject.keys(source).forEach(key => {\n\t\t\t\tconst value = source[key];\n\n\t\t\t\tif (this.isObject(value)) {\n\t\t\t\t\t!target[key] && (target[key] = {});\n\n\t\t\t\t\ttarget[key] = this.extend(target[key], value);\n\t\t\t\t} else {\n\t\t\t\t\ttarget[key] = this.isArray(value) ?\n\t\t\t\t\t\tvalue.concat() : value;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn this.extend(target, ...objectN);\n\t},\n\n\t/**\n\t * Get or set the style value or apply\n\t * @param {HTMLElement} el\n\t * @param {String|Object} style\n\t * String: return style property value\n\t * Object: set style value\n\t * @param {Boolean} getAsNumber Get the value as number\n\t * @returns {String|HTMLElement}\n\t */\n\tcss(el, style, getAsNumber) {\n\t\tif (typeof(style) === \"string\") {\n\t\t\tconst value = window.getComputedStyle(el)[style];\n\n\t\t\treturn getAsNumber ? this.getNumValue(value) : value;\n\t\t} else {\n\t\t\tconst applyStyle = (target, source) =>\n\t\t\t\tObject.keys(source).forEach(v => {\n\t\t\t\t\ttarget[v] = source[v];\n\t\t\t\t});\n\n\t\t\tthis.isArray(el) ?\n\t\t\t\tel.forEach(v => applyStyle(v.style, style)) :\n\t\t\t\tapplyStyle(el.style, style);\n\t\t}\n\n\t\treturn el;\n\t},\n\n\t/**\n\t * classList\n\t * @param {HTMLElement} el target DOM element\n\t * @param {String} className class name string to be handled\n\t * @param {Boolean} add Add or remove class - true: Add, false: Remove\n\t * @return {Boolean} if add param is missing, then return existence of class name\n\t */\n\tclassList(el, className, add) {\n\t\tconst isAddParam = typeof add === \"boolean\";\n\t\tlet res;\n\n\t\tif (el.classList) {\n\t\t\tres = el.classList[\n\t\t\t\t(isAddParam && (add ? \"add\" : \"remove\")) || \"contains\"\n\t\t\t](className);\n\t\t} else {\n\t\t\tres = el.className;\n\n\t\t\tif (isAddParam) {\n\t\t\t\tif (add && res.indexOf(className) === -1) {\n\t\t\t\t\tres = el.className = (`${res} ${className}`).replace(/\\s{2,}/g, \" \");\n\t\t\t\t} else if (!add) {\n\t\t\t\t\tres = el.className = res.replace(className, \"\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tres = new RegExp(`\\\\b${className}\\\\b`).test(res);\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t},\n\n\t/**\n\t * Check and parse value to number\n\t * @param {Number|String} val\n\t * @param {Number} defVal\n\t * @return {Number}\n\t */\n\tgetNumValue(val, defVal) {\n\t\tlet num = val;\n\n\t\treturn isNaN(num = parseInt(num, 10)) ? defVal : num;\n\t},\n\n\t/**\n\t * Return unit formatted value\n\t * @param {Number|String} val\n\t * @return {String} val Value formatted with unit\n\t */\n\tgetUnitValue(val) {\n\t\tconst rx = /(?:[a-z]{2,}|%)$/;\n\n\t\treturn (parseInt(val, 10) || 0) + (String(val).match(rx) || \"px\");\n\t},\n\n\t/**\n\t * Get element's outer value\n\t * @param {HTMLElement} el\n\t * @param {String} type - [outerWidth|outerHeight]\n\t * @returns {Number} outer's value\n\t */\n\tgetOuter(el, type) {\n\t\tconst style = window.getComputedStyle(el);\n\t\tlet paddingMargin = 0;\n\n\t\t(type === \"outerWidth\" ?\n\t\t\t[\"Left\", \"Right\"] :\n\t\t\t[\"Top\", \"Bottom\"]\n\t\t).forEach(dir => {\n\t\t\t[\"padding\", \"margin\"].forEach(v => {\n\t\t\t\tpaddingMargin += this.getNumValue(style[`${v}${dir}`]);\n\t\t\t});\n\t\t});\n\n\t\treturn this.getNumValue(style[type.replace(\"outer\", \"\").toLocaleLowerCase()]) + paddingMargin;\n\t},\n\n\t/**\n\t * Get element's outerWidth value with margin\n\t * @param {HTMLElement} el\n\t * @returns {Number}\n\t */\n\touterWidth(el) {\n\t\treturn this.getOuter(el, \"outerWidth\");\n\t},\n\n\t/**\n\t * Get element's outerHeight value with margin\n\t * @param {HTMLElement} el\n\t * @returns {Number}\n\t */\n\touterHeight(el) {\n\t\treturn this.getOuter(el, \"outerHeight\");\n\t},\n\n\t/**\n\t * Returns the syntax of the translate style which is applied to CSS transition properties.\n\t *\n\t * @ko CSS 트랜지션 속성에 적용할 translate 스타일 구문을 반환한다\n\t * @method eg#translate\n\t * @param {String} x Distance to move along the X axis x축을 따라 이동할 거리\n\t * @param {String} y Distance to move along the Y axis y축을 따라 이동할 거리\n\t * @param {Boolean} [isHA] Force hardware acceleration 하드웨어 가속 사용 여부\n\t * @return {String} Syntax of the translate style translate 스타일 구문\n\t */\n\ttranslate(x, y, isHA) {\n\t\treturn isHA || false ?\n\t\t\t`translate3d(${x},${y},0)` : `translate(${x},${y})`;\n\t},\n\n\t// 1. user press one position on screen.\n\t// 2. user moves to the other position on screen.\n\t// 3. when user releases fingers on screen, 'click' event is fired at previous position.\n\thasClickBug() {\n\t\tconst ua = window.navigator.userAgent;\n\t\tconst result = /Safari/.test(ua);\n\n\t\tthis.hasClickBug = () => result;\n\t\treturn result;\n\t}\n};\n\nclass MixinBuilder {\n\tconstructor(superclass) {\n\t\tthis.superclass = superclass || class {};\n\t}\n\n\twith(...mixins) {\n\t\treturn mixins.reduce((c, m) => m(c), this.superclass);\n\t}\n}\n\nconst Mixin = superclass => new MixinBuilder(superclass);\n\nexport {utils, Mixin};\n\n\n\n// WEBPACK FOOTER //\n// src/utils.js","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n// internal config values\nconst CONFIG = {\n\tpanel: {\n\t\t$list: null, // panel list\n\t\tindex: 0,\t\t\t// dom index used among process\n\t\tno: 0,\t\t\t\t// panel no used among process\n\t\tcurrIndex: 0, // current physical dom index\n\t\tcurrNo: 0, // current logical panel number\n\t\tsize: 0,\t\t\t// panel size\n\t\tcount: 0,\t\t\t// total physical panel count\n\t\torigCount: 0,\t\t// total count of given original panels\n\t\tchanged: false,\t\t// if panel changed\n\t\tanimating: false,\t// current animating status boolean\n\t\tminCount: 3 // minimum panel count\n\t},\n\ttouch: {\n\t\tholdPos: 0, // hold x,y coordinate\n\t\tdestPos: 0,\t // destination x,y coordinate\n\t\tdistance: 0,\t\t// touch distance pixel of start to end touch\n\t\tdirection: null,\t// touch direction\n\t\tlastPos: 0,\t\t\t// to determine move on holding\n\t\tholding: false,\n\t\tisTrusted: false // if event was instantiated by user's action explicitly\n\t},\n\tcustomEvent: { // for custom events value\n\t\tflick: true,\n\t\trestore: false,\n\t\trestoreCall: false\n\t},\n\tdirData: [],\t\t\t// direction constant value according horizontal or vertical\n\tindexToMove: 0,\n\t$dummyAnchor: null // For buggy link highlighting on Android 2.x\n};\n\n\n// default options\nconst OPTIONS = {\n\thwAccelerable: true, // set for hw acceleration (see https://gist.github.com/netil/c1d1b67e1c1926364c0709f110a09b44 for old devices support)\n\tprefix: \"eg-flick\", // prefix value of class name\n\tdeceleration: 0.0006, // deceleration value\n\thorizontal: true, // move direction (true == horizontal, false == vertical)\n\tcircular: false, // circular mode. In this mode at least 3 panels are required.\n\tpreviewPadding: null, // preview padding value in left(up) to right(down) order. In this mode at least 5 panels are required.\n\tbounce: null, // bounce value in left(up) to right(down) order. Works only in non-circular mode.\n\tthreshold: 40, // the distance pixel threshold value for change panel\n\tduration: 100, // duration ms for animation\n\tpanelEffect: x => 1 - Math.pow(1 - x, 3), // easing function for panel change animation\n\tdefaultIndex: 0, // initial panel index to be shown\n\tinputType: [ // input type\n\t\t\"touch\", \"mouse\"\n\t],\n\tthresholdAngle: 45, // the threshold value that determines whether user action is horizontal or vertical (0~90)\n\tadaptiveHeight: false // Set container's height be adaptive according panel's height\n};\n\nexport {\n\tCONFIG,\n\tOPTIONS\n};\n\n\n\n// WEBPACK FOOTER //\n// src/config.js","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport * as consts from \"./consts\";\n\nexport default superclass => class extends superclass {\n\t/**\n\t * 'hold' event handler\n\t * @private\n\t */\n\t_holdHandler(e) {\n\t\tconst conf = this._conf;\n\t\tconst touch = conf.touch;\n\t\tconst holdPos = e.pos.flick;\n\n\t\ttouch.holdPos = holdPos;\n\t\ttouch.holding = true;\n\t\ttouch.isTrusted = true;\n\t\tconf.panel.changed = false;\n\n\t\tthis._adjustContainerCss(\"start\", holdPos);\n\t}\n\n\t/**\n\t * 'change' event handler\n\t * @private\n\t */\n\t_changeHandler(e) {\n\t\tconst conf = this._conf;\n\t\tconst touch = conf.touch;\n\t\tconst pos = e.pos.flick;\n\t\tconst holdPos = touch.holdPos;\n\t\tlet direction;\n\t\tlet eventRes = null;\n\t\tlet movedPx;\n\n\t\tthis._setPointerEvents(e); // for \"click\" bug\n\n\t\t/**\n\t\t * An event that occurs whenever the panel's coordinate value changes. It occurs in the following cases.
1. When the user is inputing the move.
2. When moving to the destination panel after you have finished inputing the move in step 1.
3. When the current panel is moving to its original position after the movement is finished in step 1.
4. Moving to the destination panel by calling the `moveTo()`, `prev()`, `next()` method. (Do not prevent the default behavior of the [beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart} event.)\n\t\t * @ko 패널의 좌표값이 변할 때마다 발생하는 이벤트. 아래의 경우에 발생한다.
1. 사용자가 이동(move) 액션 입력중일 때.
2. 1번에서 이동(move) 액션 입력이 끝나고 목적 패널로 이동중일 때.
3. 1번에서 이동(move) 액션 입력이 끝나고 현재 패널의 원래 위치로 이동중일 때.
4. `moveTo()`, `prev()`, `next()`, 메서드를 호출하여 목적 패널로 이동중일 때. ([beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart}이벤트의 기본동작을 막지 않아야 한다.)
5. `restore()` 메서드를 호출하여 현재 패널이 원래 위치로 이동중일 때. ([beforeFlickStart]{@link eg.Flicking#event:beforeFlickStart}이벤트의 기본동작 방지 전제.)\n\t\t * @name eg.Flicking#flick\n\t\t * @event\n\t\t * @property {String} eventType The name of the event이벤트 명\n\t\t * @property {Boolean} isTrusted true when the event was generated by a user action(`\"mouse\"` or `\"touch\"`) otherwise false사용자 액션(`\"mouse\"` 또는 `\"touch\"`)에 의해 이벤트가 생성된 경우 `true`. 그 외는 `false`\n\t\t * @property {Number} no Index number of the current panel element. See the [getIndex()]{@link eg.Flicking#getIndex} method.현재 패널 요소의 인덱스 번호. [getIndex()]{@link eg.Flicking#getIndex}메서드 참조.\n\t\t * @property {Number} direction of the panel movement. If `horizontal=true` is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_RIGHT}. If `horizontal=false` is {@link eg.Flicking.DIRECTION_UP} or {@link eg.Flicking.DIRECTION_DOWN}.패널 이동 방향. `horizontal=true` 이면 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_RIGHT}. `horizontal=false` 이면 {@link eg.Flicking.DIRECTION_UP} 혹은 {@link eg.Flicking.DIRECTION_DOWN}.\n\t\t * @property {Number} pos current coordinate 현재 좌표.\n\t\t * @property {Boolean} holding Whether the user is inputing through the input device. (Whether it is 'mousedown' for a mouse device or 'touchmove' for a touch device.)사용자가 입력 장치를 통해 입력중인지 여부. (마우스 장치라면 'mousedown' 여부, 터치 장치라면 'touchmove' 여부)\n\t\t * @property {Number} distance Distance value from the touch starting point. If the `direction` property value is {@link eg.Flicking.DIRECTION_LEFT} or {@link eg.Flicking.DIRECTION_UP}, it returns a positive number. {@link eg.Flicking.DIRECTION_RIGHT} or {@link eg.Flicking.DIRECTION_DOWN} returns a negative value.터치 시작점으로부터 이동한 거리 값. `direction`속성값이 {@link eg.Flicking.DIRECTION_LEFT} 혹은 {@link eg.Flicking.DIRECTION_UP}이면 양수를, {@link eg.Flicking.DIRECTION_RIGHT} 혹은 {@link eg.Flicking.DIRECTION_DOWN}이면 음수를 반환한다.\n\t\t * @see eg.Flicking#event:beforeRestore\n\t\t * @see eg.Flicking#restore\n\t\t * @see eg.Flicking#event:beforeFlickStart\n\t\t * @see eg.Flicking#event:flickEnd\n\t\t * @see eg.Flicking#moveTo\n\t\t * @see eg.Flicking#prev\n\t\t * @see eg.Flicking#next\n\t\t * @example\n\t\t\t * The order of event occurrence.\n\t\t\t * 이벤트 발생 순서\n\t\t\t * ```javascript\n\t\t\t * // When moving to the destination panel.\n\t\t\t * // 목적 패널로 이동할 때.\n\t\t\t * beforeFlickStart (once) > flick (many times) > flickEnd (once)\n\t\t\t *\n\t\t\t * // When the restore operation.\n\t\t\t * // 복원 동작일 때.\n\t\t\t * beforeRestore (once) > flick (many times) > restore (once)\n\t\t\t * ```\n\t\t */\n\t\tif (e.inputEvent) {\n\t\t\tdirection = e.inputEvent.direction;\n\n\t\t\t// Adjust direction in case of diagonal touch move\n\t\t\tmovedPx = e.inputEvent[this.options.horizontal ? \"deltaX\" : \"deltaY\"];\n\n\t\t\tif (!~conf.dirData.indexOf(direction)) {\n\t\t\t\tdirection = conf.dirData[+(Math.abs(touch.lastPos) <= movedPx)];\n\t\t\t}\n\n\t\t\ttouch.lastPos = movedPx;\n\t\t} else {\n\t\t\ttouch.lastPos = null;\n\t\t}\n\n\t\tconf.customEvent.flick && (eventRes =\n\t\t\tthis._triggerEvent(consts.EVENTS.flick, {\n\t\t\t\tpos,\n\t\t\t\tholding: e.holding,\n\t\t\t\tdirection: direction || touch.direction,\n\t\t\t\tdistance: touch.isTrusted ? pos - holdPos : null\n\t\t\t})\n\t\t);\n\n\t\t(eventRes || eventRes === null) && this._setTranslate([-pos, 0]);\n\t}\n\n\t/**\n\t * 'release' event handler\n\t * @private\n\t */\n\t_releaseHandler(e) {\n\t\tconst conf = this._conf;\n\t\tconst touch = conf.touch;\n\t\tconst holdPos = touch.holdPos;\n\t\tconst panelSize = conf.panel.size;\n\t\tconst customEvent = conf.customEvent;\n\t\tconst isPlusMove = touch.holdPos < e.depaPos.flick;\n\n\t\ttouch.distance = e.depaPos.flick - holdPos;\n\t\ttouch.direction = conf.dirData[+!(isPlusMove)];\n\t\ttouch.destPos = holdPos + (isPlusMove ? panelSize : -panelSize);\n\n\t\tconst distance = touch.distance;\n\t\tlet duration = this.options.duration;\n\t\tlet moveTo = holdPos;\n\n\t\tif (this._isMovable()) {\n\t\t\t!customEvent.restoreCall && (customEvent.restore = false);\n\t\t\tmoveTo = touch.destPos;\n\t\t} else if (Math.abs(distance) > 0) {\n\t\t\tthis._triggerBeforeRestore(e);\n\t\t} else {\n\t\t\tduration = 0;\n\t\t}\n\n\t\t// trigger animation\n\t\te.setTo({flick: moveTo}, duration);\n\n\t\tdistance === 0 && this._adjustContainerCss(\"end\");\n\t\ttouch.holding = false;\n\n\t\tthis._setPointerEvents(); // for \"click\" bug\n\t}\n\n\t/**\n\t * 'animationStart' event handler\n\t * @private\n\t */\n\t_animationStartHandler(e) {\n\t\tconst conf = this._conf;\n\t\tconst panel = conf.panel;\n\t\tconst customEvent = conf.customEvent;\n\t\tconst isFromInput = e.inputEvent || conf.touch.lastPos;\n\n\t\t// when animation was started by input action\n\t\tif (!customEvent.restoreCall && isFromInput &&\n\t\t\tthis._setPhaseValue(\"start\", {\n\t\t\t\tdepaPos: e.depaPos.flick,\n\t\t\t\tdestPos: e.destPos.flick\n\t\t\t}) === false) {\n\t\t\te.stop();\n\t\t}\n\n\t\tif (isFromInput) {\n\t\t\te.duration = this.options.duration;\n\n\t\t\te.destPos.flick =\n\t\t\t\tpanel.size * (\n\t\t\t\t\tpanel.index + conf.indexToMove\n\t\t\t\t);\n\t\t}\n\n\t\tpanel.animating = true;\n\t}\n\n\t/**\n\t * 'animationEnd' event handler\n\t * @private\n\t */\n\t_animationEndHandler() {\n\t\tconst conf = this._conf;\n\n\t\tconf.panel.animating = false;\n\n\t\tthis._setPhaseValue(\"end\");\n\t\tthis._triggerRestore();\n\n\t\t// reset isTrusted\n\t\tconf.touch.isTrusted = false;\n\t}\n};\n\n\n\n// WEBPACK FOOTER //\n// src/eventHandler.js"],"mappings":";;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACllFA;;;;AAIA;AACA;AAMA;AACA;AACA;AACA;AAEA;AACA;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AALA;AACA;AAOA;AAfA;;;;AAgBA;AACA;AADA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;;;;;AACA;;;;;AACA;;;;;;;;;;;ACHA;AACA;;;AAAA;AACA;;;AAAA;AACA;AAAA;AACA;AADA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;;;;;;;;;;;AAXA;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiHA;;;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AAAA;AACA;AADA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3BA;AA4BA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AAFA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AAFA;AAIA;AAAA;AACA;AACA;AAFA;AAAA;AATA;AAcA;AACA;AArBA;AACA;AAuBA;AACA;AAAA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAQA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AADA;AAMA;AACA;AACA;AAHA;AACA;AAKA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAIA;AACA;AACA;;;;;;;AAKA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;;;;;AASA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAGA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAFA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;AAFA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA;AACA;AACA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;;;;;;;;;;;AASA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;;;;;;;;;;;AASA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AAYA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AAYA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AAsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AACA;AAMA;AACA;AAAA;AACA;AACA;AACA;AAHA;AAAA;AAVA;AACA;AAgBA;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AAkBA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYA;;;;;;;;;;;;;AAnnDA;AACA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACraA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC3LA;;;;;;AAIA;AACA;;;AACA;AACA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;;;;;;AAUA;AAAA;AACA;AADA;AAAA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;;;;;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AAHA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;;AAMA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;AAKA;AACA;AACA;AACA;AACA;AAAA;;;;;;;;;;AAUA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAlPA;AACA;AAoPA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AACA;AADA;AAAA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;;;AAEA;AAAA;AAAA;AACA;AACA;AAAA;;;;;;;;;;ACvQA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA;AASA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AA9BA;AACA;AAiCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAhBA;AACA;AAmBA;AACA;;;;;;;;;;;ACzDA;AACA;AADA;AACA;;;;;;;AALA;;;;;;AAMA;AAAA;AAAA;AACA;AADA;AAAA;AACA;AADA;AAAA;AACA;AAAA;;;;AADA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAlBA;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAJA;AACA;AAOA;AACA;AACA;AACA;;;;;;AA5FA;AAiGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAlIA;AAuIA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;;;;;;AAjKA;AAsKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhLA;AAAA;AAAA;AACA;;;;;A","sourceRoot":""}