@hua-labs/ui 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +55 -67
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
  3. package/dist/Section-BWzyshgX.d.mts +67 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -1
  5. package/dist/advanced-dashboard.d.mts +1 -1
  6. package/dist/advanced-dashboard.js +4 -4
  7. package/dist/advanced-dashboard.js.map +1 -1
  8. package/dist/advanced-dashboard.mjs +3 -3
  9. package/dist/advanced-dashboard.mjs.map +1 -1
  10. package/dist/advanced-emotion.js +1 -1
  11. package/dist/advanced-emotion.js.map +1 -1
  12. package/dist/advanced-emotion.mjs +1 -1
  13. package/dist/advanced-motion.d.mts +65 -1
  14. package/dist/advanced-motion.js +14 -14
  15. package/dist/advanced-motion.js.map +1 -1
  16. package/dist/advanced-motion.mjs +1 -1
  17. package/dist/advanced.d.mts +4 -4
  18. package/dist/advanced.js +16 -16
  19. package/dist/advanced.js.map +1 -1
  20. package/dist/advanced.mjs +3 -3
  21. package/dist/advanced.mjs.map +1 -1
  22. package/dist/chunk-3CCF7U3P.mjs +3 -0
  23. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
  24. package/dist/chunk-3GAUTZXQ.mjs +3 -0
  25. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
  26. package/dist/chunk-42RGFEL2.mjs +3 -0
  27. package/dist/chunk-42RGFEL2.mjs.map +1 -0
  28. package/dist/chunk-4NJE7D6X.mjs +3 -0
  29. package/dist/chunk-4NJE7D6X.mjs.map +1 -0
  30. package/dist/chunk-6HVJFEDA.mjs +3 -0
  31. package/dist/chunk-6HVJFEDA.mjs.map +1 -0
  32. package/dist/chunk-7OYT3QSY.mjs +3 -0
  33. package/dist/chunk-7OYT3QSY.mjs.map +1 -0
  34. package/dist/chunk-ANYZ56VB.mjs +3 -0
  35. package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
  36. package/dist/chunk-AOSXB5JJ.mjs +4 -0
  37. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
  38. package/dist/chunk-B544MRF7.mjs +3 -0
  39. package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
  40. package/dist/chunk-CVWWS25A.mjs +3 -0
  41. package/dist/chunk-CVWWS25A.mjs.map +1 -0
  42. package/dist/chunk-DYNBM24D.mjs +3 -0
  43. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
  44. package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
  45. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
  46. package/dist/chunk-IJSYSNM5.mjs +3 -0
  47. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
  48. package/dist/chunk-KJZGOL2Z.mjs +3 -0
  49. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
  50. package/dist/chunk-KYRIUUQP.mjs +3 -0
  51. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
  52. package/dist/chunk-LSA7DU3N.mjs +73 -0
  53. package/dist/chunk-LSA7DU3N.mjs.map +1 -0
  54. package/dist/chunk-MDLCJASB.mjs +3 -0
  55. package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
  56. package/dist/chunk-N56BUOCD.mjs +3 -0
  57. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
  58. package/dist/chunk-OFYITQXI.mjs +13 -0
  59. package/dist/chunk-OFYITQXI.mjs.map +1 -0
  60. package/dist/chunk-OZNST3EZ.mjs +3 -0
  61. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
  62. package/dist/chunk-RS6RKW5U.mjs +13 -0
  63. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
  64. package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
  65. package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
  66. package/dist/chunk-TZ4YSHMC.mjs +3 -0
  67. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
  68. package/dist/chunk-U6CTBZ2U.mjs +3 -0
  69. package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
  70. package/dist/{chunk-PYBYZVSL.mjs → chunk-WP7VFE77.mjs} +2 -2
  71. package/dist/{chunk-PYBYZVSL.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
  72. package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
  73. package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
  74. package/dist/chunk-XGHT7WMO.mjs +3 -0
  75. package/dist/chunk-XGHT7WMO.mjs.map +1 -0
  76. package/dist/chunk-XL4KTJ4L.mjs +3 -0
  77. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
  78. package/dist/chunk-Z74YUUVT.mjs +3 -0
  79. package/dist/chunk-Z74YUUVT.mjs.map +1 -0
  80. package/dist/chunk-ZXZIHU7J.mjs +8 -0
  81. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
  82. package/dist/components/Card.d.ts.map +1 -1
  83. package/dist/components/DatePicker.d.ts.map +1 -1
  84. package/dist/components/Modal.d.ts.map +1 -1
  85. package/dist/components/Popover.d.ts +2 -0
  86. package/dist/components/Popover.d.ts.map +1 -1
  87. package/dist/components/Progress.d.ts +1 -0
  88. package/dist/components/Progress.d.ts.map +1 -1
  89. package/dist/components/Section.d.ts +44 -0
  90. package/dist/components/Section.d.ts.map +1 -0
  91. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  92. package/dist/components/advanced/DotNav.d.ts +26 -0
  93. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  94. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  95. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  96. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  97. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  98. package/dist/components/advanced/index.d.ts +6 -0
  99. package/dist/components/advanced/index.d.ts.map +1 -1
  100. package/dist/data.mjs +2 -2
  101. package/dist/data.mjs.map +1 -1
  102. package/dist/feedback.mjs +1 -1
  103. package/dist/form.js +3 -3
  104. package/dist/form.js.map +1 -1
  105. package/dist/form.mjs +4 -4
  106. package/dist/form.mjs.map +1 -1
  107. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
  108. package/dist/iconsax-extended.js +1 -1
  109. package/dist/iconsax-extended.js.map +1 -1
  110. package/dist/iconsax-extended.mjs +1 -1
  111. package/dist/iconsax-extended.mjs.map +1 -1
  112. package/dist/index.d.mts +9 -27
  113. package/dist/index.d.ts +4 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +6 -6
  116. package/dist/index.js.map +1 -1
  117. package/dist/index.mjs +2 -2
  118. package/dist/index.mjs.map +1 -1
  119. package/dist/interactive.js +1 -1
  120. package/dist/interactive.js.map +1 -1
  121. package/dist/interactive.mjs +1 -1
  122. package/dist/interactive.mjs.map +1 -1
  123. package/dist/landing/LandingAbout.d.ts +3 -0
  124. package/dist/landing/LandingAbout.d.ts.map +1 -0
  125. package/dist/landing/LandingCTA.d.ts +3 -0
  126. package/dist/landing/LandingCTA.d.ts.map +1 -0
  127. package/dist/landing/LandingContact.d.ts +3 -0
  128. package/dist/landing/LandingContact.d.ts.map +1 -0
  129. package/dist/landing/LandingExperience.d.ts +3 -0
  130. package/dist/landing/LandingExperience.d.ts.map +1 -0
  131. package/dist/landing/LandingFeatures.d.ts +3 -0
  132. package/dist/landing/LandingFeatures.d.ts.map +1 -0
  133. package/dist/landing/LandingHero.d.ts +3 -0
  134. package/dist/landing/LandingHero.d.ts.map +1 -0
  135. package/dist/landing/LandingLogoCloud.d.ts +3 -0
  136. package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
  137. package/dist/landing/LandingMetrics.d.ts +3 -0
  138. package/dist/landing/LandingMetrics.d.ts.map +1 -0
  139. package/dist/landing/LandingProjects.d.ts +3 -0
  140. package/dist/landing/LandingProjects.d.ts.map +1 -0
  141. package/dist/landing/LandingProvider.d.ts +4 -0
  142. package/dist/landing/LandingProvider.d.ts.map +1 -0
  143. package/dist/landing/LandingShowcase.d.ts +3 -0
  144. package/dist/landing/LandingShowcase.d.ts.map +1 -0
  145. package/dist/landing/LandingSkills.d.ts +3 -0
  146. package/dist/landing/LandingSkills.d.ts.map +1 -0
  147. package/dist/landing/LandingStats.d.ts +3 -0
  148. package/dist/landing/LandingStats.d.ts.map +1 -0
  149. package/dist/landing/LandingTestimonials.d.ts +3 -0
  150. package/dist/landing/LandingTestimonials.d.ts.map +1 -0
  151. package/dist/landing/index.d.ts +47 -0
  152. package/dist/landing/index.d.ts.map +1 -0
  153. package/dist/landing/themes/app.d.ts +3 -0
  154. package/dist/landing/themes/app.d.ts.map +1 -0
  155. package/dist/landing/themes/corporate.d.ts +3 -0
  156. package/dist/landing/themes/corporate.d.ts.map +1 -0
  157. package/dist/landing/themes/dashboard.d.ts +3 -0
  158. package/dist/landing/themes/dashboard.d.ts.map +1 -0
  159. package/dist/landing/themes/immersive.d.ts +3 -0
  160. package/dist/landing/themes/immersive.d.ts.map +1 -0
  161. package/dist/landing/themes/index.d.ts +15 -0
  162. package/dist/landing/themes/index.d.ts.map +1 -0
  163. package/dist/landing/themes/marketing.d.ts +3 -0
  164. package/dist/landing/themes/marketing.d.ts.map +1 -0
  165. package/dist/landing/themes/portfolio.d.ts +3 -0
  166. package/dist/landing/themes/portfolio.d.ts.map +1 -0
  167. package/dist/landing/themes/product.d.ts +3 -0
  168. package/dist/landing/themes/product.d.ts.map +1 -0
  169. package/dist/landing/types.d.ts +346 -0
  170. package/dist/landing/types.d.ts.map +1 -0
  171. package/dist/landing.d.mts +417 -0
  172. package/dist/landing.js +100 -0
  173. package/dist/landing.js.map +1 -0
  174. package/dist/landing.mjs +31 -0
  175. package/dist/landing.mjs.map +1 -0
  176. package/dist/lib/icons.d.ts +6 -1
  177. package/dist/lib/icons.d.ts.map +1 -1
  178. package/dist/navigation.d.mts +1 -1
  179. package/dist/navigation.js +2 -2
  180. package/dist/navigation.js.map +1 -1
  181. package/dist/navigation.mjs +1 -1
  182. package/dist/navigation.mjs.map +1 -1
  183. package/dist/overlay.d.mts +2 -0
  184. package/dist/overlay.js +1 -1
  185. package/dist/overlay.js.map +1 -1
  186. package/dist/overlay.mjs +1 -1
  187. package/dist/overlay.mjs.map +1 -1
  188. package/dist/sdui.js +4 -4
  189. package/dist/sdui.js.map +1 -1
  190. package/dist/sdui.mjs +1 -1
  191. package/dist/sdui.mjs.map +1 -1
  192. package/package.json +16 -10
  193. package/src/styles/landing.css +107 -0
  194. package/src/styles/utilities.css +58 -0
  195. package/dist/chunk-6KTHJ3EL.mjs +0 -13
  196. package/dist/chunk-BXX2TZUB.mjs +0 -3
  197. package/dist/chunk-BXX2TZUB.mjs.map +0 -1
  198. package/dist/chunk-COR6CDMA.mjs +0 -83
  199. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  200. package/dist/chunk-GLZKT7JN.mjs +0 -4
  201. package/dist/chunk-HN5LSP6L.mjs +0 -3
  202. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  203. package/dist/chunk-IFSEJVOR.mjs +0 -3
  204. package/dist/chunk-IN7RWQCJ.mjs +0 -3
  205. package/dist/chunk-LH77I6HO.mjs +0 -3
  206. package/dist/chunk-LOYAJIWO.mjs +0 -3
  207. package/dist/chunk-LPAG7DCA.mjs +0 -3
  208. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  209. package/dist/chunk-N7M6RIN4.mjs +0 -8
  210. package/dist/chunk-OSCMSA2Q.mjs +0 -3
  211. package/dist/chunk-PAEKNQWW.mjs +0 -3
  212. package/dist/chunk-QQCELXFD.mjs +0 -3
  213. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  214. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  215. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  216. package/dist/chunk-SGEP3CQE.mjs +0 -3
  217. package/dist/chunk-UUHAXGMO.mjs +0 -3
  218. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  219. package/dist/chunk-UWHCM3S6.mjs +0 -3
  220. package/dist/chunk-VWSBJUNI.mjs +0 -3
  221. package/dist/chunk-X7ZIWYRC.mjs +0 -3
  222. package/dist/chunk-XV3Y7QVU.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts","../src/components/advanced/Parallax.tsx","../src/components/advanced/Marquee.tsx","../src/components/advanced/GlowCard.tsx","../src/components/advanced/SpotlightCard.tsx","../src/components/advanced/TextReveal.tsx","../src/components/advanced/AnimatedGradient.tsx","../src/components/advanced/TiltCard.tsx","../src/components/advanced/VideoBackground.tsx","../src/components/advanced/Carousel.tsx","../src/components/advanced/emotion/EmotionMeter.tsx","../src/components/advanced/emotion/EmotionButton.tsx","../src/components/advanced/emotion/EmotionSelector.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/advanced/emotion/EmotionAnalysis.tsx","../src/components/advanced/blog-editor/utils/slug.ts","../src/components/advanced/blog-editor/BlogEditorContext.tsx","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/advanced/blog-editor/BlogEditorHeader.tsx","../src/components/advanced/blog-editor/BlogEditorMetadata.tsx","../src/components/advanced/blog-editor/BlogEditorLanguageTabs.tsx","../src/components/advanced/blog-editor/BlogEditorContent.tsx","../src/components/advanced/blog-editor/utils/markdown.ts","../src/components/advanced/blog-editor/BlogEditorToolbar.tsx","../src/components/advanced/blog-editor/BlogEditorPreview.tsx","../src/components/advanced/blog-editor/BlogEditorActions.tsx","../src/components/advanced/blog-editor/BlogEditorTranslate.tsx","../src/components/advanced/blog-editor/BlogEditor.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","AdvancedPageTransition","React","children","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressClassName","ref","isVisible","setIsVisible","useState","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","useCallback","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","jsx","FadePageTransition","props","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","_a","config","prev","start","resolve","finalConfig","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","_enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","data","updateStats","newTransition","newHistory","total","average","sum","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","id","transition","pauseAll","resumeAll","_id","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus","activeTransitions","Parallax","speed","direction","offset","disabled","scale","opacity","rotate","rotateDirection","style","innerRef","transform","setTransform","prefersReducedMotion","useReducedMotion","updateTransform","element","rect","windowHeight","elementCenter","movement","x","y","scaleValue","opacityValue","rotateValue","handleScroll","combinedStyle","mergeRefs","setPrefersReducedMotion","mediaQuery","handleChange","e","refs","value","Marquee","pauseOnHover","pauseOnClick","gap","gradient","gradientColor","gradientWidth","containerRef","contentWidth","setContentWidth","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","container","firstChild","updateSize","resizeObserver","animationStyle","gradientStyle","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","handleMouseMove","glowStyle","borderStyle","SpotlightCard","spotlightColor","spotlightSize","gradientFrom","gradientTo","spotlightStyle","gradientOverlayStyle","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","updateProgress","end","newProgress","renderText","chars","char","index","charProgress","isRevealed","words","word","wordProgress","defaultColors","AnimatedGradient","colors","blur","blurAmount","mounted","setMounted","shouldAnimate","renderGradient","Fragment","color","angle","TiltCard","maxTilt","perspective","glare","maxGlare","glarePosition","setGlarePosition","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","VideoBackground","src","poster","autoPlay","loop","muted","controls","objectFit","overlay","overlayColor","gradientDirection","playbackRate","fadeIn","videoRef","isLoaded","setIsLoaded","isPlaying","setIsPlaying","handleLoadedData","handlePlaying","getYouTubeUrl","videoId","params","getVimeoUrl","renderVideo","objectFitClass","renderGradientOverlay","gradients","hasPositionClass","Carousel","interval","indicators","indicatorPosition","showArrows","arrowPosition","transitionDuration","onSlideChange","showPlayPause","playPausePosition","getInitialIndex","currentIndex","setCurrentIndex","isManuallyPaused","setIsManuallyPaused","isTransitioning","noTransition","setNoTransition","touchStart","setTouchStart","touchEnd","setTouchEnd","slideCount","getActualIndex","goToSlide","newIndex","actualIndex","nextSlide","prevSlide","togglePlayPause","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleKeyDown","renderSlides","child","childArray","renderIndicators","isInside","isTop","indicatorContainerClass","handleIndicatorClick","_","isActive","renderPlayPause","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseClass","prevPosition","nextPosition","ChevronLeft","ChevronRight","EmotionMeter","max","size","sizeClasses","emotionColors","percentage","EmotionButton","emotion","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","layout","showIntensity","intensity","onIntensityChange","emotions","variant","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","cardVariants","cva","Card","shadow","padding","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","Badge","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","getIntensityLabel","getPositivityLabel","getEnergyLabel","keyword","item","generateSlug","title","isValidSlug","slug","normalizeSlug","input","DEFAULT_LABELS","DEFAULT_FEATURES","DEFAULT_LANGUAGES","createEmptyMultilingualField","languages","field","lang","createInitialData","initialData","_b","_c","_d","_e","_f","_g","_h","BlogEditorContext","createContext","useBlogEditor","context","useContext","BlogEditorProvider","isEditMode","defaultLanguage","userLabels","callbacks","userFeatures","autoSaveKey","autoSaveInterval","primaryLanguage","l","initialLanguage","labels","useMemo","features","formData","setFormData","activeLanguage","setActiveLanguage","showPreview","setShowPreview","submitting","setSubmitting","translating","setTranslating","uploading","setUploading","error","setError","translateSuccess","setTranslateSuccess","slugManuallyEdited","setSlugManuallyEdited","autoSaveStatus","setAutoSaveStatus","autoSaveTimerRef","isInitialMount","storageKey","saved","parsed","clearAutoSave","updateField","updateMultilingualField","language","handleSave","publish","primaryTitle","primaryContent","handleTranslate","primaryExcerpt","translations","newTitle","newContent","newExcerpt","langKey","translation","trans","handleUploadImage","file","handleCancel","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","useIconContext","IconComponent","name","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","BlogEditorHeader","onBack","backLink","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","containerClasses","inputClasses","labelClasses","addTag","tag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","part","idx","handleTagKeyDown","url","BlogEditorLanguageTabs","isPrimary","BlogEditorContent","textareaRef","isPrimaryLanguage","currentLang","handleTitleChange","getLangLabel","baseLabel","escapeHtml","parseMarkdown","html","code","stripMarkdown","getMarkdownPreview","maxLength","stripped","insertMarkdown","selectionStart","selectionEnd","before","after","selectedText","beforeText","afterText","newText","cursorPosition","TOOLBAR_ITEMS","BlogEditorToolbar","handleInsert","textarea","currentContent","BlogEditorPreview","renderMarkdown","content","renderedContent","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerClasses","BlogEditor","BlogEditorCompound"],"mappings":"qWAiBO,SAASA,CAAAA,CAAAA,GAASC,CAAAA,CAAsB,CAC7C,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CA+EO,SAASG,EAAAA,CAASC,CAAAA,CAAsD,CAC7E,IAAMC,CAAAA,CAAU,MAAA,CAAO,OAAA,CAAQD,CAAQ,CAAA,CACpC,MAAA,CAAO,CAAC,EAAGE,CAAS,CAAA,GAAMA,CAAS,CAAA,CACnC,IAAI,CAAC,CAACC,CAAS,CAAA,GAAMA,CAAS,CAAA,CAEjC,OAAOR,CAAAA,CAAM,GAAGM,CAAO,CACzB,KC/DaG,EAAAA,CAAyBC,mBAAAA,CAAM,UAAA,CAAwD,CAAC,CACnG,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAH,CAAAA,CACA,IAAA,CAAAI,CAAAA,CAAO,MAAA,CACP,QAAA,CAAAC,EAAW,GAAA,CACX,MAAA,CAAAC,CAAAA,CAAS,QAAA,CACT,MAAAC,CAAAA,CAAQ,CAAA,CACR,SAAA,CAAAC,CAAAA,CAAY,KACZ,OAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CAAe,KAAA,CACf,iBAAA,CAAAC,CACF,CAAA,CAAGC,CAAAA,GAAQ,CACT,GAAM,CAACC,CAAAA,CAAWC,CAAY,CAAA,CAAIC,WAAAA,CAAS,KAAK,CAAA,CAC1C,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAIF,WAAAA,CAAS,CAAC,CAAA,CACpC,CAACG,CAAAA,CAAkBC,CAAkB,CAAA,CAAIJ,WAAAA,CAAS,KAAK,CAAA,CACvDK,CAAAA,CAAeC,SAAAA,CAAsB,IAAI,EACzCC,CAAAA,CAAeD,SAAAA,CAAsB,IAAI,CAAA,CAEzCE,EAAqBC,CAAAA,EAAAA,CACD,CACtB,MAAA,CAASC,CAAAA,EAAcA,EACvB,SAAA,CAAYA,CAAAA,EAAcA,CAAAA,CAAIA,CAAAA,CAC9B,WAAaA,CAAAA,EAAc,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAIA,CAAAA,CAAG,CAAC,CAAA,CAChD,aAAA,CAAgBA,CAAAA,EAAcA,CAAAA,CAAI,EAAA,CAAM,CAAA,CAAIA,EAAIA,CAAAA,CAAI,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAKA,CAAAA,CAAI,CAAA,CAAG,CAAC,CAAA,CAAI,EAClF,MAAA,CAASA,CAAAA,EACHA,CAAAA,CAAI,kBAAA,CAAiB,MAAA,CAASA,CAAAA,CAAIA,CAAAA,CAClCA,CAAAA,CAAI,kBAAiB,MAAA,EAAUA,CAAAA,EAAK,iBAAA,CAAA,CAAcA,CAAAA,CAAI,IACtDA,CAAAA,CAAI,iBAAA,CAAmB,MAAA,EAAUA,CAAAA,EAAK,mBAAeA,CAAAA,CAAI,KAAA,CACtD,MAAA,EAAUA,CAAAA,EAAK,iBAAA,CAAA,CAAgBA,CAAAA,CAAI,OAAA,CAE5C,OAAA,CAAUA,GACD,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,GAAA,CAAMA,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKA,CAAAA,CAAI,OAAU,CAAA,CAAI,IAAA,CAAK,EAAA,CAAA,CAAM,EAAG,EAAI,CAAA,CAE9E,MAAA,CAASA,CAAAA,EACAA,CAAAA,CAAIA,GAAK,CAAA,CAAI,CAAA,CAAIA,CAAAA,CAE5B,CAAA,EACuBD,CAAU,CAAA,CAG7BE,CAAAA,CAAUC,cAAAA,CAAaC,CAAAA,EAAsB,CAC5CN,CAAAA,CAAa,OAAA,GAChBA,CAAAA,CAAa,OAAA,CAAUM,CAAAA,CAAAA,CAGzB,IAAMC,CAAAA,CAAUD,CAAAA,CAAYN,EAAa,OAAA,CACnCQ,CAAAA,CAAiBP,CAAAA,CAAkBlB,CAAM,EAE3C0B,CAAAA,CAAkB,IAAA,CAAK,GAAA,CAAIF,CAAAA,CAAUzB,EAAU,CAAC,CAAA,CACpD2B,CAAAA,CAAkBD,CAAAA,CAAeC,CAAe,CAAA,CAEhDd,CAAAA,CAAYc,CAAe,EAC3BjB,CAAAA,CAAaiB,CAAAA,CAAkB,EAAG,CAAA,CAE9BA,EAAkB,CAAA,CACpBX,CAAAA,CAAa,OAAA,CAAU,qBAAA,CAAuBK,GAAMC,CAAAA,CAAQD,CAAC,CAAC,CAAA,EAE9DN,CAAAA,CAAmB,KAAK,CAAA,CACxBF,CAAAA,CAAY,CAAC,CAAA,CACbR,CAAAA,EAAA,IAAA,EAAAA,CAAAA,EAAAA,EAEJ,EAAG,CAACL,CAAAA,CAAUC,CAAAA,CAAQI,CAAU,CAAC,CAAA,CAE3BuB,CAAAA,CAAkBL,cAAAA,CAAY,IAAM,CACxCR,CAAAA,CAAmB,IAAI,CAAA,CACvBF,CAAAA,CAAY,CAAC,CAAA,CACbT,CAAAA,EAAA,IAAA,EAAAA,CAAAA,EAAAA,CAEAc,EAAa,OAAA,CAAU,IAAA,CACvBF,CAAAA,CAAa,OAAA,CAAU,sBAAsBM,CAAO,EACtD,CAAA,CAAG,CAACA,CAAAA,CAASlB,CAAO,CAAC,CAAA,CAErByB,aAAU,IAAM,CACd,GAAI1B,CAAAA,CAAW,CACb,IAAM2B,CAAAA,CAAQ,UAAA,CAAW,IAAM,CAC7BF,CAAAA,GACF,CAAA,CAAG1B,CAAK,CAAA,CAER,OAAO,IAAM,YAAA,CAAa4B,CAAK,CACjC,CACF,CAAA,CAAG,CAAC3B,EAAWD,CAAAA,CAAO0B,CAAe,CAAC,CAAA,CAEtCC,aAAU,IACD,IAAM,CACPb,CAAAA,CAAa,OAAA,EACf,oBAAA,CAAqBA,CAAAA,CAAa,OAAO,EAE7C,CAAA,CACC,EAAE,CAAA,CA8EL,IAAMe,CAAAA,CAAAA,CA5EsB,IAAM,CAChC,OAAQhC,GACN,KAAK,MAAA,CACH,OAAO,CACL,OAAA,CAASU,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,UAAW,MACb,CAAA,CAEF,KAAK,OAAA,CACH,OAAO,CACL,OAAA,CAASA,CAAAA,CAAY,CAAA,CAAI,EACzB,SAAA,CAAW,CAAA,WAAA,EAAA,CAAe,CAAA,CAAIG,CAAAA,EAAY,GAAG,CAAA,EAAA,CAC/C,CAAA,CAEF,KAAK,WACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,EAAI,CAAA,CACzB,SAAA,CAAW,CAAA,WAAA,EAAA,CAAe,CAAA,CAAIG,GAAY,GAAG,CAAA,EAAA,CAC/C,CAAA,CAEF,KAAK,YAAA,CACH,OAAO,CACL,OAAA,CAASH,EAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAW,CAAA,YAAA,EAAA,CAAgB,EAAIG,CAAAA,EAAY,GAAG,CAAA,EAAA,CAChD,CAAA,CAEF,KAAK,YAAA,CACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAW,gBAAgB,CAAA,CAAIG,CAAAA,EAAY,GAAG,CAAA,EAAA,CAChD,EAEF,KAAK,aAAA,CACH,OAAO,CACL,QAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAW,eAAe,CAAA,CAAIG,CAAAA,EAAY,GAAG,CAAA,EAAA,CAC/C,EAEF,KAAK,OAAA,CACH,OAAO,CACL,QAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAW,SAAS,EAAA,CAAMG,CAAAA,CAAW,EAAG,CAAA,CAAA,CAC1C,CAAA,CAEF,KAAK,MAAA,CACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,UAAW,CAAA,4BAAA,EAAA,CAAgC,CAAA,CAAIG,CAAAA,EAAY,EAAE,MAC/D,CAAA,CAEF,KAAK,OAAA,CACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,CAAA,CAAI,EACzB,SAAA,CAAW,CAAA,MAAA,EAAS,EAAA,CAAMG,CAAAA,CAAW,EAAG,CAAA,SAAA,EAAA,CAAa,CAAA,CAAIA,CAAAA,EAAY,CAAC,MACxE,CAAA,CAEF,KAAK,MAAA,CACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,CAAA,CAAI,EACzB,SAAA,CAAW,CAAA,4BAAA,EAAA,CAAgC,CAAA,CAAIG,CAAAA,EAAY,EAAE,CAAA,aAAA,EAAA,CAAiB,CAAA,CAAIA,CAAAA,EAAY,EAAE,MAClG,CAAA,CAEF,KAAK,MAAA,CACH,OAAO,CACL,OAAA,CAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,UAAW,CAAA,MAAA,EAAS,EAAA,CAAMG,CAAAA,CAAW,EAAG,GAC1C,CAAA,CAEF,QACE,OAAO,CACL,QAASH,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,SAAA,CAAW,MACb,CACJ,CACF,CAAA,IAIA,OACEuB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WACZ,QAAA,CAAA,CAAA1B,CAAAA,EACC0B,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAW7C,CAAAA,CACd,8EAAA,CACAoB,CACF,CAAA,CACE,QAAA,CAAA,CAAAyB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAsC,QAAA,CAAA,CAAA,YAAA,CACxC,IAAA,CAAK,KAAA,CAAMpB,CAAAA,CAAW,GAAG,CAAA,CAAE,GAAA,CAAA,CACxC,CAAA,CACAqB,cAAAA,CAAC,OAAI,SAAA,CAAU,qCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGrB,CAAAA,CAAW,GAAG,GAAI,CAAA,CACvC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGFqB,eAAC,KAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,EACT,sCAAA,CACAQ,CACF,CAAA,CACA,KAAA,CAAO,CACL,GAAGoC,CAAAA,CACH,kBAAA,CAAoB,CAAA,EAAG/B,CAAQ,CAAA,EAAA,CAAA,CAC/B,wBAAA,CAA0BC,CAAAA,GAAW,QAAA,CACjC,+BACAA,CAAAA,GAAW,QAAA,CACX,wCAAA,CACAA,CAAAA,GAAW,SAAA,CACX,yCAAA,CACAA,CACN,CAAA,CAEC,SAAAH,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAAC,EAEDF,EAAAA,CAAuB,WAAA,CAAc,wBAAA,CAG9B,IAAMsC,GAAqBrC,mBAAAA,CAAM,UAAA,CAAsE,CAACsC,CAAAA,CAAO3B,CAAAA,GACpHyB,cAAAA,CAACrC,EAAAA,CAAA,CAAuB,IAAKY,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,GAAG2B,EAAO,CAC1D,CAAA,CAEYC,EAAAA,CAAsBvC,mBAAAA,CAAM,WAAsE,CAACsC,CAAAA,CAAO3B,CAAAA,GACrHyB,cAAAA,CAACrC,EAAAA,CAAA,CAAuB,GAAA,CAAKY,CAAAA,CAAK,KAAK,OAAA,CAAS,GAAG2B,CAAAA,CAAO,CAC3D,EAEYE,EAAAA,CAAsBxC,mBAAAA,CAAM,UAAA,CAAsE,CAACsC,EAAO3B,CAAAA,GACrHyB,cAAAA,CAACrC,EAAAA,CAAA,CAAuB,IAAKY,CAAAA,CAAK,IAAA,CAAK,OAAA,CAAS,GAAG2B,EAAO,CAC3D,CAAA,CAEYG,EAAAA,CAAqBzC,mBAAAA,CAAM,WAAsE,CAACsC,CAAAA,CAAO3B,CAAAA,GACpHyB,cAAAA,CAACrC,GAAA,CAAuB,GAAA,CAAKY,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,GAAG2B,CAAAA,CAAO,CAC1D,EAEYI,EAAAA,CAAsB1C,mBAAAA,CAAM,UAAA,CAAsE,CAACsC,EAAO3B,CAAAA,GACrHyB,cAAAA,CAACrC,EAAAA,CAAA,CAAuB,IAAKY,CAAAA,CAAK,IAAA,CAAK,OAAA,CAAS,GAAG2B,CAAAA,CAAO,CAC3D,CAAA,CAEYK,EAAAA,CAAqB3C,oBAAM,UAAA,CAAsE,CAACsC,CAAAA,CAAO3B,CAAAA,GACpHyB,eAACrC,EAAAA,CAAA,CAAuB,GAAA,CAAKY,CAAAA,CAAK,KAAK,MAAA,CAAQ,GAAG2B,CAAAA,CAAO,CAC1D,CAAA,CAEYM,EAAAA,CAAqB5C,mBAAAA,CAAM,UAAA,CAAsE,CAACsC,CAAAA,CAAO3B,CAAAA,GACpHyB,cAAAA,CAACrC,EAAAA,CAAA,CAAuB,GAAA,CAAKY,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,GAAG2B,CAAAA,CAAO,CAC1D,EAGDD,EAAAA,CAAmB,YAAc,oBAAA,CACjCE,EAAAA,CAAoB,WAAA,CAAc,qBAAA,CAClCC,GAAoB,WAAA,CAAc,qBAAA,CAClCC,EAAAA,CAAmB,WAAA,CAAc,qBACjCC,EAAAA,CAAoB,WAAA,CAAc,qBAAA,CAClCC,EAAAA,CAAmB,YAAc,oBAAA,CACjCC,EAAAA,CAAmB,WAAA,CAAc,oBAAA,CC9O1B,IAAMC,EAAAA,CAAoB,CAC/BC,CAAAA,CAA2C,EAAC,GACM,CAClD,GAAM,CAACC,CAAAA,CAAOC,CAAQ,CAAA,CAAIlC,WAAAA,CAA8B,CACtD,eAAA,CAAiB,KAAA,CACjB,SAAA,CAAW,KAAA,CACX,YAAa,CAAA,CACb,QAAA,CAAU,CACZ,CAAC,EAEKK,CAAAA,CAAeC,SAAAA,CAAsB,IAAI,CAAA,CACzCC,CAAAA,CAAeD,SAAAA,CAAsB,IAAI,CAAA,CACzC6B,EAAY7B,SAAAA,CAAyB,CACzC,IAAA,CAAM,MAAA,CACN,SAAU,GAAA,CACV,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,EACP,OAAA,CAAS,CAAA,CACT,SAAA,CAAW,SAAA,CACX,GAAG0B,CACL,CAAC,CAAA,CAEKxB,CAAAA,CAAoBI,eAAatB,CAAAA,EAAAA,CACb,CACtB,MAAA,CAASoB,CAAAA,EAAcA,EACvB,SAAA,CAAYA,CAAAA,EAAcA,CAAAA,CAAIA,CAAAA,CAC9B,WAAaA,CAAAA,EAAc,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAIA,CAAAA,CAAG,CAAC,CAAA,CAChD,cAAgBA,CAAAA,EAAcA,CAAAA,CAAI,EAAA,CAAM,CAAA,CAAIA,EAAIA,CAAAA,CAAI,CAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAKA,CAAAA,CAAI,CAAA,CAAG,CAAC,CAAA,CAAI,CAAA,CAClF,MAAA,CAASA,CAAAA,EACHA,CAAAA,CAAI,mBAAiB,MAAA,CAASA,CAAAA,CAAIA,CAAAA,CAClCA,CAAAA,CAAI,kBAAiB,MAAA,EAAUA,CAAAA,EAAK,iBAAA,CAAA,CAAcA,CAAAA,CAAI,IACtDA,CAAAA,CAAI,iBAAA,CAAmB,MAAA,EAAUA,CAAAA,EAAK,iBAAA,CAAA,CAAeA,CAAAA,CAAI,KAAA,CACtD,MAAA,EAAUA,GAAK,iBAAA,CAAA,CAAgBA,CAAAA,CAAI,OAAA,CAE5C,OAAA,CAAUA,GACD,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,GAAA,CAAMA,CAAC,CAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKA,CAAAA,CAAI,OAAU,CAAA,CAAI,IAAA,CAAK,EAAA,CAAA,CAAM,EAAG,EAAI,CAAA,CAE9E,MAAA,CAASA,CAAAA,EACAA,CAAAA,CAAIA,GAAK,CAAA,CAAI,CAAA,CAAIA,CAAAA,CAE5B,CAAA,EACuBpB,CAAM,CAAA,CAC5B,EAAE,CAAA,CAECqB,CAAAA,CAAUC,cAAAA,CAAaC,CAAAA,EAAsB,CAjGrD,IAAAuB,CAAAA,CAkGS7B,CAAAA,CAAa,OAAA,GAChBA,CAAAA,CAAa,QAAUM,CAAAA,CAAAA,CAGzB,IAAMC,CAAAA,CAAUD,CAAAA,CAAYN,EAAa,OAAA,CACnC8B,CAAAA,CAASF,CAAAA,CAAU,OAAA,CACnB7C,CAAAA,CAASkB,CAAAA,CAAkB6B,CAAAA,CAAO,MAAM,EAE1CpC,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAIa,CAAAA,CAAUuB,EAAO,QAAA,CAAU,CAAC,CAAA,CACpDpC,CAAAA,CAAWX,EAAOW,CAAQ,CAAA,CAE1BiC,CAAAA,CAASI,CAAAA,GAAS,CAChB,GAAGA,CAAAA,CACH,QAAA,CAAArC,EACA,SAAA,CAAWoC,CAAAA,CAAO,SAAA,GAAc,SAAA,CAAYpC,EAAW,EAAA,CAAMA,CAAAA,CAAW,EAAA,CACxE,WAAA,CAAa,KAAK,KAAA,CAAMA,CAAAA,CAAW,EAAE,CACvC,EAAE,CAAA,CAEEA,CAAAA,CAAW,CAAA,CACbI,CAAAA,CAAa,QAAU,qBAAA,CAAsBM,CAAO,CAAA,EAEpDuB,CAAAA,CAASI,IAAS,CAChB,GAAGA,CAAAA,CACH,eAAA,CAAiB,MACjB,QAAA,CAAUD,CAAAA,CAAO,SAAA,GAAc,SAAA,CAAY,CAAA,CAAI,CACjD,CAAA,CAAE,CAAA,CAAA,CACFD,EAAAC,CAAAA,CAAO,UAAA,GAAP,IAAA,EAAAD,CAAAA,CAAA,KAAAC,CAAAA,CAAAA,EAEJ,CAAA,CAAG,CAAC7B,CAAiB,CAAC,CAAA,CAEhB+B,CAAAA,CAAQ3B,cAAAA,CAAY,MAAOyB,CAAAA,EACxB,IAAI,OAAA,CAAeG,CAAAA,EAAY,CAjI1C,IAAAJ,CAAAA,CAkIUC,CAAAA,GACFF,CAAAA,CAAU,QAAU,CAAE,GAAGA,CAAAA,CAAU,OAAA,CAAS,GAAGE,CAAO,CAAA,CAAA,CAGxD,IAAMI,CAAAA,CAAcN,CAAAA,CAAU,OAAA,CAC9BM,CAAAA,CAAY,UAAA,CAAa,IAAMD,CAAAA,EAAQ,CAEvCN,CAAAA,CAASI,CAAAA,GAAS,CAChB,GAAGA,CAAAA,CACH,eAAA,CAAiB,IAAA,CACjB,SAAUG,CAAAA,CAAY,SAAA,GAAc,SAAA,CAAY,CAAA,CAAI,CACtD,CAAA,CAAE,CAAA,CAEFlC,CAAAA,CAAa,OAAA,CAAU,MACvB6B,CAAAA,CAAAK,CAAAA,CAAY,OAAA,GAAZ,IAAA,EAAAL,EAAA,IAAA,CAAAK,CAAAA,CAAAA,CAEIA,CAAAA,CAAY,KAAA,CACd,WAAW,IAAM,CACfpC,CAAAA,CAAa,OAAA,CAAU,qBAAA,CAAsBM,CAAO,EACtD,CAAA,CAAG8B,EAAY,KAAK,CAAA,CAEpBpC,CAAAA,CAAa,OAAA,CAAU,sBAAsBM,CAAO,EAExD,CAAC,CAAA,CACA,CAACA,CAAO,CAAC,CAAA,CAEN+B,CAAAA,CAAU9B,cAAAA,CAAY,SACnB,IAAI,OAAA,CAAe4B,GAAY,CACpC,IAAMH,CAAAA,CAASF,CAAAA,CAAU,QACzBE,CAAAA,CAAO,SAAA,CAAY,UAAA,CACnBA,CAAAA,CAAO,WAAa,IAAMG,CAAAA,EAAQ,CAElCD,CAAAA,GACF,CAAC,CAAA,CACA,CAACA,CAAK,CAAC,CAAA,CAEJI,CAAAA,CAAQ/B,cAAAA,CAAY,IAAM,CAC1BP,CAAAA,CAAa,OAAA,EACf,oBAAA,CAAqBA,EAAa,OAAO,EAE7C,CAAA,CAAG,EAAE,CAAA,CAECuC,CAAAA,CAAShC,cAAAA,CAAY,IAAM,CAC3BqB,CAAAA,CAAM,eAAA,GACR5B,CAAAA,CAAa,OAAA,CAAU,sBAAsBM,CAAO,CAAA,EAExD,CAAA,CAAG,CAACsB,EAAM,eAAA,CAAiBtB,CAAO,CAAC,CAAA,CAE7BkC,CAAAA,CAAQjC,cAAAA,CAAY,IAAM,CAC1BP,EAAa,OAAA,EACf,oBAAA,CAAqBA,CAAAA,CAAa,OAAO,EAE3C6B,CAAAA,CAAS,CACP,eAAA,CAAiB,KAAA,CACjB,UAAW,KAAA,CACX,WAAA,CAAa,CAAA,CACb,QAAA,CAAU,CACZ,CAAC,EACH,CAAA,CAAG,EAAE,CAAA,CAEL,OAAAhB,YAAAA,CAAU,IACD,IAAM,CACPb,CAAAA,CAAa,OAAA,EACf,qBAAqBA,CAAAA,CAAa,OAAO,EAE7C,CAAA,CACC,EAAE,CAAA,CAEE,CAAC4B,EAAO,CAAE,KAAA,CAAAM,CAAAA,CAAO,OAAA,CAAAG,EAAS,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,CAAAA,CAAQ,MAAAC,CAAM,CAAC,CACzD,MC1JaC,EAAAA,CAA2B,CACtCT,CAAAA,CAAsC,KAC0B,CAChE,GAAM,CACJ,WAAA,CAAAU,CAAAA,CAAc,MAAA,CACd,eAAA,CAAAC,CAAAA,CAAkB,IAClB,aAAA,CAAAC,CAAAA,CAAgB,QAAA,CAChB,aAAA,CAAAC,EAAgB,IAAA,CAChB,cAAA,CAAgBC,CAAAA,CAAkB,IAAA,CAClC,YAAAC,CAAAA,CAAc,KAChB,CAAA,CAAIf,CAAAA,CAEE,CAACJ,CAAAA,CAAOC,CAAQ,CAAA,CAAIlC,YAAqC,CAC7D,eAAA,CAAiB,KAAA,CACjB,iBAAA,CAAmB,KACnB,iBAAA,CAAmB,EAAC,CACpB,gBAAA,CAAkB,EAClB,eAAA,CAAiB,CACnB,CAAC,CAAA,CAEKqD,CAAAA,CAAuB/C,SAAAA,CAAyE,IAAI,GAAK,EACzGgD,CAAAA,CAAuBhD,SAAAA,CAAO,CAAC,CAAA,CAE/BiD,EAAW3C,cAAAA,CAAY,CAAC4C,CAAAA,CAAiBC,CAAAA,GAAmB,CAC5DL,CAAAA,EAEF,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2BI,CAAO,CAAA,CAAA,CAAIC,CAAI,EAE1D,CAAA,CAAG,CAACL,CAAW,CAAC,CAAA,CAEVM,CAAAA,CAAc9C,eAAa+C,CAAAA,EAAuC,CACtEzB,CAAAA,CAASI,CAAAA,EAAQ,CACf,IAAMsB,CAAAA,CAAaV,CAAAA,CAAgB,CAAC,GAAGZ,CAAAA,CAAK,iBAAA,CAAmBqB,CAAa,EAAIrB,CAAAA,CAAK,iBAAA,CAC/EuB,CAAAA,CAAQD,CAAAA,CAAW,OACnBE,CAAAA,CAAUF,CAAAA,CAAW,MAAA,CAAO,CAACG,EAAKrD,CAAAA,GAAMqD,CAAAA,CAAMrD,CAAAA,CAAE,QAAA,CAAU,CAAC,CAAA,CAAImD,CAAAA,CAErE,OAAO,CACL,GAAGvB,CAAAA,CACH,gBAAA,CAAkBuB,CAAAA,CAClB,gBAAiBC,CAAAA,CACjB,iBAAA,CAAmBF,CACrB,CACF,CAAC,EACH,CAAA,CAAG,CAACV,CAAa,CAAC,CAAA,CAEZjC,CAAAA,CAAkBL,cAAAA,CAAY,MAAOyB,CAAAA,EAAuD,CAChG,IAAM2B,CAAAA,CAAe,cAAc,EAAEV,CAAAA,CAAqB,OAAO,CAAA,CAAA,CAC3DW,EAA+B,CACnC,IAAA,CAAMlB,CAAAA,CACN,QAAA,CAAUC,EACV,MAAA,CAAQC,CAAAA,CACR,GAAGZ,CACL,EAEM6B,CAAAA,CAAuC,CAC3C,EAAA,CAAIF,CAAAA,CACJ,KAAMC,CAAAA,CAAW,IAAA,CACjB,QAAA,CAAUA,CAAAA,CAAW,SACrB,MAAA,CAAQA,CAAAA,CAAW,MAAA,CACnB,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,MAAA,CAAQ,SACV,CAAA,CAEAV,CAAAA,CAAS,qBAAA,CAAuB,CAAE,GAAIS,CAAAA,CAAc,MAAA,CAAQC,CAAW,CAAC,EAExE/B,CAAAA,CAASI,CAAAA,GAAS,CAChB,GAAGA,CAAAA,CACH,eAAA,CAAiB,IAAA,CACjB,iBAAA,CAAmB4B,CACrB,CAAA,CAAE,CAAA,CAGF,IAAM/C,CAAAA,CAAQ,WAAW,IAAM,CArHnC,IAAAiB,CAAAA,CAsHM,IAAM+B,CAAAA,CAAsC,CAC1C,GAAGD,CAAAA,CACH,MAAA,CAAQ,WACV,CAAA,CAEAhC,CAAAA,CAASI,IAAS,CAChB,GAAGA,CAAAA,CACH,eAAA,CAAiB,MACjB,iBAAA,CAAmB,IACrB,CAAA,CAAE,CAAA,CAEFoB,EAAYS,CAAc,CAAA,CAC1Bd,CAAAA,CAAqB,OAAA,CAAQ,OAAOW,CAAY,CAAA,CAChDT,CAAAA,CAAS,sBAAA,CAAwB,CAAE,EAAA,CAAIS,CAAa,CAAC,CAAA,CAAA,CAErD5B,EAAA6B,CAAAA,CAAW,UAAA,GAAX,IAAA,EAAA7B,CAAAA,CAAA,KAAA6B,CAAAA,EACF,CAAA,CAAGA,CAAAA,CAAW,QAAQ,CAAA,CAEtB,OAAAZ,CAAAA,CAAqB,OAAA,CAAQ,IAAIW,CAAAA,CAAc,CAAE,KAAA,CAAA7C,CAAAA,CAAO,OAAQ8C,CAAW,CAAC,CAAA,CAG5E,UAAA,CAAW,IAAM,CACf/B,CAAAA,CAASI,CAAAA,GAAS,CAChB,GAAGA,CAAAA,CACH,iBAAA,CAAmB,CACjB,GAAGA,CAAAA,CAAK,iBAAA,CACR,MAAA,CAAQ,QACV,CACF,CAAA,CAAE,EACJ,CAAA,CAAG,EAAE,EAEE0B,CACT,CAAA,CAAG,CAACjB,CAAAA,CAAaC,CAAAA,CAAiBC,CAAAA,CAAeM,CAAAA,CAAUG,CAAW,CAAC,CAAA,CAEjEU,CAAAA,CAAmBxD,cAAAA,CAAayD,CAAAA,EAAe,CACnD,IAAMC,CAAAA,CAAajB,CAAAA,CAAqB,OAAA,CAAQ,IAAIgB,CAAE,CAAA,CAClDC,CAAAA,GACF,YAAA,CAAaA,EAAW,KAAK,CAAA,CAC7BjB,CAAAA,CAAqB,OAAA,CAAQ,OAAOgB,CAAE,CAAA,CAEtCnC,CAAAA,CAASI,CAAAA,EAAK,CA9JpB,IAAAF,CAAAA,CA8JwB,OAAA,CAChB,GAAGE,EACH,eAAA,CAAiBe,CAAAA,CAAqB,OAAA,CAAQ,IAAA,CAAO,CAAA,CACrD,iBAAA,CAAA,CAAA,CAAmBjB,CAAAA,CAAAE,CAAAA,CAAK,oBAAL,IAAA,CAAA,MAAA,CAAAF,CAAAA,CAAwB,EAAA,IAAOiC,CAAAA,CAAK,KAAO/B,CAAAA,CAAK,iBACrE,CAAA,CAAE,CAAA,CAEFiB,EAAS,sBAAA,CAAwB,CAAE,EAAA,CAAAc,CAAG,CAAC,CAAA,EAE3C,CAAA,CAAG,CAACd,CAAQ,CAAC,CAAA,CAEPgB,CAAAA,CAAW3D,cAAAA,CAAY,IAAM,CACjCyC,CAAAA,CAAqB,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAE,KAAA,CAAAlC,CAAM,CAAA,CAAGkD,CAAAA,GAAO,CACtD,YAAA,CAAalD,CAAK,EAClBoC,CAAAA,CAAS,mBAAA,CAAqB,CAAE,EAAA,CAAAc,CAAG,CAAC,EACtC,CAAC,EACH,EAAG,CAACd,CAAQ,CAAC,CAAA,CAEPiB,EAAY5D,cAAAA,CAAY,IAAM,CAClCyC,CAAAA,CAAqB,QAAQ,OAAA,CAAQ,CAAC,CAAE,MAAA,CAAAhB,CAAO,CAAA,CAAGoC,CAAAA,GAAQ,CACxDxD,CAAAA,CAAgBoB,CAAM,EACxB,CAAC,EACH,CAAA,CAAG,CAACpB,CAAe,CAAC,CAAA,CAEdyD,EAAe9D,cAAAA,CAAY,IAAM,CACrCsB,CAAAA,CAASI,IAAS,CAChB,GAAGA,CAAAA,CACH,iBAAA,CAAmB,EAAC,CACpB,gBAAA,CAAkB,CAAA,CAClB,eAAA,CAAiB,CACnB,CAAA,CAAE,CAAA,CACFiB,CAAAA,CAAS,iBAAiB,EAC5B,CAAA,CAAG,CAACA,CAAQ,CAAC,CAAA,CAEPoB,CAAAA,CAAqB/D,cAAAA,CAAY,IAAM,CAC3C,GAAM,CAAE,iBAAA,CAAAgE,CAAkB,CAAA,CAAI3C,CAAAA,CACxB4C,CAAAA,CAASD,CAAAA,CAAkB,OAAO,CAACE,CAAAA,CAAKpE,CAAAA,IAC5CoE,CAAAA,CAAIpE,EAAE,IAAI,CAAA,CAAA,CAAKoE,CAAAA,CAAIpE,CAAAA,CAAE,IAAI,CAAA,EAAK,CAAA,EAAK,CAAA,CAC5BoE,CAAAA,CAAAA,CACN,EAAoC,CAAA,CAEjCC,CAAAA,CAAWH,CAAAA,CAAkB,OAAO,CAACE,CAAAA,CAAKpE,CAAAA,IAC9CoE,CAAAA,CAAIpE,EAAE,MAAM,CAAA,CAAA,CAAKoE,CAAAA,CAAIpE,CAAAA,CAAE,MAAM,CAAA,EAAK,CAAA,EAAK,CAAA,CAChCoE,CAAAA,CAAAA,CACN,EAA4B,CAAA,CAE/B,OAAO,CACL,KAAA,CAAOF,CAAAA,CAAkB,MAAA,CACzB,OAAA,CAAS3C,EAAM,eAAA,CACf,MAAA,CAAA4C,CAAAA,CACA,QAAA,CAAAE,CACF,CACF,CAAA,CAAG,CAAC9C,CAAK,CAAC,CAAA,CAEV,OAAAf,YAAAA,CAAU,IAAM,CACd,IAAM8D,CAAAA,CAAoB3B,CAAAA,CAAqB,QAC/C,OAAO,IAAM,CAEX2B,CAAAA,CAAkB,QAAQ,CAAC,CAAE,KAAA,CAAA7D,CAAM,CAAA,GAAM,CACvC,YAAA,CAAaA,CAAK,EACpB,CAAC,CAAA,CACD6D,CAAAA,CAAkB,KAAA,GACpB,CACF,CAAA,CAAG,EAAE,EAEE,CAAC/C,CAAAA,CAAO,CACb,eAAA,CAAAhB,EACA,gBAAA,CAAAmD,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,UAAAC,CAAAA,CACA,YAAA,CAAAE,CAAAA,CACA,kBAAA,CAAAC,CACF,CAAC,CACH,ECtLA,IAAMM,GAAW/F,mBAAAA,CAAM,UAAA,CACrB,CACE,CACE,SAAAC,CAAAA,CACA,SAAA,CAAAH,CAAAA,CACA,KAAA,CAAAkG,CAAAA,CAAQ,EAAA,CACR,SAAA,CAAAC,CAAAA,CAAY,KACZ,MAAA,CAAAC,CAAAA,CAAS,CAAA,CACT,QAAA,CAAAC,EAAW,KAAA,CACX,KAAA,CAAAC,CAAAA,CAAQ,KAAA,CACR,QAAAC,CAAAA,CAAU,KAAA,CACV,MAAA,CAAAC,CAAAA,CAAS,KAAA,CACT,eAAA,CAAAC,CAAAA,CAAkB,IAAA,CAClB,MAAAC,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,IACG,CACH,IAAM8F,CAAAA,CAAWrF,SAAAA,CAAuB,IAAI,CAAA,CACtC,CAACsF,CAAAA,CAAWC,CAAY,EAAI7F,WAAAA,CAAS,CACzC,CAAA,CAAG,CAAA,CACH,EAAG,CAAA,CACH,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,EACT,MAAA,CAAQ,CACV,CAAC,CAAA,CAGK8F,EAAuBC,EAAAA,EAAiB,CAExCC,CAAAA,CAAkBpF,cAAAA,CAAY,IAAM,CACxC,GAAIyE,CAAAA,EAAYS,EAAsB,OAEtC,IAAMG,CAAAA,CAAUN,CAAAA,CAAS,QACzB,GAAI,CAACM,CAAAA,CAAS,WAERC,CAAAA,CAAOD,CAAAA,CAAQ,qBAAA,EAAsB,CACrCE,CAAAA,CAAe,MAAA,CAAO,WAAA,CAItBC,CAAAA,CAAgBF,CAAAA,CAAK,GAAA,CAAMA,EAAK,MAAA,CAAS,CAAA,CAEzCjG,CAAAA,CAAAA,CADiBkG,CAAAA,CAAe,EACHC,CAAAA,EAAiBD,CAAAA,CAG9CE,CAAAA,CAAWpG,CAAAA,CAAWiF,CAAAA,CAAQ,GAAA,CAAME,CAAAA,CAEtCkB,CAAAA,CAAI,EACJC,CAAAA,CAAI,EAER,OAAQpB,CAAAA,EACN,KAAK,IAAA,CACHoB,CAAAA,CAAI,CAACF,EACL,MACF,KAAK,MAAA,CACHE,CAAAA,CAAIF,EACJ,MACF,KAAK,MAAA,CACHC,CAAAA,CAAI,CAACD,CAAAA,CACL,MACF,KAAK,OAAA,CACHC,EAAID,CAAAA,CACJ,KACJ,CAGA,IAAMG,EAAalB,CAAAA,CAAQ,CAAA,CAAI,IAAA,CAAK,GAAA,CAAIrF,CAAQ,CAAA,CAAI,EAAA,CAAM,CAAA,CACpDwG,EAAelB,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,EAAA,CAAK,EAAI,IAAA,CAAK,GAAA,CAAItF,CAAQ,CAAA,CAAI,EAAG,CAAA,CAAI,CAAA,CACvEyG,CAAAA,CAAclB,CAAAA,CAChBvF,CAAAA,CAAW,EAAA,EAAMwF,CAAAA,GAAoB,IAAA,CAAO,EAAI,EAAA,CAAA,CAChD,CAAA,CAEJI,CAAAA,CAAa,CAAE,EAAAS,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,KAAA,CAAOC,EAAY,OAAA,CAASC,CAAAA,CAAc,MAAA,CAAQC,CAAY,CAAC,EACtF,CAAA,CAAG,CAACrB,EAAUS,CAAAA,CAAsBZ,CAAAA,CAAOC,CAAAA,CAAWC,CAAAA,CAAQE,EAAOC,CAAAA,CAASC,CAAAA,CAAQC,CAAe,CAAC,EAEtGvE,YAAAA,CAAU,IAAM,CACd,GAAImE,GAAYS,CAAAA,CAAsB,OAGtCE,CAAAA,EAAgB,CAGhB,IAAMW,CAAAA,CAAe,IAAM,CACzB,qBAAA,CAAsBX,CAAe,EACvC,CAAA,CAEA,OAAA,MAAA,CAAO,gBAAA,CAAiB,SAAUW,CAAAA,CAAc,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CACjE,MAAA,CAAO,gBAAA,CAAiB,SAAUA,CAAAA,CAAc,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAE1D,IAAM,CACX,MAAA,CAAO,oBAAoB,QAAA,CAAUA,CAAY,CAAA,CACjD,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAY,EACnD,CACF,CAAA,CAAG,CAACX,CAAAA,CAAiBX,CAAAA,CAAUS,CAAoB,CAAC,CAAA,CAEpD,IAAMc,CAAAA,CAAqC,CACzC,GAAGlB,CAAAA,CACH,SAAA,CAAWL,CAAAA,EAAYS,CAAAA,CACnB,MAAA,CACA,CAAA,YAAA,EAAeF,CAAAA,CAAU,CAAC,CAAA,IAAA,EAAOA,CAAAA,CAAU,CAAC,CAAA,aAAA,EAAgBA,EAAU,KAAK,CAAA,SAAA,EAAYA,CAAAA,CAAU,MAAM,OAC3G,OAAA,CAASP,CAAAA,EAAYS,CAAAA,CAAuB,CAAA,CAAIF,EAAU,OAAA,CAC1D,UAAA,CAAYP,CAAAA,EAAYS,CAAAA,CAAuB,OAAY,oBAC7D,CAAA,CAEA,OACExE,cAAAA,CAAC,OACC,GAAA,CAAKuF,EAAAA,CAAUhH,CAAAA,CAAK8F,CAAQ,EAC5B,SAAA,CAAWnH,CAAAA,CAAM,iBAAA,CAAmBQ,CAAS,CAAA,CAC7C,KAAA,CAAO4H,CAAAA,CACN,GAAGpF,EAEH,QAAA,CAAArC,CAAAA,CACH,CAEJ,CACF,EAEA8F,EAAAA,CAAS,WAAA,CAAc,UAAA,CAGvB,SAASc,IAA4B,CACnC,GAAM,CAACD,CAAAA,CAAsBgB,CAAuB,CAAA,CAAI9G,WAAAA,CAAS,KAAK,EAEtE,OAAAkB,YAAAA,CAAU,IAAM,CACd,IAAM6F,CAAAA,CAAa,MAAA,CAAO,UAAA,CAAW,kCAAkC,EACvED,CAAAA,CAAwBC,CAAAA,CAAW,OAAO,CAAA,CAE1C,IAAMC,CAAAA,CAAgBC,CAAAA,EAA2B,CAC/CH,EAAwBG,CAAAA,CAAE,OAAO,EACnC,CAAA,CAEA,OAAAF,CAAAA,CAAW,gBAAA,CAAiB,QAAA,CAAUC,CAAY,EAC3C,IAAMD,CAAAA,CAAW,mBAAA,CAAoB,QAAA,CAAUC,CAAY,CACpE,CAAA,CAAG,EAAE,EAEElB,CACT,CAGA,SAASe,EAAAA,CAAAA,GAAgBK,EAA0D,CACjF,OAAQC,CAAAA,EAAU,CAChBD,EAAK,OAAA,CAASrH,CAAAA,EAAQ,CAChB,OAAOA,CAAAA,EAAQ,UAAA,CACjBA,CAAAA,CAAIsH,CAAK,EACAtH,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,GAC9BA,EAAyC,OAAA,CAAUsH,CAAAA,EAExD,CAAC,EACH,CACF,CCnJA,IAAMC,EAAAA,CAAUlI,oBAAM,UAAA,CACpB,CACE,CACE,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAH,CAAAA,CACA,SAAA,CAAAmG,EAAY,MAAA,CACZ,KAAA,CAAAD,CAAAA,CAAQ,EAAA,CACR,aAAAmC,CAAAA,CAAe,IAAA,CACf,YAAA,CAAAC,CAAAA,CAAe,MACf,GAAA,CAAAC,CAAAA,CAAM,EAAA,CACN,QAAA,CAAAC,EAAW,IAAA,CACX,aAAA,CAAAC,CAAAA,CAAgB,wBAAA,CAChB,cAAAC,CAAAA,CAAgB,GAAA,CAChB,KAAA,CAAAhC,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAM8H,CAAAA,CAAerH,SAAAA,CAAuB,IAAI,CAAA,CAC1C,CAACsH,CAAAA,CAAcC,CAAe,CAAA,CAAI7H,YAAS,CAAC,CAAA,CAC5C,CAAC8H,CAAAA,CAAeC,CAAgB,CAAA,CAAI/H,WAAAA,CAAS,CAAC,CAAA,CAC9C,CAACgI,CAAAA,CAAUC,CAAW,CAAA,CAAIjI,WAAAA,CAAS,KAAK,CAAA,CAExCkI,CAAAA,CAAe/C,CAAAA,GAAc,QAAUA,CAAAA,GAAc,OAAA,CACrDgD,CAAAA,CAAYhD,CAAAA,GAAc,SAAWA,CAAAA,GAAc,MAAA,CAGzDjE,YAAAA,CAAU,IAAM,CACd,IAAMkH,CAAAA,CAAYT,CAAAA,CAAa,OAAA,CAC/B,GAAI,CAACS,CAAAA,CAAW,OAEhB,IAAMC,CAAAA,CAAaD,CAAAA,CAAU,iBAAA,CAC7B,GAAI,CAACC,CAAAA,CAAY,OAEjB,IAAMC,CAAAA,CAAa,IAAM,CACnBJ,CAAAA,CACFL,CAAAA,CAAgBQ,CAAAA,CAAW,WAAW,CAAA,CAEtCN,CAAAA,CAAiBM,CAAAA,CAAW,YAAY,EAE5C,CAAA,CAEAC,CAAAA,EAAW,CAEX,IAAMC,EAAiB,IAAI,cAAA,CAAeD,CAAU,CAAA,CACpD,OAAAC,CAAAA,CAAe,OAAA,CAAQF,CAAU,CAAA,CAE1B,IAAME,CAAAA,CAAe,UAAA,EAC9B,EAAG,CAACL,CAAAA,CAAc/I,CAAQ,CAAC,EAO3B,IAAMqJ,CAAAA,CAAsC,CACzC,oBAAA,CAAiC,GALnBN,CAAAA,CACbN,CAAAA,CAAe1C,CAAAA,CACf4C,CAAAA,CAAgB5C,CAG2B,CAAA,CAAA,CAAA,CAC5C,eAAA,CAA4B,CAAA,EAAGqC,CAAG,CAAA,EAAA,CACrC,CAAA,CAGMkB,CAAAA,CAAgBjB,CAAAA,CAClB,CACG,kBAAA,CAA+BC,CAAAA,CAC/B,kBAAA,CAA+B,CAAA,EAAGC,CAAa,CAAA,EAAA,CAClD,CAAA,CACA,EAAC,CAEL,OACErG,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,EACL,SAAA,CAAWrB,CAAAA,CACT,0BAAA,CACAgJ,CAAAA,EAAY,mBACZxI,CACF,CAAA,CACA,KAAA,CAAO,CAAE,GAAG0G,CAAAA,CAAO,GAAG+C,CAAc,CAAA,CACpC,aAAc,IAAMpB,CAAAA,EAAgBY,CAAAA,CAAY,IAAI,EACpD,YAAA,CAAc,IAAMZ,CAAAA,EAAgBY,CAAAA,CAAY,KAAK,CAAA,CACrD,OAAA,CAAS,IAAMX,CAAAA,EAAgBW,EAAY,CAACD,CAAQ,CAAA,CACnD,GAAGxG,CAAAA,CAEJ,QAAA,CAAA,CAAAH,eAAAA,CAAC,KAAA,CAAA,CACC,IAAKsG,CAAAA,CACL,SAAA,CAAWnJ,CAAAA,CACT,MAAA,CACA0J,EAAe,UAAA,CAAa,UAAA,CAC5BF,CAAAA,CAAW,eAAA,CAAkB,GAC7BE,CAAAA,CACIC,CAAAA,CACE,uBAAA,CACA,sBAAA,CACFA,CAAAA,CACA,sBAAA,CACA,oBACN,CAAA,CACA,MAAOK,CAAAA,CAGP,QAAA,CAAA,CAAAlH,cAAAA,CAAC,KAAA,CAAA,CACC,UAAW9C,CAAAA,CACT,eAAA,CACA0J,CAAAA,CAAe,UAAA,CAAa,UAC9B,CAAA,CACA,KAAA,CAAO,CAAE,GAAA,CAAAX,CAAI,CAAA,CAEZ,QAAA,CAAApI,CAAAA,CACH,EAEAmC,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW9C,CAAAA,CACT,gBACA0J,CAAAA,CAAe,UAAA,CAAa,UAC9B,CAAA,CACA,MAAO,CAAE,GAAA,CAAAX,CAAAA,CAAK,CAACW,EAAe,YAAA,CAAe,WAAW,EAAGX,CAAI,EAC/D,aAAA,CAAY,MAAA,CAEX,QAAA,CAAApI,CAAAA,CACH,GACF,CAAA,CAGAmC,cAAAA,CAAC,OAAA,CAAA,CAAM,uBAAA,CAAyB,CAAE,MAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAuCzC,CAAA,CAAG,CAAA,CAAA,CACN,CAEJ,CACF,EAEA8F,EAAAA,CAAQ,WAAA,CAAc,SAAA,CCrLtB,IAAMsB,EAAAA,CAAWxJ,mBAAAA,CAAM,UAAA,CACrB,CACE,CACE,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAH,CAAAA,CACA,SAAA,CAAA2J,CAAAA,CAAY,0BAAA,CACZ,QAAA,CAAAC,CAAAA,CAAW,GAAA,CACX,WAAA,CAAAC,CAAAA,CAAc,EAAA,CACd,MAAA,CAAAC,CAAAA,CAAS,IAAA,CACT,WAAA,CAAAC,CAAAA,CACA,KAAA,CAAArD,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAMmJ,CAAAA,CAAU1I,SAAAA,CAAuB,IAAI,CAAA,CACrC,CAAC2I,CAAAA,CAAeC,CAAgB,CAAA,CAAIlJ,WAAAA,CAAS,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAC,CAAA,CAC3D,CAACmJ,CAAAA,CAAWC,CAAY,CAAA,CAAIpJ,WAAAA,CAAS,KAAK,CAAA,CAE1CqJ,CAAAA,CAAkBzI,cAAAA,CACrBqG,CAAAA,EAAwC,CACvC,GAAI,CAAC+B,CAAAA,CAAQ,OAAA,CAAS,OACtB,IAAM9C,CAAAA,CAAO8C,CAAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAsB,CACnDE,CAAAA,CAAiB,CACf,CAAA,CAAGjC,CAAAA,CAAE,OAAA,CAAUf,CAAAA,CAAK,IAAA,CACpB,CAAA,CAAGe,CAAAA,CAAE,OAAA,CAAUf,CAAAA,CAAK,GACtB,CAAC,EACH,CAAA,CACA,EACF,CAAA,CAEMoD,CAAAA,CAAiC,CACrC,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,SAAA,CACd,OAAA,CAASH,CAAAA,CAAYN,EAAc,CAAA,CACnC,UAAA,CAAY,CAAA,gBAAA,EAAmBD,CAAQ,CAAA,aAAA,EAAgBK,CAAAA,CAAc,CAAC,CAAA,GAAA,EAAMA,CAAAA,CAAc,CAAC,CAAA,IAAA,EAAON,CAAS,CAAA,kBAAA,CAAA,CAC3G,UAAA,CAAY,mBAAA,CACZ,aAAA,CAAe,MACjB,CAAA,CAEMY,CAAAA,CAAmCT,CAAAA,CACrC,CACE,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,UACd,OAAA,CAASK,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,UAAA,CAAY,CAAA,gBAAA,EAAmBP,CAAAA,CAAW,CAAC,CAAA,aAAA,EAAgBK,CAAAA,CAAc,CAAC,CAAA,GAAA,EAAMA,CAAAA,CAAc,CAAC,CAAA,IAAA,EAAOF,CAAAA,EAAeJ,CAAS,CAAA,kBAAA,CAAA,CAC9H,UAAA,CAAY,mBAAA,CACZ,aAAA,CAAe,MAAA,CACf,IAAA,CAAM,kEAAA,CACN,aAAA,CAAe,SAAA,CACf,mBAAA,CAAqB,KAAA,CACrB,OAAA,CAAS,KACX,CAAA,CACA,GAEJ,OACEtH,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKwF,EAAAA,CAAUhH,CAAAA,CAAKmJ,CAAO,CAAA,CAC3B,SAAA,CAAWxK,CAAAA,CACT,sEAAA,CACA,6BAAA,CACA2K,CAAAA,EAAa,oBAAA,CACbnK,CACF,CAAA,CACA,KAAA,CAAO0G,CAAAA,CACP,WAAA,CAAa2D,CAAAA,CACb,YAAA,CAAc,IAAMD,CAAAA,CAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACrC,GAAG5H,CAAAA,CAGJ,UAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOgI,CAAAA,CAAW,aAAA,CAAY,MAAA,CAAO,CAAA,CAGzCR,CAAAA,EAAUxH,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOiI,CAAAA,CAAoC,aAAA,CAAY,MAAA,CAAO,CAAA,CAG9EjI,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAiB,QAAA,CAAAnC,CAAAA,CAAS,CAAA,CAAA,CAC3C,CAEJ,CACF,EAEAuJ,EAAAA,CAAS,WAAA,CAAc,UAAA,CAGvB,SAAS7B,EAAAA,CAAAA,GAAgBK,CAAAA,CAA0D,CACjF,OAAQC,CAAAA,EAAU,CAChBD,CAAAA,CAAK,OAAA,CAASrH,CAAAA,EAAQ,CAChB,OAAOA,CAAAA,EAAQ,UAAA,CACjBA,CAAAA,CAAIsH,CAAK,CAAA,CACAtH,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,GAC9BA,CAAAA,CAAyC,OAAA,CAAUsH,CAAAA,EAExD,CAAC,EACH,CACF,CCxGA,IAAMqC,EAAAA,CAAgBtK,mBAAAA,CAAM,UAAA,CAC1B,CACE,CACE,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAAH,CAAAA,CACA,cAAA,CAAAyK,CAAAA,CAAiB,0BAAA,CACjB,aAAA,CAAAC,CAAAA,CAAgB,GAAA,CAChB,QAAA,CAAAlC,CAAAA,CAAW,IAAA,CACX,YAAA,CAAAmC,CAAAA,CAAe,2BAAA,CACf,UAAA,CAAAC,CAAAA,CAAa,aAAA,CACb,KAAA,CAAAlE,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAMmJ,CAAAA,CAAU1I,SAAAA,CAAuB,IAAI,CAAA,CACrC,CAAC2I,CAAAA,CAAeC,CAAgB,CAAA,CAAIlJ,WAAAA,CAAS,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAC,CAAA,CAC3D,CAACmJ,CAAAA,CAAWC,CAAY,CAAA,CAAIpJ,WAAAA,CAAS,KAAK,CAAA,CAE1CqJ,CAAAA,CAAkBzI,cAAAA,CACrBqG,CAAAA,EAAwC,CACvC,GAAI,CAAC+B,CAAAA,CAAQ,OAAA,CAAS,OACtB,IAAM9C,CAAAA,CAAO8C,CAAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAsB,CACnDE,CAAAA,CAAiB,CACf,CAAA,CAAGjC,CAAAA,CAAE,OAAA,CAAUf,CAAAA,CAAK,IAAA,CACpB,CAAA,CAAGe,CAAAA,CAAE,OAAA,CAAUf,CAAAA,CAAK,GACtB,CAAC,EACH,CAAA,CACA,EACF,CAAA,CAEM2D,CAAAA,CAAsC,CAC1C,QAAA,CAAU,UAAA,CACV,IAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,SAAA,CACd,OAAA,CAASV,CAAAA,CAAY,CAAA,CAAI,CAAA,CACzB,UAAA,CAAY,CAAA,gBAAA,EAAmBO,CAAa,CAAA,aAAA,EAAgBT,CAAAA,CAAc,CAAC,CAAA,GAAA,EAAMA,CAAAA,CAAc,CAAC,CAAA,IAAA,EAAOQ,CAAc,CAAA,kBAAA,CAAA,CACrH,UAAA,CAAY,mBAAA,CACZ,aAAA,CAAe,MACjB,CAAA,CAEMK,CAAAA,CAA4CtC,CAAAA,CAC9C,CACE,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,SAAA,CACd,UAAA,CAAY,CAAA,wBAAA,EAA2BmC,CAAY,CAAA,KAAA,EAAQC,CAAU,CAAA,MAAA,CAAA,CACrE,aAAA,CAAe,MACjB,CAAA,CACA,EAAC,CAEL,OACEvI,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKwF,EAAAA,CAAUhH,CAAAA,CAAKmJ,CAAO,CAAA,CAC3B,SAAA,CAAWxK,EACT,qCAAA,CACA,oCAAA,CACA,6BAAA,CACA2K,CAAAA,EAAa,4CAAA,CACbnK,CACF,CAAA,CACA,KAAA,CAAO0G,CAAAA,CACP,WAAA,CAAa2D,CAAAA,CACb,YAAA,CAAc,IAAMD,CAAAA,CAAa,IAAI,CAAA,CACrC,YAAA,CAAc,IAAMA,CAAAA,CAAa,KAAK,CAAA,CACrC,GAAG5H,CAAAA,CAGH,QAAA,CAAA,CAAAgG,CAAAA,EAAYlG,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAOwI,CAAAA,CAAsB,aAAA,CAAY,MAAA,CAAO,CAAA,CAGlExI,eAAC,KAAA,CAAA,CAAI,KAAA,CAAOuI,CAAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CAG/CvI,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAiB,QAAA,CAAAnC,CAAAA,CAAS,CAAA,CAAA,CAC3C,CAEJ,CACF,EAEAqK,GAAc,WAAA,CAAc,eAAA,CAG5B,SAAS3C,EAAAA,CAAAA,GAAgBK,CAAAA,CAA0D,CACjF,OAAQC,CAAAA,EAAU,CAChBD,CAAAA,CAAK,OAAA,CAASrH,CAAAA,EAAQ,CAChB,OAAOA,CAAAA,EAAQ,UAAA,CACjBA,EAAIsH,CAAK,CAAA,CACAtH,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,GAC9BA,CAAAA,CAAyC,OAAA,CAAUsH,CAAAA,EAExD,CAAC,EACH,CACF,CC3FA,IAAM4C,EAAAA,CAAa7K,mBAAAA,CAAM,WACvB,CACE,CACE,IAAA,CAAA8K,CAAAA,CACA,SAAA,CAAAhL,CAAAA,CACA,WAAA,CAAAiL,CAAAA,CAAc,cAAA,CACd,WAAA,CAAAC,CAAAA,CAAc,0BAAA,CACd,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,MAAA,CAAAC,CAAAA,CAAS,KAAA,CACT,MAAA,CAAAC,CAAAA,CAAS,KAAA,CACT,KAAA,CAAA3E,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAM8H,CAAAA,CAAerH,SAAAA,CAAuB,IAAI,EAC1C,CAACL,CAAAA,CAAUC,CAAW,CAAA,CAAIF,WAAAA,CAAS,CAAC,CAAA,CAGpC8F,CAAAA,CAAuBC,EAAAA,EAAiB,CAExCuE,CAAAA,CAAiB1J,cAAAA,CAAY,IAAM,CACvC,GAAI,CAAC+G,CAAAA,CAAa,OAAA,CAAS,OAE3B,IAAMzB,CAAAA,CAAOyB,CAAAA,CAAa,OAAA,CAAQ,qBAAA,EAAsB,CAClDxB,CAAAA,CAAe,MAAA,CAAO,WAAA,CAGtB5D,CAAAA,CAAQ4D,CAAAA,EAAgB,CAAA,CAAIgE,CAAAA,CAAAA,CAC5BI,EAAMpE,CAAAA,CAAegE,CAAAA,CACrB/D,CAAAA,CAAgBF,CAAAA,CAAK,GAAA,CAAMA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAE3CsE,CAAAA,CAAc,CAAA,CACdpE,CAAAA,EAAiB7D,CAAAA,EAAS6D,CAAAA,EAAiBmE,CAAAA,CAC7CC,CAAAA,CAAAA,CAAejI,CAAAA,CAAQ6D,CAAAA,GAAkB7D,CAAAA,CAAQgI,CAAAA,CAAAA,CACxCnE,CAAAA,CAAgBmE,CAAAA,GACzBC,CAAAA,CAAc,CAAA,CAAA,CAGhBtK,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGsK,CAAW,CAAC,CAAC,EACnD,CAAA,CAAG,CAACL,CAAS,CAAC,CAAA,CAEdjJ,YAAAA,CAAU,IAAM,CACd,GAAI4E,CAAAA,CAAsB,CACxB5F,CAAAA,CAAY,CAAC,CAAA,CACb,MACF,CAEAoK,CAAAA,EAAe,CAEf,IAAM3D,CAAAA,CAAe,IAAM,CACzB,qBAAA,CAAsB2D,CAAc,EACtC,CAAA,CAEA,OAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAU3D,CAAAA,CAAc,CAAE,QAAS,IAAK,CAAC,CAAA,CACjE,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAAA,CAAc,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAE1D,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAY,CAAA,CACjD,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAY,EACnD,CACF,CAAA,CAAG,CAAC2D,CAAAA,CAAgBxE,CAAoB,CAAC,CAAA,CAGzC,IAAM2E,EAAa,IAAM,CACvB,GAAIJ,CAAAA,CAAQ,CACV,IAAMK,CAAAA,CAAQV,CAAAA,CAAK,KAAA,CAAM,EAAE,CAAA,CAC3B,OAAOU,CAAAA,CAAM,GAAA,CAAI,CAACC,CAAAA,CAAMC,CAAAA,GAAU,CAChC,IAAMC,CAAAA,CAAe5K,CAAAA,CAAWyK,CAAAA,CAAM,MAAA,CAChCI,CAAAA,CAAaF,CAAAA,CAAQC,CAAAA,CAC3B,OACEvJ,cAAAA,CAAC,MAAA,CAAA,CAEC,KAAA,CAAO,CACL,KAAA,CAAOwJ,EAAab,CAAAA,CAAcC,CAAAA,CAClC,UAAA,CAAY,qBACd,CAAA,CAEC,QAAA,CAAAS,CAAAA,CAAAA,CANIC,CAOP,CAEJ,CAAC,CACH,CAEA,GAAIR,CAAAA,CAAQ,CACV,IAAMW,CAAAA,CAAQf,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAC5B,OAAOe,CAAAA,CAAM,GAAA,CAAI,CAACC,CAAAA,CAAMJ,CAAAA,GAAU,CAChC,IAAMK,CAAAA,CAAehL,CAAAA,CAAW8K,CAAAA,CAAM,OAChCD,CAAAA,CAAaF,CAAAA,CAAQK,CAAAA,CAC3B,OACE5J,eAAAA,CAAC,MAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,KAAA,CAAOwJ,CAAAA,CAAab,CAAAA,CAAcC,CAAAA,CAClC,UAAA,CAAY,sBACd,CAAA,CAEC,QAAA,CAAAc,CAAAA,CACH,CAAA,CACCJ,CAAAA,CAAQG,CAAAA,CAAM,MAAA,CAAS,CAAA,EAAK,GAAA,CAAA,CAAA,CATpBH,CAUX,CAEJ,CAAC,CACH,CAGA,OACEtJ,eAAC,MAAA,CAAA,CACC,KAAA,CAAO,CACL,UAAA,CAAY,CAAA,uBAAA,EAA0B2I,CAAW,CAAA,CAAA,EAAIhK,CAAAA,CAAW,GAAG,CAAA,GAAA,EAAMiK,CAAW,CAAA,CAAA,EAAIjK,CAAAA,CAAW,GAAG,CAAA,EAAA,CAAA,CACtG,oBAAA,CAAsB,MAAA,CACtB,mBAAA,CAAqB,aAAA,CACrB,cAAA,CAAgB,MAAA,CAChB,UAAA,CAAY,0BACd,CAAA,CAEC,QAAA,CAAA+J,CAAAA,CACH,CAEJ,CAAA,CAEA,OACE1I,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKuF,GAAUhH,CAAAA,CAAK8H,CAAY,CAAA,CAChC,SAAA,CAAWnJ,CAAAA,CAAM,aAAA,CAAeQ,CAAS,CAAA,CACzC,KAAA,CAAO0G,CAAAA,CACN,GAAGlE,CAAAA,CAEH,QAAA,CAAAiJ,CAAAA,EAAW,CACd,CAEJ,CACF,EAEAV,EAAAA,CAAW,WAAA,CAAc,YAAA,CAGzB,SAAShE,EAAAA,EAA4B,CACnC,GAAM,CAACD,CAAAA,CAAsBgB,CAAuB,CAAA,CAAI9G,WAAAA,CAAS,KAAK,CAAA,CAEtE,OAAAkB,YAAAA,CAAU,IAAM,CACd,IAAM6F,CAAAA,CAAa,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CACvED,CAAAA,CAAwBC,CAAAA,CAAW,OAAO,CAAA,CAE1C,IAAMC,CAAAA,CAAgBC,CAAAA,EAA2B,CAC/CH,CAAAA,CAAwBG,CAAAA,CAAE,OAAO,EACnC,CAAA,CAEA,OAAAF,CAAAA,CAAW,gBAAA,CAAiB,QAAA,CAAUC,CAAY,CAAA,CAC3C,IAAMD,CAAAA,CAAW,mBAAA,CAAoB,QAAA,CAAUC,CAAY,CACpE,CAAA,CAAG,EAAE,CAAA,CAEElB,CACT,CAGA,SAASe,EAAAA,CAAAA,GAAgBK,CAAAA,CAA0D,CACjF,OAAQC,CAAAA,EAAU,CAChBD,CAAAA,CAAK,OAAA,CAASrH,CAAAA,EAAQ,CAChB,OAAOA,CAAAA,EAAQ,UAAA,CACjBA,CAAAA,CAAIsH,CAAK,CAAA,CACAtH,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,GAC9BA,CAAAA,CAAyC,OAAA,CAAUsH,CAAAA,EAExD,CAAC,EACH,CACF,CC5LA,IAAM+D,EAAAA,CAAgB,CACpB,SAAA,CACA,SAAA,CACA,SAAA,CACA,SACF,CAAA,CAwBMC,EAAAA,CAAmBjM,mBAAAA,CAAM,UAAA,CAC7B,CACE,CACE,QAAA,CAAAC,CAAAA,CACA,UAAAH,CAAAA,CACA,MAAA,CAAAoM,CAAAA,CAASF,EAAAA,CACT,KAAA,CAAAhG,CAAAA,CAAQ,CAAA,CACR,IAAA,CAAAmG,CAAAA,CAAO,IAAA,CACP,UAAA,CAAAC,CAAAA,CAAa,GAAA,CACb,IAAA,CAAAlM,CAAAA,CAAO,MAAA,CACP,OAAA,CAAAuB,CAAAA,CAAU,IAAA,CACV,KAAA,CAAA+E,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,GAAM,CAAC0L,CAAAA,CAASC,CAAU,CAAA,CAAIxL,WAAAA,CAAS,KAAK,CAAA,CACtC8F,CAAAA,CAAuBC,EAAAA,EAAiB,CACxC0F,CAAAA,CAAgB9K,CAAAA,EAAW,CAACmF,CAAAA,CAElC5E,YAAAA,CAAU,IAAM,CACdsK,CAAAA,CAAW,IAAI,EACjB,CAAA,CAAG,EAAE,CAAA,CAEL,IAAME,CAAAA,CAAiB,IAAM,CAC3B,OAAQtM,CAAAA,EACN,KAAK,QAAA,CACH,OACEkC,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,kBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,CAAA;AAAA,kBAAA,EACRmK,CAAAA,CAAgB,8BAAgC,QAAQ,CAAA;AAAA,kBAAA,EACxDL,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,iBAAA,CAAA,CAErB,UAAWK,CAAAA,CAAgB,CAAA,gBAAA,EAAmBvG,CAAK,CAAA,iBAAA,CAAA,CAAsB,MAC3E,CAAA,CACF,CAAA,CAGJ,KAAK,QAAA,CACH,OACE5D,cAAAA,CAAC,KAAA,CAAA,CACC,UAAU,kBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,CAAA;AAAA,4BAAA,EACEmK,CAAAA,CAAgB,gDAAkD,SAAS,CAAA;AAAA,kBAAA,EACrFL,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,iBAAA,CAAA,CAErB,UAAWK,CAAAA,CAAgB,CAAA,cAAA,EAAiBvG,CAAK,CAAA,sBAAA,CAAA,CAA2B,MAC9E,CAAA,CACF,CAAA,CAGJ,KAAK,OAAA,CACH,OACE5D,cAAAA,CAAC,KAAA,CAAA,CACC,UAAU,kBAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,CAAA;AAAA,uBAAA,EACHmK,CAAAA,CAAgB,8BAAgC,MAAM,CAAA;AAAA,kBAAA,EAC3DL,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,kBAAA,EACjBA,CAAAA,CAAO,CAAC,CAAC;AAAA,iBAAA,CAAA,CAEb,SAAA,CAAWK,CAAAA,CAAgB,CAAA,cAAA,EAAiBvG,CAAK,oBAAsB,MACzE,CAAA,CACF,CAAA,CAIJ,QACE,OACE5D,cAAAA,CAAAqK,mBAAAA,CAAA,CACG,SAAAP,CAAAA,CAAO,GAAA,CAAI,CAACQ,CAAAA,CAAOhB,CAAAA,GAAU,CAC5B,IAAMiB,CAAAA,CAAS,IAAMT,CAAAA,CAAO,MAAA,CAAUR,CAAAA,CAChCrL,CAAAA,CAAS2F,CAAAA,CAAQkG,CAAAA,CAAO,MAAA,CAAUR,CAAAA,CACxC,OACEtJ,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,wCAAA,CACV,KAAA,CAAO,CACL,KAAA,CAAO,KAAA,CACP,OAAQ,KAAA,CACR,UAAA,CAAY,CAAA,kCAAA,EAAqCsK,CAAK,CAAA,qBAAA,CAAA,CACtD,GAAA,CAAK,CAAA,EAAG,EAAA,CAAK,KAAK,GAAA,CAAKC,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAM,GAAG,CAAA,CAAI,EAAE,CAAA,CAAA,CAAA,CACnD,KAAM,CAAA,EAAG,EAAA,CAAK,IAAA,CAAK,GAAA,CAAKA,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAM,GAAG,EAAI,EAAE,CAAA,CAAA,CAAA,CACpD,SAAA,CAAWJ,CAAAA,CACP,CAAA,cAAA,EAAiBvG,CAAK,CAAA,sBAAA,CAAA,CACtB,MAAA,CACJ,eAAgBuG,CAAAA,CAAgB,CAAA,EAAG,CAAClM,CAAK,CAAA,CAAA,CAAA,CAAM,MAAA,CAC/C,OAAA,CAASgM,CAAAA,CAAU,EAAI,CAAA,CACvB,UAAA,CAAY,uBACd,CAAA,CAAA,CAdKX,CAeP,CAEJ,CAAC,CAAA,CACH,CAEN,CACF,CAAA,CAEA,OACEvJ,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,EACT,0BAAA,CACAQ,CACF,CAAA,CACA,KAAA,CAAO0G,CAAAA,CACN,GAAGlE,CAAAA,CAGJ,QAAA,CAAA,CAAAF,eAAC,KAAA,CAAA,CACC,SAAA,CAAU,kBAAA,CACV,KAAA,CAAO,CACL,MAAA,CAAQ+J,CAAAA,CAAO,CAAA,KAAA,EAAQC,CAAU,CAAA,GAAA,CAAA,CAAQ,MAC3C,CAAA,CAEC,QAAA,CAAAI,CAAAA,EAAe,CAClB,CAAA,CAGCvM,CAAAA,EAAYmC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAiB,QAAA,CAAAnC,EAAS,CAAA,CAGtDmC,cAAAA,CAAC,OAAA,CAAA,CAAM,uBAAA,CAAyB,CAAE,MAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAqBzC,CAAA,CAAG,CAAA,CAAA,CACN,CAEJ,CACF,EAEA6J,EAAAA,CAAiB,WAAA,CAAc,kBAAA,CAG/B,SAASpF,IAA4B,CACnC,GAAM,CAACD,CAAAA,CAAsBgB,CAAuB,CAAA,CAAI9G,WAAAA,CAAS,KAAK,CAAA,CAEtE,OAAAkB,YAAAA,CAAU,IAAM,CACd,IAAM6F,EAAa,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CACvED,EAAwBC,CAAAA,CAAW,OAAO,CAAA,CAE1C,IAAMC,EAAgBC,CAAAA,EAA2B,CAC/CH,CAAAA,CAAwBG,CAAAA,CAAE,OAAO,EACnC,CAAA,CAEA,OAAAF,EAAW,gBAAA,CAAiB,QAAA,CAAUC,CAAY,CAAA,CAC3C,IAAMD,CAAAA,CAAW,mBAAA,CAAoB,QAAA,CAAUC,CAAY,CACpE,CAAA,CAAG,EAAE,CAAA,CAEElB,CACT,CCtLA,IAAMgG,EAAAA,CAAW5M,mBAAAA,CAAM,UAAA,CACrB,CACE,CACE,QAAA,CAAAC,EACA,SAAA,CAAAH,CAAAA,CACA,OAAA,CAAA+M,CAAAA,CAAU,GACV,WAAA,CAAAC,CAAAA,CAAc,GAAA,CACd,KAAA,CAAA1G,EAAQ,IAAA,CACR,KAAA,CAAAJ,CAAAA,CAAQ,GAAA,CACR,MAAA+G,CAAAA,CAAQ,IAAA,CACR,QAAA,CAAAC,CAAAA,CAAW,GACX,KAAA,CAAArJ,CAAAA,CAAQ,IAAA,CACR,KAAA,CAAA6C,EACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAMmJ,CAAAA,CAAU1I,SAAAA,CAAuB,IAAI,EACrC,CAACsF,CAAAA,CAAWC,CAAY,CAAA,CAAI7F,YAAS,CACzC,OAAA,CAAS,CAAA,CACT,OAAA,CAAS,EACT,KAAA,CAAO,CACT,CAAC,CAAA,CACK,CAACmM,CAAAA,CAAeC,CAAgB,CAAA,CAAIpM,WAAAA,CAAS,CAAE,CAAA,CAAG,EAAA,CAAI,CAAA,CAAG,EAAG,CAAC,CAAA,CAC7D,CAACmJ,CAAAA,CAAWC,CAAY,EAAIpJ,WAAAA,CAAS,KAAK,CAAA,CAE1CqJ,CAAAA,CAAkBzI,eACrBqG,CAAAA,EAAwC,CACvC,GAAI,CAAC+B,CAAAA,CAAQ,OAAA,CAAS,OAEtB,IAAM9C,EAAO8C,CAAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAsB,CAC7CqD,EAAUnG,CAAAA,CAAK,IAAA,CAAOA,CAAAA,CAAK,KAAA,CAAQ,EACnCoG,CAAAA,CAAUpG,CAAAA,CAAK,GAAA,CAAMA,CAAAA,CAAK,OAAS,CAAA,CAGnCqG,CAAAA,CAAStF,CAAAA,CAAE,OAAA,CAAUoF,EACrBG,CAAAA,CAASvF,CAAAA,CAAE,OAAA,CAAUqF,CAAAA,CAErBG,EAAWF,CAAAA,EAAUrG,CAAAA,CAAK,KAAA,CAAQ,CAAA,CAAA,CAAM6F,EACxCW,CAAAA,CAAU,EAAEF,CAAAA,EAAUtG,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAA,CAAA,CAAM6F,CAAAA,CAEhDlG,CAAAA,CAAa,CACX,OAAA,CAAA6G,CAAAA,CACA,OAAA,CAAAD,CAAAA,CACA,MAAAnH,CACF,CAAC,CAAA,CAGD,IAAMqH,GAAW1F,CAAAA,CAAE,OAAA,CAAUf,CAAAA,CAAK,IAAA,EAAQA,EAAK,KAAA,CAAS,GAAA,CAClD0G,CAAAA,CAAAA,CAAW3F,CAAAA,CAAE,QAAUf,CAAAA,CAAK,GAAA,EAAOA,CAAAA,CAAK,MAAA,CAAU,IACxDkG,CAAAA,CAAiB,CAAE,CAAA,CAAGO,CAAAA,CAAQ,EAAGC,CAAO,CAAC,EAC3C,CAAA,CACA,CAACb,CAAAA,CAASzG,CAAK,CACjB,EAEMuH,CAAAA,CAAmB,IAAM,CAC7BzD,CAAAA,CAAa,IAAI,EACnB,CAAA,CAEM0D,CAAAA,CAAmB,IAAM,CAC7B1D,CAAAA,CAAa,KAAK,CAAA,CACdvG,CAAAA,EACFgD,EAAa,CACX,OAAA,CAAS,CAAA,CACT,OAAA,CAAS,EACT,KAAA,CAAO,CACT,CAAC,EAEL,EAEMkH,CAAAA,CAAiC,CACrC,GAAGrH,CAAAA,CACH,YAAa,CAAA,EAAGsG,CAAW,CAAA,EAAA,CAC7B,CAAA,CAEMgB,EAAkC,CACtC,SAAA,CAAW,CAAA,QAAA,EAAWpH,CAAAA,CAAU,OAAO,CAAA,aAAA,EAAgBA,CAAAA,CAAU,OAAO,CAAA,WAAA,EAAcA,EAAU,KAAK,CAAA,CAAA,CAAA,CACrG,UAAA,CAAYuD,CAAAA,CAAY,OAAS,CAAA,UAAA,EAAajE,CAAK,CAAA,WAAA,CAAA,CACnD,cAAA,CAAgB,aAClB,CAAA,CAEM+H,CAAAA,CAAkC,CACtC,QAAA,CAAU,WACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,MAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,YAAA,CAAc,UACd,UAAA,CAAY,CAAA;AAAA,QAAA,EACR,IAAA,CAAK,KAAA,CAAMd,CAAAA,CAAc,CAAA,CAAI,EAAA,CAAIA,CAAAA,CAAc,CAAA,CAAI,EAAE,CAAA,EAAK,GAAA,CAAM,IAAA,CAAK,EAAA,CAAA,CAAM,EAAE,CAAA;AAAA,4BAAA,EACzDhD,CAAAA,CAAY+C,EAAW,CAAC,CAAA;AAAA;AAAA,OAAA,CAAA,CAGhD,UAAA,CAAY/C,CAAAA,CAAY,uBAAA,CAA0B,CAAA,QAAA,EAAWjE,CAAK,CAAA,WAAA,CAAA,CAClE,aAAA,CAAe,MAAA,CACf,OAAA,CAASiE,CAAAA,CAAY,CAAA,CAAI,CAC3B,EAEA,OACE7H,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKuF,EAAAA,CAAUhH,CAAAA,CAAKmJ,CAAO,CAAA,CAC3B,UAAWxK,CAAAA,CAAM,UAAA,CAAYQ,CAAS,CAAA,CACtC,KAAA,CAAO+N,CAAAA,CACP,WAAA,CAAa1D,CAAAA,CACb,aAAcwD,CAAAA,CACd,YAAA,CAAcC,CAAAA,CACb,GAAGtL,CAAAA,CAEJ,QAAA,CAAAH,eAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO2L,CAAAA,CAAY,SAAA,CAAU,UAAA,CAC/B,QAAA,CAAA,CAAA7N,CAAAA,CAGA8M,CAAAA,EAAS3K,cAAAA,CAAC,OAAI,KAAA,CAAO2L,CAAAA,CAAY,aAAA,CAAY,MAAA,CAAO,CAAA,CAAA,CACvD,CAAA,CACF,CAEJ,CACF,EAEAnB,EAAAA,CAAS,WAAA,CAAc,UAAA,CAGvB,SAASjF,EAAAA,CAAAA,GAAgBK,CAAAA,CAA0D,CACjF,OAAQC,GAAU,CAChBD,CAAAA,CAAK,OAAA,CAASrH,CAAAA,EAAQ,CAChB,OAAOA,CAAAA,EAAQ,UAAA,CACjBA,CAAAA,CAAIsH,CAAK,CAAA,CACAtH,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,GAC9BA,CAAAA,CAAyC,QAAUsH,CAAAA,EAExD,CAAC,EACH,CACF,CCxGA,IAAM+F,EAAAA,CAAkBhO,mBAAAA,CAAM,UAAA,CAC5B,CACE,CACE,GAAA,CAAAiO,CAAAA,CACA,IAAA,CAAA/N,CAAAA,CAAO,QAAA,CACP,MAAA,CAAAgO,EACA,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,IAAA,CAAAC,CAAAA,CAAO,IAAA,CACP,KAAA,CAAAC,CAAAA,CAAQ,KACR,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,SAAA,CAAAC,CAAAA,CAAY,OAAA,CACZ,OAAA,CAAAC,CAAAA,CAAU,KACV,YAAA,CAAAC,CAAAA,CAAe,oBAAA,CACf,QAAA,CAAAnG,CAAAA,CAAW,KAAA,CACX,iBAAA,CAAAoG,CAAAA,CAAoB,QAAA,CACpB,YAAA,CAAAC,CAAAA,CAAe,CAAA,CACf,MAAA,CAAAC,CAAAA,CAAS,IAAA,CACT,QAAA,CAAA3O,EACA,SAAA,CAAAH,CAAAA,CACA,KAAA,CAAA0G,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CACH,IAAMkO,CAAAA,CAAWzN,SAAAA,CAAyB,IAAI,CAAA,CACxC,CAAC0N,CAAAA,CAAUC,CAAW,EAAIjO,WAAAA,CAAS,KAAK,CAAA,CACxC,CAACkO,CAAAA,CAAWC,CAAY,CAAA,CAAInO,WAAAA,CAAS,KAAK,CAAA,CAGhDkB,YAAAA,CAAU,IAAM,CACV9B,CAAAA,GAAS,QAAA,EAAY2O,CAAAA,CAAS,UAChCA,CAAAA,CAAS,OAAA,CAAQ,YAAA,CAAeF,CAAAA,EAEpC,CAAA,CAAG,CAACA,CAAAA,CAAczO,CAAI,CAAC,CAAA,CAGvB,IAAMgP,CAAAA,CAAmB,IAAM,CAC7BH,CAAAA,CAAY,IAAI,EAClB,EAEMI,CAAAA,CAAgB,IAAM,CAC1BF,CAAAA,CAAa,IAAI,EACnB,CAAA,CAGMG,CAAAA,CAAiBC,CAAAA,EAAoB,CACzC,IAAMC,CAAAA,CAAS,IAAI,eAAA,CAAgB,CACjC,QAAA,CAAUnB,EAAW,GAAA,CAAM,GAAA,CAC3B,IAAA,CAAME,CAAAA,CAAQ,GAAA,CAAM,GAAA,CACpB,IAAA,CAAMD,CAAAA,CAAO,IAAM,GAAA,CACnB,QAAA,CAAUE,CAAAA,CAAW,GAAA,CAAM,GAAA,CAC3B,QAAA,CAAUe,CAAAA,CACV,cAAA,CAAgB,IAChB,GAAA,CAAK,GAAA,CACL,QAAA,CAAU,GAAA,CACV,cAAA,CAAgB,GAAA,CAChB,SAAA,CAAW,GAAA,CACX,YAAa,GAAA,CACb,WAAA,CAAa,GACf,CAAC,CAAA,CACD,OAAO,CAAA,8BAAA,EAAiCA,CAAO,IAAIC,CAAAA,CAAO,QAAA,EAAU,CAAA,CACtE,CAAA,CAGMC,CAAAA,CAAeF,CAAAA,EAAoB,CACvC,IAAMC,CAAAA,CAAS,IAAI,eAAA,CAAgB,CACjC,QAAA,CAAUnB,CAAAA,CAAW,GAAA,CAAM,GAAA,CAC3B,MAAOE,CAAAA,CAAQ,GAAA,CAAM,GAAA,CACrB,IAAA,CAAMD,CAAAA,CAAO,GAAA,CAAM,GAAA,CACnB,QAAA,CAAUE,CAAAA,CAAW,GAAA,CAAM,GAAA,CAC3B,UAAA,CAAY,GAAA,CACZ,OAAA,CAAS,MAAA,CACT,GAAA,CAAK,GACP,CAAC,CAAA,CACD,OAAO,CAAA,+BAAA,EAAkCe,CAAO,CAAA,CAAA,EAAIC,CAAAA,CAAO,QAAA,EAAU,CAAA,CACvE,CAAA,CAGME,CAAAA,CAAc,IAAM,CACxB,IAAMC,CAAAA,CAAiB,CACrB,MAAO,cAAA,CACP,OAAA,CAAS,gBAAA,CACT,IAAA,CAAM,aACR,CAAA,CAAElB,CAAS,CAAA,CAEX,OAAQrO,CAAAA,EACN,KAAK,SAAA,CACH,OACEkC,cAAAA,CAAC,QAAA,CAAA,CACC,IAAKgN,CAAAA,CAAcnB,CAAG,CAAA,CACtB,SAAA,CAAW3O,CAAAA,CACT,oDAAA,CACA,aACF,CAAA,CACA,MAAO,CACL,OAAA,CAASwP,CAAAA,EAAY,CAACF,CAAAA,CAAS,CAAA,CAAI,CAAA,CACnC,UAAA,CAAYA,EAAS,uBAAA,CAA0B,MACjD,CAAA,CACA,KAAA,CAAM,0FAAA,CACN,eAAA,CAAe,IAAA,CACf,MAAA,CAAQ,IAAMG,CAAAA,CAAY,IAAI,CAAA,CAC9B,KAAA,CAAM,0BAAA,CACR,CAAA,CAGJ,KAAK,QACH,OACE3M,cAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKmN,CAAAA,CAAYtB,CAAG,CAAA,CACpB,SAAA,CAAU,qDACV,KAAA,CAAO,CACL,OAAA,CAASa,CAAAA,EAAY,CAACF,CAAAA,CAAS,CAAA,CAAI,CAAA,CACnC,WAAYA,CAAAA,CAAS,uBAAA,CAA0B,MACjD,CAAA,CACA,KAAA,CAAM,0CAAA,CACN,eAAA,CAAe,IAAA,CACf,OAAQ,IAAMG,CAAAA,CAAY,IAAI,CAAA,CAC9B,KAAA,CAAM,wBAAA,CACR,CAAA,CAIJ,QACE,OACE3M,cAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAKyM,CAAAA,CACL,GAAA,CAAKZ,CAAAA,CACL,MAAA,CAAQC,CAAAA,CACR,SAAUC,CAAAA,CACV,IAAA,CAAMC,CAAAA,CACN,KAAA,CAAOC,CAAAA,CACP,QAAA,CAAUC,CAAAA,CACV,WAAA,CAAW,KACX,SAAA,CAAWhP,CAAAA,CACT,gCAAA,CACAmQ,CACF,CAAA,CACA,KAAA,CAAO,CACL,OAAA,CAAST,CAAAA,EAAa,CAACJ,CAAAA,CAAS,CAAA,CAAI,CAAA,CACpC,UAAA,CAAYA,CAAAA,CAAS,uBAAA,CAA0B,MACjD,CAAA,CACA,YAAA,CAAcM,CAAAA,CACd,SAAA,CAAWC,CAAAA,CACb,CAEN,CACF,CAAA,CAGMO,EAAwB,IAAM,CAClC,GAAI,CAACpH,CAAAA,CAAU,OAAO,IAAA,CAEtB,IAAMqH,EAAY,EAAC,CAEnB,OAAA,CAAIjB,CAAAA,GAAsB,KAAA,EAASA,CAAAA,GAAsB,MAAA,GACvDiB,CAAAA,CAAU,IAAA,CACRvN,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,qCAAA,CACV,KAAA,CAAO,CACL,UAAA,CAAY,8BAA8BqM,CAAY,CAAA,cAAA,CACxD,CAAA,CACA,aAAA,CAAY,MAAA,CAAA,CALR,KAMN,CACF,CAAA,CAAA,CAGEC,IAAsB,QAAA,EAAYA,CAAAA,GAAsB,MAAA,GAC1DiB,CAAAA,CAAU,IAAA,CACRvN,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,yCACV,KAAA,CAAO,CACL,UAAA,CAAY,CAAA,wBAAA,EAA2BqM,CAAY,CAAA,cAAA,CACrD,CAAA,CACA,aAAA,CAAY,MAAA,CAAA,CALR,QAMN,CACF,CAAA,CAGKrM,cAAAA,CAAAqK,mBAAAA,CAAA,CAAG,QAAA,CAAAkD,EAAU,CACtB,CAAA,CAGMC,CAAAA,CAAmB9P,CAAAA,EAAa,6BAAA,CAA8B,IAAA,CAAKA,CAAS,CAAA,CAElF,OACEqC,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,iBAAA,CACA,CAACsQ,GAAoB,UAAA,CACrB9P,CACF,CAAA,CACA,KAAA,CAAO0G,CAAAA,CACN,GAAGlE,CAAAA,CAGH,QAAA,CAAA,CAAA4L,GAAUU,CAAAA,EAAU,CAACE,CAAAA,EAAY,CAACE,CAAAA,EACjC5M,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,sCACV,KAAA,CAAO,CAAE,eAAA,CAAiB,CAAA,IAAA,EAAO8L,CAAM,CAAA,CAAA,CAAI,CAAA,CAC3C,aAAA,CAAY,OACd,CAAA,CAIDsB,CAAAA,EAAY,CAGZhB,CAAAA,EAAW,CAAClG,CAAAA,EACXlG,cAAAA,CAAC,KAAA,CAAA,CACC,UAAU,kBAAA,CACV,KAAA,CAAO,CAAE,eAAA,CAAiBqM,CAAa,CAAA,CACvC,aAAA,CAAY,MAAA,CACd,CAAA,CAIDiB,CAAAA,EAAsB,CAGtBzP,CAAAA,EACCmC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACZ,SAAAnC,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEA+N,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CCtP9B,IAAM6B,EAAAA,CAAW7P,mBAAAA,CAAM,UAAA,CACrB,CACE,CACE,QAAA,CAAAC,EACA,QAAA,CAAAkO,CAAAA,CAAW,KAAA,CACX,QAAA,CAAA2B,CAAAA,CAAW,GAAA,CACX,IAAA,CAAA1B,CAAAA,CAAO,KACP,YAAA,CAAAjG,CAAAA,CAAe,IAAA,CACf,UAAA,CAAA4H,CAAAA,CAAa,MAAA,CACb,iBAAA,CAAAC,CAAAA,CAAoB,SACpB,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,aAAA,CAAAC,CAAAA,CAAgB,QAAA,CAChB,UAAA,CAAA9K,CAAAA,CAAa,OAAA,CACb,kBAAA,CAAA+K,CAAAA,CAAqB,GAAA,CACrB,aAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CAAgB,MAChB,iBAAA,CAAAC,CAAAA,CAAoB,OAAA,CACpB,SAAA,CAAAxQ,CAAAA,CACA,KAAA,CAAA0G,CAAAA,CACA,GAAGlE,CACL,CAAA,CACA3B,CAAAA,GACG,CAGH,IAAM4P,CAAAA,CAAkB,IAClBnL,CAAAA,GAAe,OAAA,EAAWgJ,EAAa,CAAA,CACpC,CAAA,CAEH,CAACoC,CAAAA,CAAcC,CAAe,CAAA,CAAI3P,WAAAA,CAASyP,CAAe,EAC1D,CAACzH,CAAAA,CAAUC,CAAW,CAAA,CAAIjI,WAAAA,CAAS,CAACqN,CAAQ,CAAA,CAC5C,CAACuC,CAAAA,CAAkBC,CAAmB,CAAA,CAAI7P,WAAAA,CAAS,KAAK,CAAA,CACxD,CAAC8P,CAAAA,CAAiB1P,CAAkB,CAAA,CAAIJ,WAAAA,CAAS,KAAK,CAAA,CACtD,CAAC+P,CAAAA,CAAcC,CAAe,CAAA,CAAIhQ,YAAS,KAAK,CAAA,CAChD,CAACiQ,CAAAA,CAAYC,CAAa,CAAA,CAAIlQ,WAAAA,CAAwB,IAAI,CAAA,CAC1D,CAACmQ,CAAAA,CAAUC,CAAW,CAAA,CAAIpQ,WAAAA,CAAwB,IAAI,CAAA,CACtD2H,EAAerH,SAAAA,CAAuB,IAAI,CAAA,CAC1C+P,CAAAA,CAAanR,mBAAAA,CAAM,QAAA,CAAS,KAAA,CAAMC,CAAQ,EAG1C2G,EAAAA,CAAuBC,EAAAA,EAAiB,CAGxCuK,EAAAA,CAAiB1P,cAAAA,CAAagK,CAAAA,EAE9BtG,CAAAA,GAAe,OAAA,EAEf,CAACgJ,CAAAA,CAAa1C,CAAAA,CAEdA,CAAAA,GAAU,CAAA,CAAUyF,CAAAA,CAAa,CAAA,CACjCzF,CAAAA,GAAUyF,CAAAA,CAAa,CAAA,CAAU,CAAA,CAC9BzF,CAAAA,CAAQ,CAAA,CACd,CAAC0C,CAAAA,CAAM+C,CAAAA,CAAY/L,CAAU,CAAC,CAAA,CAG3BiM,CAAAA,CAAY3P,cAAAA,CACfgK,CAAAA,EAAkB,CACjB,GAAIkF,CAAAA,CAAiB,OAErB,IAAIU,CAAAA,CAAW5F,CAAAA,CAYf,GAXK0C,CAAAA,CAEMhJ,CAAAA,GAAe,OAAA,GAEpBsG,CAAAA,CAAQ,CAAA,CACV4F,EAAWH,CAAAA,CAAa,CAAA,CACfzF,CAAAA,EAASyF,CAAAA,GAClBG,CAAAA,CAAW,CAAA,CAAA,CAAA,CANbA,CAAAA,CAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAI5F,CAAAA,CAAOyF,CAAAA,CAAa,CAAC,CAAC,EAUpDG,CAAAA,GAAad,CAAAA,CAAc,CAC7BtP,CAAAA,CAAmB,IAAI,CAAA,CACvBuP,CAAAA,CAAgBa,CAAQ,EACxB,IAAMC,CAAAA,CAAcnD,CAAAA,EAAQhJ,CAAAA,GAAe,OAAA,CACtCkM,CAAAA,GAAa,CAAA,CAAIH,CAAAA,CAAa,EAAIG,CAAAA,GAAaH,CAAAA,CAAa,CAAA,CAAI,CAAA,CAAIG,CAAAA,CAAW,CAAA,CAChFA,CAAAA,CACJlB,CAAAA,EAAA,MAAAA,CAAAA,CAAgBmB,CAAAA,CAAAA,CAChB,UAAA,CAAW,IAAMrQ,CAAAA,CAAmB,KAAK,CAAA,CAAGiP,CAAkB,EAChE,CACF,CAAA,CACA,CAACK,CAAAA,CAAcW,CAAAA,CAAY/C,CAAAA,CAAMwC,CAAAA,CAAiBT,CAAAA,CAAoB/K,EAAYgL,CAAa,CACjG,CAAA,CAGApO,YAAAA,CAAU,IAAM,CACV,CAACoM,CAAAA,EAAQwC,GAAmBxL,CAAAA,GAAe,OAAA,GAG3CoL,CAAAA,GAAiB,CAAA,CAEnB,UAAA,CAAW,IAAM,CACfM,CAAAA,CAAgB,IAAI,CAAA,CACpBL,CAAAA,CAAgBU,CAAU,CAAA,CAC1B,UAAA,CAAW,IAAML,CAAAA,CAAgB,KAAK,CAAA,CAAG,EAAE,EAC7C,CAAA,CAAGX,CAAkB,CAAA,CACZK,CAAAA,GAAiBW,CAAAA,CAAa,GAEvC,UAAA,CAAW,IAAM,CACfL,CAAAA,CAAgB,IAAI,CAAA,CACpBL,CAAAA,CAAgB,CAAC,EACjB,UAAA,CAAW,IAAMK,CAAAA,CAAgB,KAAK,CAAA,CAAG,EAAE,EAC7C,CAAA,CAAGX,CAAkB,CAAA,EAEzB,CAAA,CAAG,CAACK,CAAAA,CAAcW,CAAAA,CAAY/C,CAAAA,CAAMwC,CAAAA,CAAiBT,EAAoB/K,CAAU,CAAC,CAAA,CAGpF,IAAMoM,EAAAA,CAAY9P,cAAAA,CAAY,IAAM,CAClC2P,EAAUb,CAAAA,CAAe,CAAC,EAC5B,CAAA,CAAG,CAACA,CAAAA,CAAca,CAAS,CAAC,EAGtBI,EAAAA,CAAY/P,cAAAA,CAAY,IAAM,CAClC2P,CAAAA,CAAUb,CAAAA,CAAe,CAAC,EAC5B,CAAA,CAAG,CAACA,CAAAA,CAAca,CAAS,CAAC,CAAA,CAGtBK,EAAAA,CAAkBhQ,cAAAA,CAAY,IAAM,CACxCiP,CAAAA,CAAoBvN,CAAAA,EAAQ,CAACA,CAAI,EACnC,CAAA,CAAG,EAAE,CAAA,CAGQ1B,cAAAA,CAAY,IAAM,CAC7BiP,CAAAA,CAAoB,KAAK,EAC3B,EAAG,EAAE,CAAA,CAGSjP,cAAAA,CAAY,IAAM,CAC9BiP,CAAAA,CAAoB,IAAI,EAC1B,CAAA,CAAG,EAAE,EAGL3O,YAAAA,CAAU,IAAM,CACd,GAAI,CAACmM,CAAAA,EAAYrF,CAAAA,EAAY4H,CAAAA,EAAoB9J,EAAAA,CAAsB,OAEvE,IAAM3E,CAAAA,CAAQ,YAAYuP,EAAAA,CAAW1B,CAAQ,CAAA,CAC7C,OAAO,IAAM,aAAA,CAAc7N,CAAK,CAClC,EAAG,CAACkM,CAAAA,CAAU2B,CAAAA,CAAUhH,CAAAA,CAAU4H,CAAAA,CAAkBc,EAAAA,CAAW5K,EAAoB,CAAC,CAAA,CAGpF,IAAM+K,EAAAA,CAAoB5J,CAAAA,EAAwB,CAChDiJ,CAAAA,CAAcjJ,CAAAA,CAAE,aAAA,CAAc,CAAC,CAAA,CAAE,OAAO,EAC1C,CAAA,CAEM6J,EAAAA,CAAmB7J,CAAAA,EAAwB,CAC/CmJ,CAAAA,CAAYnJ,EAAE,aAAA,CAAc,CAAC,CAAA,CAAE,OAAO,EACxC,CAAA,CAEM8J,EAAAA,CAAiB,IAAM,CAC3B,GAAI,CAACd,CAAAA,EAAc,CAACE,CAAAA,CAAU,OAE9B,IAAMa,CAAAA,CAAWf,CAAAA,CAAaE,CAAAA,CAG1B,IAAA,CAAK,GAAA,CAAIa,CAAQ,CAAA,EAFI,EAAA,GAGnBA,CAAAA,CAAW,EACbN,EAAAA,EAAU,CAEVC,EAAAA,EAAU,CAAA,CAIdT,CAAAA,CAAc,IAAI,CAAA,CAClBE,CAAAA,CAAY,IAAI,EAClB,CAAA,CAGAlP,YAAAA,CAAU,IAAM,CACd,IAAM+P,CAAAA,CAAiBhK,CAAAA,EAAqB,CACtCA,CAAAA,CAAE,GAAA,GAAQ,WAAA,CACZ0J,EAAAA,EAAU,CACD1J,CAAAA,CAAE,GAAA,GAAQ,YAAA,EACnByJ,EAAAA,GAEJ,CAAA,CAEMtI,CAAAA,CAAYT,CAAAA,CAAa,OAAA,CAC/B,OAAAS,CAAAA,EAAA,MAAAA,CAAAA,CAAW,gBAAA,CAAiB,SAAA,CAAW6I,CAAAA,CAAAA,CAChC,IAAM7I,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAW,oBAAoB,SAAA,CAAW6I,CAAAA,CACzD,CAAA,CAAG,CAACP,EAAAA,CAAWC,EAAS,CAAC,CAAA,CAGzB,IAAMO,EAAAA,CAAe,IAAM,CACzB,IAAM7R,CAAAA,CAAWyG,EAAAA,EAAwBiK,CAAAA,CAAe,CAAA,CAAIV,EACtDoB,CAAAA,CAAcH,EAAAA,CAAeZ,CAAY,CAAA,CAE/C,OAAQpL,CAAAA,EACN,KAAK,OACH,OAAOpF,mBAAAA,CAAM,QAAA,CAAS,GAAA,CAAIC,CAAAA,CAAU,CAACgS,CAAAA,CAAOvG,CAAAA,GAC1CtJ,eAAC,KAAA,CAAA,CAEC,SAAA,CAAW9C,CAAAA,CACT,gCAAA,CACAoM,CAAAA,GAAU6F,CAAAA,CAAc,MAAA,CAAS,KACnC,EACA,KAAA,CAAO,CACL,OAAA,CAAS7F,CAAAA,GAAU6F,CAAAA,CAAc,CAAA,CAAI,CAAA,CACrC,UAAA,CAAY,CAAA,QAAA,EAAWpR,CAAQ,CAAA,cAAA,CACjC,CAAA,CAEC,QAAA,CAAA8R,CAAAA,CAAAA,CAVIvG,CAWP,CACD,EAEH,KAAK,OAAA,CACH,OAAO1L,mBAAAA,CAAM,QAAA,CAAS,GAAA,CAAIC,CAAAA,CAAU,CAACgS,EAAOvG,CAAAA,GAC1CtJ,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW9C,CAAAA,CACT,gCAAA,CACAoM,CAAAA,GAAU6F,CAAAA,CAAc,OAAS,KACnC,CAAA,CACA,KAAA,CAAO,CACL,OAAA,CAAS7F,CAAAA,GAAU6F,CAAAA,CAAc,CAAA,CAAI,CAAA,CACrC,SAAA,CAAW,CAAA,MAAA,EAAS7F,CAAAA,GAAU6F,CAAAA,CAAc,CAAA,CAAI,EAAG,CAAA,CAAA,CAAA,CACnD,WAAY,CAAA,QAAA,EAAWpR,CAAQ,CAAA,0BAAA,EAA6BA,CAAQ,CAAA,cAAA,CACtE,CAAA,CAEC,QAAA,CAAA8R,CAAAA,CAAAA,CAXIvG,CAYP,CACD,CAAA,CAGH,QAAS,CACP,IAAMwG,CAAAA,CAAalS,mBAAAA,CAAM,QAAA,CAAS,QAAQC,CAAQ,CAAA,CAOlD,OAAA,CALemO,CAAAA,CACX,CAAC8D,CAAAA,CAAWA,CAAAA,CAAW,MAAA,CAAS,CAAC,CAAA,CAAG,GAAGA,CAAAA,CAAYA,CAAAA,CAAW,CAAC,CAAC,CAAA,CAChEA,GAGU,GAAA,CAAI,CAACD,CAAAA,CAAOvG,EAAAA,GACxBtJ,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAU,gCAAA,CACV,MAAO,CACL,SAAA,CAAW,CAAA,WAAA,EAAA,CAAesJ,EAAAA,CAAQ8E,CAAAA,EAAgB,GAAG,CAAA,EAAA,CAAA,CACrD,UAAA,CAAYK,EAAe,MAAA,CAAS,CAAA,UAAA,EAAa1Q,CAAQ,CAAA,cAAA,CAC3D,CAAA,CAEC,QAAA,CAAA8R,CAAAA,CAAAA,CAPIvG,EAQP,CACD,CACH,CACF,CACF,CAAA,CAGMyG,EAAAA,CAAmB,IAAM,CAC7B,GAAIpC,IAAe,MAAA,CAAQ,OAAO,IAAA,CAElC,IAAMqC,CAAAA,CAAWpC,CAAAA,CAAkB,QAAA,CAAS,QAAQ,EAC9CqC,CAAAA,CAAQrC,CAAAA,CAAkB,QAAA,CAAS,KAAK,CAAA,CACxCuB,CAAAA,CAAcH,EAAAA,CAAeZ,CAAY,EAEzC8B,CAAAA,CAA0BhT,CAAAA,CAC9B,wCAAA,CACA8S,CAAAA,CACI9S,CAAAA,CACE,yCAAA,CACA+S,CAAAA,CAAQ,OAAA,CAAU,UACpB,CAAA,CACA/S,CAAAA,CACE,MAAA,CACA+S,CAAAA,EAAS,uBACX,CACN,CAAA,CAGME,EAAwB7G,EAAAA,EAAkB,CAE5C2F,CAAAA,CADEjD,CAAAA,EAAQhJ,CAAAA,GAAe,OAAA,CACfsG,EAAAA,CAAQ,CAAA,CAERA,EAFS,EAIvB,CAAA,CAEA,OACEtJ,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWkQ,CAAAA,CAAyB,IAAA,CAAK,UAC3C,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQnB,CAAW,CAAA,CAAG,CAACqB,EAAAA,CAAG9G,CAAAA,GAAU,CAChD,IAAM+G,EAAAA,CAAW/G,CAAAA,GAAU6F,CAAAA,CAE3B,OAAQxB,CAAAA,EACN,KAAK,MAAA,CACH,OACE3N,cAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAMmQ,CAAAA,CAAqB7G,CAAK,CAAA,CACzC,SAAA,CAAWpM,CAAAA,CACT,8CAAA,CACAmT,EAAAA,CACI,cAAA,CACA,mCACN,CAAA,CACA,KAAK,KAAA,CACL,eAAA,CAAeA,EAAAA,CACf,YAAA,CAAY,CAAA,yBAAA,EAAQ/G,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAVxBA,CAWP,CAAA,CAGJ,KAAK,SAAA,CACH,OACEtJ,cAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAMmQ,CAAAA,CAAqB7G,CAAK,CAAA,CACzC,SAAA,CAAWpM,CAAAA,CACT,sEAAA,CACAmT,EAAAA,CACI,wBAAA,CACA,0CACN,CAAA,CACA,IAAA,CAAK,KAAA,CACL,eAAA,CAAeA,EAAAA,CACf,YAAA,CAAY,CAAA,yBAAA,EAAQ/G,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAE5B,QAAA,CAAAA,CAAAA,CAAQ,CAAA,CAAA,CAZJA,CAaP,CAAA,CAIJ,QACE,OACEtJ,eAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAMmQ,CAAAA,CAAqB7G,CAAK,CAAA,CACzC,SAAA,CAAWpM,CAAAA,CACT,uDACAmT,EAAAA,CACI,oBAAA,CACA,+BACN,CAAA,CACA,IAAA,CAAK,KAAA,CACL,eAAA,CAAeA,EAAAA,CACf,aAAY,CAAA,yBAAA,EAAQ/G,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAVxBA,CAWP,CAEN,CACF,CAAC,EACH,CAEJ,CAAA,CAGMgH,EAAAA,CAAkB,IAAM,CAC5B,GAAI,CAACrC,CAAAA,EAAiB,CAAClC,CAAAA,CAAU,OAAO,IAAA,CAExC,IAAMa,CAAAA,CAAY,CAAC0B,CAAAA,CAOnB,OACEtO,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASsP,EAAAA,CACT,SAAA,CAAWpS,CAAAA,CACT,wBAAA,CACA,uDAAA,CACA,2CACA,6BAAA,CACA,0EAAA,CAdkB,CACtB,IAAA,CAAM,QAAA,CACN,MAAA,CAAQ,2BAAA,CACR,KAAA,CAAO,SACT,CAAA,CAWsBgR,CAAiB,CACnC,CAAA,CACA,YAAA,CAAYtB,CAAAA,CAAY,0BAAA,CAAS,cAAA,CAEhC,QAAA,CAAAA,CAAAA,CAAY5M,cAAAA,CAACuQ,EAAAA,CAAA,CAAU,SAAA,CAAU,SAAA,CAAU,CAAA,CAAKvQ,eAACwQ,EAAAA,CAAA,CAAS,SAAA,CAAU,SAAA,CAAU,CAAA,CACjF,CAEJ,CAAA,CAGMC,EAAAA,CAAe,IAAM,CACzB,GAAI,CAAC5C,CAAAA,EAAcC,CAAAA,GAAkB,QAAA,CAAU,OAAO,IAAA,CAEtD,IAAM4C,CAAAA,CAAY1E,CAAAA,EAAQoC,CAAAA,CAAe,CAAA,CACnCuC,CAAAA,CAAY3E,CAAAA,EAAQoC,CAAAA,CAAeW,CAAAA,CAAa,CAAA,CAEhD6B,CAAAA,CAAiB1T,CAAAA,CACrB,wCAAA,CACA,yDAAA,CACA,0CAAA,CACA,6BAAA,CACA,iDAAA,CACA,0EACF,CAAA,CAEM2T,CAAAA,CAAe/C,CAAAA,GAAkB,SAAA,CAAY,UAAA,CAAa,QAAA,CAC1DgD,CAAAA,CAAehD,CAAAA,GAAkB,UAAY,WAAA,CAAc,SAAA,CAEjE,OACE/N,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAAC,UACC,OAAA,CAASqP,EAAAA,CACT,QAAA,CAAU,CAACqB,CAAAA,CACX,SAAA,CAAWxT,CAAAA,CAAM0T,CAAAA,CAAgBC,CAAY,CAAA,CAC7C,YAAA,CAAW,uCAAA,CAEX,QAAA,CAAA7Q,cAAAA,CAAC+Q,EAAAA,CAAA,CAAY,SAAA,CAAU,UAAU,CAAA,CACnC,CAAA,CACA/Q,cAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAASoP,EAAAA,CACT,QAAA,CAAU,CAACuB,EACX,SAAA,CAAWzT,CAAAA,CAAM0T,CAAAA,CAAgBE,CAAY,CAAA,CAC7C,YAAA,CAAW,uCAAA,CAEX,QAAA,CAAA9Q,eAACgR,EAAAA,CAAA,CAAa,SAAA,CAAU,SAAA,CAAU,CAAA,CACpC,CAAA,CAAA,CACF,CAEJ,CAAA,CAEA,OACEjR,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,6BAAA,CACA4Q,IAAkB,SAAA,EAAa,OAAA,CAC/BpQ,CACF,CAAA,CACA,KAAA,CAAO0G,CAAAA,CACN,GAAGlE,CAAAA,CAEJ,UAAAH,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKsG,CAAAA,CACL,SAAA,CAAU,wCAAA,CACV,YAAA,CAAc,IAAMN,GAAgBY,CAAAA,CAAY,IAAI,CAAA,CACpD,YAAA,CAAc,IAAMZ,CAAAA,EAAgBY,CAAAA,CAAY,KAAK,CAAA,CACrD,YAAA,CAAc4I,EAAAA,CACd,WAAA,CAAaC,EAAAA,CACb,UAAA,CAAYC,EAAAA,CACZ,QAAA,CAAU,EACV,IAAA,CAAK,QAAA,CACL,sBAAA,CAAqB,UAAA,CACrB,YAAA,CAAW,6CAAA,CAEV,QAAA,CAAA,CAAAG,EAAAA,GACAa,EAAAA,EAAa,CACbH,EAAAA,EAAgB,CAChB1C,CAAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA,EAAKmC,IAAiB,CAAA,CAC5D,CAAA,CACC,CAACnC,CAAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA,EAAKmC,EAAAA,EAAiB,CAAA,CAC7D,CAEJ,CACF,EAEAtC,EAAAA,CAAS,WAAA,CAAc,UAAA,CAGvB,SAAShJ,IAA4B,CACnC,GAAM,CAACD,CAAAA,CAAsBgB,CAAuB,CAAA,CAAI9G,WAAAA,CAAS,KAAK,EAEtE,OAAAkB,YAAAA,CAAU,IAAM,CACd,IAAM6F,CAAAA,CAAa,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CACvED,CAAAA,CAAwBC,CAAAA,CAAW,OAAO,CAAA,CAE1C,IAAMC,CAAAA,CAAgBC,CAAAA,EAA2B,CAC/CH,CAAAA,CAAwBG,CAAAA,CAAE,OAAO,EACnC,CAAA,CAEA,OAAAF,CAAAA,CAAW,gBAAA,CAAiB,SAAUC,CAAY,CAAA,CAC3C,IAAMD,CAAAA,CAAW,mBAAA,CAAoB,QAAA,CAAUC,CAAY,CACpE,EAAG,EAAE,CAAA,CAEElB,CACT,CAGA,SAASuM,EAAAA,CAAY,CAAE,UAAArT,CAAU,CAAA,CAA2B,CAC1D,OACEsC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWtC,CAAAA,CAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACnE,QAAA,CAAAsC,cAAAA,CAAC,QAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,iBAAA,CAAkB,EACzF,CAEJ,CAEA,SAASgR,EAAAA,CAAa,CAAE,SAAA,CAAAtT,CAAU,CAAA,CAA2B,CAC3D,OACEsC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWtC,CAAAA,CAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CACnE,QAAA,CAAAsC,cAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,cAAA,CAAe,CAAA,CACtF,CAEJ,CAEA,SAASwQ,EAAAA,CAAS,CAAE,SAAA,CAAA9S,CAAU,CAAA,CAA2B,CACvD,OACEsC,cAAAA,CAAC,OAAI,SAAA,CAAWtC,CAAAA,CAAW,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,WAAA,CACrD,QAAA,CAAAsC,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,eAAA,CAAgB,CAAA,CAC1B,CAEJ,CAEA,SAASuQ,EAAAA,CAAU,CAAE,SAAA,CAAA7S,CAAU,CAAA,CAA2B,CACxD,OACEsC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWtC,EAAW,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,WAAA,CACrD,QAAA,CAAAsC,cAAAA,CAAC,MAAA,CAAA,CAAK,CAAA,CAAE,gCAAgC,CAAA,CAC1C,CAEJ,CC1fA,IAAMiR,EAAAA,CAAerT,mBAAAA,CAAM,UAAA,CACzB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,MAAAmI,CAAAA,CAAO,GAAA,CAAAqL,CAAAA,CAAM,GAAA,CAAK,IAAA,CAAAC,CAAAA,CAAO,IAAA,CAAM,KAAA,CAAA7G,EAAQ,MAAA,CAAQ,GAAGpK,CAAM,CAAA,CAAG3B,CAAAA,GAAQ,CAC/E,IAAM6S,CAAAA,CAAc,CAClB,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAGMC,CAAAA,CAAwC,CAC5C,IAAA,CAAM,eAAA,CACN,KAAA,CAAO,cAAA,CACP,MAAA,CAAQ,eAAA,CACR,GAAA,CAAK,aAEL,MAAA,CAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,IAAA,CAAM,aAAA,CACN,KAAM,aACR,CAAA,CAEMC,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAKzL,CAAAA,CAAQqL,EAAO,GAAA,CAAK,CAAC,CAAA,CAAG,GAAG,CAAA,CAEjE,OACElR,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,8BAAA,CACAkU,CAAAA,CAAYD,CAAI,CAAA,CAChBzT,CACF,CAAA,CACC,GAAGwC,CAAAA,CAEJ,QAAA,CAAAF,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW9C,CAAAA,CACT,kDACAmU,CAAAA,CAAc/G,CAAK,CAAA,EAAK+G,CAAAA,CAAc,IACxC,CAAA,CACA,KAAA,CAAO,CAAE,MAAO,CAAA,EAAGC,CAAU,CAAA,CAAA,CAAI,CAAA,CACnC,CAAA,CACF,CAEJ,CACF,EACAL,EAAAA,CAAa,WAAA,CAAc,cAAA,CChD3B,IAAMM,EAAAA,CAAgB3T,mBAAAA,CAAM,UAAA,CAC1B,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,QAAA8T,CAAAA,CAAS,UAAA,CAAAC,CAAAA,CAAa,KAAA,CAAO,IAAA,CAAAN,CAAAA,CAAO,IAAA,CAAM,GAAGjR,CAAM,CAAA,CAAG3B,CAAAA,GAQhEyB,cAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,oHAVc,CAClB,EAAA,CAAI,iBAAA,CACJ,EAAA,CAAI,mBAAA,CACJ,EAAA,CAAI,mBACN,CAAA,CAOkBiU,CAAI,CAAA,CAChBM,CAAAA,CACI,sDAAA,CACA,6BAAA,CACJ/T,CACF,CAAA,CACC,GAAGwC,CAAAA,CAEH,SAAAsR,CAAAA,CACH,CAGN,EACAD,EAAAA,CAAc,WAAA,CAAc,eAAA,CC7B5B,IAAMG,EAAAA,CAAkB,CACtB,CAAE,GAAA,CAAK,KAAA,CAAO,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAC1D,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,MAAO,MAAO,CAAA,CAC5D,CAAE,GAAA,CAAK,OAAA,CAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,QAAS,KAAA,CAAO,KAAM,CAAA,CACzD,CAAE,GAAA,CAAK,MAAA,CAAQ,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,OAAQ,CAAA,CAC1D,CAAE,GAAA,CAAK,YAAA,CAAc,MAAO,cAAA,CAAM,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,MAAO,CAAA,CAC9D,CAAE,GAAA,CAAK,QAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,KAAA,CAAO,KAAA,CAAO,MAAO,CAAA,CACxD,CAAE,IAAK,WAAA,CAAa,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAChE,CAAE,GAAA,CAAK,YAAA,CAAc,KAAA,CAAO,oBAAA,CAAO,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,QAAS,CACnE,CAAA,CAkCMC,EAAAA,CAAkB/T,mBAAAA,CAAM,UAAA,CAC5B,CAAC,CACC,SAAA,CAAAF,EACA,eAAA,CAAAkU,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CAAS,MAAA,CACT,aAAA,CAAAC,EAAgB,KAAA,CAChB,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,iBAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAWR,GACX,IAAA,CAAAP,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAgB,CAAAA,CAAU,QAAA,CACV,GAAGjS,CACL,EAAG3B,CAAAA,GAAQ,CACT,IAAM6T,CAAAA,CAAsBC,CAAAA,EAAuB,CACjDR,CAAAA,EAAA,IAAA,EAAAA,EAAkBQ,CAAAA,EACpB,CAAA,CAEMC,CAAAA,CAAqBd,CAAAA,EAAgC,CACzD,IAAMC,CAAAA,CAAaG,CAAAA,GAAoBJ,EAAQ,GAAA,CAE/C,OAAIW,CAAAA,GAAY,QAAA,CAEZnS,cAAAA,CAACuR,EAAAA,CAAA,CAEC,OAAA,CAASC,CAAAA,CAAQ,GAAA,CACjB,UAAA,CAAYC,CAAAA,CACZ,IAAA,CAAMN,CAAAA,CACN,OAAA,CAAS,IAAMiB,EAAmBZ,CAAAA,CAAQ,GAAG,CAAA,CAC7C,SAAA,CAAWtU,CAAAA,CACT,6BAAA,CACAuU,CAAAA,EAAc,mCAChB,EAEC,QAAA,CAAAD,CAAAA,CAAQ,KAAA,CAAA,CAVJA,CAAAA,CAAQ,GAWf,CAAA,CAIAW,CAAAA,GAAY,MAAA,CAEZnS,eAAC,KAAA,CAAA,CAEC,SAAA,CAAW9C,CAAAA,CACT,oFAAA,CACAuU,CAAAA,CACI,6BAAA,CACA,uCACN,CAAA,CACA,OAAA,CAAS,IAAMW,CAAAA,CAAmBZ,CAAAA,CAAQ,GAAG,CAAA,CAE7C,QAAA,CAAAzR,eAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW9C,CAAAA,CACd,uDAAA,CACAuU,EAAa,oCAAA,CAAuC,UACtD,CAAA,CACG,QAAA,CAAAD,CAAAA,CAAQ,IAAA,EACPzR,eAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,SAAA,CACb,QAAA,CAAA,CAAAyR,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,SAAW,cAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,QAAA,CAC3BA,CAAAA,CAAQ,IAAA,GAAS,KAAA,EAAS,YAC1BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,WAAA,CAAA,CAC9B,CAAA,CAEJ,CAAA,CACAxR,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,oCAAA,CAAsC,QAAA,CAAAwR,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CACtE,CAAA,CAAA,CA3BKA,CAAAA,CAAQ,GA4Bf,EAIAW,CAAAA,GAAY,MAAA,CAEZnS,cAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAW9C,CAAAA,CACT,uFAAA,CACAuU,CAAAA,CACI,qCACA,4BACN,CAAA,CACA,OAAA,CAAS,IAAMW,CAAAA,CAAmBZ,CAAAA,CAAQ,GAAG,CAAA,CAE7C,SAAAxR,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wBAAA,CAA0B,QAAA,CAAAwR,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CATnDA,EAAQ,GAUf,CAAA,CAIG,IACT,CAAA,CAEMe,CAAAA,CAAgB,CACpB,IAAA,CAAM,+DAAA,CACN,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,sBACX,CAAA,CAEA,OACExS,eAAAA,CAAC,KAAA,CAAA,CACC,IAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,WAAA,CAAaQ,CAAS,CAAA,CACtC,GAAGwC,CAAAA,CAEJ,UAAAF,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWuS,CAAAA,CAAcT,CAAM,CAAA,CACjC,QAAA,CAAAI,CAAAA,CAAS,IAAII,CAAiB,CAAA,CACjC,CAAA,CAECP,CAAAA,EAAiBH,CAAAA,EAChB7R,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,QAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAiC,UAAAiS,CAAAA,CAAU,GAAA,CAAA,CAAC,CAAA,CAAA,CAC9D,CAAA,CACAhS,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,IAAI,GAAA,CACJ,GAAA,CAAI,KAAA,CACJ,KAAA,CAAOgS,CAAAA,CACP,QAAA,CAAWrM,CAAAA,EAAMsM,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAoB,MAAA,CAAOtM,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAA,CAC1D,SAAA,CAAU,uEACZ,CAAA,CACA5F,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,wBAAE,CAAA,CACRA,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CACRA,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,GACV,CAAA,CAAA,CACF,CAAA,CAGD4R,CAAAA,EAAmBG,CAAAA,EAClB/R,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,SAAAA,cAAAA,CAACiR,EAAAA,CAAA,CACC,KAAA,CAAOe,CAAAA,CACP,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,OACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAL,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CCjOvB,IAAMa,EAAAA,CAAeC,0BAAAA,CAC1B,YAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,mDAAA,CACT,OAAA,CAAS,uCAAA,CACT,SAAU,6DACZ,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,aAAA,CACN,EAAA,CAAI,WAAA,CACJ,GAAI,WAAA,CACJ,EAAA,CAAI,WACN,CAAA,CACA,OAAA,CAAS,CACP,IAAA,CAAM,EAAA,CACN,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,MACX,CACF,CACF,CAAA,CAuBMC,GAAO9U,mBAAAA,CAAM,UAAA,CACjB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,OAAA,CAAAyU,CAAAA,CAAU,UAAW,MAAA,CAAAQ,CAAAA,CAAQ,OAAA,CAAAC,CAAAA,CAAU,MAAA,CAAQ,SAAA,CAAAC,CAAAA,CAAW,GAAG3S,CAAM,CAAA,CAAG3B,CAAAA,GAEhFyB,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACTsV,EAAAA,CAAa,CAAE,OAAA,CAAAL,CAAAA,CAAS,MAAA,CAAAQ,CAAAA,CAAQ,OAAA,CAAAC,CAAQ,CAAC,CAAA,CACzC,sEAAA,CACAC,CAAAA,EAAa,qHAAA,CACbnV,CACF,CAAA,CACC,GAAGwC,CAAAA,CACN,CAGN,CAAA,CAEAwS,EAAAA,CAAK,WAAA,CAAc,MAAA,CAInB,IAAMI,EAAAA,CAAalV,mBAAAA,CAAM,UAAA,CACvB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,GAAGwC,CAAM,CAAA,CAAG3B,CAAAA,GACxByB,cAAAA,CAAC,OACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,6BAAA,CAA+BQ,CAAS,CAAA,CACxD,GAAGwC,EACN,CAEJ,CAAA,CAEA4S,EAAAA,CAAW,WAAA,CAAc,YAAA,CAIzB,IAAMC,EAAAA,CAAYnV,mBAAAA,CAAM,WACtB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,GAAGwC,CAAM,CAAA,CAAG3B,CAAAA,GACxByB,eAAC,IAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,iEAAA,CACAQ,CACF,CAAA,CACC,GAAGwC,CAAAA,CACN,CAEJ,CAAA,CAEA6S,EAAAA,CAAU,WAAA,CAAc,WAAA,CAIxB,IAAMC,GAAkBpV,mBAAAA,CAAM,UAAA,CAC5B,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,GAAGwC,CAAM,EAAG3B,CAAAA,GACxByB,cAAAA,CAAC,GAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,+BAAA,CAAiCQ,CAAS,CAAA,CAC1D,GAAGwC,CAAAA,CACN,CAEJ,CAAA,CAEA8S,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CAI9B,IAAMC,EAAAA,CAAcrV,mBAAAA,CAAM,UAAA,CACxB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,GAAGwC,CAAM,CAAA,CAAG3B,CAAAA,GACxByB,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKzB,CAAAA,CAAK,SAAA,CAAWrB,EAAM,WAAA,CAAaQ,CAAS,CAAA,CAAI,GAAGwC,CAAAA,CAAO,CAExE,CAAA,CAEA+S,EAAAA,CAAY,YAAc,aAAA,CAI1B,IAAMC,EAAAA,CAAatV,mBAAAA,CAAM,UAAA,CACvB,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,GAAGwC,CAAM,CAAA,CAAG3B,CAAAA,GACxByB,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKzB,EACL,SAAA,CAAWrB,CAAAA,CAAM,6BAAA,CAA+BQ,CAAS,CAAA,CACxD,GAAGwC,CAAAA,CACN,CAEJ,EAEAgT,EAAAA,CAAW,WAAA,CAAc,YAAA,CCxIlB,IAAMC,EAAAA,CAAgBV,0BAAAA,CAC3B,iOAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,gFAAA,CACT,SAAA,CAAW,oFAAA,CACX,YAAa,iEAAA,CACb,KAAA,CAAO,iEAAA,CACP,OAAA,CAAS,sIAAA,CACT,KAAA,CAAO,uIACT,CACF,EACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAmBMW,EAAAA,CAAQxV,oBAAM,IAAA,CAAKA,mBAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,OAAA,CAAAyU,CAAAA,CAAU,SAAA,CAAW,GAAGjS,CAAM,CAAA,CAAG3B,CAAAA,GAE3CyB,cAAAA,CAAC,KAAA,CAAA,CACC,IAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAMiW,EAAAA,CAAc,CAAE,OAAA,CAAAhB,CAAQ,CAAC,EAAGzU,CAAS,CAAA,CACrD,GAAGwC,CAAAA,CACN,CAGN,CAAC,CAAA,CACDkT,EAAAA,CAAM,YAAc,OAAA,CCmCpB,IAAMC,EAAAA,CAAkBzV,mBAAAA,CAAM,UAAA,CAC5B,CAAC,CACC,SAAA,CAAAF,EACA,cAAA,CAAA4V,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CAAsB,EAAC,CACvB,QAAA,CAAAC,CAAAA,CAAW,EAAC,CACZ,SAAA,CAAAxB,CAAAA,CAAY,EAAA,CACZ,UAAA,CAAAyB,CAAAA,CAAa,EAAA,CACb,MAAA,CAAAC,EAAS,EAAA,CACT,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,CAAAA,CAAmB,IAAA,CACnB,YAAA,CAAAC,CAAAA,CAAe,IAAA,CACf,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,MAAA,CAAAhC,CAAAA,CAAS,UAAA,CACT,GAAG5R,CACL,CAAA,CAAG3B,CAAAA,GAAQ,CACT,IAAMwV,CAAAA,CAAqBlO,CAAAA,EACrBA,CAAAA,CAAQ,GAAW,cAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CAChB,cAAA,CAGHmO,CAAAA,CAAsBnO,CAAAA,EACtBA,CAAAA,CAAQ,GAAW,oBAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,oBAAA,CAChB,oBAAA,CAGHoO,CAAAA,CAAkBpO,CAAAA,EAClBA,CAAAA,CAAQ,GAAW,cAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CAChB,cAAA,CAGT,OAAIiM,CAAAA,GAAW,SAAA,CAEX/R,gBAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,WAAA,CAAaQ,CAAS,CAAA,CACtC,GAAGwC,CAAAA,CAEH,QAAA,CAAA,CAAAoT,CAAAA,EACCvT,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,CAAA,CAC5CD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAAuT,CAAAA,CAAe,KAAK,IAAA,CAAGA,CAAAA,CAAe,SAAA,CAAU,IAAA,CAAA,CACnD,CAAA,CACCK,CAAAA,EACC3T,cAAAA,CAACiR,EAAAA,CAAA,CACC,KAAA,CAAOqC,CAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CAAA,CAEJ,GACF,CAAA,CAGDQ,CAAAA,EACC/T,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAtK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,EAC5CA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA+T,CAAAA,CAAkB/B,CAAS,CAAA,CAC9B,GACF,CAAA,CACAjS,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAgU,CAAAA,CAAmBP,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACA1T,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,cAAAA,CAAC,QAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAiU,CAAAA,CAAeP,CAAM,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EAGDG,CAAAA,EAAgBL,CAAAA,CAAS,MAAA,CAAS,CAAA,EACjCzT,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,QAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,SAAAwT,CAAAA,CAAS,GAAA,CAAKU,CAAAA,EACblU,cAAAA,CAACoT,EAAAA,CAAA,CAAoB,OAAA,CAAQ,WAAA,CAAY,UAAU,SAAA,CAChD,QAAA,CAAAc,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,EAIApC,CAAAA,GAAW,MAAA,CAEX/R,eAAAA,CAAC2S,EAAAA,CAAA,CACC,GAAA,CAAKnU,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,EAAA,CAAIQ,CAAS,CAAA,CAC7B,GAAGwC,CAAAA,CAEJ,QAAA,CAAA,CAAAH,eAAAA,CAAC+S,GAAA,CACC,QAAA,CAAA,CAAA/S,eAAAA,CAACgT,EAAAA,CAAA,CAAU,SAAA,CAAU,mBAAA,CACnB,QAAA,CAAA,CAAA/S,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,QAAA,CAAC,CAAA,CAAO,iBAAA,CAAA,CAE1C,CAAA,CACAA,cAAAA,CAACgT,GAAA,CAAgB,QAAA,CAAA,wCAAA,CAEjB,CAAA,CAAA,CACF,CAAA,CACAjT,eAAAA,CAACkT,EAAAA,CAAA,CAAY,SAAA,CAAU,WAAA,CACpB,QAAA,CAAA,CAAAK,CAAAA,EACCvT,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,sCAAM,CAAA,CACpCD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAAuT,CAAAA,CAAe,IAAA,CAAK,KAAGA,CAAAA,CAAe,SAAA,CAAU,IAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CACCK,CAAAA,EACC3T,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,cAAAA,CAACiR,EAAAA,CAAA,CACC,KAAA,CAAOqC,CAAAA,CAAe,UACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGDQ,CAAAA,EACC/T,gBAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAtK,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAC,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,4BAAA,CAAM,CAAA,CACpCA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,6BACb,QAAA,CAAA+T,CAAAA,CAAkB/B,CAAS,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CACAjS,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,eAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAAgU,CAAAA,CAAmBP,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,EACA1T,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAAiU,EAAeP,CAAM,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBL,CAAAA,CAAS,MAAA,CAAS,GACjCzT,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAAwT,CAAAA,CAAS,GAAA,CAAKU,CAAAA,EACblU,cAAAA,CAACoT,EAAAA,CAAA,CAAoB,OAAA,CAAQ,WAAA,CAAY,SAAA,CAAU,UAChD,QAAA,CAAAc,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EAMFnU,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,WAAA,CAAaQ,CAAS,EACtC,GAAGwC,CAAAA,CAEH,QAAA,CAAA,CAAAoT,CAAAA,EACCvT,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CD,eAAAA,CAAC,OAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAAsT,CAAAA,CAAe,IAAA,CAClB,CAAA,CACAvT,eAAAA,CAAC,OAAI,SAAA,CAAU,+BAAA,CACZ,QAAA,CAAA,CAAAuT,CAAAA,CAAe,SAAA,CAAU,gBAAA,CAAA,CAC5B,CAAA,CAAA,CACF,CAAA,CACCK,GACC3T,cAAAA,CAACiR,EAAAA,CAAA,CACC,KAAA,CAAOqC,CAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,MAAM,MAAA,CACR,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGDM,CAAAA,EAAoBL,CAAAA,CAAoB,MAAA,CAAS,CAAA,EAChDxT,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,qCAAK,CAAA,CAC3CA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACZ,QAAA,CAAAuT,CAAAA,CAAoB,GAAA,CAAI,CAACY,CAAAA,CAAM7K,CAAAA,GAC9BvJ,eAAAA,CAAC,KAAA,CAAA,CAAgB,SAAA,CAAU,WAAA,CACzB,QAAA,CAAA,CAAAA,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,SAAAmU,CAAAA,CAAK,OAAA,CAAQ,CAAA,CACpDpU,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAAoU,EAAK,UAAA,CAAW,GAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CACAnU,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,EAAGmU,CAAAA,CAAK,KAAK,CAAA,6CAAA,CAAA,CACxB,MAAO,CAAE,KAAA,CAAO,CAAA,EAAGA,CAAAA,CAAK,UAAU,CAAA,CAAA,CAAI,CAAA,CACxC,CAAA,CACF,IAZQ7K,CAaV,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAGDwK,CAAAA,EACC/T,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC1CA,cAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA+T,CAAAA,CAAkB/B,CAAS,CAAA,CAC9B,CAAA,CACAhS,cAAAA,CAAC,OAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,yDAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGgS,CAAS,CAAA,CAAA,CAAI,CAAA,CAClC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAjS,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,8BAAG,CAAA,CACxCA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAAgU,CAAAA,CAAmBP,CAAU,EAChC,CAAA,CACAzT,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGyT,CAAU,CAAA,CAAA,CAAI,EACnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACA1T,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAC,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,oBAAA,CAAG,CAAA,CACxCA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCACZ,QAAA,CAAAiU,CAAAA,CAAeP,CAAM,CAAA,CACxB,CAAA,CACA1T,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,4DAAA,CACV,KAAA,CAAO,CAAE,MAAO,CAAA,EAAG0T,CAAM,CAAA,CAAA,CAAI,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EAGDG,CAAAA,EAAgBL,CAAAA,CAAS,MAAA,CAAS,CAAA,EACjCzT,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,iCAAA,CAAM,CAAA,CAC5CA,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACZ,QAAA,CAAAwT,CAAAA,CAAS,GAAA,CAAKU,CAAAA,EACblU,cAAAA,CAACoT,EAAAA,CAAA,CAAoB,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,SAAA,CAC9C,QAAA,CAAAc,CAAAA,CAAAA,CADSA,CAEZ,CACD,EACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAb,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CCvWvB,SAASe,EAAAA,CAAaC,CAAAA,CAAuB,CAClD,OAAOA,CAAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,8BAAA,CAAgC,EAAE,CAAA,CAC1C,OAAA,CAAQ,MAAA,CAAQ,GAAG,EACnB,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CACtB,IAAA,EACL,CASO,SAASC,EAAAA,CAAYC,CAAAA,CAAuB,CAEjD,OADI,CAACA,CAAAA,EAAQA,CAAAA,CAAK,MAAA,GAAW,CAAA,EACzBA,CAAAA,CAAK,MAAA,CAAS,GAAA,CAAY,KAAA,CAGV,8BACD,IAAA,CAAKA,CAAI,CAC9B,CASO,SAASC,EAAAA,CAAcC,CAAAA,CAAuB,CACnD,OAAOA,CAAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,MAAA,CAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,4BAAA,CAA8B,EAAE,CAAA,CACxC,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,WAAY,EAAE,CAC3B,CC1CA,IAAMC,EAAAA,CAAmC,CAEvC,SAAA,CAAW,4BAAA,CACX,SAAA,CAAW,qBAAA,CACX,OAAA,CAAS,0BAAA,CACT,QAAA,CAAU,cAAA,CAGV,UAAW,2BAAA,CACX,IAAA,CAAM,oBAAA,CACN,UAAA,CAAY,QAAA,CACZ,IAAA,CAAM,cAAA,CACN,eAAA,CAAiB,sDAAA,CACjB,UAAA,CAAY,qCAAA,CACZ,qBAAA,CAAuB,+BAAA,CACvB,WAAA,CAAa,uCAAA,CACb,eAAA,CAAiB,2DACjB,SAAA,CAAW,2BAAA,CACX,aAAA,CAAe,gEAAA,CAGf,UAAA,CAAY,cAAA,CACZ,gBAAA,CAAkB,mDAAA,CAClB,QAAS,cAAA,CACT,kBAAA,CAAoB,iEAAA,CACpB,YAAA,CAAc,cAAA,CACd,kBAAA,CAAoB,wEAAA,CAGpB,MAAA,CAAQ,eACR,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,cAAA,CACT,MAAA,CAAQ,2BAAA,CACR,MAAA,CAAQ,wBAAA,CAGR,cAAe,8BAAA,CACf,eAAA,CAAiB,iBAAA,CACjB,WAAA,CAAa,wBAAA,CACb,gBAAA,CAAkB,4BAAA,CAGlB,cAAA,CAAgB,uEAChB,SAAA,CAAW,+CAAA,CACX,cAAA,CAAgB,+CAAA,CAChB,OAAA,CAAS,2BAAA,CAGT,IAAA,CAAM,cAAA,CACN,OAAQ,oBAAA,CACR,aAAA,CAAe,oBAAA,CACf,OAAA,CAAS,cAAA,CACT,IAAA,CAAM,cAAA,CACN,KAAA,CAAO,qBACP,IAAA,CAAM,cAAA,CACN,SAAA,CAAW,0BAAA,CACX,KAAA,CAAO,oBAAA,CACP,IAAA,CAAM,cAAA,CACN,WAAA,CAAa,2BAAA,CACb,cAAA,CAAgB,oBAClB,CAAA,CAKMC,EAAAA,CAAiD,CACrD,UAAA,CAAY,KACZ,UAAA,CAAY,IAAA,CACZ,gBAAA,CAAkB,IAAA,CAClB,iBAAA,CAAmB,IAAA,CACnB,aAAA,CAAe,IAAA,CACf,kBAAmB,IAAA,CACnB,aAAA,CAAe,IAAA,CACf,qBAAA,CAAuB,IAAA,CACvB,cAAA,CAAgB,IAAA,CAChB,eAAA,CAAiB,KACnB,CAAA,CAKMC,EAAAA,CAAsC,CAC1C,CAAE,GAAA,CAAK,IAAA,CAAM,KAAA,CAAO,oBAAA,CAAO,SAAA,CAAW,IAAA,CAAM,IAAA,CAAM,oBAAO,CAAA,CACzD,CAAE,GAAA,CAAK,IAAA,CAAM,MAAO,SAAA,CAAW,IAAA,CAAM,oBAAO,CAAA,CAC5C,CAAE,GAAA,CAAK,IAAA,CAAM,KAAA,CAAO,qBAAO,IAAA,CAAM,oBAAO,CAC1C,CAAA,CAKA,SAASC,EAAAA,CAA6BC,CAAAA,CAAgD,CACpF,IAAMC,CAAAA,CAA2B,EAAC,CAClC,OAAAD,CAAAA,CAAU,OAAA,CAASE,CAAAA,EAAS,CAC1BD,CAAAA,CAAMC,CAAAA,CAAK,GAAG,CAAA,CAAI,GACpB,CAAC,CAAA,CACMD,CACT,CAKA,SAASE,EAAAA,CACPH,CAAAA,CACAI,CAAAA,CACgB,CAzHlB,IAAApU,CAAAA,CAAAqU,CAAAA,CAAAC,EAAAC,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CA0HE,OAAO,CACL,IAAA,CAAA,CAAM3U,EAAAoU,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,IAAA,GAAb,IAAA,CAAApU,CAAAA,CAAqB,EAAA,CAC3B,KAAA,CAAA,CAAOqU,EAAAD,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,KAAA,GAAb,IAAA,CAAAC,CAAAA,CAAsBN,EAAAA,CAA6BC,CAAS,EACnE,OAAA,CAAA,CAASM,CAAAA,CAAAF,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,OAAA,GAAb,IAAA,CAAAE,CAAAA,CAAwBP,GAA6BC,CAAS,CAAA,CACvE,OAAA,CAAA,CAASO,CAAAA,CAAAH,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,OAAA,GAAb,KAAAG,CAAAA,CAAwBR,EAAAA,CAA6BC,CAAS,CAAA,CACvE,IAAA,CAAA,CAAMQ,CAAAA,CAAAJ,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,IAAA,GAAb,IAAA,CAAAI,CAAAA,CAAqB,EAAC,CAC5B,UAAA,CAAA,CAAYC,CAAAA,CAAAL,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,UAAA,GAAb,IAAA,CAAAK,CAAAA,CAA2B,EAAA,CACvC,WAAA,CAAA,CAAaC,CAAAA,CAAAN,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,WAAA,GAAb,IAAA,CAAAM,CAAAA,CAA4B,IAAA,CACzC,SAAA,CAAA,CAAWC,CAAAA,CAAAP,GAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,SAAA,GAAb,IAAA,CAAAO,CAAAA,CAA0B,IACvC,CACF,CAKA,IAAMC,EAAAA,CAAoBC,gBAAAA,CAA6C,IAAI,CAAA,CAKpE,SAASC,CAAAA,EAAwC,CACtD,IAAMC,CAAAA,CAAUC,aAAAA,CAAWJ,EAAiB,CAAA,CAC5C,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAE1E,OAAOA,CACT,CAYO,SAASE,EAAAA,CAAmB,CACjC,QAAA,CAAAlY,CAAAA,CACA,WAAA,CAAAqX,CAAAA,CACA,UAAA,CAAAc,CAAAA,CAAa,KAAA,CACb,SAAA,CAAAlB,CAAAA,CAAYF,EAAAA,CACZ,eAAA,CAAAqB,CAAAA,CACA,MAAA,CAAQC,CAAAA,CACR,SAAA,CAAAC,CAAAA,CACA,SAAUC,CAAAA,CACV,OAAA,CAAAjE,CAAAA,CAAU,SAAA,CACV,WAAA,CAAAkE,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CAAmB,GACrB,CAAA,CAA4B,CA5K5B,IAAAxV,EAAAA,CAAAqU,EAAAA,CAAAC,EAAAA,CAAAC,CAAAA,CA8KE,IAAMkB,GAAkBlB,CAAAA,CAAAA,CAAAD,EAAAA,CAAAA,CAAAtU,EAAAA,CAAAgU,CAAAA,CAAU,IAAA,CAAM0B,CAAAA,EAAMA,CAAAA,CAAE,SAAS,IAAjC,IAAA,CAAA,MAAA,CAAA1V,EAAAA,CAAoC,GAAA,GAApC,IAAA,CAAAsU,EAAAA,CAAAA,CAA2CD,EAAAA,CAAAL,CAAAA,CAAU,CAAC,IAAX,IAAA,CAAA,MAAA,CAAAK,EAAAA,CAAc,GAAA,GAAzD,IAAA,CAAAE,CAAAA,CAAgE,IAAA,CAClFoB,CAAAA,CAAkBR,CAAAA,EAAA,KAAAA,CAAAA,CAAmBM,CAAAA,CAGrCG,CAAAA,CAASC,UAAAA,CACb,KAAO,CAAE,GAAGjC,EAAAA,CAAgB,GAAGwB,CAAW,CAAA,CAAA,CAC1C,CAACA,CAAU,CACb,CAAA,CACMU,CAAAA,CAAWD,UAAAA,CACf,KAAO,CAAE,GAAGhC,EAAAA,CAAkB,GAAGyB,CAAa,CAAA,CAAA,CAC9C,CAACA,CAAY,CACf,CAAA,CAGM,CAACS,CAAAA,CAAUC,CAAW,CAAA,CAAIpY,WAAAA,CAAyB,IACvDuW,GAAkBH,CAAAA,CAAWI,CAAW,CAC1C,CAAA,CACM,CAAC6B,CAAAA,CAAgBC,CAAiB,CAAA,CAAItY,YAAS+X,CAAe,CAAA,CAC9D,CAACQ,CAAAA,CAAaC,CAAc,CAAA,CAAIxY,WAAAA,CAAS,KAAK,CAAA,CAC9C,CAACyY,CAAAA,CAAYC,CAAa,CAAA,CAAI1Y,WAAAA,CAAS,KAAK,CAAA,CAC5C,CAAC2Y,CAAAA,CAAaC,CAAc,CAAA,CAAI5Y,WAAAA,CAAS,KAAK,CAAA,CAC9C,CAAC6Y,CAAAA,CAAWC,CAAY,CAAA,CAAI9Y,WAAAA,CAAS,KAAK,CAAA,CAC1C,CAAC+Y,CAAAA,CAAOC,CAAQ,CAAA,CAAIhZ,YAAwB,IAAI,CAAA,CAChD,CAACiZ,CAAAA,CAAkBC,CAAmB,CAAA,CAAIlZ,WAAAA,CAAS,KAAK,CAAA,CAExD,CAACmZ,CAAAA,CAAoBC,CAAqB,CAAA,CAAIpZ,WAAAA,CAASsX,CAAAA,EAAc,CAAC,EAACd,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAa,IAAA,CAAI,CAAA,CACxF,CAAC6C,CAAAA,CAAgBC,CAAiB,EAAItZ,WAAAA,CAAsC,MAAM,CAAA,CAClFuZ,EAAAA,CAAmBjZ,SAAAA,CAA8B,IAAI,CAAA,CACrDkZ,EAAAA,CAAiBlZ,UAAO,IAAI,CAAA,CAG5BmZ,CAAAA,CAAa9B,CAAAA,GAAgBL,CAAAA,CAAa,IAAA,CAAO,mBAAA,CAAA,CAGvDpW,YAAAA,CAAU,IAAM,CACd,GAAI,EAAA,CAACgX,CAAAA,CAAS,cAAA,EAAkB,CAACuB,CAAAA,EAAcnC,CAAAA,CAAAA,CAE/C,GAAI,CACF,IAAMoC,CAAAA,CAAQ,YAAA,CAAa,OAAA,CAAQD,CAAU,CAAA,CAC7C,GAAIC,EAAO,CACT,IAAMC,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMD,CAAK,CAAA,CAC/BtB,CAAAA,CAAYuB,CAAM,EACpB,CACF,CAAA,KAAQ,CAER,CACF,CAAA,CAAG,EAAE,CAAA,CAGLzY,YAAAA,CAAU,IAAM,CACd,GAAI,EAAA,CAACgX,CAAAA,CAAS,cAAA,EAAkB,CAACuB,CAAAA,CAAAA,CAGjC,CAAA,GAAID,EAAAA,CAAe,OAAA,CAAS,CAC1BA,EAAAA,CAAe,OAAA,CAAU,KAAA,CACzB,MACF,CAGA,OAAID,EAAAA,CAAiB,OAAA,EACnB,YAAA,CAAaA,EAAAA,CAAiB,OAAO,CAAA,CAGvCD,EAAkB,QAAQ,CAAA,CAG1BC,EAAAA,CAAiB,OAAA,CAAU,UAAA,CAAW,IAAM,CAC1C,GAAI,CACF,YAAA,CAAa,OAAA,CAAQE,CAAAA,CAAY,IAAA,CAAK,SAAA,CAAUtB,CAAQ,CAAC,EACzDmB,CAAAA,CAAkB,OAAO,CAAA,CAEzB,UAAA,CAAW,IAAMA,CAAAA,CAAkB,MAAM,CAAA,CAAG,GAAI,EAClD,CAAA,KAAQ,CACNA,CAAAA,CAAkB,MAAM,EAC1B,CACF,CAAA,CAAG1B,CAAgB,CAAA,CAEZ,IAAM,CACP2B,EAAAA,CAAiB,OAAA,EACnB,YAAA,CAAaA,EAAAA,CAAiB,OAAO,EAEzC,CAAA,CACF,CAAA,CAAG,CAACpB,CAAAA,CAAUD,CAAAA,CAAS,cAAA,CAAgBuB,CAAAA,CAAY7B,CAAgB,CAAC,CAAA,CAGpE,IAAMgC,EAAAA,CAAgBhZ,cAAAA,CAAY,IAAM,CACtC,GAAI6Y,EACF,GAAI,CACF,YAAA,CAAa,UAAA,CAAWA,CAAU,EACpC,CAAA,KAAQ,CAER,CAEJ,CAAA,CAAG,CAACA,CAAU,CAAC,CAAA,CAGTI,EAAAA,CAAcjZ,cAAAA,CAClB,CAAiCyV,EAAUlP,CAAAA,GAA6B,CACtEiR,CAAAA,CAAa9V,CAAAA,GAAU,CAAE,GAAGA,CAAAA,CAAM,CAAC+T,CAAK,EAAGlP,CAAM,CAAA,CAAE,EACrD,CAAA,CACA,EACF,CAAA,CAGM2S,GAA0BlZ,cAAAA,CAC9B,CAACyV,CAAAA,CAAwC0D,CAAAA,CAAkB5S,CAAAA,GAAkB,CAC3EiR,CAAAA,CAAa9V,CAAAA,GAAU,CACrB,GAAGA,CAAAA,CACH,CAAC+T,CAAK,EAAG,CACP,GAAG/T,CAAAA,CAAK+T,CAAK,CAAA,CACb,CAAC0D,CAAQ,EAAG5S,CACd,CACF,CAAA,CAAE,EACJ,CAAA,CACA,EACF,CAAA,CAGMuO,EAAAA,CAAe9U,cAAAA,CAAa+U,CAAAA,EACzBD,EAAAA,CAAiBC,CAAK,CAAA,CAC5B,EAAE,CAAA,CAGCqE,EAAAA,CAAapZ,cAAAA,CACjB,MAAOqZ,CAAAA,EAAqB,CAE1B,IAAMC,CAAAA,CAAe/B,CAAAA,CAAS,KAAA,CAAMN,CAAe,CAAA,CAC7CsC,CAAAA,CAAiBhC,CAAAA,CAAS,OAAA,CAAQN,CAAe,CAAA,CAEvD,GAAI,CAACqC,CAAAA,EAAgB,CAACC,CAAAA,CAAgB,CACpCnB,CAAAA,CAAShB,CAAAA,CAAO,cAAc,CAAA,CAC9B,MACF,CAEA,GAAIE,CAAAA,CAAS,YAAc,CAACC,CAAAA,CAAS,IAAA,CAAM,CACzCa,CAAAA,CAAShB,CAAAA,CAAO,cAAc,CAAA,CAC9B,MACF,CAEAU,CAAAA,CAAc,IAAI,CAAA,CAClBM,CAAAA,CAAS,IAAI,CAAA,CAEb,GAAI,CACF,MAAMvB,CAAAA,CAAU,MAAA,CAAOU,CAAAA,CAAU8B,CAAO,CAAA,CAExCL,EAAAA,GACF,CAAA,KAAc,CACZZ,CAAAA,CAAShB,CAAAA,CAAO,SAAS,EAC3B,CAAA,OAAE,CACAU,EAAc,KAAK,EACrB,CACF,CAAA,CACA,CAACP,CAAAA,CAAUN,CAAAA,CAAiBG,CAAAA,CAAQE,EAAUT,CAAAA,CAAWmC,EAAa,CACxE,CAAA,CAGMQ,EAAAA,CAAkBxZ,cAAAA,CAAY,SAAY,CAC9C,GAAI,CAAC6W,CAAAA,CAAU,WAAA,CAAa,OAE5B,IAAMyC,CAAAA,CAAe/B,CAAAA,CAAS,KAAA,CAAMN,CAAe,CAAA,CAC7CsC,CAAAA,CAAiBhC,CAAAA,CAAS,OAAA,CAAQN,CAAe,CAAA,CACjDwC,CAAAA,CAAiBlC,CAAAA,CAAS,QAAQN,CAAe,CAAA,CAEvD,GAAI,CAACqC,CAAAA,EAAgB,CAACC,CAAAA,CAAgB,CACpCnB,EAAShB,CAAAA,CAAO,cAAc,CAAA,CAC9B,MACF,CAEAY,CAAAA,CAAe,IAAI,CAAA,CACnBI,CAAAA,CAAS,IAAI,CAAA,CACbE,CAAAA,CAAoB,KAAK,CAAA,CAEzB,GAAI,CACF,IAAMoB,CAAAA,CAAe,MAAM7C,CAAAA,CAAU,WAAA,CAAY,CAC/C,cAAA,CAAgBI,CAAAA,CAChB,KAAA,CAAOqC,EACP,OAAA,CAASC,CAAAA,CACT,OAAA,CAASE,CAAAA,EAAkB,KAAA,CAC7B,CAAC,CAAA,CAGDjC,CAAAA,CAAa9V,IAAS,CACpB,IAAMiY,CAAAA,CAAW,CAAE,GAAGjY,EAAAA,CAAK,KAAM,CAAA,CAC3BkY,EAAAA,CAAa,CAAE,GAAGlY,EAAAA,CAAK,OAAQ,CAAA,CAC/BmY,EAAAA,CAAa,CAAE,GAAGnY,EAAAA,CAAK,OAAQ,CAAA,CAKrC,OAAA,MAAA,CAAO,IAAA,CAAKgY,CAAY,CAAA,CAAE,OAAA,CAASI,IAAY,CAC7C,GAAIA,EAAAA,GAAY7C,CAAAA,CAAiB,CAC/B,IAAM8C,EAAAA,CAAcL,CAAAA,CAAaI,EAAO,CAAA,CACxC,GAAI,OAAOC,EAAAA,EAAgB,QAAA,EAAYA,EAAAA,GAAgB,IAAA,CAAM,CAC3D,IAAMC,EAAAA,CAAQD,EAAAA,CACVC,EAAAA,CAAM,KAAA,GAAOL,CAAAA,CAASG,EAAO,CAAA,CAAIE,GAAM,KAAA,CAAA,CACvCA,EAAAA,CAAM,OAAA,GAASJ,EAAAA,CAAWE,EAAO,CAAA,CAAIE,EAAAA,CAAM,OAAA,CAAA,CAC3CA,GAAM,OAAA,GAASH,EAAAA,CAAWC,EAAO,CAAA,CAAIE,EAAAA,CAAM,OAAA,EACjD,CACF,CACF,CAAC,CAAA,CAEM,CACL,GAAGtY,EAAAA,CACH,KAAA,CAAOiY,CAAAA,CACP,OAAA,CAASC,EAAAA,CACT,QAASC,EACX,CACF,CAAC,CAAA,CAEDvB,CAAAA,CAAoB,CAAA,CAAI,CAAA,CACxB,UAAA,CAAW,IAAMA,CAAAA,CAAoB,CAAA,CAAK,CAAA,CAAG,GAAI,EACnD,CAAA,KAAc,CACZF,CAAAA,CAAShB,EAAO,cAAc,EAChC,CAAA,OAAE,CACAY,CAAAA,CAAe,KAAK,EACtB,CACF,EAAG,CAACT,CAAAA,CAAUN,CAAAA,CAAiBG,CAAAA,CAAQP,CAAS,CAAC,CAAA,CAG3CoD,EAAAA,CAAoBja,cAAAA,CAAY,MAAOka,CAAAA,EAAuC,CAClF,GAAI,CAACrD,CAAAA,CAAU,aAAA,CAAe,OAAO,IAAA,CAErCqB,CAAAA,CAAa,IAAI,CAAA,CACjBE,CAAAA,CAAS,IAAI,CAAA,CAEb,GAAI,CAEF,OADY,MAAMvB,CAAAA,CAAU,aAAA,CAAcqD,CAAI,CAEhD,CAAA,KAAc,CACZ,OAAA9B,CAAAA,CAAS,oDAAY,CAAA,CACd,IACT,CAAA,OAAE,CACAF,CAAAA,CAAa,KAAK,EACpB,CACF,CAAA,CAAG,CAACrB,CAAS,CAAC,CAAA,CAGRsD,EAAAA,CAAena,eAAY,IAAM,CA3ZzC,IAAAwB,CAAAA,CAAAA,CA4ZIA,CAAAA,CAAAqV,CAAAA,CAAU,QAAA,GAAV,IAAA,EAAArV,EAAA,IAAA,CAAAqV,CAAAA,EACF,CAAA,CAAG,CAACA,CAAS,CAAC,CAAA,CAGRtQ,EAAAA,CAAQ8Q,WACZ,KAAO,CAEL,QAAA,CAAAE,CAAAA,CACA,cAAA,CAAAE,CAAAA,CACA,WAAA,CAAAE,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,WAAA,CAAAE,CAAAA,CACA,SAAA,CAAAE,CAAAA,CACA,KAAA,CAAAE,CAAAA,CACA,iBAAAE,CAAAA,CACA,cAAA,CAAAI,CAAAA,CAGA,SAAA,CAAAjD,CAAAA,CACA,QAAA,CAAA8B,CAAAA,CACA,MAAA,CAAAF,EACA,OAAA,CAAAvE,CAAAA,CACA,UAAA,CAAA6D,CAAAA,CAGA,iBAAA,CAAAgB,CAAAA,CACA,cAAA,CAAAE,CAAAA,CACA,YAAAqB,EAAAA,CACA,uBAAA,CAAAC,EAAAA,CACA,UAAA,CAAAE,EAAAA,CACA,eAAA,CAAAI,EAAAA,CACA,iBAAA,CAAAS,GACA,YAAA,CAAAE,EAAAA,CACA,QAAA,CAAA/B,CAAAA,CACA,YAAA,CAAAtD,EAAAA,CACA,kBAAA,CAAAyD,CAAAA,CACA,sBAAAC,CACF,CAAA,CAAA,CACA,CACEjB,CAAAA,CACAE,CAAAA,CACAE,CAAAA,CACAE,CAAAA,CACAE,CAAAA,CACAE,EACAE,CAAAA,CACAE,CAAAA,CACAI,CAAAA,CACAjD,CAAAA,CACA8B,CAAAA,CACAF,CAAAA,CACAvE,CAAAA,CACA6D,CAAAA,CACAuC,GACAC,EAAAA,CACAE,EAAAA,CACAI,EAAAA,CACAS,EAAAA,CACAE,EAAAA,CACArF,EAAAA,CACAyD,CAAAA,CACAC,CACF,CACF,CAAA,CAEA,OAAO9X,cAAAA,CAAC0V,EAAAA,CAAkB,QAAA,CAAlB,CAA2B,KAAA,CAAO7P,GAAQ,QAAA,CAAAhI,CAAAA,CAAS,CAC7D,CC/UO,IAAM6b,EAAAA,CAAQ,CAEnB,IAAA,CAAMC,SAAAA,CACN,SAAA,CAAWC,cACX,UAAA,CAAYC,cAAAA,CACZ,OAAA,CAASC,WAAAA,CACT,SAAA,CAAWC,aAAAA,CACX,IAAA,CAAMC,QAAAA,CACN,MAAOC,KAAAA,CACP,MAAA,CAAQC,mBAAAA,CACR,QAAA,CAAUC,QAAAA,CACV,YAAA,CAAcC,kBAAAA,CACd,WAAA,CAAaC,cACb,YAAA,CAAcC,cAAAA,CACd,WAAA,CAAaC,aAAAA,CACb,SAAA,CAAWC,WAAAA,CAGX,IAAA,CAAMC,UAAAA,CACN,OAAQC,SAAAA,CACR,GAAA,CAAKC,QAAAA,CACL,MAAA,CAAQC,SAAAA,CACR,QAAA,CAAUC,YAAAA,CACV,MAAA,CAAQC,WACR,OAAA,CAASC,kBAAAA,CACT,IAAA,CAAMC,cAAAA,CACN,IAAA,CAAMC,QAAAA,CAGN,MAAA,CAAQC,cAAAA,CACR,QAASC,eAAAA,CACT,KAAA,CAAOC,WAAAA,CACP,WAAA,CAAaC,iBAAAA,CACb,OAAA,CAASA,iBAAAA,CACT,IAAA,CAAMC,SACN,KAAA,CAAOC,SAAAA,CACP,MAAA,CAAQC,UAAAA,CACR,UAAA,CAAYC,YAAAA,CAGZ,IAAA,CAAMC,QAAAA,CACN,KAAA,CAAOC,SAAAA,CACP,QAAA,CAAUC,YAAAA,CACV,KAAA,CAAOC,UAAAA,CACP,MAAA,CAAQC,WAAAA,CACR,IAAKC,OAAAA,CACL,MAAA,CAAQC,YAAAA,CAGR,KAAA,CAAOC,YAAAA,CACP,QAAA,CAAUA,YAAAA,CACV,UAAA,CAAYC,YACZ,QAAA,CAAUC,SAAAA,CACV,QAAA,CAAUC,YAAAA,CACV,GAAA,CAAKC,aAAAA,CAGL,QAAA,CAAUC,YAAAA,CACV,KAAMC,QAAAA,CACN,MAAA,CAAQC,UAAAA,CACR,IAAA,CAAMC,QAAAA,CACN,QAAA,CAAUC,YAAAA,CAGV,IAAA,CAAMC,YAAAA,CACN,OAAA,CAASC,cAAAA,CACT,KAAA,CAAOC,SAAAA,CAGP,KAAA,CAAOC,SAAAA,CACP,KAAA,CAAOC,UACP,MAAA,CAAQC,UAAAA,CAGR,KAAA,CAAOC,UAAAA,CACP,KAAA,CAAOC,aAAAA,CACP,GAAA,CAAKC,aAAAA,CAGL,KAAMC,QAAAA,CACN,MAAA,CAAQC,YAAAA,CACR,MAAA,CAAQC,UAAAA,CACR,MAAA,CAAQC,UAAAA,CACR,GAAA,CAAKC,QAGL,KAAA,CAAOC,SAAAA,CACP,QAAA,CAAUC,YAAAA,CACV,YAAA,CAAcC,gBAAAA,CAGd,IAAA,CAAMC,QAAAA,CACN,KAAA,CAAOC,SAAAA,CACP,IAAA,CAAMC,QAAAA,CACN,QAAA,CAAUC,YAAAA,CACV,KAAA,CAAOC,SAAAA,CAGP,QAASC,WAAAA,CACT,GAAA,CAAKC,OAAAA,CACL,IAAA,CAAMC,QAAAA,CAGN,SAAA,CAAWC,aAAAA,CACX,KAAA,CAAOC,UACP,IAAA,CAAMC,QAAAA,CACN,MAAA,CAAQC,UAAAA,CACR,OAAA,CAASC,WAAAA,CACT,QAAA,CAAUA,WAAAA,CACV,MAAOC,SAAAA,CACP,UAAA,CAAYC,gBAAAA,CACZ,YAAA,CAAcA,gBAAAA,CACd,UAAA,CAAY1D,cAAAA,CAGZ,MAAA,CAAQ2D,WACR,SAAA,CAAWC,aAAAA,CACX,IAAA,CAAMC,YAAAA,CACN,OAAA,CAASC,aAAAA,CACT,GAAA,CAAKC,OAAAA,CACL,KAAMC,aAAAA,CAGN,IAAA,CAAMC,SAAAA,CACN,MAAA,CAAQC,cAAAA,CACR,aAAA,CAAeC,qBAAAA,CACf,OAAA,CAASC,aACT,IAAA,CAAMC,QAAAA,CACN,IAAA,CAAMC,QAAAA,CACN,QAAA,CAAUC,YAAAA,CACV,KAAA,CAAOC,UAAAA,CACP,KAAMC,QAAAA,CACN,WAAA,CAAaC,eAAAA,CACb,KAAA,CAAO9E,SACT,CAAA,CAMa+E,EAAAA,CAAe,CAC1B,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,OAAA,CACL,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,OAAA,CACT,MAAO,OAAA,CACP,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,OAAA,CACN,OAAA,CAAS,OACX,CAAA,CAGaC,GAAc,CACzB,OAAA,CAAS,QAAA,CACT,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,UACT,IAAA,CAAM,MAAA,CACN,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,QAAA,CACV,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,QACV,CAAA,CC5RO,SAASC,EAAAA,CAAYC,CAAAA,CAAqB,CAI/C,OAHI,CAACA,CAAAA,EAGD,CAAC,MAAA,CAAO,IAAA,CAAKA,CAAG,CAAA,EAAK,QAAA,CAAS,IAAA,CAAKA,CAAG,CAAA,CACjCA,CAAAA,CAIL,UAAA,CAAW,IAAA,CAAKA,CAAG,CAAA,CACdA,CAAAA,CAAI,WAAA,GAIT,QAAA,CAAS,IAAA,CAAKA,CAAG,CAAA,EAAK,CAAC,MAAA,CAAO,IAAA,CAAKA,CAAG,CAAA,CACjCA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAIA,CAAAA,CAAI,MAAM,CAAC,CAAA,CAI3CA,CAAAA,CACJ,KAAA,CAAM,MAAM,CAAA,CACZ,GAAA,CAAI,CAACpW,EAAMJ,CAAAA,GACNA,CAAAA,GAAU,CAAA,CACLI,CAAAA,CAAK,WAAA,EAAY,CAEnBA,CAAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAIA,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EACrD,CAAA,CACA,IAAA,CAAK,EAAE,CACZ,CCxBA,IAAIqW,CAAAA,CAAqB,KAIrBC,CAAAA,CAAmB,IAAA,CAoChB,IAAMC,EAAAA,CAAgB,CAE3B,IAAA,CAAQ,CAAE,MAAA,CAAQ,OAAQ,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAC9D,kBAAA,CAAoB,CAAE,MAAA,CAAQ,kBAAmB,QAAA,CAAU,aAAc,CAAA,CACzE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,SAAU,OAAA,CAAS,QAAS,CAAA,CACpE,cAAA,CAAgB,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,eAAA,CAAiB,OAAA,CAAS,QAAS,CAAA,CACtF,WAAA,CAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,SAAU,eAAA,CAAiB,OAAA,CAAS,QAAS,CAAA,CACrF,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,SAAU,SAAU,CAAA,CACpD,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,QAAS,QAAS,CAAA,CACjE,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,MAAO,EACnD,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,EAC5D,KAAA,CAAS,CAAE,MAAA,CAAQ,GAAA,CAAK,QAAA,CAAU,GAAA,CAAK,OAAA,CAAS,aAAc,EAC9D,WAAA,CAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,YAAa,EACrF,YAAA,CAAgB,CAAE,MAAA,CAAQ,cAAA,CAAgB,QAAA,CAAU,YAAA,CAAc,OAAA,CAAS,aAAc,CAAA,CACzF,WAAA,CAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,YAAa,CAAA,CACrF,SAAA,CAAa,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,SAAA,CAAW,OAAA,CAAS,UAAW,CAAA,CAC7E,SAAA,CAAa,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,WAAY,CAAA,CAChF,UAAA,CAAc,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,YAAA,CAAc,OAAA,CAAS,YAAa,CAAA,CACpF,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAA,CAAW,QAAS,SAAU,CAAA,CACxE,SAAA,CAAa,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,WAAA,CAAa,QAAS,WAAY,CAAA,CAGhF,GAAA,CAAO,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,QAAS,KAAM,CAAA,CAC1D,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,QAAS,CAAA,CAC7C,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,QAAS,CAAA,CACjD,OAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAClE,MAAS,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CACjE,OAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,QAAS,CAAA,CACpE,SAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,UAAW,CAAA,CAC5E,EAAK,CAAE,MAAA,CAAQ,GAAA,CAAK,QAAA,CAAU,GAAI,CAAA,CAClC,KAAA,CAAS,CAAE,OAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAChE,MAAA,CAAU,CAAE,OAAQ,QAAA,CAAU,QAAA,CAAU,iBAAA,CAAmB,OAAA,CAAS,cAAe,CAAA,CACnF,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAQ,CAAA,CAC9C,IAAA,CAAQ,CAAE,MAAA,CAAQ,OAAQ,QAAA,CAAU,MAAO,CAAA,CAC3C,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,YAAa,CAAA,CAGjD,MAAA,CAAU,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAU,CAAA,CACnD,QAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAU,CAAA,CACpD,cAAA,CAAgB,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,aAAA,CAAe,OAAA,CAAS,YAAa,CAAA,CACxF,WAAA,CAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,aAAA,CAAe,OAAA,CAAS,YAAa,CAAA,CACvF,OAAA,CAAW,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,aAAA,CAAe,OAAA,CAAS,YAAa,CAAA,CACnF,KAAA,CAAS,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAA,CAAW,OAAA,CAAS,aAAc,CAAA,CAC1E,OAAA,CAAW,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,eAAA,CAAiB,OAAA,CAAS,UAAW,CAAA,CACnF,KAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,YAAa,CAAA,CAClE,QAAW,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,gBAAA,CAAkB,OAAA,CAAS,SAAU,CAAA,CACjF,UAAa,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,gBAAA,CAAkB,OAAA,CAAS,SAAU,CAAA,CACnF,KAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,MAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAChE,KAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,SAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAW,CAAA,CAGvD,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAA,CAAY,OAAA,CAAS,SAAU,CAAA,CAC3E,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,OAAQ,CAAA,CACjE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,SAAA,CAAW,OAAA,CAAS,QAAS,CAAA,CACrE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,YAAA,CAAc,OAAA,CAAS,QAAS,CAAA,CACxE,OAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,YAAa,CAAA,CACrD,OAAA,CAAW,CAAE,OAAQ,eAAA,CAAiB,QAAA,CAAU,YAAa,CAAA,CAG7D,aAAA,CAAiB,CAAE,MAAA,CAAQ,eAAA,CAAiB,SAAU,YAAa,CAAA,CACnE,gBAAA,CAAkB,CAAE,MAAA,CAAQ,eAAA,CAAiB,QAAA,CAAU,YAAa,CAAA,CACpE,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAQ,CAAA,CAC9C,SAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAW,CAAA,CACvD,YAAA,CAAgB,CAAE,OAAQ,cAAA,CAAgB,QAAA,CAAU,cAAe,CAAA,CACnE,WAAA,CAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,SAAU,aAAA,CAAe,OAAA,CAAS,YAAa,CAAA,CACvF,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,SAAU,OAAQ,CAAA,CAC9C,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,QAAS,MAAO,CAAA,CAC5D,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAA,CAAY,QAAS,MAAO,CAAA,CAGxE,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAA,CAAW,QAAS,SAAU,CAAA,CACxE,GAAA,CAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,OAAA,CAAS,KAAM,CAAA,CACxD,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,OAAQ,OAAA,CAAS,MAAO,CAAA,CAG5D,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,SAAU,CAAA,CACpD,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,SAAU,CAAA,CACtD,UAAa,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,WAAY,CAAA,CAC1D,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAQ,CAAA,CAC9C,GAAA,CAAO,CAAE,MAAA,CAAQ,MAAO,QAAA,CAAU,WAAY,CAAA,CAG9C,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,QAAS,OAAA,CAAS,QAAS,CAAA,CACjE,YAAA,CAAgB,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,cAAe,CAAA,CACjE,UAAA,CAAc,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,cAAe,CAAA,CAC/D,UAAA,CAAc,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,YAAa,CAAA,CAGvD,KAAA,CAAS,CAAE,MAAA,CAAQ,WAAA,CAAa,QAAA,CAAU,UAAW,CAAA,CACrD,QAAA,CAAY,CAAE,MAAA,CAAQ,WAAY,QAAA,CAAU,UAAW,CAAA,CACvD,UAAA,CAAc,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,SAAU,CAAA,CAC1D,YAAA,CAAgB,CAAE,MAAA,CAAQ,cAAA,CAAgB,QAAA,CAAU,WAAY,CAAA,CAChE,SAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,OAAQ,CAAA,CACpD,QAAA,CAAY,CAAE,OAAQ,UAAA,CAAY,QAAA,CAAU,UAAW,CAAA,CACvD,UAAA,CAAc,CAAE,MAAA,CAAQ,YAAA,CAAc,SAAU,gBAAiB,CAAA,CACjE,MAAA,CAAU,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,gBAAiB,EAC7D,QAAA,CAAY,CAAE,MAAA,CAAQ,YAAA,CAAc,QAAA,CAAU,gBAAiB,CAAA,CAE/D,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,OAAQ,CAAA,CAChD,GAAA,CAAO,CAAE,OAAQ,KAAA,CAAO,QAAA,CAAU,UAAW,CAAA,CAG7C,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,SAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,SAAU,UAAA,CAAY,OAAA,CAAS,QAAS,CAAA,CACtE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,QAAS,CAAA,CACpE,GAAA,CAAO,CAAE,MAAA,CAAQ,MAAO,QAAA,CAAU,KAAM,CAAA,CAGxC,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,OAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,QAAS,OAAA,CAAS,OAAQ,CAAA,CAChE,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAChE,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,SAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAChE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,SAAU,QAAA,CAAU,OAAA,CAAS,QAAS,CAAA,CAGpE,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,SAAU,UAAW,CAAA,CACvD,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAO,EAG3C,YAAA,CAAgB,CAAE,MAAA,CAAQ,cAAA,CAAgB,QAAA,CAAU,gBAAiB,CAAA,CACrE,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,cAAA,CAAkB,CAAE,MAAA,CAAQ,gBAAA,CAAkB,QAAA,CAAU,kBAAmB,CAAA,CAC3E,YAAA,CAAgB,CAAE,MAAA,CAAQ,eAAgB,QAAA,CAAU,mBAAoB,CAAA,CAGxE,MAAA,CAAU,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAAA,CAGjE,GAAA,CAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,SAAU,KAAA,CAAO,OAAA,CAAS,KAAM,CAAA,CACxD,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,SAAU,UAAA,CAAY,OAAA,CAAS,UAAW,CAAA,CAGxE,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,SAAU,QAAA,CAAU,OAAA,CAAS,YAAa,CAAA,CACtE,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,UAAW,CAAA,CACvE,GAAA,CAAO,CAAE,MAAA,CAAQ,MAAO,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,aAAc,CAAA,CAGtE,IAAA,CAAQ,CAAE,MAAA,CAAQ,OAAQ,QAAA,CAAU,UAAW,CAAA,CAC/C,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,OAAQ,CAAA,CAG9C,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,OAAA,CAAS,MAAO,CAAA,CAC5D,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,QAAA,CAAU,QAAS,QAAS,CAAA,CAGpE,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,QAAA,CAAU,QAAS,QAAS,CAAA,CACpE,SAAA,CAAa,CAAE,MAAA,CAAQ,eAAA,CAAiB,QAAA,CAAU,WAAA,CAAa,QAAS,SAAU,CAAA,CAClF,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,UAAA,CAAY,QAAS,MAAO,CAAA,CAChE,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,QAAA,CAAU,WAAY,EACtD,GAAA,CAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,OAAA,CAAS,WAAY,EAC9D,IAAA,CAAQ,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,WAAA,CAAa,OAAA,CAAS,YAAa,EAGxE,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,OAAQ,CAAA,CAC5C,MAAA,CAAU,CAAE,MAAA,CAAQ,QAAA,CAAU,QAAA,CAAU,YAAa,CAAA,CACrD,aAAA,CAAiB,CAAE,OAAQ,eAAA,CAAiB,QAAA,CAAU,mBAAoB,CAAA,CAC1E,OAAA,CAAW,CAAE,MAAA,CAAQ,SAAA,CAAW,SAAU,UAAW,CAAA,CACrD,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAA,CAAQ,QAAS,MAAO,CAAA,CAC5D,QAAA,CAAY,CAAE,MAAA,CAAQ,UAAA,CAAY,QAAA,CAAU,UAAW,CAAA,CACvD,KAAA,CAAS,CAAE,MAAA,CAAQ,OAAA,CAAS,QAAA,CAAU,QAAA,CAAU,OAAA,CAAS,SAAU,CAAA,CACnE,IAAA,CAAQ,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,MAAO,CAAA,CAC3C,YAAe,CAAE,MAAA,CAAQ,aAAA,CAAe,QAAA,CAAU,aAAc,CAAA,CAChE,KAAA,CAAS,CAAE,OAAQ,OAAA,CAAS,QAAA,CAAU,OAAA,CAAS,OAAA,CAAS,OAAQ,CAClE,CAAA,CAMA,eAAsBC,EAAAA,EAAoB,CACxC,GAAI,OAAO,MAAA,EAAW,WAAA,CAAa,OAAO,IAAA,CAE1C,GAAI,CAACH,CAAAA,CACH,GAAI,CAEFA,CAAAA,CADuB,MAAM,OAAO,uBAAuB,EAE7D,CAAA,KAAQ,CACN,OAAA,OAAA,CAAQ,IAAA,CAAK,qEAAqE,CAAA,CAC3E,IACT,CAEF,OAAOA,CACT,CAKA,eAAsBI,EAAAA,EAAkB,CACtC,GAAI,OAAO,MAAA,EAAW,YAAa,OAAO,IAAA,CAE1C,GAAI,CAACH,CAAAA,CACH,GAAI,CAEFA,CAAAA,CADqB,MAAM,OAAO,cAAc,EAElD,CAAA,KAAQ,CACN,OAAA,OAAA,CAAQ,IAAA,CAAK,0EAA0E,EAChF,IACT,CAEF,OAAOA,CACT,CAUO,SAASI,EAAAA,CACdC,CAAAA,CACAC,EAAyB,UAAA,CAC4B,CAErD,IAAMC,CAAAA,CAAcN,EAAAA,CAAcI,CAAsC,CAAA,CAExE,GAAI,CAACE,CAAAA,CAEH,OAAOC,EAAAA,CAAcH,CAAAA,CAAUC,CAAQ,CAAA,CAGzC,IAAMG,EAAcF,CAAAA,CAAmDD,CAAQ,CAAA,CAE/E,OAAQA,CAAAA,EACN,KAAK,UAAA,CACH,OAAI,CAACG,CAAAA,EAAc,CAACV,CAAAA,CAAsB,IAAA,CAAA,CACnCA,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAgBU,KAAe,IAAA,CAExC,KAAK,QAAA,CACH,OAAI,CAACA,CAAAA,EAAc,CAACT,CAAAA,CACX,IAAA,CAAA,CAEFA,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAcS,CAAAA,CAAAA,GAAe,IAAA,CAEtC,KAAK,SAAA,CAAW,CACQ,OAAO,IAAA,CAG/B,CAEA,QACE,OAAO,IACX,CACF,CASA,SAASD,EAAAA,CACPH,CAAAA,CACAC,CAAAA,CACqD,CACrD,OAAQA,CAAAA,EACN,KAAK,UAAA,CAAY,CACf,GAAI,CAACP,CAAAA,CAAe,OAAO,IAAA,CAC3B,IAAMW,CAAAA,CAAgBL,CAAAA,CAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,CAAIA,CAAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CACnEM,CAAAA,CAAgBN,CAAAA,CACnB,MAAM,WAAW,CAAA,CACjB,GAAA,CAAI3W,CAAAA,EAAQA,CAAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,CAAIA,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CACxD,IAAA,CAAK,EAAE,EACV,OAAA,CAAOqW,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAgBW,CAAAA,CAAAA,IACrBX,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAgBY,MAChBZ,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAgBM,CAAAA,CAAAA,CAAAA,EAChB,IACJ,CAEA,KAAK,QAAA,CAAU,CACb,GAAI,CAACL,CAAAA,CACH,OAAO,IAAA,CAET,IAAMY,CAAAA,CAAaP,CAAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAIA,CAAAA,CAAS,KAAA,CAAM,CAAC,EAChEQ,CAAAA,CAAgBR,CAAAA,CAAS,OAAA,CAAQ,UAAA,CAAaS,CAAAA,EAClDA,CAAAA,GAAUT,CAAAA,CAAS,CAAC,EAAIS,CAAAA,CAAM,WAAA,EAAY,CAAIA,CAChD,CAAA,CACA,OAAA,CAAOd,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,EAAcY,CAAAA,CAAAA,IACnBZ,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAcK,CAAAA,CAAAA,CAAAA,GACdL,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAca,CAAAA,CAAAA,CAAAA,EACd,IACJ,CAEA,KAAK,SAAA,CAAW,CACQ,OAAO,IAAA,CAG/B,CAEA,QACE,OAAO,IACX,CACF,CASO,SAASE,EAAAA,CACdV,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMC,CAAAA,CAAcN,EAAAA,CAAcI,CAAsC,CAAA,CACxE,GAAIE,CAAAA,CAAa,CACf,IAAME,CAAAA,CAAcF,CAAAA,CAAmDD,CAAQ,CAAA,CAC/E,GAAIG,CAAAA,CACF,OAAOA,CAEX,CACA,OAAOJ,CACT,CCxXO,IAAMW,EAAAA,CAAuC,CAElD,YAAA,CAAc,WAAA,CACd,aAAA,CAAe,YAAA,CACf,UAAA,CAAY,UACZ,YAAA,CAAc,WAAA,CACd,cAAA,CAAgB,aAAA,CAChB,eAAA,CAAiB,cAAA,CACjB,YAAA,CAAc,WAAA,CACd,eAAgB,aAAA,CAChB,eAAA,CAAiB,cAAA,CACjB,iBAAA,CAAmB,gBAAA,CACnB,eAAA,CAAiB,cAAA,CACjB,WAAA,CAAa,WACb,QAAA,CAAU,OAAA,CACV,SAAA,CAAW,QAAA,CACX,cAAA,CAAgB,aAAA,CAChB,cAAA,CAAgB,aAAA,CAChB,eAAgB,aAAA,CAChB,SAAA,CAAW,QAAA,CACX,WAAA,CAAa,UAAA,CACb,WAAA,CAAa,UAAA,CACb,WAAA,CAAa,WACb,aAAA,CAAe,YAAA,CACf,eAAA,CAAiB,cAAA,CACjB,gBAAA,CAAkB,eAAA,CAClB,eAAA,CAAiB,cAAA,CACjB,YAAA,CAAc,WAAA,CACd,aAAA,CAAe,YAAA,CACf,kBAAA,CAAoB,iBAAA,CACpB,eAAA,CAAiB,cAAA,CACjB,cAAe,YAAA,CAGf,IAAA,CAAQ,WAAA,CACR,IAAA,CAAQ,WAAA,CACR,QAAA,CAAY,WAAA,CACZ,OAAA,CAAW,aACX,IAAA,CAAQ,YAAA,CAGR,KAAA,CAAS,GAAA,CACT,MAAA,CAAU,GAAA,CAGV,MAAA,CAAU,QAAA,CACV,MAAS,QAAA,CAGT,IAAA,CAAQ,KAAA,CACR,GAAA,CAAO,KAAA,CAGP,MAAA,CAAU,MAAA,CACV,MAAA,CAAU,MAAA,CAGV,KAAA,CAAS,MAAA,CACT,MAAA,CAAU,MAAA,CAGV,OAAA,CAAW,QAAA,CAGX,MAAA,CAAU,OACV,OAAA,CAAW,MAAA,CACX,OAAA,CAAW,MAAA,CAGX,IAAA,CAAQ,UAAA,CACR,MAAA,CAAU,UAAA,CACV,YAAe,UAAA,CAGf,KAAA,CAAS,MAAA,CACT,IAAA,CAAQ,MAAA,CAGR,IAAA,CAAQ,OAAA,CACR,QAAA,CAAY,QACZ,IAAA,CAAQ,OAAA,CAGR,WAAA,CAAe,MAAA,CACf,IAAA,CAAQ,MAAA,CAGR,KAAA,CAAS,SAAA,CACT,OAAA,CAAW,SAAA,CAGX,SAAA,CAAa,SAAA,CACb,WAAA,CAAe,SAAA,CAGf,IAAA,CAAQ,OAAA,CACR,MAAS,OAAA,CACT,OAAA,CAAW,OAAA,CAGX,OAAA,CAAW,QAAA,CACX,OAAA,CAAW,QAAA,CACX,IAAA,CAAQ,SAGR,MAAA,CAAU,SAAA,CACV,MAAA,CAAU,SAAA,CACV,IAAA,CAAQ,SAAA,CAGR,IAAA,CAAQ,KAAA,CACR,KAAQ,KAAA,CACR,IAAA,CAAQ,QAAA,CACR,MAAA,CAAU,QAAA,CAGV,MAAA,CAAU,MAAA,CACV,MAAA,CAAU,OACV,QAAA,CAAY,QAAA,CACZ,QAAA,CAAY,QAAA,CAGZ,GAAA,CAAO,UAAA,CACP,KAAA,CAAS,UAAA,CAGT,KAAQ,QAAA,CAGR,IAAA,CAAQ,OAAA,CACR,MAAA,CAAU,OAAA,CAGV,SAAA,CAAa,MAAA,CACb,KAAA,CAAS,OAGT,KAAA,CAAS,MAAA,CACT,QAAA,CAAY,MAAA,CAGZ,IAAA,CAAQ,SAAA,CACR,OAAA,CAAW,SAAA,CACX,KAAQ,SAAA,CAGR,IAAA,CAAQ,UAAA,CACR,QAAA,CAAY,UAAA,CAGZ,IAAA,CAAQ,OAAA,CACR,KAAA,CAAS,OAAA,CAGT,QAAA,CAAY,UAAA,CACZ,GAAA,CAAO,UAAA,CACP,IAAA,CAAQ,UAAA,CAGR,SAAA,CAAa,SACb,GAAA,CAAO,QAAA,CAGP,OAAA,CAAW,OAAA,CACX,GAAA,CAAO,OAAA,CAGP,KAAA,CAAS,OAAA,CACT,KAAQ,OAAA,CAGR,KAAA,CAAS,QAAA,CACT,OAAA,CAAW,QAAA,CAGX,KAAA,CAAS,MAAA,CACT,GAAA,CAAO,OAGP,IAAA,CAAQ,OAAA,CACR,IAAA,CAAQ,OAAA,CAGR,IAAA,CAAQ,OAAA,CACR,IAAA,CAAQ,OAAA,CAGR,QAAA,CAAY,MAAA,CAGZ,YAAA,CAAgB,UAAA,CAGhB,YAAA,CAAgB,MAAA,CAChB,MAAA,CAAU,MAAA,CACV,MAAS,MAAA,CAGT,KAAA,CAAS,UAAA,CAGT,MAAA,CAAU,QAAA,CAGV,IAAA,CAAQ,gBAAA,CACR,QAAA,CAAY,iBACZ,WAAA,CAAe,cAAA,CAGf,QAAA,CAAY,cAAA,CACZ,QAAA,CAAY,cAAA,CACZ,IAAA,CAAQ,cAAA,CAGR,IAAO,MAAA,CACP,SAAA,CAAa,MAAA,CAGb,KAAA,CAAS,UAAA,CACT,KAAA,CAAS,UAAA,CACT,SAAA,CAAa,UAAA,CAGb,EAAA,CAAM,UAAA,CACN,OAAA,CAAW,UAAA,CAGX,KAAA,CAAS,UAAA,CACT,OAAA,CAAW,WAGX,EAAA,CAAM,YAAA,CACN,IAAA,CAAQ,cAAA,CAGR,SAAA,CAAa,KAAA,CACb,IAAA,CAAQ,KAAA,CACR,MAAS,KAAA,CAGT,QAAA,CAAY,QAAA,CACZ,OAAA,CAAW,QAAA,CAGX,QAAA,CAAY,KAAA,CACZ,MAAA,CAAU,MAGV,MAAA,CAAU,OAAA,CACV,KAAA,CAAS,OAAA,CACT,KAAA,CAAS,OAAA,CAGT,OAAA,CAAW,QAAA,CACX,OAAU,QAAA,CACV,IAAA,CAAQ,QAAA,CAGR,MAAA,CAAU,OAAA,CACV,KAAA,CAAS,OAAA,CACT,IAAA,CAAQ,QAGR,OAAA,CAAW,UAAA,CACX,MAAA,CAAU,UAAA,CAGV,IAAA,CAAQ,MAAA,CACR,OAAA,CAAW,MAAA,CAGX,QAAW,UAAA,CACX,QAAA,CAAY,UAAA,CAGZ,KAAA,CAAS,KAAA,CACT,GAAA,CAAO,KAAA,CAGP,IAAA,CAAQ,OACR,KAAA,CAAS,MAAA,CAGT,MAAA,CAAU,SAAA,CACV,OAAA,CAAW,SAAA,CAGX,EAAA,CAAM,OAAA,CACN,YAAA,CAAgB,OAAA,CAChB,KAAA,CAAS,OAAA,CAGT,IAAA,CAAQ,WAAA,CACR,IAAA,CAAQ,WAAA,CACR,YAAe,WAAA,CAGf,KAAA,CAAS,UAAA,CACT,KAAA,CAAS,UAAA,CACT,OAAA,CAAW,UACb,CAAA,CCzQO,SAASC,EAAAA,CAAkBZ,CAAAA,CAAmC,CACnE,GAAI,CAACA,CAAAA,EAAY,OAAOA,CAAAA,EAAa,SACnC,OAAO,CAAE,UAAA,CAAYA,CAAAA,EAAY,EAAA,CAAI,QAAA,CAAU,KAAM,CAAA,CAGvD,IAAMa,CAAAA,CAAarB,EAAAA,CAAYQ,CAAQ,CAAA,CACjCc,CAAAA,CAAcH,EAAAA,CAAaX,CAAQ,GAAKW,EAAAA,CAAaE,CAAU,CAAA,CAErE,OAAIC,CAAAA,CACK,CACL,UAAA,CAAYA,CAAAA,CACZ,SAAU,IAAA,CACV,aAAA,CAAed,CACjB,CAAA,CAGK,CACL,UAAA,CAAYa,CAAAA,CACZ,QAAA,CAAU,KACZ,CACF,CCxCO,IAAME,EAAAA,CAAgC,CAC3C,GAAA,CAAK,QAAA,CACL,MAAA,CAAQ,SAAA,CACR,IAAA,CAAM,GACN,KAAA,CAAO,cAAA,CACP,WAAA,CAAa,IAAA,CACb,cAAA,CAAgB,MAClB,CAAA,CCWA,IAAMC,EAAAA,CAAc1L,gBAAAA,CAAgCyL,EAAiB,CAAA,CA2B9D,SAASE,EAAAA,EAAmC,CACjD,OAAOxL,aAAAA,CAAWuL,EAAW,CAC/B,CCTA,IAAME,EAAAA,CAAgB3jB,mBAAAA,CAAM,UAAA,CAAuC,CAAC,CAClE,IAAA,CAAA4jB,CAAAA,CACA,IAAA,CAAArQ,EACA,SAAA,CAAAzT,CAAAA,CACA,OAAA,CAAA8T,CAAAA,CACA,MAAA,CAAAiQ,CAAAA,CACA,QAAA,CAAAnB,CAAAA,CACA,OAAAoB,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,KAAA,CAAAC,CAAAA,CAAQ,KAAA,CACR,IAAA,CAAAC,EAAO,KAAA,CACP,MAAA,CAAAC,CAAAA,CAAS,KAAA,CACT,OAAA,CAAA3P,CAAAA,CAAU,SAAA,CACV,YAAA,CAAc4P,CAAAA,CACd,aAAA,CAAeC,CACjB,CAAA,CAAGzjB,CAAAA,GAAQ,CA3EX,IAAAuC,CAAAA,CAAAqU,GA4EE,IAAMpU,CAAAA,CAASugB,EAAAA,EAAe,CAExBW,CAAAA,CAAU3B,CAAAA,EAAYvf,CAAAA,CAAO,GAAA,CAC7BmhB,EAAW/Q,CAAAA,EAAA,IAAA,CAAAA,CAAAA,CAAQpQ,CAAAA,CAAO,IAAA,CAC1BohB,CAAAA,CAAaT,CAAAA,EAAU3gB,CAAAA,CAAO,OAC9BqhB,CAAAA,CAAYrhB,CAAAA,CAAO,KAAA,CACnBshB,CAAAA,CAAAA,CAAkBvhB,CAAAA,CAAAC,CAAAA,CAAO,WAAA,GAAP,IAAA,CAAAD,CAAAA,CAAsB,IAAA,CACxCwhB,CAAAA,CAAAA,CAAiBnN,EAAAA,CAAApU,CAAAA,CAAO,cAAA,GAAP,IAAA,CAAAoU,EAAAA,CAAyB,OAE1C,CAACoN,CAAAA,CAAUC,CAAW,CAAA,CAAI5kB,mBAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAC9C,CAAC6kB,CAAAA,CAAeC,CAAgB,CAAA,CAAI9kB,mBAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAE9DA,mBAAAA,CAAM,UAAU,IAAM,CACpB4kB,CAAAA,CAAY,IAAI,CAAA,CAGZP,CAAAA,GAAY,QAAA,CACd9B,EAAAA,EAAgB,CAAE,IAAA,CAAK,IAAMuC,CAAAA,CAAiB,IAAI,CAAC,CAAA,CAC1CT,CAAAA,GAAY,WACrB/B,EAAAA,EAAkB,CAAE,IAAA,CAAK,IAAMwC,CAAAA,CAAiB,IAAI,CAAC,CAAA,CAErDA,EAAiB,IAAI,EAEzB,CAAA,CAAG,CAACT,CAAO,CAAC,CAAA,CAGZ,IAAMU,EAAe/kB,mBAAAA,CAAM,OAAA,CAAQ,IAAM,CACvC,IAAMglB,EAAAA,CAAWpR,CAAAA,CAAUmO,EAAAA,CAAanO,CAAO,CAAA,CAC9BiQ,CAAAA,CAAS7B,EAAAA,CAAY6B,CAAM,CAAA,CAAID,CAAAA,CAC1C,CAAE,UAAA,CAAAqB,CAAW,CAAA,CAAI5B,EAAAA,CAAkB2B,EAAQ,CAAA,CAC3CE,EAAAA,CAAe/B,EAAAA,CAAuB8B,CAAAA,CAAYZ,CAAO,EAC/D,OAAO,CAAE,UAAA,CAAAY,CAAAA,CAAY,YAAA,CAAAC,EAAa,CACpC,CAAA,CAAG,CAACtB,CAAAA,CAAMhQ,CAAAA,CAASiQ,CAAAA,CAAQQ,CAAO,CAAC,CAAA,CAE7B5B,CAAAA,CAAWsC,CAAAA,CAAa,UAAA,CAGxBI,CAAAA,CAAcnlB,mBAAAA,CAAM,OAAA,CAAQ,IAAM,CAOtC,OAAO,IACT,EAAG,CAACqkB,CAAAA,CAASU,CAAAA,CAAa,YAAA,CAAcJ,CAAAA,CAAUD,CAAc,CAAC,CAAA,CAG3DU,CAAAA,CAAiB1lB,EAAAA,CAAS,CAC9B,cAAA,CAAgB6U,CAAAA,GAAY,SAAA,CAC5B,cAAA,CAAgBA,CAAAA,GAAY,UAC5B,uBAAA,CAAyBA,CAAAA,GAAY,WAAA,EAAeA,CAAAA,GAAY,OAAA,CAChE,oCAAA,CAAsCA,CAAAA,GAAY,SAAA,CAClD,uCAAwCA,CAAAA,GAAY,SAAA,CACpD,kBAAA,CAAoBA,CAAAA,GAAY,OAClC,CAAC,CAAA,CAGD,GAAI,CAACoQ,CAAAA,CACH,OACEviB,cAAAA,CAAC,MAAA,CAAA,CACC,KAAA,CAAO,CAAE,KAAA,CAAOkiB,CAAAA,CAAU,MAAA,CAAQA,CAAS,CAAA,CAC3C,SAAA,CAAWhlB,CAAAA,CAAM8lB,CAAAA,CAAgBtlB,CAAS,CAAA,CAC1C,cAAaskB,CAAAA,GAAe,MAAA,CAAYA,CAAAA,CAAa,IAAA,CACrD,YAAA,CAAYD,CAAAA,CACd,CAAA,CAMJ,IAAIkB,EAAyC,IAAA,CAmB7C,GAjBIhB,CAAAA,GAAY,UAAA,EAEdgB,CAAAA,CAAgBvJ,EAAAA,CAAM2G,CAAoB,CAAA,EAAK,KAE3C,CAAC4C,CAAAA,EAAgBR,CAAAA,GACnBQ,CAAAA,CAAe7C,EAAAA,CAAoBC,CAAAA,CAAU4B,CAAO,CAAA,CAAA,EAE7CA,IAAY,SAAA,EACrBgB,CAAAA,CAAeF,CAAAA,CACVE,CAAAA,GACHA,CAAAA,CAAe7C,EAAAA,CAAoBC,CAAAA,CAAU4B,CAAO,IAItDgB,CAAAA,CAAe7C,EAAAA,CAAoBC,CAAAA,CAAU4B,CAAO,CAAA,CAGlD,CAACgB,CAAAA,CACH,OAAIhB,IAAY,SAAA,EAAa,IAAoB,CAC3C,OAAA,CAAQ,GAAA,CAAI,QAAA,GAAa,aAAA,EAC3B,QAAQ,IAAA,CACN,CAAA,MAAA,EAAS5B,CAAQ,CAAA,yHAAA,CAEnB,CAAA,CAGF,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAASA,CAAQ,CAAA,0BAAA,EAA6B4B,CAAO,CAAA,CAAA,CAAG,CAAA,CAGrEjiB,cAAAA,CAAC,MAAA,CAAA,CACC,GAAA,CAAKzB,EACL,SAAA,CAAWrB,CAAAA,CACT,2FAAA,CACA8lB,CAAAA,CACAtlB,CACF,CAAA,CACA,KAAA,CAAO,CAAE,MAAOwkB,CAAAA,CAAU,MAAA,CAAQA,CAAS,CAAA,CAC3C,YAAA,CAAYH,CAAAA,EAAa,CAAA,2DAAA,EAAiB1B,CAAQ,GAClD,KAAA,CAAO,CAAA,gBAAA,EAAmBA,CAAQ,CAAA,CAAA,CAElC,QAAA,CAAArgB,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAgC,aAAA,CAAY,MAAA,CAAO,QAAA,CAAA,GAAA,CAEnE,CAAA,CACF,CAAA,CAcJ,IAAMkjB,CAAAA,CAA2B,CAC/B,IAAA,CAAM,OAAOhB,CAAAA,EAAa,QAAA,CAAWA,CAAAA,CAAW,MAAA,CAChD,KAAA,CAAsCA,CAAAA,CACtC,OAAuCA,CAAAA,CACvC,KAAA,CAAOE,CACT,CAAA,CAEIH,CAAAA,GAAY,UAAA,CACdiB,CAAAA,CAAU,MAAA,CAASf,EAEnBe,CAAAA,CAAU,WAAA,CAAcb,CAAAA,CAG1B,IAAMc,CAAAA,CAAmB7lB,EAAAA,CAAS,CAChC,eAAA,CAAiBskB,CAAAA,CACjB,cAAA,CAAgBC,CAAAA,CAChB,gBAAA,CAAkBC,CAAAA,CAClB,yCAAA,CAA2CH,CAC7C,CAAC,EAEKyB,CAAAA,CAA2C,EAAC,CAElD,OAAIrB,CAAAA,EACFqB,CAAAA,CAAmB,YAAY,CAAA,CAAIrB,EACnCqB,CAAAA,CAAmB,aAAa,CAAA,CAAI,KAAA,EAC3BpB,CAAAA,GAAe,MAAA,CACxBoB,CAAAA,CAAmB,aAAa,EAAIpB,CAAAA,CAEpCoB,CAAAA,CAAmB,aAAa,CAAA,CAAI,IAAA,CAIpCpjB,cAAAA,CAAC,MAAA,CAAA,CACC,GAAA,CAAKzB,EACL,SAAA,CAAWrB,CAAAA,CACT,yCAAA,CACAimB,CAAAA,CACAH,CAAAA,CACAtlB,CACF,CAAA,CACA,KAAA,CAAO,CAAE,KAAA,CAAOwkB,CAAAA,CAAU,MAAA,CAAQA,CAAS,CAAA,CAC1C,GAAGkB,CAAAA,CAEH,QAAA,CAAAH,GAAgBrlB,mBAAAA,CAAM,aAAA,CAAcqlB,CAAAA,CAAc,CACjD,GAAGC,CAAAA,CACH,SAAA,CAAWF,CAAAA,CACX,cAAe,IACjB,CAA8C,CAAA,CAChD,CAEJ,CAAC,CAAA,CAEDzB,EAAAA,CAAc,WAAA,CAAc,MAAA,CAE5B,IAAM8B,EAAAA,CAAezlB,mBAAAA,CAAM,IAAA,CAAK2jB,EAAAA,CAAe,CAAC+B,CAAAA,CAAWC,IAEvDD,CAAAA,CAAU,IAAA,GAASC,CAAAA,CAAU,IAAA,EAC7BD,CAAAA,CAAU,IAAA,GAASC,CAAAA,CAAU,IAAA,EAC7BD,EAAU,SAAA,GAAcC,CAAAA,CAAU,SAAA,EAClCD,CAAAA,CAAU,OAAA,GAAYC,CAAAA,CAAU,OAAA,EAChCD,CAAAA,CAAU,SAAWC,CAAAA,CAAU,MAAA,EAC/BD,CAAAA,CAAU,QAAA,GAAaC,CAAAA,CAAU,QAAA,EACjCD,CAAAA,CAAU,QAAA,GAAaC,CAAAA,CAAU,QAAA,EACjCD,CAAAA,CAAU,KAAA,GAAUC,CAAAA,CAAU,KAAA,EAC9BD,CAAAA,CAAU,IAAA,GAASC,EAAU,IAAA,EAC7BD,CAAAA,CAAU,MAAA,GAAWC,CAAAA,CAAU,MAAA,EAC/BD,CAAAA,CAAU,OAAA,GAAYC,CAAAA,CAAU,SAChCD,CAAAA,CAAU,MAAA,GAAWC,CAAAA,CAAU,MAAA,EAC/BD,CAAAA,CAAU,YAAY,CAAA,GAAMC,CAAAA,CAAU,YAAY,CAAA,EAClDD,CAAAA,CAAU,aAAa,CAAA,GAAMC,CAAAA,CAAU,aAAa,CAEvD,CAAA,CAEYC,CAAAA,CAAOH,EAAAA,CACpBG,CAAAA,CAAK,WAAA,CAAc,MAAA,CAEZ,IAAMC,EAAAA,CAAc7lB,mBAAAA,CAAM,WAC/B,CAACsC,CAAAA,CAAO3B,CAAAA,GAAQyB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,GAAA,CAAKjlB,CAAAA,CAAK,KAAK,OAAA,CAAS,GAAG2B,CAAAA,CAAO,CAC1D,CAAA,CACAujB,EAAAA,CAAY,WAAA,CAAc,aAAA,CAEnB,IAAMC,EAAAA,CAAa9lB,mBAAAA,CAAM,UAAA,CAC9B,CAACsC,CAAAA,CAAO3B,CAAAA,GAAQyB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,GAAA,CAAKjlB,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,GAAG2B,CAAAA,CAAO,CACzD,CAAA,CACAwjB,GAAW,WAAA,CAAc,YAAA,CAElB,IAAMC,EAAAA,CAAc/lB,mBAAAA,CAAM,UAAA,CAC/B,CAACsC,CAAAA,CAAO3B,IACNyB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,GAAA,CAAKjlB,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,UAAU,IAAA,CAAI,IAAA,CAAC,YAAA,CAAW,qBAAA,CAAQ,GAAG2B,CAAAA,CAAO,CAErF,CAAA,CACAyjB,EAAAA,CAAY,WAAA,CAAc,aAAA,CAEnB,IAAMC,EAAAA,CAAchmB,mBAAAA,CAAM,UAAA,CAC/B,CAACsC,EAAO3B,CAAAA,GACNyB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,GAAA,CAAKjlB,CAAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,YAAA,CAAW,cAAA,CAAM,GAAG2B,CAAAA,CAAO,CAE/F,EACA0jB,EAAAA,CAAY,WAAA,CAAc,aAAA,CAEnB,IAAMC,EAAAA,CAAYjmB,mBAAAA,CAAM,UAAA,CAC7B,CAACsC,CAAAA,CAAO3B,CAAAA,GACNyB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,GAAA,CAAKjlB,CAAAA,CAAK,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAW,cAAA,CAAM,GAAG2B,CAAAA,CAAO,CAEjG,CAAA,CACA2jB,EAAAA,CAAU,WAAA,CAAc,WAAA,CChSxB,IAAMC,EAAAA,CAAmBlmB,mBAAAA,CAAM,UAAA,CAC7B,CAAC,CAAE,MAAA,CAAAmmB,CAAAA,CAAQ,QAAA,CAAAC,CAAAA,CAAU,SAAA,CAAAtmB,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CACxC,GAAM,CAAE,MAAA,CAAAmY,CAAAA,CAAQ,UAAA,CAAAV,CAAAA,CAAY,QAAA,CAAAa,CAAS,CAAA,CAAIjB,CAAAA,GAEzC,OACE5V,cAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,wCAAA,CAA0CQ,CAAS,CAAA,CAEpE,QAAA,CAAAqC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACZ,QAAA,CAAA,CAAAikB,CAAAA,EACCD,GACE/jB,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS+jB,CAAAA,CACT,SAAA,CAAU,mEAAA,CACV,aAAW,0BAAA,CAEX,QAAA,CAAA/jB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,aAAA,CAAc,IAAA,CAAM,GAAI,CAAA,CACrC,CAAA,CAGJzjB,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,qCACX,QAAA,CAAAgW,CAAAA,CAAaU,CAAAA,CAAO,SAAA,CAAYA,CAAAA,CAAO,SAAA,CAC1C,CAAA,CACCV,CAAAA,EAAca,CAAAA,CAAS,IAAA,EACtB9W,eAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,+BAAA,CACV,QAAA,CAAA,CAAA2W,CAAAA,CAAO,WAAYG,CAAAA,CAAS,IAAA,CAAA,CAC/B,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CACF,EAEAiN,GAAiB,WAAA,CAAc,kBAAA,CCzC/B,IAAMG,EAAAA,CAAqBrmB,mBAAAA,CAAM,UAAA,CAC/B,CAAC,CAAE,SAAA,CAAAF,CAAU,CAAA,CAAGa,IAAQ,CArB1B,IAAAuC,CAAAA,CAAAqU,CAAAA,CAsBI,GAAM,CAAE,QAAA,CAAA0B,CAAAA,CAAU,YAAA0B,CAAAA,CAAa,QAAA,CAAA3B,CAAAA,CAAU,MAAA,CAAAF,CAAAA,CAAQ,OAAA,CAAAvE,CAAAA,CAAS,iBAAA,CAAAoH,EAAmB,SAAA,CAAAhC,CAAAA,CAAW,qBAAA,CAAAO,CAAsB,CAAA,CAAIlC,CAAAA,EAAc,CAC1H,CAACsO,CAAAA,CAAUC,CAAW,CAAA,CAAIzlB,WAAAA,CAAS,EAAE,CAAA,CACrC0lB,CAAAA,CAAeplB,SAAAA,CAAyB,IAAI,CAAA,CAE5CqlB,CAAAA,CAAmBnnB,CAAAA,CACvB,0BAAA,CACAiV,CAAAA,GAAY,OAAA,CACR,iGAAA,CACAA,CAAAA,GAAY,UACV,gBAAA,CACA,eAAA,CACNzU,CACF,CAAA,CAEM4mB,CAAAA,CACJ,wJAAA,CAEIC,CAAAA,CAAe,gDAAA,CAGfC,EAASllB,cAAAA,CAAamlB,CAAAA,EAAgB,CAC1C,IAAMC,CAAAA,CAAUD,CAAAA,CAAI,IAAA,EAAK,CACrBC,GAAW,CAAC7N,CAAAA,CAAS,IAAA,CAAK,QAAA,CAAS6N,CAAO,CAAA,EAC5CnM,CAAAA,CAAY,MAAA,CAAQ,CAAC,GAAG1B,CAAAA,CAAS,IAAA,CAAM6N,CAAO,CAAC,CAAA,CAEjDP,CAAAA,CAAY,EAAE,EAChB,CAAA,CAAG,CAACtN,CAAAA,CAAS,IAAA,CAAM0B,CAAW,CAAC,CAAA,CAGzBoM,CAAAA,CAAYrlB,eAAaslB,CAAAA,EAAwB,CACrDrM,CAAAA,CAAY,MAAA,CAAQ1B,CAAAA,CAAS,IAAA,CAAK,MAAA,CAAQzX,CAAAA,EAAMA,CAAAA,GAAMwlB,CAAW,CAAC,EACpE,CAAA,CAAG,CAAC/N,CAAAA,CAAS,IAAA,CAAM0B,CAAW,CAAC,CAAA,CAGzBsM,CAAAA,CAAuBvlB,cAAAA,CAAaqG,CAAAA,EAA2C,CACnF,IAAME,CAAAA,CAAQF,EAAE,MAAA,CAAO,KAAA,CAEvB,GAAIE,CAAAA,CAAM,QAAA,CAAS,GAAG,CAAA,CAAG,CACvB,IAAMif,CAAAA,CAAQjf,CAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAC7Bif,CAAAA,CAAM,OAAA,CAAQ,CAACC,CAAAA,CAAMC,CAAAA,GAAQ,CACvBA,CAAAA,CAAMF,CAAAA,CAAM,MAAA,CAAS,CAAA,CAEvBN,CAAAA,CAAOO,CAAI,CAAA,CAGXZ,CAAAA,CAAYY,CAAI,EAEpB,CAAC,EACH,CAAA,KACEZ,CAAAA,CAAYte,CAAK,EAErB,CAAA,CAAG,CAAC2e,CAAM,CAAC,CAAA,CAGLS,CAAAA,CAAmB3lB,cAAAA,CAAaqG,GAAuC,CACvEA,CAAAA,CAAE,GAAA,GAAQ,OAAA,EACZA,CAAAA,CAAE,cAAA,EAAe,CACjB6e,CAAAA,CAAON,CAAQ,CAAA,EACNve,CAAAA,CAAE,GAAA,GAAQ,WAAA,EAAe,CAACue,CAAAA,EAAYrN,CAAAA,CAAS,KAAK,MAAA,CAAS,CAAA,EAEtE8N,CAAAA,CAAU9N,CAAAA,CAAS,IAAA,CAAKA,CAAAA,CAAS,IAAA,CAAK,MAAA,CAAS,CAAC,CAAC,EAErD,CAAA,CAAG,CAACqN,CAAAA,CAAUrN,CAAAA,CAAS,IAAA,CAAM2N,CAAAA,CAAQG,CAAS,CAAC,CAAA,CAE/C,OACE5kB,eAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKxB,CAAAA,CAAK,SAAA,CAAW8lB,EACxB,QAAA,CAAA,CAAArkB,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,+BAAA,CAAiC,QAAA,CAAA0W,CAAAA,CAAO,SAAA,CAAU,EAEhE3W,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uCAAA,CAEZ,QAAA,CAAA,CAAA6W,CAAAA,CAAS,UAAA,EACR7W,eAAAA,CAAC,OACC,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWwkB,CAAAA,CACf,QAAA,CAAA,CAAA7N,CAAAA,CAAO,IAAA,CAAK,MACf,CAAA,CACA3W,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CACb,QAAA,CAAA0W,CAAAA,CAAO,UAAA,CACV,CAAA,CACA1W,cAAAA,CAAC,OAAA,CAAA,CACC,KAAK,MAAA,CACL,KAAA,CAAO6W,CAAAA,CAAS,IAAA,CAChB,QAAA,CAAWlR,CAAAA,EAAM,CACf4S,CAAAA,CAAY,OAAQ/D,EAAAA,CAAc7O,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,CACjDmS,CAAAA,CAAsB,IAAI,EAC5B,CAAA,CACA,SAAA,CAAW5a,CAAAA,CAAMonB,CAAAA,CAAc,QAAQ,CAAA,CACvC,WAAA,CAAY,cAAA,CACd,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAID1N,CAAAA,CAAS,UAAA,EACR7W,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,eAAC,OAAA,CAAA,CAAM,SAAA,CAAWukB,CAAAA,CAAe,QAAA,CAAA7N,CAAAA,CAAO,IAAA,CAAK,CAAA,CAC7C3W,eAAAA,CAAC,OAAI,SAAA,CAAW7C,CAAAA,CACd,qMACF,CAAA,CAEG,QAAA,CAAA,CAAA2Z,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAK4N,GAClB1kB,eAAAA,CAAC,MAAA,CAAA,CAEC,SAAA,CAAU,0FAAA,CAET,QAAA,CAAA,CAAA0kB,CAAAA,CACDzkB,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM2kB,CAAAA,CAAUF,CAAG,CAAA,CAC5B,SAAA,CAAU,uCACV,YAAA,CAAY,CAAA,EAAGA,CAAG,CAAA,0BAAA,CAAA,CAElB,QAAA,CAAAzkB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,KAAK,GAAA,CAAI,IAAA,CAAM,EAAA,CAAI,CAAA,CAC3B,CAAA,CAAA,CAAA,CAXKiB,CAYP,CACD,CAAA,CAEDzkB,eAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,KAAA,CAAOkkB,CAAAA,CACP,QAAA,CAAUW,CAAAA,CACV,SAAA,CAAWI,EACX,SAAA,CAAU,0EAAA,CACV,WAAA,CAAapO,CAAAA,CAAS,IAAA,CAAK,MAAA,GAAW,CAAA,CAAIH,CAAAA,CAAO,gBAAkB,8BAAA,CACrE,CAAA,CAAA,CACF,CAAA,CACA1W,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CAAqC,QAAA,CAAA,oEAAA,CAElD,GACF,CAAA,CAAA,CAEJ,CAAA,CAGC4W,CAAAA,CAAS,gBAAA,EACR7W,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,SAAM,SAAA,CAAWukB,CAAAA,CAAe,QAAA,CAAA7N,CAAAA,CAAO,UAAA,CAAW,CAAA,CACnD3W,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CAEZ,QAAA,CAAA,CAAA8W,CAAAA,CAAS,UAAA,EACR9W,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2DACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK6W,CAAAA,CAAS,UAAA,CACd,GAAA,CAAI,0DAAA,CACJ,UAAU,4BAAA,CACZ,CAAA,CACA7W,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMuY,EAAY,YAAA,CAAc,EAAE,CAAA,CAC3C,SAAA,CAAU,oGAAA,CACV,YAAA,CAAW,iCAAA,CAEX,QAAA,CAAAvY,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAM,EAAA,CAAI,CAAA,CAC3B,GACF,CAAA,CAIFzjB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CACC,KAAK,MAAA,CACL,KAAA,CAAO6W,CAAAA,CAAS,UAAA,CAChB,QAAA,CAAWlR,CAAAA,EAAM4S,CAAAA,CAAY,YAAA,CAAc5S,EAAE,MAAA,CAAO,KAAK,CAAA,CACzD,SAAA,CAAWzI,CAAAA,CAAMonB,CAAAA,CAAc,QAAQ,CAAA,CACvC,WAAA,CAAa5N,CAAAA,CAAO,qBAAA,CACtB,CAAA,CACA1W,cAAAA,CAAC,OAAA,CAAA,CACC,GAAA,CAAKokB,CAAAA,CACL,KAAK,MAAA,CACL,MAAA,CAAO,SAAA,CACP,SAAA,CAAU,QAAA,CACV,QAAA,CAAU,MAAOze,CAAAA,EAAqC,CAlMxE,IAAA7E,CAAAA,CAmMoB,IAAM0Y,CAAAA,CAAAA,CAAO1Y,CAAAA,CAAA6E,CAAAA,CAAE,MAAA,CAAO,KAAA,GAAT,YAAA7E,CAAAA,CAAiB,CAAA,CAAA,CAC9B,GAAI0Y,CAAAA,CAAM,CACR,IAAM0L,CAAAA,CAAM,MAAM3L,EAAkBC,CAAI,CAAA,CACpC0L,CAAAA,EACF3M,CAAAA,CAAY,YAAA,CAAc2M,CAAG,EAEjC,CAEAvf,EAAE,MAAA,CAAO,KAAA,CAAQ,GACnB,CAAA,CACF,CAAA,CACA3F,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,SACL,OAAA,CAAS,IAAG,CAhN9B,IAAAc,CAAAA,CAgNiC,OAAA,CAAAA,CAAAA,CAAAsjB,CAAAA,CAAa,UAAb,IAAA,CAAA,MAAA,CAAAtjB,CAAAA,CAAsB,KAAA,EAAA,CAAA,CACrC,QAAA,CAAUyW,CAAAA,CACV,SAAA,CAAU,4HAAA,CACV,KAAA,CAAM,uCAAA,CAEL,QAAA,CAAAA,CAAAA,CACCvX,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAM,EAAA,CAAI,IAAA,CAAI,IAAA,CAAC,CAAA,CAEnCxjB,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAM,EAAA,CAAI,CAAA,CAElC,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAIFzjB,eAAAA,CAAC,OAAI,SAAA,CAAU,uCAAA,CACZ,QAAA,CAAA,CAAA6W,CAAAA,CAAS,iBAAA,EACR7W,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWukB,CAAAA,CAAe,QAAA,CAAA7N,CAAAA,CAAO,WAAA,CAAY,CAAA,CACpD1W,eAAC,OAAA,CAAA,CACC,IAAA,CAAK,gBAAA,CACL,KAAA,CAAA,CAAOc,CAAAA,CAAA+V,CAAAA,CAAS,WAAA,GAAT,IAAA,CAAA/V,EAAwB,EAAA,CAC/B,QAAA,CAAW6E,CAAAA,EAAM4S,CAAAA,CAAY,aAAA,CAAe5S,CAAAA,CAAE,MAAA,CAAO,KAAA,EAAS,IAAI,CAAA,CAClE,SAAA,CAAW2e,CAAAA,CACb,CAAA,CACAtkB,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CACV,QAAA,CAAA0W,CAAAA,CAAO,eAAA,CACV,CAAA,CAAA,CACF,CAAA,CAGDE,CAAAA,CAAS,eAAA,EACR7W,eAAAA,CAAC,OACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWukB,CAAAA,CAAe,QAAA,CAAA7N,CAAAA,CAAO,SAAA,CAAU,EAClD1W,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,gBAAA,CACL,KAAA,CAAA,CAAOmV,CAAAA,CAAA0B,CAAAA,CAAS,SAAA,GAAT,KAAA1B,CAAAA,CAAsB,EAAA,CAC7B,QAAA,CAAWxP,CAAAA,EAAM4S,CAAAA,CAAY,WAAA,CAAa5S,CAAAA,CAAE,MAAA,CAAO,OAAS,IAAI,CAAA,CAChE,SAAA,CAAW2e,CAAAA,CACb,CAAA,CACAtkB,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,qCACV,QAAA,CAAA0W,CAAAA,CAAO,aAAA,CACV,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CACF,EAEAuN,EAAAA,CAAmB,WAAA,CAAc,oBAAA,CClPjC,IAAMkB,EAAAA,CAAyBvnB,mBAAAA,CAAM,UAAA,CACnC,CAAC,CAAE,SAAA,CAAAF,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CACtB,GAAM,CAAE,UAAAuW,CAAAA,CAAW,cAAA,CAAAiC,CAAAA,CAAgB,iBAAA,CAAAC,CAAAA,CAAmB,WAAA,CAAAC,CAAAA,CAAa,cAAA,CAAAC,EAAgB,QAAA,CAAAN,CAAAA,CAAU,MAAA,CAAAF,CAAO,CAAA,CAAId,CAAAA,EAAc,CAEtH,OACE7V,gBAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,0EAAA,CACAQ,CACF,CAAA,CACA,IAAA,CAAK,SAAA,CACL,YAAA,CAAW,2BAAA,CAEX,QAAA,CAAA,CAAAsC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cACZ,QAAA,CAAA8U,CAAAA,CAAU,GAAA,CAAKE,CAAAA,EAAS,CACvB,IAAM3E,CAAAA,CAAW0G,CAAAA,GAAmB/B,EAAK,GAAA,CACnCoQ,CAAAA,CAAYpQ,CAAAA,CAAK,SAAA,CAEvB,OACEjV,eAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,SACL,IAAA,CAAK,KAAA,CACL,eAAA,CAAesQ,CAAAA,CACf,eAAA,CAAe,CAAA,SAAA,EAAY2E,CAAAA,CAAK,GAAG,CAAA,CAAA,CACnC,EAAA,CAAI,CAAA,IAAA,EAAOA,CAAAA,CAAK,GAAG,CAAA,CAAA,CACnB,OAAA,CAAS,IAAMgC,EAAkBhC,CAAAA,CAAK,GAAG,CAAA,CACzC,SAAA,CAAW9X,CAAAA,CACT,wDAAA,CACAmT,CAAAA,CACI,sDAAA,CACA,sCACN,CAAA,CAEC,QAAA,CAAA,CAAA2E,CAAAA,CAAK,IAAA,EAAQhV,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,QAAA,CAAU,SAAAgV,CAAAA,CAAK,IAAA,CAAK,CAAA,CACjDA,CAAAA,CAAK,KAAA,CACLoQ,CAAAA,EAAa,IAAA,CAAA,CAAA,CAhBTpQ,CAAAA,CAAK,GAiBZ,CAEJ,CAAC,CAAA,CACH,CAAA,CAEC4B,CAAAA,CAAS,aAAA,EACR7W,eAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAAS,IAAMmX,CAAAA,CAAe,CAACD,CAAW,CAAA,CAC1C,SAAA,CAAU,oIAEV,QAAA,CAAA,CAAAjX,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAMvM,CAAAA,CAAc,QAAA,CAAW,KAAA,CAAO,KAAM,EAAA,CAAI,CAAA,CACrDA,CAAAA,CAAcP,CAAAA,CAAO,QAAA,CAAWA,CAAAA,CAAO,OAAA,CAAA,CAC1C,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAyO,EAAAA,CAAuB,WAAA,CAAc,wBAAA,CCzDrC,IAAME,EAAAA,CAAoBznB,oBAAM,UAAA,CAC9B,CAAC,CAAE,SAAA,CAAAF,CAAAA,CAAW,WAAA,CAAA4nB,CAAY,CAAA,CAAG/mB,IAAQ,CArBvC,IAAAuC,CAAAA,CAsBI,GAAM,CACJ,QAAA,CAAA+V,CAAAA,CACA,cAAA,CAAAE,CAAAA,CACA,uBAAA,CAAAyB,CAAAA,CACA,WAAA,CAAAD,CAAAA,CACA,QAAA,CAAA3B,CAAAA,CACA,MAAA,CAAAF,EACA,SAAA,CAAA5B,CAAAA,CACA,YAAA,CAAAV,CAAAA,CACA,UAAA,CAAA4B,CAAAA,CACA,kBAAA,CAAA6B,CACF,EAAIjC,CAAAA,EAAc,CAEZ2P,CAAAA,CAAAA,CAAAA,CAAoBzkB,CAAAA,CAAAgU,CAAAA,CAAU,IAAA,CAAM0B,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,GAAjC,IAAA,CAAA,MAAA,CAAA1V,CAAAA,CAAoC,GAAA,IAAQiW,CAAAA,CAChEyO,CAAAA,CAAc1Q,CAAAA,CAAU,IAAA,CAAM0B,CAAAA,EAAMA,CAAAA,CAAE,GAAA,GAAQO,CAAc,CAAA,CAE5DuN,CAAAA,CACJ,wJAAA,CAEIC,CAAAA,CAAe,iDAEfkB,CAAAA,CAAqB5f,CAAAA,EAAkB,CAC3C2S,CAAAA,CAAwB,OAAA,CAASzB,CAAAA,CAAgBlR,CAAK,CAAA,CAIlDkR,IAAmB,IAAA,EAAQ,CAACf,CAAAA,EAAc,CAAC6B,CAAAA,EAC7CU,CAAAA,CAAY,MAAA,CAAQnE,CAAAA,CAAavO,CAAK,CAAC,EAE3C,CAAA,CAGM6f,CAAAA,CAAgBC,CAAAA,EAChBJ,CAAAA,CACK,CAAA,EAAGI,CAAS,KAEd,CAAA,EAAGA,CAAS,CAAA,EAAA,EAAA,CAAKH,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAa,KAAA,GAASzO,CAAc,IAG9D,OACEhX,eAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKxB,CAAAA,CAAK,SAAA,CAAWrB,CAAAA,CAAM,eAAA,CAAiBQ,CAAS,CAAA,CAExD,QAAA,CAAA,CAAAqC,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWukB,EAAe,QAAA,CAAAmB,CAAAA,CAAahP,CAAAA,CAAO,UAAU,CAAA,CAAE,CAAA,CACjE1W,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,KAAA,CAAO6W,CAAAA,CAAS,KAAA,CAAME,CAAc,CAAA,EAAK,EAAA,CACzC,SAAWpR,CAAAA,EAAM8f,CAAAA,CAAkB9f,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACjD,SAAA,CAAW2e,CAAAA,CACX,YAAa5N,CAAAA,CAAO,gBAAA,CACtB,CAAA,CAAA,CACF,CAAA,CAGCE,CAAAA,CAAS,aAAA,EACR7W,eAAAA,CAAC,KAAA,CAAA,CACC,UAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWukB,CAAAA,CAAe,QAAA,CAAAmB,CAAAA,CAAahP,CAAAA,CAAO,OAAO,CAAA,CAAE,CAAA,CAC9D1W,cAAAA,CAAC,UAAA,CAAA,CACC,KAAA,CAAO6W,CAAAA,CAAS,OAAA,CAAQE,CAAc,GAAK,EAAA,CAC3C,QAAA,CAAWpR,CAAAA,EAAM6S,CAAAA,CAAwB,SAAA,CAAWzB,CAAAA,CAAgBpR,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAClF,IAAA,CAAM,CAAA,CACN,SAAA,CAAWzI,CAAAA,CAAMonB,CAAAA,CAAc,aAAa,CAAA,CAC5C,YAAa5N,CAAAA,CAAO,kBAAA,CACtB,CAAA,CAAA,CACF,CAAA,CAIF3W,eAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAWwkB,CAAAA,CACf,QAAA,CAAA,CAAAmB,CAAAA,CAAahP,CAAAA,CAAO,YAAY,CAAA,CAAE,+BACrC,CAAA,CACA1W,cAAAA,CAAC,UAAA,CAAA,CACC,GAAA,CAAKslB,CAAAA,CACL,KAAA,CAAOzO,CAAAA,CAAS,OAAA,CAAQE,CAAc,CAAA,EAAK,EAAA,CAC3C,QAAA,CAAWpR,CAAAA,EAAM6S,CAAAA,CAAwB,SAAA,CAAWzB,CAAAA,CAAgBpR,CAAAA,CAAE,OAAO,KAAK,CAAA,CAClF,IAAA,CAAM,EAAA,CACN,SAAA,CAAWzI,CAAAA,CAAMonB,CAAAA,CAAc,0CAA0C,EACzE,WAAA,CAAa5N,CAAAA,CAAO,kBAAA,CACtB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CACF,EAEA2O,GAAkB,WAAA,CAAc,mBAAA,CCzFhC,SAASO,GAAWld,CAAAA,CAAsB,CACxC,OAAOA,CAAAA,CACJ,OAAA,CAAQ,IAAA,CAAM,OAAO,CAAA,CACrB,QAAQ,IAAA,CAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,CAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,CAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,IAAA,CAAM,QAAQ,CAC3B,CAMO,SAASmd,EAAAA,CAAcnd,CAAAA,CAAsB,CAClD,GAAI,CAACA,CAAAA,CAAM,OAAO,EAAA,CAElB,IAAIod,CAAAA,CAAOpd,CAAAA,CAGX,OAAAod,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,2BAAA,CAA6B,CAAC1V,EAAG4E,CAAAA,CAAM+Q,CAAAA,GAElD,CAAA,oGAAA,EADSH,EAAAA,CAAWG,CAAAA,CAAK,IAAA,EAAM,CAC+E,CAAA,aAAA,CACtH,CAAA,CAGDD,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CACV,YAAA,CACA,oFACF,CAAA,CAGAA,EAAOA,CAAAA,CAAK,OAAA,CAAQ,mBAAA,CAAqB,uDAAuD,CAAA,CAChGA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,mBAAoB,qDAAqD,CAAA,CAC7FA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAmB,qDAAqD,CAAA,CAC5FA,EAAOA,CAAAA,CAAK,OAAA,CAAQ,gBAAA,CAAkB,sDAAsD,CAAA,CAC5FA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,eAAA,CAAiB,kDAAkD,CAAA,CACvFA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,cAAA,CAAgB,kDAAkD,EAGtFA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,UAAA,CAAY,0DAA0D,CAAA,CAG1FA,CAAAA,CAAOA,CAAAA,CAAK,QACV,cAAA,CACA,uIACF,CAAA,CAGAA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,gBAAA,CAAkB,qBAAqB,EAC3DA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,YAAA,CAAc,aAAa,CAAA,CAC/CA,CAAAA,CAAOA,CAAAA,CAAK,QAAQ,YAAA,CAAc,qCAAqC,CAAA,CAGvEA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CACV,0BAAA,CACA,+JACF,EAGAA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAmB,0BAA0B,CAAA,CACjEA,CAAAA,CAAOA,CAAAA,CAAK,QAAQ,0BAAA,CAA6BhF,CAAAA,EACxC,CAAA,iDAAA,EAAoDA,CAAK,CAAA,KAAA,CACjE,CAAA,CAGDgF,CAAAA,CAAOA,CAAAA,CAAK,QAAQ,UAAA,CAAY,CAAA;AAAA,CAAU,CAAA,CAG1CA,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,uBAAA,CAAyB,CAAA;AAAA,CAAgB,CAAA,CAEtDA,CACT,CAMO,SAASE,GAActd,CAAAA,CAAsB,CAClD,OAAKA,CAAAA,CAEEA,CAAAA,CAEJ,OAAA,CAAQ,kBAAmB,EAAE,CAAA,CAE7B,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CAEtB,QAAQ,cAAA,CAAgB,EAAE,CAAA,CAE1B,OAAA,CAAQ,gBAAA,CAAkB,IAAI,EAC9B,OAAA,CAAQ,YAAA,CAAc,IAAI,CAAA,CAC1B,OAAA,CAAQ,YAAA,CAAc,IAAI,CAAA,CAE1B,OAAA,CAAQ,wBAAA,CAA0B,IAAI,CAAA,CAEtC,OAAA,CAAQ,aAAc,EAAE,CAAA,CAExB,OAAA,CAAQ,SAAA,CAAW,EAAE,CAAA,CAErB,QAAQ,UAAA,CAAY,EAAE,CAAA,CAEtB,OAAA,CAAQ,SAAA,CAAW;;AAAA,CAAM,CAAA,CACzB,IAAA,EAAK,CAvBU,EAwBpB,CAMO,SAASud,EAAAA,CAAmBvd,CAAAA,CAAcwd,CAAAA,CAAoB,GAAA,CAAa,CAChF,IAAMC,CAAAA,CAAWH,GAActd,CAAI,CAAA,CACnC,OAAIyd,CAAAA,CAAS,MAAA,EAAUD,CAAAA,CAAkBC,CAAAA,CAClCA,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAGD,CAAS,CAAA,CAAE,IAAA,EAAK,CAAI,KAC/C,CAMO,SAASE,EAAAA,CACd1d,CAAAA,CACA2d,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAC0C,CAC1C,IAAMC,CAAAA,CAAe/d,CAAAA,CAAK,KAAA,CAAM2d,CAAAA,CAAgBC,CAAY,CAAA,CACtDI,CAAAA,CAAahe,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAG2d,CAAc,CAAA,CACzCM,CAAAA,CAAYje,CAAAA,CAAK,KAAA,CAAM4d,CAAY,CAAA,CAEnCM,CAAAA,CAAUF,CAAAA,CAAaH,CAAAA,CAASE,EAAeD,CAAAA,CAAQG,CAAAA,CACvDE,CAAAA,CAAiBR,CAAAA,CAAiBE,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAa,MAAA,CAASD,CAAAA,CAAM,MAAA,CAEpF,OAAO,CAAE,IAAA,CAAMI,CAAAA,CAAS,eAAAC,CAAe,CACzC,CClIA,IAAMC,EAAAA,CAA+B,CACnC,CACE,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MAAA,CACP,SAAU,CAAE,MAAA,CAAQ,IAAA,CAAM,KAAA,CAAO,IAAK,CAAA,CACtC,QAAA,CAAU,QACZ,CAAA,CACA,CACE,IAAA,CAAM,QAAA,CACN,KAAA,CAAO,QAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,GAAA,CAAK,KAAA,CAAO,GAAI,CAAA,CACpC,QAAA,CAAU,QACZ,CAAA,CACA,CACE,IAAA,CAAM,eAAA,CACN,KAAA,CAAO,eAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,IAAA,CAAM,KAAA,CAAO,IAAK,CACxC,CAAA,CACA,CACE,IAAA,CAAM,SAAA,CACN,KAAA,CAAO,SAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,MAAO,KAAA,CAAO,EAAG,CACvC,CAAA,CACA,CACE,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,GAAA,CAAK,KAAA,CAAO,QAAS,CAAA,CACzC,QAAA,CAAU,QACZ,CAAA,CACA,CACE,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,SAAA,CAAW,KAAA,CAAO,GAAI,CAC5C,CAAA,CACA,CACE,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,GAAA,CAAK,KAAA,CAAO,GAAI,CACtC,CAAA,CACA,CACE,IAAA,CAAM,UAAA,CACN,KAAA,CAAO,WAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,OAAA,CAAS,KAAA,CAAO,OAAQ,CAC9C,CAAA,CACA,CACE,IAAA,CAAM,QACN,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,IAAA,CAAM,KAAA,CAAO,EAAG,CACtC,CAAA,CACA,CACE,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,OACP,QAAA,CAAU,CAAE,MAAA,CAAQ,IAAA,CAAM,KAAA,CAAO,EAAG,CACtC,CAAA,CACA,CACE,IAAA,CAAM,aAAA,CACN,KAAA,CAAO,aAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ,KAAA,CAAO,KAAA,CAAO,EAAG,CACvC,CAAA,CACA,CACE,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,gBAAA,CACP,QAAA,CAAU,CAAE,MAAA,CAAQ;AAAA;AAAA,CAAA,CAAW,KAAA,CAAO,EAAG,CAC3C,CACF,CAAA,CAMMC,EAAAA,CAAoBnpB,mBAAAA,CAAM,UAAA,CAC9B,CAAC,CAAE,WAAA,CAAA0nB,CAAAA,CAAa,SAAA,CAAA5nB,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CACnC,GAAM,CAAE,MAAA,CAAAmY,CAAAA,CAAQ,cAAA,CAAAK,CAAAA,CAAgB,uBAAA,CAAAyB,CAAAA,CAAyB,QAAA,CAAA3B,CAAAA,CAAU,QAAA,CAAAD,CAAS,EAAIhB,CAAAA,EAAc,CAExFoR,CAAAA,CAAe1nB,cAAAA,CAClB6U,CAAAA,EAAsB,CACrB,IAAM8S,CAAAA,CAAW3B,CAAAA,CAAY,OAAA,CAC7B,GAAI,CAAC2B,CAAAA,CAAU,OAEf,GAAM,CAAE,cAAA,CAAAZ,CAAAA,CAAgB,YAAA,CAAAC,CAAa,CAAA,CAAIW,CAAAA,CACnCC,CAAAA,CAAiBrQ,CAAAA,CAAS,OAAA,CAAQE,CAAc,CAAA,EAAK,EAAA,CAErD,CAAE,IAAA,CAAM6P,EAAS,cAAA,CAAAC,CAAe,CAAA,CAAIT,EAAAA,CACxCc,CAAAA,CACAb,CAAAA,CACAC,CAAAA,CACAnS,CAAAA,CAAK,QAAA,CAAS,MAAA,CACdA,CAAAA,CAAK,QAAA,CAAS,KAChB,CAAA,CAEAqE,CAAAA,CAAwB,SAAA,CAAWzB,CAAAA,CAAgB6P,CAAO,CAAA,CAG1D,qBAAA,CAAsB,IAAM,CAC1BK,CAAAA,CAAS,KAAA,EAAM,CACfA,CAAAA,CAAS,iBAAA,CAAkBJ,CAAAA,CAAgBA,CAAc,EAC3D,CAAC,EACH,CAAA,CACA,CAACvB,CAAAA,CAAazO,CAAAA,CAAUE,CAAAA,CAAgByB,CAAuB,CACjE,CAAA,CAEA,OAAK5B,CAAAA,CAAS,qBAAA,CAKZ5W,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKzB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,gEAAA,CACAQ,CACF,CAAA,CACA,IAAA,CAAK,SAAA,CACL,YAAA,CAAW,uCAAA,CAEV,QAAA,CAAAopB,EAAAA,CAAc,GAAA,CAAK3S,CAAAA,EAClBnU,cAAAA,CAAC,UAEC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMgnB,CAAAA,CAAa7S,CAAI,CAAA,CAChC,SAAA,CAAU,0FAAA,CACV,KAAA,CAAO,CAAA,EAAGuC,CAAAA,CAAOvC,CAAAA,CAAK,KAA4B,CAAA,EAAKA,CAAAA,CAAK,KAAK,CAAA,EAAGA,CAAAA,CAAK,QAAA,CAAW,CAAA,EAAA,EAAKA,CAAAA,CAAK,QAAQ,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,CAAA,CAC9G,YAAA,CAAYuC,CAAAA,CAAOvC,CAAAA,CAAK,KAA4B,GAAKA,CAAAA,CAAK,KAAA,CAE9D,QAAA,CAAAnU,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAMrP,CAAAA,CAAK,IAAA,CAA4C,IAAA,CAAM,EAAA,CAAI,CAAA,CAAA,CAPlEA,CAAAA,CAAK,IAQZ,CACD,CAAA,CACH,CAAA,CAzBO,IA2BX,CACF,EAEA4S,EAAAA,CAAkB,WAAA,CAAc,mBAAA,CCrIhC,IAAMI,EAAAA,CAAoBvpB,mBAAAA,CAAM,UAAA,CAC9B,CAAC,CAAE,cAAA,CAAAwpB,CAAAA,CAAgB,SAAA,CAAA1pB,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CAtB1C,IAAAuC,CAAAA,CAAAqU,CAAAA,CAuBI,GAAM,CAAE,QAAA,CAAA0B,CAAAA,CAAU,cAAA,CAAAE,CAAAA,CAAgB,SAAA,CAAAjC,CAAAA,CAAW,MAAA,CAAA4B,CAAO,CAAA,CAAId,CAAAA,EAAc,CAEhEW,CAAAA,CAAAA,CAAAA,CAAkBzV,EAAAgU,CAAAA,CAAU,IAAA,CAAM0B,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,GAAjC,IAAA,CAAA,MAAA,CAAA1V,CAAAA,CAAoC,GAAA,IAAA,CAAOqU,CAAAA,CAAAL,CAAAA,CAAU,CAAC,CAAA,GAAX,IAAA,CAAA,MAAA,CAAAK,CAAAA,CAAc,GAAA,CAAA,CAG3Ed,CAAAA,CAAQwC,CAAAA,CAAS,KAAA,CAAME,CAAc,CAAA,EAAKF,CAAAA,CAAS,KAAA,CAAMN,CAAe,CAAA,EAAKG,CAAAA,CAAO,OAAA,CACpF2Q,CAAAA,CAAUxQ,CAAAA,CAAS,OAAA,CAAQE,CAAc,CAAA,EAAKF,CAAAA,CAAS,OAAA,CAAQN,CAAe,CAAA,EAAK,EAAA,CAGnF+Q,CAAAA,CAAkB1pB,mBAAAA,CAAM,OAAA,CAAQ,IAChCwpB,CAAAA,CACKA,CAAAA,CAAeC,CAAO,CAAA,CAI7BrnB,cAAAA,CAAC,KAAA,CAAA,CACC,uBAAA,CAAyB,CAAE,MAAA,CAAQ6lB,EAAAA,CAAcwB,CAAO,CAAE,CAAA,CAC5D,CAAA,CAED,CAACA,CAAAA,CAASD,CAAc,CAAC,CAAA,CAE5B,OACErnB,gBAAC,KAAA,CAAA,CAAI,GAAA,CAAKxB,CAAAA,CAAK,SAAA,CAAWrB,CAAAA,CAAM,KAAA,CAAOQ,CAAS,CAAA,CAC9C,QAAA,CAAA,CAAAsC,cAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,wCAAA,CACX,QAAA,CAAAqU,CAAAA,CACH,CAAA,CACArU,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAAsnB,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CACF,EAEAH,EAAAA,CAAkB,WAAA,CAAc,mBAAA,CCpChC,IAAMI,EAAAA,CAAoB3pB,mBAAAA,CAAM,UAAA,CAC9B,CAAC,CAAE,UAAA,CAAA4pB,CAAAA,CAAY,SAAA,CAAA9pB,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CAClC,GAAM,CAAE,MAAA,CAAAmY,CAAAA,CAAQ,UAAA,CAAAS,CAAAA,CAAY,UAAA,CAAAuB,CAAAA,CAAY,YAAA,CAAAe,EAAc,UAAA,CAAAzD,CAAAA,CAAY,cAAA,CAAA+B,CAAAA,CAAgB,QAAA,CAAAnB,CAAS,CAAA,CAAIhB,CAAAA,EAAc,CAE7G,OACE7V,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CAAM,qCAAA,CAAuCQ,CAAS,CAAA,CAGhE,QAAA,CAAA,CAAAkZ,CAAAA,CAAS,cAAA,EAAkBmB,CAAAA,GAAmB,MAAA,EAC7ChY,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAgY,CAAAA,GAAmB,UAClBhY,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAM,EAAA,CAAI,IAAA,CAAI,IAAA,CAAC,CAAA,CAAE,wBAAA,CAAA,CAEvC,CAAA,CAEDzL,CAAAA,GAAmB,OAAA,EAClBhY,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,CAAA,CAAE,kCAEjC,CAAA,CAAA,CAEJ,CAAA,CAIDgE,CAAAA,EACCxnB,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASyZ,CAAAA,CACT,SAAA,CAAU,mEAAA,CAET,QAAA,CAAA/C,CAAAA,CAAO,MAAA,CACV,CAAA,CAIF1W,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM0Y,CAAAA,CAAW,KAAK,CAAA,CAC/B,QAAA,CAAUvB,CAAAA,CACV,SAAA,CAAU,4HAAA,CAET,QAAA,CAAAT,CAAAA,CAAO,UACV,CAAA,CAGA1W,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAM0Y,CAAAA,CAAW,IAAI,CAAA,CAC9B,QAAA,CAAUvB,CAAAA,CACV,SAAA,CAAU,iKAAA,CAET,QAAA,CAAAA,CAAAA,CACCpX,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAM,EAAA,CAAI,IAAA,CAAI,IAAA,CAAC,CAAA,CAClC9M,CAAAA,CAAO,MAAA,CAAA,CACV,CAAA,CAEA3W,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,CAAA,CAC5BxN,CAAAA,CAAaU,CAAAA,CAAO,MAAA,CAASA,CAAAA,CAAO,OAAA,CAAA,CACvC,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CACF,EAEA6Q,EAAAA,CAAkB,WAAA,CAAc,mBAAA,CCxEhC,IAAME,EAAAA,CAAsB7pB,mBAAAA,CAAM,UAAA,CAChC,CAAC,CAAE,IAAA,CAAA8pB,CAAAA,CAAM,SAAA,CAAAhqB,CAAU,CAAA,CAAGa,CAAAA,GAAQ,CAtBhC,IAAAuC,CAAAA,CAAAqU,CAAAA,CAuBI,GAAM,CACJ,MAAA,CAAAuB,CAAAA,CACA,WAAA,CAAAW,CAAAA,CACA,gBAAA,CAAAM,CAAAA,CACA,gBAAAmB,CAAAA,CACA,QAAA,CAAAjC,CAAAA,CACA,SAAA,CAAA/B,CAAAA,CACA,QAAA,CAAA8B,CACF,CAAA,CAAIhB,CAAAA,EAAc,CAElB,GAAI,CAACgB,CAAAA,CAAS,iBAAA,CACZ,OAAO,IAAA,CAGT,IAAML,CAAAA,CAAAA,CAAAA,CAAkBzV,CAAAA,CAAAgU,CAAAA,CAAU,IAAA,CAAM0B,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,GAAjC,IAAA,CAAA,MAAA,CAAA1V,CAAAA,CAAoC,GAAA,IAAA,CAAOqU,CAAAA,CAAAL,CAAAA,CAAU,CAAC,CAAA,GAAX,IAAA,CAAA,MAAA,CAAAK,CAAAA,CAAc,GAAA,CAAA,CAC3EyD,CAAAA,CAAe/B,CAAAA,CAAS,KAAA,CAAMN,CAAe,CAAA,EAAK,EAAA,CAClDsC,CAAAA,CAAiBhC,CAAAA,CAAS,OAAA,CAAQN,CAAe,CAAA,EAAK,EAAA,CACtDoR,CAAAA,CAAe/O,CAAAA,EAAgBC,CAAAA,CAErC,OACE9Y,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKxB,CAAAA,CACL,SAAA,CAAWrB,CAAAA,CACT,6EAAA,CACAQ,CACF,CAAA,CAEA,QAAA,CAAA,CAAAqC,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uDAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAM,EAAA,CAAI,CAAA,CAChCxjB,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAA0nB,CAAAA,EAAQhR,CAAAA,CAAO,aAAA,CAAc,CAAA,CAAA,CACtC,CAAA,CACA1W,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS8Y,CAAAA,CACT,QAAA,CAAUzB,CAAAA,EAAe,CAACsQ,CAAAA,CAC1B,UAAWzqB,CAAAA,CACT,2FAAA,CACAya,CAAAA,CACI,sEAAA,CACA,2FACN,CAAA,CAEC,QAAA,CAAAN,CAAAA,CACCtX,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAM,EAAA,CAAI,IAAA,CAAI,IAAA,CAAC,CAAA,CAClC9M,CAAAA,CAAO,WAAA,CAAA,CACV,CAAA,CACEiB,CAAAA,CACF5X,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,eAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAM,EAAA,CAAI,CAAA,CAC5B9M,CAAAA,CAAO,gBAAA,CAAA,CACV,CAAA,CAEA3W,eAAAA,CAAAsK,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAArK,cAAAA,CAACwjB,CAAAA,CAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAM,EAAA,CAAI,CAAA,CAC/B9M,CAAAA,CAAO,eAAA,CAAA,CACV,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CACF,EAEA+Q,EAAAA,CAAoB,YAAc,qBAAA,CC9ClC,SAASG,EAAAA,CAAe,CACtB,MAAA,CAAA7D,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAwD,CAAAA,CACA,cAAA,CAAAJ,CAAAA,CACA,aAAA,CAAAS,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,WAAA,CACX,SAAA,CAAApqB,CAAAA,CACA,QAAA,CAAAG,CACF,CAAA,CAAwB,CACtB,GAAM,CAAE,WAAA,CAAAoZ,CAAAA,CAAa,KAAA,CAAAQ,CAAAA,CAAO,OAAA,CAAAtF,CAAAA,CAAS,QAAA,CAAAyE,CAAS,CAAA,CAAIhB,CAAAA,EAAc,CAC1D0P,CAAAA,CAActmB,SAAAA,CAA4B,IAAI,CAAA,CAE9CqlB,CAAAA,CAAmBnnB,CAAAA,CACvBiV,CAAAA,GAAY,OAAA,CACR,iFAAA,CACAA,CAAAA,GAAY,SAAA,CACV,EAAA,CACA,UACR,CAAA,CAEM4V,CAAAA,CAA0B7qB,CAAAA,CAC9B,4BAAA,CACAiV,CAAAA,GAAY,QACR,mGAAA,CACAA,CAAAA,GAAY,SAAA,CACV,qCAAA,CACA,eACR,CAAA,CAGA,OAAItU,CAAAA,CAEAmC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW9C,CAAAA,CAAMmnB,CAAAA,CAAkB3mB,CAAS,CAAA,CAC/C,QAAA,CAAAsC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW9C,CAAAA,CAAM4qB,CAAAA,CAAU,mBAAmB,CAAA,CAChD,QAAA,CAAAjqB,CAAAA,CACH,CAAA,CACF,CAAA,CAMFmC,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW9C,EAAMmnB,CAAAA,CAAkB3mB,CAAS,CAAA,CAC/C,QAAA,CAAAqC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW7C,CAAAA,CAAM4qB,CAAAA,CAAU,mBAAmB,CAAA,CAEjD,QAAA,CAAA,CAAA9nB,cAAAA,CAAC8jB,EAAAA,CAAA,CAAiB,MAAA,CAAQC,CAAAA,CAAQ,QAAA,CAAUC,CAAAA,CAAU,CAAA,CAGrDvM,CAAAA,EACCzX,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2HAAA,CACZ,QAAA,CAAAyX,CAAAA,CACH,CAAA,CAGF1X,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,WAAA,CAEb,QAAA,CAAA,CAAAC,cAAAA,CAACikB,EAAAA,CAAA,EAAmB,CAAA,CAGpBlkB,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWgoB,CAAAA,CAEb,QAAA,CAAA,CAAAnR,CAAAA,CAAS,iBAAA,EACR5W,cAAAA,CAACynB,EAAAA,CAAA,CAAoB,IAAA,CAAMI,CAAAA,CAAe,CAAA,CAI5C7nB,cAAAA,CAACmlB,EAAAA,CAAA,EAAuB,CAAA,CAGvBlO,CAAAA,CACCjX,cAAAA,CAACmnB,EAAAA,CAAA,CAAkB,cAAA,CAAgBC,CAAAA,CAAgB,CAAA,CAEnDrnB,gBAAAsK,mBAAAA,CAAA,CACG,QAAA,CAAA,CAAAuM,CAAAA,CAAS,qBAAA,EACR5W,cAAAA,CAAC+mB,EAAAA,CAAA,CAAkB,WAAA,CAAazB,CAAAA,CAAa,CAAA,CAE/CtlB,cAAAA,CAACqlB,EAAAA,CAAA,CAAkB,WAAA,CAAaC,CAAAA,CAAa,CAAA,CAAA,CAC/C,CAAA,CAAA,CAEJ,CAAA,CAGAtlB,cAAAA,CAACunB,EAAAA,CAAA,CAAkB,UAAA,CAAYC,CAAAA,CAAY,CAAA,CAAA,CAC7C,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CA4BA,IAAMQ,GAAapqB,mBAAAA,CAAM,UAAA,CAIvB,CACE,CAEE,WAAA,CAAAsX,CAAAA,CACA,UAAA,CAAAc,CAAAA,CACA,SAAA,CAAAlB,CAAAA,CACA,eAAA,CAAAmB,CAAAA,CACA,MAAA,CAAAS,CAAAA,CACA,SAAA,CAAAP,CAAAA,CACA,QAAA,CAAAS,CAAAA,CACA,OAAA,CAAAzE,CAAAA,CAGA,MAAA,CAAA4R,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAwD,CAAAA,CACA,cAAA,CAAAJ,CAAAA,CACA,aAAA,CAAAS,CAAAA,CACA,SAAAC,CAAAA,CACA,SAAA,CAAApqB,CAAAA,CACA,QAAA,CAAAG,CAAAA,CAGA,WAAA,CAAAwY,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CACA/X,CAAAA,GAGEyB,cAAAA,CAAC+V,EAAAA,CAAA,CACC,WAAA,CAAab,CAAAA,CACb,UAAA,CAAYc,CAAAA,CACZ,SAAA,CAAWlB,CAAAA,CACX,eAAA,CAAiBmB,CAAAA,CACjB,MAAA,CAAQS,CAAAA,CACR,SAAA,CAAWP,CAAAA,CACX,QAAA,CAAUS,CAAAA,CACV,OAAA,CAASzE,CAAAA,CACT,YAAakE,CAAAA,CACb,gBAAA,CAAkBC,CAAAA,CAElB,QAAA,CAAAtW,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKzB,CAAAA,CACR,QAAA,CAAAyB,cAAAA,CAAC4nB,EAAAA,CAAA,CACC,MAAA,CAAQ7D,CAAAA,CACR,QAAA,CAAUC,CAAAA,CACV,UAAA,CAAYwD,CAAAA,CACZ,cAAA,CAAgBJ,CAAAA,CAChB,aAAA,CAAeS,CAAAA,CACf,QAAA,CAAUC,CAAAA,CACV,SAAA,CAAWpqB,CAAAA,CAEV,QAAA,CAAAG,CAAAA,CACH,CAAA,CACF,CAAA,CACF,CAGN,CAAA,CAEAmqB,EAAAA,CAAW,WAAA,CAAc,YAAA,CAGzB,IAAMC,EAAAA,CAAqBD,GAW3BC,EAAAA,CAAmB,MAAA,CAASnE,EAAAA,CAC5BmE,EAAAA,CAAmB,QAAA,CAAWhE,EAAAA,CAC9BgE,EAAAA,CAAmB,YAAA,CAAe9C,EAAAA,CAClC8C,EAAAA,CAAmB,OAAA,CAAU5C,EAAAA,CAC7B4C,EAAAA,CAAmB,OAAA,CAAUlB,EAAAA,CAC7BkB,EAAAA,CAAmB,OAAA,CAAUd,EAAAA,CAC7Bc,EAAAA,CAAmB,OAAA,CAAUV,EAAAA,CAC7BU,EAAAA,CAAmB,SAAA,CAAYR,EAAAA","file":"advanced-motion.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","'use client'\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { merge } from '../../lib/utils'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface AdvancedPageTransitionProps {\n children: React.ReactNode\n className?: string\n type?: TransitionType\n duration?: number\n easing?: TransitionEasing\n delay?: number\n autoStart?: boolean\n onStart?: () => void\n onComplete?: () => void\n showProgress?: boolean\n progressClassName?: string\n}\n\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\n children,\n className,\n type = 'fade',\n duration = 500,\n easing = 'smooth',\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressClassName\n}, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [progress, setProgress] = useState(0)\n const [_isTransitioning, setIsTransitioning] = useState(false)\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n const getEasingFunction = (easingType: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easingType]\n }\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const easingFunction = getEasingFunction(easing)\n\n let currentProgress = Math.min(elapsed / duration, 1)\n currentProgress = easingFunction(currentProgress)\n\n setProgress(currentProgress)\n setIsVisible(currentProgress > 0.1)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame((t) => animate(t))\n } else {\n setIsTransitioning(false)\n setProgress(1)\n onComplete?.()\n }\n }, [duration, easing, onComplete])\n\n const startTransition = useCallback(() => {\n setIsTransitioning(true)\n setProgress(0)\n onStart?.()\n\n startTimeRef.current = null\n animationRef.current = requestAnimationFrame(animate)\n }, [animate, onStart])\n\n useEffect(() => {\n if (autoStart) {\n const timer = setTimeout(() => {\n startTransition()\n }, delay)\n\n return () => clearTimeout(timer)\n }\n }, [autoStart, delay, startTransition])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n const getTransitionStyles = () => {\n switch (type) {\n case 'fade':\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n \n case 'slide':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'slide-up':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(${(1 - progress) * 100}%)`\n }\n \n case 'slide-down':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-left':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-right':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'scale':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.8 + progress * 0.2})`\n }\n \n case 'flip':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\n }\n \n case 'morph':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\n }\n \n case 'cube':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\n }\n \n case 'zoom':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.5 + progress * 0.5})`\n }\n \n default:\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n }\n }\n\n const transitionStyles = getTransitionStyles()\n\n return (\n <div className=\"relative\">\n {showProgress && (\n <div className={merge(\n 'fixed top-4 right-4 z-50 bg-background rounded-lg px-3 py-2 shadow-lg border',\n progressClassName\n )}>\n <div className=\"text-sm font-medium text-foreground\">\n Progress: {Math.round(progress * 100)}%\n </div>\n <div className=\"w-24 h-2 bg-muted rounded-full mt-2\">\n <div \n className=\"h-full bg-primary rounded-full transition-all duration-100\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n </div>\n )}\n \n <div\n ref={ref}\n className={merge(\n 'transition-all duration-500 ease-out',\n className\n )}\n style={{\n ...transitionStyles,\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: easing === 'smooth' \n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\n : easing === 'bounce'\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\n : easing === 'elastic'\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\n : easing\n }}\n >\n {children}\n </div>\n </div>\n )\n})\n\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\n))\n\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\n))\n\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\n))\n\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\n))\n\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\n))\n\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\n))\n\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\n))\n\n// displayName 설정\nFadePageTransition.displayName = 'FadePageTransition'\nSlidePageTransition.displayName = 'SlidePageTransition'\nScalePageTransition.displayName = 'ScalePageTransition'\nFlipPageTransition.displayName = 'FlipPageTransition'\nMorphPageTransition.displayName = 'MorphPageTransition'\nCubePageTransition.displayName = 'CubePageTransition'\nZoomPageTransition.displayName = 'ZoomPageTransition'\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface TransitionConfig {\n type: TransitionType\n duration: number\n easing: TransitionEasing\n delay?: number\n stagger?: number\n direction?: 'forward' | 'backward'\n onStart?: () => void\n onComplete?: () => void\n onReverse?: () => void\n}\n\nexport interface PageTransitionState {\n isTransitioning: boolean\n isVisible: boolean\n currentStep: number\n progress: number\n}\n\nexport interface PageTransitionControls {\n start: (config?: Partial<TransitionConfig>) => Promise<void>\n reverse: () => Promise<void>\n pause: () => void\n resume: () => void\n reset: () => void\n}\n\nexport const usePageTransition = (\n initialConfig: Partial<TransitionConfig> = {}\n): [PageTransitionState, PageTransitionControls] => {\n const [state, setState] = useState<PageTransitionState>({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const configRef = useRef<TransitionConfig>({\n type: 'fade',\n duration: 500,\n easing: 'smooth',\n delay: 0,\n stagger: 0,\n direction: 'forward',\n ...initialConfig\n })\n\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easing]\n }, [])\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const config = configRef.current\n const easing = getEasingFunction(config.easing)\n \n let progress = Math.min(elapsed / config.duration, 1)\n progress = easing(progress)\n\n setState(prev => ({\n ...prev,\n progress,\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\n currentStep: Math.floor(progress * 10)\n }))\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n progress: config.direction === 'forward' ? 1 : 0\n }))\n config.onComplete?.()\n }\n }, [getEasingFunction])\n\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\n return new Promise<void>((resolve) => {\n if (config) {\n configRef.current = { ...configRef.current, ...config }\n }\n\n const finalConfig = configRef.current\n finalConfig.onComplete = () => resolve()\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n progress: finalConfig.direction === 'forward' ? 0 : 1\n }))\n\n startTimeRef.current = null\n finalConfig.onStart?.()\n \n if (finalConfig.delay) {\n setTimeout(() => {\n animationRef.current = requestAnimationFrame(animate)\n }, finalConfig.delay)\n } else {\n animationRef.current = requestAnimationFrame(animate)\n }\n })\n }, [animate])\n\n const reverse = useCallback(async () => {\n return new Promise<void>((resolve) => {\n const config = configRef.current\n config.direction = 'backward'\n config.onComplete = () => resolve()\n \n start()\n })\n }, [start])\n\n const pause = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }, [])\n\n const resume = useCallback(() => {\n if (state.isTransitioning) {\n animationRef.current = requestAnimationFrame(animate)\n }\n }, [state.isTransitioning, animate])\n\n const reset = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n setState({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n }, [])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n return [state, { start, reverse, pause, resume, reset }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'fade', duration: 400, ...config })\n}\n\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'slide', duration: 600, ...config })\n}\n\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'scale', duration: 500, ...config })\n}\n\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'morph', duration: 800, ...config })\n}\n\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\n\nexport interface PageTransitionManagerConfig {\n defaultType?: TransitionType\n defaultDuration?: number\n defaultEasing?: TransitionEasing\n enableHistory?: boolean\n enableProgress?: boolean\n enableDebug?: boolean\n}\n\nexport interface PageTransitionEvent {\n id: string\n type: TransitionType\n duration: number\n easing: TransitionEasing\n timestamp: number\n status: 'pending' | 'active' | 'completed' | 'failed'\n}\n\nexport interface PageTransitionManagerState {\n isTransitioning: boolean\n currentTransition: PageTransitionEvent | null\n transitionHistory: PageTransitionEvent[]\n totalTransitions: number\n averageDuration: number\n}\n\nexport interface PageTransitionManagerControls {\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\n cancelTransition: (id: string) => void\n pauseAll: () => void\n resumeAll: () => void\n clearHistory: () => void\n getTransitionStats: () => {\n total: number\n average: number\n byType: Record<TransitionType, number>\n byStatus: Record<string, number>\n }\n}\n\nexport const usePageTransitionManager = (\n config: PageTransitionManagerConfig = {}\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\n const {\n defaultType = 'fade',\n defaultDuration = 500,\n defaultEasing = 'smooth',\n enableHistory = true,\n enableProgress: _enableProgress = true,\n enableDebug = false\n } = config\n\n const [state, setState] = useState<PageTransitionManagerState>({\n isTransitioning: false,\n currentTransition: null,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n })\n\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\n const transitionCounterRef = useRef(0)\n\n const logDebug = useCallback((message: string, data?: unknown) => {\n if (enableDebug) {\n // eslint-disable-next-line no-console\n console.log(`[PageTransitionManager] ${message}`, data)\n }\n }, [enableDebug])\n\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\n setState(prev => {\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\n const total = newHistory.length\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\n\n return {\n ...prev,\n totalTransitions: total,\n averageDuration: average,\n transitionHistory: newHistory\n }\n })\n }, [enableHistory])\n\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\n const transitionId = `transition_${++transitionCounterRef.current}`\n const fullConfig: TransitionConfig = {\n type: defaultType,\n duration: defaultDuration,\n easing: defaultEasing,\n ...config\n }\n\n const transitionEvent: PageTransitionEvent = {\n id: transitionId,\n type: fullConfig.type,\n duration: fullConfig.duration,\n easing: fullConfig.easing,\n timestamp: Date.now(),\n status: 'pending'\n }\n\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n currentTransition: transitionEvent\n }))\n\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\n const timer = setTimeout(() => {\n const completedEvent: PageTransitionEvent = {\n ...transitionEvent,\n status: 'completed'\n }\n\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n currentTransition: null\n }))\n\n updateStats(completedEvent)\n activeTransitionsRef.current.delete(transitionId)\n logDebug('Transition completed', { id: transitionId })\n\n fullConfig.onComplete?.()\n }, fullConfig.duration)\n\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\n\n // 진행 상태 업데이트\n setTimeout(() => {\n setState(prev => ({\n ...prev,\n currentTransition: {\n ...prev.currentTransition!,\n status: 'active'\n }\n }))\n }, 50)\n\n return transitionId\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\n\n const cancelTransition = useCallback((id: string) => {\n const transition = activeTransitionsRef.current.get(id)\n if (transition) {\n clearTimeout(transition.timer)\n activeTransitionsRef.current.delete(id)\n\n setState(prev => ({\n ...prev,\n isTransitioning: activeTransitionsRef.current.size > 0,\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\n }))\n\n logDebug('Transition cancelled', { id })\n }\n }, [logDebug])\n\n const pauseAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ timer }, id) => {\n clearTimeout(timer)\n logDebug('Transition paused', { id })\n })\n }, [logDebug])\n\n const resumeAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ config }, _id) => {\n startTransition(config)\n })\n }, [startTransition])\n\n const clearHistory = useCallback(() => {\n setState(prev => ({\n ...prev,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n }))\n logDebug('History cleared')\n }, [logDebug])\n\n const getTransitionStats = useCallback(() => {\n const { transitionHistory } = state\n const byType = transitionHistory.reduce((acc, t) => {\n acc[t.type] = (acc[t.type] || 0) + 1\n return acc\n }, {} as Record<TransitionType, number>)\n\n const byStatus = transitionHistory.reduce((acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1\n return acc\n }, {} as Record<string, number>)\n\n return {\n total: transitionHistory.length,\n average: state.averageDuration,\n byType,\n byStatus\n }\n }, [state])\n\n useEffect(() => {\n const activeTransitions = activeTransitionsRef.current\n return () => {\n // 컴포넌트 언마운트 시 모든 타이머 정리\n activeTransitions.forEach(({ timer }) => {\n clearTimeout(timer)\n })\n activeTransitions.clear()\n }\n }, [])\n\n return [state, {\n startTransition,\n cancelTransition,\n pauseAll,\n resumeAll,\n clearHistory,\n getTransitionStats\n }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\n}\n\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\n}\n\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\n}\n\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\n}\n\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Parallax 컴포넌트의 props / Parallax component props\n * @property {number} [speed=0.5] - 패럴렉스 속도 (0-1, 1이 가장 빠름) / Parallax speed (0-1, 1 is fastest)\n * @property {\"up\" | \"down\" | \"left\" | \"right\"} [direction=\"up\"] - 이동 방향 / Movement direction\n * @property {number} [offset=0] - 시작 오프셋 (px) / Starting offset in pixels\n * @property {boolean} [disabled=false] - 패럴렉스 비활성화 / Disable parallax\n * @property {boolean} [scale=false] - 스케일 효과 추가 / Add scale effect\n * @property {boolean} [opacity=false] - 투명도 효과 추가 / Add opacity effect\n * @property {boolean} [rotate=false] - 회전 효과 추가 / Add rotation effect\n */\nexport interface ParallaxProps extends React.HTMLAttributes<HTMLDivElement> {\n speed?: number;\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n offset?: number;\n disabled?: boolean;\n scale?: boolean;\n opacity?: boolean;\n rotate?: boolean;\n rotateDirection?: \"cw\" | \"ccw\";\n}\n\n/**\n * Parallax 컴포넌트 / Parallax component\n *\n * 스크롤에 반응하여 패럴렉스 효과를 제공하는 컴포넌트입니다.\n * 다양한 방향과 속도, 추가 효과(스케일, 투명도, 회전)를 지원합니다.\n *\n * Component that provides parallax effect in response to scrolling.\n * Supports various directions, speeds, and additional effects (scale, opacity, rotation).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Parallax speed={0.3}>\n * <img src=\"/background.jpg\" alt=\"background\" />\n * </Parallax>\n *\n * @example\n * // 다양한 효과 / With effects\n * <Parallax speed={0.5} scale opacity direction=\"up\">\n * <div className=\"h-screen bg-gradient-to-b from-indigo-500 to-purple-600\" />\n * </Parallax>\n */\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\n (\n {\n children,\n className,\n speed = 0.5,\n direction = \"up\",\n offset = 0,\n disabled = false,\n scale = false,\n opacity = false,\n rotate = false,\n rotateDirection = \"cw\",\n style,\n ...props\n },\n ref\n ) => {\n const innerRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n x: 0,\n y: 0,\n scale: 1,\n opacity: 1,\n rotate: 0,\n });\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateTransform = useCallback(() => {\n if (disabled || prefersReducedMotion) return;\n\n const element = innerRef.current;\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const windowWidth = window.innerWidth;\n\n // Calculate how far through the viewport the element is\n const elementCenter = rect.top + rect.height / 2;\n const viewportCenter = windowHeight / 2;\n const progress = (viewportCenter - elementCenter) / windowHeight;\n\n // Calculate movement based on direction\n const movement = progress * speed * 100 + offset;\n\n let x = 0;\n let y = 0;\n\n switch (direction) {\n case \"up\":\n y = -movement;\n break;\n case \"down\":\n y = movement;\n break;\n case \"left\":\n x = -movement;\n break;\n case \"right\":\n x = movement;\n break;\n }\n\n // Calculate additional effects\n const scaleValue = scale ? 1 + Math.abs(progress) * 0.1 : 1;\n const opacityValue = opacity ? Math.max(0.3, 1 - Math.abs(progress) * 0.5) : 1;\n const rotateValue = rotate\n ? progress * 10 * (rotateDirection === \"cw\" ? 1 : -1)\n : 0;\n\n setTransform({ x, y, scale: scaleValue, opacity: opacityValue, rotate: rotateValue });\n }, [disabled, prefersReducedMotion, speed, direction, offset, scale, opacity, rotate, rotateDirection]);\n\n useEffect(() => {\n if (disabled || prefersReducedMotion) return;\n\n // Initial calculation\n updateTransform();\n\n // Listen to scroll events\n const handleScroll = () => {\n requestAnimationFrame(updateTransform);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateTransform, disabled, prefersReducedMotion]);\n\n const combinedStyle: React.CSSProperties = {\n ...style,\n transform: disabled || prefersReducedMotion\n ? undefined\n : `translate3d(${transform.x}px, ${transform.y}px, 0) scale(${transform.scale}) rotate(${transform.rotate}deg)`,\n opacity: disabled || prefersReducedMotion ? 1 : transform.opacity,\n willChange: disabled || prefersReducedMotion ? undefined : \"transform, opacity\",\n };\n\n return (\n <div\n ref={mergeRefs(ref, innerRef)}\n className={merge(\"transition-none\", className)}\n style={combinedStyle}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nParallax.displayName = \"Parallax\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { Parallax };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Marquee 컴포넌트의 props / Marquee component props\n * @property {\"left\" | \"right\" | \"up\" | \"down\"} [direction=\"left\"] - 이동 방향 / Movement direction\n * @property {number} [speed=50] - 속도 (px/s) / Speed in pixels per second\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {boolean} [pauseOnClick=false] - 클릭시 일시정지 / Pause on click\n * @property {number} [gap=16] - 아이템 간격 (px) / Gap between items in pixels\n * @property {boolean} [gradient=true] - 양쪽 페이드 그라디언트 / Fade gradient on edges\n * @property {string} [gradientColor=\"hsl(var(--background))\"] - 그라디언트 색상 / Gradient color\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\n */\nexport interface MarqueeProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n speed?: number;\n pauseOnHover?: boolean;\n pauseOnClick?: boolean;\n gap?: number;\n gradient?: boolean;\n gradientColor?: string;\n gradientWidth?: number;\n}\n\n/**\n * Marquee 컴포넌트 / Marquee component\n *\n * 무한 스크롤 애니메이션을 제공하는 컴포넌트입니다.\n * 로고, 텍스트, 이미지 등을 자동으로 흐르게 표시합니다.\n *\n * Component that provides infinite scroll animation.\n * Displays logos, text, images, etc. with automatic scrolling.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Marquee>\n * <span>Item 1</span>\n * <span>Item 2</span>\n * <span>Item 3</span>\n * </Marquee>\n *\n * @example\n * // 로고 캐러셀 / Logo carousel\n * <Marquee speed={30} pauseOnHover gradient>\n * {logos.map(logo => <img key={logo.id} src={logo.src} />)}\n * </Marquee>\n */\nconst Marquee = React.forwardRef<HTMLDivElement, MarqueeProps>(\n (\n {\n children,\n className,\n direction = \"left\",\n speed = 50,\n pauseOnHover = true,\n pauseOnClick = false,\n gap = 16,\n gradient = true,\n gradientColor = \"hsl(var(--background))\",\n gradientWidth = 100,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState(0);\n const [contentHeight, setContentHeight] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n\n const isHorizontal = direction === \"left\" || direction === \"right\";\n const isReverse = direction === \"right\" || direction === \"down\";\n\n // Measure content size\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const firstChild = container.firstElementChild as HTMLElement;\n if (!firstChild) return;\n\n const updateSize = () => {\n if (isHorizontal) {\n setContentWidth(firstChild.offsetWidth);\n } else {\n setContentHeight(firstChild.offsetHeight);\n }\n };\n\n updateSize();\n\n const resizeObserver = new ResizeObserver(updateSize);\n resizeObserver.observe(firstChild);\n\n return () => resizeObserver.disconnect();\n }, [isHorizontal, children]);\n\n // Calculate animation duration\n const duration = isHorizontal\n ? contentWidth / speed\n : contentHeight / speed;\n\n const animationStyle: React.CSSProperties = {\n [\"--marquee-duration\" as string]: `${duration}s`,\n [\"--marquee-gap\" as string]: `${gap}px`,\n };\n\n // Gradient styles\n const gradientStyle = gradient\n ? {\n [\"--gradient-color\" as string]: gradientColor,\n [\"--gradient-width\" as string]: `${gradientWidth}px`,\n }\n : {};\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n gradient && \"marquee-gradient\",\n className\n )}\n style={{ ...style, ...gradientStyle }}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onClick={() => pauseOnClick && setIsPaused(!isPaused)}\n {...props}\n >\n <div\n ref={containerRef}\n className={merge(\n \"flex\",\n isHorizontal ? \"flex-row\" : \"flex-col\",\n isPaused ? \"animate-pause\" : \"\",\n isHorizontal\n ? isReverse\n ? \"animate-marquee-right\"\n : \"animate-marquee-left\"\n : isReverse\n ? \"animate-marquee-down\"\n : \"animate-marquee-up\"\n )}\n style={animationStyle}\n >\n {/* Original content */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap }}\n >\n {children}\n </div>\n {/* Duplicated content for seamless loop */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap, [isHorizontal ? \"marginLeft\" : \"marginTop\"]: gap }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n </div>\n\n {/* CSS for animations - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes marquee-left {\n from { transform: translateX(0); }\n to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-right {\n from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateX(0); }\n }\n @keyframes marquee-up {\n from { transform: translateY(0); }\n to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-down {\n from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateY(0); }\n }\n .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }\n .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }\n .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }\n .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }\n .animate-pause { animation-play-state: paused !important; }\n .marquee-gradient::before, .marquee-gradient::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--gradient-width);\n z-index: 10;\n pointer-events: none;\n }\n .marquee-gradient::before {\n left: 0;\n background: linear-gradient(to right, var(--gradient-color), transparent);\n }\n .marquee-gradient::after {\n right: 0;\n background: linear-gradient(to left, var(--gradient-color), transparent);\n }\n `}} />\n </div>\n );\n }\n);\n\nMarquee.displayName = \"Marquee\";\n\nexport { Marquee };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * GlowCard 컴포넌트의 props / GlowCard component props\n * @property {string} [glowColor=\"rgba(120, 119, 198, 0.3)\"] - 글로우 색상 / Glow color\n * @property {number} [glowSize=400] - 글로우 크기 (px) / Glow size in pixels\n * @property {number} [glowOpacity=0.6] - 글로우 투명도 / Glow opacity\n * @property {boolean} [border=true] - 글로우 보더 표시 / Show glow border\n * @property {string} [borderColor] - 보더 색상 (기본: glowColor) / Border color (default: glowColor)\n */\nexport interface GlowCardProps extends React.HTMLAttributes<HTMLDivElement> {\n glowColor?: string;\n glowSize?: number;\n glowOpacity?: number;\n border?: boolean;\n borderColor?: string;\n}\n\n/**\n * GlowCard 컴포넌트 / GlowCard component\n *\n * 마우스를 따라다니는 글로우 효과가 있는 카드 컴포넌트입니다.\n * SaaS 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Card component with mouse-following glow effect.\n * Perfect for SaaS landing pages and premium UI.\n *\n * @component\n * @example\n * <GlowCard glowColor=\"rgba(59, 130, 246, 0.4)\">\n * <h3>Premium Feature</h3>\n * <p>This is a premium feature card</p>\n * </GlowCard>\n */\nconst GlowCard = React.forwardRef<HTMLDivElement, GlowCardProps>(\n (\n {\n children,\n className,\n glowColor = \"rgba(120, 119, 198, 0.3)\",\n glowSize = 400,\n glowOpacity = 0.6,\n border = true,\n borderColor,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const glowStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? glowOpacity : 0,\n background: `radial-gradient(${glowSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n };\n\n const borderStyle: React.CSSProperties = border\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${glowSize / 2}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${borderColor || glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n maskComposite: \"exclude\",\n WebkitMaskComposite: \"xor\",\n padding: \"1px\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl bg-card border border-border p-6\",\n \"transition-all duration-300\",\n isHovered && \"border-transparent\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Glow effect */}\n <div style={glowStyle} aria-hidden=\"true\" />\n\n {/* Border glow */}\n {border && <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />}\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nGlowCard.displayName = \"GlowCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { GlowCard };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * SpotlightCard 컴포넌트의 props / SpotlightCard component props\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - 스포트라이트 색상 / Spotlight color\n * @property {number} [spotlightSize=300] - 스포트라이트 크기 (px) / Spotlight size in pixels\n * @property {boolean} [gradient=true] - 그라디언트 배경 효과 / Gradient background effect\n * @property {string} [gradientFrom=\"rgba(255, 255, 255, 0.05)\"] - 그라디언트 시작 색상 / Gradient start color\n * @property {string} [gradientTo=\"transparent\"] - 그라디언트 끝 색상 / Gradient end color\n */\nexport interface SpotlightCardProps extends React.HTMLAttributes<HTMLDivElement> {\n spotlightColor?: string;\n spotlightSize?: number;\n gradient?: boolean;\n gradientFrom?: string;\n gradientTo?: string;\n}\n\n/**\n * SpotlightCard 컴포넌트 / SpotlightCard component\n *\n * 마우스 위치에 스포트라이트 효과를 표시하는 프리미엄 카드 컴포넌트입니다.\n * 다크 테마 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Premium card component that displays a spotlight effect at mouse position.\n * Perfect for dark theme landing pages and premium UI.\n *\n * @component\n * @example\n * <SpotlightCard className=\"bg-gray-900 text-white p-8\">\n * <h3>Premium Feature</h3>\n * <p>Discover our exclusive features</p>\n * </SpotlightCard>\n */\nconst SpotlightCard = React.forwardRef<HTMLDivElement, SpotlightCardProps>(\n (\n {\n children,\n className,\n spotlightColor = \"rgba(255, 255, 255, 0.1)\",\n spotlightSize = 300,\n gradient = true,\n gradientFrom = \"rgba(255, 255, 255, 0.05)\",\n gradientTo = \"transparent\",\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const spotlightStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${spotlightSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${spotlightColor}, transparent 60%)`,\n transition: \"opacity 0.4s ease\",\n pointerEvents: \"none\",\n };\n\n const gradientOverlayStyle: React.CSSProperties = gradient\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(135deg, ${gradientFrom} 0%, ${gradientTo} 100%)`,\n pointerEvents: \"none\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl\",\n \"bg-gray-900 border border-gray-800\",\n \"transition-all duration-300\",\n isHovered && \"border-gray-700 shadow-2xl shadow-black/20\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Gradient overlay */}\n {gradient && <div style={gradientOverlayStyle} aria-hidden=\"true\" />}\n\n {/* Spotlight effect */}\n <div style={spotlightStyle} aria-hidden=\"true\" />\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nSpotlightCard.displayName = \"SpotlightCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { SpotlightCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TextReveal 컴포넌트의 props / TextReveal component props\n * @property {string} text - 표시할 텍스트 / Text to display\n * @property {string} [revealColor=\"currentColor\"] - 공개된 텍스트 색상 / Revealed text color\n * @property {string} [hiddenColor=\"rgba(128, 128, 128, 0.3)\"] - 숨겨진 텍스트 색상 / Hidden text color\n * @property {number} [threshold=0.5] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\n * @property {boolean} [byWord=false] - 단어별 공개 / Reveal by word\n * @property {boolean} [byChar=false] - 글자별 공개 / Reveal by character\n */\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n text: string;\n revealColor?: string;\n hiddenColor?: string;\n threshold?: number;\n byWord?: boolean;\n byChar?: boolean;\n}\n\n/**\n * TextReveal 컴포넌트 / TextReveal component\n *\n * 스크롤에 따라 텍스트가 점진적으로 공개되는 효과를 제공합니다.\n * 히어로 섹션, 스토리텔링 페이지에 적합합니다.\n *\n * Provides a text reveal effect based on scroll position.\n * Perfect for hero sections and storytelling pages.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TextReveal text=\"Welcome to the future of design\" />\n *\n * @example\n * // 단어별 공개 / Word by word reveal\n * <TextReveal\n * text=\"Build amazing products with our platform\"\n * byWord\n * revealColor=\"#3b82f6\"\n * />\n */\nconst TextReveal = React.forwardRef<HTMLDivElement, TextRevealProps>(\n (\n {\n text,\n className,\n revealColor = \"currentColor\",\n hiddenColor = \"rgba(128, 128, 128, 0.3)\",\n threshold = 0.5,\n byWord = false,\n byChar = false,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // Calculate progress based on element position\n const start = windowHeight * (1 - threshold);\n const end = windowHeight * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let newProgress = 0;\n if (elementCenter <= start && elementCenter >= end) {\n newProgress = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n newProgress = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, newProgress)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n\n const handleScroll = () => {\n requestAnimationFrame(updateProgress);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n // Split text based on mode\n const renderText = () => {\n if (byChar) {\n const chars = text.split(\"\");\n return chars.map((char, index) => {\n const charProgress = progress * chars.length;\n const isRevealed = index < charProgress;\n return (\n <span\n key={index}\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.1s ease-out\",\n }}\n >\n {char}\n </span>\n );\n });\n }\n\n if (byWord) {\n const words = text.split(\" \");\n return words.map((word, index) => {\n const wordProgress = progress * words.length;\n const isRevealed = index < wordProgress;\n return (\n <span key={index}>\n <span\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.15s ease-out\",\n }}\n >\n {word}\n </span>\n {index < words.length - 1 && \" \"}\n </span>\n );\n });\n }\n\n // Default: gradient mask reveal\n return (\n <span\n style={{\n background: `linear-gradient(90deg, ${revealColor} ${progress * 100}%, ${hiddenColor} ${progress * 100}%)`,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n transition: \"background 0.1s ease-out\",\n }}\n >\n {text}\n </span>\n );\n };\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"font-medium\", className)}\n style={style}\n {...props}\n >\n {renderText()}\n </div>\n );\n }\n);\n\nTextReveal.displayName = \"TextReveal\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TextReveal };\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * AnimatedGradient 컴포넌트의 props / AnimatedGradient component props\n * @property {string[]} [colors] - 그라디언트 색상 배열 / Array of gradient colors\n * @property {number} [speed=3] - 애니메이션 속도 (초) / Animation speed in seconds\n * @property {boolean} [blur=true] - 블러 효과 / Blur effect\n * @property {number} [blurAmount=100] - 블러 양 (px) / Blur amount in pixels\n * @property {\"linear\" | \"radial\" | \"conic\" | \"mesh\"} [type=\"mesh\"] - 그라디언트 타입 / Gradient type\n * @property {boolean} [animate=true] - 애니메이션 활성화 / Enable animation\n */\nexport interface AnimatedGradientProps extends React.HTMLAttributes<HTMLDivElement> {\n colors?: string[];\n speed?: number;\n blur?: boolean;\n blurAmount?: number;\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\n animate?: boolean;\n}\n\nconst defaultColors = [\n \"#ff0080\",\n \"#7928ca\",\n \"#0070f3\",\n \"#00dfd8\",\n];\n\n/**\n * AnimatedGradient 컴포넌트 / AnimatedGradient component\n *\n * 아름다운 애니메이션 그라디언트 배경을 제공합니다.\n * 히어로 섹션, 배경, 오버레이에 적합합니다.\n *\n * Provides beautiful animated gradient backgrounds.\n * Perfect for hero sections, backgrounds, and overlays.\n *\n * @component\n * @example\n * // 메쉬 그라디언트 / Mesh gradient\n * <AnimatedGradient type=\"mesh\" className=\"absolute inset-0 -z-10\" />\n *\n * @example\n * // 커스텀 색상 / Custom colors\n * <AnimatedGradient\n * colors={[\"#667eea\", \"#764ba2\", \"#f093fb\"]}\n * speed={5}\n * type=\"conic\"\n * />\n */\nconst AnimatedGradient = React.forwardRef<HTMLDivElement, AnimatedGradientProps>(\n (\n {\n children,\n className,\n colors = defaultColors,\n speed = 3,\n blur = true,\n blurAmount = 100,\n type = \"mesh\",\n animate = true,\n style,\n ...props\n },\n ref\n ) => {\n const [mounted, setMounted] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n const shouldAnimate = animate && !prefersReducedMotion;\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const renderGradient = () => {\n switch (type) {\n case \"linear\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `linear-gradient(\n ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"135deg\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-rotate ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"radial\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `radial-gradient(\n circle at ${shouldAnimate ? \"var(--gradient-x, 50%) var(--gradient-y, 50%)\" : \"50% 50%\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-move ${speed}s ease-in-out infinite` : undefined,\n }}\n />\n );\n\n case \"conic\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `conic-gradient(\n from ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"0deg\"} at 50% 50%,\n ${colors.join(\", \")},\n ${colors[0]}\n )`,\n animation: shouldAnimate ? `gradient-spin ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"mesh\":\n default:\n return (\n <>\n {colors.map((color, index) => {\n const angle = (360 / colors.length) * index;\n const delay = (speed / colors.length) * index;\n return (\n <div\n key={index}\n className=\"absolute rounded-full mix-blend-screen\"\n style={{\n width: \"60%\",\n height: \"60%\",\n background: `radial-gradient(circle at center, ${color} 0%, transparent 70%)`,\n top: `${30 + Math.sin((angle * Math.PI) / 180) * 20}%`,\n left: `${30 + Math.cos((angle * Math.PI) / 180) * 20}%`,\n animation: shouldAnimate\n ? `gradient-blob ${speed}s ease-in-out infinite`\n : undefined,\n animationDelay: shouldAnimate ? `${-delay}s` : undefined,\n opacity: mounted ? 1 : 0,\n transition: \"opacity 0.5s ease-out\",\n }}\n />\n );\n })}\n </>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Gradient layer */}\n <div\n className=\"absolute inset-0\"\n style={{\n filter: blur ? `blur(${blurAmount}px)` : undefined,\n }}\n >\n {renderGradient()}\n </div>\n\n {/* Content */}\n {children && <div className=\"relative z-10\">{children}</div>}\n\n {/* Animation keyframes - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes gradient-rotate {\n 0% { --gradient-angle: 0deg; }\n 100% { --gradient-angle: 360deg; }\n }\n @keyframes gradient-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes gradient-move {\n 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }\n 25% { --gradient-x: 100%; --gradient-y: 0%; }\n 50% { --gradient-x: 100%; --gradient-y: 100%; }\n 75% { --gradient-x: 0%; --gradient-y: 100%; }\n }\n @keyframes gradient-blob {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(20%, -20%) scale(1.1); }\n 50% { transform: translate(0, 20%) scale(0.9); }\n 75% { transform: translate(-20%, -10%) scale(1.05); }\n }\n `}} />\n </div>\n );\n }\n);\n\nAnimatedGradient.displayName = \"AnimatedGradient\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport { AnimatedGradient };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TiltCard 컴포넌트의 props / TiltCard component props\n * @property {number} [maxTilt=15] - 최대 기울기 각도 / Maximum tilt angle in degrees\n * @property {number} [perspective=1000] - 원근감 / Perspective value\n * @property {number} [scale=1.02] - 호버시 스케일 / Scale on hover\n * @property {number} [speed=400] - 전환 속도 (ms) / Transition speed in milliseconds\n * @property {boolean} [glare=true] - 글레어 효과 / Glare effect\n * @property {number} [maxGlare=0.3] - 최대 글레어 투명도 / Maximum glare opacity\n * @property {boolean} [reset=true] - 마우스 떠나면 리셋 / Reset on mouse leave\n */\nexport interface TiltCardProps extends React.HTMLAttributes<HTMLDivElement> {\n maxTilt?: number;\n perspective?: number;\n scale?: number;\n speed?: number;\n glare?: boolean;\n maxGlare?: number;\n reset?: boolean;\n}\n\n/**\n * TiltCard 컴포넌트 / TiltCard component\n *\n * 마우스 움직임에 따라 3D 틸트 효과를 제공하는 카드 컴포넌트입니다.\n * 제품 카드, 프로필 카드, 갤러리에 적합합니다.\n *\n * Card component that provides 3D tilt effect based on mouse movement.\n * Perfect for product cards, profile cards, and galleries.\n *\n * @component\n * @example\n * <TiltCard className=\"bg-white shadow-lg rounded-xl p-6\">\n * <img src=\"/product.jpg\" alt=\"Product\" />\n * <h3>Premium Product</h3>\n * </TiltCard>\n */\nconst TiltCard = React.forwardRef<HTMLDivElement, TiltCardProps>(\n (\n {\n children,\n className,\n maxTilt = 15,\n perspective = 1000,\n scale = 1.02,\n speed = 400,\n glare = true,\n maxGlare = 0.3,\n reset = true,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n const [glarePosition, setGlarePosition] = useState({ x: 50, y: 50 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n\n const rect = cardRef.current.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n // Calculate rotation based on mouse position\n const mouseX = e.clientX - centerX;\n const mouseY = e.clientY - centerY;\n\n const rotateY = (mouseX / (rect.width / 2)) * maxTilt;\n const rotateX = -(mouseY / (rect.height / 2)) * maxTilt;\n\n setTransform({\n rotateX,\n rotateY,\n scale,\n });\n\n // Calculate glare position (0-100%)\n const glareX = ((e.clientX - rect.left) / rect.width) * 100;\n const glareY = ((e.clientY - rect.top) / rect.height) * 100;\n setGlarePosition({ x: glareX, y: glareY });\n },\n [maxTilt, scale]\n );\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n if (reset) {\n setTransform({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n }\n };\n\n const cardStyle: React.CSSProperties = {\n ...style,\n perspective: `${perspective}px`,\n };\n\n const innerStyle: React.CSSProperties = {\n transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg) scale(${transform.scale})`,\n transition: isHovered ? \"none\" : `transform ${speed}ms ease-out`,\n transformStyle: \"preserve-3d\",\n };\n\n const glareStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(\n ${Math.atan2(glarePosition.y - 50, glarePosition.x - 50) * (180 / Math.PI) + 90}deg,\n rgba(255, 255, 255, ${isHovered ? maxGlare : 0}) 0%,\n transparent 80%\n )`,\n transition: isHovered ? \"opacity 0.1s ease-out\" : `opacity ${speed}ms ease-out`,\n pointerEvents: \"none\",\n opacity: isHovered ? 1 : 0,\n };\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\"relative\", className)}\n style={cardStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <div style={innerStyle} className=\"relative\">\n {children}\n\n {/* Glare effect */}\n {glare && <div style={glareStyle} aria-hidden=\"true\" />}\n </div>\n </div>\n );\n }\n);\n\nTiltCard.displayName = \"TiltCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TiltCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * VideoBackground 컴포넌트의 props / VideoBackground component props\n * @property {string} src - 비디오 소스 (URL, YouTube ID, Vimeo ID) / Video source\n * @property {\"native\" | \"youtube\" | \"vimeo\"} [type=\"native\"] - 비디오 타입 / Video type\n * @property {string} [poster] - 포스터 이미지 URL / Poster image URL\n * @property {boolean} [autoPlay=true] - 자동 재생 / Auto play\n * @property {boolean} [loop=true] - 반복 재생 / Loop playback\n * @property {boolean} [muted=true] - 음소거 / Mute audio\n * @property {boolean} [controls=false] - 컨트롤 표시 / Show controls\n * @property {\"cover\" | \"contain\" | \"fill\"} [objectFit=\"cover\"] - 비디오 맞춤 / Video fit\n * @property {boolean} [overlay=true] - 오버레이 표시 / Show overlay\n * @property {string} [overlayColor=\"rgba(0, 0, 0, 0.4)\"] - 오버레이 색상 / Overlay color\n * @property {boolean} [gradient=false] - 그라디언트 오버레이 / Gradient overlay\n * @property {\"top\" | \"bottom\" | \"both\"} [gradientDirection=\"bottom\"] - 그라디언트 방향 / Gradient direction\n * @property {number} [playbackRate=1] - 재생 속도 / Playback rate\n * @property {boolean} [fadeIn=true] - 페이드 인 효과 / Fade in effect\n */\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n src: string;\n type?: \"native\" | \"youtube\" | \"vimeo\";\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n overlay?: boolean;\n overlayColor?: string;\n gradient?: boolean;\n gradientDirection?: \"top\" | \"bottom\" | \"both\";\n playbackRate?: number;\n fadeIn?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * VideoBackground 컴포넌트 / VideoBackground component\n *\n * 페이지 배경으로 사용할 수 있는 비디오 컴포넌트입니다.\n * YouTube, Vimeo, 일반 비디오 소스를 지원합니다.\n *\n * Video component that can be used as page background.\n * Supports YouTube, Vimeo, and native video sources.\n *\n * @component\n * @example\n * // Native video\n * <VideoBackground src=\"/hero-video.mp4\" overlay gradient>\n * <h1>Welcome</h1>\n * </VideoBackground>\n *\n * @example\n * // YouTube video\n * <VideoBackground\n * type=\"youtube\"\n * src=\"dQw4w9WgXcQ\"\n * overlay\n * overlayColor=\"rgba(0, 0, 50, 0.5)\"\n * />\n *\n * @example\n * // Vimeo video\n * <VideoBackground type=\"vimeo\" src=\"123456789\" />\n */\nconst VideoBackground = React.forwardRef<HTMLDivElement, VideoBackgroundProps>(\n (\n {\n src,\n type = \"native\",\n poster,\n autoPlay = true,\n loop = true,\n muted = true,\n controls = false,\n objectFit = \"cover\",\n overlay = true,\n overlayColor = \"rgba(0, 0, 0, 0.4)\",\n gradient = false,\n gradientDirection = \"bottom\",\n playbackRate = 1,\n fadeIn = true,\n children,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Handle native video playback rate\n useEffect(() => {\n if (type === \"native\" && videoRef.current) {\n videoRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate, type]);\n\n // Handle video loaded\n const handleLoadedData = () => {\n setIsLoaded(true);\n };\n\n const handlePlaying = () => {\n setIsPlaying(true);\n };\n\n // Generate YouTube embed URL\n const getYouTubeUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n mute: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n playlist: videoId, // Required for loop to work\n modestbranding: \"1\",\n rel: \"0\",\n showinfo: \"0\",\n iv_load_policy: \"3\",\n disablekb: \"1\",\n enablejsapi: \"1\",\n playsinline: \"1\",\n });\n return `https://www.youtube.com/embed/${videoId}?${params.toString()}`;\n };\n\n // Generate Vimeo embed URL\n const getVimeoUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n muted: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n background: \"1\",\n quality: \"auto\",\n dnt: \"1\",\n });\n return `https://player.vimeo.com/video/${videoId}?${params.toString()}`;\n };\n\n // Render video element based on type\n const renderVideo = () => {\n const objectFitClass = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n }[objectFit];\n\n switch (type) {\n case \"youtube\":\n return (\n <iframe\n src={getYouTubeUrl(src)}\n className={merge(\n \"absolute inset-0 w-full h-full pointer-events-none\",\n \"scale-[1.2]\" // Scale up to hide YouTube branding\n )}\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"YouTube video background\"\n />\n );\n\n case \"vimeo\":\n return (\n <iframe\n src={getVimeoUrl(src)}\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"Vimeo video background\"\n />\n );\n\n case \"native\":\n default:\n return (\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n controls={controls}\n playsInline\n className={merge(\n \"absolute inset-0 w-full h-full\",\n objectFitClass\n )}\n style={{\n opacity: isPlaying || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n onLoadedData={handleLoadedData}\n onPlaying={handlePlaying}\n />\n );\n }\n };\n\n // Generate gradient overlay\n const renderGradientOverlay = () => {\n if (!gradient) return null;\n\n const gradients = [];\n\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"top\"\n className=\"absolute top-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to bottom, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n if (gradientDirection === \"bottom\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"bottom\"\n className=\"absolute bottom-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{gradients}</>;\n };\n\n // Check if className contains position class (fixed, absolute, sticky)\n const hasPositionClass = className && /\\b(fixed|absolute|sticky)\\b/.test(className);\n\n return (\n <div\n ref={ref}\n className={merge(\n \"overflow-hidden\",\n !hasPositionClass && \"relative\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Poster image (shows until video loads) */}\n {poster && fadeIn && !isLoaded && !isPlaying && (\n <div\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${poster})` }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Video layer */}\n {renderVideo()}\n\n {/* Solid overlay */}\n {overlay && !gradient && (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayColor }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Gradient overlay */}\n {renderGradientOverlay()}\n\n {/* Content */}\n {children && (\n <div className=\"relative z-10 h-full\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nVideoBackground.displayName = \"VideoBackground\";\n\nexport { VideoBackground };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Carousel 컴포넌트의 props / Carousel component props\n * @property {boolean} [autoPlay=false] - 자동 재생 / Auto play\n * @property {number} [interval=5000] - 자동 재생 간격 (ms) / Auto play interval\n * @property {boolean} [loop=true] - 무한 루프 / Infinite loop\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {\"dots\" | \"bars\" | \"numbers\" | \"none\"} [indicators=\"dots\"] - 인디케이터 타입 / Indicator type\n * @property {\"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\"} [indicatorPosition=\"bottom\"] - 인디케이터 위치 / Indicator position\n * @property {boolean} [showArrows=true] - 화살표 버튼 표시 / Show arrow buttons\n * @property {\"inside\" | \"outside\" | \"hidden\"} [arrowPosition=\"inside\"] - 화살표 위치 / Arrow position\n * @property {\"slide\" | \"fade\" | \"scale\"} [transition=\"slide\"] - 전환 효과 / Transition effect\n * @property {number} [transitionDuration=500] - 전환 시간 (ms) / Transition duration\n * @property {(index: number) => void} [onSlideChange] - 슬라이드 변경 콜백 / Slide change callback\n * @property {boolean} [showPlayPause=false] - 재생/일시정지 버튼 표시 / Show play/pause button\n * @property {\"left\" | \"right\" | \"center\"} [playPausePosition=\"right\"] - 재생/일시정지 버튼 위치 / Play/pause button position\n */\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n children: React.ReactNode[];\n autoPlay?: boolean;\n interval?: number;\n loop?: boolean;\n pauseOnHover?: boolean;\n indicators?: \"dots\" | \"bars\" | \"numbers\" | \"none\";\n indicatorPosition?: \"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\";\n showArrows?: boolean;\n arrowPosition?: \"inside\" | \"outside\" | \"hidden\";\n transition?: \"slide\" | \"fade\" | \"scale\";\n transitionDuration?: number;\n onSlideChange?: (index: number) => void;\n showPlayPause?: boolean;\n playPausePosition?: \"left\" | \"right\" | \"center\";\n}\n\n/**\n * Carousel 컴포넌트 / Carousel component\n *\n * 슬라이드 캐러셀 컴포넌트입니다.\n * 다양한 인디케이터, 화살표, 전환 효과를 지원합니다.\n *\n * Slide carousel component.\n * Supports various indicators, arrows, and transition effects.\n *\n * @component\n * @example\n * <Carousel autoPlay interval={3000} indicators=\"bars\">\n * <img src=\"/slide1.jpg\" alt=\"Slide 1\" />\n * <img src=\"/slide2.jpg\" alt=\"Slide 2\" />\n * <img src=\"/slide3.jpg\" alt=\"Slide 3\" />\n * </Carousel>\n */\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n children,\n autoPlay = false,\n interval = 5000,\n loop = true,\n pauseOnHover = true,\n indicators = \"dots\",\n indicatorPosition = \"bottom\",\n showArrows = true,\n arrowPosition = \"inside\",\n transition = \"slide\",\n transitionDuration = 500,\n onSlideChange,\n showPlayPause = false,\n playPausePosition = \"right\",\n className,\n style,\n ...props\n },\n ref\n ) => {\n // For slide transition with loop: start at 1 (account for cloned first slide)\n // For fade/scale: always start at 0 (no cloned slides)\n const getInitialIndex = () => {\n if (transition === \"slide\" && loop) return 1;\n return 0;\n };\n const [currentIndex, setCurrentIndex] = useState(getInitialIndex);\n const [isPaused, setIsPaused] = useState(!autoPlay);\n const [isManuallyPaused, setIsManuallyPaused] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [noTransition, setNoTransition] = useState(false);\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slideCount = React.Children.count(children);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n // Get actual slide index for display (accounting for cloned slides in loop mode for slide transition)\n const getActualIndex = useCallback((index: number) => {\n // For fade/scale transitions, currentIndex is the actual index\n if (transition !== \"slide\") return index;\n // For slide transition without loop, index is actual\n if (!loop) return index;\n // For slide transition with loop, account for cloned slides\n if (index === 0) return slideCount - 1;\n if (index === slideCount + 1) return 0;\n return index - 1;\n }, [loop, slideCount, transition]);\n\n // Go to specific slide\n const goToSlide = useCallback(\n (index: number) => {\n if (isTransitioning) return;\n\n let newIndex = index;\n if (!loop) {\n newIndex = Math.max(0, Math.min(index, slideCount - 1));\n } else if (transition !== \"slide\") {\n // For fade/scale with loop, wrap around without cloned slides\n if (index < 0) {\n newIndex = slideCount - 1;\n } else if (index >= slideCount) {\n newIndex = 0;\n }\n }\n\n if (newIndex !== currentIndex) {\n setIsTransitioning(true);\n setCurrentIndex(newIndex);\n const actualIndex = loop && transition === \"slide\"\n ? (newIndex === 0 ? slideCount - 1 : newIndex === slideCount + 1 ? 0 : newIndex - 1)\n : newIndex;\n onSlideChange?.(actualIndex);\n setTimeout(() => setIsTransitioning(false), transitionDuration);\n }\n },\n [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition, onSlideChange]\n );\n\n // Handle infinite loop jump (when reaching cloned slides)\n useEffect(() => {\n if (!loop || isTransitioning || transition !== \"slide\") return;\n\n // Jump to real slide without animation when on cloned slides\n if (currentIndex === 0) {\n // At cloned last slide -> jump to real last slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(slideCount);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n } else if (currentIndex === slideCount + 1) {\n // At cloned first slide -> jump to real first slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(1);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n }\n }, [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition]);\n\n // Next slide\n const nextSlide = useCallback(() => {\n goToSlide(currentIndex + 1);\n }, [currentIndex, goToSlide]);\n\n // Previous slide\n const prevSlide = useCallback(() => {\n goToSlide(currentIndex - 1);\n }, [currentIndex, goToSlide]);\n\n // Toggle play/pause manually\n const togglePlayPause = useCallback(() => {\n setIsManuallyPaused(prev => !prev);\n }, []);\n\n // Play function\n const play = useCallback(() => {\n setIsManuallyPaused(false);\n }, []);\n\n // Pause function\n const pause = useCallback(() => {\n setIsManuallyPaused(true);\n }, []);\n\n // Auto play\n useEffect(() => {\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion) return;\n\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [autoPlay, interval, isPaused, isManuallyPaused, nextSlide, prefersReducedMotion]);\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n const minSwipeDistance = 50;\n\n if (Math.abs(distance) >= minSwipeDistance) {\n if (distance > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prevSlide();\n } else if (e.key === \"ArrowRight\") {\n nextSlide();\n }\n };\n\n const container = containerRef.current;\n container?.addEventListener(\"keydown\", handleKeyDown);\n return () => container?.removeEventListener(\"keydown\", handleKeyDown);\n }, [nextSlide, prevSlide]);\n\n // Render slides with transition\n const renderSlides = () => {\n const duration = prefersReducedMotion || noTransition ? 0 : transitionDuration;\n const actualIndex = getActualIndex(currentIndex);\n\n switch (transition) {\n case \"fade\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transition: `opacity ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"scale\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transform: `scale(${index === actualIndex ? 1 : 0.9})`,\n transition: `opacity ${duration}ms ease-in-out, transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"slide\":\n default: {\n const childArray = React.Children.toArray(children);\n // For infinite loop: clone last slide at beginning and first slide at end\n const slides = loop\n ? [childArray[childArray.length - 1], ...childArray, childArray[0]]\n : childArray;\n\n // 각 슬라이드를 fade/scale처럼 absolute로 배치하고 translateX로 위치 조정\n return slides.map((child, index) => (\n <div\n key={index}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n transform: `translateX(${(index - currentIndex) * 100}%)`,\n transition: noTransition ? 'none' : `transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n }\n }\n };\n\n // Render indicators\n const renderIndicators = () => {\n if (indicators === \"none\") return null;\n\n const isInside = indicatorPosition.includes(\"inside\");\n const isTop = indicatorPosition.includes(\"top\");\n const actualIndex = getActualIndex(currentIndex);\n\n const indicatorContainerClass = merge(\n \"flex items-center justify-center gap-2\",\n isInside\n ? merge(\n \"absolute left-1/2 -translate-x-1/2 z-20\",\n isTop ? \"top-4\" : \"bottom-4\"\n )\n : merge(\n \"mt-4\",\n isTop && \"order-first mb-4 mt-0\"\n )\n );\n\n // Handle indicator click - go to the correct index accounting for loop mode\n const handleIndicatorClick = (index: number) => {\n if (loop && transition === \"slide\") {\n goToSlide(index + 1); // +1 because of cloned first slide (only for slide transition)\n } else {\n goToSlide(index);\n }\n };\n\n return (\n <div className={indicatorContainerClass} role=\"tablist\">\n {Array.from({ length: slideCount }, (_, index) => {\n const isActive = index === actualIndex;\n\n switch (indicators) {\n case \"bars\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"h-1 rounded-full transition-all duration-300\",\n isActive\n ? \"w-8 bg-white\"\n : \"w-4 bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n\n case \"numbers\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-8 h-8 rounded-full text-sm font-medium transition-all duration-300\",\n isActive\n ? \"bg-white text-gray-900\"\n : \"bg-white/30 text-white hover:bg-white/50\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n >\n {index + 1}\n </button>\n );\n\n case \"dots\":\n default:\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n isActive\n ? \"bg-white scale-125\"\n : \"bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n }\n })}\n </div>\n );\n };\n\n // Render play/pause button\n const renderPlayPause = () => {\n if (!showPlayPause || !autoPlay) return null;\n\n const isPlaying = !isManuallyPaused;\n const positionClasses = {\n left: \"left-4\",\n center: \"left-1/2 -translate-x-1/2\",\n right: \"right-4\"\n };\n\n return (\n <button\n onClick={togglePlayPause}\n className={merge(\n \"absolute bottom-4 z-20\",\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\",\n positionClasses[playPausePosition]\n )}\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\n >\n {isPlaying ? <PauseIcon className=\"w-4 h-4\" /> : <PlayIcon className=\"w-4 h-4\" />}\n </button>\n );\n };\n\n // Render arrows\n const renderArrows = () => {\n if (!showArrows || arrowPosition === \"hidden\") return null;\n\n const canGoPrev = loop || currentIndex > 0;\n const canGoNext = loop || currentIndex < slideCount - 1;\n\n const arrowBaseClass = merge(\n \"absolute top-1/2 -translate-y-1/2 z-20\",\n \"w-10 h-10 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\"\n );\n\n const prevPosition = arrowPosition === \"outside\" ? \"-left-14\" : \"left-4\";\n const nextPosition = arrowPosition === \"outside\" ? \"-right-14\" : \"right-4\";\n\n return (\n <>\n <button\n onClick={prevSlide}\n disabled={!canGoPrev}\n className={merge(arrowBaseClass, prevPosition)}\n aria-label=\"이전 슬라이드\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <button\n onClick={nextSlide}\n disabled={!canGoNext}\n className={merge(arrowBaseClass, nextPosition)}\n aria-label=\"다음 슬라이드\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n </>\n );\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex flex-col w-full h-full\",\n arrowPosition === \"outside\" && \"px-16\",\n className\n )}\n style={style}\n {...props}\n >\n <div\n ref={containerRef}\n className=\"relative overflow-hidden w-full flex-1\"\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"이미지 슬라이더\"\n >\n {renderSlides()}\n {renderArrows()}\n {renderPlayPause()}\n {indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n {!indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n );\n }\n);\n\nCarousel.displayName = \"Carousel\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Simple icon components\nfunction ChevronLeft({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nfunction ChevronRight({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport { Carousel };\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\nimport type { Color } from '../../../lib/types/common';\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n *\n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n *\n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n *\n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter\n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n *\n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-indigo-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-muted rounded-full\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n *\n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n *\n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n *\n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton\n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n *\n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\n sizeClasses[size],\n isSelected\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\"\n : \"border-border bg-background\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton }\n","'use client'\n\nimport React from \"react\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n *\n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n *\n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n *\n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n *\n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({\n className,\n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props\n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n\n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector }\nexport type { EmotionSelectorProps }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n \"transition-[transform,box-shadow,border-color] duration-200 ease-out\",\n hoverable && \"hover:-translate-y-0.5 hover:shadow-lg hover:border-primary/30 cursor-pointer active:translate-y-0 active:shadow-md\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","'use client'\n\nimport React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { merge } from '../../../lib/utils';\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n *\n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n *\n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n *\n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n *\n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({\n className,\n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props\n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className={`${item.color} h-2 rounded-full transition-all duration-300`}\n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis }\nexport type { EmotionAnalysisProps }\n","/**\n * 슬러그 생성 유틸리티\n * Slug generation utilities\n */\n\n/**\n * 제목에서 URL 슬러그 생성\n * Generate URL slug from title\n *\n * @param title - 제목 / Title\n * @returns 슬러그 / Slug\n *\n * @example\n * ```ts\n * generateSlug('Hello World') // 'hello-world'\n * generateSlug('안녕하세요') // '안녕하세요'\n * generateSlug('Hello 안녕') // 'hello-안녕'\n * ```\n */\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .trim()\n}\n\n/**\n * 슬러그 유효성 검사\n * Validate slug\n *\n * @param slug - 슬러그 / Slug\n * @returns 유효 여부 / Whether valid\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length === 0) return false\n if (slug.length > 200) return false\n\n // 슬러그 형식 검사: 영문, 숫자, 한글, 일본어, 하이픈만 허용\n const slugPattern = /^[a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]+$/\n return slugPattern.test(slug)\n}\n\n/**\n * 슬러그 정규화 (입력된 슬러그를 유효한 형식으로 변환)\n * Normalize slug (convert input to valid format)\n *\n * @param input - 입력값 / Input value\n * @returns 정규화된 슬러그 / Normalized slug\n */\nexport function normalizeSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","\"use client\"\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'\nimport type {\n BlogEditorContextValue,\n BlogEditorData,\n BlogEditorProps,\n BlogEditorLabels,\n BlogEditorFeatures,\n LanguageConfig,\n MultilingualField,\n} from './types'\nimport { generateSlug as generateSlugUtil } from './utils/slug'\n\n/**\n * 기본 레이블 / Default labels\n */\nconst DEFAULT_LABELS: BlogEditorLabels = {\n // Header\n pageTitle: '새 글 작성',\n editTitle: '글 수정',\n preview: '미리보기',\n editMode: '편집',\n\n // Metadata\n basicInfo: '기본 정보',\n slug: '슬러그',\n slugPrefix: '/blog/',\n tags: '태그',\n tagsPlaceholder: '개발, 일상, 업데이트',\n coverImage: '커버 이미지 URL',\n coverImagePlaceholder: 'https://example.com/image.jpg',\n publishDate: '발행 예약일시',\n publishDateHint: '비워두면 즉시 발행됨',\n expiresAt: '만료 일시',\n expiresAtHint: '비워두면 만료되지 않음',\n\n // Content\n titleLabel: '제목',\n titlePlaceholder: '제목을 입력하세요',\n excerpt: '요약',\n excerptPlaceholder: '카드에 표시될 짧은 요약',\n contentLabel: '본문',\n contentPlaceholder: '마크다운으로 작성하세요...',\n\n // Actions\n cancel: '취소',\n saveDraft: '임시저장',\n publish: '발행',\n update: '수정 완료',\n saving: '저장 중...',\n\n // Translation\n translateHint: 'AI 번역 기능',\n translateButton: 'AI 번역',\n translating: '번역 중...',\n translateSuccess: '번역 완료!',\n\n // Errors\n requiredFields: '필수 필드를 입력해주세요',\n saveError: '저장 중 오류 발생',\n translateError: '번역 중 오류 발생',\n noTitle: '제목 없음',\n\n // Toolbar\n bold: '굵게',\n italic: '기울임',\n strikethrough: '취소선',\n heading: '제목',\n link: '링크',\n image: '이미지',\n code: '코드',\n codeBlock: '코드블록',\n quote: '인용문',\n list: '목록',\n orderedList: '순서 목록',\n horizontalRule: '수평선',\n}\n\n/**\n * 기본 기능 / Default features\n */\nconst DEFAULT_FEATURES: Required<BlogEditorFeatures> = {\n enableSlug: true,\n enableTags: true,\n enableCoverImage: true,\n enablePublishDate: true,\n enableExcerpt: true,\n enableTranslation: true,\n enablePreview: true,\n enableMarkdownToolbar: true,\n enableAutoSave: true,\n enableExpiresAt: false,\n}\n\n/**\n * 기본 언어 / Default languages\n */\nconst DEFAULT_LANGUAGES: LanguageConfig[] = [\n { key: 'ko', label: '한국어', isPrimary: true, flag: '🇰🇷' },\n { key: 'en', label: 'English', flag: '🇺🇸' },\n { key: 'ja', label: '日本語', flag: '🇯🇵' },\n]\n\n/**\n * 빈 다국어 필드 생성 / Create empty multilingual field\n */\nfunction createEmptyMultilingualField(languages: LanguageConfig[]): MultilingualField {\n const field: MultilingualField = {}\n languages.forEach((lang) => {\n field[lang.key] = ''\n })\n return field\n}\n\n/**\n * 초기 데이터 생성 / Create initial data\n */\nfunction createInitialData(\n languages: LanguageConfig[],\n initialData?: Partial<BlogEditorData>\n): BlogEditorData {\n return {\n slug: initialData?.slug ?? '',\n title: initialData?.title ?? createEmptyMultilingualField(languages),\n excerpt: initialData?.excerpt ?? createEmptyMultilingualField(languages),\n content: initialData?.content ?? createEmptyMultilingualField(languages),\n tags: initialData?.tags ?? [],\n coverImage: initialData?.coverImage ?? '',\n publishedAt: initialData?.publishedAt ?? null,\n expiresAt: initialData?.expiresAt ?? null,\n }\n}\n\n/**\n * BlogEditor 컨텍스트 / BlogEditor context\n */\nconst BlogEditorContext = createContext<BlogEditorContextValue | null>(null)\n\n/**\n * BlogEditor 컨텍스트 훅 / BlogEditor context hook\n */\nexport function useBlogEditor(): BlogEditorContextValue {\n const context = useContext(BlogEditorContext)\n if (!context) {\n throw new Error('useBlogEditor must be used within a BlogEditorProvider')\n }\n return context\n}\n\n/**\n * BlogEditor 프로바이더 Props / BlogEditor provider props\n */\ninterface BlogEditorProviderProps extends BlogEditorProps {\n children: React.ReactNode\n}\n\n/**\n * BlogEditor 프로바이더 / BlogEditor provider\n */\nexport function BlogEditorProvider({\n children,\n initialData,\n isEditMode = false,\n languages = DEFAULT_LANGUAGES,\n defaultLanguage,\n labels: userLabels,\n callbacks,\n features: userFeatures,\n variant = 'default',\n autoSaveKey,\n autoSaveInterval = 3000,\n}: BlogEditorProviderProps) {\n // 언어 설정\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key ?? languages[0]?.key ?? 'ko'\n const initialLanguage = defaultLanguage ?? primaryLanguage\n\n // 병합된 설정\n const labels = useMemo<BlogEditorLabels>(\n () => ({ ...DEFAULT_LABELS, ...userLabels }),\n [userLabels]\n )\n const features = useMemo<Required<BlogEditorFeatures>>(\n () => ({ ...DEFAULT_FEATURES, ...userFeatures }),\n [userFeatures]\n )\n\n // 상태\n const [formData, setFormData] = useState<BlogEditorData>(() =>\n createInitialData(languages, initialData)\n )\n const [activeLanguage, setActiveLanguage] = useState(initialLanguage)\n const [showPreview, setShowPreview] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [translating, setTranslating] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [translateSuccess, setTranslateSuccess] = useState(false)\n // 슬러그가 사용자에 의해 수동 편집되었는지 추적\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(isEditMode || !!initialData?.slug)\n const [autoSaveStatus, setAutoSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle')\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const isInitialMount = useRef(true)\n\n // 자동저장 키 생성 / Generate auto-save key\n const storageKey = autoSaveKey || (isEditMode ? null : 'blog-editor-draft')\n\n // localStorage에서 복원 (새 글 작성 모드만) / Restore from localStorage (create mode only)\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey || isEditMode) return\n\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved) as BlogEditorData\n setFormData(parsed)\n }\n } catch {\n // 파싱 실패 시 무시\n }\n }, []) // 마운트 시 한 번만 실행\n\n // 자동저장 / Auto-save to localStorage\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey) return\n\n // 초기 마운트 시에는 저장하지 않음\n if (isInitialMount.current) {\n isInitialMount.current = false\n return\n }\n\n // 기존 타이머 취소\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n\n setAutoSaveStatus('saving')\n\n // debounce 저장\n autoSaveTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(formData))\n setAutoSaveStatus('saved')\n // 3초 후 idle로\n setTimeout(() => setAutoSaveStatus('idle'), 2000)\n } catch {\n setAutoSaveStatus('idle')\n }\n }, autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n }\n }, [formData, features.enableAutoSave, storageKey, autoSaveInterval])\n\n // 저장 성공 시 localStorage 초기화 / Clear localStorage on successful save\n const clearAutoSave = useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // 무시\n }\n }\n }, [storageKey])\n\n // 필드 업데이트 / Update field\n const updateField = useCallback(\n <K extends keyof BlogEditorData>(field: K, value: BlogEditorData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }))\n },\n []\n )\n\n // 다국어 필드 업데이트 / Update multilingual field\n const updateMultilingualField = useCallback(\n (field: 'title' | 'excerpt' | 'content', language: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [field]: {\n ...prev[field],\n [language]: value,\n },\n }))\n },\n []\n )\n\n // 슬러그 생성 / Generate slug\n const generateSlug = useCallback((title: string) => {\n return generateSlugUtil(title)\n }, [])\n\n // 저장 핸들러 / Save handler\n const handleSave = useCallback(\n async (publish: boolean) => {\n // 유효성 검사\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n if (features.enableSlug && !formData.slug) {\n setError(labels.requiredFields)\n return\n }\n\n setSubmitting(true)\n setError(null)\n\n try {\n await callbacks.onSave(formData, publish)\n // 저장 성공 시 자동저장 데이터 삭제\n clearAutoSave()\n } catch (err) {\n setError(labels.saveError)\n } finally {\n setSubmitting(false)\n }\n },\n [formData, primaryLanguage, labels, features, callbacks, clearAutoSave]\n )\n\n // 번역 핸들러 / Translate handler\n const handleTranslate = useCallback(async () => {\n if (!callbacks.onTranslate) return\n\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n const primaryExcerpt = formData.excerpt[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n setTranslating(true)\n setError(null)\n setTranslateSuccess(false)\n\n try {\n const translations = await callbacks.onTranslate({\n sourceLanguage: primaryLanguage,\n title: primaryTitle,\n content: primaryContent,\n excerpt: primaryExcerpt || undefined,\n })\n\n // 번역 결과 적용\n setFormData((prev) => {\n const newTitle = { ...prev.title }\n const newContent = { ...prev.content }\n const newExcerpt = { ...prev.excerpt }\n\n // translations는 { title: MultilingualField, content: MultilingualField, excerpt: MultilingualField } 형태일 수 있음\n // 또는 단순히 { ko: { title, content, excerpt }, en: { ... }, ja: { ... } } 형태일 수 있음\n // 여기서는 콜백이 언어별 번역을 반환한다고 가정\n Object.keys(translations).forEach((langKey) => {\n if (langKey !== primaryLanguage) {\n const translation = translations[langKey]\n if (typeof translation === 'object' && translation !== null) {\n const trans = translation as { title?: string; content?: string; excerpt?: string }\n if (trans.title) newTitle[langKey] = trans.title\n if (trans.content) newContent[langKey] = trans.content\n if (trans.excerpt) newExcerpt[langKey] = trans.excerpt\n }\n }\n })\n\n return {\n ...prev,\n title: newTitle,\n content: newContent,\n excerpt: newExcerpt,\n }\n })\n\n setTranslateSuccess(true)\n setTimeout(() => setTranslateSuccess(false), 3000)\n } catch (err) {\n setError(labels.translateError)\n } finally {\n setTranslating(false)\n }\n }, [formData, primaryLanguage, labels, callbacks])\n\n // 이미지 업로드 핸들러 / Image upload handler\n const handleUploadImage = useCallback(async (file: File): Promise<string | null> => {\n if (!callbacks.onUploadImage) return null\n\n setUploading(true)\n setError(null)\n\n try {\n const url = await callbacks.onUploadImage(file)\n return url\n } catch (err) {\n setError('이미지 업로드 실패')\n return null\n } finally {\n setUploading(false)\n }\n }, [callbacks])\n\n // 취소 핸들러 / Cancel handler\n const handleCancel = useCallback(() => {\n callbacks.onCancel?.()\n }, [callbacks])\n\n // 컨텍스트 값\n const value = useMemo<BlogEditorContextValue>(\n () => ({\n // State\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n\n // Config\n languages,\n features,\n labels,\n variant,\n isEditMode,\n\n // Actions\n setActiveLanguage,\n setShowPreview,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n setError,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n }),\n [\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n languages,\n features,\n labels,\n variant,\n isEditMode,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n ]\n )\n\n return <BlogEditorContext.Provider value={value}>{children}</BlogEditorContext.Provider>\n}\n\nexport { BlogEditorContext }\n","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'lucide',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorHeader Props\n */\nexport interface BlogEditorHeaderProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorHeader 컴포넌트\n * 에디터 헤더 (제목 + 미리보기 토글)\n */\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\n ({ onBack, backLink, className }, ref) => {\n const { labels, isEditMode, formData } = useBlogEditor()\n\n return (\n <header\n ref={ref}\n className={merge('flex items-center justify-between mb-8', className)}\n >\n <div className=\"flex items-center gap-4\">\n {backLink || (\n onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"뒤로가기\"\n >\n <Icon name=\"chevronLeft\" size={24} />\n </button>\n )\n )}\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {isEditMode ? labels.editTitle : labels.pageTitle}\n </h1>\n {isEditMode && formData.slug && (\n <p className=\"text-sm text-muted-foreground\">\n {labels.slugPrefix}{formData.slug}\n </p>\n )}\n </div>\n </div>\n </header>\n )\n }\n)\n\nBlogEditorHeader.displayName = 'BlogEditorHeader'\n\nexport { BlogEditorHeader }\n","\"use client\"\n\nimport React, { useState, useCallback, useRef, KeyboardEvent, ChangeEvent } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { normalizeSlug } from './utils/slug'\n\n/**\n * BlogEditorMetadata Props\n */\nexport interface BlogEditorMetadataProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorMetadata 컴포넌트\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\n */\nconst BlogEditorMetadata = React.forwardRef<HTMLDivElement, BlogEditorMetadataProps>(\n ({ className }, ref) => {\n const { formData, updateField, features, labels, variant, handleUploadImage, uploading, setSlugManuallyEdited } = useBlogEditor()\n const [tagInput, setTagInput] = useState('')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const containerClasses = merge(\n 'rounded-xl p-6 space-y-4',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-background/20 dark:border-border/50'\n : variant === 'minimal'\n ? 'bg-transparent'\n : 'bg-background',\n className\n )\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n // 태그 추가\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim()\n if (trimmed && !formData.tags.includes(trimmed)) {\n updateField('tags', [...formData.tags, trimmed])\n }\n setTagInput('')\n }, [formData.tags, updateField])\n\n // 태그 삭제\n const removeTag = useCallback((tagToRemove: string) => {\n updateField('tags', formData.tags.filter((t) => t !== tagToRemove))\n }, [formData.tags, updateField])\n\n // 태그 입력 핸들러\n const handleTagInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n // 쉼표 입력 시 태그 추가\n if (value.includes(',')) {\n const parts = value.split(',')\n parts.forEach((part, idx) => {\n if (idx < parts.length - 1) {\n // 마지막이 아닌 부분들은 태그로 추가\n addTag(part)\n } else {\n // 마지막 부분은 입력창에 유지\n setTagInput(part)\n }\n })\n } else {\n setTagInput(value)\n }\n }, [addTag])\n\n // 키보드 이벤트 핸들러\n const handleTagKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(tagInput)\n } else if (e.key === 'Backspace' && !tagInput && formData.tags.length > 0) {\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\n removeTag(formData.tags[formData.tags.length - 1])\n }\n }, [tagInput, formData.tags, addTag, removeTag])\n\n return (\n <div ref={ref} className={containerClasses}>\n <h2 className=\"font-semibold text-foreground\">{labels.basicInfo}</h2>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* 슬러그 */}\n {features.enableSlug && (\n <div>\n <label className={labelClasses}>\n {labels.slug} *\n </label>\n <div className=\"flex items-center\">\n <span className=\"text-muted-foreground mr-1 text-sm\">\n {labels.slugPrefix}\n </span>\n <input\n type=\"text\"\n value={formData.slug}\n onChange={(e) => {\n updateField('slug', normalizeSlug(e.target.value))\n setSlugManuallyEdited(true)\n }}\n className={merge(inputClasses, 'flex-1')}\n placeholder=\"my-post-slug\"\n />\n </div>\n </div>\n )}\n\n {/* 태그 */}\n {features.enableTags && (\n <div>\n <label className={labelClasses}>{labels.tags}</label>\n <div className={merge(\n 'flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background focus-within:ring-1 focus-within:ring-ring focus-within:border-transparent transition-colors'\n )}>\n {/* 태그 칩들 */}\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n className=\"hover:text-primary transition-colors\"\n aria-label={`${tag} 태그 삭제`}\n >\n <Icon name=\"x\" size={14} />\n </button>\n </span>\n ))}\n {/* 입력창 */}\n <input\n type=\"text\"\n value={tagInput}\n onChange={handleTagInputChange}\n onKeyDown={handleTagKeyDown}\n className=\"flex-1 min-w-[100px] bg-transparent outline-none text-foreground text-sm\"\n placeholder={formData.tags.length === 0 ? labels.tagsPlaceholder : '태그 추가...'}\n />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n 쉼표(,) 또는 Enter로 태그 추가\n </p>\n </div>\n )}\n </div>\n\n {/* 커버 이미지 */}\n {features.enableCoverImage && (\n <div>\n <label className={labelClasses}>{labels.coverImage}</label>\n <div className=\"space-y-3\">\n {/* 이미지 미리보기 */}\n {formData.coverImage && (\n <div className=\"relative w-full h-40 rounded-lg overflow-hidden bg-muted\">\n <img\n src={formData.coverImage}\n alt=\"커버 이미지 미리보기\"\n className=\"w-full h-full object-cover\"\n />\n <button\n type=\"button\"\n onClick={() => updateField('coverImage', '')}\n className=\"absolute top-2 right-2 p-1.5 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors\"\n aria-label=\"이미지 삭제\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n )}\n\n {/* URL 입력 + 파일 업로드 */}\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={formData.coverImage}\n onChange={(e) => updateField('coverImage', e.target.value)}\n className={merge(inputClasses, 'flex-1')}\n placeholder={labels.coverImagePlaceholder}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n const url = await handleUploadImage(file)\n if (url) {\n updateField('coverImage', url)\n }\n }\n // 같은 파일 다시 선택할 수 있도록 초기화\n e.target.value = ''\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading}\n className=\"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n title=\"이미지 업로드\"\n >\n {uploading ? (\n <Icon name=\"loader\" size={20} spin />\n ) : (\n <Icon name=\"upload\" size={20} />\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* 발행일 & 만료일 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {features.enablePublishDate && (\n <div>\n <label className={labelClasses}>{labels.publishDate}</label>\n <input\n type=\"datetime-local\"\n value={formData.publishedAt ?? ''}\n onChange={(e) => updateField('publishedAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.publishDateHint}\n </p>\n </div>\n )}\n\n {features.enableExpiresAt && (\n <div>\n <label className={labelClasses}>{labels.expiresAt}</label>\n <input\n type=\"datetime-local\"\n value={formData.expiresAt ?? ''}\n onChange={(e) => updateField('expiresAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.expiresAtHint}\n </p>\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorMetadata.displayName = 'BlogEditorMetadata'\n\nexport { BlogEditorMetadata }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorLanguageTabs Props\n */\nexport interface BlogEditorLanguageTabsProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorLanguageTabs 컴포넌트\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\n */\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\n ({ className }, ref) => {\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex items-center border-b border-border sticky top-0 z-10 bg-background',\n className\n )}\n role=\"tablist\"\n aria-label=\"언어 선택\"\n >\n <div className=\"flex flex-1\">\n {languages.map((lang) => {\n const isActive = activeLanguage === lang.key\n const isPrimary = lang.isPrimary\n\n return (\n <button\n key={lang.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${lang.key}`}\n id={`tab-${lang.key}`}\n onClick={() => setActiveLanguage(lang.key)}\n className={merge(\n 'flex-1 px-4 py-3 text-sm font-medium transition-colors',\n isActive\n ? 'bg-primary/10 text-primary border-b-2 border-primary'\n : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {lang.flag && <span className=\"mr-1.5\">{lang.flag}</span>}\n {lang.label}\n {isPrimary && ' *'}\n </button>\n )\n })}\n </div>\n\n {features.enablePreview && (\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n className=\"inline-flex items-center gap-1.5 px-3 py-2 mx-2 text-sm border border-border rounded-lg hover:bg-muted transition-colors shrink-0\"\n >\n <Icon name={showPreview ? 'pencil' : 'eye'} size={14} />\n {showPreview ? labels.editMode : labels.preview}\n </button>\n )}\n </div>\n )\n }\n)\n\nBlogEditorLanguageTabs.displayName = 'BlogEditorLanguageTabs'\n\nexport { BlogEditorLanguageTabs }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorContent Props\n */\nexport interface BlogEditorContentProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** textarea ref 콜백 / textarea ref callback */\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\n}\n\n/**\n * BlogEditorContent 컴포넌트\n * 제목, 요약, 본문 입력 필드\n */\nconst BlogEditorContent = React.forwardRef<HTMLDivElement, BlogEditorContentProps>(\n ({ className, textareaRef }, ref) => {\n const {\n formData,\n activeLanguage,\n updateMultilingualField,\n updateField,\n features,\n labels,\n languages,\n generateSlug,\n isEditMode,\n slugManuallyEdited,\n } = useBlogEditor()\n\n const isPrimaryLanguage = languages.find((l) => l.isPrimary)?.key === activeLanguage\n const currentLang = languages.find((l) => l.key === activeLanguage)\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n const handleTitleChange = (value: string) => {\n updateMultilingualField('title', activeLanguage, value)\n\n // 영어 탭에서 타이틀 입력 시 슬러그 자동 생성\n // (한국어/일본어보다 영어 슬러그가 URL에 적합)\n if (activeLanguage === 'en' && !isEditMode && !slugManuallyEdited) {\n updateField('slug', generateSlug(value))\n }\n }\n\n // 언어별 레이블 생성\n const getLangLabel = (baseLabel: string) => {\n if (isPrimaryLanguage) {\n return `${baseLabel} *`\n }\n return `${baseLabel} (${currentLang?.label || activeLanguage})`\n }\n\n return (\n <div ref={ref} className={merge('p-6 space-y-4', className)}>\n {/* 제목 */}\n <div>\n <label className={labelClasses}>{getLangLabel(labels.titleLabel)}</label>\n <input\n type=\"text\"\n value={formData.title[activeLanguage] || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n className={inputClasses}\n placeholder={labels.titlePlaceholder}\n />\n </div>\n\n {/* 요약 */}\n {features.enableExcerpt && (\n <div>\n <label className={labelClasses}>{getLangLabel(labels.excerpt)}</label>\n <textarea\n value={formData.excerpt[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\n rows={2}\n className={merge(inputClasses, 'resize-none')}\n placeholder={labels.excerptPlaceholder}\n />\n </div>\n )}\n\n {/* 본문 */}\n <div>\n <label className={labelClasses}>\n {getLangLabel(labels.contentLabel)} (마크다운)\n </label>\n <textarea\n ref={textareaRef}\n value={formData.content[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('content', activeLanguage, e.target.value)}\n rows={15}\n className={merge(inputClasses, 'font-mono text-sm resize-y min-h-[300px]')}\n placeholder={labels.contentPlaceholder}\n />\n </div>\n </div>\n )\n }\n)\n\nBlogEditorContent.displayName = 'BlogEditorContent'\n\nexport { BlogEditorContent }\n","/**\n * 마크다운 파서 유틸리티\n * Markdown parser utilities\n *\n * 지원 문법 / Supported syntax:\n * - **볼드**, *이탤릭*, ~~취소선~~\n * - [링크](url)\n * - # 헤딩 (h1-h6)\n * - - 또는 * 리스트\n * - `인라인 코드`\n * - ```코드블록```\n * - > 인용문\n * - --- 수평선\n */\n\n/**\n * HTML 특수문자 이스케이프\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * 마크다운 텍스트를 HTML로 변환\n * Convert markdown text to HTML\n */\nexport function parseMarkdown(text: string): string {\n if (!text) return ''\n\n let html = text\n\n // 코드블록 먼저 처리 (다른 파싱 방지)\n html = html.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, lang, code) => {\n const escaped = escapeHtml(code.trim())\n return `<pre class=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\"><code class=\"text-sm\">${escaped}</code></pre>`\n })\n\n // 인라인 코드\n html = html.replace(\n /`([^`]+)`/g,\n '<code class=\"bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm\">$1</code>'\n )\n\n // 헤딩 (줄 시작에서만)\n html = html.replace(/^######\\s+(.+)$/gm, '<h6 class=\"text-base font-semibold mt-4 mb-2\">$1</h6>')\n html = html.replace(/^#####\\s+(.+)$/gm, '<h5 class=\"text-lg font-semibold mt-4 mb-2\">$1</h5>')\n html = html.replace(/^####\\s+(.+)$/gm, '<h4 class=\"text-xl font-semibold mt-5 mb-2\">$1</h4>')\n html = html.replace(/^###\\s+(.+)$/gm, '<h3 class=\"text-2xl font-semibold mt-5 mb-3\">$1</h3>')\n html = html.replace(/^##\\s+(.+)$/gm, '<h2 class=\"text-2xl font-bold mt-6 mb-3\">$1</h2>')\n html = html.replace(/^#\\s+(.+)$/gm, '<h1 class=\"text-3xl font-bold mt-6 mb-4\">$1</h1>')\n\n // 수평선\n html = html.replace(/^---+$/gm, '<hr class=\"my-6 border-gray-300 dark:border-gray-600\" />')\n\n // 인용문\n html = html.replace(\n /^>\\s+(.+)$/gm,\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-4 italic text-gray-600 dark:text-gray-400\">$1</blockquote>'\n )\n\n // 볼드, 이탤릭, 취소선\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n html = html.replace(/~~(.+?)~~/g, '<del class=\"text-gray-500\">$1</del>')\n\n // 링크\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-cyan-600 hover:text-cyan-700 dark:text-cyan-400 dark:hover:text-cyan-300 underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n )\n\n // 리스트 (연속된 리스트 아이템을 ul로 감싸기)\n html = html.replace(/^[-*]\\s+(.+)$/gm, '<li class=\"ml-4\">$1</li>')\n html = html.replace(/(<li[^>]*>.*<\\/li>\\n?)+/g, (match) => {\n return `<ul class=\"list-disc list-inside my-4 space-y-1\">${match}</ul>`\n })\n\n // 줄바꿈을 <br>로 변환 (단, 블록 요소 직후는 제외)\n html = html.replace(/\\n(?!<)/g, '<br />\\n')\n\n // 연속된 <br /> 정리\n html = html.replace(/(<br \\/>[\\n\\s]*){3,}/g, '<br /><br />\\n')\n\n return html\n}\n\n/**\n * 마크다운에서 순수 텍스트만 추출 (미리보기용)\n * Extract plain text from markdown (for preview)\n */\nexport function stripMarkdown(text: string): string {\n if (!text) return ''\n\n return text\n // 코드블록 제거\n .replace(/```[\\s\\S]*?```/g, '')\n // 인라인 코드 제거\n .replace(/`[^`]+`/g, '')\n // 헤딩 마크 제거\n .replace(/^#{1,6}\\s+/gm, '')\n // 볼드/이탤릭 마크 제거\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n // 링크에서 텍스트만 추출\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // 리스트 마크 제거\n .replace(/^[-*]\\s+/gm, '')\n // 인용문 마크 제거\n .replace(/^>\\s+/gm, '')\n // 수평선 제거\n .replace(/^---+$/gm, '')\n // 연속 공백/줄바꿈 정리\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n\n/**\n * 마크다운 텍스트 미리보기 (글자수 제한)\n * Markdown text preview (with character limit)\n */\nexport function getMarkdownPreview(text: string, maxLength: number = 150): string {\n const stripped = stripMarkdown(text)\n if (stripped.length <= maxLength) return stripped\n return stripped.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * 마크다운 삽입 헬퍼\n * Markdown insertion helper\n */\nexport function insertMarkdown(\n text: string,\n selectionStart: number,\n selectionEnd: number,\n before: string,\n after: string\n): { text: string; cursorPosition: number } {\n const selectedText = text.slice(selectionStart, selectionEnd)\n const beforeText = text.slice(0, selectionStart)\n const afterText = text.slice(selectionEnd)\n\n const newText = beforeText + before + selectedText + after + afterText\n const cursorPosition = selectionStart + before.length + selectedText.length + after.length\n\n return { text: newText, cursorPosition }\n}\n","\"use client\"\n\nimport React, { useCallback } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { insertMarkdown } from './utils/markdown'\nimport type { ToolbarItem } from './types'\n\n/**\n * BlogEditorToolbar Props\n */\nexport interface BlogEditorToolbarProps {\n /** textarea ref / textarea reference */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * 툴바 아이템 정의 / Toolbar item definitions\n */\nconst TOOLBAR_ITEMS: ToolbarItem[] = [\n {\n icon: 'bold',\n label: 'bold',\n markdown: { before: '**', after: '**' },\n shortcut: 'Ctrl+B',\n },\n {\n icon: 'italic',\n label: 'italic',\n markdown: { before: '*', after: '*' },\n shortcut: 'Ctrl+I',\n },\n {\n icon: 'strikethrough',\n label: 'strikethrough',\n markdown: { before: '~~', after: '~~' },\n },\n {\n icon: 'heading',\n label: 'heading',\n markdown: { before: '## ', after: '' },\n },\n {\n icon: 'link',\n label: 'link',\n markdown: { before: '[', after: '](url)' },\n shortcut: 'Ctrl+K',\n },\n {\n icon: 'image',\n label: 'image',\n markdown: { before: '![alt](', after: ')' },\n },\n {\n icon: 'code',\n label: 'code',\n markdown: { before: '`', after: '`' },\n },\n {\n icon: 'fileCode',\n label: 'codeBlock',\n markdown: { before: '```\\n', after: '\\n```' },\n },\n {\n icon: 'quote',\n label: 'quote',\n markdown: { before: '> ', after: '' },\n },\n {\n icon: 'list',\n label: 'list',\n markdown: { before: '- ', after: '' },\n },\n {\n icon: 'listOrdered',\n label: 'orderedList',\n markdown: { before: '1. ', after: '' },\n },\n {\n icon: 'minus',\n label: 'horizontalRule',\n markdown: { before: '\\n---\\n', after: '' },\n },\n]\n\n/**\n * BlogEditorToolbar 컴포넌트\n * 마크다운 포맷팅 툴바\n */\nconst BlogEditorToolbar = React.forwardRef<HTMLDivElement, BlogEditorToolbarProps>(\n ({ textareaRef, className }, ref) => {\n const { labels, activeLanguage, updateMultilingualField, formData, features } = useBlogEditor()\n\n const handleInsert = useCallback(\n (item: ToolbarItem) => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n const { selectionStart, selectionEnd } = textarea\n const currentContent = formData.content[activeLanguage] || ''\n\n const { text: newText, cursorPosition } = insertMarkdown(\n currentContent,\n selectionStart,\n selectionEnd,\n item.markdown.before,\n item.markdown.after\n )\n\n updateMultilingualField('content', activeLanguage, newText)\n\n // 커서 위치 복원\n requestAnimationFrame(() => {\n textarea.focus()\n textarea.setSelectionRange(cursorPosition, cursorPosition)\n })\n },\n [textareaRef, formData, activeLanguage, updateMultilingualField]\n )\n\n if (!features.enableMarkdownToolbar) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted',\n className\n )}\n role=\"toolbar\"\n aria-label=\"마크다운 서식\"\n >\n {TOOLBAR_ITEMS.map((item) => (\n <button\n key={item.icon}\n type=\"button\"\n onClick={() => handleInsert(item)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\n title={`${labels[item.label as keyof typeof labels] || item.label}${item.shortcut ? ` (${item.shortcut})` : ''}`}\n aria-label={labels[item.label as keyof typeof labels] || item.label}\n >\n <Icon name={item.icon as Parameters<typeof Icon>[0]['name']} size={16} />\n </button>\n ))}\n </div>\n )\n }\n)\n\nBlogEditorToolbar.displayName = 'BlogEditorToolbar'\n\nexport { BlogEditorToolbar }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { parseMarkdown } from './utils/markdown'\n\n/**\n * BlogEditorPreview Props\n */\nexport interface BlogEditorPreviewProps {\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorPreview 컴포넌트\n * 마크다운 미리보기\n */\nconst BlogEditorPreview = React.forwardRef<HTMLDivElement, BlogEditorPreviewProps>(\n ({ renderMarkdown, className }, ref) => {\n const { formData, activeLanguage, languages, labels } = useBlogEditor()\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\n const title = formData.title[activeLanguage] || formData.title[primaryLanguage] || labels.noTitle\n const content = formData.content[activeLanguage] || formData.content[primaryLanguage] || ''\n\n // 마크다운 렌더링\n const renderedContent = React.useMemo(() => {\n if (renderMarkdown) {\n return renderMarkdown(content)\n }\n // 기본 마크다운 파서 사용\n return (\n <div\n dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }}\n />\n )\n }, [content, renderMarkdown])\n\n return (\n <div ref={ref} className={merge('p-6', className)}>\n <h3 className=\"text-xl font-bold text-foreground mb-4\">\n {title}\n </h3>\n <div className=\"prose dark:prose-invert max-w-none\">\n {renderedContent}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorPreview.displayName = 'BlogEditorPreview'\n\nexport { BlogEditorPreview }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorActions Props\n */\nexport interface BlogEditorActionsProps {\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorActions 컴포넌트\n * 저장/발행/취소 버튼\n */\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\n ({ cancelLink, className }, ref) => {\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge('flex items-center justify-end gap-3', className)}\n >\n {/* 자동저장 상태 */}\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\n <span className=\"text-sm text-muted-foreground flex items-center gap-1\">\n {autoSaveStatus === 'saving' && (\n <>\n <Icon name=\"loader\" size={14} spin />\n 저장 중...\n </>\n )}\n {autoSaveStatus === 'saved' && (\n <>\n <Icon name=\"check\" size={14} />\n 자동저장됨\n </>\n )}\n </span>\n )}\n\n {/* 취소 */}\n {cancelLink || (\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-4 py-2 text-foreground hover:text-foreground transition-colors\"\n >\n {labels.cancel}\n </button>\n )}\n\n {/* 임시저장 */}\n <button\n type=\"button\"\n onClick={() => handleSave(false)}\n disabled={submitting}\n className=\"px-4 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {labels.saveDraft}\n </button>\n\n {/* 발행/수정 */}\n <button\n type=\"button\"\n onClick={() => handleSave(true)}\n disabled={submitting}\n className=\"px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2 transition-colors\"\n >\n {submitting ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.saving}\n </>\n ) : (\n <>\n <Icon name=\"check\" size={16} />\n {isEditMode ? labels.update : labels.publish}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorActions.displayName = 'BlogEditorActions'\n\nexport { BlogEditorActions }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorTranslate Props\n */\nexport interface BlogEditorTranslateProps {\n /** 힌트 메시지 오버라이드 / Hint message override */\n hint?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorTranslate 컴포넌트\n * AI 번역 버튼\n */\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\n ({ hint, className }, ref) => {\n const {\n labels,\n translating,\n translateSuccess,\n handleTranslate,\n formData,\n languages,\n features,\n } = useBlogEditor()\n\n if (!features.enableTranslation) {\n return null\n }\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n const primaryTitle = formData.title[primaryLanguage] || ''\n const primaryContent = formData.content[primaryLanguage] || ''\n const canTranslate = primaryTitle && primaryContent\n\n return (\n <div\n ref={ref}\n className={merge(\n 'px-6 py-3 bg-muted border-b border-border flex items-center justify-between',\n className\n )}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon name=\"sparkles\" size={16} />\n <span>{hint || labels.translateHint}</span>\n </div>\n <button\n type=\"button\"\n onClick={handleTranslate}\n disabled={translating || !canTranslate}\n className={merge(\n 'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',\n translateSuccess\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-primary text-white hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n {translating ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.translating}\n </>\n ) : translateSuccess ? (\n <>\n <Icon name=\"check\" size={16} />\n {labels.translateSuccess}\n </>\n ) : (\n <>\n <Icon name=\"sparkles\" size={16} />\n {labels.translateButton}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorTranslate.displayName = 'BlogEditorTranslate'\n\nexport { BlogEditorTranslate }\n","\"use client\"\n\nimport React, { useRef } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { BlogEditorProvider, useBlogEditor } from './BlogEditorContext'\nimport { BlogEditorHeader, type BlogEditorHeaderProps } from './BlogEditorHeader'\nimport { BlogEditorMetadata, type BlogEditorMetadataProps } from './BlogEditorMetadata'\nimport { BlogEditorLanguageTabs, type BlogEditorLanguageTabsProps } from './BlogEditorLanguageTabs'\nimport { BlogEditorContent, type BlogEditorContentProps } from './BlogEditorContent'\nimport { BlogEditorToolbar, type BlogEditorToolbarProps } from './BlogEditorToolbar'\nimport { BlogEditorPreview, type BlogEditorPreviewProps } from './BlogEditorPreview'\nimport { BlogEditorActions, type BlogEditorActionsProps } from './BlogEditorActions'\nimport { BlogEditorTranslate, type BlogEditorTranslateProps } from './BlogEditorTranslate'\nimport type { BlogEditorProps } from './types'\n\n/**\n * BlogEditorRoot Props (내부 컴포넌트)\n */\ninterface BlogEditorRootProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** AI 번역 힌트 / AI translation hint */\n translateHint?: string\n /** 최대 너비 / Max width */\n maxWidth?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 자식 요소 / Children */\n children?: React.ReactNode\n}\n\n/**\n * BlogEditorRoot 내부 컴포넌트\n * 기본 레이아웃 제공\n */\nfunction BlogEditorRoot({\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth = 'max-w-4xl',\n className,\n children,\n}: BlogEditorRootProps) {\n const { showPreview, error, variant, features } = useBlogEditor()\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const containerClasses = merge(\n variant === 'glass'\n ? 'bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800'\n : variant === 'minimal'\n ? ''\n : 'bg-muted'\n )\n\n const contentContainerClasses = merge(\n 'rounded-xl overflow-hidden',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/20 dark:border-slate-700/50'\n : variant === 'minimal'\n ? 'bg-transparent border border-border'\n : 'bg-background'\n )\n\n // 커스텀 자식 요소가 있으면 그걸 렌더링\n if (children) {\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {children}\n </div>\n </div>\n )\n }\n\n // 기본 레이아웃\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {/* 헤더 */}\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\n\n {/* 에러 메시지 */}\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* 메타데이터 */}\n <BlogEditorMetadata />\n\n {/* 콘텐츠 영역 */}\n <div className={contentContainerClasses}>\n {/* AI 번역 */}\n {features.enableTranslation && (\n <BlogEditorTranslate hint={translateHint} />\n )}\n\n {/* 언어 탭 */}\n <BlogEditorLanguageTabs />\n\n {/* 툴바 & 콘텐츠 */}\n {showPreview ? (\n <BlogEditorPreview renderMarkdown={renderMarkdown} />\n ) : (\n <>\n {features.enableMarkdownToolbar && (\n <BlogEditorToolbar textareaRef={textareaRef} />\n )}\n <BlogEditorContent textareaRef={textareaRef} />\n </>\n )}\n </div>\n\n {/* 액션 버튼 */}\n <BlogEditorActions cancelLink={cancelLink} />\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * BlogEditor 컴포넌트\n *\n * 다국어 블로그 에디터 컴포넌트\n * Compound component 패턴으로 유연한 커스터마이징 지원\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <BlogEditor\n * callbacks={{\n * onSave: async (data, publish) => { ... },\n * onCancel: () => router.back(),\n * }}\n * />\n *\n * // 커스텀 레이아웃\n * <BlogEditor callbacks={...}>\n * <BlogEditor.Header backLink={<Link href=\"/admin\">Back</Link>} />\n * <BlogEditor.Metadata />\n * <BlogEditor.LanguageTabs />\n * <BlogEditor.Content />\n * <BlogEditor.Actions />\n * </BlogEditor>\n * ```\n */\nconst BlogEditor = React.forwardRef<\n HTMLDivElement,\n BlogEditorProps & BlogEditorRootProps\n>(\n (\n {\n // BlogEditorProps\n initialData,\n isEditMode,\n languages,\n defaultLanguage,\n labels,\n callbacks,\n features,\n variant,\n\n // BlogEditorRootProps\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth,\n className,\n children,\n\n // Auto-save\n autoSaveKey,\n autoSaveInterval,\n },\n ref\n ) => {\n return (\n <BlogEditorProvider\n initialData={initialData}\n isEditMode={isEditMode}\n languages={languages}\n defaultLanguage={defaultLanguage}\n labels={labels}\n callbacks={callbacks}\n features={features}\n variant={variant}\n autoSaveKey={autoSaveKey}\n autoSaveInterval={autoSaveInterval}\n >\n <div ref={ref}>\n <BlogEditorRoot\n onBack={onBack}\n backLink={backLink}\n cancelLink={cancelLink}\n renderMarkdown={renderMarkdown}\n translateHint={translateHint}\n maxWidth={maxWidth}\n className={className}\n >\n {children}\n </BlogEditorRoot>\n </div>\n </BlogEditorProvider>\n )\n }\n)\n\nBlogEditor.displayName = 'BlogEditor'\n\n// Compound component exports\nconst BlogEditorCompound = BlogEditor as typeof BlogEditor & {\n Header: typeof BlogEditorHeader\n Metadata: typeof BlogEditorMetadata\n LanguageTabs: typeof BlogEditorLanguageTabs\n Content: typeof BlogEditorContent\n Toolbar: typeof BlogEditorToolbar\n Preview: typeof BlogEditorPreview\n Actions: typeof BlogEditorActions\n Translate: typeof BlogEditorTranslate\n}\n\nBlogEditorCompound.Header = BlogEditorHeader\nBlogEditorCompound.Metadata = BlogEditorMetadata\nBlogEditorCompound.LanguageTabs = BlogEditorLanguageTabs\nBlogEditorCompound.Content = BlogEditorContent\nBlogEditorCompound.Toolbar = BlogEditorToolbar\nBlogEditorCompound.Preview = BlogEditorPreview\nBlogEditorCompound.Actions = BlogEditorActions\nBlogEditorCompound.Translate = BlogEditorTranslate\n\nexport { BlogEditorCompound as BlogEditor }\n\n// 개별 컴포넌트도 export\nexport {\n BlogEditorHeader,\n BlogEditorMetadata,\n BlogEditorLanguageTabs,\n BlogEditorContent,\n BlogEditorToolbar,\n BlogEditorPreview,\n BlogEditorActions,\n BlogEditorTranslate,\n}\n\n// 타입 export\nexport type {\n BlogEditorHeaderProps,\n BlogEditorMetadataProps,\n BlogEditorLanguageTabsProps,\n BlogEditorContentProps,\n BlogEditorToolbarProps,\n BlogEditorPreviewProps,\n BlogEditorActionsProps,\n BlogEditorTranslateProps,\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts","../src/components/advanced/Parallax.tsx","../src/components/advanced/Marquee.tsx","../src/components/advanced/GlowCard.tsx","../src/components/advanced/SpotlightCard.tsx","../src/components/advanced/TextReveal.tsx","../src/components/advanced/AnimatedGradient.tsx","../src/components/advanced/TiltCard.tsx","../src/components/advanced/VideoBackground.tsx","../src/components/advanced/Carousel.tsx","../src/components/advanced/ImageReveal.tsx","../src/components/advanced/DotNav.tsx","../src/components/advanced/HorizontalScroll.tsx","../src/components/advanced/emotion/EmotionMeter.tsx","../src/components/advanced/emotion/EmotionButton.tsx","../src/components/advanced/emotion/EmotionSelector.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/advanced/emotion/EmotionAnalysis.tsx","../src/components/advanced/blog-editor/utils/slug.ts","../src/components/advanced/blog-editor/BlogEditorContext.tsx","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/advanced/blog-editor/BlogEditorHeader.tsx","../src/components/advanced/blog-editor/BlogEditorMetadata.tsx","../src/components/advanced/blog-editor/BlogEditorLanguageTabs.tsx","../src/components/advanced/blog-editor/BlogEditorContent.tsx","../src/components/advanced/blog-editor/utils/markdown.ts","../src/components/advanced/blog-editor/BlogEditorToolbar.tsx","../src/components/advanced/blog-editor/BlogEditorPreview.tsx","../src/components/advanced/blog-editor/BlogEditorActions.tsx","../src/components/advanced/blog-editor/BlogEditorTranslate.tsx","../src/components/advanced/blog-editor/BlogEditor.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","AdvancedPageTransition","React","children","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressClassName","ref","isVisible","setIsVisible","useState","progress","setProgress","_isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","useCallback","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","jsx","FadePageTransition","props","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","_a","config","prev","start","resolve","finalConfig","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","_enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","data","updateStats","newTransition","newHistory","total","average","sum","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","id","transition","pauseAll","resumeAll","_id","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus","activeTransitions","Parallax","speed","direction","offset","disabled","scale","opacity","rotate","rotateDirection","style","innerRef","transform","setTransform","prefersReducedMotion","useReducedMotion","updateTransform","element","rect","windowHeight","elementCenter","movement","x","y","scaleValue","opacityValue","rotateValue","handleScroll","combinedStyle","mergeRefs","setPrefersReducedMotion","mediaQuery","handleChange","e","refs","value","Marquee","pauseOnHover","pauseOnClick","gap","gradient","gradientColor","gradientWidth","containerRef","contentWidth","setContentWidth","contentHeight","setContentHeight","isPaused","setIsPaused","isHorizontal","isReverse","container","firstChild","updateSize","resizeObserver","animationStyle","gradientStyle","GlowCard","glowColor","glowSize","glowOpacity","border","borderColor","cardRef","mousePosition","setMousePosition","isHovered","setIsHovered","handleMouseMove","glowStyle","borderStyle","SpotlightCard","spotlightColor","spotlightSize","gradientFrom","gradientTo","spotlightStyle","gradientOverlayStyle","TextReveal","text","revealColor","hiddenColor","threshold","byWord","byChar","updateProgress","end","newProgress","renderText","chars","char","index","charProgress","isRevealed","words","word","wordProgress","defaultColors","AnimatedGradient","colors","blur","blurAmount","mounted","setMounted","shouldAnimate","renderGradient","Fragment","color","angle","TiltCard","maxTilt","perspective","glare","maxGlare","glarePosition","setGlarePosition","centerX","centerY","mouseX","mouseY","rotateY","rotateX","glareX","glareY","handleMouseEnter","handleMouseLeave","cardStyle","innerStyle","glareStyle","VideoBackground","src","poster","autoPlay","loop","muted","controls","objectFit","overlay","overlayColor","gradientDirection","playbackRate","fadeIn","videoRef","isLoaded","setIsLoaded","isPlaying","setIsPlaying","handleLoadedData","handlePlaying","getYouTubeUrl","videoId","params","getVimeoUrl","renderVideo","objectFitClass","renderGradientOverlay","gradients","hasPositionClass","Carousel","interval","indicators","indicatorPosition","showArrows","arrowPosition","transitionDuration","onSlideChange","showPlayPause","playPausePosition","getInitialIndex","currentIndex","setCurrentIndex","isManuallyPaused","setIsManuallyPaused","isTransitioning","noTransition","setNoTransition","touchStart","setTouchStart","touchEnd","setTouchEnd","slideCount","getActualIndex","goToSlide","newIndex","actualIndex","nextSlide","prevSlide","togglePlayPause","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleKeyDown","renderSlides","child","childArray","renderIndicators","isInside","isTop","indicatorContainerClass","handleIndicatorClick","_","isActive","renderPlayPause","PauseIcon","PlayIcon","renderArrows","canGoPrev","canGoNext","arrowBaseClass","prevPosition","nextPosition","ChevronLeft","ChevronRight","ImageReveal","alt","height","vh","p","clipPath","getClipPath","prefersReduced","setPrefersReduced","mq","handler","DotNav","items","position","activeColor","inactiveColor","activeIndex","setActiveIndex","updateActive","closest","closestDist","item","i","el","dist","handleClick","positionClass","useMemo","HorizontalScroll","heightMultiplier","snap","onProgress","outerRef","scrollWidth","setScrollWidth","measure","ro","outerHeight","scrolled","totalHeight","EmotionMeter","max","size","sizeClasses","emotionColors","percentage","EmotionButton","emotion","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","layout","showIntensity","intensity","onIntensityChange","emotions","variant","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","cardVariants","cva","Card","shadow","padding","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","badgeVariants","Badge","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","getIntensityLabel","getPositivityLabel","getEnergyLabel","keyword","generateSlug","title","isValidSlug","slug","normalizeSlug","input","DEFAULT_LABELS","DEFAULT_FEATURES","DEFAULT_LANGUAGES","createEmptyMultilingualField","languages","field","lang","createInitialData","initialData","_b","_c","_d","_e","_f","_g","_h","BlogEditorContext","createContext","useBlogEditor","context","useContext","BlogEditorProvider","isEditMode","defaultLanguage","userLabels","callbacks","userFeatures","autoSaveKey","autoSaveInterval","primaryLanguage","l","initialLanguage","labels","features","formData","setFormData","activeLanguage","setActiveLanguage","showPreview","setShowPreview","submitting","setSubmitting","translating","setTranslating","uploading","setUploading","error","setError","translateSuccess","setTranslateSuccess","slugManuallyEdited","setSlugManuallyEdited","autoSaveStatus","setAutoSaveStatus","autoSaveTimerRef","isInitialMount","storageKey","saved","parsed","clearAutoSave","updateField","updateMultilingualField","language","handleSave","publish","primaryTitle","primaryContent","handleTranslate","primaryExcerpt","translations","newTitle","newContent","newExcerpt","langKey","translation","trans","handleUploadImage","file","handleCancel","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Plus","Minus","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","Rocket","Layout","Megaphone","Stack","Prohibit","TextB","TextItalic","TextStrikethrough","TextHOne","Link","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","toCamelCase","str","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","IconContext","useIconContext","IconComponent","name","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","iconsaxVariant","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","BlogEditorHeader","onBack","backLink","BlogEditorMetadata","tagInput","setTagInput","fileInputRef","containerClasses","inputClasses","labelClasses","addTag","tag","trimmed","removeTag","tagToRemove","handleTagInputChange","parts","part","idx","handleTagKeyDown","url","BlogEditorLanguageTabs","isPrimary","BlogEditorContent","textareaRef","isPrimaryLanguage","currentLang","handleTitleChange","getLangLabel","baseLabel","escapeHtml","parseMarkdown","html","code","stripMarkdown","getMarkdownPreview","maxLength","stripped","insertMarkdown","selectionStart","selectionEnd","before","after","selectedText","beforeText","afterText","newText","cursorPosition","TOOLBAR_ITEMS","BlogEditorToolbar","handleInsert","textarea","currentContent","BlogEditorPreview","renderMarkdown","content","renderedContent","BlogEditorActions","cancelLink","BlogEditorTranslate","hint","canTranslate","BlogEditorRoot","translateHint","maxWidth","contentContainerClasses","BlogEditor","BlogEditorCompound"],"mappings":"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","file":"advanced-motion.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","'use client'\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { merge } from '../../lib/utils'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface AdvancedPageTransitionProps {\n children: React.ReactNode\n className?: string\n type?: TransitionType\n duration?: number\n easing?: TransitionEasing\n delay?: number\n autoStart?: boolean\n onStart?: () => void\n onComplete?: () => void\n showProgress?: boolean\n progressClassName?: string\n}\n\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\n children,\n className,\n type = 'fade',\n duration = 500,\n easing = 'smooth',\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressClassName\n}, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [progress, setProgress] = useState(0)\n const [_isTransitioning, setIsTransitioning] = useState(false)\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n const getEasingFunction = (easingType: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easingType]\n }\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const easingFunction = getEasingFunction(easing)\n\n let currentProgress = Math.min(elapsed / duration, 1)\n currentProgress = easingFunction(currentProgress)\n\n setProgress(currentProgress)\n setIsVisible(currentProgress > 0.1)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame((t) => animate(t))\n } else {\n setIsTransitioning(false)\n setProgress(1)\n onComplete?.()\n }\n }, [duration, easing, onComplete])\n\n const startTransition = useCallback(() => {\n setIsTransitioning(true)\n setProgress(0)\n onStart?.()\n\n startTimeRef.current = null\n animationRef.current = requestAnimationFrame(animate)\n }, [animate, onStart])\n\n useEffect(() => {\n if (autoStart) {\n const timer = setTimeout(() => {\n startTransition()\n }, delay)\n\n return () => clearTimeout(timer)\n }\n }, [autoStart, delay, startTransition])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n const getTransitionStyles = () => {\n switch (type) {\n case 'fade':\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n \n case 'slide':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'slide-up':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(${(1 - progress) * 100}%)`\n }\n \n case 'slide-down':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-left':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-right':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'scale':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.8 + progress * 0.2})`\n }\n \n case 'flip':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\n }\n \n case 'morph':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\n }\n \n case 'cube':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\n }\n \n case 'zoom':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.5 + progress * 0.5})`\n }\n \n default:\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n }\n }\n\n const transitionStyles = getTransitionStyles()\n\n return (\n <div className=\"relative\">\n {showProgress && (\n <div className={merge(\n 'fixed top-4 right-4 z-50 bg-background rounded-lg px-3 py-2 shadow-lg border',\n progressClassName\n )}>\n <div className=\"text-sm font-medium text-foreground\">\n Progress: {Math.round(progress * 100)}%\n </div>\n <div className=\"w-24 h-2 bg-muted rounded-full mt-2\">\n <div \n className=\"h-full bg-primary rounded-full transition-all duration-100\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n </div>\n )}\n \n <div\n ref={ref}\n className={merge(\n 'transition-all duration-500 ease-out',\n className\n )}\n style={{\n ...transitionStyles,\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: easing === 'smooth' \n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\n : easing === 'bounce'\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\n : easing === 'elastic'\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\n : easing\n }}\n >\n {children}\n </div>\n </div>\n )\n})\n\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\n))\n\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\n))\n\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\n))\n\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\n))\n\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\n))\n\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\n))\n\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\n))\n\n// displayName 설정\nFadePageTransition.displayName = 'FadePageTransition'\nSlidePageTransition.displayName = 'SlidePageTransition'\nScalePageTransition.displayName = 'ScalePageTransition'\nFlipPageTransition.displayName = 'FlipPageTransition'\nMorphPageTransition.displayName = 'MorphPageTransition'\nCubePageTransition.displayName = 'CubePageTransition'\nZoomPageTransition.displayName = 'ZoomPageTransition'\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface TransitionConfig {\n type: TransitionType\n duration: number\n easing: TransitionEasing\n delay?: number\n stagger?: number\n direction?: 'forward' | 'backward'\n onStart?: () => void\n onComplete?: () => void\n onReverse?: () => void\n}\n\nexport interface PageTransitionState {\n isTransitioning: boolean\n isVisible: boolean\n currentStep: number\n progress: number\n}\n\nexport interface PageTransitionControls {\n start: (config?: Partial<TransitionConfig>) => Promise<void>\n reverse: () => Promise<void>\n pause: () => void\n resume: () => void\n reset: () => void\n}\n\nexport const usePageTransition = (\n initialConfig: Partial<TransitionConfig> = {}\n): [PageTransitionState, PageTransitionControls] => {\n const [state, setState] = useState<PageTransitionState>({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const configRef = useRef<TransitionConfig>({\n type: 'fade',\n duration: 500,\n easing: 'smooth',\n delay: 0,\n stagger: 0,\n direction: 'forward',\n ...initialConfig\n })\n\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easing]\n }, [])\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const config = configRef.current\n const easing = getEasingFunction(config.easing)\n \n let progress = Math.min(elapsed / config.duration, 1)\n progress = easing(progress)\n\n setState(prev => ({\n ...prev,\n progress,\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\n currentStep: Math.floor(progress * 10)\n }))\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n progress: config.direction === 'forward' ? 1 : 0\n }))\n config.onComplete?.()\n }\n }, [getEasingFunction])\n\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\n return new Promise<void>((resolve) => {\n if (config) {\n configRef.current = { ...configRef.current, ...config }\n }\n\n const finalConfig = configRef.current\n finalConfig.onComplete = () => resolve()\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n progress: finalConfig.direction === 'forward' ? 0 : 1\n }))\n\n startTimeRef.current = null\n finalConfig.onStart?.()\n \n if (finalConfig.delay) {\n setTimeout(() => {\n animationRef.current = requestAnimationFrame(animate)\n }, finalConfig.delay)\n } else {\n animationRef.current = requestAnimationFrame(animate)\n }\n })\n }, [animate])\n\n const reverse = useCallback(async () => {\n return new Promise<void>((resolve) => {\n const config = configRef.current\n config.direction = 'backward'\n config.onComplete = () => resolve()\n \n start()\n })\n }, [start])\n\n const pause = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }, [])\n\n const resume = useCallback(() => {\n if (state.isTransitioning) {\n animationRef.current = requestAnimationFrame(animate)\n }\n }, [state.isTransitioning, animate])\n\n const reset = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n setState({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n }, [])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n return [state, { start, reverse, pause, resume, reset }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'fade', duration: 400, ...config })\n}\n\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'slide', duration: 600, ...config })\n}\n\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'scale', duration: 500, ...config })\n}\n\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'morph', duration: 800, ...config })\n}\n\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\n\nexport interface PageTransitionManagerConfig {\n defaultType?: TransitionType\n defaultDuration?: number\n defaultEasing?: TransitionEasing\n enableHistory?: boolean\n enableProgress?: boolean\n enableDebug?: boolean\n}\n\nexport interface PageTransitionEvent {\n id: string\n type: TransitionType\n duration: number\n easing: TransitionEasing\n timestamp: number\n status: 'pending' | 'active' | 'completed' | 'failed'\n}\n\nexport interface PageTransitionManagerState {\n isTransitioning: boolean\n currentTransition: PageTransitionEvent | null\n transitionHistory: PageTransitionEvent[]\n totalTransitions: number\n averageDuration: number\n}\n\nexport interface PageTransitionManagerControls {\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\n cancelTransition: (id: string) => void\n pauseAll: () => void\n resumeAll: () => void\n clearHistory: () => void\n getTransitionStats: () => {\n total: number\n average: number\n byType: Record<TransitionType, number>\n byStatus: Record<string, number>\n }\n}\n\nexport const usePageTransitionManager = (\n config: PageTransitionManagerConfig = {}\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\n const {\n defaultType = 'fade',\n defaultDuration = 500,\n defaultEasing = 'smooth',\n enableHistory = true,\n enableProgress: _enableProgress = true,\n enableDebug = false\n } = config\n\n const [state, setState] = useState<PageTransitionManagerState>({\n isTransitioning: false,\n currentTransition: null,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n })\n\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\n const transitionCounterRef = useRef(0)\n\n const logDebug = useCallback((message: string, data?: unknown) => {\n if (enableDebug) {\n // eslint-disable-next-line no-console\n console.log(`[PageTransitionManager] ${message}`, data)\n }\n }, [enableDebug])\n\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\n setState(prev => {\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\n const total = newHistory.length\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\n\n return {\n ...prev,\n totalTransitions: total,\n averageDuration: average,\n transitionHistory: newHistory\n }\n })\n }, [enableHistory])\n\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\n const transitionId = `transition_${++transitionCounterRef.current}`\n const fullConfig: TransitionConfig = {\n type: defaultType,\n duration: defaultDuration,\n easing: defaultEasing,\n ...config\n }\n\n const transitionEvent: PageTransitionEvent = {\n id: transitionId,\n type: fullConfig.type,\n duration: fullConfig.duration,\n easing: fullConfig.easing,\n timestamp: Date.now(),\n status: 'pending'\n }\n\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n currentTransition: transitionEvent\n }))\n\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\n const timer = setTimeout(() => {\n const completedEvent: PageTransitionEvent = {\n ...transitionEvent,\n status: 'completed'\n }\n\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n currentTransition: null\n }))\n\n updateStats(completedEvent)\n activeTransitionsRef.current.delete(transitionId)\n logDebug('Transition completed', { id: transitionId })\n\n fullConfig.onComplete?.()\n }, fullConfig.duration)\n\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\n\n // 진행 상태 업데이트\n setTimeout(() => {\n setState(prev => ({\n ...prev,\n currentTransition: {\n ...prev.currentTransition!,\n status: 'active'\n }\n }))\n }, 50)\n\n return transitionId\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\n\n const cancelTransition = useCallback((id: string) => {\n const transition = activeTransitionsRef.current.get(id)\n if (transition) {\n clearTimeout(transition.timer)\n activeTransitionsRef.current.delete(id)\n\n setState(prev => ({\n ...prev,\n isTransitioning: activeTransitionsRef.current.size > 0,\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\n }))\n\n logDebug('Transition cancelled', { id })\n }\n }, [logDebug])\n\n const pauseAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ timer }, id) => {\n clearTimeout(timer)\n logDebug('Transition paused', { id })\n })\n }, [logDebug])\n\n const resumeAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ config }, _id) => {\n startTransition(config)\n })\n }, [startTransition])\n\n const clearHistory = useCallback(() => {\n setState(prev => ({\n ...prev,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n }))\n logDebug('History cleared')\n }, [logDebug])\n\n const getTransitionStats = useCallback(() => {\n const { transitionHistory } = state\n const byType = transitionHistory.reduce((acc, t) => {\n acc[t.type] = (acc[t.type] || 0) + 1\n return acc\n }, {} as Record<TransitionType, number>)\n\n const byStatus = transitionHistory.reduce((acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1\n return acc\n }, {} as Record<string, number>)\n\n return {\n total: transitionHistory.length,\n average: state.averageDuration,\n byType,\n byStatus\n }\n }, [state])\n\n useEffect(() => {\n const activeTransitions = activeTransitionsRef.current\n return () => {\n // 컴포넌트 언마운트 시 모든 타이머 정리\n activeTransitions.forEach(({ timer }) => {\n clearTimeout(timer)\n })\n activeTransitions.clear()\n }\n }, [])\n\n return [state, {\n startTransition,\n cancelTransition,\n pauseAll,\n resumeAll,\n clearHistory,\n getTransitionStats\n }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\n}\n\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\n}\n\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\n}\n\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\n}\n\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Parallax 컴포넌트의 props / Parallax component props\n * @property {number} [speed=0.5] - 패럴렉스 속도 (0-1, 1이 가장 빠름) / Parallax speed (0-1, 1 is fastest)\n * @property {\"up\" | \"down\" | \"left\" | \"right\"} [direction=\"up\"] - 이동 방향 / Movement direction\n * @property {number} [offset=0] - 시작 오프셋 (px) / Starting offset in pixels\n * @property {boolean} [disabled=false] - 패럴렉스 비활성화 / Disable parallax\n * @property {boolean} [scale=false] - 스케일 효과 추가 / Add scale effect\n * @property {boolean} [opacity=false] - 투명도 효과 추가 / Add opacity effect\n * @property {boolean} [rotate=false] - 회전 효과 추가 / Add rotation effect\n */\nexport interface ParallaxProps extends React.HTMLAttributes<HTMLDivElement> {\n speed?: number;\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n offset?: number;\n disabled?: boolean;\n scale?: boolean;\n opacity?: boolean;\n rotate?: boolean;\n rotateDirection?: \"cw\" | \"ccw\";\n}\n\n/**\n * Parallax 컴포넌트 / Parallax component\n *\n * 스크롤에 반응하여 패럴렉스 효과를 제공하는 컴포넌트입니다.\n * 다양한 방향과 속도, 추가 효과(스케일, 투명도, 회전)를 지원합니다.\n *\n * Component that provides parallax effect in response to scrolling.\n * Supports various directions, speeds, and additional effects (scale, opacity, rotation).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Parallax speed={0.3}>\n * <img src=\"/background.jpg\" alt=\"background\" />\n * </Parallax>\n *\n * @example\n * // 다양한 효과 / With effects\n * <Parallax speed={0.5} scale opacity direction=\"up\">\n * <div className=\"h-screen bg-gradient-to-b from-indigo-500 to-purple-600\" />\n * </Parallax>\n */\nconst Parallax = React.forwardRef<HTMLDivElement, ParallaxProps>(\n (\n {\n children,\n className,\n speed = 0.5,\n direction = \"up\",\n offset = 0,\n disabled = false,\n scale = false,\n opacity = false,\n rotate = false,\n rotateDirection = \"cw\",\n style,\n ...props\n },\n ref\n ) => {\n const innerRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n x: 0,\n y: 0,\n scale: 1,\n opacity: 1,\n rotate: 0,\n });\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateTransform = useCallback(() => {\n if (disabled || prefersReducedMotion) return;\n\n const element = innerRef.current;\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n const windowWidth = window.innerWidth;\n\n // Calculate how far through the viewport the element is\n const elementCenter = rect.top + rect.height / 2;\n const viewportCenter = windowHeight / 2;\n const progress = (viewportCenter - elementCenter) / windowHeight;\n\n // Calculate movement based on direction\n const movement = progress * speed * 100 + offset;\n\n let x = 0;\n let y = 0;\n\n switch (direction) {\n case \"up\":\n y = -movement;\n break;\n case \"down\":\n y = movement;\n break;\n case \"left\":\n x = -movement;\n break;\n case \"right\":\n x = movement;\n break;\n }\n\n // Calculate additional effects\n const scaleValue = scale ? 1 + Math.abs(progress) * 0.1 : 1;\n const opacityValue = opacity ? Math.max(0.3, 1 - Math.abs(progress) * 0.5) : 1;\n const rotateValue = rotate\n ? progress * 10 * (rotateDirection === \"cw\" ? 1 : -1)\n : 0;\n\n setTransform({ x, y, scale: scaleValue, opacity: opacityValue, rotate: rotateValue });\n }, [disabled, prefersReducedMotion, speed, direction, offset, scale, opacity, rotate, rotateDirection]);\n\n useEffect(() => {\n if (disabled || prefersReducedMotion) return;\n\n // Initial calculation\n updateTransform();\n\n // Listen to scroll events\n const handleScroll = () => {\n requestAnimationFrame(updateTransform);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateTransform, disabled, prefersReducedMotion]);\n\n const combinedStyle: React.CSSProperties = {\n ...style,\n transform: disabled || prefersReducedMotion\n ? undefined\n : `translate3d(${transform.x}px, ${transform.y}px, 0) scale(${transform.scale}) rotate(${transform.rotate}deg)`,\n opacity: disabled || prefersReducedMotion ? 1 : transform.opacity,\n willChange: disabled || prefersReducedMotion ? undefined : \"transform, opacity\",\n };\n\n return (\n <div\n ref={mergeRefs(ref, innerRef)}\n className={merge(\"transition-none\", className)}\n style={combinedStyle}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nParallax.displayName = \"Parallax\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { Parallax };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Marquee 컴포넌트의 props / Marquee component props\n * @property {\"left\" | \"right\" | \"up\" | \"down\"} [direction=\"left\"] - 이동 방향 / Movement direction\n * @property {number} [speed=50] - 속도 (px/s) / Speed in pixels per second\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {boolean} [pauseOnClick=false] - 클릭시 일시정지 / Pause on click\n * @property {number} [gap=16] - 아이템 간격 (px) / Gap between items in pixels\n * @property {boolean} [gradient=true] - 양쪽 페이드 그라디언트 / Fade gradient on edges\n * @property {string} [gradientColor=\"hsl(var(--background))\"] - 그라디언트 색상 / Gradient color\n * @property {number} [gradientWidth=100] - 그라디언트 너비 (px) / Gradient width in pixels\n */\nexport interface MarqueeProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n speed?: number;\n pauseOnHover?: boolean;\n pauseOnClick?: boolean;\n gap?: number;\n gradient?: boolean;\n gradientColor?: string;\n gradientWidth?: number;\n}\n\n/**\n * Marquee 컴포넌트 / Marquee component\n *\n * 무한 스크롤 애니메이션을 제공하는 컴포넌트입니다.\n * 로고, 텍스트, 이미지 등을 자동으로 흐르게 표시합니다.\n *\n * Component that provides infinite scroll animation.\n * Displays logos, text, images, etc. with automatic scrolling.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Marquee>\n * <span>Item 1</span>\n * <span>Item 2</span>\n * <span>Item 3</span>\n * </Marquee>\n *\n * @example\n * // 로고 캐러셀 / Logo carousel\n * <Marquee speed={30} pauseOnHover gradient>\n * {logos.map(logo => <img key={logo.id} src={logo.src} />)}\n * </Marquee>\n */\nconst Marquee = React.forwardRef<HTMLDivElement, MarqueeProps>(\n (\n {\n children,\n className,\n direction = \"left\",\n speed = 50,\n pauseOnHover = true,\n pauseOnClick = false,\n gap = 16,\n gradient = true,\n gradientColor = \"hsl(var(--background))\",\n gradientWidth = 100,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [contentWidth, setContentWidth] = useState(0);\n const [contentHeight, setContentHeight] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n\n const isHorizontal = direction === \"left\" || direction === \"right\";\n const isReverse = direction === \"right\" || direction === \"down\";\n\n // Measure content size\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const firstChild = container.firstElementChild as HTMLElement;\n if (!firstChild) return;\n\n const updateSize = () => {\n if (isHorizontal) {\n setContentWidth(firstChild.offsetWidth);\n } else {\n setContentHeight(firstChild.offsetHeight);\n }\n };\n\n updateSize();\n\n const resizeObserver = new ResizeObserver(updateSize);\n resizeObserver.observe(firstChild);\n\n return () => resizeObserver.disconnect();\n }, [isHorizontal, children]);\n\n // Calculate animation duration\n const duration = isHorizontal\n ? contentWidth / speed\n : contentHeight / speed;\n\n const animationStyle: React.CSSProperties = {\n [\"--marquee-duration\" as string]: `${duration}s`,\n [\"--marquee-gap\" as string]: `${gap}px`,\n };\n\n // Gradient styles\n const gradientStyle = gradient\n ? {\n [\"--gradient-color\" as string]: gradientColor,\n [\"--gradient-width\" as string]: `${gradientWidth}px`,\n }\n : {};\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n gradient && \"marquee-gradient\",\n className\n )}\n style={{ ...style, ...gradientStyle }}\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onClick={() => pauseOnClick && setIsPaused(!isPaused)}\n {...props}\n >\n <div\n ref={containerRef}\n className={merge(\n \"flex\",\n isHorizontal ? \"flex-row\" : \"flex-col\",\n isPaused ? \"animate-pause\" : \"\",\n isHorizontal\n ? isReverse\n ? \"animate-marquee-right\"\n : \"animate-marquee-left\"\n : isReverse\n ? \"animate-marquee-down\"\n : \"animate-marquee-up\"\n )}\n style={animationStyle}\n >\n {/* Original content */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap }}\n >\n {children}\n </div>\n {/* Duplicated content for seamless loop */}\n <div\n className={merge(\n \"flex shrink-0\",\n isHorizontal ? \"flex-row\" : \"flex-col\"\n )}\n style={{ gap, [isHorizontal ? \"marginLeft\" : \"marginTop\"]: gap }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n </div>\n\n {/* CSS for animations - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes marquee-left {\n from { transform: translateX(0); }\n to { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-right {\n from { transform: translateX(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateX(0); }\n }\n @keyframes marquee-up {\n from { transform: translateY(0); }\n to { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n }\n @keyframes marquee-down {\n from { transform: translateY(calc(-50% - var(--marquee-gap) / 2)); }\n to { transform: translateY(0); }\n }\n .animate-marquee-left { animation: marquee-left var(--marquee-duration) linear infinite; }\n .animate-marquee-right { animation: marquee-right var(--marquee-duration) linear infinite; }\n .animate-marquee-up { animation: marquee-up var(--marquee-duration) linear infinite; }\n .animate-marquee-down { animation: marquee-down var(--marquee-duration) linear infinite; }\n .animate-pause { animation-play-state: paused !important; }\n .marquee-gradient::before, .marquee-gradient::after {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--gradient-width);\n z-index: 10;\n pointer-events: none;\n }\n .marquee-gradient::before {\n left: 0;\n background: linear-gradient(to right, var(--gradient-color), transparent);\n }\n .marquee-gradient::after {\n right: 0;\n background: linear-gradient(to left, var(--gradient-color), transparent);\n }\n `}} />\n </div>\n );\n }\n);\n\nMarquee.displayName = \"Marquee\";\n\nexport { Marquee };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * GlowCard 컴포넌트의 props / GlowCard component props\n * @property {string} [glowColor=\"rgba(120, 119, 198, 0.3)\"] - 글로우 색상 / Glow color\n * @property {number} [glowSize=400] - 글로우 크기 (px) / Glow size in pixels\n * @property {number} [glowOpacity=0.6] - 글로우 투명도 / Glow opacity\n * @property {boolean} [border=true] - 글로우 보더 표시 / Show glow border\n * @property {string} [borderColor] - 보더 색상 (기본: glowColor) / Border color (default: glowColor)\n */\nexport interface GlowCardProps extends React.HTMLAttributes<HTMLDivElement> {\n glowColor?: string;\n glowSize?: number;\n glowOpacity?: number;\n border?: boolean;\n borderColor?: string;\n}\n\n/**\n * GlowCard 컴포넌트 / GlowCard component\n *\n * 마우스를 따라다니는 글로우 효과가 있는 카드 컴포넌트입니다.\n * SaaS 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Card component with mouse-following glow effect.\n * Perfect for SaaS landing pages and premium UI.\n *\n * @component\n * @example\n * <GlowCard glowColor=\"rgba(59, 130, 246, 0.4)\">\n * <h3>Premium Feature</h3>\n * <p>This is a premium feature card</p>\n * </GlowCard>\n */\nconst GlowCard = React.forwardRef<HTMLDivElement, GlowCardProps>(\n (\n {\n children,\n className,\n glowColor = \"rgba(120, 119, 198, 0.3)\",\n glowSize = 400,\n glowOpacity = 0.6,\n border = true,\n borderColor,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const glowStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? glowOpacity : 0,\n background: `radial-gradient(${glowSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n };\n\n const borderStyle: React.CSSProperties = border\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${glowSize / 2}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${borderColor || glowColor}, transparent 40%)`,\n transition: \"opacity 0.3s ease\",\n pointerEvents: \"none\",\n mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n maskComposite: \"exclude\",\n WebkitMaskComposite: \"xor\",\n padding: \"1px\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl bg-card border border-border p-6\",\n \"transition-all duration-300\",\n isHovered && \"border-transparent\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Glow effect */}\n <div style={glowStyle} aria-hidden=\"true\" />\n\n {/* Border glow */}\n {border && <div style={borderStyle as React.CSSProperties} aria-hidden=\"true\" />}\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nGlowCard.displayName = \"GlowCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { GlowCard };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * SpotlightCard 컴포넌트의 props / SpotlightCard component props\n * @property {string} [spotlightColor=\"rgba(255, 255, 255, 0.1)\"] - 스포트라이트 색상 / Spotlight color\n * @property {number} [spotlightSize=300] - 스포트라이트 크기 (px) / Spotlight size in pixels\n * @property {boolean} [gradient=true] - 그라디언트 배경 효과 / Gradient background effect\n * @property {string} [gradientFrom=\"rgba(255, 255, 255, 0.05)\"] - 그라디언트 시작 색상 / Gradient start color\n * @property {string} [gradientTo=\"transparent\"] - 그라디언트 끝 색상 / Gradient end color\n */\nexport interface SpotlightCardProps extends React.HTMLAttributes<HTMLDivElement> {\n spotlightColor?: string;\n spotlightSize?: number;\n gradient?: boolean;\n gradientFrom?: string;\n gradientTo?: string;\n}\n\n/**\n * SpotlightCard 컴포넌트 / SpotlightCard component\n *\n * 마우스 위치에 스포트라이트 효과를 표시하는 프리미엄 카드 컴포넌트입니다.\n * 다크 테마 랜딩 페이지, 프리미엄 UI에 적합합니다.\n *\n * Premium card component that displays a spotlight effect at mouse position.\n * Perfect for dark theme landing pages and premium UI.\n *\n * @component\n * @example\n * <SpotlightCard className=\"bg-gray-900 text-white p-8\">\n * <h3>Premium Feature</h3>\n * <p>Discover our exclusive features</p>\n * </SpotlightCard>\n */\nconst SpotlightCard = React.forwardRef<HTMLDivElement, SpotlightCardProps>(\n (\n {\n children,\n className,\n spotlightColor = \"rgba(255, 255, 255, 0.1)\",\n spotlightSize = 300,\n gradient = true,\n gradientFrom = \"rgba(255, 255, 255, 0.05)\",\n gradientTo = \"transparent\",\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n const rect = cardRef.current.getBoundingClientRect();\n setMousePosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n []\n );\n\n const spotlightStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n opacity: isHovered ? 1 : 0,\n background: `radial-gradient(${spotlightSize}px circle at ${mousePosition.x}px ${mousePosition.y}px, ${spotlightColor}, transparent 60%)`,\n transition: \"opacity 0.4s ease\",\n pointerEvents: \"none\",\n };\n\n const gradientOverlayStyle: React.CSSProperties = gradient\n ? {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(135deg, ${gradientFrom} 0%, ${gradientTo} 100%)`,\n pointerEvents: \"none\",\n }\n : {};\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\n \"relative overflow-hidden rounded-xl\",\n \"bg-gray-900 border border-gray-800\",\n \"transition-all duration-300\",\n isHovered && \"border-gray-700 shadow-2xl shadow-black/20\",\n className\n )}\n style={style}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Gradient overlay */}\n {gradient && <div style={gradientOverlayStyle} aria-hidden=\"true\" />}\n\n {/* Spotlight effect */}\n <div style={spotlightStyle} aria-hidden=\"true\" />\n\n {/* Content */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n }\n);\n\nSpotlightCard.displayName = \"SpotlightCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { SpotlightCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TextReveal 컴포넌트의 props / TextReveal component props\n * @property {string} text - 표시할 텍스트 / Text to display\n * @property {string} [revealColor=\"currentColor\"] - 공개된 텍스트 색상 / Revealed text color\n * @property {string} [hiddenColor=\"rgba(128, 128, 128, 0.3)\"] - 숨겨진 텍스트 색상 / Hidden text color\n * @property {number} [threshold=0.5] - 공개 시작 임계값 (0-1) / Reveal threshold (0-1)\n * @property {boolean} [byWord=false] - 단어별 공개 / Reveal by word\n * @property {boolean} [byChar=false] - 글자별 공개 / Reveal by character\n */\nexport interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n text: string;\n revealColor?: string;\n hiddenColor?: string;\n threshold?: number;\n byWord?: boolean;\n byChar?: boolean;\n}\n\n/**\n * TextReveal 컴포넌트 / TextReveal component\n *\n * 스크롤에 따라 텍스트가 점진적으로 공개되는 효과를 제공합니다.\n * 히어로 섹션, 스토리텔링 페이지에 적합합니다.\n *\n * Provides a text reveal effect based on scroll position.\n * Perfect for hero sections and storytelling pages.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TextReveal text=\"Welcome to the future of design\" />\n *\n * @example\n * // 단어별 공개 / Word by word reveal\n * <TextReveal\n * text=\"Build amazing products with our platform\"\n * byWord\n * revealColor=\"#3b82f6\"\n * />\n */\nconst TextReveal = React.forwardRef<HTMLDivElement, TextRevealProps>(\n (\n {\n text,\n className,\n revealColor = \"currentColor\",\n hiddenColor = \"rgba(128, 128, 128, 0.3)\",\n threshold = 0.5,\n byWord = false,\n byChar = false,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const windowHeight = window.innerHeight;\n\n // Calculate progress based on element position\n const start = windowHeight * (1 - threshold);\n const end = windowHeight * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let newProgress = 0;\n if (elementCenter <= start && elementCenter >= end) {\n newProgress = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n newProgress = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, newProgress)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n\n const handleScroll = () => {\n requestAnimationFrame(updateProgress);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n // Split text based on mode\n const renderText = () => {\n if (byChar) {\n const chars = text.split(\"\");\n return chars.map((char, index) => {\n const charProgress = progress * chars.length;\n const isRevealed = index < charProgress;\n return (\n <span\n key={index}\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.1s ease-out\",\n }}\n >\n {char}\n </span>\n );\n });\n }\n\n if (byWord) {\n const words = text.split(\" \");\n return words.map((word, index) => {\n const wordProgress = progress * words.length;\n const isRevealed = index < wordProgress;\n return (\n <span key={index}>\n <span\n style={{\n color: isRevealed ? revealColor : hiddenColor,\n transition: \"color 0.15s ease-out\",\n }}\n >\n {word}\n </span>\n {index < words.length - 1 && \" \"}\n </span>\n );\n });\n }\n\n // Default: gradient mask reveal\n return (\n <span\n style={{\n background: `linear-gradient(90deg, ${revealColor} ${progress * 100}%, ${hiddenColor} ${progress * 100}%)`,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n transition: \"background 0.1s ease-out\",\n }}\n >\n {text}\n </span>\n );\n };\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"font-medium\", className)}\n style={style}\n {...props}\n >\n {renderText()}\n </div>\n );\n }\n);\n\nTextReveal.displayName = \"TextReveal\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TextReveal };\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * AnimatedGradient 컴포넌트의 props / AnimatedGradient component props\n * @property {string[]} [colors] - 그라디언트 색상 배열 / Array of gradient colors\n * @property {number} [speed=3] - 애니메이션 속도 (초) / Animation speed in seconds\n * @property {boolean} [blur=true] - 블러 효과 / Blur effect\n * @property {number} [blurAmount=100] - 블러 양 (px) / Blur amount in pixels\n * @property {\"linear\" | \"radial\" | \"conic\" | \"mesh\"} [type=\"mesh\"] - 그라디언트 타입 / Gradient type\n * @property {boolean} [animate=true] - 애니메이션 활성화 / Enable animation\n */\nexport interface AnimatedGradientProps extends React.HTMLAttributes<HTMLDivElement> {\n colors?: string[];\n speed?: number;\n blur?: boolean;\n blurAmount?: number;\n type?: \"linear\" | \"radial\" | \"conic\" | \"mesh\";\n animate?: boolean;\n}\n\nconst defaultColors = [\n \"#ff0080\",\n \"#7928ca\",\n \"#0070f3\",\n \"#00dfd8\",\n];\n\n/**\n * AnimatedGradient 컴포넌트 / AnimatedGradient component\n *\n * 아름다운 애니메이션 그라디언트 배경을 제공합니다.\n * 히어로 섹션, 배경, 오버레이에 적합합니다.\n *\n * Provides beautiful animated gradient backgrounds.\n * Perfect for hero sections, backgrounds, and overlays.\n *\n * @component\n * @example\n * // 메쉬 그라디언트 / Mesh gradient\n * <AnimatedGradient type=\"mesh\" className=\"absolute inset-0 -z-10\" />\n *\n * @example\n * // 커스텀 색상 / Custom colors\n * <AnimatedGradient\n * colors={[\"#667eea\", \"#764ba2\", \"#f093fb\"]}\n * speed={5}\n * type=\"conic\"\n * />\n */\nconst AnimatedGradient = React.forwardRef<HTMLDivElement, AnimatedGradientProps>(\n (\n {\n children,\n className,\n colors = defaultColors,\n speed = 3,\n blur = true,\n blurAmount = 100,\n type = \"mesh\",\n animate = true,\n style,\n ...props\n },\n ref\n ) => {\n const [mounted, setMounted] = useState(false);\n const prefersReducedMotion = useReducedMotion();\n const shouldAnimate = animate && !prefersReducedMotion;\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const renderGradient = () => {\n switch (type) {\n case \"linear\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `linear-gradient(\n ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"135deg\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-rotate ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"radial\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `radial-gradient(\n circle at ${shouldAnimate ? \"var(--gradient-x, 50%) var(--gradient-y, 50%)\" : \"50% 50%\"},\n ${colors.join(\", \")}\n )`,\n animation: shouldAnimate ? `gradient-move ${speed}s ease-in-out infinite` : undefined,\n }}\n />\n );\n\n case \"conic\":\n return (\n <div\n className=\"absolute inset-0\"\n style={{\n background: `conic-gradient(\n from ${shouldAnimate ? \"var(--gradient-angle, 0deg)\" : \"0deg\"} at 50% 50%,\n ${colors.join(\", \")},\n ${colors[0]}\n )`,\n animation: shouldAnimate ? `gradient-spin ${speed}s linear infinite` : undefined,\n }}\n />\n );\n\n case \"mesh\":\n default:\n // Render blobs only after mount to prevent SSR hydration mismatch\n // (Math.sin/cos produce floating-point values that differ between server and client)\n if (!mounted) return null;\n return (\n <>\n {colors.map((color, index) => {\n const angle = (360 / colors.length) * index;\n const delay = (speed / colors.length) * index;\n return (\n <div\n key={index}\n className=\"absolute rounded-full mix-blend-screen\"\n style={{\n width: \"60%\",\n height: \"60%\",\n background: `radial-gradient(circle at center, ${color} 0%, transparent 70%)`,\n top: `${30 + Math.sin((angle * Math.PI) / 180) * 20}%`,\n left: `${30 + Math.cos((angle * Math.PI) / 180) * 20}%`,\n animation: shouldAnimate\n ? `gradient-blob ${speed}s ease-in-out infinite`\n : undefined,\n animationDelay: shouldAnimate ? `${-delay}s` : undefined,\n }}\n />\n );\n })}\n </>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Gradient layer */}\n <div\n className=\"absolute inset-0\"\n style={{\n filter: blur ? `blur(${blurAmount}px)` : undefined,\n }}\n >\n {renderGradient()}\n </div>\n\n {/* Content */}\n {children && <div className=\"relative z-10\">{children}</div>}\n\n {/* Animation keyframes - injected as style element */}\n <style dangerouslySetInnerHTML={{ __html: `\n @keyframes gradient-rotate {\n 0% { --gradient-angle: 0deg; }\n 100% { --gradient-angle: 360deg; }\n }\n @keyframes gradient-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes gradient-move {\n 0%, 100% { --gradient-x: 0%; --gradient-y: 0%; }\n 25% { --gradient-x: 100%; --gradient-y: 0%; }\n 50% { --gradient-x: 100%; --gradient-y: 100%; }\n 75% { --gradient-x: 0%; --gradient-y: 100%; }\n }\n @keyframes gradient-blob {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(20%, -20%) scale(1.1); }\n 50% { transform: translate(0, 20%) scale(0.9); }\n 75% { transform: translate(-20%, -10%) scale(1.05); }\n }\n `}} />\n </div>\n );\n }\n);\n\nAnimatedGradient.displayName = \"AnimatedGradient\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport { AnimatedGradient };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * TiltCard 컴포넌트의 props / TiltCard component props\n * @property {number} [maxTilt=15] - 최대 기울기 각도 / Maximum tilt angle in degrees\n * @property {number} [perspective=1000] - 원근감 / Perspective value\n * @property {number} [scale=1.02] - 호버시 스케일 / Scale on hover\n * @property {number} [speed=400] - 전환 속도 (ms) / Transition speed in milliseconds\n * @property {boolean} [glare=true] - 글레어 효과 / Glare effect\n * @property {number} [maxGlare=0.3] - 최대 글레어 투명도 / Maximum glare opacity\n * @property {boolean} [reset=true] - 마우스 떠나면 리셋 / Reset on mouse leave\n */\nexport interface TiltCardProps extends React.HTMLAttributes<HTMLDivElement> {\n maxTilt?: number;\n perspective?: number;\n scale?: number;\n speed?: number;\n glare?: boolean;\n maxGlare?: number;\n reset?: boolean;\n}\n\n/**\n * TiltCard 컴포넌트 / TiltCard component\n *\n * 마우스 움직임에 따라 3D 틸트 효과를 제공하는 카드 컴포넌트입니다.\n * 제품 카드, 프로필 카드, 갤러리에 적합합니다.\n *\n * Card component that provides 3D tilt effect based on mouse movement.\n * Perfect for product cards, profile cards, and galleries.\n *\n * @component\n * @example\n * <TiltCard className=\"bg-white shadow-lg rounded-xl p-6\">\n * <img src=\"/product.jpg\" alt=\"Product\" />\n * <h3>Premium Product</h3>\n * </TiltCard>\n */\nconst TiltCard = React.forwardRef<HTMLDivElement, TiltCardProps>(\n (\n {\n children,\n className,\n maxTilt = 15,\n perspective = 1000,\n scale = 1.02,\n speed = 400,\n glare = true,\n maxGlare = 0.3,\n reset = true,\n style,\n ...props\n },\n ref\n ) => {\n const cardRef = useRef<HTMLDivElement>(null);\n const [transform, setTransform] = useState({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n const [glarePosition, setGlarePosition] = useState({ x: 50, y: 50 });\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!cardRef.current) return;\n\n const rect = cardRef.current.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n // Calculate rotation based on mouse position\n const mouseX = e.clientX - centerX;\n const mouseY = e.clientY - centerY;\n\n const rotateY = (mouseX / (rect.width / 2)) * maxTilt;\n const rotateX = -(mouseY / (rect.height / 2)) * maxTilt;\n\n setTransform({\n rotateX,\n rotateY,\n scale,\n });\n\n // Calculate glare position (0-100%)\n const glareX = ((e.clientX - rect.left) / rect.width) * 100;\n const glareY = ((e.clientY - rect.top) / rect.height) * 100;\n setGlarePosition({ x: glareX, y: glareY });\n },\n [maxTilt, scale]\n );\n\n const handleMouseEnter = () => {\n setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n setIsHovered(false);\n if (reset) {\n setTransform({\n rotateX: 0,\n rotateY: 0,\n scale: 1,\n });\n }\n };\n\n const cardStyle: React.CSSProperties = {\n ...style,\n perspective: `${perspective}px`,\n };\n\n const innerStyle: React.CSSProperties = {\n transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg) scale(${transform.scale})`,\n transition: isHovered ? \"none\" : `transform ${speed}ms ease-out`,\n transformStyle: \"preserve-3d\",\n };\n\n const glareStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: \"inherit\",\n background: `linear-gradient(\n ${Math.atan2(glarePosition.y - 50, glarePosition.x - 50) * (180 / Math.PI) + 90}deg,\n rgba(255, 255, 255, ${isHovered ? maxGlare : 0}) 0%,\n transparent 80%\n )`,\n transition: isHovered ? \"opacity 0.1s ease-out\" : `opacity ${speed}ms ease-out`,\n pointerEvents: \"none\",\n opacity: isHovered ? 1 : 0,\n };\n\n return (\n <div\n ref={mergeRefs(ref, cardRef)}\n className={merge(\"relative\", className)}\n style={cardStyle}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <div style={innerStyle} className=\"relative\">\n {children}\n\n {/* Glare effect */}\n {glare && <div style={glareStyle} aria-hidden=\"true\" />}\n </div>\n </div>\n );\n }\n);\n\nTiltCard.displayName = \"TiltCard\";\n\n// Utility to merge refs\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n\nexport { TiltCard };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * VideoBackground 컴포넌트의 props / VideoBackground component props\n * @property {string} src - 비디오 소스 (URL, YouTube ID, Vimeo ID) / Video source\n * @property {\"native\" | \"youtube\" | \"vimeo\"} [type=\"native\"] - 비디오 타입 / Video type\n * @property {string} [poster] - 포스터 이미지 URL / Poster image URL\n * @property {boolean} [autoPlay=true] - 자동 재생 / Auto play\n * @property {boolean} [loop=true] - 반복 재생 / Loop playback\n * @property {boolean} [muted=true] - 음소거 / Mute audio\n * @property {boolean} [controls=false] - 컨트롤 표시 / Show controls\n * @property {\"cover\" | \"contain\" | \"fill\"} [objectFit=\"cover\"] - 비디오 맞춤 / Video fit\n * @property {boolean} [overlay=true] - 오버레이 표시 / Show overlay\n * @property {string} [overlayColor=\"rgba(0, 0, 0, 0.4)\"] - 오버레이 색상 / Overlay color\n * @property {boolean} [gradient=false] - 그라디언트 오버레이 / Gradient overlay\n * @property {\"top\" | \"bottom\" | \"both\"} [gradientDirection=\"bottom\"] - 그라디언트 방향 / Gradient direction\n * @property {number} [playbackRate=1] - 재생 속도 / Playback rate\n * @property {boolean} [fadeIn=true] - 페이드 인 효과 / Fade in effect\n */\nexport interface VideoBackgroundProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n src: string;\n type?: \"native\" | \"youtube\" | \"vimeo\";\n poster?: string;\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n objectFit?: \"cover\" | \"contain\" | \"fill\";\n overlay?: boolean;\n overlayColor?: string;\n gradient?: boolean;\n gradientDirection?: \"top\" | \"bottom\" | \"both\";\n playbackRate?: number;\n fadeIn?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * VideoBackground 컴포넌트 / VideoBackground component\n *\n * 페이지 배경으로 사용할 수 있는 비디오 컴포넌트입니다.\n * YouTube, Vimeo, 일반 비디오 소스를 지원합니다.\n *\n * Video component that can be used as page background.\n * Supports YouTube, Vimeo, and native video sources.\n *\n * @component\n * @example\n * // Native video\n * <VideoBackground src=\"/hero-video.mp4\" overlay gradient>\n * <h1>Welcome</h1>\n * </VideoBackground>\n *\n * @example\n * // YouTube video\n * <VideoBackground\n * type=\"youtube\"\n * src=\"dQw4w9WgXcQ\"\n * overlay\n * overlayColor=\"rgba(0, 0, 50, 0.5)\"\n * />\n *\n * @example\n * // Vimeo video\n * <VideoBackground type=\"vimeo\" src=\"123456789\" />\n */\nconst VideoBackground = React.forwardRef<HTMLDivElement, VideoBackgroundProps>(\n (\n {\n src,\n type = \"native\",\n poster,\n autoPlay = true,\n loop = true,\n muted = true,\n controls = false,\n objectFit = \"cover\",\n overlay = true,\n overlayColor = \"rgba(0, 0, 0, 0.4)\",\n gradient = false,\n gradientDirection = \"bottom\",\n playbackRate = 1,\n fadeIn = true,\n children,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n\n // Handle native video playback rate\n useEffect(() => {\n if (type === \"native\" && videoRef.current) {\n videoRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate, type]);\n\n // Handle video loaded\n const handleLoadedData = () => {\n setIsLoaded(true);\n };\n\n const handlePlaying = () => {\n setIsPlaying(true);\n };\n\n // Generate YouTube embed URL\n const getYouTubeUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n mute: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n playlist: videoId, // Required for loop to work\n modestbranding: \"1\",\n rel: \"0\",\n showinfo: \"0\",\n iv_load_policy: \"3\",\n disablekb: \"1\",\n enablejsapi: \"1\",\n playsinline: \"1\",\n });\n return `https://www.youtube.com/embed/${videoId}?${params.toString()}`;\n };\n\n // Generate Vimeo embed URL\n const getVimeoUrl = (videoId: string) => {\n const params = new URLSearchParams({\n autoplay: autoPlay ? \"1\" : \"0\",\n muted: muted ? \"1\" : \"0\",\n loop: loop ? \"1\" : \"0\",\n controls: controls ? \"1\" : \"0\",\n background: \"1\",\n quality: \"auto\",\n dnt: \"1\",\n });\n return `https://player.vimeo.com/video/${videoId}?${params.toString()}`;\n };\n\n // Render video element based on type\n const renderVideo = () => {\n const objectFitClass = {\n cover: \"object-cover\",\n contain: \"object-contain\",\n fill: \"object-fill\",\n }[objectFit];\n\n switch (type) {\n case \"youtube\":\n return (\n <iframe\n src={getYouTubeUrl(src)}\n className={merge(\n \"absolute inset-0 w-full h-full pointer-events-none\",\n \"scale-[1.2]\" // Scale up to hide YouTube branding\n )}\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"YouTube video background\"\n />\n );\n\n case \"vimeo\":\n return (\n <iframe\n src={getVimeoUrl(src)}\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n style={{\n opacity: isLoaded || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n onLoad={() => setIsLoaded(true)}\n title=\"Vimeo video background\"\n />\n );\n\n case \"native\":\n default:\n return (\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n controls={controls}\n playsInline\n className={merge(\n \"absolute inset-0 w-full h-full\",\n objectFitClass\n )}\n style={{\n opacity: isPlaying || !fadeIn ? 1 : 0,\n transition: fadeIn ? \"opacity 0.8s ease-out\" : undefined,\n }}\n onLoadedData={handleLoadedData}\n onPlaying={handlePlaying}\n />\n );\n }\n };\n\n // Generate gradient overlay\n const renderGradientOverlay = () => {\n if (!gradient) return null;\n\n const gradients = [];\n\n if (gradientDirection === \"top\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"top\"\n className=\"absolute top-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to bottom, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n if (gradientDirection === \"bottom\" || gradientDirection === \"both\") {\n gradients.push(\n <div\n key=\"bottom\"\n className=\"absolute bottom-0 left-0 right-0 h-1/3\"\n style={{\n background: `linear-gradient(to top, ${overlayColor}, transparent)`,\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return <>{gradients}</>;\n };\n\n // Check if className contains position class (fixed, absolute, sticky)\n const hasPositionClass = className && /\\b(fixed|absolute|sticky)\\b/.test(className);\n\n return (\n <div\n ref={ref}\n className={merge(\n \"overflow-hidden\",\n !hasPositionClass && \"relative\",\n className\n )}\n style={style}\n {...props}\n >\n {/* Poster image (shows until video loads) */}\n {poster && fadeIn && !isLoaded && !isPlaying && (\n <div\n className=\"absolute inset-0 bg-cover bg-center\"\n style={{ backgroundImage: `url(${poster})` }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Video layer */}\n {renderVideo()}\n\n {/* Solid overlay */}\n {overlay && !gradient && (\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayColor }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Gradient overlay */}\n {renderGradientOverlay()}\n\n {/* Content */}\n {children && (\n <div className=\"relative z-10 h-full\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nVideoBackground.displayName = \"VideoBackground\";\n\nexport { VideoBackground };\n","\"use client\";\n\nimport React, { useRef, useState, useCallback, useEffect } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * Carousel 컴포넌트의 props / Carousel component props\n * @property {boolean} [autoPlay=false] - 자동 재생 / Auto play\n * @property {number} [interval=5000] - 자동 재생 간격 (ms) / Auto play interval\n * @property {boolean} [loop=true] - 무한 루프 / Infinite loop\n * @property {boolean} [pauseOnHover=true] - 호버시 일시정지 / Pause on hover\n * @property {\"dots\" | \"bars\" | \"numbers\" | \"none\"} [indicators=\"dots\"] - 인디케이터 타입 / Indicator type\n * @property {\"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\"} [indicatorPosition=\"bottom\"] - 인디케이터 위치 / Indicator position\n * @property {boolean} [showArrows=true] - 화살표 버튼 표시 / Show arrow buttons\n * @property {\"inside\" | \"outside\" | \"hidden\"} [arrowPosition=\"inside\"] - 화살표 위치 / Arrow position\n * @property {\"slide\" | \"fade\" | \"scale\"} [transition=\"slide\"] - 전환 효과 / Transition effect\n * @property {number} [transitionDuration=500] - 전환 시간 (ms) / Transition duration\n * @property {(index: number) => void} [onSlideChange] - 슬라이드 변경 콜백 / Slide change callback\n * @property {boolean} [showPlayPause=false] - 재생/일시정지 버튼 표시 / Show play/pause button\n * @property {\"left\" | \"right\" | \"center\"} [playPausePosition=\"right\"] - 재생/일시정지 버튼 위치 / Play/pause button position\n */\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n children: React.ReactNode[];\n autoPlay?: boolean;\n interval?: number;\n loop?: boolean;\n pauseOnHover?: boolean;\n indicators?: \"dots\" | \"bars\" | \"numbers\" | \"none\";\n indicatorPosition?: \"bottom\" | \"top\" | \"inside-bottom\" | \"inside-top\";\n showArrows?: boolean;\n arrowPosition?: \"inside\" | \"outside\" | \"hidden\";\n transition?: \"slide\" | \"fade\" | \"scale\";\n transitionDuration?: number;\n onSlideChange?: (index: number) => void;\n showPlayPause?: boolean;\n playPausePosition?: \"left\" | \"right\" | \"center\";\n}\n\n/**\n * Carousel 컴포넌트 / Carousel component\n *\n * 슬라이드 캐러셀 컴포넌트입니다.\n * 다양한 인디케이터, 화살표, 전환 효과를 지원합니다.\n *\n * Slide carousel component.\n * Supports various indicators, arrows, and transition effects.\n *\n * @component\n * @example\n * <Carousel autoPlay interval={3000} indicators=\"bars\">\n * <img src=\"/slide1.jpg\" alt=\"Slide 1\" />\n * <img src=\"/slide2.jpg\" alt=\"Slide 2\" />\n * <img src=\"/slide3.jpg\" alt=\"Slide 3\" />\n * </Carousel>\n */\nconst Carousel = React.forwardRef<HTMLDivElement, CarouselProps>(\n (\n {\n children,\n autoPlay = false,\n interval = 5000,\n loop = true,\n pauseOnHover = true,\n indicators = \"dots\",\n indicatorPosition = \"bottom\",\n showArrows = true,\n arrowPosition = \"inside\",\n transition = \"slide\",\n transitionDuration = 500,\n onSlideChange,\n showPlayPause = false,\n playPausePosition = \"right\",\n className,\n style,\n ...props\n },\n ref\n ) => {\n // For slide transition with loop: start at 1 (account for cloned first slide)\n // For fade/scale: always start at 0 (no cloned slides)\n const getInitialIndex = () => {\n if (transition === \"slide\" && loop) return 1;\n return 0;\n };\n const [currentIndex, setCurrentIndex] = useState(getInitialIndex);\n const [isPaused, setIsPaused] = useState(!autoPlay);\n const [isManuallyPaused, setIsManuallyPaused] = useState(false);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [noTransition, setNoTransition] = useState(false);\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const slideCount = React.Children.count(children);\n\n // Check for reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n // Get actual slide index for display (accounting for cloned slides in loop mode for slide transition)\n const getActualIndex = useCallback((index: number) => {\n // For fade/scale transitions, currentIndex is the actual index\n if (transition !== \"slide\") return index;\n // For slide transition without loop, index is actual\n if (!loop) return index;\n // For slide transition with loop, account for cloned slides\n if (index === 0) return slideCount - 1;\n if (index === slideCount + 1) return 0;\n return index - 1;\n }, [loop, slideCount, transition]);\n\n // Go to specific slide\n const goToSlide = useCallback(\n (index: number) => {\n if (isTransitioning) return;\n\n let newIndex = index;\n if (!loop) {\n newIndex = Math.max(0, Math.min(index, slideCount - 1));\n } else if (transition !== \"slide\") {\n // For fade/scale with loop, wrap around without cloned slides\n if (index < 0) {\n newIndex = slideCount - 1;\n } else if (index >= slideCount) {\n newIndex = 0;\n }\n }\n\n if (newIndex !== currentIndex) {\n setIsTransitioning(true);\n setCurrentIndex(newIndex);\n const actualIndex = loop && transition === \"slide\"\n ? (newIndex === 0 ? slideCount - 1 : newIndex === slideCount + 1 ? 0 : newIndex - 1)\n : newIndex;\n onSlideChange?.(actualIndex);\n setTimeout(() => setIsTransitioning(false), transitionDuration);\n }\n },\n [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition, onSlideChange]\n );\n\n // Handle infinite loop jump (when reaching cloned slides)\n useEffect(() => {\n if (!loop || isTransitioning || transition !== \"slide\") return;\n\n // Jump to real slide without animation when on cloned slides\n if (currentIndex === 0) {\n // At cloned last slide -> jump to real last slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(slideCount);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n } else if (currentIndex === slideCount + 1) {\n // At cloned first slide -> jump to real first slide\n setTimeout(() => {\n setNoTransition(true);\n setCurrentIndex(1);\n setTimeout(() => setNoTransition(false), 50);\n }, transitionDuration);\n }\n }, [currentIndex, slideCount, loop, isTransitioning, transitionDuration, transition]);\n\n // Next slide\n const nextSlide = useCallback(() => {\n goToSlide(currentIndex + 1);\n }, [currentIndex, goToSlide]);\n\n // Previous slide\n const prevSlide = useCallback(() => {\n goToSlide(currentIndex - 1);\n }, [currentIndex, goToSlide]);\n\n // Toggle play/pause manually\n const togglePlayPause = useCallback(() => {\n setIsManuallyPaused(prev => !prev);\n }, []);\n\n // Play function\n const play = useCallback(() => {\n setIsManuallyPaused(false);\n }, []);\n\n // Pause function\n const pause = useCallback(() => {\n setIsManuallyPaused(true);\n }, []);\n\n // Auto play\n useEffect(() => {\n if (!autoPlay || isPaused || isManuallyPaused || prefersReducedMotion) return;\n\n const timer = setInterval(nextSlide, interval);\n return () => clearInterval(timer);\n }, [autoPlay, interval, isPaused, isManuallyPaused, nextSlide, prefersReducedMotion]);\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n setTouchStart(e.targetTouches[0].clientX);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n const minSwipeDistance = 50;\n\n if (Math.abs(distance) >= minSwipeDistance) {\n if (distance > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prevSlide();\n } else if (e.key === \"ArrowRight\") {\n nextSlide();\n }\n };\n\n const container = containerRef.current;\n container?.addEventListener(\"keydown\", handleKeyDown);\n return () => container?.removeEventListener(\"keydown\", handleKeyDown);\n }, [nextSlide, prevSlide]);\n\n // Render slides with transition\n const renderSlides = () => {\n const duration = prefersReducedMotion || noTransition ? 0 : transitionDuration;\n const actualIndex = getActualIndex(currentIndex);\n\n switch (transition) {\n case \"fade\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transition: `opacity ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"scale\":\n return React.Children.map(children, (child, index) => (\n <div\n key={index}\n className={merge(\n \"absolute inset-0 w-full h-full\",\n index === actualIndex ? \"z-10\" : \"z-0\"\n )}\n style={{\n opacity: index === actualIndex ? 1 : 0,\n transform: `scale(${index === actualIndex ? 1 : 0.9})`,\n transition: `opacity ${duration}ms ease-in-out, transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n\n case \"slide\":\n default: {\n const childArray = React.Children.toArray(children);\n // For infinite loop: clone last slide at beginning and first slide at end\n const slides = loop\n ? [childArray[childArray.length - 1], ...childArray, childArray[0]]\n : childArray;\n\n // 각 슬라이드를 fade/scale처럼 absolute로 배치하고 translateX로 위치 조정\n return slides.map((child, index) => (\n <div\n key={index}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n transform: `translateX(${(index - currentIndex) * 100}%)`,\n transition: noTransition ? 'none' : `transform ${duration}ms ease-in-out`,\n }}\n >\n {child}\n </div>\n ));\n }\n }\n };\n\n // Render indicators\n const renderIndicators = () => {\n if (indicators === \"none\") return null;\n\n const isInside = indicatorPosition.includes(\"inside\");\n const isTop = indicatorPosition.includes(\"top\");\n const actualIndex = getActualIndex(currentIndex);\n\n const indicatorContainerClass = merge(\n \"flex items-center justify-center gap-2\",\n isInside\n ? merge(\n \"absolute left-1/2 -translate-x-1/2 z-20\",\n isTop ? \"top-4\" : \"bottom-4\"\n )\n : merge(\n \"mt-4\",\n isTop && \"order-first mb-4 mt-0\"\n )\n );\n\n // Handle indicator click - go to the correct index accounting for loop mode\n const handleIndicatorClick = (index: number) => {\n if (loop && transition === \"slide\") {\n goToSlide(index + 1); // +1 because of cloned first slide (only for slide transition)\n } else {\n goToSlide(index);\n }\n };\n\n return (\n <div className={indicatorContainerClass} role=\"tablist\">\n {Array.from({ length: slideCount }, (_, index) => {\n const isActive = index === actualIndex;\n\n switch (indicators) {\n case \"bars\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"h-1 rounded-full transition-all duration-300\",\n isActive\n ? \"w-8 bg-white\"\n : \"w-4 bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n\n case \"numbers\":\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-8 h-8 rounded-full text-sm font-medium transition-all duration-300\",\n isActive\n ? \"bg-white text-gray-900\"\n : \"bg-white/30 text-white hover:bg-white/50\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n >\n {index + 1}\n </button>\n );\n\n case \"dots\":\n default:\n return (\n <button\n key={index}\n onClick={() => handleIndicatorClick(index)}\n className={merge(\n \"w-2.5 h-2.5 rounded-full transition-all duration-300\",\n isActive\n ? \"bg-white scale-125\"\n : \"bg-white/50 hover:bg-white/70\"\n )}\n role=\"tab\"\n aria-selected={isActive}\n aria-label={`슬라이드 ${index + 1}`}\n />\n );\n }\n })}\n </div>\n );\n };\n\n // Render play/pause button\n const renderPlayPause = () => {\n if (!showPlayPause || !autoPlay) return null;\n\n const isPlaying = !isManuallyPaused;\n const positionClasses = {\n left: \"left-4\",\n center: \"left-1/2 -translate-x-1/2\",\n right: \"right-4\"\n };\n\n return (\n <button\n onClick={togglePlayPause}\n className={merge(\n \"absolute bottom-4 z-20\",\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\",\n positionClasses[playPausePosition]\n )}\n aria-label={isPlaying ? \"일시정지\" : \"재생\"}\n >\n {isPlaying ? <PauseIcon className=\"w-4 h-4\" /> : <PlayIcon className=\"w-4 h-4\" />}\n </button>\n );\n };\n\n // Render arrows\n const renderArrows = () => {\n if (!showArrows || arrowPosition === \"hidden\") return null;\n\n const canGoPrev = loop || currentIndex > 0;\n const canGoNext = loop || currentIndex < slideCount - 1;\n\n const arrowBaseClass = merge(\n \"absolute top-1/2 -translate-y-1/2 z-20\",\n \"w-10 h-10 rounded-full flex items-center justify-center\",\n \"bg-white/80 hover:bg-white text-gray-800\",\n \"transition-all duration-200\",\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-white\"\n );\n\n const prevPosition = arrowPosition === \"outside\" ? \"-left-14\" : \"left-4\";\n const nextPosition = arrowPosition === \"outside\" ? \"-right-14\" : \"right-4\";\n\n return (\n <>\n <button\n onClick={prevSlide}\n disabled={!canGoPrev}\n className={merge(arrowBaseClass, prevPosition)}\n aria-label=\"이전 슬라이드\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <button\n onClick={nextSlide}\n disabled={!canGoNext}\n className={merge(arrowBaseClass, nextPosition)}\n aria-label=\"다음 슬라이드\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n </>\n );\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex flex-col w-full h-full\",\n arrowPosition === \"outside\" && \"px-16\",\n className\n )}\n style={style}\n {...props}\n >\n <div\n ref={containerRef}\n className=\"relative overflow-hidden w-full flex-1\"\n onMouseEnter={() => pauseOnHover && setIsPaused(true)}\n onMouseLeave={() => pauseOnHover && setIsPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"이미지 슬라이더\"\n >\n {renderSlides()}\n {renderArrows()}\n {renderPlayPause()}\n {indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n {!indicatorPosition.includes(\"inside\") && renderIndicators()}\n </div>\n );\n }\n);\n\nCarousel.displayName = \"Carousel\";\n\n// Hook to check for reduced motion preference\nfunction useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReducedMotion(mediaQuery.matches);\n\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\n// Simple icon components\nfunction ChevronLeft({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n );\n}\n\nfunction ChevronRight({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport { Carousel };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport interface ImageRevealProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** 이미지 src */\n src: string;\n /** 이미지 alt */\n alt: string;\n /** 공개 방향 @default 'left' */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n /** 공개 시작 임계값 (0-1) @default 0.3 */\n threshold?: number;\n /** 이미지 높이 @default '400px' */\n height?: string;\n /** 오버레이 색상 */\n overlayColor?: string;\n}\n\n/**\n * ImageReveal - 스크롤 기반 이미지 공개 컴포넌트\n *\n * TextReveal에서 영감 받은 이미지 공개 효과.\n * clip-path를 사용하여 스크롤에 따라 이미지가 점진적으로 드러남.\n */\nconst ImageReveal = React.forwardRef<HTMLDivElement, ImageRevealProps>(\n (\n {\n src,\n alt,\n direction = \"left\",\n threshold = 0.3,\n height = \"400px\",\n overlayColor,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [progress, setProgress] = useState(0);\n\n const prefersReducedMotion = useReducedMotion();\n\n const updateProgress = useCallback(() => {\n if (!containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const vh = window.innerHeight;\n\n const start = vh * (1 - threshold);\n const end = vh * threshold;\n const elementCenter = rect.top + rect.height / 2;\n\n let p = 0;\n if (elementCenter <= start && elementCenter >= end) {\n p = (start - elementCenter) / (start - end);\n } else if (elementCenter < end) {\n p = 1;\n }\n\n setProgress(Math.max(0, Math.min(1, p)));\n }, [threshold]);\n\n useEffect(() => {\n if (prefersReducedMotion) {\n setProgress(1);\n return;\n }\n\n updateProgress();\n const handleScroll = () => requestAnimationFrame(updateProgress);\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [updateProgress, prefersReducedMotion]);\n\n const clipPath = getClipPath(direction, progress);\n\n return (\n <div\n ref={mergeRefs(ref, containerRef)}\n className={merge(\"relative overflow-hidden\", className)}\n style={{ height, ...style }}\n {...props}\n >\n <img\n src={src}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n style={{\n clipPath,\n transition: \"clip-path 0.1s ease-out\",\n }}\n />\n {overlayColor && (\n <div\n className=\"absolute inset-0 pointer-events-none\"\n style={{\n background: overlayColor,\n opacity: 1 - progress,\n transition: \"opacity 0.3s ease-out\",\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n }\n);\n\nImageReveal.displayName = \"ImageReveal\";\n\nfunction getClipPath(direction: string, progress: number): string {\n switch (direction) {\n case \"left\":\n return `inset(0 ${100 - progress * 100}% 0 0)`;\n case \"right\":\n return `inset(0 0 0 ${100 - progress * 100}%)`;\n case \"up\":\n return `inset(0 0 ${100 - progress * 100}% 0)`;\n case \"down\":\n return `inset(${100 - progress * 100}% 0 0 0)`;\n default:\n return `inset(0 ${100 - progress * 100}% 0 0)`;\n }\n}\n\nfunction useReducedMotion(): boolean {\n const [prefersReduced, setPrefersReduced] = useState(false);\n\n useEffect(() => {\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReduced(mq.matches);\n const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, []);\n\n return prefersReduced;\n}\n\nfunction mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((r) => {\n if (typeof r === \"function\") r(value);\n else if (r && typeof r === \"object\")\n (r as React.MutableRefObject<T | null>).current = value;\n });\n };\n}\n\nexport { ImageReveal };\n","\"use client\";\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport interface DotNavItem {\n /** 섹션 ID (scroll target) */\n id: string;\n /** 라벨 (호버 시 표시) */\n label?: string;\n}\n\nexport interface DotNavProps extends React.HTMLAttributes<HTMLElement> {\n /** 섹션 목록 */\n items: DotNavItem[];\n /** 위치 @default 'right' */\n position?: \"left\" | \"right\";\n /** 활성 색상 @default 'bg-primary' */\n activeColor?: string;\n /** 비활성 색상 @default 'bg-muted-foreground/30' */\n inactiveColor?: string;\n}\n\n/**\n * DotNav - 섹션 도트 네비게이터\n *\n * 포트폴리오/immersive 테마용 고정 위치 네비게이션.\n * 스크롤 위치에 따라 활성 섹션 자동 추적.\n */\nconst DotNav = React.forwardRef<HTMLElement, DotNavProps>(\n (\n {\n items,\n position = \"right\",\n activeColor = \"bg-primary\",\n inactiveColor = \"bg-muted-foreground/30\",\n className,\n ...props\n },\n ref\n ) => {\n const [activeIndex, setActiveIndex] = useState(0);\n\n const updateActive = useCallback(() => {\n const vh = window.innerHeight;\n let closest = 0;\n let closestDist = Infinity;\n\n items.forEach((item, i) => {\n const el = document.getElementById(item.id);\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const dist = Math.abs(rect.top - vh * 0.3);\n if (dist < closestDist) {\n closestDist = dist;\n closest = i;\n }\n });\n\n setActiveIndex(closest);\n }, [items]);\n\n useEffect(() => {\n updateActive();\n window.addEventListener(\"scroll\", updateActive, { passive: true });\n return () => window.removeEventListener(\"scroll\", updateActive);\n }, [updateActive]);\n\n const handleClick = useCallback(\n (id: string) => {\n const el = document.getElementById(id);\n if (el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n },\n []\n );\n\n const positionClass = useMemo(\n () => (position === \"left\" ? \"left-4\" : \"right-4\"),\n [position]\n );\n\n return (\n <nav\n ref={ref}\n className={merge(\n \"fixed top-1/2 -translate-y-1/2 z-40 flex flex-col gap-3\",\n positionClass,\n className\n )}\n aria-label=\"Section navigation\"\n {...props}\n >\n {items.map((item, i) => (\n <button\n key={item.id}\n onClick={() => handleClick(item.id)}\n className={merge(\n \"group relative w-3 h-3 rounded-full transition-all duration-300\",\n i === activeIndex\n ? `${activeColor} scale-125`\n : `${inactiveColor} hover:scale-110`\n )}\n aria-label={item.label || item.id}\n aria-current={i === activeIndex ? \"true\" : undefined}\n >\n {item.label && (\n <span\n className={merge(\n \"absolute top-1/2 -translate-y-1/2 whitespace-nowrap px-2 py-1 text-xs rounded bg-popover text-popover-foreground shadow-md opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none\",\n position === \"right\" ? \"right-full mr-2\" : \"left-full ml-2\"\n )}\n >\n {item.label}\n </span>\n )}\n </button>\n ))}\n </nav>\n );\n }\n);\n\nDotNav.displayName = \"DotNav\";\n\nexport { DotNav };\n","\"use client\";\n\nimport React, { useRef, useEffect, useState, useCallback } from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport interface HorizontalScrollProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onProgress'> {\n /** 가로 스크롤 컨텐츠 */\n children: React.ReactNode;\n /** 스크롤 높이 배율 (패널 수 × 이 값 = 총 스크롤 높이) @default 1 */\n heightMultiplier?: number;\n /** 스냅 여부 @default false */\n snap?: boolean;\n /** 진행률 콜백 */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * HorizontalScroll - 세로 스크롤을 가로 스크롤로 변환\n *\n * sticky positioning + translateX로 구현.\n * 세로 스크롤 입력을 가로 이동으로 매핑합니다.\n */\nconst HorizontalScroll = React.forwardRef<HTMLDivElement, HorizontalScrollProps>(\n (\n {\n children,\n heightMultiplier = 1,\n snap = false,\n onProgress,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const outerRef = useRef<HTMLDivElement>(null);\n const innerRef = useRef<HTMLDivElement>(null);\n const [scrollWidth, setScrollWidth] = useState(0);\n const [progress, setProgress] = useState(0);\n\n // Measure content width\n useEffect(() => {\n if (!innerRef.current) return;\n const measure = () => {\n if (innerRef.current) {\n setScrollWidth(innerRef.current.scrollWidth - window.innerWidth);\n }\n };\n measure();\n\n const ro = new ResizeObserver(measure);\n ro.observe(innerRef.current);\n return () => ro.disconnect();\n }, [children]);\n\n // Track scroll and convert to horizontal\n const handleScroll = useCallback(() => {\n if (!outerRef.current || scrollWidth <= 0) return;\n\n const rect = outerRef.current.getBoundingClientRect();\n const outerHeight = outerRef.current.offsetHeight - window.innerHeight;\n const scrolled = -rect.top;\n\n const p = Math.max(0, Math.min(1, scrolled / outerHeight));\n setProgress(p);\n onProgress?.(p);\n }, [scrollWidth, onProgress]);\n\n useEffect(() => {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [handleScroll]);\n\n const panelCount = React.Children.count(children);\n const totalHeight = `${panelCount * heightMultiplier * 100}vh`;\n\n return (\n <div\n ref={mergeRefs(ref, outerRef)}\n className={merge(\"relative\", className)}\n style={{ height: totalHeight, ...style }}\n {...props}\n >\n <div className=\"sticky top-0 h-screen overflow-hidden\">\n <div\n ref={innerRef}\n className={merge(\n \"flex h-full will-change-transform\",\n snap && \"scroll-snap-x\"\n )}\n style={{\n transform: `translateX(${-progress * scrollWidth}px)`,\n }}\n >\n {React.Children.map(children, (child, i) => (\n <div\n key={i}\n className={merge(\n \"flex-shrink-0 w-screen h-full\",\n snap && \"snap-start\"\n )}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n);\n\nHorizontalScroll.displayName = \"HorizontalScroll\";\n\nfunction mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((r) => {\n if (typeof r === \"function\") r(value);\n else if (r && typeof r === \"object\")\n (r as React.MutableRefObject<T | null>).current = value;\n });\n };\n}\n\nexport { HorizontalScroll };\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\nimport type { Color } from '../../../lib/types/common';\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n *\n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n *\n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n *\n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter\n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n *\n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-indigo-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-muted rounded-full\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n *\n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n *\n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n *\n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton\n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n *\n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-1 focus:ring-ring\",\n sizeClasses[size],\n isSelected\n ? \"border-indigo-500 bg-indigo-50 dark:bg-indigo-900/20\"\n : \"border-border bg-background\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton }\n","'use client'\n\nimport React from \"react\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\nimport { merge } from '../../../lib/utils';\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n *\n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n *\n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n *\n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n *\n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({\n className,\n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props\n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n\n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-1 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected\n ? \"border-primary bg-primary/5\"\n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector }\nexport type { EmotionSelectorProps }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","'use client'\n\nimport React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { merge } from '../../../lib/utils';\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n *\n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n *\n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n *\n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n *\n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({\n className,\n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props\n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className={`${item.color} h-2 rounded-full transition-all duration-300`}\n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis }\nexport type { EmotionAnalysisProps }\n","/**\n * 슬러그 생성 유틸리티\n * Slug generation utilities\n */\n\n/**\n * 제목에서 URL 슬러그 생성\n * Generate URL slug from title\n *\n * @param title - 제목 / Title\n * @returns 슬러그 / Slug\n *\n * @example\n * ```ts\n * generateSlug('Hello World') // 'hello-world'\n * generateSlug('안녕하세요') // '안녕하세요'\n * generateSlug('Hello 안녕') // 'hello-안녕'\n * ```\n */\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .trim()\n}\n\n/**\n * 슬러그 유효성 검사\n * Validate slug\n *\n * @param slug - 슬러그 / Slug\n * @returns 유효 여부 / Whether valid\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length === 0) return false\n if (slug.length > 200) return false\n\n // 슬러그 형식 검사: 영문, 숫자, 한글, 일본어, 하이픈만 허용\n const slugPattern = /^[a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]+$/\n return slugPattern.test(slug)\n}\n\n/**\n * 슬러그 정규화 (입력된 슬러그를 유효한 형식으로 변환)\n * Normalize slug (convert input to valid format)\n *\n * @param input - 입력값 / Input value\n * @returns 정규화된 슬러그 / Normalized slug\n */\nexport function normalizeSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9가-힣ぁ-んァ-ン一-龯_.~-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n","\"use client\"\n\nimport React, { createContext, useContext, useState, useCallback, useMemo, useEffect, useRef } from 'react'\nimport type {\n BlogEditorContextValue,\n BlogEditorData,\n BlogEditorProps,\n BlogEditorLabels,\n BlogEditorFeatures,\n LanguageConfig,\n MultilingualField,\n} from './types'\nimport { generateSlug as generateSlugUtil } from './utils/slug'\n\n/**\n * 기본 레이블 / Default labels\n */\nconst DEFAULT_LABELS: BlogEditorLabels = {\n // Header\n pageTitle: '새 글 작성',\n editTitle: '글 수정',\n preview: '미리보기',\n editMode: '편집',\n\n // Metadata\n basicInfo: '기본 정보',\n slug: '슬러그',\n slugPrefix: '/blog/',\n tags: '태그',\n tagsPlaceholder: '개발, 일상, 업데이트',\n coverImage: '커버 이미지 URL',\n coverImagePlaceholder: 'https://example.com/image.jpg',\n publishDate: '발행 예약일시',\n publishDateHint: '비워두면 즉시 발행됨',\n expiresAt: '만료 일시',\n expiresAtHint: '비워두면 만료되지 않음',\n\n // Content\n titleLabel: '제목',\n titlePlaceholder: '제목을 입력하세요',\n excerpt: '요약',\n excerptPlaceholder: '카드에 표시될 짧은 요약',\n contentLabel: '본문',\n contentPlaceholder: '마크다운으로 작성하세요...',\n\n // Actions\n cancel: '취소',\n saveDraft: '임시저장',\n publish: '발행',\n update: '수정 완료',\n saving: '저장 중...',\n\n // Translation\n translateHint: 'AI 번역 기능',\n translateButton: 'AI 번역',\n translating: '번역 중...',\n translateSuccess: '번역 완료!',\n\n // Errors\n requiredFields: '필수 필드를 입력해주세요',\n saveError: '저장 중 오류 발생',\n translateError: '번역 중 오류 발생',\n noTitle: '제목 없음',\n\n // Toolbar\n bold: '굵게',\n italic: '기울임',\n strikethrough: '취소선',\n heading: '제목',\n link: '링크',\n image: '이미지',\n code: '코드',\n codeBlock: '코드블록',\n quote: '인용문',\n list: '목록',\n orderedList: '순서 목록',\n horizontalRule: '수평선',\n}\n\n/**\n * 기본 기능 / Default features\n */\nconst DEFAULT_FEATURES: Required<BlogEditorFeatures> = {\n enableSlug: true,\n enableTags: true,\n enableCoverImage: true,\n enablePublishDate: true,\n enableExcerpt: true,\n enableTranslation: true,\n enablePreview: true,\n enableMarkdownToolbar: true,\n enableAutoSave: true,\n enableExpiresAt: false,\n}\n\n/**\n * 기본 언어 / Default languages\n */\nconst DEFAULT_LANGUAGES: LanguageConfig[] = [\n { key: 'ko', label: '한국어', isPrimary: true, flag: '🇰🇷' },\n { key: 'en', label: 'English', flag: '🇺🇸' },\n { key: 'ja', label: '日本語', flag: '🇯🇵' },\n]\n\n/**\n * 빈 다국어 필드 생성 / Create empty multilingual field\n */\nfunction createEmptyMultilingualField(languages: LanguageConfig[]): MultilingualField {\n const field: MultilingualField = {}\n languages.forEach((lang) => {\n field[lang.key] = ''\n })\n return field\n}\n\n/**\n * 초기 데이터 생성 / Create initial data\n */\nfunction createInitialData(\n languages: LanguageConfig[],\n initialData?: Partial<BlogEditorData>\n): BlogEditorData {\n return {\n slug: initialData?.slug ?? '',\n title: initialData?.title ?? createEmptyMultilingualField(languages),\n excerpt: initialData?.excerpt ?? createEmptyMultilingualField(languages),\n content: initialData?.content ?? createEmptyMultilingualField(languages),\n tags: initialData?.tags ?? [],\n coverImage: initialData?.coverImage ?? '',\n publishedAt: initialData?.publishedAt ?? null,\n expiresAt: initialData?.expiresAt ?? null,\n }\n}\n\n/**\n * BlogEditor 컨텍스트 / BlogEditor context\n */\nconst BlogEditorContext = createContext<BlogEditorContextValue | null>(null)\n\n/**\n * BlogEditor 컨텍스트 훅 / BlogEditor context hook\n */\nexport function useBlogEditor(): BlogEditorContextValue {\n const context = useContext(BlogEditorContext)\n if (!context) {\n throw new Error('useBlogEditor must be used within a BlogEditorProvider')\n }\n return context\n}\n\n/**\n * BlogEditor 프로바이더 Props / BlogEditor provider props\n */\ninterface BlogEditorProviderProps extends BlogEditorProps {\n children: React.ReactNode\n}\n\n/**\n * BlogEditor 프로바이더 / BlogEditor provider\n */\nexport function BlogEditorProvider({\n children,\n initialData,\n isEditMode = false,\n languages = DEFAULT_LANGUAGES,\n defaultLanguage,\n labels: userLabels,\n callbacks,\n features: userFeatures,\n variant = 'default',\n autoSaveKey,\n autoSaveInterval = 3000,\n}: BlogEditorProviderProps) {\n // 언어 설정\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key ?? languages[0]?.key ?? 'ko'\n const initialLanguage = defaultLanguage ?? primaryLanguage\n\n // 병합된 설정\n const labels = useMemo<BlogEditorLabels>(\n () => ({ ...DEFAULT_LABELS, ...userLabels }),\n [userLabels]\n )\n const features = useMemo<Required<BlogEditorFeatures>>(\n () => ({ ...DEFAULT_FEATURES, ...userFeatures }),\n [userFeatures]\n )\n\n // 상태\n const [formData, setFormData] = useState<BlogEditorData>(() =>\n createInitialData(languages, initialData)\n )\n const [activeLanguage, setActiveLanguage] = useState(initialLanguage)\n const [showPreview, setShowPreview] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [translating, setTranslating] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [translateSuccess, setTranslateSuccess] = useState(false)\n // 슬러그가 사용자에 의해 수동 편집되었는지 추적\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(isEditMode || !!initialData?.slug)\n const [autoSaveStatus, setAutoSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle')\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const isInitialMount = useRef(true)\n\n // 자동저장 키 생성 / Generate auto-save key\n const storageKey = autoSaveKey || (isEditMode ? null : 'blog-editor-draft')\n\n // localStorage에서 복원 (새 글 작성 모드만) / Restore from localStorage (create mode only)\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey || isEditMode) return\n\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved) as BlogEditorData\n setFormData(parsed)\n }\n } catch {\n // 파싱 실패 시 무시\n }\n }, []) // 마운트 시 한 번만 실행\n\n // 자동저장 / Auto-save to localStorage\n useEffect(() => {\n if (!features.enableAutoSave || !storageKey) return\n\n // 초기 마운트 시에는 저장하지 않음\n if (isInitialMount.current) {\n isInitialMount.current = false\n return\n }\n\n // 기존 타이머 취소\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n\n setAutoSaveStatus('saving')\n\n // debounce 저장\n autoSaveTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(formData))\n setAutoSaveStatus('saved')\n // 3초 후 idle로\n setTimeout(() => setAutoSaveStatus('idle'), 2000)\n } catch {\n setAutoSaveStatus('idle')\n }\n }, autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearTimeout(autoSaveTimerRef.current)\n }\n }\n }, [formData, features.enableAutoSave, storageKey, autoSaveInterval])\n\n // 저장 성공 시 localStorage 초기화 / Clear localStorage on successful save\n const clearAutoSave = useCallback(() => {\n if (storageKey) {\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // 무시\n }\n }\n }, [storageKey])\n\n // 필드 업데이트 / Update field\n const updateField = useCallback(\n <K extends keyof BlogEditorData>(field: K, value: BlogEditorData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }))\n },\n []\n )\n\n // 다국어 필드 업데이트 / Update multilingual field\n const updateMultilingualField = useCallback(\n (field: 'title' | 'excerpt' | 'content', language: string, value: string) => {\n setFormData((prev) => ({\n ...prev,\n [field]: {\n ...prev[field],\n [language]: value,\n },\n }))\n },\n []\n )\n\n // 슬러그 생성 / Generate slug\n const generateSlug = useCallback((title: string) => {\n return generateSlugUtil(title)\n }, [])\n\n // 저장 핸들러 / Save handler\n const handleSave = useCallback(\n async (publish: boolean) => {\n // 유효성 검사\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n if (features.enableSlug && !formData.slug) {\n setError(labels.requiredFields)\n return\n }\n\n setSubmitting(true)\n setError(null)\n\n try {\n await callbacks.onSave(formData, publish)\n // 저장 성공 시 자동저장 데이터 삭제\n clearAutoSave()\n } catch (err) {\n setError(labels.saveError)\n } finally {\n setSubmitting(false)\n }\n },\n [formData, primaryLanguage, labels, features, callbacks, clearAutoSave]\n )\n\n // 번역 핸들러 / Translate handler\n const handleTranslate = useCallback(async () => {\n if (!callbacks.onTranslate) return\n\n const primaryTitle = formData.title[primaryLanguage]\n const primaryContent = formData.content[primaryLanguage]\n const primaryExcerpt = formData.excerpt[primaryLanguage]\n\n if (!primaryTitle || !primaryContent) {\n setError(labels.requiredFields)\n return\n }\n\n setTranslating(true)\n setError(null)\n setTranslateSuccess(false)\n\n try {\n const translations = await callbacks.onTranslate({\n sourceLanguage: primaryLanguage,\n title: primaryTitle,\n content: primaryContent,\n excerpt: primaryExcerpt || undefined,\n })\n\n // 번역 결과 적용\n setFormData((prev) => {\n const newTitle = { ...prev.title }\n const newContent = { ...prev.content }\n const newExcerpt = { ...prev.excerpt }\n\n // translations는 { title: MultilingualField, content: MultilingualField, excerpt: MultilingualField } 형태일 수 있음\n // 또는 단순히 { ko: { title, content, excerpt }, en: { ... }, ja: { ... } } 형태일 수 있음\n // 여기서는 콜백이 언어별 번역을 반환한다고 가정\n Object.keys(translations).forEach((langKey) => {\n if (langKey !== primaryLanguage) {\n const translation = translations[langKey]\n if (typeof translation === 'object' && translation !== null) {\n const trans = translation as { title?: string; content?: string; excerpt?: string }\n if (trans.title) newTitle[langKey] = trans.title\n if (trans.content) newContent[langKey] = trans.content\n if (trans.excerpt) newExcerpt[langKey] = trans.excerpt\n }\n }\n })\n\n return {\n ...prev,\n title: newTitle,\n content: newContent,\n excerpt: newExcerpt,\n }\n })\n\n setTranslateSuccess(true)\n setTimeout(() => setTranslateSuccess(false), 3000)\n } catch (err) {\n setError(labels.translateError)\n } finally {\n setTranslating(false)\n }\n }, [formData, primaryLanguage, labels, callbacks])\n\n // 이미지 업로드 핸들러 / Image upload handler\n const handleUploadImage = useCallback(async (file: File): Promise<string | null> => {\n if (!callbacks.onUploadImage) return null\n\n setUploading(true)\n setError(null)\n\n try {\n const url = await callbacks.onUploadImage(file)\n return url\n } catch (err) {\n setError('이미지 업로드 실패')\n return null\n } finally {\n setUploading(false)\n }\n }, [callbacks])\n\n // 취소 핸들러 / Cancel handler\n const handleCancel = useCallback(() => {\n callbacks.onCancel?.()\n }, [callbacks])\n\n // 컨텍스트 값\n const value = useMemo<BlogEditorContextValue>(\n () => ({\n // State\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n\n // Config\n languages,\n features,\n labels,\n variant,\n isEditMode,\n\n // Actions\n setActiveLanguage,\n setShowPreview,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n setError,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n }),\n [\n formData,\n activeLanguage,\n showPreview,\n submitting,\n translating,\n uploading,\n error,\n translateSuccess,\n autoSaveStatus,\n languages,\n features,\n labels,\n variant,\n isEditMode,\n updateField,\n updateMultilingualField,\n handleSave,\n handleTranslate,\n handleUploadImage,\n handleCancel,\n generateSlug,\n slugManuallyEdited,\n setSlugManuallyEdited,\n ]\n )\n\n return <BlogEditorContext.Provider value={value}>{children}</BlogEditorContext.Provider>\n}\n\nexport { BlogEditorContext }\n","/**\n * Core Icons (Phosphor Icons)\n *\n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n *\n * 포함 기준:\n * 1. my-app에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n *\n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\n Shield,\n Wallet,\n Key,\n\n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n\n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n\n // Theme\n Monitor,\n Sun,\n Moon,\n\n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n Rocket,\n\n // Admin\n Layout,\n Megaphone,\n Stack,\n Prohibit,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n\n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n\n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n\n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n\n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n rocket: Rocket,\n\n // Admin\n layout: Layout,\n megaphone: Megaphone,\n layers: Stack,\n ban: Prohibit,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: 'frown',\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider = 'phosphor'\n): React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n }\n\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n *\n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'iconsax':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n *\n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 / Icon provider override */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n const config = useIconContext()\n\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n\n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n const accessibilityProps: React.AriaAttributes = {}\n\n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\n\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\nLoadingIcon.displayName = 'LoadingIcon'\n\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\nSuccessIcon.displayName = 'SuccessIcon'\n\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorHeader Props\n */\nexport interface BlogEditorHeaderProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorHeader 컴포넌트\n * 에디터 헤더 (제목 + 미리보기 토글)\n */\nconst BlogEditorHeader = React.forwardRef<HTMLElement, BlogEditorHeaderProps>(\n ({ onBack, backLink, className }, ref) => {\n const { labels, isEditMode, formData } = useBlogEditor()\n\n return (\n <header\n ref={ref}\n className={merge('flex items-center justify-between mb-8', className)}\n >\n <div className=\"flex items-center gap-4\">\n {backLink || (\n onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"뒤로가기\"\n >\n <Icon name=\"chevronLeft\" size={24} />\n </button>\n )\n )}\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {isEditMode ? labels.editTitle : labels.pageTitle}\n </h1>\n {isEditMode && formData.slug && (\n <p className=\"text-sm text-muted-foreground\">\n {labels.slugPrefix}{formData.slug}\n </p>\n )}\n </div>\n </div>\n </header>\n )\n }\n)\n\nBlogEditorHeader.displayName = 'BlogEditorHeader'\n\nexport { BlogEditorHeader }\n","\"use client\"\n\nimport React, { useState, useCallback, useRef, KeyboardEvent, ChangeEvent } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { normalizeSlug } from './utils/slug'\n\n/**\n * BlogEditorMetadata Props\n */\nexport interface BlogEditorMetadataProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorMetadata 컴포넌트\n * 메타데이터 필드 (슬러그, 태그, 커버 이미지, 발행일)\n */\nconst BlogEditorMetadata = React.forwardRef<HTMLDivElement, BlogEditorMetadataProps>(\n ({ className }, ref) => {\n const { formData, updateField, features, labels, variant, handleUploadImage, uploading, setSlugManuallyEdited } = useBlogEditor()\n const [tagInput, setTagInput] = useState('')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const containerClasses = merge(\n 'rounded-xl p-6 space-y-4',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-background/20 dark:border-border/50'\n : variant === 'minimal'\n ? 'bg-transparent'\n : 'bg-background',\n className\n )\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n // 태그 추가\n const addTag = useCallback((tag: string) => {\n const trimmed = tag.trim()\n if (trimmed && !formData.tags.includes(trimmed)) {\n updateField('tags', [...formData.tags, trimmed])\n }\n setTagInput('')\n }, [formData.tags, updateField])\n\n // 태그 삭제\n const removeTag = useCallback((tagToRemove: string) => {\n updateField('tags', formData.tags.filter((t) => t !== tagToRemove))\n }, [formData.tags, updateField])\n\n // 태그 입력 핸들러\n const handleTagInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n // 쉼표 입력 시 태그 추가\n if (value.includes(',')) {\n const parts = value.split(',')\n parts.forEach((part, idx) => {\n if (idx < parts.length - 1) {\n // 마지막이 아닌 부분들은 태그로 추가\n addTag(part)\n } else {\n // 마지막 부분은 입력창에 유지\n setTagInput(part)\n }\n })\n } else {\n setTagInput(value)\n }\n }, [addTag])\n\n // 키보드 이벤트 핸들러\n const handleTagKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addTag(tagInput)\n } else if (e.key === 'Backspace' && !tagInput && formData.tags.length > 0) {\n // 입력창이 비어있을 때 Backspace 누르면 마지막 태그 삭제\n removeTag(formData.tags[formData.tags.length - 1])\n }\n }, [tagInput, formData.tags, addTag, removeTag])\n\n return (\n <div ref={ref} className={containerClasses}>\n <h2 className=\"font-semibold text-foreground\">{labels.basicInfo}</h2>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {/* 슬러그 */}\n {features.enableSlug && (\n <div>\n <label className={labelClasses}>\n {labels.slug} *\n </label>\n <div className=\"flex items-center\">\n <span className=\"text-muted-foreground mr-1 text-sm\">\n {labels.slugPrefix}\n </span>\n <input\n type=\"text\"\n value={formData.slug}\n onChange={(e) => {\n updateField('slug', normalizeSlug(e.target.value))\n setSlugManuallyEdited(true)\n }}\n className={merge(inputClasses, 'flex-1')}\n placeholder=\"my-post-slug\"\n />\n </div>\n </div>\n )}\n\n {/* 태그 */}\n {features.enableTags && (\n <div>\n <label className={labelClasses}>{labels.tags}</label>\n <div className={merge(\n 'flex flex-wrap items-center gap-2 min-h-[42px] px-3 py-2 border border-border rounded-lg bg-background focus-within:ring-1 focus-within:ring-ring focus-within:border-transparent transition-colors'\n )}>\n {/* 태그 칩들 */}\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary text-sm rounded-md\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => removeTag(tag)}\n className=\"hover:text-primary transition-colors\"\n aria-label={`${tag} 태그 삭제`}\n >\n <Icon name=\"x\" size={14} />\n </button>\n </span>\n ))}\n {/* 입력창 */}\n <input\n type=\"text\"\n value={tagInput}\n onChange={handleTagInputChange}\n onKeyDown={handleTagKeyDown}\n className=\"flex-1 min-w-[100px] bg-transparent outline-none text-foreground text-sm\"\n placeholder={formData.tags.length === 0 ? labels.tagsPlaceholder : '태그 추가...'}\n />\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n 쉼표(,) 또는 Enter로 태그 추가\n </p>\n </div>\n )}\n </div>\n\n {/* 커버 이미지 */}\n {features.enableCoverImage && (\n <div>\n <label className={labelClasses}>{labels.coverImage}</label>\n <div className=\"space-y-3\">\n {/* 이미지 미리보기 */}\n {formData.coverImage && (\n <div className=\"relative w-full h-40 rounded-lg overflow-hidden bg-muted\">\n <img\n src={formData.coverImage}\n alt=\"커버 이미지 미리보기\"\n className=\"w-full h-full object-cover\"\n />\n <button\n type=\"button\"\n onClick={() => updateField('coverImage', '')}\n className=\"absolute top-2 right-2 p-1.5 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors\"\n aria-label=\"이미지 삭제\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n )}\n\n {/* URL 입력 + 파일 업로드 */}\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={formData.coverImage}\n onChange={(e) => updateField('coverImage', e.target.value)}\n className={merge(inputClasses, 'flex-1')}\n placeholder={labels.coverImagePlaceholder}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n const url = await handleUploadImage(file)\n if (url) {\n updateField('coverImage', url)\n }\n }\n // 같은 파일 다시 선택할 수 있도록 초기화\n e.target.value = ''\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={uploading}\n className=\"px-3 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n title=\"이미지 업로드\"\n >\n {uploading ? (\n <Icon name=\"loader\" size={20} spin />\n ) : (\n <Icon name=\"upload\" size={20} />\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* 발행일 & 만료일 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {features.enablePublishDate && (\n <div>\n <label className={labelClasses}>{labels.publishDate}</label>\n <input\n type=\"datetime-local\"\n value={formData.publishedAt ?? ''}\n onChange={(e) => updateField('publishedAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.publishDateHint}\n </p>\n </div>\n )}\n\n {features.enableExpiresAt && (\n <div>\n <label className={labelClasses}>{labels.expiresAt}</label>\n <input\n type=\"datetime-local\"\n value={formData.expiresAt ?? ''}\n onChange={(e) => updateField('expiresAt', e.target.value || null)}\n className={inputClasses}\n />\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {labels.expiresAtHint}\n </p>\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorMetadata.displayName = 'BlogEditorMetadata'\n\nexport { BlogEditorMetadata }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorLanguageTabs Props\n */\nexport interface BlogEditorLanguageTabsProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorLanguageTabs 컴포넌트\n * 언어 탭 네비게이션 + 미리보기 토글 (sticky)\n */\nconst BlogEditorLanguageTabs = React.forwardRef<HTMLDivElement, BlogEditorLanguageTabsProps>(\n ({ className }, ref) => {\n const { languages, activeLanguage, setActiveLanguage, showPreview, setShowPreview, features, labels } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex items-center border-b border-border sticky top-0 z-10 bg-background',\n className\n )}\n role=\"tablist\"\n aria-label=\"언어 선택\"\n >\n <div className=\"flex flex-1\">\n {languages.map((lang) => {\n const isActive = activeLanguage === lang.key\n const isPrimary = lang.isPrimary\n\n return (\n <button\n key={lang.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${lang.key}`}\n id={`tab-${lang.key}`}\n onClick={() => setActiveLanguage(lang.key)}\n className={merge(\n 'flex-1 px-4 py-3 text-sm font-medium transition-colors',\n isActive\n ? 'bg-primary/10 text-primary border-b-2 border-primary'\n : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {lang.flag && <span className=\"mr-1.5\">{lang.flag}</span>}\n {lang.label}\n {isPrimary && ' *'}\n </button>\n )\n })}\n </div>\n\n {features.enablePreview && (\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n className=\"inline-flex items-center gap-1.5 px-3 py-2 mx-2 text-sm border border-border rounded-lg hover:bg-muted transition-colors shrink-0\"\n >\n <Icon name={showPreview ? 'pencil' : 'eye'} size={14} />\n {showPreview ? labels.editMode : labels.preview}\n </button>\n )}\n </div>\n )\n }\n)\n\nBlogEditorLanguageTabs.displayName = 'BlogEditorLanguageTabs'\n\nexport { BlogEditorLanguageTabs }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorContent Props\n */\nexport interface BlogEditorContentProps {\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** textarea ref 콜백 / textarea ref callback */\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>\n}\n\n/**\n * BlogEditorContent 컴포넌트\n * 제목, 요약, 본문 입력 필드\n */\nconst BlogEditorContent = React.forwardRef<HTMLDivElement, BlogEditorContentProps>(\n ({ className, textareaRef }, ref) => {\n const {\n formData,\n activeLanguage,\n updateMultilingualField,\n updateField,\n features,\n labels,\n languages,\n generateSlug,\n isEditMode,\n slugManuallyEdited,\n } = useBlogEditor()\n\n const isPrimaryLanguage = languages.find((l) => l.isPrimary)?.key === activeLanguage\n const currentLang = languages.find((l) => l.key === activeLanguage)\n\n const inputClasses =\n 'w-full px-3 py-2 border border-border rounded-lg bg-background text-foreground focus:ring-1 focus:ring-ring focus:border-transparent transition-colors'\n\n const labelClasses = 'block text-sm font-medium text-foreground mb-1'\n\n const handleTitleChange = (value: string) => {\n updateMultilingualField('title', activeLanguage, value)\n\n // 영어 탭에서 타이틀 입력 시 슬러그 자동 생성\n // (한국어/일본어보다 영어 슬러그가 URL에 적합)\n if (activeLanguage === 'en' && !isEditMode && !slugManuallyEdited) {\n updateField('slug', generateSlug(value))\n }\n }\n\n // 언어별 레이블 생성\n const getLangLabel = (baseLabel: string) => {\n if (isPrimaryLanguage) {\n return `${baseLabel} *`\n }\n return `${baseLabel} (${currentLang?.label || activeLanguage})`\n }\n\n return (\n <div ref={ref} className={merge('p-6 space-y-4', className)}>\n {/* 제목 */}\n <div>\n <label className={labelClasses}>{getLangLabel(labels.titleLabel)}</label>\n <input\n type=\"text\"\n value={formData.title[activeLanguage] || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n className={inputClasses}\n placeholder={labels.titlePlaceholder}\n />\n </div>\n\n {/* 요약 */}\n {features.enableExcerpt && (\n <div>\n <label className={labelClasses}>{getLangLabel(labels.excerpt)}</label>\n <textarea\n value={formData.excerpt[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('excerpt', activeLanguage, e.target.value)}\n rows={2}\n className={merge(inputClasses, 'resize-none')}\n placeholder={labels.excerptPlaceholder}\n />\n </div>\n )}\n\n {/* 본문 */}\n <div>\n <label className={labelClasses}>\n {getLangLabel(labels.contentLabel)} (마크다운)\n </label>\n <textarea\n ref={textareaRef}\n value={formData.content[activeLanguage] || ''}\n onChange={(e) => updateMultilingualField('content', activeLanguage, e.target.value)}\n rows={15}\n className={merge(inputClasses, 'font-mono text-sm resize-y min-h-[300px]')}\n placeholder={labels.contentPlaceholder}\n />\n </div>\n </div>\n )\n }\n)\n\nBlogEditorContent.displayName = 'BlogEditorContent'\n\nexport { BlogEditorContent }\n","/**\n * 마크다운 파서 유틸리티\n * Markdown parser utilities\n *\n * 지원 문법 / Supported syntax:\n * - **볼드**, *이탤릭*, ~~취소선~~\n * - [링크](url)\n * - # 헤딩 (h1-h6)\n * - - 또는 * 리스트\n * - `인라인 코드`\n * - ```코드블록```\n * - > 인용문\n * - --- 수평선\n */\n\n/**\n * HTML 특수문자 이스케이프\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\n/**\n * 마크다운 텍스트를 HTML로 변환\n * Convert markdown text to HTML\n */\nexport function parseMarkdown(text: string): string {\n if (!text) return ''\n\n let html = text\n\n // 코드블록 먼저 처리 (다른 파싱 방지)\n html = html.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, lang, code) => {\n const escaped = escapeHtml(code.trim())\n return `<pre class=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\"><code class=\"text-sm\">${escaped}</code></pre>`\n })\n\n // 인라인 코드\n html = html.replace(\n /`([^`]+)`/g,\n '<code class=\"bg-gray-100 dark:bg-gray-700 px-1.5 py-0.5 rounded text-sm\">$1</code>'\n )\n\n // 헤딩 (줄 시작에서만)\n html = html.replace(/^######\\s+(.+)$/gm, '<h6 class=\"text-base font-semibold mt-4 mb-2\">$1</h6>')\n html = html.replace(/^#####\\s+(.+)$/gm, '<h5 class=\"text-lg font-semibold mt-4 mb-2\">$1</h5>')\n html = html.replace(/^####\\s+(.+)$/gm, '<h4 class=\"text-xl font-semibold mt-5 mb-2\">$1</h4>')\n html = html.replace(/^###\\s+(.+)$/gm, '<h3 class=\"text-2xl font-semibold mt-5 mb-3\">$1</h3>')\n html = html.replace(/^##\\s+(.+)$/gm, '<h2 class=\"text-2xl font-bold mt-6 mb-3\">$1</h2>')\n html = html.replace(/^#\\s+(.+)$/gm, '<h1 class=\"text-3xl font-bold mt-6 mb-4\">$1</h1>')\n\n // 수평선\n html = html.replace(/^---+$/gm, '<hr class=\"my-6 border-gray-300 dark:border-gray-600\" />')\n\n // 인용문\n html = html.replace(\n /^>\\s+(.+)$/gm,\n '<blockquote class=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-4 italic text-gray-600 dark:text-gray-400\">$1</blockquote>'\n )\n\n // 볼드, 이탤릭, 취소선\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n html = html.replace(/~~(.+?)~~/g, '<del class=\"text-gray-500\">$1</del>')\n\n // 링크\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" class=\"text-cyan-600 hover:text-cyan-700 dark:text-cyan-400 dark:hover:text-cyan-300 underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n )\n\n // 리스트 (연속된 리스트 아이템을 ul로 감싸기)\n html = html.replace(/^[-*]\\s+(.+)$/gm, '<li class=\"ml-4\">$1</li>')\n html = html.replace(/(<li[^>]*>.*<\\/li>\\n?)+/g, (match) => {\n return `<ul class=\"list-disc list-inside my-4 space-y-1\">${match}</ul>`\n })\n\n // 줄바꿈을 <br>로 변환 (단, 블록 요소 직후는 제외)\n html = html.replace(/\\n(?!<)/g, '<br />\\n')\n\n // 연속된 <br /> 정리\n html = html.replace(/(<br \\/>[\\n\\s]*){3,}/g, '<br /><br />\\n')\n\n return html\n}\n\n/**\n * 마크다운에서 순수 텍스트만 추출 (미리보기용)\n * Extract plain text from markdown (for preview)\n */\nexport function stripMarkdown(text: string): string {\n if (!text) return ''\n\n return text\n // 코드블록 제거\n .replace(/```[\\s\\S]*?```/g, '')\n // 인라인 코드 제거\n .replace(/`[^`]+`/g, '')\n // 헤딩 마크 제거\n .replace(/^#{1,6}\\s+/gm, '')\n // 볼드/이탤릭 마크 제거\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n // 링크에서 텍스트만 추출\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n // 리스트 마크 제거\n .replace(/^[-*]\\s+/gm, '')\n // 인용문 마크 제거\n .replace(/^>\\s+/gm, '')\n // 수평선 제거\n .replace(/^---+$/gm, '')\n // 연속 공백/줄바꿈 정리\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n\n/**\n * 마크다운 텍스트 미리보기 (글자수 제한)\n * Markdown text preview (with character limit)\n */\nexport function getMarkdownPreview(text: string, maxLength: number = 150): string {\n const stripped = stripMarkdown(text)\n if (stripped.length <= maxLength) return stripped\n return stripped.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * 마크다운 삽입 헬퍼\n * Markdown insertion helper\n */\nexport function insertMarkdown(\n text: string,\n selectionStart: number,\n selectionEnd: number,\n before: string,\n after: string\n): { text: string; cursorPosition: number } {\n const selectedText = text.slice(selectionStart, selectionEnd)\n const beforeText = text.slice(0, selectionStart)\n const afterText = text.slice(selectionEnd)\n\n const newText = beforeText + before + selectedText + after + afterText\n const cursorPosition = selectionStart + before.length + selectedText.length + after.length\n\n return { text: newText, cursorPosition }\n}\n","\"use client\"\n\nimport React, { useCallback } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { insertMarkdown } from './utils/markdown'\nimport type { ToolbarItem } from './types'\n\n/**\n * BlogEditorToolbar Props\n */\nexport interface BlogEditorToolbarProps {\n /** textarea ref / textarea reference */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * 툴바 아이템 정의 / Toolbar item definitions\n */\nconst TOOLBAR_ITEMS: ToolbarItem[] = [\n {\n icon: 'bold',\n label: 'bold',\n markdown: { before: '**', after: '**' },\n shortcut: 'Ctrl+B',\n },\n {\n icon: 'italic',\n label: 'italic',\n markdown: { before: '*', after: '*' },\n shortcut: 'Ctrl+I',\n },\n {\n icon: 'strikethrough',\n label: 'strikethrough',\n markdown: { before: '~~', after: '~~' },\n },\n {\n icon: 'heading',\n label: 'heading',\n markdown: { before: '## ', after: '' },\n },\n {\n icon: 'link',\n label: 'link',\n markdown: { before: '[', after: '](url)' },\n shortcut: 'Ctrl+K',\n },\n {\n icon: 'image',\n label: 'image',\n markdown: { before: '![alt](', after: ')' },\n },\n {\n icon: 'code',\n label: 'code',\n markdown: { before: '`', after: '`' },\n },\n {\n icon: 'fileCode',\n label: 'codeBlock',\n markdown: { before: '```\\n', after: '\\n```' },\n },\n {\n icon: 'quote',\n label: 'quote',\n markdown: { before: '> ', after: '' },\n },\n {\n icon: 'list',\n label: 'list',\n markdown: { before: '- ', after: '' },\n },\n {\n icon: 'listOrdered',\n label: 'orderedList',\n markdown: { before: '1. ', after: '' },\n },\n {\n icon: 'minus',\n label: 'horizontalRule',\n markdown: { before: '\\n---\\n', after: '' },\n },\n]\n\n/**\n * BlogEditorToolbar 컴포넌트\n * 마크다운 포맷팅 툴바\n */\nconst BlogEditorToolbar = React.forwardRef<HTMLDivElement, BlogEditorToolbarProps>(\n ({ textareaRef, className }, ref) => {\n const { labels, activeLanguage, updateMultilingualField, formData, features } = useBlogEditor()\n\n const handleInsert = useCallback(\n (item: ToolbarItem) => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n const { selectionStart, selectionEnd } = textarea\n const currentContent = formData.content[activeLanguage] || ''\n\n const { text: newText, cursorPosition } = insertMarkdown(\n currentContent,\n selectionStart,\n selectionEnd,\n item.markdown.before,\n item.markdown.after\n )\n\n updateMultilingualField('content', activeLanguage, newText)\n\n // 커서 위치 복원\n requestAnimationFrame(() => {\n textarea.focus()\n textarea.setSelectionRange(cursorPosition, cursorPosition)\n })\n },\n [textareaRef, formData, activeLanguage, updateMultilingualField]\n )\n\n if (!features.enableMarkdownToolbar) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'flex flex-wrap gap-1 px-4 py-2 border-b border-border bg-muted',\n className\n )}\n role=\"toolbar\"\n aria-label=\"마크다운 서식\"\n >\n {TOOLBAR_ITEMS.map((item) => (\n <button\n key={item.icon}\n type=\"button\"\n onClick={() => handleInsert(item)}\n className=\"p-2 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\n title={`${labels[item.label as keyof typeof labels] || item.label}${item.shortcut ? ` (${item.shortcut})` : ''}`}\n aria-label={labels[item.label as keyof typeof labels] || item.label}\n >\n <Icon name={item.icon as Parameters<typeof Icon>[0]['name']} size={16} />\n </button>\n ))}\n </div>\n )\n }\n)\n\nBlogEditorToolbar.displayName = 'BlogEditorToolbar'\n\nexport { BlogEditorToolbar }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { useBlogEditor } from './BlogEditorContext'\nimport { parseMarkdown } from './utils/markdown'\n\n/**\n * BlogEditorPreview Props\n */\nexport interface BlogEditorPreviewProps {\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorPreview 컴포넌트\n * 마크다운 미리보기\n */\nconst BlogEditorPreview = React.forwardRef<HTMLDivElement, BlogEditorPreviewProps>(\n ({ renderMarkdown, className }, ref) => {\n const { formData, activeLanguage, languages, labels } = useBlogEditor()\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n\n // 현재 언어의 콘텐츠, 없으면 기본 언어 콘텐츠\n const title = formData.title[activeLanguage] || formData.title[primaryLanguage] || labels.noTitle\n const content = formData.content[activeLanguage] || formData.content[primaryLanguage] || ''\n\n // 마크다운 렌더링\n const renderedContent = React.useMemo(() => {\n if (renderMarkdown) {\n return renderMarkdown(content)\n }\n // 기본 마크다운 파서 사용\n return (\n <div\n dangerouslySetInnerHTML={{ __html: parseMarkdown(content) }}\n />\n )\n }, [content, renderMarkdown])\n\n return (\n <div ref={ref} className={merge('p-6', className)}>\n <h3 className=\"text-xl font-bold text-foreground mb-4\">\n {title}\n </h3>\n <div className=\"prose dark:prose-invert max-w-none\">\n {renderedContent}\n </div>\n </div>\n )\n }\n)\n\nBlogEditorPreview.displayName = 'BlogEditorPreview'\n\nexport { BlogEditorPreview }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorActions Props\n */\nexport interface BlogEditorActionsProps {\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorActions 컴포넌트\n * 저장/발행/취소 버튼\n */\nconst BlogEditorActions = React.forwardRef<HTMLDivElement, BlogEditorActionsProps>(\n ({ cancelLink, className }, ref) => {\n const { labels, submitting, handleSave, handleCancel, isEditMode, autoSaveStatus, features } = useBlogEditor()\n\n return (\n <div\n ref={ref}\n className={merge('flex items-center justify-end gap-3', className)}\n >\n {/* 자동저장 상태 */}\n {features.enableAutoSave && autoSaveStatus !== 'idle' && (\n <span className=\"text-sm text-muted-foreground flex items-center gap-1\">\n {autoSaveStatus === 'saving' && (\n <>\n <Icon name=\"loader\" size={14} spin />\n 저장 중...\n </>\n )}\n {autoSaveStatus === 'saved' && (\n <>\n <Icon name=\"check\" size={14} />\n 자동저장됨\n </>\n )}\n </span>\n )}\n\n {/* 취소 */}\n {cancelLink || (\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"px-4 py-2 text-foreground hover:text-foreground transition-colors\"\n >\n {labels.cancel}\n </button>\n )}\n\n {/* 임시저장 */}\n <button\n type=\"button\"\n onClick={() => handleSave(false)}\n disabled={submitting}\n className=\"px-4 py-2 border border-border rounded-lg hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {labels.saveDraft}\n </button>\n\n {/* 발행/수정 */}\n <button\n type=\"button\"\n onClick={() => handleSave(true)}\n disabled={submitting}\n className=\"px-6 py-2 bg-primary text-white rounded-lg hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center gap-2 transition-colors\"\n >\n {submitting ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.saving}\n </>\n ) : (\n <>\n <Icon name=\"check\" size={16} />\n {isEditMode ? labels.update : labels.publish}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorActions.displayName = 'BlogEditorActions'\n\nexport { BlogEditorActions }\n","\"use client\"\n\nimport React from 'react'\nimport { merge } from '../../../lib/utils'\nimport { Icon } from '../../Icon'\nimport { useBlogEditor } from './BlogEditorContext'\n\n/**\n * BlogEditorTranslate Props\n */\nexport interface BlogEditorTranslateProps {\n /** 힌트 메시지 오버라이드 / Hint message override */\n hint?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n}\n\n/**\n * BlogEditorTranslate 컴포넌트\n * AI 번역 버튼\n */\nconst BlogEditorTranslate = React.forwardRef<HTMLDivElement, BlogEditorTranslateProps>(\n ({ hint, className }, ref) => {\n const {\n labels,\n translating,\n translateSuccess,\n handleTranslate,\n formData,\n languages,\n features,\n } = useBlogEditor()\n\n if (!features.enableTranslation) {\n return null\n }\n\n const primaryLanguage = languages.find((l) => l.isPrimary)?.key || languages[0]?.key\n const primaryTitle = formData.title[primaryLanguage] || ''\n const primaryContent = formData.content[primaryLanguage] || ''\n const canTranslate = primaryTitle && primaryContent\n\n return (\n <div\n ref={ref}\n className={merge(\n 'px-6 py-3 bg-muted border-b border-border flex items-center justify-between',\n className\n )}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Icon name=\"sparkles\" size={16} />\n <span>{hint || labels.translateHint}</span>\n </div>\n <button\n type=\"button\"\n onClick={handleTranslate}\n disabled={translating || !canTranslate}\n className={merge(\n 'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',\n translateSuccess\n ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n : 'bg-primary text-white hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n {translating ? (\n <>\n <Icon name=\"loader\" size={16} spin />\n {labels.translating}\n </>\n ) : translateSuccess ? (\n <>\n <Icon name=\"check\" size={16} />\n {labels.translateSuccess}\n </>\n ) : (\n <>\n <Icon name=\"sparkles\" size={16} />\n {labels.translateButton}\n </>\n )}\n </button>\n </div>\n )\n }\n)\n\nBlogEditorTranslate.displayName = 'BlogEditorTranslate'\n\nexport { BlogEditorTranslate }\n","\"use client\"\n\nimport React, { useRef } from 'react'\nimport { merge } from '../../../lib/utils'\nimport { BlogEditorProvider, useBlogEditor } from './BlogEditorContext'\nimport { BlogEditorHeader, type BlogEditorHeaderProps } from './BlogEditorHeader'\nimport { BlogEditorMetadata, type BlogEditorMetadataProps } from './BlogEditorMetadata'\nimport { BlogEditorLanguageTabs, type BlogEditorLanguageTabsProps } from './BlogEditorLanguageTabs'\nimport { BlogEditorContent, type BlogEditorContentProps } from './BlogEditorContent'\nimport { BlogEditorToolbar, type BlogEditorToolbarProps } from './BlogEditorToolbar'\nimport { BlogEditorPreview, type BlogEditorPreviewProps } from './BlogEditorPreview'\nimport { BlogEditorActions, type BlogEditorActionsProps } from './BlogEditorActions'\nimport { BlogEditorTranslate, type BlogEditorTranslateProps } from './BlogEditorTranslate'\nimport type { BlogEditorProps } from './types'\n\n/**\n * BlogEditorRoot Props (내부 컴포넌트)\n */\ninterface BlogEditorRootProps {\n /** 뒤로가기 콜백 / Back navigation callback */\n onBack?: () => void\n /** 뒤로가기 링크 컴포넌트 / Back link component */\n backLink?: React.ReactNode\n /** 취소 링크 컴포넌트 / Cancel link component */\n cancelLink?: React.ReactNode\n /** 커스텀 마크다운 렌더러 / Custom markdown renderer */\n renderMarkdown?: (content: string) => React.ReactNode\n /** AI 번역 힌트 / AI translation hint */\n translateHint?: string\n /** 최대 너비 / Max width */\n maxWidth?: string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 자식 요소 / Children */\n children?: React.ReactNode\n}\n\n/**\n * BlogEditorRoot 내부 컴포넌트\n * 기본 레이아웃 제공\n */\nfunction BlogEditorRoot({\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth = 'max-w-4xl',\n className,\n children,\n}: BlogEditorRootProps) {\n const { showPreview, error, variant, features } = useBlogEditor()\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const containerClasses = merge(\n variant === 'glass'\n ? 'bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-900 dark:to-gray-800'\n : variant === 'minimal'\n ? ''\n : 'bg-muted'\n )\n\n const contentContainerClasses = merge(\n 'rounded-xl overflow-hidden',\n variant === 'glass'\n ? 'bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/20 dark:border-slate-700/50'\n : variant === 'minimal'\n ? 'bg-transparent border border-border'\n : 'bg-background'\n )\n\n // 커스텀 자식 요소가 있으면 그걸 렌더링\n if (children) {\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {children}\n </div>\n </div>\n )\n }\n\n // 기본 레이아웃\n return (\n <div className={merge(containerClasses, className)}>\n <div className={merge(maxWidth, 'mx-auto px-4 py-8')}>\n {/* 헤더 */}\n <BlogEditorHeader onBack={onBack} backLink={backLink} />\n\n {/* 에러 메시지 */}\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 rounded-lg text-red-600 dark:text-red-400\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* 메타데이터 */}\n <BlogEditorMetadata />\n\n {/* 콘텐츠 영역 */}\n <div className={contentContainerClasses}>\n {/* AI 번역 */}\n {features.enableTranslation && (\n <BlogEditorTranslate hint={translateHint} />\n )}\n\n {/* 언어 탭 */}\n <BlogEditorLanguageTabs />\n\n {/* 툴바 & 콘텐츠 */}\n {showPreview ? (\n <BlogEditorPreview renderMarkdown={renderMarkdown} />\n ) : (\n <>\n {features.enableMarkdownToolbar && (\n <BlogEditorToolbar textareaRef={textareaRef} />\n )}\n <BlogEditorContent textareaRef={textareaRef} />\n </>\n )}\n </div>\n\n {/* 액션 버튼 */}\n <BlogEditorActions cancelLink={cancelLink} />\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * BlogEditor 컴포넌트\n *\n * 다국어 블로그 에디터 컴포넌트\n * Compound component 패턴으로 유연한 커스터마이징 지원\n *\n * @example\n * ```tsx\n * // 기본 사용\n * <BlogEditor\n * callbacks={{\n * onSave: async (data, publish) => { ... },\n * onCancel: () => router.back(),\n * }}\n * />\n *\n * // 커스텀 레이아웃\n * <BlogEditor callbacks={...}>\n * <BlogEditor.Header backLink={<Link href=\"/admin\">Back</Link>} />\n * <BlogEditor.Metadata />\n * <BlogEditor.LanguageTabs />\n * <BlogEditor.Content />\n * <BlogEditor.Actions />\n * </BlogEditor>\n * ```\n */\nconst BlogEditor = React.forwardRef<\n HTMLDivElement,\n BlogEditorProps & BlogEditorRootProps\n>(\n (\n {\n // BlogEditorProps\n initialData,\n isEditMode,\n languages,\n defaultLanguage,\n labels,\n callbacks,\n features,\n variant,\n\n // BlogEditorRootProps\n onBack,\n backLink,\n cancelLink,\n renderMarkdown,\n translateHint,\n maxWidth,\n className,\n children,\n\n // Auto-save\n autoSaveKey,\n autoSaveInterval,\n },\n ref\n ) => {\n return (\n <BlogEditorProvider\n initialData={initialData}\n isEditMode={isEditMode}\n languages={languages}\n defaultLanguage={defaultLanguage}\n labels={labels}\n callbacks={callbacks}\n features={features}\n variant={variant}\n autoSaveKey={autoSaveKey}\n autoSaveInterval={autoSaveInterval}\n >\n <div ref={ref}>\n <BlogEditorRoot\n onBack={onBack}\n backLink={backLink}\n cancelLink={cancelLink}\n renderMarkdown={renderMarkdown}\n translateHint={translateHint}\n maxWidth={maxWidth}\n className={className}\n >\n {children}\n </BlogEditorRoot>\n </div>\n </BlogEditorProvider>\n )\n }\n)\n\nBlogEditor.displayName = 'BlogEditor'\n\n// Compound component exports\nconst BlogEditorCompound = BlogEditor as typeof BlogEditor & {\n Header: typeof BlogEditorHeader\n Metadata: typeof BlogEditorMetadata\n LanguageTabs: typeof BlogEditorLanguageTabs\n Content: typeof BlogEditorContent\n Toolbar: typeof BlogEditorToolbar\n Preview: typeof BlogEditorPreview\n Actions: typeof BlogEditorActions\n Translate: typeof BlogEditorTranslate\n}\n\nBlogEditorCompound.Header = BlogEditorHeader\nBlogEditorCompound.Metadata = BlogEditorMetadata\nBlogEditorCompound.LanguageTabs = BlogEditorLanguageTabs\nBlogEditorCompound.Content = BlogEditorContent\nBlogEditorCompound.Toolbar = BlogEditorToolbar\nBlogEditorCompound.Preview = BlogEditorPreview\nBlogEditorCompound.Actions = BlogEditorActions\nBlogEditorCompound.Translate = BlogEditorTranslate\n\nexport { BlogEditorCompound as BlogEditor }\n\n// 개별 컴포넌트도 export\nexport {\n BlogEditorHeader,\n BlogEditorMetadata,\n BlogEditorLanguageTabs,\n BlogEditorContent,\n BlogEditorToolbar,\n BlogEditorPreview,\n BlogEditorActions,\n BlogEditorTranslate,\n}\n\n// 타입 export\nexport type {\n BlogEditorHeaderProps,\n BlogEditorMetadataProps,\n BlogEditorLanguageTabsProps,\n BlogEditorContentProps,\n BlogEditorToolbarProps,\n BlogEditorPreviewProps,\n BlogEditorActionsProps,\n BlogEditorTranslateProps,\n}\n"]}