kinetic-slider
Version:
A WebGL-powered kinetic slider component using PIXI.js
1 lines • 24.5 kB
Source Map (JSON)
{"version":3,"file":"useTextTilt.cjs","sources":["../../../src/hooks/useTextTilt.ts"],"sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\nimport { Container, DisplacementFilter } from \"pixi.js\";\nimport { gsap } from \"gsap\";\nimport ResourceManager from '../managers/ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n// Enhanced error logging utility\nconst logError = (context: string, error: unknown) => {\n if (isDevelopment) {\n console.error(`[useTextTilt:${context}] Error:`, error);\n }\n};\n\n// Comprehensive interface for hook props\ninterface UseTextTiltProps {\n sliderRef: RefObject<HTMLDivElement | null>;\n textContainersRef: RefObject<Container[]>;\n currentIndex: RefObject<number>;\n cursorTextEffect: boolean;\n maxContainerShiftFraction: number;\n bgDispFilterRef: RefObject<DisplacementFilter | null>;\n cursorDispFilterRef: RefObject<DisplacementFilter | null>;\n cursorImgEffect: boolean;\n resourceManager?: ResourceManager | null;\n throttleTime?: number;\n}\n\n// Enhanced state management interface\ninterface TiltState {\n isAnimating: boolean;\n lastOffsetX: number;\n lastOffsetY: number;\n}\n\n// Cancellation and lifecycle management interface\ninterface CancellationFlags {\n isCancelled: boolean;\n}\n\n/**\n * Advanced text tilt hook with comprehensive optimization\n */\nconst useTextTilt = ({\n sliderRef,\n textContainersRef,\n currentIndex,\n cursorTextEffect,\n maxContainerShiftFraction,\n bgDispFilterRef,\n cursorDispFilterRef,\n cursorImgEffect,\n resourceManager,\n throttleTime = 50\n }: UseTextTiltProps) => {\n // Enhanced refs with strict typing\n const lastMoveTimeRef = useRef<number>(0);\n const tiltTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const animationStateRef = useRef<TiltState>({\n isAnimating: false,\n lastOffsetX: 0,\n lastOffsetY: 0\n });\n const cancellationRef = useRef<CancellationFlags>({ isCancelled: false });\n const activeTweensRef = useRef<gsap.core.Tween[]>([]);\n\n useEffect(() => {\n // Skip during server-side rendering\n if (typeof window === 'undefined') return;\n\n // Early exit if effect is disabled\n if (!cursorTextEffect || !sliderRef.current) {\n if (isDevelopment) {\n console.log('Text tilt effect disabled or missing slider reference');\n }\n return;\n }\n\n // Reset cancellation flag\n cancellationRef.current.isCancelled = false;\n\n const sliderElement = sliderRef.current;\n\n /**\n * Comprehensive cleanup of active tweens\n */\n const cleanupActiveTweens = () => {\n try {\n activeTweensRef.current.forEach(tween => {\n if (tween && tween.isActive()) {\n tween.kill();\n }\n });\n activeTweensRef.current = [];\n } catch (error) {\n logError('cleanupActiveTweens', error);\n }\n };\n\n /**\n * Safe calculation of tilt values with comprehensive error handling\n */\n const calculateTiltValues = (mouseX: number, mouseY: number) => {\n try {\n // Validate slider element\n if (!sliderElement) {\n logError('calculateTiltValues', 'Slider element is undefined');\n return {\n containerShiftX: 0,\n containerShiftY: 0,\n titleShiftX: 0,\n subtitleShiftX: 0,\n centerX: 0,\n centerY: 0\n };\n }\n\n const containerWidth = sliderElement.clientWidth;\n const containerHeight = sliderElement.clientHeight;\n\n // Validate container dimensions\n if (containerWidth <= 0 || containerHeight <= 0) {\n logError('calculateTiltValues', 'Invalid container dimensions');\n return {\n containerShiftX: 0,\n containerShiftY: 0,\n titleShiftX: 0,\n subtitleShiftX: 0,\n centerX: 0,\n centerY: 0\n };\n }\n\n const centerX = containerWidth / 2;\n const centerY = containerHeight / 2;\n\n // Calculate offsets from center\n const offsetX = centerX - mouseX;\n const offsetY = centerY - mouseY;\n\n // Store for comparison in throttling\n animationStateRef.current.lastOffsetX = offsetX;\n animationStateRef.current.lastOffsetY = offsetY;\n\n // Constrained shift calculations\n const rawContainerShiftX = offsetX * 0.05;\n const rawContainerShiftY = offsetY * 0.1;\n const maxShiftX = containerWidth * maxContainerShiftFraction;\n const maxShiftY = containerHeight * maxContainerShiftFraction;\n\n const containerShiftX = Math.max(Math.min(rawContainerShiftX, maxShiftX), -maxShiftX);\n const containerShiftY = Math.max(Math.min(rawContainerShiftY, maxShiftY), -maxShiftY);\n\n // Title and subtitle shift calculations\n const maxTitleShift = containerWidth * 0.1;\n const titleRawShiftX = offsetX * 0.8;\n const titleShiftX = Math.max(Math.min(titleRawShiftX, maxTitleShift), -maxTitleShift);\n\n const maxSubtitleShift = containerWidth * 0.15;\n const subtitleShiftX = Math.max(Math.min(offsetX, maxSubtitleShift), -maxSubtitleShift);\n\n return {\n containerShiftX,\n containerShiftY,\n titleShiftX,\n subtitleShiftX,\n centerX,\n centerY\n };\n } catch (error) {\n logError('calculateTiltValues', error);\n\n // Return safe default values\n return {\n containerShiftX: 0,\n containerShiftY: 0,\n titleShiftX: 0,\n subtitleShiftX: 0,\n centerX: sliderElement?.clientWidth / 2 || 0,\n centerY: sliderElement?.clientHeight / 2 || 0\n };\n }\n };\n\n /**\n * Apply tilt effect with comprehensive error handling and resource tracking\n */\n const applyTiltEffect = (tiltValues: ReturnType<typeof calculateTiltValues>) => {\n try {\n // Check for cancellation\n if (cancellationRef.current.isCancelled) return;\n\n const activeTextContainer = textContainersRef.current[currentIndex.current];\n\n if (!activeTextContainer || activeTextContainer.children.length < 2) {\n return;\n }\n\n // Clear previous animations\n cleanupActiveTweens();\n\n // Create and track animations\n const createTrackedTween = (target: any, props: any) => {\n const tween = gsap.to(target, {\n ...props,\n onComplete: () => {\n // Re-track the object after animation\n if (resourceManager) {\n resourceManager.trackDisplayObject(target);\n }\n }\n });\n\n // Track the animation\n if (resourceManager) {\n resourceManager.trackAnimation(tween);\n }\n\n activeTweensRef.current.push(tween);\n return tween;\n };\n\n // Container animation\n createTrackedTween(activeTextContainer, {\n x: tiltValues.centerX + tiltValues.containerShiftX,\n y: tiltValues.centerY + tiltValues.containerShiftY,\n duration: 0.5,\n ease: \"expo.out\"\n });\n\n // Title animation\n if (activeTextContainer.children[0]) {\n createTrackedTween(activeTextContainer.children[0], {\n x: tiltValues.titleShiftX,\n duration: 0.5,\n ease: \"expo.out\"\n });\n }\n\n // Subtitle animation\n if (activeTextContainer.children[1]) {\n createTrackedTween(activeTextContainer.children[1], {\n x: tiltValues.subtitleShiftX,\n duration: 0.5,\n ease: \"expo.out\"\n });\n }\n\n // Mark as animating\n animationStateRef.current.isAnimating = true;\n } catch (error) {\n logError('applyTiltEffect', error);\n\n // Reset animation state on error\n animationStateRef.current.isAnimating = false;\n }\n };\n\n /**\n * Reset tilt effect with comprehensive cleanup\n */\n const resetTiltEffect = () => {\n try {\n // Check for cancellation\n if (cancellationRef.current.isCancelled) return;\n\n const activeContainer = textContainersRef.current[currentIndex.current];\n\n if (!activeContainer) return;\n\n // Clear previous animations\n cleanupActiveTweens();\n\n // Calculate center\n const centerX = sliderElement.clientWidth / 2;\n const centerY = sliderElement.clientHeight / 2;\n\n // Create reset animation function\n const createResetTween = (target: any, props: any) => {\n const tween = gsap.to(target, {\n ...props,\n duration: 1,\n ease: \"expo.inOut\",\n onComplete: () => {\n // Re-track object after animation\n if (resourceManager) {\n resourceManager.trackDisplayObject(target);\n }\n }\n });\n\n // Track animation\n if (resourceManager) {\n resourceManager.trackAnimation(tween);\n }\n\n activeTweensRef.current.push(tween);\n return tween;\n };\n\n // Container reset\n createResetTween(activeContainer, {\n x: centerX,\n y: centerY,\n onComplete: () => {\n animationStateRef.current.isAnimating = false;\n }\n });\n\n // Reset title\n if (activeContainer.children[0]) {\n createResetTween(activeContainer.children[0], { x: 0 });\n }\n\n // Reset subtitle\n if (activeContainer.children[1]) {\n createResetTween(activeContainer.children[1], { x: 0 });\n }\n\n // Reset filters if they exist\n const resetFilterTween = (filterRef: RefObject<DisplacementFilter | null>) => {\n if (filterRef.current) {\n const tween = gsap.to(filterRef.current.scale, {\n x: 0,\n y: 0,\n duration: 1,\n ease: \"expo.inOut\",\n onComplete: () => {\n if (resourceManager && filterRef.current) {\n resourceManager.trackFilter(filterRef.current);\n }\n }\n });\n\n if (resourceManager) {\n resourceManager.trackAnimation(tween);\n }\n\n activeTweensRef.current.push(tween);\n }\n };\n\n resetFilterTween(bgDispFilterRef);\n if (cursorImgEffect) {\n resetFilterTween(cursorDispFilterRef);\n }\n } catch (error) {\n logError('resetTiltEffect', error);\n\n // Ensure animation state is reset\n animationStateRef.current.isAnimating = false;\n }\n };\n\n /**\n * Throttled mouse move handler\n */\n const handleTextTilt = (e: MouseEvent) => {\n try {\n // Skip if cancelled\n if (cancellationRef.current.isCancelled) return;\n\n const now = Date.now();\n\n // Throttle check\n if (now - lastMoveTimeRef.current < throttleTime) {\n return;\n }\n\n // Update last move time\n lastMoveTimeRef.current = now;\n\n // Calculate tilt values\n const tiltValues = calculateTiltValues(e.clientX, e.clientY);\n\n // Apply tilt effect\n applyTiltEffect(tiltValues);\n\n // Clear existing timeout\n if (tiltTimeoutRef.current !== null) {\n if (resourceManager) {\n resourceManager.clearTimeout(tiltTimeoutRef.current);\n } else {\n clearTimeout(tiltTimeoutRef.current);\n }\n tiltTimeoutRef.current = null;\n }\n\n // Set reset timeout\n const setTimeoutFn = () => {\n resetTiltEffect();\n tiltTimeoutRef.current = null;\n };\n\n // Use ResourceManager for timeout if available\n if (resourceManager) {\n tiltTimeoutRef.current = resourceManager.setTimeout(setTimeoutFn, 300);\n } else {\n // Use type assertion since browser's setTimeout returns number while Node's returns Timeout\n tiltTimeoutRef.current = window.setTimeout(setTimeoutFn, 300) as unknown as ReturnType<typeof setTimeout>;\n }\n } catch (error) {\n logError('handleTextTilt', error);\n }\n };\n\n // Add event listener\n sliderElement.addEventListener(\"mousemove\", handleTextTilt, { passive: true });\n\n // Cleanup function\n return () => {\n // Set cancellation flag\n cancellationRef.current.isCancelled = true;\n\n // Remove event listener\n sliderElement.removeEventListener(\"mousemove\", handleTextTilt);\n\n // Clean up tweens\n cleanupActiveTweens();\n\n // Clear timeout\n if (tiltTimeoutRef.current !== null) {\n if (resourceManager) {\n resourceManager.clearTimeout(tiltTimeoutRef.current);\n } else {\n clearTimeout(tiltTimeoutRef.current);\n }\n tiltTimeoutRef.current = null;\n }\n };\n }, [\n sliderRef,\n textContainersRef,\n currentIndex,\n cursorTextEffect,\n maxContainerShiftFraction,\n bgDispFilterRef,\n cursorDispFilterRef,\n cursorImgEffect,\n resourceManager,\n throttleTime\n ]);\n};\n\nexport default useTextTilt;"],"names":["useRef","useEffect","gsap"],"mappings":";;;;;;;AASA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAiB,KAAmB,KAAA;AAItD,CAAA;AA+BA,MAAM,cAAc,CAAC;AAAA,EACI,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAe,GAAA;AACnB,CAAwB,KAAA;AAEzC,EAAM,MAAA,eAAA,GAAkBA,aAAe,CAAC,CAAA;AACxC,EAAM,MAAA,cAAA,GAAiBA,aAA6C,IAAI,CAAA;AACxE,EAAA,MAAM,oBAAoBA,YAAkB,CAAA;AAAA,IACxC,WAAa,EAAA,KAAA;AAAA,IACb,WAAa,EAAA,CAAA;AAAA,IACb,WAAa,EAAA;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,eAAkB,GAAAA,YAAA,CAA0B,EAAE,WAAA,EAAa,OAAO,CAAA;AACxE,EAAM,MAAA,eAAA,GAAkBA,YAA0B,CAAA,EAAE,CAAA;AAEpD,EAAAC,eAAA,CAAU,MAAM;AAEZ,IAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AAGnC,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,SAAA,CAAU,OAAS,EAAA;AAIzC,MAAA;AAAA;AAIJ,IAAA,eAAA,CAAgB,QAAQ,WAAc,GAAA,KAAA;AAEtC,IAAA,MAAM,gBAAgB,SAAU,CAAA,OAAA;AAKhC,IAAA,MAAM,sBAAsB,MAAM;AAC9B,MAAI,IAAA;AACA,QAAgB,eAAA,CAAA,OAAA,CAAQ,QAAQ,CAAS,KAAA,KAAA;AACrC,UAAI,IAAA,KAAA,IAAS,KAAM,CAAA,QAAA,EAAY,EAAA;AAC3B,YAAA,KAAA,CAAM,IAAK,EAAA;AAAA;AACf,SACH,CAAA;AACD,QAAA,eAAA,CAAgB,UAAU,EAAC;AAAA,eACtB,KAAO,EAAA;AACyB;AACzC,KACJ;AAKA,IAAM,MAAA,mBAAA,GAAsB,CAAC,MAAA,EAAgB,MAAmB,KAAA;AAC5D,MAAI,IAAA;AAEA,QAAA,IAAI,CAAC,aAAe,EAAA;AAChB,UAAA,QAAA,CAAS,uBAAuB,6BAA6B,CAAA;AAC7D,UAAO,OAAA;AAAA,YACH,eAAiB,EAAA,CAAA;AAAA,YACjB,eAAiB,EAAA,CAAA;AAAA,YACjB,WAAa,EAAA,CAAA;AAAA,YACb,cAAgB,EAAA,CAAA;AAAA,YAChB,OAAS,EAAA,CAAA;AAAA,YACT,OAAS,EAAA;AAAA,WACb;AAAA;AAGJ,QAAA,MAAM,iBAAiB,aAAc,CAAA,WAAA;AACrC,QAAA,MAAM,kBAAkB,aAAc,CAAA,YAAA;AAGtC,QAAI,IAAA,cAAA,IAAkB,CAAK,IAAA,eAAA,IAAmB,CAAG,EAAA;AAC7C,UAAA,QAAA,CAAS,uBAAuB,8BAA8B,CAAA;AAC9D,UAAO,OAAA;AAAA,YACH,eAAiB,EAAA,CAAA;AAAA,YACjB,eAAiB,EAAA,CAAA;AAAA,YACjB,WAAa,EAAA,CAAA;AAAA,YACb,cAAgB,EAAA,CAAA;AAAA,YAChB,OAAS,EAAA,CAAA;AAAA,YACT,OAAS,EAAA;AAAA,WACb;AAAA;AAGJ,QAAA,MAAM,UAAU,cAAiB,GAAA,CAAA;AACjC,QAAA,MAAM,UAAU,eAAkB,GAAA,CAAA;AAGlC,QAAA,MAAM,UAAU,OAAU,GAAA,MAAA;AAC1B,QAAA,MAAM,UAAU,OAAU,GAAA,MAAA;AAG1B,QAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,OAAA;AACxC,QAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,OAAA;AAGxC,QAAA,MAAM,qBAAqB,OAAU,GAAA,IAAA;AACrC,QAAA,MAAM,qBAAqB,OAAU,GAAA,GAAA;AACrC,QAAA,MAAM,YAAY,cAAiB,GAAA,yBAAA;AACnC,QAAA,MAAM,YAAY,eAAkB,GAAA,yBAAA;AAEpC,QAAM,MAAA,eAAA,GAAkB,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,kBAAoB,EAAA,SAAS,CAAG,EAAA,CAAC,SAAS,CAAA;AACpF,QAAM,MAAA,eAAA,GAAkB,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,kBAAoB,EAAA,SAAS,CAAG,EAAA,CAAC,SAAS,CAAA;AAGpF,QAAA,MAAM,gBAAgB,cAAiB,GAAA,GAAA;AACvC,QAAA,MAAM,iBAAiB,OAAU,GAAA,GAAA;AACjC,QAAM,MAAA,WAAA,GAAc,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,cAAgB,EAAA,aAAa,CAAG,EAAA,CAAC,aAAa,CAAA;AAEpF,QAAA,MAAM,mBAAmB,cAAiB,GAAA,IAAA;AAC1C,QAAM,MAAA,cAAA,GAAiB,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,OAAS,EAAA,gBAAgB,CAAG,EAAA,CAAC,gBAAgB,CAAA;AAEtF,QAAO,OAAA;AAAA,UACH,eAAA;AAAA,UACA,eAAA;AAAA,UACA,WAAA;AAAA,UACA,cAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACJ;AAAA,eACK,KAAO,EAAA;AAIZ,QAAO,OAAA;AAAA,UACH,eAAiB,EAAA,CAAA;AAAA,UACjB,eAAiB,EAAA,CAAA;AAAA,UACjB,WAAa,EAAA,CAAA;AAAA,UACb,cAAgB,EAAA,CAAA;AAAA,UAChB,OAAA,EAAS,aAAe,EAAA,WAAA,GAAc,CAAK,IAAA,CAAA;AAAA,UAC3C,OAAA,EAAS,aAAe,EAAA,YAAA,GAAe,CAAK,IAAA;AAAA,SAChD;AAAA;AACJ,KACJ;AAKA,IAAM,MAAA,eAAA,GAAkB,CAAC,UAAuD,KAAA;AAC5E,MAAI,IAAA;AAEA,QAAI,IAAA,eAAA,CAAgB,QAAQ,WAAa,EAAA;AAEzC,QAAA,MAAM,mBAAsB,GAAA,iBAAA,CAAkB,OAAQ,CAAA,YAAA,CAAa,OAAO,CAAA;AAE1E,QAAA,IAAI,CAAC,mBAAA,IAAuB,mBAAoB,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACjE,UAAA;AAAA;AAIJ,QAAoB,mBAAA,EAAA;AAGpB,QAAM,MAAA,kBAAA,GAAqB,CAAC,MAAA,EAAa,KAAe,KAAA;AACpD,UAAM,MAAA,KAAA,GAAQC,SAAK,CAAA,EAAA,CAAG,MAAQ,EAAA;AAAA,YAC1B,GAAG,KAAA;AAAA,YACH,YAAY,MAAM;AAEd,cAAA,IAAI,eAAiB,EAAA;AACjB,gBAAA,eAAA,CAAgB,mBAAmB,MAAM,CAAA;AAAA;AAC7C;AACJ,WACH,CAAA;AAGD,UAAA,IAAI,eAAiB,EAAA;AACjB,YAAA,eAAA,CAAgB,eAAe,KAAK,CAAA;AAAA;AAGxC,UAAgB,eAAA,CAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClC,UAAO,OAAA,KAAA;AAAA,SACX;AAGA,QAAA,kBAAA,CAAmB,mBAAqB,EAAA;AAAA,UACpC,CAAA,EAAG,UAAW,CAAA,OAAA,GAAU,UAAW,CAAA,eAAA;AAAA,UACnC,CAAA,EAAG,UAAW,CAAA,OAAA,GAAU,UAAW,CAAA,eAAA;AAAA,UACnC,QAAU,EAAA,GAAA;AAAA,UACV,IAAM,EAAA;AAAA,SACT,CAAA;AAGD,QAAI,IAAA,mBAAA,CAAoB,QAAS,CAAA,CAAC,CAAG,EAAA;AACjC,UAAmB,kBAAA,CAAA,mBAAA,CAAoB,QAAS,CAAA,CAAC,CAAG,EAAA;AAAA,YAChD,GAAG,UAAW,CAAA,WAAA;AAAA,YACd,QAAU,EAAA,GAAA;AAAA,YACV,IAAM,EAAA;AAAA,WACT,CAAA;AAAA;AAIL,QAAI,IAAA,mBAAA,CAAoB,QAAS,CAAA,CAAC,CAAG,EAAA;AACjC,UAAmB,kBAAA,CAAA,mBAAA,CAAoB,QAAS,CAAA,CAAC,CAAG,EAAA;AAAA,YAChD,GAAG,UAAW,CAAA,cAAA;AAAA,YACd,QAAU,EAAA,GAAA;AAAA,YACV,IAAM,EAAA;AAAA,WACT,CAAA;AAAA;AAIL,QAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,IAAA;AAAA,eACnC,KAAO,EAAA;AAIZ,QAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,KAAA;AAAA;AAC5C,KACJ;AAKA,IAAA,MAAM,kBAAkB,MAAM;AAC1B,MAAI,IAAA;AAEA,QAAI,IAAA,eAAA,CAAgB,QAAQ,WAAa,EAAA;AAEzC,QAAA,MAAM,eAAkB,GAAA,iBAAA,CAAkB,OAAQ,CAAA,YAAA,CAAa,OAAO,CAAA;AAEtE,QAAA,IAAI,CAAC,eAAiB,EAAA;AAGtB,QAAoB,mBAAA,EAAA;AAGpB,QAAM,MAAA,OAAA,GAAU,cAAc,WAAc,GAAA,CAAA;AAC5C,QAAM,MAAA,OAAA,GAAU,cAAc,YAAe,GAAA,CAAA;AAG7C,QAAM,MAAA,gBAAA,GAAmB,CAAC,MAAA,EAAa,KAAe,KAAA;AAClD,UAAM,MAAA,KAAA,GAAQA,SAAK,CAAA,EAAA,CAAG,MAAQ,EAAA;AAAA,YAC1B,GAAG,KAAA;AAAA,YACH,QAAU,EAAA,CAAA;AAAA,YACV,IAAM,EAAA,YAAA;AAAA,YACN,YAAY,MAAM;AAEd,cAAA,IAAI,eAAiB,EAAA;AACjB,gBAAA,eAAA,CAAgB,mBAAmB,MAAM,CAAA;AAAA;AAC7C;AACJ,WACH,CAAA;AAGD,UAAA,IAAI,eAAiB,EAAA;AACjB,YAAA,eAAA,CAAgB,eAAe,KAAK,CAAA;AAAA;AAGxC,UAAgB,eAAA,CAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClC,UAAO,OAAA,KAAA;AAAA,SACX;AAGA,QAAA,gBAAA,CAAiB,eAAiB,EAAA;AAAA,UAC9B,CAAG,EAAA,OAAA;AAAA,UACH,CAAG,EAAA,OAAA;AAAA,UACH,YAAY,MAAM;AACd,YAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,KAAA;AAAA;AAC5C,SACH,CAAA;AAGD,QAAI,IAAA,eAAA,CAAgB,QAAS,CAAA,CAAC,CAAG,EAAA;AAC7B,UAAA,gBAAA,CAAiB,gBAAgB,QAAS,CAAA,CAAC,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA;AAI1D,QAAI,IAAA,eAAA,CAAgB,QAAS,CAAA,CAAC,CAAG,EAAA;AAC7B,UAAA,gBAAA,CAAiB,gBAAgB,QAAS,CAAA,CAAC,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA;AAI1D,QAAM,MAAA,gBAAA,GAAmB,CAAC,SAAoD,KAAA;AAC1E,UAAA,IAAI,UAAU,OAAS,EAAA;AACnB,YAAA,MAAM,KAAQ,GAAAA,SAAA,CAAK,EAAG,CAAA,SAAA,CAAU,QAAQ,KAAO,EAAA;AAAA,cAC3C,CAAG,EAAA,CAAA;AAAA,cACH,CAAG,EAAA,CAAA;AAAA,cACH,QAAU,EAAA,CAAA;AAAA,cACV,IAAM,EAAA,YAAA;AAAA,cACN,YAAY,MAAM;AACd,gBAAI,IAAA,eAAA,IAAmB,UAAU,OAAS,EAAA;AACtC,kBAAgB,eAAA,CAAA,WAAA,CAAY,UAAU,OAAO,CAAA;AAAA;AACjD;AACJ,aACH,CAAA;AAED,YAAA,IAAI,eAAiB,EAAA;AACjB,cAAA,eAAA,CAAgB,eAAe,KAAK,CAAA;AAAA;AAGxC,YAAgB,eAAA,CAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA;AACtC,SACJ;AAEA,QAAA,gBAAA,CAAiB,eAAe,CAAA;AAChC,QAAA,IAAI,eAAiB,EAAA;AACjB,UAAA,gBAAA,CAAiB,mBAAmB,CAAA;AAAA;AACxC,eACK,KAAO,EAAA;AAIZ,QAAA,iBAAA,CAAkB,QAAQ,WAAc,GAAA,KAAA;AAAA;AAC5C,KACJ;AAKA,IAAM,MAAA,cAAA,GAAiB,CAAC,CAAkB,KAAA;AACtC,MAAI,IAAA;AAEA,QAAI,IAAA,eAAA,CAAgB,QAAQ,WAAa,EAAA;AAEzC,QAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA;AAGrB,QAAI,IAAA,GAAA,GAAM,eAAgB,CAAA,OAAA,GAAU,YAAc,EAAA;AAC9C,UAAA;AAAA;AAIJ,QAAA,eAAA,CAAgB,OAAU,GAAA,GAAA;AAG1B,QAAA,MAAM,UAAa,GAAA,mBAAA,CAAoB,CAAE,CAAA,OAAA,EAAS,EAAE,OAAO,CAAA;AAG3D,QAAA,eAAA,CAAgB,UAAU,CAAA;AAG1B,QAAI,IAAA,cAAA,CAAe,YAAY,IAAM,EAAA;AACjC,UAAA,IAAI,eAAiB,EAAA;AACjB,YAAgB,eAAA,CAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,WAChD,MAAA;AACH,YAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA;AAEvC,UAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AAAA;AAI7B,QAAA,MAAM,eAAe,MAAM;AACvB,UAAgB,eAAA,EAAA;AAChB,UAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AAAA,SAC7B;AAGA,QAAA,IAAI,eAAiB,EAAA;AACjB,UAAA,cAAA,CAAe,OAAU,GAAA,eAAA,CAAgB,UAAW,CAAA,YAAA,EAAc,GAAG,CAAA;AAAA,SAClE,MAAA;AAEH,UAAA,cAAA,CAAe,OAAU,GAAA,MAAA,CAAO,UAAW,CAAA,YAAA,EAAc,GAAG,CAAA;AAAA;AAChE,eACK,KAAO,EAAA;AACoB;AACpC,KACJ;AAGA,IAAA,aAAA,CAAc,iBAAiB,WAAa,EAAA,cAAA,EAAgB,EAAE,OAAA,EAAS,MAAM,CAAA;AAG7E,IAAA,OAAO,MAAM;AAET,MAAA,eAAA,CAAgB,QAAQ,WAAc,GAAA,IAAA;AAGtC,MAAc,aAAA,CAAA,mBAAA,CAAoB,aAAa,cAAc,CAAA;AAG7D,MAAoB,mBAAA,EAAA;AAGpB,MAAI,IAAA,cAAA,CAAe,YAAY,IAAM,EAAA;AACjC,QAAA,IAAI,eAAiB,EAAA;AACjB,UAAgB,eAAA,CAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,SAChD,MAAA;AACH,UAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA;AAEvC,QAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AAAA;AAC7B,KACJ;AAAA,GACD,EAAA;AAAA,IACC,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACH,CAAA;AACL;;;;"}