{"version":3,"file":"viewer.vue2.mjs","sources":["../../../components/viewer/viewer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Divider } from '@/components/divider'\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, h, nextTick, onMounted, reactive, ref, toRef } from 'vue'\n\nimport { emitEvent, useIcons, useLocale, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useFullScreen, useModifier, useMoving, useSetTimeout } from '@vexip-ui/hooks'\nimport { boundRange, callIfFunc, toCssSize, toFixed } from '@vexip-ui/utils'\nimport { viewerProps } from './props'\nimport { InternalActionName, viewerDefaultActionLayout } from './symbol'\n\nimport type { ViewerActionLayout, ViewerState, ViewerToolbarAction } from './symbol'\n\ndefineOptions({ name: 'Viewer' })\n\nconst _props = defineProps(viewerProps)\nconst props = useProps('viewer', _props, {\n  locale: null,\n  width: '100%',\n  height: '100%',\n  moveDisabled: false,\n  zoomDisabled: false,\n  zoomDelta: 0.15,\n  zoomMin: 0.1,\n  zoomMax: Infinity,\n  rotateDisabled: false,\n  rotateDelta: 90,\n  flipDisabled: false,\n  fullDisabled: false,\n  toolbarPlacement: 'bottom',\n  actions: () => [],\n  toolbarFade: false,\n  noTransition: false,\n  centerScale: false,\n  actionLayout: () => []\n})\n\ndefineSlots<{\n  default: (params: { state: ViewerState }) => any,\n  [action: `action-${string}`]: (params: { state: ViewerState }) => any\n}>()\n\nconst nh = useNameHelper('viewer')\nconst locale = useLocale('viewer', toRef(props, 'locale'))\nconst icons = useIcons()\n\nconst { timer } = useSetTimeout()\nconst toolbarActive = ref(false)\n\nconst zoom = ref(1)\nconst rotate = ref(0)\nconst flipX = ref(false)\nconst flipY = ref(false)\n\nconst viewer = ref<HTMLElement>()\nconst transition = ref<HTMLElement>()\n\nconst { supported: fullSupported, full, enter: enterFull, exit: exitFull } = useFullScreen(viewer)\nconst {\n  target: container,\n  x: currentLeft,\n  y: currentTop,\n  moving\n} = useMoving({\n  onStart: (_, event) => {\n    if (props.moveDisabled || event.button > 0) {\n      return false\n    }\n\n    emitEvent(props.onMoveStart, getState())\n  },\n  onMove: () => {\n    emitEvent(props.onMoveStart, getState())\n  },\n  onEnd: () => {\n    emitEvent(props.onMoveStart, getState())\n  }\n})\n\nconst state = reactive({\n  zoom,\n  rotate,\n  flipX,\n  flipY,\n  full,\n  moving,\n  x: currentLeft,\n  y: currentTop\n}) as ViewerState\n\nconst zoomOrigin = {\n  x: 0,\n  y: 0\n}\n\nuseModifier({\n  target: viewer,\n  passive: false,\n  onKeyDown: (event, modifier) => {\n    if (moving.value) return\n\n    if (modifier.up || modifier.down || modifier.left || modifier.right) {\n      event.preventDefault()\n\n      const current = modifier.up || modifier.down ? currentTop : currentLeft\n      const step = modifier.up || modifier.left ? -10 : 10\n\n      current.value += event.ctrlKey ? 5 * step : step\n\n      modifier.resetAll()\n    }\n  }\n})\n\nfunction getState() {\n  return state\n}\n\nfunction getActionProp<\n  K extends Exclude<keyof ViewerToolbarAction, 'name' | 'icon' | 'iconRenderer' | 'process'>\n>(action: ViewerToolbarAction, prop: K) {\n  return callIfFunc(action[prop] as any, state) as Exclude<\n    ViewerToolbarAction[K],\n    (...args: any) => any\n  >\n}\n\nfunction getActionClass(name: string) {\n  return nh.be(name)\n}\n\nconst internalActions: ViewerToolbarAction[] = [\n  {\n    name: InternalActionName.RotateRight,\n    process: () => handleRotate(props.rotateDelta),\n    iconRenderer: () => h(Icon, icons.value.rotateRight),\n    class: getActionClass(InternalActionName.RotateRight),\n    title: () => locale.value.rotateRight,\n    hidden: () => props.rotateDisabled\n  },\n  {\n    name: InternalActionName.RotateLeft,\n    process: () => handleRotate(-1 * props.rotateDelta),\n    iconRenderer: () => h(Icon, icons.value.rotateLeft),\n    class: getActionClass(InternalActionName.RotateLeft),\n    title: () => locale.value.rotateLeft,\n    hidden: () => props.rotateDisabled\n  },\n  {\n    name: InternalActionName.FlipX,\n    process: () => toggleFlipX(),\n    iconRenderer: () => h(Icon, icons.value.flipX),\n    class: getActionClass(InternalActionName.FlipX),\n    title: () => locale.value.flipHorizontal,\n    hidden: () => props.flipDisabled\n  },\n  {\n    name: InternalActionName.FlipY,\n    process: () => toggleFlipY(),\n    iconRenderer: () => h(Icon, icons.value.flipY),\n    class: getActionClass(InternalActionName.FlipY),\n    title: () => locale.value.flipVertical,\n    hidden: () => props.flipDisabled\n  },\n  {\n    name: InternalActionName.ZoomIn,\n    process: () => handleZoom(props.zoomDelta),\n    iconRenderer: () => h(Icon, icons.value.zoomIn),\n    class: getActionClass(InternalActionName.ZoomIn),\n    title: () => locale.value.zoomIn,\n    hidden: () => props.zoomDisabled\n  },\n  {\n    name: InternalActionName.ZoomOut,\n    process: () => handleZoom(-1 * props.zoomDelta),\n    iconRenderer: () => h(Icon, icons.value.zoonOut),\n    class: getActionClass(InternalActionName.ZoomOut),\n    title: () => locale.value.zoomOut,\n    hidden: () => props.zoomDisabled\n  },\n  {\n    name: InternalActionName.FullScreen,\n    process: () => toggleFull(!full.value),\n    iconRenderer: () => h(Icon, full.value ? icons.value.resetScreen : icons.value.fullScreen),\n    class: getActionClass(InternalActionName.FullScreen),\n    title: () => (full.value ? locale.value.fullScreenExit : locale.value.fullScreen),\n    hidden: () => props.fullDisabled\n  },\n  {\n    name: InternalActionName.Reset,\n    process: () => handleReset(),\n    iconRenderer: () => h(Icon, icons.value.refresh),\n    class: getActionClass(InternalActionName.Reset),\n    title: () => locale.value.reset\n  }\n]\n\nconst className = computed(() => {\n  return {\n    [nh.b()]: true,\n    [nh.bs('vars')]: true,\n    [nh.bm('inherit')]: props.inherit,\n    [nh.bm('draggable')]: !props.moveDisabled,\n    [nh.bm('resizable')]: !props.zoomDisabled,\n    [nh.bm('full')]: full.value,\n    [nh.bm('moving')]: moving.value,\n    [nh.bm('static')]: props.noTransition\n  }\n})\nconst style = computed(() => {\n  return {\n    width: toCssSize(props.width),\n    height: toCssSize(props.height)\n  }\n})\nconst toolbarVertical = computed(() => {\n  const [layout] = props.toolbarPlacement.split('-')\n\n  return layout === 'left' || layout === 'right'\n})\nconst toolbarFade = computed(() => {\n  return typeof props.toolbarFade === 'number' ? props.toolbarFade : props.toolbarFade ? 1500 : 0\n})\nconst toolbarClass = computed(() => {\n  return {\n    [nh.be('toolbar')]: true,\n    [nh.bem('toolbar', 'active')]: toolbarFade.value < 300 || toolbarActive.value,\n    [nh.bem('toolbar', props.toolbarPlacement)]: true,\n    [nh.bem('toolbar', 'vertical')]: toolbarVertical.value\n  }\n})\nconst contentStyle = computed(() => {\n  return {\n    transform: `translate3d(${currentLeft.value}px, ${currentTop.value}px, 0) scale(${zoom.value})`\n  }\n})\nconst transitionStyle = computed(() => {\n  return {\n    transform: `scaleX(${flipX.value ? -1 : 1}) scaleY(${flipY.value ? -1 : 1}) rotate(${\n      rotate.value\n    }deg)`\n  }\n})\nconst allActions = computed(() => {\n  const map = new Map<string, ViewerToolbarAction>()\n  const actions: ViewerToolbarAction[][] = []\n\n  internalActions.concat(props.actions).forEach(action => {\n    if (action.name) {\n      map.set(action.name, action)\n    }\n  })\n\n  let layout: ViewerActionLayout\n\n  if (!props.actionLayout?.length) {\n    layout = [...viewerDefaultActionLayout]\n\n    if (props.actions.length) {\n      layout.push(props.actions.map(action => action.name))\n    }\n  } else {\n    layout = props.actionLayout\n  }\n\n  for (const names of layout) {\n    const group = names.map(name => map.get(name)!).filter(Boolean)\n\n    group.length && actions.push(group)\n  }\n\n  return actions\n})\n\ndefineExpose({\n  moving,\n  fullSupported,\n  state,\n  viewer,\n  container,\n  transition,\n  handleRotate,\n  toggleFlipHorizontal: toggleFlipX,\n  toggleFlipVertical: toggleFlipY,\n  handleZoom,\n  toggleFull,\n  handleReset\n})\n\nonMounted(() => {\n  if (container.value) {\n    const rect = container.value.getBoundingClientRect()\n\n    zoomOrigin.x = rect.left + rect.width * 0.5\n    zoomOrigin.y = rect.top + rect.height * 0.5\n  }\n})\n\nfunction handleWheel(event: WheelEvent) {\n  event.stopPropagation()\n  event.preventDefault()\n\n  const sign = event.deltaY > 0 ? -1 : 1\n\n  zoomOrigin.x = event.clientX\n  zoomOrigin.y = event.clientY\n\n  emitEvent(props.onWheel, sign, state)\n  handleZoom(sign * props.zoomDelta)\n}\n\nfunction handleRotate(deg: number, emit = true) {\n  if (props.rotateDisabled) return\n\n  rotate.value += deg\n\n  if (props.noTransition && rotate.value % 360 === 0) {\n    rotate.value = 0\n  }\n\n  emit && emitEvent(props.onRotate, deg, state)\n\n  if (props.noTransition) {\n    nextTick(normalizeProps)\n  }\n}\n\nfunction toggleFlipX(target = !flipX.value, emit = true) {\n  if (props.flipDisabled) return\n\n  flipX.value = target\n  emit && emitEvent(props.onFlipX, target, state)\n}\n\nfunction toggleFlipY(target = !flipY.value, emit = true) {\n  if (props.flipDisabled) return\n\n  flipY.value = target\n  emit && emitEvent(props.onFlipY, target, state)\n}\n\nfunction handleZoom(ratio: number, emit = true) {\n  if (props.zoomDisabled || !container.value || moving.value) return\n\n  const containerRect = container.value.getBoundingClientRect()\n  const { x, y } = zoomOrigin\n  const { offsetWidth, offsetHeight } = container.value\n  const prevZoom = zoom.value\n\n  zoom.value = toFixed(boundRange(zoom.value + ratio, props.zoomMin, props.zoomMax), 5)\n\n  const delta = zoom.value / prevZoom - 1\n  const originX = delta * offsetWidth * 0.5\n  const originY = delta * offsetHeight * 0.5\n\n  if (!props.centerScale) {\n    currentLeft.value -= delta * (x - containerRect.left - currentLeft.value) - originX\n    currentTop.value -= delta * (y - containerRect.top - currentTop.value) - originY\n  }\n\n  emit && emitEvent(props.onZoom, zoom.value, state)\n}\n\nasync function toggleFull(isFull = !full.value, emit = true) {\n  isFull ? await enterFull() : await exitFull()\n\n  emit && emitEvent(props.onFull, isFull, state)\n}\n\nfunction handleReset(emit = true) {\n  currentTop.value = 0\n  currentLeft.value = 0\n  rotate.value = 0\n  flipX.value = false\n  flipY.value = false\n  zoom.value = 1\n\n  emit && emitEvent(props.onReset, state)\n}\n\nfunction normalizeProps() {\n  if (props.noTransition) {\n    if (rotate.value % 360 === 0) {\n      rotate.value = 0\n    }\n\n    return\n  }\n\n  const queue: Array<() => void> = []\n\n  if (rotate.value % 360 === 0) {\n    queue.push(\n      () => {\n        if (transition.value) {\n          transition.value.style.transitionDuration = '0ms'\n        }\n      },\n      () => {\n        rotate.value = 0\n      },\n      () => {\n        if (transition.value) {\n          transition.value.style.transitionDuration = ''\n        }\n      }\n    )\n  }\n\n  const run = () => {\n    queue.shift()?.()\n    queue.length && requestAnimationFrame(run)\n  }\n\n  run()\n}\n\nfunction handleEnterToolbar() {\n  clearTimeout(timer.toolbarFade)\n  toolbarActive.value = true\n}\n\nfunction handleLeaveToolbar() {\n  clearTimeout(timer.toolbarFade)\n\n  if (toolbarFade.value >= 300) {\n    timer.toolbarFade = setTimeout(() => {\n      toolbarActive.value = false\n    }, toolbarFade.value)\n  }\n}\n</script>\n\n<template>\n  <div\n    ref=\"viewer\"\n    :class=\"className\"\n    tabindex=\"0\"\n    :style=\"style\"\n  >\n    <div ref=\"container\" :class=\"nh.be('container')\" @wheel=\"handleWheel\">\n      <div :class=\"nh.be('content')\" :style=\"contentStyle\">\n        <div\n          ref=\"transition\"\n          :class=\"nh.be('transition')\"\n          :style=\"transitionStyle\"\n          @transitionend=\"normalizeProps\"\n        >\n          <slot :state=\"state\"></slot>\n        </div>\n      </div>\n    </div>\n    <div\n      :class=\"toolbarClass\"\n      role=\"toolbar\"\n      @mouseenter=\"handleEnterToolbar\"\n      @mouseleave=\"handleLeaveToolbar\"\n    >\n      <template v-for=\"(group, index) in allActions\" :key=\"index\">\n        <template v-for=\"action in group\" :key=\"action.name\">\n          <template v-if=\"!getActionProp(action, 'hidden')\">\n            <button\n              type=\"button\"\n              :class=\"[\n                {\n                  [nh.be('action')]: true,\n                  [nh.bem('action', 'disabled')]: getActionProp(action, 'disabled')\n                },\n                getActionProp(action, 'class')\n              ]\"\n              :title=\"getActionProp(action, 'title')\"\n              @click.stop=\"action.process(state)\"\n            >\n              <slot :name=\"`action-${action.name}`\" :state=\"state\">\n                <Renderer\n                  v-if=\"action.iconRenderer\"\n                  :renderer=\"action.iconRenderer\"\n                  :data=\"state\"\n                ></Renderer>\n                <Icon\n                  v-else-if=\"action.icon\"\n                  :icon=\"action.icon\"\n                  :style=\"getActionProp(action, 'iconStyle')\"\n                  :scale=\"getActionProp(action, 'iconScale') || 1\"\n                ></Icon>\n                <template v-else>\n                  {{ action.name }}\n                </template>\n              </slot>\n            </button>\n          </template>\n        </template>\n        <Divider\n          v-if=\"index !== allActions.length - 1\"\n          inherit\n          :vertical=\"!toolbarVertical\"\n        ></Divider>\n      </template>\n    </div>\n  </div>\n</template>\n"],"names":["props","useProps","__props","nh","useNameHelper","locale","useLocale","toRef","icons","useIcons","timer","useSetTimeout","toolbarActive","ref","zoom","rotate","flipX","flipY","viewer","transition","fullSupported","full","enterFull","exitFull","useFullScreen","container","currentLeft","currentTop","moving","useMoving","_","event","emitEvent","getState","state","reactive","zoomOrigin","useModifier","modifier","current","step","getActionProp","action","prop","callIfFunc","getActionClass","name","internalActions","InternalActionName","handleRotate","Icon","toggleFlipX","toggleFlipY","handleZoom","toggleFull","handleReset","className","computed","style","toCssSize","toolbarVertical","layout","toolbarFade","toolbarClass","contentStyle","transitionStyle","allActions","map","actions","_a","viewerDefaultActionLayout","names","group","__expose","onMounted","rect","handleWheel","sign","deg","emit","nextTick","normalizeProps","target","ratio","containerRect","x","y","offsetWidth","offsetHeight","prevZoom","toFixed","boundRange","delta","originX","originY","isFull","queue","run","handleEnterToolbar","handleLeaveToolbar"],"mappings":";;;;;;;;;;;;;;;;;AAkBM,UAAAA,IAAQC,GAAS,UADRC,IAC0B;AAAA,MACvC,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,cAAc;AAAA,MACd,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,SAAS,MAAM,CAAC;AAAA,MAChB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc,MAAM,CAAA;AAAA,IAAC,CACtB,GAOKC,IAAKC,GAAc,QAAQ,GAC3BC,IAASC,GAAU,UAAUC,GAAMP,GAAO,QAAQ,CAAC,GACnDQ,IAAQC,GAAS,GAEjB,EAAE,OAAAC,EAAM,IAAIC,GAAc,GAC1BC,IAAgBC,EAAI,EAAK,GAEzBC,IAAOD,EAAI,CAAC,GACZE,IAASF,EAAI,CAAC,GACdG,IAAQH,EAAI,EAAK,GACjBI,IAAQJ,EAAI,EAAK,GAEjBK,IAASL,EAAiB,GAC1BM,IAAaN,EAAiB,GAE9B,EAAE,WAAWO,IAAe,MAAAC,GAAM,OAAOC,IAAW,MAAMC,GAAA,IAAaC,GAAcN,CAAM,GAC3F;AAAA,MACJ,QAAQO;AAAA,MACR,GAAGC;AAAA,MACH,GAAGC;AAAA,MACH,QAAAC;AAAA,QACEC,GAAU;AAAA,MACZ,SAAS,CAACC,GAAGC,MAAU;AACrB,YAAI/B,EAAM,gBAAgB+B,EAAM,SAAS;AAChC,iBAAA;AAGC,QAAAC,EAAAhC,EAAM,aAAaiC,GAAU;AAAA,MACzC;AAAA,MACA,QAAQ,MAAM;AACF,QAAAD,EAAAhC,EAAM,aAAaiC,GAAU;AAAA,MACzC;AAAA,MACA,OAAO,MAAM;AACD,QAAAD,EAAAhC,EAAM,aAAaiC,GAAU;AAAA,MAAA;AAAA,IACzC,CACD,GAEKC,IAAQC,GAAS;AAAA,MACrB,MAAArB;AAAA,MACA,QAAAC;AAAA,MACA,OAAAC;AAAA,MACA,OAAAC;AAAA,MACA,MAAAI;AAAA,MACA,QAAAO;AAAA,MACA,GAAGF;AAAA,MACH,GAAGC;AAAA,IAAA,CACJ,GAEKS,IAAa;AAAA,MACjB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEY,IAAAC,GAAA;AAAA,MACV,QAAQnB;AAAA,MACR,SAAS;AAAA,MACT,WAAW,CAACa,GAAOO,MAAa;AAC9B,YAAI,CAAAV,EAAO,UAEPU,EAAS,MAAMA,EAAS,QAAQA,EAAS,QAAQA,EAAS,QAAO;AACnE,UAAAP,EAAM,eAAe;AAErB,gBAAMQ,IAAUD,EAAS,MAAMA,EAAS,OAAOX,IAAaD,GACtDc,IAAOF,EAAS,MAAMA,EAAS,OAAO,MAAM;AAElD,UAAAC,EAAQ,SAASR,EAAM,UAAU,IAAIS,IAAOA,GAE5CF,EAAS,SAAS;AAAA,QAAA;AAAA,MACpB;AAAA,IACF,CACD;AAED,aAASL,IAAW;AACX,aAAAC;AAAA,IAAA;AAGA,aAAAO,EAEPC,GAA6BC,GAAS;AACtC,aAAOC,GAAWF,EAAOC,CAAI,GAAUT,CAAK;AAAA,IAAA;AAM9C,aAASW,EAAeC,GAAc;AAC7B,aAAA3C,EAAG,GAAG2C,CAAI;AAAA,IAAA;AAGnB,UAAMC,KAAyC;AAAA,MAC7C;AAAA,QACE,MAAMC,EAAmB;AAAA,QACzB,SAAS,MAAMC,EAAajD,EAAM,WAAW;AAAA,QAC7C,cAAc,MAAM,EAAEkD,GAAM1C,EAAM,MAAM,WAAW;AAAA,QACnD,OAAOqC,EAAeG,EAAmB,WAAW;AAAA,QACpD,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMC,EAAa,KAAKjD,EAAM,WAAW;AAAA,QAClD,cAAc,MAAM,EAAEkD,GAAM1C,EAAM,MAAM,UAAU;AAAA,QAClD,OAAOqC,EAAeG,EAAmB,UAAU;AAAA,QACnD,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMG,EAAY;AAAA,QAC3B,cAAc,MAAM,EAAED,GAAM1C,EAAM,MAAM,KAAK;AAAA,QAC7C,OAAOqC,EAAeG,EAAmB,KAAK;AAAA,QAC9C,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMI,EAAY;AAAA,QAC3B,cAAc,MAAM,EAAEF,GAAM1C,EAAM,MAAM,KAAK;AAAA,QAC7C,OAAOqC,EAAeG,EAAmB,KAAK;AAAA,QAC9C,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMK,EAAWrD,EAAM,SAAS;AAAA,QACzC,cAAc,MAAM,EAAEkD,GAAM1C,EAAM,MAAM,MAAM;AAAA,QAC9C,OAAOqC,EAAeG,EAAmB,MAAM;AAAA,QAC/C,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMK,EAAW,KAAKrD,EAAM,SAAS;AAAA,QAC9C,cAAc,MAAM,EAAEkD,GAAM1C,EAAM,MAAM,OAAO;AAAA,QAC/C,OAAOqC,EAAeG,EAAmB,OAAO;AAAA,QAChD,OAAO,MAAM3C,EAAO,MAAM;AAAA,QAC1B,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMM,EAAW,CAACjC,EAAK,KAAK;AAAA,QACrC,cAAc,MAAM,EAAE6B,GAAM7B,EAAK,QAAQb,EAAM,MAAM,cAAcA,EAAM,MAAM,UAAU;AAAA,QACzF,OAAOqC,EAAeG,EAAmB,UAAU;AAAA,QACnD,OAAO,MAAO3B,EAAK,QAAQhB,EAAO,MAAM,iBAAiBA,EAAO,MAAM;AAAA,QACtE,QAAQ,MAAML,EAAM;AAAA,MACtB;AAAA,MACA;AAAA,QACE,MAAMgD,EAAmB;AAAA,QACzB,SAAS,MAAMO,EAAY;AAAA,QAC3B,cAAc,MAAM,EAAEL,GAAM1C,EAAM,MAAM,OAAO;AAAA,QAC/C,OAAOqC,EAAeG,EAAmB,KAAK;AAAA,QAC9C,OAAO,MAAM3C,EAAO,MAAM;AAAA,MAAA;AAAA,IAE9B,GAEMmD,KAAYC,EAAS,OAClB;AAAA,MACL,CAACtD,EAAG,EAAE,CAAC,GAAG;AAAA,MACV,CAACA,EAAG,GAAG,MAAM,CAAC,GAAG;AAAA,MACjB,CAACA,EAAG,GAAG,SAAS,CAAC,GAAGH,EAAM;AAAA,MAC1B,CAACG,EAAG,GAAG,WAAW,CAAC,GAAG,CAACH,EAAM;AAAA,MAC7B,CAACG,EAAG,GAAG,WAAW,CAAC,GAAG,CAACH,EAAM;AAAA,MAC7B,CAACG,EAAG,GAAG,MAAM,CAAC,GAAGkB,EAAK;AAAA,MACtB,CAAClB,EAAG,GAAG,QAAQ,CAAC,GAAGyB,EAAO;AAAA,MAC1B,CAACzB,EAAG,GAAG,QAAQ,CAAC,GAAGH,EAAM;AAAA,IAC3B,EACD,GACK0D,KAAQD,EAAS,OACd;AAAA,MACL,OAAOE,GAAU3D,EAAM,KAAK;AAAA,MAC5B,QAAQ2D,GAAU3D,EAAM,MAAM;AAAA,IAChC,EACD,GACK4D,IAAkBH,EAAS,MAAM;AACrC,YAAM,CAACI,CAAM,IAAI7D,EAAM,iBAAiB,MAAM,GAAG;AAE1C,aAAA6D,MAAW,UAAUA,MAAW;AAAA,IAAA,CACxC,GACKC,IAAcL,EAAS,MACpB,OAAOzD,EAAM,eAAgB,WAAWA,EAAM,cAAcA,EAAM,cAAc,OAAO,CAC/F,GACK+D,KAAeN,EAAS,OACrB;AAAA,MACL,CAACtD,EAAG,GAAG,SAAS,CAAC,GAAG;AAAA,MACpB,CAACA,EAAG,IAAI,WAAW,QAAQ,CAAC,GAAG2D,EAAY,QAAQ,OAAOlD,EAAc;AAAA,MACxE,CAACT,EAAG,IAAI,WAAWH,EAAM,gBAAgB,CAAC,GAAG;AAAA,MAC7C,CAACG,EAAG,IAAI,WAAW,UAAU,CAAC,GAAGyD,EAAgB;AAAA,IACnD,EACD,GACKI,KAAeP,EAAS,OACrB;AAAA,MACL,WAAW,eAAe/B,EAAY,KAAK,OAAOC,EAAW,KAAK,gBAAgBb,EAAK,KAAK;AAAA,IAC9F,EACD,GACKmD,KAAkBR,EAAS,OACxB;AAAA,MACL,WAAW,UAAUzC,EAAM,QAAQ,KAAK,CAAC,YAAYC,EAAM,QAAQ,KAAK,CAAC,YACvEF,EAAO,KACT;AAAA,IACF,EACD,GACKmD,IAAaT,EAAS,MAAM;;AAC1B,YAAAU,wBAAU,IAAiC,GAC3CC,IAAmC,CAAC;AAE1C,MAAArB,GAAgB,OAAO/C,EAAM,OAAO,EAAE,QAAQ,CAAU0C,MAAA;AACtD,QAAIA,EAAO,QACLyB,EAAA,IAAIzB,EAAO,MAAMA,CAAM;AAAA,MAC7B,CACD;AAEG,UAAAmB;AAEA,OAACQ,IAAArE,EAAM,iBAAN,QAAAqE,EAAoB,SAOvBR,IAAS7D,EAAM,gBANN6D,IAAA,CAAC,GAAGS,EAAyB,GAElCtE,EAAM,QAAQ,UAChB6D,EAAO,KAAK7D,EAAM,QAAQ,IAAI,CAAU0C,MAAAA,EAAO,IAAI,CAAC;AAMxD,iBAAW6B,KAASV,GAAQ;AACpB,cAAAW,IAAQD,EAAM,IAAI,CAAQzB,MAAAqB,EAAI,IAAIrB,CAAI,CAAE,EAAE,OAAO,OAAO;AAExD,QAAA0B,EAAA,UAAUJ,EAAQ,KAAKI,CAAK;AAAA,MAAA;AAG7B,aAAAJ;AAAA,IAAA,CACR;AAEY,IAAAK,GAAA;AAAA,MACX,QAAA7C;AAAA,MACA,eAAAR;AAAA,MACA,OAAAc;AAAA,MACA,QAAAhB;AAAA,MACA,WAAAO;AAAA,MACA,YAAAN;AAAA,MACA,cAAA8B;AAAA,MACA,sBAAsBE;AAAA,MACtB,oBAAoBC;AAAA,MACpB,YAAAC;AAAA,MACA,YAAAC;AAAA,MACA,aAAAC;AAAA,IAAA,CACD,GAEDmB,GAAU,MAAM;AACd,UAAIjD,EAAU,OAAO;AACb,cAAAkD,IAAOlD,EAAU,MAAM,sBAAsB;AAEnD,QAAAW,EAAW,IAAIuC,EAAK,OAAOA,EAAK,QAAQ,KACxCvC,EAAW,IAAIuC,EAAK,MAAMA,EAAK,SAAS;AAAA,MAAA;AAAA,IAC1C,CACD;AAED,aAASC,GAAY7C,GAAmB;AACtC,MAAAA,EAAM,gBAAgB,GACtBA,EAAM,eAAe;AAErB,YAAM8C,IAAO9C,EAAM,SAAS,IAAI,KAAK;AAErC,MAAAK,EAAW,IAAIL,EAAM,SACrBK,EAAW,IAAIL,EAAM,SAEXC,EAAAhC,EAAM,SAAS6E,GAAM3C,CAAK,GACzBmB,EAAAwB,IAAO7E,EAAM,SAAS;AAAA,IAAA;AAG1B,aAAAiD,EAAa6B,GAAaC,IAAO,IAAM;AAC9C,MAAI/E,EAAM,mBAEVe,EAAO,SAAS+D,GAEZ9E,EAAM,gBAAgBe,EAAO,QAAQ,QAAQ,MAC/CA,EAAO,QAAQ,IAGjBgE,KAAQ/C,EAAUhC,EAAM,UAAU8E,GAAK5C,CAAK,GAExClC,EAAM,gBACRgF,GAASC,CAAc;AAAA,IACzB;AAGF,aAAS9B,EAAY+B,IAAS,CAAClE,EAAM,OAAO+D,IAAO,IAAM;AACvD,MAAI/E,EAAM,iBAEVgB,EAAM,QAAQkE,GACdH,KAAQ/C,EAAUhC,EAAM,SAASkF,GAAQhD,CAAK;AAAA,IAAA;AAGhD,aAASkB,EAAY8B,IAAS,CAACjE,EAAM,OAAO8D,IAAO,IAAM;AACvD,MAAI/E,EAAM,iBAEViB,EAAM,QAAQiE,GACdH,KAAQ/C,EAAUhC,EAAM,SAASkF,GAAQhD,CAAK;AAAA,IAAA;AAGvC,aAAAmB,EAAW8B,GAAeJ,IAAO,IAAM;AAC9C,UAAI/E,EAAM,gBAAgB,CAACyB,EAAU,SAASG,EAAO,MAAO;AAEtD,YAAAwD,IAAgB3D,EAAU,MAAM,sBAAsB,GACtD,EAAE,GAAA4D,GAAG,GAAAC,EAAA,IAAMlD,GACX,EAAE,aAAAmD,GAAa,cAAAC,EAAa,IAAI/D,EAAU,OAC1CgE,KAAW3E,EAAK;AAEjB,MAAAA,EAAA,QAAQ4E,GAAQC,GAAW7E,EAAK,QAAQqE,GAAOnF,EAAM,SAASA,EAAM,OAAO,GAAG,CAAC;AAE9E,YAAA4F,IAAQ9E,EAAK,QAAQ2E,KAAW,GAChCI,KAAUD,IAAQL,IAAc,KAChCO,KAAUF,IAAQJ,IAAe;AAEnC,MAACxF,EAAM,gBACT0B,EAAY,SAASkE,KAASP,IAAID,EAAc,OAAO1D,EAAY,SAASmE,IAC5ElE,EAAW,SAASiE,KAASN,IAAIF,EAAc,MAAMzD,EAAW,SAASmE,KAG3Ef,KAAQ/C,EAAUhC,EAAM,QAAQc,EAAK,OAAOoB,CAAK;AAAA,IAAA;AAGnD,mBAAeoB,EAAWyC,IAAS,CAAC1E,EAAK,OAAO0D,IAAO,IAAM;AAC3D,MAAAgB,IAAS,MAAMzE,OAAc,MAAMC,GAAS,GAE5CwD,KAAQ/C,EAAUhC,EAAM,QAAQ+F,GAAQ7D,CAAK;AAAA,IAAA;AAGtC,aAAAqB,EAAYwB,IAAO,IAAM;AAChC,MAAApD,EAAW,QAAQ,GACnBD,EAAY,QAAQ,GACpBX,EAAO,QAAQ,GACfC,EAAM,QAAQ,IACdC,EAAM,QAAQ,IACdH,EAAK,QAAQ,GAELiE,KAAA/C,EAAUhC,EAAM,SAASkC,CAAK;AAAA,IAAA;AAGxC,aAAS+C,IAAiB;AACxB,UAAIjF,EAAM,cAAc;AAClB,QAAAe,EAAO,QAAQ,QAAQ,MACzBA,EAAO,QAAQ;AAGjB;AAAA,MAAA;AAGF,YAAMiF,IAA2B,CAAC;AAE9B,MAAAjF,EAAO,QAAQ,QAAQ,KACnBiF,EAAA;AAAA,QACJ,MAAM;AACJ,UAAI7E,EAAW,UACFA,EAAA,MAAM,MAAM,qBAAqB;AAAA,QAEhD;AAAA,QACA,MAAM;AACJ,UAAAJ,EAAO,QAAQ;AAAA,QACjB;AAAA,QACA,MAAM;AACJ,UAAII,EAAW,UACFA,EAAA,MAAM,MAAM,qBAAqB;AAAA,QAC9C;AAAA,MAEJ;AAGF,YAAM8E,IAAM,MAAM;;AAChB,SAAA5B,IAAA2B,EAAM,YAAN,QAAA3B,KACM2B,EAAA,UAAU,sBAAsBC,CAAG;AAAA,MAC3C;AAEI,MAAAA,EAAA;AAAA,IAAA;AAGN,aAASC,KAAqB;AAC5B,mBAAaxF,EAAM,WAAW,GAC9BE,EAAc,QAAQ;AAAA,IAAA;AAGxB,aAASuF,KAAqB;AAC5B,mBAAazF,EAAM,WAAW,GAE1BoD,EAAY,SAAS,QACjBpD,EAAA,cAAc,WAAW,MAAM;AACnC,QAAAE,EAAc,QAAQ;AAAA,MAAA,GACrBkD,EAAY,KAAK;AAAA,IACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}