telva 1.0.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 (587) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +298 -0
  3. package/dist/Telva.d.ts +98 -0
  4. package/dist/Telva.d.ts.map +1 -0
  5. package/dist/components/CenterToolbar/CenterToolbar.d.ts +3 -0
  6. package/dist/components/CenterToolbar/CenterToolbar.d.ts.map +1 -0
  7. package/dist/components/CenterToolbar/index.d.ts +2 -0
  8. package/dist/components/CenterToolbar/index.d.ts.map +1 -0
  9. package/dist/components/ContextMenu/ContextMenu.d.ts +18 -0
  10. package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -0
  11. package/dist/components/ContextMenu/index.d.ts +2 -0
  12. package/dist/components/ContextMenu/index.d.ts.map +1 -0
  13. package/dist/components/ErrorFallback/ErrorFallback.d.ts +3 -0
  14. package/dist/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  15. package/dist/components/ErrorFallback/index.d.ts +2 -0
  16. package/dist/components/ErrorFallback/index.d.ts.map +1 -0
  17. package/dist/components/FocusButton/FocusButton.d.ts +6 -0
  18. package/dist/components/FocusButton/FocusButton.d.ts.map +1 -0
  19. package/dist/components/FocusButton/index.d.ts +2 -0
  20. package/dist/components/FocusButton/index.d.ts.map +1 -0
  21. package/dist/components/LeftPanel/ComponentsTab.d.ts +7 -0
  22. package/dist/components/LeftPanel/ComponentsTab.d.ts.map +1 -0
  23. package/dist/components/LeftPanel/LayersPanel.d.ts +3 -0
  24. package/dist/components/LeftPanel/LayersPanel.d.ts.map +1 -0
  25. package/dist/components/LeftPanel/LeftPanel.d.ts +3 -0
  26. package/dist/components/LeftPanel/LeftPanel.d.ts.map +1 -0
  27. package/dist/components/LeftPanel/index.d.ts +3 -0
  28. package/dist/components/LeftPanel/index.d.ts.map +1 -0
  29. package/dist/components/Loading/Loading.d.ts +2 -0
  30. package/dist/components/Loading/Loading.d.ts.map +1 -0
  31. package/dist/components/Loading/index.d.ts +2 -0
  32. package/dist/components/Loading/index.d.ts.map +1 -0
  33. package/dist/components/Primitives/AlertDialog/AlertDialog.d.ts +665 -0
  34. package/dist/components/Primitives/AlertDialog/AlertDialog.d.ts.map +1 -0
  35. package/dist/components/Primitives/AlertDialog/FilenameDialog.d.ts +7 -0
  36. package/dist/components/Primitives/AlertDialog/FilenameDialog.d.ts.map +1 -0
  37. package/dist/components/Primitives/AlertDialog/index.d.ts +3 -0
  38. package/dist/components/Primitives/AlertDialog/index.d.ts.map +1 -0
  39. package/dist/components/Primitives/Divider/Divider.d.ts +217 -0
  40. package/dist/components/Primitives/Divider/Divider.d.ts.map +1 -0
  41. package/dist/components/Primitives/Divider/index.d.ts +2 -0
  42. package/dist/components/Primitives/Divider/index.d.ts.map +1 -0
  43. package/dist/components/Primitives/DropdownMenu/DMCheckboxItem.d.ts +15 -0
  44. package/dist/components/Primitives/DropdownMenu/DMCheckboxItem.d.ts.map +1 -0
  45. package/dist/components/Primitives/DropdownMenu/DMContent.d.ts +450 -0
  46. package/dist/components/Primitives/DropdownMenu/DMContent.d.ts.map +1 -0
  47. package/dist/components/Primitives/DropdownMenu/DMDivider.d.ts +217 -0
  48. package/dist/components/Primitives/DropdownMenu/DMDivider.d.ts.map +1 -0
  49. package/dist/components/Primitives/DropdownMenu/DMItem.d.ts +6 -0
  50. package/dist/components/Primitives/DropdownMenu/DMItem.d.ts.map +1 -0
  51. package/dist/components/Primitives/DropdownMenu/DMRadioItem.d.ts +220 -0
  52. package/dist/components/Primitives/DropdownMenu/DMRadioItem.d.ts.map +1 -0
  53. package/dist/components/Primitives/DropdownMenu/DMSubMenu.d.ts +11 -0
  54. package/dist/components/Primitives/DropdownMenu/DMSubMenu.d.ts.map +1 -0
  55. package/dist/components/Primitives/DropdownMenu/DMTriggerIcon.d.ts +9 -0
  56. package/dist/components/Primitives/DropdownMenu/DMTriggerIcon.d.ts.map +1 -0
  57. package/dist/components/Primitives/DropdownMenu/index.d.ts +8 -0
  58. package/dist/components/Primitives/DropdownMenu/index.d.ts.map +1 -0
  59. package/dist/components/Primitives/IconButton/IconButton.d.ts +221 -0
  60. package/dist/components/Primitives/IconButton/IconButton.d.ts.map +1 -0
  61. package/dist/components/Primitives/IconButton/index.d.ts +2 -0
  62. package/dist/components/Primitives/IconButton/index.d.ts.map +1 -0
  63. package/dist/components/Primitives/Kbd/Kbd.d.ts +223 -0
  64. package/dist/components/Primitives/Kbd/Kbd.d.ts.map +1 -0
  65. package/dist/components/Primitives/Kbd/index.d.ts +2 -0
  66. package/dist/components/Primitives/Kbd/index.d.ts.map +1 -0
  67. package/dist/components/Primitives/MenuContent/MenuContent.d.ts +220 -0
  68. package/dist/components/Primitives/MenuContent/MenuContent.d.ts.map +1 -0
  69. package/dist/components/Primitives/MenuContent/index.d.ts +2 -0
  70. package/dist/components/Primitives/MenuContent/index.d.ts.map +1 -0
  71. package/dist/components/Primitives/Panel/Panel.d.ts +219 -0
  72. package/dist/components/Primitives/Panel/Panel.d.ts.map +1 -0
  73. package/dist/components/Primitives/Panel/index.d.ts +2 -0
  74. package/dist/components/Primitives/Panel/index.d.ts.map +1 -0
  75. package/dist/components/Primitives/RowButton/RowButton.d.ts +237 -0
  76. package/dist/components/Primitives/RowButton/RowButton.d.ts.map +1 -0
  77. package/dist/components/Primitives/RowButton/index.d.ts +2 -0
  78. package/dist/components/Primitives/RowButton/index.d.ts.map +1 -0
  79. package/dist/components/Primitives/SmallIcon/SmallIcon.d.ts +217 -0
  80. package/dist/components/Primitives/SmallIcon/SmallIcon.d.ts.map +1 -0
  81. package/dist/components/Primitives/SmallIcon/index.d.ts +2 -0
  82. package/dist/components/Primitives/SmallIcon/index.d.ts.map +1 -0
  83. package/dist/components/Primitives/TextField/TextField.d.ts +6 -0
  84. package/dist/components/Primitives/TextField/TextField.d.ts.map +1 -0
  85. package/dist/components/Primitives/TextField/index.d.ts +2 -0
  86. package/dist/components/Primitives/TextField/index.d.ts.map +1 -0
  87. package/dist/components/Primitives/ToolButton/ToolButton.d.ts +459 -0
  88. package/dist/components/Primitives/ToolButton/ToolButton.d.ts.map +1 -0
  89. package/dist/components/Primitives/ToolButton/index.d.ts +2 -0
  90. package/dist/components/Primitives/ToolButton/index.d.ts.map +1 -0
  91. package/dist/components/Primitives/Tooltip/Tooltip.d.ts +11 -0
  92. package/dist/components/Primitives/Tooltip/Tooltip.d.ts.map +1 -0
  93. package/dist/components/Primitives/Tooltip/index.d.ts +2 -0
  94. package/dist/components/Primitives/Tooltip/index.d.ts.map +1 -0
  95. package/dist/components/Primitives/icons/BoxIcon.d.ts +6 -0
  96. package/dist/components/Primitives/icons/BoxIcon.d.ts.map +1 -0
  97. package/dist/components/Primitives/icons/CircleIcon.d.ts +5 -0
  98. package/dist/components/Primitives/icons/CircleIcon.d.ts.map +1 -0
  99. package/dist/components/Primitives/icons/DashDashedIcon.d.ts +2 -0
  100. package/dist/components/Primitives/icons/DashDashedIcon.d.ts.map +1 -0
  101. package/dist/components/Primitives/icons/DashDottedIcon.d.ts +2 -0
  102. package/dist/components/Primitives/icons/DashDottedIcon.d.ts.map +1 -0
  103. package/dist/components/Primitives/icons/DashDrawIcon.d.ts +2 -0
  104. package/dist/components/Primitives/icons/DashDrawIcon.d.ts.map +1 -0
  105. package/dist/components/Primitives/icons/DashSolidIcon.d.ts +2 -0
  106. package/dist/components/Primitives/icons/DashSolidIcon.d.ts.map +1 -0
  107. package/dist/components/Primitives/icons/DiscordIcon.d.ts +2 -0
  108. package/dist/components/Primitives/icons/DiscordIcon.d.ts.map +1 -0
  109. package/dist/components/Primitives/icons/EraserIcon.d.ts +2 -0
  110. package/dist/components/Primitives/icons/EraserIcon.d.ts.map +1 -0
  111. package/dist/components/Primitives/icons/LineIcon.d.ts +2 -0
  112. package/dist/components/Primitives/icons/LineIcon.d.ts.map +1 -0
  113. package/dist/components/Primitives/icons/MultiplayerIcon2.d.ts +2 -0
  114. package/dist/components/Primitives/icons/MultiplayerIcon2.d.ts.map +1 -0
  115. package/dist/components/Primitives/icons/SizeLargeIcon.d.ts +3 -0
  116. package/dist/components/Primitives/icons/SizeLargeIcon.d.ts.map +1 -0
  117. package/dist/components/Primitives/icons/SizeMediumIcon.d.ts +3 -0
  118. package/dist/components/Primitives/icons/SizeMediumIcon.d.ts.map +1 -0
  119. package/dist/components/Primitives/icons/SizeSmallIcon.d.ts +3 -0
  120. package/dist/components/Primitives/icons/SizeSmallIcon.d.ts.map +1 -0
  121. package/dist/components/Primitives/icons/TrashIcon.d.ts +3 -0
  122. package/dist/components/Primitives/icons/TrashIcon.d.ts.map +1 -0
  123. package/dist/components/Primitives/icons/UndoIcon.d.ts +5 -0
  124. package/dist/components/Primitives/icons/UndoIcon.d.ts.map +1 -0
  125. package/dist/components/Primitives/icons/index.d.ts +15 -0
  126. package/dist/components/Primitives/icons/index.d.ts.map +1 -0
  127. package/dist/components/RightPanel/ColorPicker.d.ts +27 -0
  128. package/dist/components/RightPanel/ColorPicker.d.ts.map +1 -0
  129. package/dist/components/RightPanel/DraggableInput.d.ts +15 -0
  130. package/dist/components/RightPanel/DraggableInput.d.ts.map +1 -0
  131. package/dist/components/RightPanel/GradientPicker.d.ts +22 -0
  132. package/dist/components/RightPanel/GradientPicker.d.ts.map +1 -0
  133. package/dist/components/RightPanel/PropertiesPanel.d.ts +3 -0
  134. package/dist/components/RightPanel/PropertiesPanel.d.ts.map +1 -0
  135. package/dist/components/RightPanel/RightPanel.d.ts +3 -0
  136. package/dist/components/RightPanel/RightPanel.d.ts.map +1 -0
  137. package/dist/components/RightPanel/googleFonts.d.ts +39 -0
  138. package/dist/components/RightPanel/googleFonts.d.ts.map +1 -0
  139. package/dist/components/RightPanel/index.d.ts +6 -0
  140. package/dist/components/RightPanel/index.d.ts.map +1 -0
  141. package/dist/components/ToolsPanel/ActionButton.d.ts +218 -0
  142. package/dist/components/ToolsPanel/ActionButton.d.ts.map +1 -0
  143. package/dist/components/ToolsPanel/BackToContent.d.ts +3 -0
  144. package/dist/components/ToolsPanel/BackToContent.d.ts.map +1 -0
  145. package/dist/components/ToolsPanel/DeleteButton.d.ts +2 -0
  146. package/dist/components/ToolsPanel/DeleteButton.d.ts.map +1 -0
  147. package/dist/components/ToolsPanel/HelpPanel.d.ts +438 -0
  148. package/dist/components/ToolsPanel/HelpPanel.d.ts.map +1 -0
  149. package/dist/components/ToolsPanel/KeyboardShortcutDialog.d.ts +4 -0
  150. package/dist/components/ToolsPanel/KeyboardShortcutDialog.d.ts.map +1 -0
  151. package/dist/components/ToolsPanel/LockButton.d.ts +2 -0
  152. package/dist/components/ToolsPanel/LockButton.d.ts.map +1 -0
  153. package/dist/components/ToolsPanel/PrimaryTools.d.ts +3 -0
  154. package/dist/components/ToolsPanel/PrimaryTools.d.ts.map +1 -0
  155. package/dist/components/ToolsPanel/ShapesMenu.d.ts +9 -0
  156. package/dist/components/ToolsPanel/ShapesMenu.d.ts.map +1 -0
  157. package/dist/components/ToolsPanel/StatusBar.d.ts +2 -0
  158. package/dist/components/ToolsPanel/StatusBar.d.ts.map +1 -0
  159. package/dist/components/ToolsPanel/ToolsPanel.d.ts +7 -0
  160. package/dist/components/ToolsPanel/ToolsPanel.d.ts.map +1 -0
  161. package/dist/components/ToolsPanel/index.d.ts +2 -0
  162. package/dist/components/ToolsPanel/index.d.ts.map +1 -0
  163. package/dist/components/TopPanel/LanguageMenu/LanguageMenu.d.ts +2 -0
  164. package/dist/components/TopPanel/LanguageMenu/LanguageMenu.d.ts.map +1 -0
  165. package/dist/components/TopPanel/Menu/Menu.d.ts +7 -0
  166. package/dist/components/TopPanel/Menu/Menu.d.ts.map +1 -0
  167. package/dist/components/TopPanel/Menu/index.d.ts +1 -0
  168. package/dist/components/TopPanel/Menu/index.d.ts.map +1 -0
  169. package/dist/components/TopPanel/MultiplayerMenu/MultiplayerMenu.d.ts +2 -0
  170. package/dist/components/TopPanel/MultiplayerMenu/MultiplayerMenu.d.ts.map +1 -0
  171. package/dist/components/TopPanel/MultiplayerMenu/index.d.ts +2 -0
  172. package/dist/components/TopPanel/MultiplayerMenu/index.d.ts.map +1 -0
  173. package/dist/components/TopPanel/PageMenu/PageMenu.d.ts +219 -0
  174. package/dist/components/TopPanel/PageMenu/PageMenu.d.ts.map +1 -0
  175. package/dist/components/TopPanel/PageMenu/index.d.ts +2 -0
  176. package/dist/components/TopPanel/PageMenu/index.d.ts.map +1 -0
  177. package/dist/components/TopPanel/PageOptionsDialog/PageOptionsDialog.d.ts +443 -0
  178. package/dist/components/TopPanel/PageOptionsDialog/PageOptionsDialog.d.ts.map +1 -0
  179. package/dist/components/TopPanel/PageOptionsDialog/index.d.ts +2 -0
  180. package/dist/components/TopPanel/PageOptionsDialog/index.d.ts.map +1 -0
  181. package/dist/components/TopPanel/PreferencesMenu/PreferencesMenu.d.ts +2 -0
  182. package/dist/components/TopPanel/PreferencesMenu/PreferencesMenu.d.ts.map +1 -0
  183. package/dist/components/TopPanel/PreferencesMenu/index.d.ts +2 -0
  184. package/dist/components/TopPanel/PreferencesMenu/index.d.ts.map +1 -0
  185. package/dist/components/TopPanel/StyleMenu/StyleMenu.d.ts +221 -0
  186. package/dist/components/TopPanel/StyleMenu/StyleMenu.d.ts.map +1 -0
  187. package/dist/components/TopPanel/StyleMenu/index.d.ts +2 -0
  188. package/dist/components/TopPanel/StyleMenu/index.d.ts.map +1 -0
  189. package/dist/components/TopPanel/TopPanel.d.ts +13 -0
  190. package/dist/components/TopPanel/TopPanel.d.ts.map +1 -0
  191. package/dist/components/TopPanel/ZoomMenu/ZoomMenu.d.ts +2 -0
  192. package/dist/components/TopPanel/ZoomMenu/ZoomMenu.d.ts.map +1 -0
  193. package/dist/components/TopPanel/ZoomMenu/index.d.ts +2 -0
  194. package/dist/components/TopPanel/ZoomMenu/index.d.ts.map +1 -0
  195. package/dist/components/TopPanel/index.d.ts +2 -0
  196. package/dist/components/TopPanel/index.d.ts.map +1 -0
  197. package/dist/components/breakpoints.d.ts +2 -0
  198. package/dist/components/breakpoints.d.ts.map +1 -0
  199. package/dist/components/preventEvent.d.ts +2 -0
  200. package/dist/components/preventEvent.d.ts.map +1 -0
  201. package/dist/components/stopPropagation.d.ts +3 -0
  202. package/dist/components/stopPropagation.d.ts.map +1 -0
  203. package/dist/constants.d.ts +25 -0
  204. package/dist/constants.d.ts.map +1 -0
  205. package/dist/hooks/index.d.ts +8 -0
  206. package/dist/hooks/index.d.ts.map +1 -0
  207. package/dist/hooks/useCursor.d.ts +3 -0
  208. package/dist/hooks/useCursor.d.ts.map +1 -0
  209. package/dist/hooks/useDialog.d.ts +14 -0
  210. package/dist/hooks/useDialog.d.ts.map +1 -0
  211. package/dist/hooks/useFileSystem.d.ts +10 -0
  212. package/dist/hooks/useFileSystem.d.ts.map +1 -0
  213. package/dist/hooks/useFileSystemHandlers.d.ts +9 -0
  214. package/dist/hooks/useFileSystemHandlers.d.ts.map +1 -0
  215. package/dist/hooks/useKeyboardShortcuts.d.ts +3 -0
  216. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  217. package/dist/hooks/useTelvaApp.d.ts +7 -0
  218. package/dist/hooks/useTelvaApp.d.ts.map +1 -0
  219. package/dist/hooks/useTheme.d.ts +6 -0
  220. package/dist/hooks/useTheme.d.ts.map +1 -0
  221. package/dist/hooks/useTranslation.d.ts +3 -0
  222. package/dist/hooks/useTranslation.d.ts.map +1 -0
  223. package/dist/index.d.ts +8 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +39 -0
  226. package/dist/index.js.map +7 -0
  227. package/dist/index.mjs +30157 -0
  228. package/dist/index.mjs.map +7 -0
  229. package/dist/state/IdbClipboard.d.ts +4 -0
  230. package/dist/state/IdbClipboard.d.ts.map +1 -0
  231. package/dist/state/StateManager/StateManager.d.ts +197 -0
  232. package/dist/state/StateManager/StateManager.d.ts.map +1 -0
  233. package/dist/state/StateManager/copy.d.ts +9 -0
  234. package/dist/state/StateManager/copy.d.ts.map +1 -0
  235. package/dist/state/StateManager/index.d.ts +2 -0
  236. package/dist/state/StateManager/index.d.ts.map +1 -0
  237. package/dist/state/TVDR.d.ts +79 -0
  238. package/dist/state/TVDR.d.ts.map +1 -0
  239. package/dist/state/TelvaApp.d.ts +968 -0
  240. package/dist/state/TelvaApp.d.ts.map +1 -0
  241. package/dist/state/commands/alignShapes/alignShapes.d.ts +4 -0
  242. package/dist/state/commands/alignShapes/alignShapes.d.ts.map +1 -0
  243. package/dist/state/commands/alignShapes/index.d.ts +2 -0
  244. package/dist/state/commands/alignShapes/index.d.ts.map +1 -0
  245. package/dist/state/commands/changePage/changePage.d.ts +4 -0
  246. package/dist/state/commands/changePage/changePage.d.ts.map +1 -0
  247. package/dist/state/commands/changePage/index.d.ts +2 -0
  248. package/dist/state/commands/changePage/index.d.ts.map +1 -0
  249. package/dist/state/commands/createPage/createPage.d.ts +4 -0
  250. package/dist/state/commands/createPage/createPage.d.ts.map +1 -0
  251. package/dist/state/commands/createPage/index.d.ts +2 -0
  252. package/dist/state/commands/createPage/index.d.ts.map +1 -0
  253. package/dist/state/commands/createShapes/createShapes.d.ts +4 -0
  254. package/dist/state/commands/createShapes/createShapes.d.ts.map +1 -0
  255. package/dist/state/commands/createShapes/index.d.ts +2 -0
  256. package/dist/state/commands/createShapes/index.d.ts.map +1 -0
  257. package/dist/state/commands/deletePage/deletePage.d.ts +4 -0
  258. package/dist/state/commands/deletePage/deletePage.d.ts.map +1 -0
  259. package/dist/state/commands/deletePage/index.d.ts +2 -0
  260. package/dist/state/commands/deletePage/index.d.ts.map +1 -0
  261. package/dist/state/commands/deleteShapes/deleteShapes.d.ts +4 -0
  262. package/dist/state/commands/deleteShapes/deleteShapes.d.ts.map +1 -0
  263. package/dist/state/commands/deleteShapes/index.d.ts +2 -0
  264. package/dist/state/commands/deleteShapes/index.d.ts.map +1 -0
  265. package/dist/state/commands/distributeShapes/distributeShapes.d.ts +4 -0
  266. package/dist/state/commands/distributeShapes/distributeShapes.d.ts.map +1 -0
  267. package/dist/state/commands/distributeShapes/index.d.ts +2 -0
  268. package/dist/state/commands/distributeShapes/index.d.ts.map +1 -0
  269. package/dist/state/commands/duplicatePage/duplicatePage.d.ts +4 -0
  270. package/dist/state/commands/duplicatePage/duplicatePage.d.ts.map +1 -0
  271. package/dist/state/commands/duplicatePage/index.d.ts +2 -0
  272. package/dist/state/commands/duplicatePage/index.d.ts.map +1 -0
  273. package/dist/state/commands/duplicateShapes/duplicateShapes.d.ts +4 -0
  274. package/dist/state/commands/duplicateShapes/duplicateShapes.d.ts.map +1 -0
  275. package/dist/state/commands/duplicateShapes/index.d.ts +2 -0
  276. package/dist/state/commands/duplicateShapes/index.d.ts.map +1 -0
  277. package/dist/state/commands/flipShapes/flipShapes.d.ts +5 -0
  278. package/dist/state/commands/flipShapes/flipShapes.d.ts.map +1 -0
  279. package/dist/state/commands/flipShapes/index.d.ts +2 -0
  280. package/dist/state/commands/flipShapes/index.d.ts.map +1 -0
  281. package/dist/state/commands/groupShapes/groupShapes.d.ts +4 -0
  282. package/dist/state/commands/groupShapes/groupShapes.d.ts.map +1 -0
  283. package/dist/state/commands/groupShapes/index.d.ts +2 -0
  284. package/dist/state/commands/groupShapes/index.d.ts.map +1 -0
  285. package/dist/state/commands/index.d.ts +27 -0
  286. package/dist/state/commands/index.d.ts.map +1 -0
  287. package/dist/state/commands/insertContent/index.d.ts +2 -0
  288. package/dist/state/commands/insertContent/index.d.ts.map +1 -0
  289. package/dist/state/commands/insertContent/insertContent.d.ts +12 -0
  290. package/dist/state/commands/insertContent/insertContent.d.ts.map +1 -0
  291. package/dist/state/commands/movePage/index.d.ts +2 -0
  292. package/dist/state/commands/movePage/index.d.ts.map +1 -0
  293. package/dist/state/commands/movePage/movePage.d.ts +4 -0
  294. package/dist/state/commands/movePage/movePage.d.ts.map +1 -0
  295. package/dist/state/commands/moveShapesToPage/index.d.ts +2 -0
  296. package/dist/state/commands/moveShapesToPage/index.d.ts.map +1 -0
  297. package/dist/state/commands/moveShapesToPage/moveShapesToPage.d.ts +5 -0
  298. package/dist/state/commands/moveShapesToPage/moveShapesToPage.d.ts.map +1 -0
  299. package/dist/state/commands/renamePage/index.d.ts +2 -0
  300. package/dist/state/commands/renamePage/index.d.ts.map +1 -0
  301. package/dist/state/commands/renamePage/renamePage.d.ts +4 -0
  302. package/dist/state/commands/renamePage/renamePage.d.ts.map +1 -0
  303. package/dist/state/commands/reorderShapes/index.d.ts +2 -0
  304. package/dist/state/commands/reorderShapes/index.d.ts.map +1 -0
  305. package/dist/state/commands/reorderShapes/reorderShapes.d.ts +4 -0
  306. package/dist/state/commands/reorderShapes/reorderShapes.d.ts.map +1 -0
  307. package/dist/state/commands/resetBounds/index.d.ts +2 -0
  308. package/dist/state/commands/resetBounds/index.d.ts.map +1 -0
  309. package/dist/state/commands/resetBounds/resetBounds.d.ts +4 -0
  310. package/dist/state/commands/resetBounds/resetBounds.d.ts.map +1 -0
  311. package/dist/state/commands/rotateShapes/index.d.ts +2 -0
  312. package/dist/state/commands/rotateShapes/index.d.ts.map +1 -0
  313. package/dist/state/commands/rotateShapes/rotateShapes.d.ts +4 -0
  314. package/dist/state/commands/rotateShapes/rotateShapes.d.ts.map +1 -0
  315. package/dist/state/commands/setShapesProps/index.d.ts +2 -0
  316. package/dist/state/commands/setShapesProps/index.d.ts.map +1 -0
  317. package/dist/state/commands/setShapesProps/setShapesProps.d.ts +4 -0
  318. package/dist/state/commands/setShapesProps/setShapesProps.d.ts.map +1 -0
  319. package/dist/state/commands/shared/getIncrementedName.d.ts +8 -0
  320. package/dist/state/commands/shared/getIncrementedName.d.ts.map +1 -0
  321. package/dist/state/commands/shared/index.d.ts +3 -0
  322. package/dist/state/commands/shared/index.d.ts.map +1 -0
  323. package/dist/state/commands/shared/removeShapesFromPage.d.ts +7 -0
  324. package/dist/state/commands/shared/removeShapesFromPage.d.ts.map +1 -0
  325. package/dist/state/commands/stretchShapes/index.d.ts +2 -0
  326. package/dist/state/commands/stretchShapes/index.d.ts.map +1 -0
  327. package/dist/state/commands/stretchShapes/stretchShapes.d.ts +5 -0
  328. package/dist/state/commands/stretchShapes/stretchShapes.d.ts.map +1 -0
  329. package/dist/state/commands/styleShapes/index.d.ts +2 -0
  330. package/dist/state/commands/styleShapes/index.d.ts.map +1 -0
  331. package/dist/state/commands/styleShapes/styleShapes.d.ts +4 -0
  332. package/dist/state/commands/styleShapes/styleShapes.d.ts.map +1 -0
  333. package/dist/state/commands/toggleShapesDecoration/index.d.ts +2 -0
  334. package/dist/state/commands/toggleShapesDecoration/index.d.ts.map +1 -0
  335. package/dist/state/commands/toggleShapesDecoration/toggleShapesDecoration.d.ts +4 -0
  336. package/dist/state/commands/toggleShapesDecoration/toggleShapesDecoration.d.ts.map +1 -0
  337. package/dist/state/commands/toggleShapesProp/index.d.ts +2 -0
  338. package/dist/state/commands/toggleShapesProp/index.d.ts.map +1 -0
  339. package/dist/state/commands/toggleShapesProp/toggleShapesProp.d.ts +4 -0
  340. package/dist/state/commands/toggleShapesProp/toggleShapesProp.d.ts.map +1 -0
  341. package/dist/state/commands/translateShapes/index.d.ts +2 -0
  342. package/dist/state/commands/translateShapes/index.d.ts.map +1 -0
  343. package/dist/state/commands/translateShapes/translateShapes.d.ts +4 -0
  344. package/dist/state/commands/translateShapes/translateShapes.d.ts.map +1 -0
  345. package/dist/state/commands/ungroupShapes/index.d.ts +2 -0
  346. package/dist/state/commands/ungroupShapes/index.d.ts.map +1 -0
  347. package/dist/state/commands/ungroupShapes/ungroupShapes.d.ts +5 -0
  348. package/dist/state/commands/ungroupShapes/ungroupShapes.d.ts.map +1 -0
  349. package/dist/state/commands/updateShapes/index.d.ts +2 -0
  350. package/dist/state/commands/updateShapes/index.d.ts.map +1 -0
  351. package/dist/state/commands/updateShapes/updateShapes.d.ts +6 -0
  352. package/dist/state/commands/updateShapes/updateShapes.d.ts.map +1 -0
  353. package/dist/state/data/filesystem.d.ts +26 -0
  354. package/dist/state/data/filesystem.d.ts.map +1 -0
  355. package/dist/state/data/index.d.ts +4 -0
  356. package/dist/state/data/index.d.ts.map +1 -0
  357. package/dist/state/data/migrate.d.ts +3 -0
  358. package/dist/state/data/migrate.d.ts.map +1 -0
  359. package/dist/state/index.d.ts +3 -0
  360. package/dist/state/index.d.ts.map +1 -0
  361. package/dist/state/internal.d.ts +5 -0
  362. package/dist/state/internal.d.ts.map +1 -0
  363. package/dist/state/reactRegistry.d.ts +27 -0
  364. package/dist/state/reactRegistry.d.ts.map +1 -0
  365. package/dist/state/sessions/ArrowSession/ArrowSession.d.ts +24 -0
  366. package/dist/state/sessions/ArrowSession/ArrowSession.d.ts.map +1 -0
  367. package/dist/state/sessions/ArrowSession/index.d.ts +2 -0
  368. package/dist/state/sessions/ArrowSession/index.d.ts.map +1 -0
  369. package/dist/state/sessions/BaseSession.d.ts +14 -0
  370. package/dist/state/sessions/BaseSession.d.ts.map +1 -0
  371. package/dist/state/sessions/BrushSession/BrushSession.d.ts +21 -0
  372. package/dist/state/sessions/BrushSession/BrushSession.d.ts.map +1 -0
  373. package/dist/state/sessions/BrushSession/index.d.ts +2 -0
  374. package/dist/state/sessions/BrushSession/index.d.ts.map +1 -0
  375. package/dist/state/sessions/DrawSession/DrawSession.d.ts +45 -0
  376. package/dist/state/sessions/DrawSession/DrawSession.d.ts.map +1 -0
  377. package/dist/state/sessions/DrawSession/index.d.ts +2 -0
  378. package/dist/state/sessions/DrawSession/index.d.ts.map +1 -0
  379. package/dist/state/sessions/EditSession/EditSession.d.ts +17 -0
  380. package/dist/state/sessions/EditSession/EditSession.d.ts.map +1 -0
  381. package/dist/state/sessions/EditSession/index.d.ts +2 -0
  382. package/dist/state/sessions/EditSession/index.d.ts.map +1 -0
  383. package/dist/state/sessions/EraseSession/EraseSession.d.ts +27 -0
  384. package/dist/state/sessions/EraseSession/EraseSession.d.ts.map +1 -0
  385. package/dist/state/sessions/EraseSession/index.d.ts +2 -0
  386. package/dist/state/sessions/EraseSession/index.d.ts.map +1 -0
  387. package/dist/state/sessions/GridSession/GridSession.d.ts +24 -0
  388. package/dist/state/sessions/GridSession/GridSession.d.ts.map +1 -0
  389. package/dist/state/sessions/GridSession/index.d.ts +2 -0
  390. package/dist/state/sessions/GridSession/index.d.ts.map +1 -0
  391. package/dist/state/sessions/HandleSession/HandleSession.d.ts +19 -0
  392. package/dist/state/sessions/HandleSession/HandleSession.d.ts.map +1 -0
  393. package/dist/state/sessions/HandleSession/index.d.ts +2 -0
  394. package/dist/state/sessions/HandleSession/index.d.ts.map +1 -0
  395. package/dist/state/sessions/RotateSession/RotateSession.d.ts +22 -0
  396. package/dist/state/sessions/RotateSession/RotateSession.d.ts.map +1 -0
  397. package/dist/state/sessions/RotateSession/index.d.ts +2 -0
  398. package/dist/state/sessions/RotateSession/index.d.ts.map +1 -0
  399. package/dist/state/sessions/TransformSession/TransformSession.d.ts +41 -0
  400. package/dist/state/sessions/TransformSession/TransformSession.d.ts.map +1 -0
  401. package/dist/state/sessions/TransformSession/index.d.ts +2 -0
  402. package/dist/state/sessions/TransformSession/index.d.ts.map +1 -0
  403. package/dist/state/sessions/TransformSingleSession/TransformSingleSession.d.ts +32 -0
  404. package/dist/state/sessions/TransformSingleSession/TransformSingleSession.d.ts.map +1 -0
  405. package/dist/state/sessions/TransformSingleSession/index.d.ts +2 -0
  406. package/dist/state/sessions/TransformSingleSession/index.d.ts.map +1 -0
  407. package/dist/state/sessions/TranslateLabelSession/TranslateLabelSession.d.ts +17 -0
  408. package/dist/state/sessions/TranslateLabelSession/TranslateLabelSession.d.ts.map +1 -0
  409. package/dist/state/sessions/TranslateLabelSession/index.d.ts +2 -0
  410. package/dist/state/sessions/TranslateLabelSession/index.d.ts.map +1 -0
  411. package/dist/state/sessions/TranslateSession/TranslateSession.d.ts +49 -0
  412. package/dist/state/sessions/TranslateSession/TranslateSession.d.ts.map +1 -0
  413. package/dist/state/sessions/TranslateSession/index.d.ts +2 -0
  414. package/dist/state/sessions/TranslateSession/index.d.ts.map +1 -0
  415. package/dist/state/sessions/index.d.ts +33 -0
  416. package/dist/state/sessions/index.d.ts.map +1 -0
  417. package/dist/state/shapes/ArrowUtil/ArrowUtil.d.ts +34 -0
  418. package/dist/state/shapes/ArrowUtil/ArrowUtil.d.ts.map +1 -0
  419. package/dist/state/shapes/ArrowUtil/arrowHelpers.d.ts +21 -0
  420. package/dist/state/shapes/ArrowUtil/arrowHelpers.d.ts.map +1 -0
  421. package/dist/state/shapes/ArrowUtil/components/ArrowHead.d.ts +9 -0
  422. package/dist/state/shapes/ArrowUtil/components/ArrowHead.d.ts.map +1 -0
  423. package/dist/state/shapes/ArrowUtil/components/CurvedArrow.tsx.d.ts +17 -0
  424. package/dist/state/shapes/ArrowUtil/components/CurvedArrow.tsx.d.ts.map +1 -0
  425. package/dist/state/shapes/ArrowUtil/components/StraightArrow.d.ts +17 -0
  426. package/dist/state/shapes/ArrowUtil/components/StraightArrow.d.ts.map +1 -0
  427. package/dist/state/shapes/ArrowUtil/index.d.ts +2 -0
  428. package/dist/state/shapes/ArrowUtil/index.d.ts.map +1 -0
  429. package/dist/state/shapes/DrawUtil/DrawUtil.d.ts +31 -0
  430. package/dist/state/shapes/DrawUtil/DrawUtil.d.ts.map +1 -0
  431. package/dist/state/shapes/DrawUtil/drawHelpers.d.ts +27 -0
  432. package/dist/state/shapes/DrawUtil/drawHelpers.d.ts.map +1 -0
  433. package/dist/state/shapes/DrawUtil/index.d.ts +2 -0
  434. package/dist/state/shapes/DrawUtil/index.d.ts.map +1 -0
  435. package/dist/state/shapes/EllipseUtil/EllipseUtil.d.ts +36 -0
  436. package/dist/state/shapes/EllipseUtil/EllipseUtil.d.ts.map +1 -0
  437. package/dist/state/shapes/EllipseUtil/components/DashedEllipse.d.ts +12 -0
  438. package/dist/state/shapes/EllipseUtil/components/DashedEllipse.d.ts.map +1 -0
  439. package/dist/state/shapes/EllipseUtil/components/DrawEllipse.d.ts +12 -0
  440. package/dist/state/shapes/EllipseUtil/components/DrawEllipse.d.ts.map +1 -0
  441. package/dist/state/shapes/EllipseUtil/ellipseHelpers.d.ts +5 -0
  442. package/dist/state/shapes/EllipseUtil/ellipseHelpers.d.ts.map +1 -0
  443. package/dist/state/shapes/EllipseUtil/index.d.ts +2 -0
  444. package/dist/state/shapes/EllipseUtil/index.d.ts.map +1 -0
  445. package/dist/state/shapes/GroupUtil/GroupUtil.d.ts +22 -0
  446. package/dist/state/shapes/GroupUtil/GroupUtil.d.ts.map +1 -0
  447. package/dist/state/shapes/GroupUtil/index.d.ts +2 -0
  448. package/dist/state/shapes/GroupUtil/index.d.ts.map +1 -0
  449. package/dist/state/shapes/ImageUtil/ImageUtil.d.ts +29 -0
  450. package/dist/state/shapes/ImageUtil/ImageUtil.d.ts.map +1 -0
  451. package/dist/state/shapes/ImageUtil/index.d.ts +2 -0
  452. package/dist/state/shapes/ImageUtil/index.d.ts.map +1 -0
  453. package/dist/state/shapes/PenUtil/PenUtil.d.ts +34 -0
  454. package/dist/state/shapes/PenUtil/PenUtil.d.ts.map +1 -0
  455. package/dist/state/shapes/PenUtil/index.d.ts +3 -0
  456. package/dist/state/shapes/PenUtil/index.d.ts.map +1 -0
  457. package/dist/state/shapes/PenUtil/penHelpers.d.ts +25 -0
  458. package/dist/state/shapes/PenUtil/penHelpers.d.ts.map +1 -0
  459. package/dist/state/shapes/ReactComponentUtil/ReactComponentUtil.d.ts +29 -0
  460. package/dist/state/shapes/ReactComponentUtil/ReactComponentUtil.d.ts.map +1 -0
  461. package/dist/state/shapes/RectangleUtil/RectangleUtil.d.ts +27 -0
  462. package/dist/state/shapes/RectangleUtil/RectangleUtil.d.ts.map +1 -0
  463. package/dist/state/shapes/RectangleUtil/components/BindingIndicator.d.ts +7 -0
  464. package/dist/state/shapes/RectangleUtil/components/BindingIndicator.d.ts.map +1 -0
  465. package/dist/state/shapes/RectangleUtil/components/DashedRectangle.d.ts +12 -0
  466. package/dist/state/shapes/RectangleUtil/components/DashedRectangle.d.ts.map +1 -0
  467. package/dist/state/shapes/RectangleUtil/components/DrawRectangle.d.ts +12 -0
  468. package/dist/state/shapes/RectangleUtil/components/DrawRectangle.d.ts.map +1 -0
  469. package/dist/state/shapes/RectangleUtil/index.d.ts +2 -0
  470. package/dist/state/shapes/RectangleUtil/index.d.ts.map +1 -0
  471. package/dist/state/shapes/RectangleUtil/rectangleHelpers.d.ts +4 -0
  472. package/dist/state/shapes/RectangleUtil/rectangleHelpers.d.ts.map +1 -0
  473. package/dist/state/shapes/StickyUtil/StickyUtil.d.ts +30 -0
  474. package/dist/state/shapes/StickyUtil/StickyUtil.d.ts.map +1 -0
  475. package/dist/state/shapes/StickyUtil/index.d.ts +2 -0
  476. package/dist/state/shapes/StickyUtil/index.d.ts.map +1 -0
  477. package/dist/state/shapes/TVShapeUtil.d.ts +36 -0
  478. package/dist/state/shapes/TVShapeUtil.d.ts.map +1 -0
  479. package/dist/state/shapes/TextUtil/TextUtil.d.ts +53 -0
  480. package/dist/state/shapes/TextUtil/TextUtil.d.ts.map +1 -0
  481. package/dist/state/shapes/TextUtil/index.d.ts +2 -0
  482. package/dist/state/shapes/TextUtil/index.d.ts.map +1 -0
  483. package/dist/state/shapes/TriangleUtil/TriangleUtil.d.ts +36 -0
  484. package/dist/state/shapes/TriangleUtil/TriangleUtil.d.ts.map +1 -0
  485. package/dist/state/shapes/TriangleUtil/components/DashedTriangle.d.ts +12 -0
  486. package/dist/state/shapes/TriangleUtil/components/DashedTriangle.d.ts.map +1 -0
  487. package/dist/state/shapes/TriangleUtil/components/DrawTriangle.d.ts +12 -0
  488. package/dist/state/shapes/TriangleUtil/components/DrawTriangle.d.ts.map +1 -0
  489. package/dist/state/shapes/TriangleUtil/components/TriangleBindingIndicator.d.ts +6 -0
  490. package/dist/state/shapes/TriangleUtil/components/TriangleBindingIndicator.d.ts.map +1 -0
  491. package/dist/state/shapes/TriangleUtil/index.d.ts +2 -0
  492. package/dist/state/shapes/TriangleUtil/index.d.ts.map +1 -0
  493. package/dist/state/shapes/TriangleUtil/triangleHelpers.d.ts +6 -0
  494. package/dist/state/shapes/TriangleUtil/triangleHelpers.d.ts.map +1 -0
  495. package/dist/state/shapes/VideoUtil/VideoUtil.d.ts +31 -0
  496. package/dist/state/shapes/VideoUtil/VideoUtil.d.ts.map +1 -0
  497. package/dist/state/shapes/VideoUtil/index.d.ts +2 -0
  498. package/dist/state/shapes/VideoUtil/index.d.ts.map +1 -0
  499. package/dist/state/shapes/index.d.ts +42 -0
  500. package/dist/state/shapes/index.d.ts.map +1 -0
  501. package/dist/state/shapes/shared/LabelMask.d.ts +11 -0
  502. package/dist/state/shapes/shared/LabelMask.d.ts.map +1 -0
  503. package/dist/state/shapes/shared/PolygonUtils.d.ts +18 -0
  504. package/dist/state/shapes/shared/PolygonUtils.d.ts.map +1 -0
  505. package/dist/state/shapes/shared/TextAreaUtils.d.ts +19 -0
  506. package/dist/state/shapes/shared/TextAreaUtils.d.ts.map +1 -0
  507. package/dist/state/shapes/shared/TextLabel.d.ts +18 -0
  508. package/dist/state/shapes/shared/TextLabel.d.ts.map +1 -0
  509. package/dist/state/shapes/shared/getBoundsRectangle.d.ts +10 -0
  510. package/dist/state/shapes/shared/getBoundsRectangle.d.ts.map +1 -0
  511. package/dist/state/shapes/shared/getTextAlign.d.ts +3 -0
  512. package/dist/state/shapes/shared/getTextAlign.d.ts.map +1 -0
  513. package/dist/state/shapes/shared/getTextSize.d.ts +3 -0
  514. package/dist/state/shapes/shared/getTextSize.d.ts.map +1 -0
  515. package/dist/state/shapes/shared/getTextSvgElement.d.ts +3 -0
  516. package/dist/state/shapes/shared/getTextSvgElement.d.ts.map +1 -0
  517. package/dist/state/shapes/shared/gradient-fill.d.ts +11 -0
  518. package/dist/state/shapes/shared/gradient-fill.d.ts.map +1 -0
  519. package/dist/state/shapes/shared/index.d.ts +13 -0
  520. package/dist/state/shapes/shared/index.d.ts.map +1 -0
  521. package/dist/state/shapes/shared/shape-styles.d.ts +24 -0
  522. package/dist/state/shapes/shared/shape-styles.d.ts.map +1 -0
  523. package/dist/state/shapes/shared/transformRectangle.d.ts +19 -0
  524. package/dist/state/shapes/shared/transformRectangle.d.ts.map +1 -0
  525. package/dist/state/shapes/shared/transformSingleRectangle.d.ts +13 -0
  526. package/dist/state/shapes/shared/transformSingleRectangle.d.ts.map +1 -0
  527. package/dist/state/tools/ArrowTool/ArrowTool.d.ts +8 -0
  528. package/dist/state/tools/ArrowTool/ArrowTool.d.ts.map +1 -0
  529. package/dist/state/tools/ArrowTool/index.d.ts +2 -0
  530. package/dist/state/tools/ArrowTool/index.d.ts.map +1 -0
  531. package/dist/state/tools/BaseTool.d.ts +28 -0
  532. package/dist/state/tools/BaseTool.d.ts.map +1 -0
  533. package/dist/state/tools/DrawTool/DrawTool.d.ts +13 -0
  534. package/dist/state/tools/DrawTool/DrawTool.d.ts.map +1 -0
  535. package/dist/state/tools/DrawTool/index.d.ts +2 -0
  536. package/dist/state/tools/DrawTool/index.d.ts.map +1 -0
  537. package/dist/state/tools/EllipseTool/EllipseTool.d.ts +8 -0
  538. package/dist/state/tools/EllipseTool/EllipseTool.d.ts.map +1 -0
  539. package/dist/state/tools/EllipseTool/index.d.ts +2 -0
  540. package/dist/state/tools/EllipseTool/index.d.ts.map +1 -0
  541. package/dist/state/tools/EraseTool/EraseTool.d.ts +17 -0
  542. package/dist/state/tools/EraseTool/EraseTool.d.ts.map +1 -0
  543. package/dist/state/tools/EraseTool/index.d.ts +2 -0
  544. package/dist/state/tools/EraseTool/index.d.ts.map +1 -0
  545. package/dist/state/tools/LineTool/LineTool.d.ts +8 -0
  546. package/dist/state/tools/LineTool/LineTool.d.ts.map +1 -0
  547. package/dist/state/tools/LineTool/index.d.ts +2 -0
  548. package/dist/state/tools/LineTool/index.d.ts.map +1 -0
  549. package/dist/state/tools/PenEditTool.d.ts +37 -0
  550. package/dist/state/tools/PenEditTool.d.ts.map +1 -0
  551. package/dist/state/tools/PenTool/PenTool.d.ts +35 -0
  552. package/dist/state/tools/PenTool/PenTool.d.ts.map +1 -0
  553. package/dist/state/tools/PenTool/index.d.ts +2 -0
  554. package/dist/state/tools/PenTool/index.d.ts.map +1 -0
  555. package/dist/state/tools/RectangleTool/RectangleTool.d.ts +8 -0
  556. package/dist/state/tools/RectangleTool/RectangleTool.d.ts.map +1 -0
  557. package/dist/state/tools/RectangleTool/index.d.ts +2 -0
  558. package/dist/state/tools/RectangleTool/index.d.ts.map +1 -0
  559. package/dist/state/tools/SelectTool/SelectTool.d.ts +324 -0
  560. package/dist/state/tools/SelectTool/SelectTool.d.ts.map +1 -0
  561. package/dist/state/tools/SelectTool/index.d.ts +2 -0
  562. package/dist/state/tools/SelectTool/index.d.ts.map +1 -0
  563. package/dist/state/tools/StickyTool/StickyTool.d.ts +10 -0
  564. package/dist/state/tools/StickyTool/StickyTool.d.ts.map +1 -0
  565. package/dist/state/tools/StickyTool/index.d.ts +2 -0
  566. package/dist/state/tools/StickyTool/index.d.ts.map +1 -0
  567. package/dist/state/tools/TextTool/TextTool.d.ts +14 -0
  568. package/dist/state/tools/TextTool/TextTool.d.ts.map +1 -0
  569. package/dist/state/tools/TextTool/index.d.ts +2 -0
  570. package/dist/state/tools/TextTool/index.d.ts.map +1 -0
  571. package/dist/state/tools/TriangleTool/TriangleTool.d.ts +8 -0
  572. package/dist/state/tools/TriangleTool/TriangleTool.d.ts.map +1 -0
  573. package/dist/state/tools/TriangleTool/index.d.ts +2 -0
  574. package/dist/state/tools/TriangleTool/index.d.ts.map +1 -0
  575. package/dist/state/tools/index.d.ts +31 -0
  576. package/dist/state/tools/index.d.ts.map +1 -0
  577. package/dist/styles/index.d.ts +2 -0
  578. package/dist/styles/index.d.ts.map +1 -0
  579. package/dist/styles/stitches.config.d.ts +475 -0
  580. package/dist/styles/stitches.config.d.ts.map +1 -0
  581. package/dist/translations/index.d.ts +2 -0
  582. package/dist/translations/index.d.ts.map +1 -0
  583. package/dist/translations/translations.d.ts +11 -0
  584. package/dist/translations/translations.d.ts.map +1 -0
  585. package/dist/types.d.ts +493 -0
  586. package/dist/types.d.ts.map +1 -0
  587. package/package.json +108 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/RightPanel/googleFonts.ts", "../src/index.ts", "../src/Telva.tsx", "../src/components/CenterToolbar/CenterToolbar.tsx", "../src/components/Primitives/icons/BoxIcon.tsx", "../src/components/Primitives/icons/CircleIcon.tsx", "../src/components/Primitives/icons/DashDashedIcon.tsx", "../src/components/Primitives/icons/DashDottedIcon.tsx", "../src/components/Primitives/icons/DashDrawIcon.tsx", "../src/components/Primitives/icons/DashSolidIcon.tsx", "../src/components/Primitives/icons/TrashIcon.tsx", "../src/components/Primitives/icons/UndoIcon.tsx", "../src/components/Primitives/icons/SizeSmallIcon.tsx", "../src/components/Primitives/icons/SizeMediumIcon.tsx", "../src/components/Primitives/icons/SizeLargeIcon.tsx", "../src/components/Primitives/icons/EraserIcon.tsx", "../src/components/Primitives/icons/DiscordIcon.tsx", "../src/components/Primitives/icons/LineIcon.tsx", "../src/components/ToolsPanel/ShapesMenu.tsx", "../src/styles/stitches.config.ts", "../src/components/Primitives/Panel/Panel.tsx", "../src/components/Primitives/ToolButton/ToolButton.tsx", "../src/components/Primitives/Tooltip/Tooltip.tsx", "../src/components/Primitives/Kbd/Kbd.tsx", "../src/components/breakpoints.tsx", "../src/hooks/useFileSystem.ts", "../src/hooks/useFileSystemHandlers.ts", "../src/hooks/useKeyboardShortcuts.tsx", "../src/types.ts", "../src/hooks/useTelvaApp.tsx", "../src/hooks/useTranslation.ts", "../src/translations/translations.ts", "../src/hooks/useDialog.ts", "../src/components/ContextMenu/ContextMenu.tsx", "../src/components/Primitives/Divider/Divider.tsx", "../src/components/Primitives/MenuContent/MenuContent.ts", "../src/components/Primitives/RowButton/RowButton.tsx", "../src/components/Primitives/SmallIcon/SmallIcon.tsx", "../src/components/ErrorFallback/ErrorFallback.tsx", "../src/components/LeftPanel/LayersPanel.tsx", "../src/components/LeftPanel/ComponentsTab.tsx", "../src/state/reactRegistry.ts", "../src/components/LeftPanel/LeftPanel.tsx", "../src/components/Loading/Loading.tsx", "../src/components/Primitives/AlertDialog/AlertDialog.tsx", "../src/components/Primitives/AlertDialog/FilenameDialog.tsx", "../src/components/Primitives/TextField/TextField.tsx", "../src/components/RightPanel/RightPanel.tsx", "../src/components/RightPanel/PropertiesPanel.tsx", "../src/state/shapes/shared/getBoundsRectangle.ts", "../src/state/shapes/shared/getTextAlign.ts", "../src/constants.ts", "../src/state/shapes/shared/getTextSize.ts", "../src/state/shapes/shared/getTextSvgElement.ts", "../src/state/shapes/shared/LabelMask.tsx", "../src/state/shapes/shared/PolygonUtils.ts", "../src/state/shapes/shared/shape-styles.ts", "../src/state/shapes/shared/TextAreaUtils.ts", "../src/state/shapes/shared/TextLabel.tsx", "../src/components/stopPropagation.ts", "../src/state/TVDR.ts", "../src/state/StateManager/copy.ts", "../src/state/shapes/ArrowUtil/ArrowUtil.tsx", "../src/state/shapes/TVShapeUtil.tsx", "../src/state/shapes/ArrowUtil/arrowHelpers.ts", "../src/state/shapes/ArrowUtil/components/CurvedArrow.tsx.tsx", "../src/state/shapes/ArrowUtil/components/ArrowHead.tsx", "../src/state/shapes/ArrowUtil/components/StraightArrow.tsx", "../src/state/shapes/DrawUtil/DrawUtil.tsx", "../src/state/shapes/shared/gradient-fill.tsx", "../src/state/shapes/DrawUtil/drawHelpers.ts", "../src/state/shapes/EllipseUtil/EllipseUtil.tsx", "../src/state/shapes/EllipseUtil/components/DashedEllipse.tsx", "../src/state/shapes/EllipseUtil/components/DrawEllipse.tsx", "../src/state/shapes/EllipseUtil/ellipseHelpers.ts", "../src/state/shapes/GroupUtil/GroupUtil.tsx", "../src/state/shapes/ImageUtil/ImageUtil.tsx", "../src/state/shapes/PenUtil/PenUtil.tsx", "../src/state/shapes/PenUtil/penHelpers.ts", "../src/state/shapes/ReactComponentUtil/ReactComponentUtil.tsx", "../src/state/shapes/RectangleUtil/RectangleUtil.tsx", "../src/state/shapes/RectangleUtil/components/BindingIndicator.tsx", "../src/state/shapes/RectangleUtil/components/DashedRectangle.tsx", "../src/state/shapes/RectangleUtil/components/DrawRectangle.tsx", "../src/state/shapes/RectangleUtil/rectangleHelpers.ts", "../src/state/shapes/StickyUtil/StickyUtil.tsx", "../src/state/shapes/TextUtil/TextUtil.tsx", "../src/state/shapes/TriangleUtil/TriangleUtil.tsx", "../src/state/shapes/TriangleUtil/components/DashedTriangle.tsx", "../src/state/shapes/TriangleUtil/triangleHelpers.ts", "../src/state/shapes/TriangleUtil/components/DrawTriangle.tsx", "../src/state/shapes/TriangleUtil/components/TriangleBindingIndicator.tsx", "../src/state/shapes/VideoUtil/VideoUtil.tsx", "../src/state/shapes/index.ts", "../src/state/shapes/shared/transformRectangle.ts", "../src/state/shapes/shared/transformSingleRectangle.ts", "../src/components/RightPanel/ColorPicker.tsx", "../src/components/RightPanel/DraggableInput.tsx", "../src/components/RightPanel/GradientPicker.tsx", "../src/components/TopPanel/TopPanel.tsx", "../src/components/TopPanel/Menu/Menu.tsx", "../src/components/Primitives/DropdownMenu/DMItem.tsx", "../src/components/Primitives/DropdownMenu/DMCheckboxItem.tsx", "../src/components/preventEvent.ts", "../src/components/Primitives/DropdownMenu/DMContent.tsx", "../src/components/Primitives/DropdownMenu/DMDivider.tsx", "../src/components/Primitives/DropdownMenu/DMRadioItem.tsx", "../src/components/Primitives/DropdownMenu/DMSubMenu.tsx", "../src/components/Primitives/DropdownMenu/DMTriggerIcon.tsx", "../src/components/TopPanel/PreferencesMenu/PreferencesMenu.tsx", "../src/components/TopPanel/MultiplayerMenu/MultiplayerMenu.tsx", "../src/components/Primitives/icons/MultiplayerIcon2.tsx", "../src/components/TopPanel/PageMenu/PageMenu.tsx", "../src/components/TopPanel/PageOptionsDialog/PageOptionsDialog.tsx", "../src/components/Primitives/IconButton/IconButton.tsx", "../src/components/TopPanel/StyleMenu/StyleMenu.tsx", "../src/components/TopPanel/ZoomMenu/ZoomMenu.tsx", "../src/hooks/useCursor.ts", "../src/state/TelvaApp.ts", "../src/state/IdbClipboard.ts", "../src/state/StateManager/StateManager.ts", "../src/state/commands/alignShapes/alignShapes.ts", "../src/state/commands/changePage/changePage.ts", "../src/state/commands/createPage/createPage.ts", "../src/state/commands/shared/getIncrementedName.ts", "../src/state/commands/shared/removeShapesFromPage.ts", "../src/state/commands/createShapes/createShapes.ts", "../src/state/commands/deletePage/deletePage.ts", "../src/state/commands/deleteShapes/deleteShapes.ts", "../src/state/commands/distributeShapes/distributeShapes.ts", "../src/state/commands/duplicatePage/duplicatePage.ts", "../src/state/commands/duplicateShapes/duplicateShapes.ts", "../src/state/commands/flipShapes/flipShapes.ts", "../src/state/commands/groupShapes/groupShapes.ts", "../src/state/commands/moveShapesToPage/moveShapesToPage.ts", "../src/state/commands/movePage/movePage.ts", "../src/state/commands/reorderShapes/reorderShapes.ts", "../src/state/commands/renamePage/renamePage.ts", "../src/state/commands/resetBounds/resetBounds.ts", "../src/state/commands/rotateShapes/rotateShapes.ts", "../src/state/commands/stretchShapes/stretchShapes.ts", "../src/state/commands/styleShapes/styleShapes.ts", "../src/state/commands/toggleShapesDecoration/toggleShapesDecoration.ts", "../src/state/commands/toggleShapesProp/toggleShapesProp.ts", "../src/state/commands/translateShapes/translateShapes.ts", "../src/state/commands/ungroupShapes/ungroupShapes.ts", "../src/state/commands/updateShapes/updateShapes.ts", "../src/state/commands/setShapesProps/setShapesProps.ts", "../src/state/commands/insertContent/insertContent.ts", "../src/state/data/index.ts", "../src/state/data/migrate.ts", "../src/state/data/filesystem.ts", "../src/state/sessions/ArrowSession/ArrowSession.ts", "../src/state/sessions/BaseSession.ts", "../src/state/sessions/BrushSession/BrushSession.ts", "../src/state/sessions/DrawSession/DrawSession.ts", "../src/state/sessions/EditSession/EditSession.ts", "../src/state/sessions/EraseSession/EraseSession.ts", "../src/state/sessions/GridSession/GridSession.ts", "../src/state/sessions/HandleSession/HandleSession.ts", "../src/state/sessions/RotateSession/RotateSession.ts", "../src/state/sessions/TransformSession/TransformSession.ts", "../src/state/sessions/TransformSingleSession/TransformSingleSession.ts", "../src/state/sessions/TranslateSession/TranslateSession.ts", "../src/state/sessions/index.ts", "../src/state/tools/ArrowTool/ArrowTool.ts", "../src/state/tools/BaseTool.ts", "../src/state/tools/DrawTool/DrawTool.ts", "../src/state/tools/EllipseTool/EllipseTool.ts", "../src/state/tools/EraseTool/EraseTool.ts", "../src/state/tools/LineTool/LineTool.ts", "../src/state/tools/PenTool/PenTool.ts", "../src/state/tools/RectangleTool/RectangleTool.ts", "../src/state/tools/SelectTool/SelectTool.ts", "../src/state/tools/StickyTool/StickyTool.ts", "../src/state/tools/TextTool/TextTool.ts", "../src/state/tools/TriangleTool/TriangleTool.ts", "../src/state/tools/index.ts"],
4
+ "sourcesContent": ["/** Shape of a single item returned by the Google Fonts Developer API v1 */\nexport interface GoogleFont {\n family: string\n variants: string[]\n subsets: string[]\n version: string\n lastModified: string\n files: Record<string, string>\n category: string\n kind: string\n menu: string\n}\n\nlet _apiKey = ''\nlet cachedFonts: GoogleFont[] = []\nlet fontsPromise: Promise<GoogleFont[]> | null = null\n\n/**\n * Set the Google Fonts Developer API key.\n * Call this from your top-level component before the font picker is opened.\n * Resets the cache so the next fetch uses the new key.\n */\nexport function setGoogleFontsApiKey(key: string): void {\n const cleaned = key.replace(/[\"']/g, '').trim()\n if (cleaned === _apiKey) return\n _apiKey = cleaned\n // Reset cache so next fetchGoogleFonts() uses the new key\n cachedFonts = []\n fontsPromise = null\n}\n\n/**\n * Fetches the full list of Google Fonts sorted by popularity.\n * Results are cached; subsequent calls return the same promise.\n * https://www.googleapis.com/webfonts/v1/webfonts?key=API_KEY&sort=popularity\n */\nexport async function fetchGoogleFonts(): Promise<GoogleFont[]> {\n if (cachedFonts.length > 0) return cachedFonts\n if (fontsPromise) return fontsPromise\n\n fontsPromise = (async () => {\n try {\n if (!_apiKey) {\n console.warn(\n '[Google Fonts] No API key provided. Pass googleFontsApiKey to the <Telva> component.'\n )\n return []\n }\n const url = `https://www.googleapis.com/webfonts/v1/webfonts?key=${_apiKey}&sort=popularity`\n const res = await fetch(url)\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`)\n const data: { kind: string; items: GoogleFont[] } = await res.json()\n cachedFonts = data.items ?? []\n } catch (e) {\n console.error('[Google Fonts] Failed to fetch font list', e)\n cachedFonts = []\n }\n return cachedFonts\n })()\n\n return fontsPromise\n}\n\n/**\n * Search cached fonts by family name, optionally filtering by category.\n * Category values: serif | sans-serif | monospace | display | handwriting\n */\nexport function searchGoogleFonts(query: string, category?: string): GoogleFont[] {\n let list = cachedFonts\n if (category) list = list.filter((f) => f.category === category)\n if (!query) return list.slice(0, 100)\n const q = query.toLowerCase()\n return list.filter((f) => f.family.toLowerCase().includes(q)).slice(0, 100)\n}\n\n/** Returns the unique font categories available from the cached list */\nexport function getGoogleFontCategories(): string[] {\n return Array.from(new Set(cachedFonts.map((f) => f.category))).filter(Boolean)\n}\n\nconst STORAGE_KEY = 'telva-loaded-google-fonts'\n\nfunction getPersistedFonts(): string[] {\n try {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) ?? '[]')\n } catch {\n return []\n }\n}\n\nfunction persistFont(family: string): void {\n try {\n const existing = getPersistedFonts()\n if (!existing.includes(family)) {\n existing.push(family)\n localStorage.setItem(STORAGE_KEY, JSON.stringify(existing))\n }\n } catch {\n // localStorage unavailable (e.g. SSR or private mode)\n }\n}\n\n/**\n * Injects a <link> into <head> to load a Google Font via the CSS API.\n * The loaded family is persisted to localStorage so it is restored on reload.\n * https://fonts.googleapis.com/css2?family=Family+Name:wght@400;700&display=swap\n */\nexport function loadGoogleFont(family: string, variants?: string[]): void {\n const id = `gfont-${family.replace(/\\s+/g, '-')}`\n if (document.getElementById(id)) return\n\n const familyParam = family.replace(/\\s+/g, '+')\n\n const link = document.createElement('link')\n link.id = id\n link.rel = 'stylesheet'\n // Use v1 API which safely handles default and multiple weights without strict axis validations\n link.href = `https://fonts.googleapis.com/css?family=${familyParam}:400,400i,700,700i&display=swap`\n document.head.appendChild(link)\n\n persistFont(family)\n}\n\n/** Restores all previously loaded Google Fonts from localStorage */\nfunction restorePersistedFonts(): void {\n if (typeof window === 'undefined') return\n getPersistedFonts().forEach((family) => loadGoogleFont(family))\n}\n\n// Pre\u2011fetch in browser environments once a key has been set, and restore persisted fonts\nexport function initGoogleFonts(): void {\n restorePersistedFonts()\n if (typeof window !== 'undefined' && _apiKey) fetchGoogleFonts()\n}\n", "export * from './Telva'\nexport * from './types'\nexport * from './state/shapes'\nexport * from './state/TVDR'\nexport { TelvaApp } from './state'\nexport { useFileSystem } from './hooks'\nexport type { ReactComponentEntry } from './state/reactRegistry'\n", "import '@fontsource/caveat-brush'\nimport '@fontsource/crimson-pro'\nimport '@fontsource/dm-sans'\nimport '@fontsource/recursive'\nimport '@fontsource/source-code-pro'\nimport '@fontsource/source-sans-pro'\nimport * as React from 'react'\nimport { ErrorBoundary as _Errorboundary } from 'react-error-boundary'\nimport { IntlProvider } from 'react-intl'\nimport { CursorComponent, Renderer } from 'telva-core'\nimport { CenterToolbar } from '~components/CenterToolbar'\nimport { ContextMenu } from '~components/ContextMenu'\nimport { ErrorFallback } from '~components/ErrorFallback'\nimport { LeftPanel } from '~components/LeftPanel'\nimport { Loading } from '~components/Loading'\nimport { AlertDialog } from '~components/Primitives/AlertDialog'\nimport { RightPanel } from '~components/RightPanel'\nimport { initGoogleFonts, setGoogleFontsApiKey } from '~components/RightPanel/googleFonts'\nimport { TopPanel } from '~components/TopPanel'\nimport { GRID_SIZE } from '~constants'\nimport {\n AlertDialogContext,\n ContainerContext,\n DialogState,\n TelvaContext,\n useKeyboardShortcuts,\n useTelvaApp,\n useTranslation,\n} from '~hooks'\nimport { useCursor } from '~hooks/useCursor'\nimport { TVCallbacks, TelvaApp } from '~state'\nimport { TVDR } from '~state/TVDR'\nimport { ReactComponentEntry, ReactRegistryContext } from '~state/reactRegistry'\nimport { shapeUtils } from '~state/shapes'\nimport { dark, styled } from '~styles'\nimport { TVDocument, TVStatus } from '~types'\n\nconst ErrorBoundary = _Errorboundary as any\n\nexport interface TelvaProps extends TVCallbacks {\n /**\n * (optional) If provided, the component will load / persist state under this key.\n */\n id?: string\n\n /**\n * (optional) The document to load or update from.\n */\n document?: TVDocument\n\n /**\n * (optional) The current page id.\n */\n currentPageId?: string\n\n /**\n * (optional) Whether the editor should immediately receive focus. Defaults to true.\n */\n autofocus?: boolean\n\n /**\n * (optional) Whether to show the menu UI.\n */\n showMenu?: boolean\n\n /**\n * (optional) Whether to show the multiplayer menu.\n */\n showMultiplayerMenu?: boolean\n\n /**\n * (optional) Whether to show the pages UI.\n */\n showPages?: boolean\n\n /**\n * (optional) Whether to show the styles UI.\n */\n showStyles?: boolean\n\n /**\n * (optional) Whether to show the zoom UI.\n */\n showZoom?: boolean\n\n /**\n * (optional) Whether to show the tools UI.\n */\n showTools?: boolean\n\n /**\n * (optional) Whether to show the UI.\n */\n showUI?: boolean\n\n /**\n * (optional) Whether to the document should be read only.\n */\n readOnly?: boolean\n\n /**\n * (optional) Whether to to show the app's dark mode UI.\n */\n darkMode?: boolean\n\n /**\n * (optional) If provided, image/video componnets will be disabled.\n *\n * Warning: Keeping this enabled for multiplayer applications without provifing a storage\n * bucket based solution will cause massive base64 string to be written to the liveblocks room.\n */\n disableAssets?: boolean\n\n /**\n * (optional) Custom components to override parts of the default UI.\n */\n components?: {\n /**\n * The component to render for multiplayer cursors.\n */\n Cursor?: CursorComponent\n }\n\n /**\n * (optional) To hide cursors\n */\n hideCursors?: boolean\n\n /**\n * (optional) React components available for import in the editor.\n * Configured in apps/www/react/registry.tsx.\n */\n reactComponents?: ReactComponentEntry[]\n\n /**\n * (optional) Google Fonts Developer API key.\n * When provided, the font picker in the properties panel will load the full\n * list of Google Fonts sorted by popularity.\n * https://developers.google.com/fonts/docs/developer_api\n */\n googleFontsApiKey?: string\n}\n\nconst isSystemDarkMode = window.matchMedia\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n : false\n\nexport function Telva({\n id,\n document,\n currentPageId,\n autofocus = true,\n showMenu = true,\n showMultiplayerMenu = true,\n showPages = true,\n showTools = true,\n showZoom = true,\n showStyles = true,\n showUI = true,\n readOnly = false,\n disableAssets = false,\n darkMode = isSystemDarkMode,\n components,\n onMount,\n onChange,\n onChangePresence,\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n onUndo,\n onRedo,\n onPersist,\n onPatch,\n onCommand,\n onChangePage,\n onAssetCreate,\n onAssetDelete,\n onAssetUpload,\n onSessionStart,\n onSessionEnd,\n onExport,\n hideCursors,\n reactComponents,\n googleFontsApiKey,\n}: TelvaProps) {\n const [sId, setSId] = React.useState(id)\n\n // Configure Google Fonts API key whenever it changes\n React.useEffect(() => {\n if (googleFontsApiKey) {\n setGoogleFontsApiKey(googleFontsApiKey)\n initGoogleFonts()\n }\n }, [googleFontsApiKey])\n\n // Create a new app when the component mounts.\n const [app, setApp] = React.useState(() => {\n const app = new TelvaApp(id, {\n onMount,\n onChange,\n onChangePresence,\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n onUndo,\n onRedo,\n onPersist,\n onPatch,\n onCommand,\n onChangePage,\n onAssetDelete,\n onAssetCreate,\n onAssetUpload,\n onSessionStart,\n onSessionEnd,\n })\n return app\n })\n\n const [onCancel, setOnCancel] = React.useState<(() => void) | null>(null)\n const [onYes, setOnYes] = React.useState<(() => void) | null>(null)\n const [onNo, setOnNo] = React.useState<(() => void) | null>(null)\n const [dialogState, setDialogState] = React.useState<DialogState | null>(null)\n\n const openDialog = React.useCallback(\n (dialogState: DialogState, onYes: () => void, onNo: () => void, onCancel: () => void) => {\n setDialogState(() => dialogState)\n setOnCancel(() => onCancel)\n setOnYes(() => onYes)\n setOnNo(() => onNo)\n },\n []\n )\n\n // Create a new app if the `id` prop changes.\n React.useLayoutEffect(() => {\n if (id === sId) return\n const newApp = new TelvaApp(id, {\n onMount,\n onChange,\n onChangePresence,\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n onUndo,\n onRedo,\n onPersist,\n onPatch,\n onCommand,\n onChangePage,\n onAssetDelete,\n onAssetCreate,\n onAssetUpload,\n onExport,\n onSessionStart,\n onSessionEnd,\n })\n\n setSId(id)\n\n setApp(newApp)\n }, [sId, id])\n\n // Update the document if the `document` prop changes but the ids,\n // are the same, or else load a new document if the ids are different.\n React.useEffect(() => {\n if (!document) return\n\n if (document.id === app.document.id) {\n app.updateDocument(document)\n } else {\n app.loadDocument(document)\n }\n }, [document, app])\n\n // Disable assets when the `disableAssets` prop changes.\n React.useEffect(() => {\n app.setDisableAssets(disableAssets)\n }, [app, disableAssets])\n\n // Change the page when the `currentPageId` prop changes.\n React.useEffect(() => {\n if (!currentPageId) return\n app.changePage(currentPageId)\n }, [currentPageId, app])\n\n // Toggle the app's readOnly mode when the `readOnly` prop changes.\n React.useEffect(() => {\n app.readOnly = readOnly\n if (!readOnly) {\n app.selectNone()\n app.cancelSession()\n app.setEditingId()\n }\n }, [app, readOnly])\n\n // Toggle the app's darkMode when the `darkMode` prop changes.\n React.useEffect(() => {\n if (darkMode !== app.settings.isDarkMode) {\n app.toggleDarkMode()\n }\n }, [app, darkMode])\n\n // Update the app's callbacks when any callback changes.\n React.useEffect(() => {\n app.callbacks = {\n onMount,\n onChange,\n onChangePresence,\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n onUndo,\n onRedo,\n onPersist,\n onPatch,\n onCommand,\n onChangePage,\n onAssetDelete,\n onAssetCreate,\n onAssetUpload,\n onExport,\n onSessionStart,\n onSessionEnd,\n }\n }, [\n onMount,\n onChange,\n onChangePresence,\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n onUndo,\n onRedo,\n onPersist,\n onPatch,\n onCommand,\n onChangePage,\n onAssetDelete,\n onAssetCreate,\n onAssetUpload,\n onExport,\n onSessionStart,\n onSessionEnd,\n ])\n\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined') return\n if (!window.document?.fonts) return\n\n function refreshBoundingBoxes() {\n app.refreshBoundingBoxes()\n }\n window.document.fonts.addEventListener('loadingdone', refreshBoundingBoxes)\n return () => {\n window.document.fonts.removeEventListener('loadingdone', refreshBoundingBoxes)\n }\n }, [app])\n\n // Use the `key` to ensure that new selector hooks are made when the id changes\n return (\n <TelvaContext.Provider value={app}>\n <AlertDialogContext.Provider\n value={{ onYes, onCancel, onNo, dialogState, setDialogState, openDialog }}\n >\n <ReactRegistryContext.Provider value={reactComponents || []}>\n <InnerTelva\n key={sId || 'Telva'}\n id={sId}\n autofocus={autofocus}\n showPages={showPages}\n showMenu={showMenu}\n showMultiplayerMenu={showMultiplayerMenu}\n showStyles={showStyles}\n showZoom={showZoom}\n showTools={showTools}\n showUI={showUI}\n readOnly={readOnly}\n components={components}\n hideCursors={hideCursors}\n reactComponents={reactComponents}\n />\n </ReactRegistryContext.Provider>\n </AlertDialogContext.Provider>\n </TelvaContext.Provider>\n )\n}\n\ninterface InnerTelvaProps {\n id?: string\n autofocus: boolean\n readOnly: boolean\n showPages: boolean\n showMenu: boolean\n showMultiplayerMenu: boolean\n showZoom: boolean\n showStyles: boolean\n showUI: boolean\n showTools: boolean\n components?: {\n Cursor?: CursorComponent\n }\n hideCursors?: boolean\n reactComponents?: ReactComponentEntry[]\n}\n\nconst InnerTelva = React.memo(function InnerTelva({\n id,\n autofocus,\n showPages,\n showMenu,\n showMultiplayerMenu,\n showZoom,\n showStyles,\n showTools,\n readOnly,\n showUI,\n components,\n hideCursors,\n reactComponents,\n}: InnerTelvaProps) {\n const app = useTelvaApp()\n const [dialogContainer, setDialogContainer] = React.useState<any>(null)\n const rWrapper = React.useRef<HTMLDivElement>(null)\n const rCanvasWrap = React.useRef<HTMLDivElement>(null)\n\n const state = app.useStore()\n\n const { document, settings, appState, room } = state\n\n const isSelecting = state.appState.activeTool === 'select'\n\n const page = document.pages[appState.currentPageId]\n const pageState = document.pageStates[page.id]\n const assets = document.assets\n const { selectedIds } = pageState\n\n const isHideBoundsShape =\n selectedIds.length === 1 &&\n page.shapes[selectedIds[0]] &&\n TVDR.getShapeUtil(page.shapes[selectedIds[0]].type).hideBounds\n\n const isHideResizeHandlesShape =\n selectedIds.length === 1 &&\n page.shapes[selectedIds[0]] &&\n TVDR.getShapeUtil(page.shapes[selectedIds[0]].type).hideResizeHandles\n\n // Custom rendering meta, with dark mode and canvas mode for shapes\n const meta = React.useMemo(() => {\n return {\n isDarkMode: settings.isDarkMode,\n canvasMode: settings.canvasMode || 'freehand',\n nodeEditingId: appState.nodeEditingId,\n }\n }, [settings.isDarkMode, settings.canvasMode, appState.nodeEditingId])\n\n const showDashedBrush = settings.isCadSelectMode\n ? !appState.selectByContain\n : appState.selectByContain\n\n // Custom theme, based on darkmode\n const theme = React.useMemo(() => {\n const { selectByContain } = appState\n const { isDarkMode, isCadSelectMode } = settings\n\n if (isDarkMode) {\n const brushBase = isCadSelectMode\n ? selectByContain\n ? '69, 155, 255'\n : '105, 209, 73'\n : '180, 180, 180'\n return {\n brushFill: `rgba(${brushBase}, ${isCadSelectMode ? 0.08 : 0.05})`,\n brushStroke: `rgba(${brushBase}, ${isCadSelectMode ? 0.5 : 0.25})`,\n brushDashStroke: `rgba(${brushBase}, .6)`,\n selected: 'rgba(13, 153, 255, 1)',\n selectFill: 'rgba(13, 153, 255, 0.05)',\n background: '#ffffffff',\n foreground: '#383838',\n }\n }\n\n const brushBase = isCadSelectMode ? (selectByContain ? '0, 89, 242' : '51, 163, 23') : '0,0,0'\n\n return {\n brushFill: `rgba(${brushBase}, ${isCadSelectMode ? 0.08 : 0.05})`,\n brushStroke: `rgba(${brushBase}, ${isCadSelectMode ? 0.4 : 0.25})`,\n brushDashStroke: `rgba(${brushBase}, .6)`,\n selected: 'rgba(13, 153, 255, 1)',\n selectFill: 'rgba(13, 153, 255, 0.05)',\n background: '#ffffffff',\n foreground: '#ffffffff',\n }\n }, [settings.isDarkMode, settings.isCadSelectMode, appState.selectByContain])\n\n const isInSession = app.session !== undefined\n\n // Hide bounds when not using the select tool, or when the only selected shape has handles\n const hideBounds =\n (isInSession && app.session?.constructor.name !== 'BrushSession') ||\n !isSelecting ||\n isHideBoundsShape ||\n !!pageState.editingId ||\n !!appState.nodeEditingId\n\n // Hide bounds when not using the select tool, or when in session\n const hideHandles = isInSession || !isSelecting || !!appState.nodeEditingId\n\n // Hide indicators when not using the select tool, or when in session\n const hideIndicators =\n (isInSession && state.appState.status !== TVStatus.Brushing) ||\n !isSelecting ||\n !!appState.nodeEditingId\n\n const hideCloneHandles = isInSession || !isSelecting || pageState.camera.zoom < 0.2\n\n const translation = useTranslation(settings.language)\n\n // Put the theme on the body. This means that components with\n // multiple editors cannot have different themes.\n React.useLayoutEffect(() => {\n const elm = rWrapper.current\n if (!elm) return\n if (settings.isDarkMode) {\n elm.classList.add(dark)\n } else {\n elm.classList.remove(dark)\n }\n }, [settings.isDarkMode])\n\n useCursor(rWrapper)\n\n return (\n <ContainerContext.Provider value={rWrapper}>\n <IntlProvider locale={translation.locale} messages={translation.messages}>\n <AlertDialog container={dialogContainer} />\n <StyledLayout ref={rWrapper} tabIndex={-0}>\n <Loading />\n <OneOff focusableRef={rWrapper} autofocus={autofocus} />\n\n {showUI && (\n <StyledFigmaLayout ref={setDialogContainer}>\n {/* Top bar */}\n <StyledTopBar>\n <TopPanel\n readOnly={readOnly}\n showPages={showPages}\n showMenu={showMenu}\n showMultiplayerMenu={showMultiplayerMenu}\n showStyles={false}\n showZoom={showZoom}\n />\n </StyledTopBar>\n\n {/* Main layout: layers | canvas + toolbar | properties */}\n <StyledMainArea>\n {/* Left sidebar \u2014 layers only */}\n {showTools && !readOnly && <LeftPanel />}\n\n {/* Canvas + floating toolbar */}\n <StyledCanvasWrap ref={rCanvasWrap}>\n <ContextMenu>\n <ErrorBoundary FallbackComponent={ErrorFallback}>\n <Renderer\n id={id}\n containerRef={rCanvasWrap}\n shapeUtils={shapeUtils}\n page={page}\n pageState={pageState}\n assets={assets}\n snapLines={appState.snapLines}\n eraseLine={appState.eraseLine}\n grid={GRID_SIZE}\n users={room?.users}\n userId={room?.userId}\n theme={theme}\n meta={meta}\n components={components}\n hideCursors={hideCursors}\n hideBounds={hideBounds}\n hideHandles={hideHandles}\n hideResizeHandles={isHideResizeHandlesShape}\n hideIndicators={hideIndicators}\n hideBindingHandles={!settings.showBindingHandles}\n hideCloneHandles={hideCloneHandles}\n hideRotateHandles={!settings.showRotateHandles}\n hideGrid={!settings.showGrid}\n showDashedBrush={showDashedBrush}\n performanceMode={app.session?.performanceMode}\n onPinchStart={app.onPinchStart}\n onPinchEnd={app.onPinchEnd}\n onPinch={app.onPinch}\n onPan={app.onPan}\n onZoom={app.onZoom}\n onPointerDown={app.onPointerDown}\n onPointerMove={app.onPointerMove}\n onPointerUp={app.onPointerUp}\n onPointCanvas={app.onPointCanvas}\n onDoubleClickCanvas={app.onDoubleClickCanvas}\n onRightPointCanvas={app.onRightPointCanvas}\n onDragCanvas={app.onDragCanvas}\n onReleaseCanvas={app.onReleaseCanvas}\n onPointShape={app.onPointShape}\n onDoubleClickShape={app.onDoubleClickShape}\n onRightPointShape={app.onRightPointShape}\n onDragShape={app.onDragShape}\n onHoverShape={app.onHoverShape}\n onUnhoverShape={app.onUnhoverShape}\n onReleaseShape={app.onReleaseShape}\n onPointBounds={app.onPointBounds}\n onDoubleClickBounds={app.onDoubleClickBounds}\n onRightPointBounds={app.onRightPointBounds}\n onDragBounds={app.onDragBounds}\n onHoverBounds={app.onHoverBounds}\n onUnhoverBounds={app.onUnhoverBounds}\n onReleaseBounds={app.onReleaseBounds}\n onPointBoundsHandle={app.onPointBoundsHandle}\n onDoubleClickBoundsHandle={app.onDoubleClickBoundsHandle}\n onRightPointBoundsHandle={app.onRightPointBoundsHandle}\n onDragBoundsHandle={app.onDragBoundsHandle}\n onHoverBoundsHandle={app.onHoverBoundsHandle}\n onUnhoverBoundsHandle={app.onUnhoverBoundsHandle}\n onReleaseBoundsHandle={app.onReleaseBoundsHandle}\n onPointHandle={app.onPointHandle}\n onDoubleClickHandle={app.onDoubleClickHandle}\n onRightPointHandle={app.onRightPointHandle}\n onDragHandle={app.onDragHandle}\n onHoverHandle={app.onHoverHandle}\n onUnhoverHandle={app.onUnhoverHandle}\n onReleaseHandle={app.onReleaseHandle}\n onError={app.onError}\n onRenderCountChange={app.onRenderCountChange}\n onShapeChange={app.onShapeChange}\n onShapeBlur={app.onShapeBlur}\n onShapeClone={app.onShapeClone}\n onBoundsChange={app.updateBounds}\n onKeyDown={app.onKeyDown}\n onKeyUp={app.onKeyUp}\n onDragOver={app.onDragOver}\n onDrop={app.onDrop}\n />\n </ErrorBoundary>\n </ContextMenu>\n {/* Floating centered toolbar */}\n {showTools && !readOnly && <CenterToolbar />}\n </StyledCanvasWrap>\n\n {/* Right sidebar */}\n <RightPanel />\n </StyledMainArea>\n </StyledFigmaLayout>\n )}\n\n {/* Fallback for when UI is hidden - still render canvas */}\n {!showUI && (\n <ContextMenu>\n <ErrorBoundary FallbackComponent={ErrorFallback}>\n <Renderer\n id={id}\n containerRef={rWrapper}\n shapeUtils={shapeUtils}\n page={page}\n pageState={pageState}\n assets={assets}\n snapLines={appState.snapLines}\n eraseLine={appState.eraseLine}\n grid={GRID_SIZE}\n users={room?.users}\n userId={room?.userId}\n theme={theme}\n meta={meta}\n components={components}\n hideCursors={hideCursors}\n hideBounds={hideBounds}\n hideHandles={hideHandles}\n hideResizeHandles={isHideResizeHandlesShape}\n hideIndicators={hideIndicators}\n hideBindingHandles={!settings.showBindingHandles}\n hideCloneHandles={hideCloneHandles}\n hideRotateHandles={!settings.showRotateHandles}\n hideGrid={!settings.showGrid}\n showDashedBrush={showDashedBrush}\n performanceMode={app.session?.performanceMode}\n onPinchStart={app.onPinchStart}\n onPinchEnd={app.onPinchEnd}\n onPinch={app.onPinch}\n onPan={app.onPan}\n onZoom={app.onZoom}\n onPointerDown={app.onPointerDown}\n onPointerMove={app.onPointerMove}\n onPointerUp={app.onPointerUp}\n onPointCanvas={app.onPointCanvas}\n onDoubleClickCanvas={app.onDoubleClickCanvas}\n onRightPointCanvas={app.onRightPointCanvas}\n onDragCanvas={app.onDragCanvas}\n onReleaseCanvas={app.onReleaseCanvas}\n onPointShape={app.onPointShape}\n onDoubleClickShape={app.onDoubleClickShape}\n onRightPointShape={app.onRightPointShape}\n onDragShape={app.onDragShape}\n onHoverShape={app.onHoverShape}\n onUnhoverShape={app.onUnhoverShape}\n onReleaseShape={app.onReleaseShape}\n onPointBounds={app.onPointBounds}\n onDoubleClickBounds={app.onDoubleClickBounds}\n onRightPointBounds={app.onRightPointBounds}\n onDragBounds={app.onDragBounds}\n onHoverBounds={app.onHoverBounds}\n onUnhoverBounds={app.onUnhoverBounds}\n onReleaseBounds={app.onReleaseBounds}\n onPointBoundsHandle={app.onPointBoundsHandle}\n onDoubleClickBoundsHandle={app.onDoubleClickBoundsHandle}\n onRightPointBoundsHandle={app.onRightPointBoundsHandle}\n onDragBoundsHandle={app.onDragBoundsHandle}\n onHoverBoundsHandle={app.onHoverBoundsHandle}\n onUnhoverBoundsHandle={app.onUnhoverBoundsHandle}\n onReleaseBoundsHandle={app.onReleaseBoundsHandle}\n onPointHandle={app.onPointHandle}\n onDoubleClickHandle={app.onDoubleClickHandle}\n onRightPointHandle={app.onRightPointHandle}\n onDragHandle={app.onDragHandle}\n onHoverHandle={app.onHoverHandle}\n onUnhoverHandle={app.onUnhoverHandle}\n onReleaseHandle={app.onReleaseHandle}\n onError={app.onError}\n onRenderCountChange={app.onRenderCountChange}\n onShapeChange={app.onShapeChange}\n onShapeBlur={app.onShapeBlur}\n onShapeClone={app.onShapeClone}\n onBoundsChange={app.updateBounds}\n onKeyDown={app.onKeyDown}\n onKeyUp={app.onKeyUp}\n onDragOver={app.onDragOver}\n onDrop={app.onDrop}\n />\n </ErrorBoundary>\n </ContextMenu>\n )}\n </StyledLayout>\n </IntlProvider>\n </ContainerContext.Provider>\n )\n})\n\nconst OneOff = React.memo(function OneOff({\n focusableRef,\n autofocus,\n}: {\n autofocus?: boolean\n focusableRef: React.RefObject<HTMLDivElement>\n}) {\n useKeyboardShortcuts(focusableRef)\n\n React.useEffect(() => {\n if (autofocus) {\n focusableRef.current?.focus()\n }\n }, [autofocus])\n\n return null\n})\n\nconst StyledLayout = styled('div', {\n position: 'absolute',\n height: '100%',\n width: '100%',\n minHeight: 0,\n minWidth: 0,\n maxHeight: '100%',\n maxWidth: '100%',\n overflow: 'hidden',\n boxSizing: 'border-box',\n outline: 'none',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n background: '$canvas',\n\n '& input, textarea, button, select, label, button': {\n webkitTouchCallout: 'none',\n webkitUserSelect: 'none',\n '-webkit-tap-highlight-color': 'transparent',\n 'tap-highlight-color': 'transparent',\n },\n})\n\nconst StyledFigmaLayout = styled('div', {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n zIndex: 2,\n pointerEvents: 'none',\n})\n\nconst StyledTopBar = styled('div', {\n width: '100%',\n height: '40px',\n background: '$panel',\n borderBottom: '1px solid $separator',\n display: 'flex',\n alignItems: 'center',\n pointerEvents: 'all',\n flexShrink: 0,\n zIndex: 300,\n})\n\nconst StyledMainArea = styled('div', {\n display: 'flex',\n flex: 1,\n minHeight: 0,\n position: 'relative',\n})\n\nconst StyledCanvasWrap = styled('div', {\n flex: 1,\n position: 'relative',\n overflow: 'hidden',\n pointerEvents: 'all',\n minWidth: 0,\n\n '& .tv-container': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n zIndex: 1,\n },\n})\n", "import {\n ArrowTopRightIcon,\n CursorArrowIcon,\n ImageIcon,\n Pencil1Icon,\n TextIcon,\n} from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { useIntl } from 'react-intl'\nimport { EraserIcon } from '~components/Primitives/icons'\nimport { ShapesMenu } from '~components/ToolsPanel/ShapesMenu'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { TVShapeType, TVSnapshot } from '~types'\n\nconst activeToolSelector = (s: TVSnapshot) => s.appState.activeTool\nconst toolLockedSelector = (s: TVSnapshot) => s.appState.isToolLocked\nconst canvasModeSelector = (s: TVSnapshot) => s.settings.canvasMode\n\nexport const CenterToolbar = React.memo(function CenterToolbar() {\n const app = useTelvaApp()\n const intl = useIntl()\n const activeTool = app.useStore(activeToolSelector)\n const isToolLocked = app.useStore(toolLockedSelector)\n const canvasMode = app.useStore(canvasModeSelector)\n\n const selectSelectTool = React.useCallback(() => app.selectTool('select'), [app])\n const selectEraseTool = React.useCallback(() => app.selectTool('erase'), [app])\n const selectDrawTool = React.useCallback(() => app.selectTool(TVShapeType.Draw), [app])\n const selectPenTool = React.useCallback(() => app.selectTool(TVShapeType.Pen), [app])\n const selectArrowTool = React.useCallback(() => app.selectTool(TVShapeType.Arrow), [app])\n const selectTextTool = React.useCallback(() => app.selectTool(TVShapeType.Text), [app])\n const selectStickyTool = React.useCallback(() => app.selectTool(TVShapeType.Sticky), [app])\n const uploadMedias = React.useCallback(async () => app.openAsset(), [app])\n const toggleCanvasMode = React.useCallback(() => app.toggleCanvasMode(), [app])\n\n const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n e.stopPropagation()\n }, [])\n\n return (\n <StyledToolbarWrap onPointerDown={handlePointerDown}>\n <StyledToolbarPill>\n <ToolBtn\n onClick={selectSelectTool}\n isActive={activeTool === 'select'}\n title={intl.formatMessage({ id: 'select' })}\n >\n <CursorArrowIcon />\n </ToolBtn>\n\n <StyledDivider />\n\n <ToolBtn\n onClick={selectDrawTool}\n isActive={activeTool === TVShapeType.Draw}\n title={intl.formatMessage({ id: 'draw' })}\n >\n <Pencil1Icon />\n </ToolBtn>\n\n <ToolBtn\n onClick={selectEraseTool}\n isActive={activeTool === 'erase'}\n title={intl.formatMessage({ id: 'eraser' })}\n >\n <EraserIcon />\n </ToolBtn>\n\n <StyledDivider />\n\n <ShapesMenuWrap>\n <ShapesMenu activeTool={activeTool} isToolLocked={isToolLocked} />\n </ShapesMenuWrap>\n\n <ToolBtn\n onClick={selectArrowTool}\n isActive={activeTool === TVShapeType.Arrow}\n title={intl.formatMessage({ id: 'arrow' })}\n >\n <ArrowTopRightIcon />\n </ToolBtn>\n\n <ToolBtn\n onClick={selectTextTool}\n isActive={activeTool === TVShapeType.Text}\n title={intl.formatMessage({ id: 'text' })}\n >\n <TextIcon />\n </ToolBtn>\n\n <ToolBtn\n onClick={selectStickyTool}\n isActive={activeTool === TVShapeType.Sticky}\n title=\"Sticky Note\"\n >\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"2\"\n width=\"11\"\n height=\"11\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n <line x1=\"5\" y1=\"6\" x2=\"10\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <line x1=\"5\" y1=\"9\" x2=\"8\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </ToolBtn>\n\n <ToolBtn onClick={uploadMedias} title={intl.formatMessage({ id: 'image' })}>\n <ImageIcon />\n </ToolBtn>\n\n <StyledDivider />\n\n <ToolBtn\n onClick={toggleCanvasMode}\n isActive={canvasMode === 'straight'}\n title={canvasMode === 'freehand' ? 'Straight mode' : 'Freehand mode'}\n >\n {canvasMode === 'freehand' ? (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path\n d=\"M2 12C4 8 6 4 8 6C10 8 11 3 13 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n ) : (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path\n d=\"M2 12L7.5 3L13 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )}\n </ToolBtn>\n </StyledToolbarPill>\n </StyledToolbarWrap>\n )\n})\n\n// -- Styled --\n\nconst StyledToolbarWrap = styled('div', {\n position: 'absolute',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 300,\n pointerEvents: 'all',\n})\n\nconst StyledToolbarPill = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '6px 8px',\n background: '$panel',\n borderRadius: '$pill',\n boxShadow: '0 2px 16px rgba(0,0,0,0.25), 0 0 0 1px rgba(255,255,255,0.06)',\n backdropFilter: 'blur(12px)',\n})\n\nconst ToolBtn = styled('button', {\n all: 'unset',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n borderRadius: '$2',\n color: '$textSecondary',\n cursor: 'pointer',\n transition: 'all 0.12s ease',\n flexShrink: 0,\n\n '& svg': {\n width: '16px',\n height: '16px',\n },\n\n '&:hover': {\n background: '$hover',\n color: '$text',\n },\n\n variants: {\n isActive: {\n true: {\n background: '$accent',\n color: 'white',\n '&:hover': {\n background: '$accent',\n color: 'white',\n },\n },\n },\n },\n})\n\nconst StyledDivider = styled('div', {\n width: '1px',\n height: '20px',\n background: '$separator',\n margin: '0 4px',\n flexShrink: 0,\n opacity: 0.5,\n})\n\nconst ShapesMenuWrap = styled('div', {\n display: 'flex',\n '& button': {\n width: '36px',\n height: '36px',\n padding: 0,\n borderRadius: '$2',\n border: 'none',\n },\n '& [class*=\"StyledToolButtonInner\"]': {\n borderRadius: '$2',\n background: 'transparent',\n },\n})\n", "import * as React from 'react'\n\nexport function BoxIcon({\n fill = 'none',\n stroke = 'currentColor',\n strokeWidth = 2,\n}: {\n fill?: string\n stroke?: string\n strokeWidth?: number\n}) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n fill={fill}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function CircleIcon(\n props: Pick<React.SVGProps<SVGSVGElement>, 'strokeWidth' | 'stroke' | 'fill'> & {\n size: number\n }\n) {\n const { size = 16, ...rest } = props\n return (\n <svg width={24} height={24} {...rest}>\n <circle cx={12} cy={12} r={size / 2} />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function DashDashedIcon() {\n return (\n <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle\n cx={12}\n cy={12}\n r={8}\n fill=\"none\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeDasharray={50.26548 * 0.1}\n />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nconst dottedDasharray = `${50.26548 * 0.025} ${50.26548 * 0.1}`\n\nexport function DashDottedIcon() {\n return (\n <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle\n cx={12}\n cy={12}\n r={8}\n fill=\"none\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeDasharray={dottedDasharray}\n />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function DashDrawIcon() {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"1 1.5 21 22\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.0162 19.2768C10.0162 19.2768 9.90679 19.2517 9.6879 19.2017C9.46275 19.1454 9.12816 19.0422 8.68413 18.8921C8.23384 18.7358 7.81482 18.545 7.42707 18.3199C7.03307 18.101 6.62343 17.7883 6.19816 17.3818C5.77289 16.9753 5.33511 16.3718 4.88482 15.5713C4.43453 14.7645 4.1531 13.8545 4.04053 12.8414C3.92795 11.822 4.04991 10.8464 4.40639 9.91451C4.76286 8.98266 5.39452 8.10084 6.30135 7.26906C7.21444 6.44353 8.29325 5.83377 9.5378 5.43976C10.7823 5.05202 11.833 4.92068 12.6898 5.04576C13.5466 5.16459 14.3878 5.43664 15.2133 5.86191C16.0388 6.28718 16.7768 6.8688 17.4272 7.60678C18.0714 8.34475 18.5404 9.21406 18.8344 10.2147C19.1283 11.2153 19.1721 12.2598 18.9657 13.348C18.7593 14.4299 18.2872 15.4337 17.5492 16.3593C16.8112 17.2849 15.9263 18.0072 14.8944 18.5263C13.8624 19.0391 12.9056 19.3174 12.0238 19.3612C11.142 19.405 10.2101 19.2705 9.22823 18.9578C8.24635 18.6451 7.35828 18.151 6.56402 17.4756C5.77601 16.8002 6.08871 16.8658 7.50212 17.6726C8.90927 18.4731 10.1444 18.8484 11.2076 18.7983C12.2645 18.7545 13.2965 18.4825 14.3034 17.9822C15.3102 17.4819 16.1264 16.8221 16.7518 16.0028C17.3772 15.1835 17.7681 14.3111 17.9244 13.3855C18.0808 12.4599 18.0401 11.5781 17.8025 10.74C17.5586 9.902 17.1739 9.15464 16.6486 8.49797C16.1233 7.8413 15.2289 7.27844 13.9656 6.80939C12.7086 6.34034 11.4203 6.20901 10.1007 6.41539C8.78732 6.61552 7.69599 7.06893 6.82669 7.77564C5.96363 8.48859 5.34761 9.26409 4.97863 10.1021C4.60964 10.9402 4.45329 11.8376 4.50958 12.7945C4.56586 13.7513 4.79101 14.6238 5.18501 15.4118C5.57276 16.1998 5.96363 16.8002 6.35764 17.2129C6.75164 17.6257 7.13313 17.9509 7.50212 18.1886C7.87736 18.4325 8.28074 18.642 8.71227 18.8171C9.15005 18.9922 9.47839 19.111 9.69728 19.1736C9.91617 19.2361 10.0256 19.2705 10.0256 19.2768H10.0162Z\"\n strokeWidth=\"2\"\n />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function DashSolidIcon() {\n return (\n <svg width=\"24\" height=\"24\" stroke=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx={12} cy={12} r={8} fill=\"none\" strokeWidth={2} strokeLinecap=\"round\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function TrashIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={18}\n height={18}\n viewBox=\"0 0 15 15\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 4.656a.5.5 0 01.5-.5h9.7a.5.5 0 010 1H2.5a.5.5 0 01-.5-.5z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.272 3a.578.578 0 00-.578.578v.578h3.311v-.578A.578.578 0 008.428 3H6.272zm3.733 1.156v-.578A1.578 1.578 0 008.428 2H6.272a1.578 1.578 0 00-1.578 1.578v.578H3.578a.5.5 0 00-.5.5V12.2a1.578 1.578 0 001.577 1.578h5.39a1.578 1.578 0 001.577-1.578V4.656a.5.5 0 00-.5-.5h-1.117zm-5.927 1V12.2a.578.578 0 00.577.578h5.39a.578.578 0 00.577-.578V5.156H4.078z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.272 6.85a.5.5 0 01.5.5v3.233a.5.5 0 11-1 0V7.35a.5.5 0 01.5-.5zM8.428 6.85a.5.5 0 01.5.5v3.233a.5.5 0 11-1 0V7.35a.5.5 0 01.5-.5z\"\n />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function UndoIcon({\n flipHorizontal,\n ...props\n}: React.SVGProps<SVGSVGElement> & { flipHorizontal?: boolean }) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"0 0 15 15\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: flipHorizontal ? 'scale(-1, 1)' : 'scale(1, 1)',\n }}\n {...props}\n >\n <path d=\"M10.6707 8.5081C10.6707 10.1923 9.3004 11.5625 7.61631 11.5625H6.5351C6.35593 11.5625 6.21074 11.4173 6.21074 11.2382V11.13C6.21074 10.9508 6.35591 10.8057 6.5351 10.8057H7.61631C8.88313 10.8057 9.91387 9.77492 9.91387 8.5081C9.91387 7.24128 8.88313 6.21054 7.61631 6.21054H5.62155L6.99534 7.58433C7.14289 7.73183 7.14289 7.97195 6.99534 8.11944C6.85216 8.26251 6.60298 8.2623 6.46013 8.11944L4.44045 6.09971C4.36898 6.02824 4.32959 5.93321 4.32959 5.8321C4.32959 5.73106 4.36898 5.63598 4.44045 5.56454L6.46024 3.54472C6.60309 3.40176 6.85248 3.40176 6.99535 3.54472C7.14291 3.69218 7.14291 3.93234 6.99535 4.07979L5.62156 5.45368H7.61631C9.3004 5.45368 10.6707 6.82393 10.6707 8.5081Z\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function SizeSmallIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"-2 -2 28 28\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M12.4239 4.62C13.3572 4.62 14.1572 4.73333 14.8239 4.96C15.4906 5.17333 15.9772 5.43333 16.2839 5.74C16.3639 5.82 16.4039 5.94 16.4039 6.1V8.86H14.0639C13.9172 8.86 13.8439 8.78666 13.8439 8.64V7.26C13.4306 7.12666 12.9572 7.06 12.4239 7.06C11.6506 7.06 11.0639 7.18 10.6639 7.42C10.2639 7.66 10.0639 8.04666 10.0639 8.58V9C10.0639 9.38666 10.1639 9.69333 10.3639 9.92C10.5772 10.1333 11.0306 10.3467 11.7239 10.56L13.6439 11.14C14.4706 11.38 15.1172 11.66 15.5839 11.98C16.0506 12.3 16.3772 12.68 16.5639 13.12C16.7639 13.5467 16.8639 14.0733 16.8639 14.7V15.62C16.8639 16.7933 16.4039 17.7133 15.4839 18.38C14.5639 19.0467 13.2839 19.38 11.6439 19.38C10.6706 19.38 9.79723 19.2867 9.0239 19.1C8.2639 18.9133 7.71056 18.6533 7.3639 18.32C7.3239 18.28 7.29056 18.24 7.2639 18.2C7.25056 18.1467 7.2439 18.06 7.2439 17.94V15.74H7.6239C8.2239 16.1533 8.85056 16.4533 9.5039 16.64C10.1572 16.8267 10.9306 16.92 11.8239 16.92C12.6506 16.92 13.2506 16.7867 13.6239 16.52C14.0106 16.2533 14.2039 15.9333 14.2039 15.56V14.88C14.2039 14.6667 14.1639 14.48 14.0839 14.32C14.0172 14.16 13.8706 14.0133 13.6439 13.88C13.4172 13.7467 13.0572 13.6067 12.5639 13.46L10.6639 12.88C9.7839 12.6133 9.11056 12.3 8.6439 11.94C8.17723 11.58 7.85056 11.18 7.6639 10.74C7.49056 10.3 7.4039 9.83333 7.4039 9.34V8.38C7.4039 7.64666 7.61056 7 8.0239 6.44C8.43723 5.88 9.01723 5.44 9.7639 5.12C10.5239 4.78666 11.4106 4.62 12.4239 4.62Z\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function SizeMediumIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"-2 -2 28 28\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M8.16191 19H5.68191C5.53525 19 5.46191 18.9267 5.46191 18.78V5H8.76191C8.88191 5 8.97525 5.03333 9.04191 5.1C9.10858 5.15333 9.17525 5.27333 9.24191 5.46C9.72191 6.59333 10.1686 7.7 10.5819 8.78C11.0086 9.84667 11.4352 10.98 11.8619 12.18H12.1619C12.6019 10.9667 13.0352 9.79333 13.4619 8.66C13.8886 7.52667 14.3552 6.30667 14.8619 5H18.3219C18.4686 5 18.5419 5.07333 18.5419 5.22V19H16.0619C15.9152 19 15.8419 18.9267 15.8419 18.78V16.26C15.8419 15.5267 15.8486 14.8133 15.8619 14.12C15.8886 13.4267 15.9286 12.6867 15.9819 11.9C16.0486 11.1 16.1419 10.1933 16.2619 9.18H15.9019C15.4352 10.3533 14.9486 11.5667 14.4419 12.82C13.9486 14.06 13.4819 15.2333 13.0419 16.34H11.1019C11.0619 16.34 11.0152 16.3333 10.9619 16.32C10.9219 16.2933 10.8886 16.2467 10.8619 16.18C10.4619 15.18 10.0086 14.06 9.50191 12.82C9.00858 11.58 8.53525 10.3667 8.08191 9.18H7.70191C7.83525 10.18 7.93525 11.0733 8.00191 11.86C8.06858 12.6467 8.10858 13.3933 8.12191 14.1C8.14858 14.8067 8.16191 15.5267 8.16191 16.26V19Z\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function SizeLargeIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={24}\n height={24}\n viewBox=\"-2 -2 28 28\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M7.68191 19C7.53525 19 7.46191 18.9267 7.46191 18.78V5H10.1219C10.2686 5 10.3419 5.07333 10.3419 5.22V16.56H13.4419V15.02H15.7619C15.9086 15.02 15.9819 15.0933 15.9819 15.24V19H7.68191Z\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function EraserIcon() {\n return (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M1.72838 9.33987L8.84935 2.34732C9.23874 1.96494 9.86279 1.96539 10.2516 2.34831L13.5636 5.60975C13.9655 6.00555 13.9607 6.65526 13.553 7.04507L8.13212 12.2278C7.94604 12.4057 7.69851 12.505 7.44107 12.505L6.06722 12.505L3.83772 12.505C3.5673 12.505 3.30842 12.3954 3.12009 12.2014L1.7114 10.7498C1.32837 10.3551 1.33596 9.72521 1.72838 9.33987Z\"\n stroke=\"currentColor\"\n />\n <line\n x1=\"6.01807\"\n y1=\"12.5\"\n x2=\"10.7959\"\n y2=\"12.5\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n />\n <line x1=\"5.50834\" y1=\"5.74606\" x2=\"10.1984\" y2=\"10.4361\" stroke=\"currentColor\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function DiscordIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n >\n <path d=\"M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z\" />\n </svg>\n )\n}\n", "import * as React from 'react'\n\nexport function LineIcon() {\n return (\n <svg\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3.64645 11.3536C3.45118 11.1583 3.45118 10.8417 3.64645 10.6465L11.1464 3.14645C11.3417 2.95118 11.6583 2.95118 11.8536 3.14645C12.0488 3.34171 12.0488 3.65829 11.8536 3.85355L4.35355 11.3536C4.15829 11.5488 3.84171 11.5488 3.64645 11.3536Z\" />\n </svg>\n )\n}\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { CircleIcon, SquareIcon, VercelLogoIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { useIntl } from 'react-intl'\nimport { Panel } from '~components/Primitives/Panel'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { LineIcon } from '~components/Primitives/icons'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeType, TVSnapshot, TVToolType } from '~types'\n\ninterface ShapesMenuProps {\n activeTool: TVToolType\n isToolLocked: boolean\n}\n\ntype ShapeShape =\n | TVShapeType.Rectangle\n | TVShapeType.Ellipse\n | TVShapeType.Triangle\n | TVShapeType.Line\n\nconst shapeShapes: ShapeShape[] = [\n TVShapeType.Rectangle,\n TVShapeType.Ellipse,\n TVShapeType.Triangle,\n TVShapeType.Line,\n]\n\nconst shapeShapeIcons = {\n [TVShapeType.Rectangle]: <SquareIcon />,\n [TVShapeType.Ellipse]: <CircleIcon />,\n [TVShapeType.Triangle]: <VercelLogoIcon />,\n [TVShapeType.Line]: <LineIcon />,\n}\n\nconst dockPositionState = (s: TVSnapshot) => s.settings.dockPosition\n\nexport const ShapesMenu = React.memo(function ShapesMenu({\n activeTool,\n isToolLocked,\n}: ShapesMenuProps) {\n const app = useTelvaApp()\n const intl = useIntl()\n\n const dockPosition = app.useStore(dockPositionState)\n\n const [lastActiveTool, setLastActiveTool] = React.useState<ShapeShape>(TVShapeType.Rectangle)\n\n React.useEffect(() => {\n if (shapeShapes.includes(activeTool as ShapeShape) && lastActiveTool !== activeTool) {\n setLastActiveTool(activeTool as ShapeShape)\n }\n }, [activeTool])\n\n const selectShapeTool = React.useCallback(() => {\n app.selectTool(lastActiveTool)\n }, [activeTool, app])\n\n const handleDoubleClick = React.useCallback(() => {\n app.toggleToolLock()\n }, [app])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === ' ') {\n if (app.shiftKey) {\n e.preventDefault()\n }\n }\n }, [])\n\n const isActive = shapeShapes.includes(activeTool as ShapeShape)\n const contentSide = dockPosition === 'bottom' || dockPosition === 'top' ? 'top' : dockPosition\n\n const panelStyle = dockPosition === 'bottom' || dockPosition === 'top' ? 'row' : 'column'\n\n return (\n <DropdownMenu.Root dir=\"ltr\" onOpenChange={selectShapeTool}>\n <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-PrimaryTools-Shapes\">\n <ToolButton\n disabled={isActive && app.shiftKey} // otherwise this continuously opens and closes on \"SpacePanning\"\n variant=\"primary\"\n onDoubleClick={handleDoubleClick}\n isToolLocked={isActive && isToolLocked}\n isActive={isActive}\n onKeyDown={handleKeyDown}\n aria-label={intl.formatMessage({ id: 'shapes' })}\n >\n {shapeShapeIcons[lastActiveTool]}\n </ToolButton>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content asChild side={contentSide} sideOffset={12}>\n <Panel side=\"center\" style={{ flexDirection: panelStyle }}>\n {shapeShapes.map((shape, i) => (\n <Tooltip\n key={shape}\n label={intl.formatMessage({ id: shape })}\n kbd={(4 + i).toString()}\n id={`TD-PrimaryTools-Shapes-${shape}`}\n >\n <DropdownMenu.Item asChild>\n <ToolButton\n aria-label={intl.formatMessage({ id: shape })}\n variant=\"primary\"\n onClick={() => {\n app.selectTool(shape)\n setLastActiveTool(shape)\n }}\n >\n {shapeShapeIcons[shape]}\n </ToolButton>\n </DropdownMenu.Item>\n </Tooltip>\n ))}\n </Panel>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n )\n})\n", "import { createStitches, defaultThemeMap } from '@stitches/react'\n\nconst { styled, createTheme } = createStitches({\n themeMap: {\n ...defaultThemeMap,\n },\n theme: {\n colors: {\n bounds: 'rgba(13, 153, 255, 1)',\n boundsBg: 'rgba(13, 153, 255, 0.05)',\n hover: '#3a3a3a',\n overlay: 'rgba(0, 0, 0, 0.25)',\n overlayContrast: 'rgba(255, 255, 255, 0.1)',\n panel: '#2C2C2C',\n panelContrast: '#444444',\n selected: 'rgba(13, 153, 255, 1)',\n selectedContrast: '#ffffff',\n text: '#E8EAED',\n tooltip: '#1a1a1a',\n tooltipContrast: '#ffffff',\n warn: 'rgba(255, 100, 100, 1)',\n canvas: '#ffffffff',\n separator: '#444444',\n inputBg: '#383838',\n inputBorder: '#555555',\n textSecondary: '#9AA0A6',\n accent: '#0D99FF',\n },\n shadows: {\n 2: '0px 1px 2px rgba(0, 0, 0, 0.3)',\n 3: '0px 2px 4px rgba(0, 0, 0, 0.3)',\n 4: '0px 4px 8px rgba(0, 0, 0, 0.3)',\n 8: '0px 8px 16px rgba(0, 0, 0, 0.3)',\n 12: '0px 12px 24px rgba(0, 0, 0, 0.3)',\n 24: '0px 24px 48px rgba(0, 0, 0, 0.3)',\n key: '1px 1px rgba(0,0,0,1)',\n panel: `0px 0px 12px -2px rgba(0, 0, 0, 0.3), \n 0px 0px 8px -4px rgba(0, 0, 0, 0.2)`,\n },\n space: {\n 0: '2px',\n 1: '3px',\n 2: '4px',\n 3: '8px',\n 4: '12px',\n 5: '16px',\n 6: '32px',\n 7: '48px',\n },\n fontSizes: {\n 0: '10px',\n 1: '11px',\n 2: '12px',\n 3: '13px',\n 4: '16px',\n },\n fonts: {\n ui: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n body: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n mono: '\"Source Code Pro\", monospace',\n },\n fontWeights: {},\n lineHeights: {},\n letterSpacings: {},\n sizes: {},\n borderWidths: {\n 0: '$1',\n },\n borderStyles: {},\n radii: {\n 0: '4px',\n 1: '6px',\n 2: '8px',\n 3: '10px',\n 4: '14px',\n pill: '9999px',\n },\n zIndices: {},\n transitions: {},\n },\n media: {\n micro: '(max-width: 370px)',\n sm: '(min-width: 640px)',\n md: '(min-width: 768px)',\n lg: '(min-width: 1024px)',\n },\n utils: {\n zStrokeWidth: () => (value: number | number[]) => {\n if (Array.isArray(value)) {\n return {\n strokeWidth: `calc(${value[0]}px / var(--tv-zoom))`,\n }\n }\n\n return {\n strokeWidth: `calc(${value}px / var(--tv-zoom))`,\n }\n },\n },\n})\n\nexport const dark = createTheme({\n colors: {\n bounds: 'rgba(13, 153, 255, 1)',\n boundsBg: 'rgba(13, 153, 255, 0.05)',\n hover: '#444A50',\n overlay: 'rgba(0, 0, 0, 0.2)',\n overlayContrast: 'rgba(255, 255, 255, 0.1)',\n panel: '#1E1E1E',\n panelContrast: '#444444',\n selected: 'rgba(13, 153, 255, 1)',\n selectedContrast: '#ffffff',\n text: '#E8EAED',\n tooltip: '#111111',\n tooltipContrast: '#ffffff',\n canvas: '#141414',\n separator: '#333333',\n inputBg: '#2A2A2A',\n inputBorder: '#444444',\n textSecondary: '#888888',\n accent: '#0D99FF',\n },\n shadows: {\n 2: '0px 1px 2px rgba(0, 0, 0, 0.4)',\n 3: '0px 2px 4px rgba(0, 0, 0, 0.4)',\n 4: '0px 4px 8px rgba(0, 0, 0, 0.4)',\n 8: '0px 8px 16px rgba(0, 0, 0, 0.4)',\n 12: '0px 12px 24px rgba(0, 0, 0, 0.4)',\n 24: '0px 24px 48px rgba(0, 0, 0, 0.4)',\n panel: `0px 0px 12px -2px rgba(0, 0, 0, 0.4), \n 0px 0px 8px -4px rgba(0, 0, 0, 0.3)`,\n },\n})\n\nexport { styled }\n", "import { styled } from '~styles/stitches.config'\n\nexport const Panel = styled('div', {\n backgroundColor: '$panel',\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'row',\n padding: '$2',\n border: '1px solid $panelContrast',\n gap: 0,\n overflow: 'hidden',\n variants: {\n side: {\n center: {\n borderRadius: 9,\n },\n left: {\n padding: 0,\n borderTop: 0,\n borderLeft: 0,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 9,\n borderBottomLeftRadius: 0,\n },\n right: {\n padding: 0,\n borderTop: 0,\n borderRight: 0,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 9,\n borderBottomRightRadius: 0,\n },\n },\n },\n '& hr': {\n height: 10,\n width: '100%',\n backgroundColor: 'red',\n border: 'none',\n },\n})\n", "import * as React from 'react'\nimport { Tooltip } from '~components/Primitives/Tooltip'\nimport { breakpoints } from '~components/breakpoints'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\n\nexport interface ToolButtonProps {\n onClick?: () => void\n onSelect?: () => void\n onDoubleClick?: () => void\n disabled?: boolean\n isActive?: boolean\n isToolLocked?: boolean\n variant?: 'icon' | 'text' | 'circle' | 'primary'\n children: React.ReactNode\n id?: string\n onKeyDown?: React.KeyboardEventHandler<HTMLButtonElement>\n}\n\nexport const ToolButton = React.forwardRef<HTMLButtonElement, ToolButtonProps>(\n (\n {\n onSelect,\n onClick,\n onDoubleClick,\n variant,\n children,\n isToolLocked = false,\n disabled = false,\n isActive = false,\n onKeyDown,\n id,\n ...rest\n },\n ref\n ) => {\n return (\n <StyledToolButton\n ref={ref}\n isActive={isActive}\n variant={variant}\n onClick={onClick}\n disabled={disabled}\n onPointerDown={onSelect}\n onDoubleClick={onDoubleClick}\n onKeyDown={onKeyDown}\n bp={breakpoints}\n id={id}\n {...rest}\n >\n <StyledToolButtonInner>{children}</StyledToolButtonInner>\n {isToolLocked && <ToolLockIndicator />}\n </StyledToolButton>\n )\n }\n)\n\n/* ------------------ With Tooltip ------------------ */\n\ninterface ToolButtonWithTooltipProps extends ToolButtonProps {\n label: string\n isLocked?: boolean\n kbd?: string\n variant?: 'icon' | 'text' | 'circle' | 'primary'\n}\n\nexport function ToolButtonWithTooltip({\n label,\n kbd,\n variant,\n isLocked,\n ...rest\n}: ToolButtonWithTooltipProps) {\n const app = useTelvaApp()\n\n const handleDoubleClick = React.useCallback(() => {\n app.toggleToolLock()\n }, [])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === ' ' && app.isForcePanning) {\n e.preventDefault()\n }\n }, [])\n\n return (\n <Tooltip label={label[0].toUpperCase() + label.slice(1)} kbd={kbd}>\n <ToolButton\n {...rest}\n variant={variant}\n isToolLocked={isLocked && rest.isActive}\n onDoubleClick={handleDoubleClick}\n onKeyDown={handleKeyDown}\n aria-label={label[0].toUpperCase() + label.slice(1)}\n />\n </Tooltip>\n )\n}\n\nexport const StyledToolButtonInner = styled('div', {\n position: 'relative',\n height: '100%',\n width: '100%',\n backgroundColor: '$panel',\n borderRadius: '$2',\n margin: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: '$ui',\n color: 'inherit',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n boxSizing: 'border-box',\n border: '1px solid transparent',\n '-webkit-tap-highlight-color': 'transparent',\n 'tap-highlight-color': 'transparent',\n})\n\nexport const StyledToolButton = styled('button', {\n position: 'relative',\n color: '$text',\n fontSize: '$0',\n background: 'none',\n margin: '0',\n padding: '$2',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n outline: 'none',\n cursor: 'pointer',\n pointerEvents: 'all',\n height: '40px',\n width: '40px',\n border: '1px solid $panel',\n '-webkit-tap-highlight-color': 'transparent',\n 'tap-highlight-color': 'transparent',\n\n [`&:disabled ${StyledToolButtonInner}`]: {\n opacity: 0.618,\n },\n\n variants: {\n variant: {\n primary: {\n marginTop: '0',\n },\n icon: {\n [`& ${StyledToolButtonInner}`]: {\n display: 'grid',\n '& > *': {\n gridRow: 1,\n gridColumn: 1,\n },\n },\n },\n text: {\n width: 'auto',\n [`& ${StyledToolButtonInner}`]: {\n fontSize: '$1',\n padding: '0 $3',\n gap: '$3',\n },\n },\n circle: {\n padding: 0,\n height: 32,\n width: 32,\n border: 'none',\n [`& ${StyledToolButtonInner}`]: {\n border: '1px solid $panelContrast',\n borderRadius: '100%',\n boxShadow: '$panel',\n },\n [`& ${StyledToolButtonInner} > svg`]: {\n width: 14,\n height: 14,\n },\n },\n },\n isActive: {\n true: {},\n false: {},\n },\n bp: {\n mobile: {\n padding: 0,\n },\n small: {},\n },\n },\n compoundVariants: [\n {\n variant: 'primary',\n bp: 'mobile',\n css: {\n height: 40,\n width: 36,\n [`& ${StyledToolButtonInner} > svg`]: {\n width: 16,\n height: 16,\n },\n },\n },\n {\n variant: 'primary',\n bp: 'small',\n css: {\n height: '40px',\n width: '40px',\n [`& ${StyledToolButtonInner} > svg`]: {\n width: 20,\n height: 20,\n },\n },\n },\n {\n isActive: true,\n css: {\n [`${StyledToolButtonInner}`]: {\n backgroundColor: '$selected',\n color: '$selectedContrast',\n },\n },\n },\n {\n isActive: false,\n bp: 'small',\n css: {\n [`&:hover:not(:disabled) ${StyledToolButtonInner}`]: {\n backgroundColor: '$hover',\n },\n [`&:focus:not(:disabled) ${StyledToolButtonInner}`]: {\n backgroundColor: '$hover',\n },\n },\n },\n ],\n})\n\nconst ToolLockIndicator = styled('div', {\n position: 'absolute',\n width: 10,\n height: 10,\n backgroundColor: '$selected',\n borderRadius: '100%',\n bottom: -2,\n border: '2px solid $panel',\n zIndex: 100,\n})\n", "import * as RadixTooltip from '@radix-ui/react-tooltip'\nimport * as React from 'react'\nimport { Kbd } from '~components/Primitives/Kbd'\nimport { styled } from '~styles'\n\n/* -------------------------------------------------- */\n/* Tooltip */\n/* -------------------------------------------------- */\n\ninterface TooltipProps {\n children: React.ReactNode\n label: string\n kbd?: string\n id?: string\n side?: 'bottom' | 'left' | 'right' | 'top'\n}\n\nexport function Tooltip({ children, label, kbd: kbdProp, id, side = 'top' }: TooltipProps) {\n return (\n <span id={id}>\n <RadixTooltip.Provider>\n <RadixTooltip.Root>\n <RadixTooltip.Trigger dir=\"ltr\" asChild={true}>\n <span>{children}</span>\n </RadixTooltip.Trigger>\n <StyledContent dir=\"ltr\" side={side} sideOffset={8}>\n {label}\n {kbdProp ? <Kbd variant=\"tooltip\">{kbdProp}</Kbd> : null}\n <StyledArrow />\n </StyledContent>\n </RadixTooltip.Root>\n </RadixTooltip.Provider>\n </span>\n )\n}\n\nconst StyledContent = styled(RadixTooltip.Content, {\n borderRadius: 3,\n padding: '$3 $3 $3 $3',\n fontSize: '$1',\n backgroundColor: '$tooltip',\n color: '$tooltipContrast',\n boxShadow: '$3',\n display: 'flex',\n alignItems: 'center',\n fontFamily: '$ui',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n})\n\nconst StyledArrow = styled(RadixTooltip.Arrow, {\n fill: '$tooltip',\n margin: '0 8px',\n})\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport { styled } from '~styles'\n\n/* -------------------------------------------------- */\n/* Keyboard Shortcut */\n/* -------------------------------------------------- */\n\nconst commandKey = () => (Utils.isDarwin() ? '\u2318' : 'Ctrl')\n\nexport function Kbd({ variant, children }: { variant: 'tooltip' | 'menu'; children: string }) {\n return (\n <StyledKbd variant={variant}>\n {children.split('').map((k, i) => {\n return <span key={i}>{k.replace('#', commandKey())}</span>\n })}\n </StyledKbd>\n )\n}\n\nexport const StyledKbd = styled('kbd', {\n marginLeft: '$3',\n textShadow: '$2',\n textAlign: 'center',\n fontSize: '$0',\n fontFamily: '$ui',\n color: '$text',\n background: 'none',\n fontWeight: 400,\n gap: '$1',\n display: 'flex',\n alignItems: 'center',\n\n '& > span': {\n padding: '$0',\n borderRadius: '$0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n\n variants: {\n variant: {\n tooltip: {\n '& > span': {\n color: '$tooltipContrast',\n background: '$overlayContrast',\n boxShadow: '$key',\n width: '20px',\n height: '20px',\n },\n },\n menu: {},\n },\n },\n})\n", "/* -------------------------------------------------- */\n/* Breakpoints */\n/* -------------------------------------------------- */\n\nexport const breakpoints: any = {\n '@initial': 'mobile',\n '@micro': 'micro',\n '@sm': 'small',\n '@md': 'medium',\n '@lg': 'large',\n}\n", "import * as React from 'react'\nimport type { TelvaApp } from '~state'\nimport { DialogState } from './useDialog'\n\nexport function useFileSystem() {\n const onNewProject = React.useCallback(\n async (\n app: TelvaApp,\n openDialog: (\n dialogState: DialogState,\n onYes: () => Promise<void>,\n onNo: () => Promise<void>,\n onCancel: () => Promise<void>\n ) => void\n ) => {\n openDialog(\n app.fileSystemHandle ? 'saveFirstTime' : 'saveAgain',\n async () => {\n // user pressed yes\n try {\n await app.saveProject()\n app.newProject()\n } catch (e) {\n // noop\n }\n },\n async () => {\n // user pressed no\n app.newProject()\n },\n async () => {\n // user pressed cancel\n }\n )\n },\n []\n )\n\n const onOpenProject = React.useCallback(\n async (\n app: TelvaApp,\n openDialog: (\n dialogState: DialogState,\n onYes: () => Promise<void>,\n onNo: () => Promise<void>,\n onCancel: () => Promise<void>\n ) => void\n ) => {\n // If there's no open file and the document is clean, open directly\n if (!app.fileSystemHandle && !app.isDirty) {\n app.openProject()\n return\n }\n\n // Otherwise ask the user if they want to save first\n openDialog(\n app.fileSystemHandle ? 'saveFirstTime' : 'saveAgain',\n async () => {\n // user pressed yes \u2014 save then open\n try {\n await app.saveProject()\n await app.openProject()\n } catch (e) {\n // noop\n }\n },\n async () => {\n // user pressed no \u2014 just open\n app.openProject()\n },\n async () => {\n // user pressed cancel\n }\n )\n },\n []\n )\n\n const onSaveProject = React.useCallback((app: TelvaApp) => {\n app.saveProject()\n }, [])\n\n const onSaveProjectAs = React.useCallback((app: TelvaApp) => {\n app.saveProjectAs()\n }, [])\n\n const onOpenMedia = React.useCallback(async (app: TelvaApp) => {\n app.openAsset?.()\n }, [])\n\n return {\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n }\n}\n", "import * as React from 'react'\nimport { useDialog, useTelvaApp } from '~hooks'\n\nexport function useFileSystemHandlers() {\n const app = useTelvaApp()\n\n const { openDialog } = useDialog()\n\n const onNewProject = React.useCallback(\n async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n if (e && app.callbacks.onOpenProject) e.preventDefault()\n app.callbacks.onNewProject?.(app, openDialog)\n },\n [app, openDialog]\n )\n\n const onSaveProject = React.useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n if (e && app.callbacks.onOpenProject) e.preventDefault()\n app.callbacks.onSaveProject?.(app)\n },\n [app]\n )\n\n const onSaveProjectAs = React.useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n if (e && app.callbacks.onOpenProject) e.preventDefault()\n app.callbacks.onSaveProjectAs?.(app)\n },\n [app]\n )\n\n const onOpenProject = React.useCallback(\n async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n if (e && app.callbacks.onOpenProject) e.preventDefault()\n app.callbacks.onOpenProject?.(app, openDialog)\n },\n [app, openDialog]\n )\n\n const onOpenMedia = React.useCallback(\n async (e?: React.MouseEvent | React.KeyboardEvent | KeyboardEvent) => {\n if (e && app.callbacks.onOpenMedia) e.preventDefault()\n app.callbacks.onOpenMedia?.(app)\n },\n [app]\n )\n\n return {\n onNewProject,\n onSaveProject,\n onSaveProjectAs,\n onOpenProject,\n onOpenMedia,\n }\n}\n", "import * as React from 'react'\nimport { useHotkeys } from 'react-hotkeys-hook'\nimport { useFileSystemHandlers, useTelvaApp } from '~hooks'\nimport { AlignStyle, TVExportType, TVShapeType } from '~types'\n\nexport function useKeyboardShortcuts(ref: React.RefObject<HTMLDivElement>) {\n const app = useTelvaApp()\n\n const canHandleEvent = React.useCallback(\n (ignoreMenus = false) => {\n const elm = ref.current\n if (ignoreMenus && (app.isMenuOpen || app.settings.keepStyleMenuOpen)) return true\n return elm && (document.activeElement === elm || elm.contains(document.activeElement))\n },\n [ref]\n )\n\n React.useEffect(() => {\n if (!app) return\n\n const handleCut = (e: ClipboardEvent) => {\n if (!canHandleEvent(true)) return\n\n if (app.readOnly) {\n app.copy(undefined, e)\n return\n }\n\n app.cut(undefined, e)\n }\n\n const handleCopy = (e: ClipboardEvent) => {\n if (!canHandleEvent(true)) return\n\n app.copy(undefined, e)\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n if (!canHandleEvent(true)) return\n if (app.readOnly) return\n\n app.paste(undefined, e)\n }\n\n document.addEventListener('cut', handleCut)\n document.addEventListener('copy', handleCopy)\n document.addEventListener('paste', handlePaste)\n return () => {\n document.removeEventListener('cut', handleCut)\n document.removeEventListener('copy', handleCopy)\n document.removeEventListener('paste', handlePaste)\n }\n }, [app])\n\n /* ---------------------- Tools --------------------- */\n\n useHotkeys(\n 'v,1',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool('select')\n },\n [app, ref.current]\n )\n\n useHotkeys(\n 'd,p,2',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Draw)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'e,3',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool('erase')\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'r,4',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Rectangle)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'o,5',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Ellipse)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'g,6',\n () => {\n if (!canHandleEvent()) return\n app.selectTool(TVShapeType.Triangle)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'l,7',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Line)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'a,8',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Arrow)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 't,9',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Text)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 's,0',\n () => {\n if (!canHandleEvent(true)) return\n app.selectTool(TVShapeType.Sticky)\n },\n undefined,\n [app]\n )\n\n /* ---------------------- Misc ---------------------- */\n\n // Dark Mode\n\n useHotkeys(\n 'ctrl+shift+d,\u2318+shift+d',\n (e) => {\n if (!canHandleEvent(true)) return\n app.toggleDarkMode()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n // Focus Mode\n\n useHotkeys(\n 'ctrl+.,\u2318+.',\n () => {\n if (!canHandleEvent(true)) return\n app.toggleFocusMode()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+shift+g,\u2318+shift+g',\n () => {\n if (!canHandleEvent(true)) return\n app.toggleGrid()\n },\n undefined,\n [app]\n )\n\n // File System\n\n const { onNewProject, onOpenProject, onSaveProject, onSaveProjectAs, onOpenMedia } =\n useFileSystemHandlers()\n\n useHotkeys(\n 'ctrl+n,\u2318+n',\n (e) => {\n e.preventDefault()\n if (!canHandleEvent()) return\n onNewProject(e)\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+s,\u2318+s',\n (e) => {\n if (!canHandleEvent()) return\n\n onSaveProject(e)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+shift+s,\u2318+shift+s',\n (e) => {\n if (!canHandleEvent()) return\n\n onSaveProjectAs(e)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+alt+1,\u2318+alt+1',\n (e) => {\n if (!canHandleEvent()) return\n\n app.exportImage(TVExportType.SVG, { scale: 2, quality: 1 })\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+alt+2,\u2318+alt+2',\n (e) => {\n if (!canHandleEvent()) return\n\n app.exportImage(TVExportType.PNG, { scale: 2, quality: 1 })\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+alt+3,\u2318+alt+3',\n (e) => {\n if (!canHandleEvent()) return\n\n app.exportImage(TVExportType.JPG, { scale: 2, quality: 1 })\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+alt+4,\u2318+alt+4',\n (e) => {\n if (!canHandleEvent()) return\n\n app.exportImage(TVExportType.WEBP, { scale: 2, quality: 1 })\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+alt+5,\u2318+alt+5',\n (e) => {\n if (!canHandleEvent()) return\n\n app.exportJson()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+o,\u2318+o',\n (e) => {\n if (!canHandleEvent()) return\n\n onOpenProject(e)\n },\n undefined,\n [app]\n )\n useHotkeys(\n 'ctrl+u,\u2318+u',\n (e) => {\n if (!canHandleEvent()) return\n onOpenMedia(e)\n },\n undefined,\n [app]\n )\n\n // Undo Redo\n\n useHotkeys(\n '\u2318+z,ctrl+z',\n (e) => {\n e.preventDefault()\n if (!canHandleEvent(true)) return\n\n if (app.session) {\n app.cancelSession()\n } else {\n app.undo()\n }\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+shift+z,\u2318+shift+z',\n () => {\n if (!canHandleEvent(true)) return\n\n if (app.session) {\n app.cancelSession()\n } else {\n app.redo()\n }\n },\n undefined,\n [app]\n )\n\n // Undo Redo\n\n useHotkeys(\n '\u2318+u,ctrl+u',\n () => {\n if (!canHandleEvent()) return\n app.undoSelect()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+shift-u,\u2318+shift+u',\n () => {\n if (!canHandleEvent()) return\n app.redoSelect()\n },\n undefined,\n [app]\n )\n\n /* -------------------- Commands -------------------- */\n\n // Camera\n\n useHotkeys(\n 'ctrl+=,\u2318+=,ctrl+num_add,\u2318+num_add',\n (e) => {\n if (!canHandleEvent(true)) return\n app.zoomIn()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+-,\u2318+-,ctrl+num_subtract,\u2318+num_subtract',\n (e) => {\n if (!canHandleEvent(true)) return\n\n app.zoomOut()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+0,ctrl+numpad_0,\u2318+numpad_0',\n () => {\n if (!canHandleEvent(true)) return\n app.resetZoom()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+1',\n () => {\n if (!canHandleEvent(true)) return\n app.zoomToFit()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+2',\n () => {\n if (!canHandleEvent(true)) return\n app.zoomToSelection()\n },\n undefined,\n [app]\n )\n\n // Duplicate\n\n useHotkeys(\n 'ctrl+d,\u2318+d',\n (e) => {\n if (!canHandleEvent()) return\n\n app.duplicate()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n // Flip\n\n useHotkeys(\n 'shift+h',\n () => {\n if (!canHandleEvent(true)) return\n app.flipHorizontal()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+v',\n () => {\n if (!canHandleEvent(true)) return\n app.flipVertical()\n },\n undefined,\n [app]\n )\n\n // Cancel\n\n useHotkeys(\n 'escape',\n () => {\n if (!canHandleEvent(true)) return\n\n app.cancel()\n },\n undefined,\n [app]\n )\n\n // Delete\n\n useHotkeys(\n 'backspace,del',\n () => {\n if (!canHandleEvent()) return\n app.delete()\n },\n undefined,\n [app]\n )\n\n // Select All\n\n useHotkeys(\n '\u2318+a,ctrl+a',\n () => {\n if (!canHandleEvent(true)) return\n app.selectAll()\n },\n undefined,\n [app]\n )\n\n // Nudge\n\n useHotkeys(\n 'up',\n () => {\n if (!canHandleEvent()) return\n app.nudge([0, -1], false)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'right',\n () => {\n if (!canHandleEvent()) return\n app.nudge([1, 0], false)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'down',\n () => {\n if (!canHandleEvent()) return\n app.nudge([0, 1], false)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'left',\n () => {\n if (!canHandleEvent()) return\n app.nudge([-1, 0], false)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+up',\n () => {\n if (!canHandleEvent()) return\n app.nudge([0, -1], true)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+right',\n () => {\n if (!canHandleEvent()) return\n app.nudge([1, 0], true)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+down',\n () => {\n if (!canHandleEvent()) return\n app.nudge([0, 1], true)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+left',\n () => {\n if (!canHandleEvent()) return\n app.nudge([-1, 0], true)\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n '\u2318+shift+l,ctrl+shift+l',\n () => {\n if (!canHandleEvent()) return\n app.toggleLocked()\n },\n undefined,\n [app]\n )\n\n // Copy, Cut & Paste\n\n // useHotkeys(\n // '\u2318+c,ctrl+c',\n // () => {\n // if (!canHandleEvent()) return\n // app.copy()\n // },\n // undefined,\n // [app]\n // )\n\n useHotkeys(\n '\u2318+shift+c,ctrl+shift+c',\n (e) => {\n if (!canHandleEvent()) return\n\n app.copySvg()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n // useHotkeys(\n // '\u2318+x,ctrl+x',\n // () => {\n // if (!canHandleEvent()) return\n // app.cut()\n // },\n // undefined,\n // [app]\n // )\n\n // useHotkeys(\n // '\u2318+v,ctrl+v',\n // () => {\n // if (!canHandleEvent()) return\n\n // app.paste()\n // },\n // undefined,\n // [app]\n // )\n\n // Group & Ungroup\n\n useHotkeys(\n '\u2318+g,ctrl+g',\n (e) => {\n if (!canHandleEvent()) return\n\n app.group()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n '\u2318+shift+g,ctrl+shift+g',\n (e) => {\n if (!canHandleEvent()) return\n\n app.ungroup()\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n // Move\n\n useHotkeys(\n '[',\n () => {\n if (!canHandleEvent(true)) return\n app.moveBackward()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n ']',\n () => {\n if (!canHandleEvent(true)) return\n app.moveForward()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+[',\n () => {\n if (!canHandleEvent(true)) return\n app.moveToBack()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'shift+]',\n () => {\n if (!canHandleEvent(true)) return\n app.moveToFront()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'ctrl+shift+backspace,\u2318+shift+backspace',\n (e) => {\n if (!canHandleEvent()) return\n if (app.settings.isDebugMode) {\n app.resetDocument()\n }\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n // Text Align\n\n useHotkeys(\n 'alt+command+l,alt+ctrl+l',\n (e) => {\n if (!canHandleEvent(true)) return\n app.style({ textAlign: AlignStyle.Start })\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'alt+command+t,alt+ctrl+t',\n (e) => {\n if (!canHandleEvent(true)) return\n app.style({ textAlign: AlignStyle.Middle })\n e.preventDefault()\n },\n undefined,\n [app]\n )\n\n useHotkeys(\n 'alt+command+r,alt+ctrl+r',\n (e) => {\n if (!canHandleEvent(true)) return\n app.style({ textAlign: AlignStyle.End })\n e.preventDefault()\n },\n undefined,\n [app]\n )\n}\n", "import type {\n TLAsset,\n TLBinding,\n TLBoundsCorner,\n TLBoundsEdge,\n TLBoundsEventHandler,\n TLBoundsHandleEventHandler,\n TLCanvasEventHandler,\n TLHandle,\n TLKeyboardEventHandler,\n TLPage,\n TLPageState,\n TLPinchEventHandler,\n TLPointerEventHandler,\n TLShape,\n TLShapeBlurHandler,\n TLShapeCloneHandler,\n TLSnapLine,\n TLUser,\n TLWheelEventHandler,\n} from 'telva-core'\nimport { TVLanguage } from '~translations'\n\n/* -------------------------------------------------- */\n/* App */\n/* -------------------------------------------------- */\n\n// A base class for all classes that handle events from the Renderer,\n// including TVApp and all Tools.\nexport class TVEventHandler {\n onPinchStart?: TLPinchEventHandler\n onPinchEnd?: TLPinchEventHandler\n onPinch?: TLPinchEventHandler\n onKeyDown?: TLKeyboardEventHandler\n onKeyUp?: TLKeyboardEventHandler\n onPointerMove?: TLPointerEventHandler\n onPointerUp?: TLPointerEventHandler\n onPan?: TLWheelEventHandler\n onZoom?: TLWheelEventHandler\n onPointerDown?: TLPointerEventHandler\n onPointCanvas?: TLCanvasEventHandler\n onDoubleClickCanvas?: TLCanvasEventHandler\n onRightPointCanvas?: TLCanvasEventHandler\n onDragCanvas?: TLCanvasEventHandler\n onReleaseCanvas?: TLCanvasEventHandler\n onPointShape?: TLPointerEventHandler\n onDoubleClickShape?: TLPointerEventHandler\n onRightPointShape?: TLPointerEventHandler\n onDragShape?: TLPointerEventHandler\n onHoverShape?: TLPointerEventHandler\n onUnhoverShape?: TLPointerEventHandler\n onReleaseShape?: TLPointerEventHandler\n onPointBounds?: TLBoundsEventHandler\n onDoubleClickBounds?: TLBoundsEventHandler\n onRightPointBounds?: TLBoundsEventHandler\n onDragBounds?: TLBoundsEventHandler\n onHoverBounds?: TLBoundsEventHandler\n onUnhoverBounds?: TLBoundsEventHandler\n onReleaseBounds?: TLBoundsEventHandler\n onPointBoundsHandle?: TLBoundsHandleEventHandler\n onDoubleClickBoundsHandle?: TLBoundsHandleEventHandler\n onRightPointBoundsHandle?: TLBoundsHandleEventHandler\n onDragBoundsHandle?: TLBoundsHandleEventHandler\n onHoverBoundsHandle?: TLBoundsHandleEventHandler\n onUnhoverBoundsHandle?: TLBoundsHandleEventHandler\n onReleaseBoundsHandle?: TLBoundsHandleEventHandler\n onPointHandle?: TLPointerEventHandler\n onDoubleClickHandle?: TLPointerEventHandler\n onRightPointHandle?: TLPointerEventHandler\n onDragHandle?: TLPointerEventHandler\n onHoverHandle?: TLPointerEventHandler\n onUnhoverHandle?: TLPointerEventHandler\n onReleaseHandle?: TLPointerEventHandler\n onShapeBlur?: TLShapeBlurHandler\n onShapeClone?: TLShapeCloneHandler\n}\n\nexport type TVDockPosition = 'bottom' | 'left' | 'right' | 'top'\n\n// The shape of the TelvaApp's React (zustand) store\nexport interface TVSnapshot {\n settings: {\n isCadSelectMode: boolean\n isDarkMode: boolean\n isDebugMode: boolean\n isPenMode: boolean\n isReadonlyMode: boolean\n isZoomSnap: boolean\n keepStyleMenuOpen: boolean\n nudgeDistanceSmall: number\n nudgeDistanceLarge: number\n isFocusMode: boolean\n isSnapping: boolean\n showRotateHandles: boolean\n showBindingHandles: boolean\n showCloneHandles: boolean\n showGrid: boolean\n language: TVLanguage\n dockPosition: TVDockPosition\n exportBackground: TVExportBackground\n canvasMode: 'freehand' | 'straight'\n }\n appState: {\n currentStyle: ShapeStyles\n currentPageId: string\n hoveredId?: string\n activeTool: TVToolType\n isToolLocked: boolean\n isEmptyCanvas: boolean\n isMenuOpen: boolean\n status: string\n snapLines: TLSnapLine[]\n eraseLine: number[][]\n isLoading: boolean\n disableAssets: boolean\n selectByContain?: boolean\n nodeEditingId?: string\n }\n document: TVDocument\n room?: {\n id: string\n userId: string\n users: Record<string, TVUser>\n }\n}\n\nexport type TelvaPatch = Patch<TVSnapshot>\n\nexport type TelvaCommand = Command<TVSnapshot>\n\n// The shape of the files stored in JSON\nexport interface TVFile {\n name: string\n fileHandle: FileSystemFileHandle | null\n document: TVDocument\n}\n\n// The shape of the Telva document\nexport interface TVDocument {\n id: string\n name: string\n version: number\n pages: Record<string, TVPage>\n pageStates: Record<string, TLPageState>\n assets: TVAssets\n}\n\n// The shape of a single page in the Telva document\nexport type TVPage = TLPage<TVShape, TVBinding>\n\n// A partial of a TVPage, used for commands / patches\nexport type PagePartial = {\n shapes: Patch<TVPage['shapes']>\n bindings: Patch<TVPage['bindings']>\n}\n\n// The meta information passed to TVShapeUtil components\nexport interface TVMeta {\n isDarkMode: boolean\n canvasMode: 'freehand' | 'straight'\n nodeEditingId?: string\n}\n\n// The type of info given to shapes when transforming\nexport interface TransformInfo<T extends TLShape> {\n type: TLBoundsEdge | TLBoundsCorner\n initialShape: T\n scaleX: number\n scaleY: number\n transformOrigin: number[]\n}\n\n// The status of a TVUser\nexport enum TVUserStatus {\n Idle = 'idle',\n Connecting = 'connecting',\n Connected = 'connected',\n Disconnected = 'disconnected',\n}\n\n// A TVUser, for multiplayer rooms\nexport interface TVUser extends TLUser {\n activeShapes: TVShape[]\n status: TVUserStatus\n session?: boolean\n}\n\nexport type Theme = 'dark' | 'light'\n\nexport enum SessionType {\n Transform = 'transform',\n Translate = 'translate',\n TransformSingle = 'transformSingle',\n Brush = 'brush',\n Arrow = 'arrow',\n Draw = 'draw',\n Erase = 'erase',\n Rotate = 'rotate',\n Handle = 'handle',\n Grid = 'grid',\n Edit = 'edit',\n}\n\nexport enum TVStatus {\n Idle = 'idle',\n PointingHandle = 'pointingHandle',\n PointingBounds = 'pointingBounds',\n PointingBoundsHandle = 'pointingBoundsHandle',\n TranslatingLabel = 'translatingLabel',\n TranslatingHandle = 'translatingHandle',\n Translating = 'translating',\n Transforming = 'transforming',\n Rotating = 'rotating',\n Pinching = 'pinching',\n Brushing = 'brushing',\n Creating = 'creating',\n EditingText = 'editing-text',\n}\n\nexport type TVToolType =\n | 'select'\n | 'erase'\n | TVShapeType.Text\n | TVShapeType.Draw\n | TVShapeType.Pen\n | TVShapeType.Ellipse\n | TVShapeType.Rectangle\n | TVShapeType.Triangle\n | TVShapeType.Line\n | TVShapeType.Arrow\n | TVShapeType.Sticky\n\nexport type Easing =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart'\n | 'easeInQuint'\n | 'easeOutQuint'\n | 'easeInOutQuint'\n | 'easeInSine'\n | 'easeOutSine'\n | 'easeInOutSine'\n | 'easeInExpo'\n | 'easeOutExpo'\n | 'easeInOutExpo'\n\nexport enum MoveType {\n Backward = 'backward',\n Forward = 'forward',\n ToFront = 'toFront',\n ToBack = 'toBack',\n}\n\nexport enum AlignType {\n Top = 'top',\n CenterVertical = 'centerVertical',\n Bottom = 'bottom',\n Left = 'left',\n CenterHorizontal = 'centerHorizontal',\n Right = 'right',\n}\n\nexport enum StretchType {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\nexport enum DistributeType {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\nexport enum FlipType {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\n/* -------------------------------------------------- */\n/* Shapes */\n/* -------------------------------------------------- */\n\nexport enum TVShapeType {\n Sticky = 'sticky',\n Ellipse = 'ellipse',\n Rectangle = 'rectangle',\n Triangle = 'triangle',\n Draw = 'draw',\n Arrow = 'arrow',\n Line = 'line',\n Text = 'text',\n Group = 'group',\n Image = 'image',\n Video = 'video',\n ReactComponent = 'reactComponent',\n Pen = 'pen',\n}\n\nexport enum Decoration {\n Arrow = 'arrow',\n}\n\nexport type EffectType =\n | 'dropShadow'\n | 'layerBlur'\n | 'blur'\n | 'brightness'\n | 'contrast'\n | 'saturate'\n | 'hueRotate'\n | 'grayscale'\n | 'sepia'\n | 'invert'\n\nexport interface TVEffect {\n id: string\n type: EffectType\n enabled: boolean\n value?: number // default value placeholder\n // Specific to dropShadow\n x?: number\n y?: number\n blur?: number\n spread?: number\n color?: string\n}\n\nexport interface TVBaseShape extends TLShape {\n style: ShapeStyles\n type: TVShapeType\n label?: string\n handles?: Record<string, TVHandle>\n effects?: TVEffect[] | Record<string, any>\n}\n\nexport interface DrawShape extends TVBaseShape {\n type: TVShapeType.Draw\n points: number[][]\n isComplete: boolean\n}\n\n// The extended handle (used for arrows)\nexport interface TVHandle extends TLHandle {\n canBind?: boolean\n bindingId?: string\n}\n\nexport interface RectangleShape extends TVBaseShape {\n type: TVShapeType.Rectangle\n size: number[]\n label?: string\n labelPoint?: number[]\n}\n\nexport interface EllipseShape extends TVBaseShape {\n type: TVShapeType.Ellipse\n radius: number[]\n label?: string\n labelPoint?: number[]\n}\n\nexport interface TriangleShape extends TVBaseShape {\n type: TVShapeType.Triangle\n size: number[]\n label?: string\n labelPoint?: number[]\n}\n\n// The shape created with the arrow tool\nexport interface ArrowShape extends TVBaseShape {\n type: TVShapeType.Arrow\n bend: number\n handles: {\n start: TVHandle\n bend: TVHandle\n end: TVHandle\n }\n decorations?: {\n start?: Decoration\n end?: Decoration\n middle?: Decoration\n }\n label?: string\n labelPoint?: number[]\n}\n\nexport interface ArrowBinding extends TLBinding {\n handleId: keyof ArrowShape['handles']\n distance: number\n point: number[]\n}\n\nexport type TVBinding = ArrowBinding\n\nexport interface ImageShape extends TVBaseShape {\n type: TVShapeType.Image\n size: number[]\n assetId: string\n}\n\nexport interface VideoShape extends TVBaseShape {\n type: TVShapeType.Video\n size: number[]\n assetId: string\n isPlaying: boolean\n currentTime: number\n}\n\n// The shape created by the text tool\nexport interface TextShape extends TVBaseShape {\n type: TVShapeType.Text\n text: string\n size?: number[]\n}\n\n// The shape created by the sticky tool\nexport interface StickyShape extends TVBaseShape {\n type: TVShapeType.Sticky\n size: number[]\n text: string\n}\n\n// The shape created when multiple shapes are grouped\nexport interface GroupShape extends TVBaseShape {\n type: TVShapeType.Group\n size: number[]\n children: string[]\n}\n\n// A live React component rendered on the canvas\nexport interface ReactComponentShape extends TVBaseShape {\n type: TVShapeType.ReactComponent\n size: number[]\n /** ID matching a ReactComponentEntry in the registry */\n componentId: string\n}\n\n// The shape created by the Figma-style pen tool (B\u00E9zier vector paths)\nexport interface PenSegment {\n point: number[] // [x, y] anchor point in shape-local space\n cp1?: number[] // incoming bezier handle (from prev segment)\n cp2?: number[] // outgoing bezier handle (to next segment)\n}\n\nexport interface PenShape extends TVBaseShape {\n type: TVShapeType.Pen\n segments: PenSegment[]\n isClosed: boolean\n isComplete: boolean\n /** Cursor position in shape-local space, used for live preview while drawing */\n previewPoint?: number[]\n /** True while pointer is held and handles are being placed */\n isPlacingHandle?: boolean\n}\n\n// A union of all shapes\nexport type TVShape =\n | RectangleShape\n | EllipseShape\n | TriangleShape\n | DrawShape\n | ArrowShape\n | TextShape\n | GroupShape\n | StickyShape\n | ImageShape\n | VideoShape\n | ReactComponentShape\n | PenShape\n\n/* ------------------ Shape Styles ------------------ */\n\nexport enum ColorStyle {\n White = 'white',\n LightGray = 'lightGray',\n Gray = 'gray',\n Black = 'black',\n Green = 'green',\n Cyan = 'cyan',\n Blue = 'blue',\n Indigo = 'indigo',\n Violet = 'violet',\n Red = 'red',\n Orange = 'orange',\n Yellow = 'yellow',\n}\n\nexport enum SizeStyle {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport enum DashStyle {\n Draw = 'draw',\n Solid = 'solid',\n Dashed = 'dashed',\n Dotted = 'dotted',\n}\n\nexport enum FontSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n ExtraLarge = 'extraLarge',\n}\n\nexport enum AlignStyle {\n Start = 'start',\n Middle = 'middle',\n End = 'end',\n Justify = 'justify',\n}\n\nexport enum FontStyle {\n Script = 'script',\n Sans = 'sans',\n Serif = 'serif',\n Mono = 'mono',\n}\n\nexport interface GradientStop {\n color: string\n position: number\n opacity: number\n}\n\nexport type GradientType = 'linear' | 'radial' | 'conic' | 'diamond'\n\nexport interface GradientData {\n type: GradientType\n stops: GradientStop[]\n angle: number\n centerX: number\n centerY: number\n}\n\n/** Builds a CSS gradient string from a GradientData object */\nexport function buildCssGradient(data: GradientData): string {\n const stops = data.stops\n .map((s) => {\n const hex = s.color.slice(0, 7)\n const [r, g, b] = [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16))\n return `rgba(${r},${g},${b},${s.opacity}) ${s.position}%`\n })\n .join(', ')\n switch (data.type) {\n case 'linear':\n return `linear-gradient(${data.angle}deg, ${stops})`\n case 'radial':\n return `radial-gradient(circle at ${data.centerX}% ${data.centerY}%, ${stops})`\n case 'conic':\n case 'diamond':\n return `conic-gradient(from ${data.angle}deg at ${data.centerX}% ${data.centerY}%, ${stops})`\n default:\n return `linear-gradient(90deg, ${stops})`\n }\n}\n\nexport type ShapeStyles = {\n color: ColorStyle\n size: SizeStyle\n dash: DashStyle\n font?: FontStyle\n textAlign?: AlignStyle\n isFilled?: boolean\n scale?: number\n opacity?: number\n fillHex?: string\n strokeHex?: string\n borderRadius?: number\n strokeWidthOverride?: number\n labelColor?: string\n labelBackground?: string\n fontFamily?: string\n gradient?: GradientData\n textGradient?: GradientData\n}\n\nexport enum TVAssetType {\n Image = 'image',\n Video = 'video',\n}\n\nexport interface TVImageAsset extends TLAsset {\n type: TVAssetType.Image\n fileName: string\n src: string\n size: number[]\n}\n\nexport interface TVVideoAsset extends TLAsset {\n type: TVAssetType.Video\n fileName: string\n src: string\n size: number[]\n}\n\nexport type TVAsset = TVImageAsset | TVVideoAsset\n\nexport type TVAssets = Record<string, TVAsset>\n\n/* -------------------------------------------------- */\n/* Export */\n/* -------------------------------------------------- */\n\nexport enum TVExportType {\n PNG = 'png',\n JPG = 'jpeg',\n WEBP = 'webp',\n SVG = 'svg',\n JSON = 'json',\n}\n\nexport interface TVExport {\n name: string\n type: string\n blob: Blob\n}\n\nexport enum TVExportBackground {\n Transparent = 'transparent',\n Auto = 'auto',\n Light = 'light',\n Dark = 'dark',\n}\n\n/* -------------------------------------------------- */\n/* Type Helpers */\n/* -------------------------------------------------- */\n\nexport type ParametersExceptFirst<F> = F extends (arg0: any, ...rest: infer R) => any ? R : never\n\nexport type ExceptFirst<T extends unknown[]> = T extends [any, ...infer U] ? U : never\n\nexport type ExceptFirstTwo<T extends unknown[]> = T extends [any, any, ...infer U] ? U : never\n\nexport type PropsOfType<U> = {\n [K in keyof TVShape]: TVShape[K] extends any ? (TVShape[K] extends U ? K : never) : never\n}[keyof TVShape]\n\nexport type Difference<A, B, C = A> = A extends B ? never : C\n\nexport type Intersection<A, B, C = A> = A extends B ? C : never\n\nexport type FilteredKeys<T, U> = {\n [P in keyof T]: T[P] extends U ? P : never\n}[keyof T]\n\nexport type RequiredKeys<T> = {\n [K in keyof T]-?: Difference<Record<string, unknown>, Pick<T, K>, K>\n}[keyof T]\n\nexport type MembersWithRequiredKey<T, U> = {\n [P in keyof T]: Intersection<U, RequiredKeys<T[P]>, T[P]>\n}[keyof T]\n\nexport type MappedByType<U extends string, T extends { type: U }> = {\n [P in T['type']]: T extends any ? (P extends T['type'] ? T : never) : never\n}\n\nexport type ShapesWithProp<U> = MembersWithRequiredKey<MappedByType<TVShapeType, TVShape>, U>\n\nexport type Patch<T> = Partial<{ [P in keyof T]: Patch<T[P]> }>\n\nexport interface Command<T extends { [key: string]: any }> {\n id?: string\n before: Patch<T>\n after: Patch<T>\n}\n\nexport interface FileWithHandle extends File {\n handle?: FileSystemFileHandle\n}\n\nexport interface FileWithDirectoryHandle extends File {\n directoryHandle?: FileSystemDirectoryHandle\n}\n\n// The following typings implement the relevant parts of the File System Access\n// API. This can be removed once the specification reaches the Candidate phase\n// and is implemented as part of microsoft/TSJS-lib-generator.\n\nexport interface FileSystemHandlePermissionDescriptor {\n mode?: 'read' | 'readwrite'\n}\n\nexport interface FileSystemHandle {\n readonly kind: 'file' | 'directory'\n readonly name: string\n\n isSameEntry: (other: FileSystemHandle) => Promise<boolean>\n\n queryPermission: (descriptor?: FileSystemHandlePermissionDescriptor) => Promise<PermissionState>\n requestPermission: (descriptor?: FileSystemHandlePermissionDescriptor) => Promise<PermissionState>\n}\n", "import * as React from 'react'\nimport type { TelvaApp } from '~state'\n\nexport const TelvaContext = React.createContext<TelvaApp>({} as TelvaApp)\n\nconst useForceUpdate = () => {\n const [_state, setState] = React.useState(0)\n React.useEffect(() => setState(1))\n}\n\nexport function useTelvaApp() {\n const context = React.useContext(TelvaContext)\n return context\n}\n\nexport const ContainerContext = React.createContext({} as React.RefObject<HTMLDivElement>)\n\nexport function useContainer() {\n const context = React.useContext(ContainerContext)\n useForceUpdate()\n return context\n}\n", "import * as React from 'react'\nimport { TVLanguage, getTranslation } from '~translations'\n\nexport function useTranslation(locale?: TVLanguage) {\n return React.useMemo(() => {\n return getTranslation(locale ?? navigator.language.split(/[-_]/)[0])\n }, [locale])\n}\n", "import ar from './ar.json'\nimport da from './da.json'\nimport de from './de.json'\nimport en from './en.json'\nimport es from './es.json'\nimport fa from './fa.json'\nimport fr from './fr.json'\nimport gl from './gl.json'\nimport he from './he.json'\nimport it from './it.json'\nimport ja from './ja.json'\nimport ko_kr from './ko-kr.json'\nimport ku from './ku.json'\nimport main from './main.json'\nimport my from './my.json'\nimport nb_no from './nb-no.json'\nimport ne from './ne.json'\nimport nn_no from './nn-no.json'\nimport pl from './pl.json'\nimport pt_br from './pt-br.json'\nimport pt_pt from './pt-pt.json'\nimport ru from './ru.json'\nimport sv from './sv.json'\nimport te from './te.json'\nimport th from './th.json'\nimport tr from './tr.json'\nimport uk from './uk.json'\nimport zh_cn from './zh-cn.json'\nimport zh_tw from './zh-tw.json'\n\n// The default language (english) must have a value for every message.\n// Other languages may have missing messages. If the application finds\n// a missing message for the current language, it will use the english\n// translation instead.\n\nexport const TRANSLATIONS: TVTranslations = [\n { locale: 'ar', label: '\u0639\u0631\u0628\u064A', messages: ar },\n { locale: 'da', label: 'Danish', messages: da },\n { locale: 'de', label: 'Deutsch', messages: de },\n { locale: 'en', label: 'English', messages: en },\n { locale: 'es', label: 'Espa\u00F1ol', messages: es },\n { locale: 'fa', label: '\u0641\u0627\u0631\u0633\u06CC', messages: fa },\n { locale: 'fr', label: 'Fran\u00E7ais', messages: fr },\n { locale: 'gl', label: 'Galego', messages: gl },\n { locale: 'he', label: '\u05E2\u05D1\u05E8\u05D9\u05EA', messages: he },\n { locale: 'it', label: 'Italiano', messages: it },\n { locale: 'ja', label: '\u65E5\u672C\u8A9E', messages: ja },\n { locale: 'ko-kr', label: '\uD55C\uAD6D\uC5B4', messages: ko_kr },\n { locale: 'my', label: '\u1019\u103C\u1014\u103A\u1019\u102C\u1005\u102C', messages: my },\n { locale: 'nb-no', label: 'Norwegian Bokm\u00E5l', messages: nb_no },\n { locale: 'ne', label: '\u0928\u0947\u092A\u093E\u0932\u0940', messages: ne },\n { locale: 'nn-no', label: 'Norwegian Nynorsk', messages: nn_no },\n { locale: 'pl', label: 'Polski', messages: pl },\n { locale: 'pt', label: 'Portugu\u00EAs - Europeu', messages: pt_pt },\n { locale: 'pt-br', label: 'Portugu\u00EAs - Brasil', messages: pt_br },\n { locale: 'ru', label: 'Russian', messages: ru },\n { locale: 'sv', label: 'Svenska', messages: sv },\n { locale: 'te', label: '\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41', messages: te },\n { locale: 'tr', label: 'T\u00FCrk\u00E7e', messages: tr },\n { locale: 'uk', label: 'Ukrainian', messages: uk },\n { locale: 'zh-ch', label: '\u7B80\u4F53\u4E2D\u6587', messages: zh_cn },\n { locale: 'zh-tw', label: '\u7E41\u9AD4\u4E2D\u6587 (\u53F0\u7063)', messages: zh_tw },\n { locale: 'th', label: '\u0E20\u0E32\u0E29\u0E32\u0E44\u0E17\u0E22', messages: th },\n { locale: 'ku', label: '\u06A9\u0648\u0631\u062F\u06CC', messages: ku },\n]\n\n/* ----------------- (do not change) ---------------- */\n\nTRANSLATIONS.sort((a, b) => (a.locale < b.locale ? -1 : 1))\n\nexport type TVTranslation = {\n readonly locale: string\n readonly label: string\n readonly messages: Partial<typeof main>\n}\n\nexport type TVTranslations = TVTranslation[]\n\nexport type TVLanguage = TVTranslations[number]['locale']\n\nexport function getTranslation(locale: TVLanguage): TVTranslation {\n const translation = TRANSLATIONS.find((t) => t.locale === locale)\n\n return {\n locale,\n label: translation?.label ?? locale,\n messages: {\n ...main,\n ...translation?.messages,\n },\n }\n}\n", "import * as React from 'react'\n\nexport type DialogState = 'saveFirstTime' | 'saveAgain'\n\ninterface AlertDialogProps {\n dialogState: DialogState | null\n setDialogState: (dialogState: DialogState | null) => void\n onYes: (() => void) | null\n onNo: (() => void) | null\n onCancel: (() => void) | null\n openDialog: (\n dialogState: DialogState,\n onYes: () => void,\n onNo: () => void,\n onCancel: () => void\n ) => void\n}\n\nexport const AlertDialogContext = React.createContext<AlertDialogProps>({} as AlertDialogProps)\n\nexport const useDialog = () => {\n const context = React.useContext(AlertDialogContext)\n if (!context) throw new Error('useCtx must be inside a Provider with a value')\n return context\n}\n", "import * as RadixContextMenu from '@radix-ui/react-context-menu'\nimport {\n AlignBottomIcon,\n AlignCenterHorizontallyIcon,\n AlignCenterVerticallyIcon,\n AlignLeftIcon,\n AlignRightIcon,\n AlignTopIcon,\n SpaceEvenlyHorizontallyIcon,\n SpaceEvenlyVerticallyIcon,\n StretchHorizontallyIcon,\n StretchVerticallyIcon,\n} from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { ToolButton, ToolButtonProps } from '~components/Primitives/ToolButton'\nimport { useContainer, useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { AlignType, DistributeType, StretchType, TVExportType, TVSnapshot } from '~types'\n\nconst numberOfSelectedIdsSelector = (s: TVSnapshot) => {\n return s.document.pageStates[s.appState.currentPageId].selectedIds.length\n}\n\nconst isDebugModeSelector = (s: TVSnapshot) => {\n return s.settings.isDebugMode\n}\n\nconst hasGroupSelectedSelector = (s: TVSnapshot) => {\n return s.document.pageStates[s.appState.currentPageId].selectedIds.some(\n (id) => s.document.pages[s.appState.currentPageId].shapes[id].children !== undefined\n )\n}\n\nconst preventDefault = (e: Event) => e.stopPropagation()\n\ninterface ContextMenuProps {\n onBlur?: React.FocusEventHandler\n children: React.ReactNode\n}\n\nexport const _ContextMenu = ({ onBlur, children }: ContextMenuProps) => {\n const container = useContainer()\n\n return (\n <RadixContextMenu.Root dir=\"ltr\">\n <RadixContextMenu.Trigger dir=\"ltr\">{children}</RadixContextMenu.Trigger>\n <RadixContextMenu.Portal container={container.current}>\n <RadixContextMenu.Content\n onEscapeKeyDown={preventDefault}\n tabIndex={-1}\n onBlur={onBlur}\n asChild\n >\n <MenuContent id=\"TD-ContextMenu\">\n <InnerMenu />\n </MenuContent>\n </RadixContextMenu.Content>\n </RadixContextMenu.Portal>\n </RadixContextMenu.Root>\n )\n}\n\nconst InnerMenu = React.memo(function InnerMenu() {\n const app = useTelvaApp()\n const intl = useIntl()\n const numberOfSelectedIds = app.useStore(numberOfSelectedIdsSelector)\n const isDebugMode = app.useStore(isDebugModeSelector)\n const hasGroupSelected = app.useStore(hasGroupSelectedSelector)\n\n const handleFlipHorizontal = React.useCallback(() => {\n app.flipHorizontal()\n }, [app])\n\n const handleFlipVertical = React.useCallback(() => {\n app.flipVertical()\n }, [app])\n\n const handleDuplicate = React.useCallback(() => {\n app.duplicate()\n }, [app])\n\n const handleLock = React.useCallback(() => {\n app.toggleLocked()\n }, [app])\n\n const handleGroup = React.useCallback(() => {\n app.group()\n }, [app])\n\n const handleMoveToBack = React.useCallback(() => {\n app.moveToBack()\n }, [app])\n\n const handleMoveBackward = React.useCallback(() => {\n app.moveBackward()\n }, [app])\n\n const handleMoveForward = React.useCallback(() => {\n app.moveForward()\n }, [app])\n\n const handleMoveToFront = React.useCallback(() => {\n app.moveToFront()\n }, [app])\n\n const handleDelete = React.useCallback(() => {\n app.delete()\n }, [app])\n\n const handleCut = React.useCallback(() => {\n app.cut()\n }, [app])\n\n const handleCopy = React.useCallback(() => {\n app.copy()\n }, [app])\n\n const handlePaste = React.useCallback(() => {\n app.paste()\n }, [app])\n\n const handleCopySVG = React.useCallback(() => {\n app.copyImage(TVExportType.SVG, { scale: 1, quality: 1, transparentBackground: false })\n }, [app])\n\n const handleCopyPNG = React.useCallback(() => {\n app.copyImage(TVExportType.PNG, { scale: 2, quality: 1, transparentBackground: true })\n }, [app])\n\n const handleUndo = React.useCallback(() => {\n app.undo()\n }, [app])\n\n const handleRedo = React.useCallback(() => {\n app.redo()\n }, [app])\n\n const handleExportPNG = React.useCallback(async () => {\n app.exportImage(TVExportType.PNG, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportJPG = React.useCallback(async () => {\n app.exportImage(TVExportType.JPG, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportWEBP = React.useCallback(async () => {\n app.exportImage(TVExportType.WEBP, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportSVG = React.useCallback(async () => {\n app.exportImage(TVExportType.SVG, { scale: 1, quality: 1 })\n }, [app])\n\n const handleCopyJSON = React.useCallback(async () => {\n app.copyJson()\n }, [app])\n\n const handleExportJSON = React.useCallback(async () => {\n app.exportJson()\n }, [app])\n\n const handleConvertToImage = React.useCallback(async () => {\n app.convertToImage()\n }, [app])\n\n const hasSelection = numberOfSelectedIds > 0\n const hasTwoOrMore = numberOfSelectedIds > 1\n const hasThreeOrMore = numberOfSelectedIds > 2\n\n const selectedShape =\n numberOfSelectedIds === 1 ? app.getShape(app.selectedIds[0], app.currentPageId) : null\n const isReactComponent = selectedShape?.type === 'reactComponent'\n\n return (\n <>\n {hasSelection ? (\n <>\n <CMRowButton onClick={handleDuplicate} kbd=\"#D\" id=\"TD-ContextMenu-Duplicate\">\n <FormattedMessage id=\"duplicate\" />\n </CMRowButton>\n <CMRowButton onClick={handleFlipHorizontal} kbd=\"\u21E7H\" id=\"TD-ContextMenu-Flip_Horizontal\">\n <FormattedMessage id=\"flip.horizontal\" />\n </CMRowButton>\n <CMRowButton onClick={handleFlipVertical} kbd=\"\u21E7V\" id=\"TD-ContextMenu-Flip_Vertical\">\n <FormattedMessage id=\"flip.vertical\" />\n </CMRowButton>\n <CMRowButton onClick={handleLock} kbd=\"#\u21E7L\" id=\"TD-ContextMenu- Lock_Unlock\">\n <FormattedMessage id=\"lock\" /> / <FormattedMessage id=\"unlock\" />\n </CMRowButton>\n {(hasTwoOrMore || hasGroupSelected) && <Divider />}\n {hasTwoOrMore && (\n <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Group\">\n <FormattedMessage id=\"group\" />\n </CMRowButton>\n )}\n {hasGroupSelected && (\n <CMRowButton onClick={handleGroup} kbd=\"#G\" id=\"TD-ContextMenu-Ungroup\">\n <FormattedMessage id=\"ungroup\" />\n </CMRowButton>\n )}\n <Divider />\n <ContextMenuSubMenu label={intl.formatMessage({ id: 'move' })} id=\"TD-ContextMenu-Move\">\n <CMRowButton onClick={handleMoveToFront} kbd=\"\u21E7]\" id=\"TD-ContextMenu-Move-To_Front\">\n <FormattedMessage id=\"to.front\" />\n </CMRowButton>\n <CMRowButton onClick={handleMoveForward} kbd=\"]\" id=\"TD-ContextMenu-Move-Forward\">\n <FormattedMessage id=\"forward\" />\n </CMRowButton>\n <CMRowButton onClick={handleMoveBackward} kbd=\"[\" id=\"TD-ContextMenu-Move-Backward\">\n <FormattedMessage id=\"backward\" />\n </CMRowButton>\n <CMRowButton onClick={handleMoveToBack} kbd=\"\u21E7[\" id=\"TD-ContextMenu-Move-To_Back\">\n <FormattedMessage id=\"back\" />\n </CMRowButton>\n </ContextMenuSubMenu>\n <MoveToPageMenu />\n {hasTwoOrMore && (\n <AlignDistributeSubMenu hasTwoOrMore={hasTwoOrMore} hasThreeOrMore={hasThreeOrMore} />\n )}\n <Divider />\n <CMRowButton onClick={handleCut} kbd=\"#X\" id=\"TD-ContextMenu-Cut\">\n <FormattedMessage id=\"cut\" />\n </CMRowButton>\n <CMRowButton onClick={handleCopy} kbd=\"#C\" id=\"TD-ContextMenu-Copy\">\n <FormattedMessage id=\"copy\" />\n </CMRowButton>\n <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n <FormattedMessage id=\"paste\" />\n </CMRowButton>\n <Divider />\n <ContextMenuSubMenu\n label={`${intl.formatMessage({ id: 'copy.as' })}...`}\n size=\"small\"\n id=\"TD-ContextMenu-Copy-As\"\n >\n <CMRowButton onClick={handleCopySVG} id=\"TD-ContextMenu-Copy-as-SVG\">\n SVG\n </CMRowButton>\n <CMRowButton onClick={handleCopyPNG} id=\"TD-ContextMenu-Copy-As-PNG\">\n PNG\n </CMRowButton>\n {isDebugMode && (\n <CMRowButton onClick={handleCopyJSON} id=\"TD-ContextMenu-Copy_as_JSON\">\n JSON\n </CMRowButton>\n )}\n </ContextMenuSubMenu>\n <ContextMenuSubMenu\n label={`${intl.formatMessage({ id: 'export.as' })}...`}\n size=\"small\"\n id=\"TD-ContextMenu-Export\"\n >\n <CMRowButton onClick={handleExportSVG} id=\"TD-ContextMenu-Export-SVG\">\n SVG\n </CMRowButton>\n <CMRowButton onClick={handleExportPNG} id=\"TD-ContextMenu-Export-PNG\">\n PNG\n </CMRowButton>\n <CMRowButton onClick={handleExportJPG} id=\"TD-ContextMenu-Export-JPG\">\n JPG\n </CMRowButton>\n <CMRowButton onClick={handleExportWEBP} id=\"TD-ContextMenu-Export-WEBP\">\n WEBP\n </CMRowButton>\n {isDebugMode && (\n <CMRowButton onClick={handleExportJSON} id=\"TD-ContextMenu-Export-JSON\">\n JSON\n </CMRowButton>\n )}\n </ContextMenuSubMenu>\n <Divider />\n {isReactComponent && (\n <>\n <CMRowButton onClick={handleConvertToImage} id=\"TD-ContextMenu-Convert-To-Image\">\n Convert to Image\n </CMRowButton>\n <Divider />\n </>\n )}\n <CMRowButton onClick={handleDelete} kbd=\"\u232B\" id=\"TD-ContextMenu-Delete\">\n <FormattedMessage id=\"delete\" />\n </CMRowButton>\n </>\n ) : (\n <>\n <CMRowButton onClick={handlePaste} kbd=\"#V\" id=\"TD-ContextMenu-Paste\">\n <FormattedMessage id=\"paste\" />\n </CMRowButton>\n <CMRowButton onClick={handleUndo} kbd=\"#Z\" id=\"TD-ContextMenu-Undo\">\n <FormattedMessage id=\"undo\" />\n </CMRowButton>\n <CMRowButton onClick={handleRedo} kbd=\"#\u21E7Z\" id=\"TD-ContextMenu-Redo\">\n <FormattedMessage id=\"redo\" />\n </CMRowButton>\n <ContextMenuSubMenu\n label={`${intl.formatMessage({ id: 'export.as' })}...`}\n size=\"small\"\n id=\"TD-ContextMenu-Export\"\n >\n <CMRowButton onClick={handleExportSVG} id=\"TD-ContextMenu-Export-SVG\">\n SVG\n </CMRowButton>\n <CMRowButton onClick={handleExportPNG} id=\"TD-ContextMenu-Export-PNG\">\n PNG\n </CMRowButton>\n <CMRowButton onClick={handleExportJPG} id=\"TD-ContextMenu-Export-JPG\">\n JPG\n </CMRowButton>\n <CMRowButton onClick={handleExportWEBP} id=\"TD-ContextMenu-Export-WEBP\">\n WEBP\n </CMRowButton>\n {isDebugMode && (\n <CMRowButton onClick={handleExportJSON} id=\"TD-ContextMenu-Export-JSON\">\n JSON\n </CMRowButton>\n )}\n </ContextMenuSubMenu>\n </>\n )}\n </>\n )\n})\n\n/* ---------- Align and Distribute Sub Menu --------- */\n\nfunction AlignDistributeSubMenu({\n hasThreeOrMore,\n}: {\n hasTwoOrMore: boolean\n hasThreeOrMore: boolean\n}) {\n const app = useTelvaApp()\n\n const alignTop = React.useCallback(() => {\n app.align(AlignType.Top)\n }, [app])\n\n const alignCenterVertical = React.useCallback(() => {\n app.align(AlignType.CenterVertical)\n }, [app])\n\n const alignBottom = React.useCallback(() => {\n app.align(AlignType.Bottom)\n }, [app])\n\n const stretchVertically = React.useCallback(() => {\n app.stretch(StretchType.Vertical)\n }, [app])\n\n const distributeVertically = React.useCallback(() => {\n app.distribute(DistributeType.Vertical)\n }, [app])\n\n const alignLeft = React.useCallback(() => {\n app.align(AlignType.Left)\n }, [app])\n\n const alignCenterHorizontal = React.useCallback(() => {\n app.align(AlignType.CenterHorizontal)\n }, [app])\n\n const alignRight = React.useCallback(() => {\n app.align(AlignType.Right)\n }, [app])\n\n const stretchHorizontally = React.useCallback(() => {\n app.stretch(StretchType.Horizontal)\n }, [app])\n\n const distributeHorizontally = React.useCallback(() => {\n app.distribute(DistributeType.Horizontal)\n }, [app])\n\n const container = useContainer()\n\n return (\n <RadixContextMenu.Sub>\n <CMSubTriggerButton id=\"TD-ContextMenu-Align-Distribute-Trigger\">\n <FormattedMessage id=\"align.distribute\" />\n </CMSubTriggerButton>\n <RadixContextMenu.Portal container={container.current}>\n <RadixContextMenu.SubContent asChild sideOffset={4} alignOffset={-2}>\n <StyledGridContent numberOfSelected={hasThreeOrMore ? 'threeOrMore' : 'twoOrMore'}>\n <CMIconButton onClick={alignLeft} id=\"TD-ContextMenu-Align_Distribute-AlignLeft\">\n <AlignLeftIcon />\n </CMIconButton>\n <CMIconButton\n onClick={alignCenterHorizontal}\n id=\"TD-ContextMenu-Align_Distribute-AlignCenterHorizontal\"\n >\n <AlignCenterHorizontallyIcon />\n </CMIconButton>\n <CMIconButton onClick={alignRight} id=\"TD-ContextMenu-Align_Distribute-AlignRight\">\n <AlignRightIcon />\n </CMIconButton>\n <CMIconButton\n onClick={stretchHorizontally}\n id=\"TD-ContextMenu-Align_Distribute-StretchHorizontal\"\n >\n <StretchHorizontallyIcon />\n </CMIconButton>\n {hasThreeOrMore && (\n <CMIconButton\n onClick={distributeHorizontally}\n id=\"TD-ContextMenu-Align_Distribute-SpaceEvenlyHorizontal\"\n >\n <SpaceEvenlyHorizontallyIcon />\n </CMIconButton>\n )}\n <CMIconButton onClick={alignTop} id=\"TD-ContextMenu-Align_Distribute-AlignTop\">\n <AlignTopIcon />\n </CMIconButton>\n <CMIconButton\n onClick={alignCenterVertical}\n id=\"TD-ContextMenu-Align_Distribute-AlignCenterVertical\"\n >\n <AlignCenterVerticallyIcon />\n </CMIconButton>\n <CMIconButton onClick={alignBottom} id=\"TD-ContextMenu-Align_Distribute-AlignBottom\">\n <AlignBottomIcon />\n </CMIconButton>\n <CMIconButton\n onClick={stretchVertically}\n id=\"TD-ContextMenu-Align_Distribute-StretchVertical\"\n >\n <StretchVerticallyIcon />\n </CMIconButton>\n {hasThreeOrMore && (\n <CMIconButton\n onClick={distributeVertically}\n id=\"TD-ContextMenu-Align_Distribute-SpaceEvenlyVertical\"\n >\n <SpaceEvenlyVerticallyIcon />\n </CMIconButton>\n )}\n <CMArrow offset={13} />\n </StyledGridContent>\n </RadixContextMenu.SubContent>\n </RadixContextMenu.Portal>\n </RadixContextMenu.Sub>\n )\n}\n\nconst StyledGridContent = styled(MenuContent, {\n display: 'grid',\n variants: {\n numberOfSelected: {\n threeOrMore: {\n gridTemplateColumns: 'repeat(5, auto)',\n },\n twoOrMore: {\n gridTemplateColumns: 'repeat(4, auto)',\n },\n },\n },\n})\n\n/* -------------- Move to Page Sub Menu ------------- */\n\nconst currentPageIdSelector = (s: TVSnapshot) => s.appState.currentPageId\nconst documentPagesSelector = (s: TVSnapshot) => s.document.pages\n\nfunction MoveToPageMenu() {\n const app = useTelvaApp()\n const currentPageId = app.useStore(currentPageIdSelector)\n const documentPages = app.useStore(documentPagesSelector)\n\n const sorted = Object.values(documentPages)\n .sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n .filter((a) => a.id !== currentPageId)\n\n const container = useContainer()\n\n if (sorted.length === 0) return null\n\n return (\n <RadixContextMenu.Sub>\n <CMSubTriggerButton>\n <FormattedMessage id=\"move.to.page\" />\n </CMSubTriggerButton>\n <RadixContextMenu.Portal container={container.current}>\n <RadixContextMenu.SubContent sideOffset={4} alignOffset={-2} asChild>\n <MenuContent>\n {sorted.map(({ id, name }, i) => (\n <CMRowButton\n key={id}\n disabled={id === currentPageId}\n onClick={() => app.moveToPage(id)}\n >\n {name || `Page ${i}`}\n </CMRowButton>\n ))}\n <CMArrow offset={13} />\n </MenuContent>\n </RadixContextMenu.SubContent>\n </RadixContextMenu.Portal>\n </RadixContextMenu.Sub>\n )\n}\n\n/* --------------------- Submenu -------------------- */\n\nexport interface ContextMenuSubMenuProps {\n label: string\n size?: 'small'\n children: React.ReactNode\n id?: string\n}\n\nexport function ContextMenuSubMenu({ children, label, size, id }: ContextMenuSubMenuProps) {\n const container = useContainer()\n return (\n <RadixContextMenu.Sub>\n <CMSubTriggerButton>{label}</CMSubTriggerButton>\n <RadixContextMenu.Portal container={container.current}>\n <RadixContextMenu.SubContent sideOffset={4} alignOffset={-2} asChild>\n <MenuContent size={size}>\n {children}\n <CMArrow offset={13} />\n </MenuContent>\n </RadixContextMenu.SubContent>\n </RadixContextMenu.Portal>\n </RadixContextMenu.Sub>\n )\n}\n\n/* ---------------------- Arrow --------------------- */\n\nconst CMArrow = styled(RadixContextMenu.ContextMenuArrow, {\n fill: '$panel',\n})\n\n/* ------------------- IconButton ------------------- */\n\nfunction CMIconButton({ onSelect, ...rest }: ToolButtonProps) {\n return (\n <RadixContextMenu.ContextMenuItem dir=\"ltr\" onSelect={onSelect} asChild>\n <ToolButton {...rest} />\n </RadixContextMenu.ContextMenuItem>\n )\n}\n\n/* -------------------- RowButton ------------------- */\n\nconst CMRowButton = ({ id, ...rest }: RowButtonProps) => {\n return (\n <RadixContextMenu.ContextMenuItem asChild id={id}>\n <RowButton {...rest} />\n </RadixContextMenu.ContextMenuItem>\n )\n}\n\n/* ----------------- Trigger Button ----------------- */\n\nexport const CMSubTriggerButton = ({ id, ...rest }: RowButtonProps) => {\n return (\n <RadixContextMenu.SubTrigger asChild id={id}>\n <RowButton hasArrow {...rest} />\n </RadixContextMenu.SubTrigger>\n )\n}\n\nexport const ContextMenu = React.memo(_ContextMenu)\n", "import { styled } from '~styles'\n\nexport const Divider = styled('hr', {\n height: 0,\n paddingTop: 1,\n width: 'calc(100%+8px)',\n backgroundColor: '$hover',\n border: 'none',\n margin: '$2 -4px',\n})\n", "import { styled } from '~styles'\n\nexport const MenuContent = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n display: 'flex',\n flexDirection: 'column',\n zIndex: 99997,\n minWidth: 180,\n pointerEvents: 'all',\n backgroundColor: '$panel',\n border: '1px solid $panelContrast',\n boxShadow: '$panel',\n padding: '$2 $2',\n borderRadius: '$3',\n font: '$ui',\n maxHeight: '100vh',\n overflowY: 'auto',\n overflowX: 'hidden',\n '&::webkit-scrollbar': {\n display: 'none',\n },\n '-ms-overflow-style': 'none' /* for Internet Explorer, Edge */,\n scrollbarWidth: 'none',\n variants: {\n size: {\n small: {\n minWidth: 72,\n },\n },\n overflow: {\n true: {\n maxHeight: '60vh',\n },\n },\n },\n})\n", "import { ItemIndicator } from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { Kbd } from '~components/Primitives/Kbd'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { breakpoints } from '~components/breakpoints'\nimport { styled } from '~styles'\n\nexport interface RowButtonProps {\n onClick?: React.MouseEventHandler<HTMLButtonElement>\n children: React.ReactNode\n disabled?: boolean\n kbd?: string\n variant?: 'wide' | 'styleMenu'\n isActive?: boolean\n isWarning?: boolean\n hasIndicator?: boolean\n hasArrow?: boolean\n id?: string\n}\n\nexport const RowButton = React.forwardRef<HTMLButtonElement, RowButtonProps>(\n (\n {\n onClick,\n isActive = false,\n isWarning = false,\n hasIndicator = false,\n hasArrow = false,\n disabled = false,\n variant,\n kbd,\n children,\n ...rest\n },\n ref\n ) => {\n return (\n <StyledRowButton\n ref={ref}\n bp={breakpoints}\n isWarning={isWarning}\n isActive={isActive}\n disabled={disabled}\n onClick={onClick}\n variant={variant}\n {...rest}\n >\n <StyledRowButtonInner>\n {children}\n {kbd ? <Kbd variant=\"menu\">{kbd}</Kbd> : undefined}\n {hasIndicator && (\n <ItemIndicator dir=\"ltr\">\n <SmallIcon>\n <CheckIcon />\n </SmallIcon>\n </ItemIndicator>\n )}\n {hasArrow && (\n <SmallIcon>\n <ChevronRightIcon />\n </SmallIcon>\n )}\n </StyledRowButtonInner>\n </StyledRowButton>\n )\n }\n)\n\nconst StyledRowButtonInner = styled('div', {\n height: '100%',\n width: '100%',\n backgroundColor: '$panel',\n borderRadius: '$2',\n display: 'flex',\n gap: '$1',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 $3',\n justifyContent: 'space-between',\n border: '1px solid transparent',\n\n '& svg': {\n position: 'relative',\n stroke: '$overlay',\n strokeWidth: 1,\n zIndex: 1,\n },\n\n [`& > ${SmallIcon}`]: {\n paddingLeft: '$3',\n },\n})\n\nexport const StyledRowButton = styled('button', {\n position: 'relative',\n width: '100%',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n height: 32,\n minHeight: 32,\n outline: 'none',\n color: '$text',\n fontFamily: '$ui',\n fontWeight: 400,\n fontSize: '$1',\n borderRadius: 4,\n userSelect: 'none',\n WebkitUserSelect: 'none',\n margin: 0,\n padding: '0 0',\n\n '&[data-disabled]': {\n opacity: 0.3,\n },\n\n '&:disabled': {\n opacity: 0.3,\n },\n\n [`&:focus:not(:disabled) ${StyledRowButtonInner}`]: {\n backgroundColor: '$hover',\n },\n\n '& a': {\n textDecoration: 'none',\n color: '$text',\n },\n\n variants: {\n bp: {\n mobile: {},\n small: {},\n },\n variant: {\n styleMenu: {\n margin: '$1 0 $1 0',\n },\n wide: {\n gridColumn: '1 / span 4',\n },\n },\n size: {\n icon: {\n padding: '4px ',\n width: 'auto',\n },\n },\n isWarning: {\n true: {\n color: '$warn',\n },\n },\n isActive: {\n true: {\n backgroundColor: '$hover',\n },\n false: {},\n },\n },\n})\n", "import { styled } from '~styles'\n\nexport const SmallIcon = styled('div', {\n height: '100%',\n borderRadius: '4px',\n marginRight: '1px',\n width: 'fit-content',\n display: 'grid',\n alignItems: 'center',\n justifyContent: 'center',\n outline: 'none',\n border: 'none',\n pointerEvents: 'all',\n cursor: 'pointer',\n color: 'currentColor',\n\n '& svg': {\n height: 16,\n width: 16,\n strokeWidth: 1,\n },\n\n '& > *': {\n gridRow: 1,\n gridColumn: 1,\n },\n})\n", "import * as React from 'react'\nimport { FallbackProps } from 'react-error-boundary'\nimport { Divider } from '~components/Primitives/Divider'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\n\nexport function ErrorFallback({ error, resetErrorBoundary }: FallbackProps): any {\n const app = useTelvaApp()\n\n const refreshPage = () => {\n window.location.reload()\n resetErrorBoundary()\n }\n\n const copyError = () => {\n const textarea = document.createElement('textarea')\n textarea.value = error.message\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n textarea.remove()\n }\n\n const downloadBackup = () => {\n app.saveProjectAs()\n }\n\n const resetDocument = () => {\n app.resetDocument()\n resetErrorBoundary()\n }\n\n return (\n <Container>\n <InnerContainer>\n <div>We've encountered an error!</div>\n <pre>\n <code>{error.message}</code>\n </pre>\n <Buttons>\n <RowButton onClick={copyError}>Copy Error</RowButton>\n <RowButton onClick={refreshPage}>Refresh Page</RowButton>\n </Buttons>\n <Divider />\n <p>\n Keep getting this error?{' '}\n <a onClick={downloadBackup} title=\"Download your project\">\n Download your project\n </a>{' '}\n as a backup and then{' '}\n <a onClick={resetDocument} title=\"Reset the document\">\n reset the document\n </a>\n .\n </p>\n </InnerContainer>\n </Container>\n )\n}\n\nconst Container = styled('div', {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '$canvas',\n})\n\nconst InnerContainer = styled('div', {\n backgroundColor: '$panel',\n border: '1px solid $panelContrast',\n padding: '$5',\n borderRadius: 8,\n boxShadow: '$panel',\n maxWidth: 320,\n color: '$text',\n fontFamily: '$ui',\n fontSize: '$2',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n gap: '$3',\n '& > pre': {\n marginTop: '$3',\n marginBottom: '$3',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n backgroundColor: '$hover',\n padding: '$4',\n borderRadius: '$2',\n fontFamily: '\"Menlo\", \"Monaco\", monospace',\n fontWeight: 500,\n },\n '& p': {\n fontFamily: '$body',\n lineHeight: 1.7,\n padding: '$5',\n margin: 0,\n },\n '& a': {\n color: '$text',\n cursor: 'pointer',\n textDecoration: 'underline',\n },\n '& hr': {\n marginLeft: '-$5',\n marginRight: '-$5',\n },\n})\n\nconst Buttons = styled('div', {\n display: 'flex',\n '& > button > div': {\n justifyContent: 'center',\n textAlign: 'center',\n },\n})\n", "import {\n ChevronDownIcon,\n ChevronRightIcon,\n EyeClosedIcon,\n EyeOpenIcon,\n LockClosedIcon,\n LockOpen1Icon,\n} from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { GroupShape, TVShape, TVShapeType, TVSnapshot } from '~types'\nimport { ComponentsTab } from './ComponentsTab'\n\n// --- Selectors ---\nconst shapesSelector = (s: TVSnapshot) => {\n const page = s.document.pages[s.appState.currentPageId]\n return Object.values(page.shapes).sort((a, b) => b.childIndex - a.childIndex)\n}\n\nconst selectedIdsSelector = (s: TVSnapshot) =>\n s.document.pageStates[s.appState.currentPageId].selectedIds\n\n// --- Shape type icons ---\nconst shapeIcons: Record<string, React.ReactNode> = {\n [TVShapeType.Draw]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path\n d=\"M2 12C4 8 8 4 10 6C12 8 13 3 13 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n ),\n [TVShapeType.Rectangle]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"3\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n </svg>\n ),\n [TVShapeType.Ellipse]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <ellipse\n cx=\"7.5\"\n cy=\"7.5\"\n rx=\"5.5\"\n ry=\"4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n </svg>\n ),\n [TVShapeType.Triangle]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M7.5 2L13 13H2L7.5 2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n ),\n [TVShapeType.Arrow]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path\n d=\"M3 12L12 3M12 3H6M12 3V9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n [TVShapeType.Text]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M3 3H12M7.5 3V12\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n ),\n [TVShapeType.Sticky]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"2\"\n width=\"11\"\n height=\"11\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n <path d=\"M5 6H10M5 9H8\" stroke=\"currentColor\" strokeWidth=\"0.8\" />\n </svg>\n ),\n [TVShapeType.Line]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <line\n x1=\"2\"\n y1=\"13\"\n x2=\"13\"\n y2=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n [TVShapeType.Image]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"3\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n <circle cx=\"5\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n </svg>\n ),\n [TVShapeType.Video]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"2\"\n y=\"3\"\n width=\"11\"\n height=\"9\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n <path d=\"M6 6V9L9 7.5L6 6Z\" fill=\"currentColor\" />\n </svg>\n ),\n [TVShapeType.Group]: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 15 15\" fill=\"none\">\n <rect\n x=\"1\"\n y=\"4\"\n width=\"8\"\n height=\"7\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n <rect\n x=\"5\"\n y=\"2\"\n width=\"8\"\n height=\"7\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n ),\n}\n\n// --- Main component with tabs ---\nexport const LayersPanel = React.memo(function LayersPanel() {\n const [activeTab, setActiveTab] = React.useState<'layers' | 'components'>('layers')\n\n return (\n <StyledPanel\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n >\n <StyledTabBar>\n <StyledTab isActive={activeTab === 'layers'} onClick={() => setActiveTab('layers')}>\n Layers\n </StyledTab>\n <StyledTab isActive={activeTab === 'components'} onClick={() => setActiveTab('components')}>\n Components\n </StyledTab>\n </StyledTabBar>\n {activeTab === 'layers' ? <LayersList /> : <ComponentsTab />}\n </StyledPanel>\n )\n})\n\n// --- Layers list ---\nfunction LayersList() {\n const app = useTelvaApp()\n const allShapes = app.useStore(shapesSelector)\n const selectedIds = app.useStore(selectedIdsSelector)\n const [dragOverInfo, setDragOverInfo] = React.useState<{\n id: string\n position: 'before' | 'after'\n } | null>(null)\n const draggingId = React.useRef<string | null>(null)\n\n const topLevelShapes = React.useMemo(\n () => allShapes.filter((s) => s.parentId === app.currentPageId),\n [allShapes, app.currentPageId]\n )\n\n const handleReorder = React.useCallback(\n (fromId: string, targetId: string, position: 'before' | 'after') => {\n if (fromId === targetId) return\n const sorted = [...topLevelShapes]\n const fromIdx = sorted.findIndex((s) => s.id === fromId)\n if (fromIdx === -1) return\n const reordered = sorted.filter((s) => s.id !== fromId)\n const newToIdx = reordered.findIndex((s) => s.id === targetId)\n if (newToIdx === -1) return\n const insertAt = position === 'before' ? newToIdx : newToIdx + 1\n reordered.splice(insertAt, 0, sorted[fromIdx])\n const total = reordered.length\n const updates: Record<string, { childIndex: number }> = {}\n reordered.forEach((s, i) => {\n updates[s.id] = { childIndex: total - i }\n })\n app.patchState(\n { document: { pages: { [app.currentPageId]: { shapes: updates } } } },\n 'reorder_layers'\n )\n },\n [topLevelShapes, app]\n )\n\n return (\n <StyledList\n onDragOver={(e) => e.preventDefault()}\n onDrop={() => {\n draggingId.current = null\n setDragOverInfo(null)\n }}\n >\n {topLevelShapes.length === 0 ? (\n <StyledEmpty>No elements on canvas</StyledEmpty>\n ) : (\n topLevelShapes.map((shape) => (\n <LayerItem\n key={shape.id}\n shape={shape}\n allShapes={allShapes}\n selectedIds={selectedIds}\n app={app}\n depth={0}\n dragOverInfo={dragOverInfo}\n onLayerDragStart={(id) => {\n draggingId.current = id\n }}\n onLayerDragOver={(id, pos) => setDragOverInfo({ id, position: pos })}\n onLayerDrop={(targetId, pos) => {\n if (draggingId.current) handleReorder(draggingId.current, targetId, pos)\n draggingId.current = null\n setDragOverInfo(null)\n }}\n onLayerDragEnd={() => {\n draggingId.current = null\n setDragOverInfo(null)\n }}\n />\n ))\n )}\n </StyledList>\n )\n}\n\n// --- LayerItem with accordion for groups ---\nfunction LayerItem({\n shape,\n allShapes,\n selectedIds,\n app,\n depth,\n dragOverInfo,\n onLayerDragStart,\n onLayerDragOver,\n onLayerDrop,\n onLayerDragEnd,\n}: {\n shape: TVShape\n allShapes: TVShape[]\n selectedIds: string[]\n app: any\n depth: number\n dragOverInfo?: { id: string; position: 'before' | 'after' } | null\n onLayerDragStart?: (id: string) => void\n onLayerDragOver?: (id: string, position: 'before' | 'after') => void\n onLayerDrop?: (targetId: string, position: 'before' | 'after') => void\n onLayerDragEnd?: () => void\n}) {\n const isSelected = selectedIds.includes(shape.id)\n const isGroup = shape.type === TVShapeType.Group\n const children = isGroup ? (shape as GroupShape).children || [] : []\n const hasChildren = children.length > 0\n const [expanded, setExpanded] = React.useState(true)\n\n const handleSelect = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (e.shiftKey) {\n if (isSelected) app.deselect(shape.id)\n else app.select(...selectedIds, shape.id)\n } else {\n app.select(shape.id)\n }\n },\n [app, shape.id, selectedIds, isSelected]\n )\n\n const handleToggleVisibility = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n app.toggleHidden([shape.id])\n },\n [app, shape.id]\n )\n\n const handleToggleLock = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n app.toggleLocked([shape.id])\n },\n [app, shape.id]\n )\n\n const icon = shapeIcons[shape.type] || shapeIcons[TVShapeType.Rectangle]\n const name = shape.name || shape.type\n\n const childShapes = React.useMemo(() => {\n if (!hasChildren) return []\n return children.map((id) => allShapes.find((s) => s.id === id)).filter(Boolean) as TVShape[]\n }, [hasChildren, children, allShapes])\n\n const isDragTarget = dragOverInfo?.id === shape.id\n const dropStyle: React.CSSProperties = isDragTarget\n ? dragOverInfo!.position === 'before'\n ? { borderTop: '2px solid #0D99FF' }\n : { borderBottom: '2px solid #0D99FF' }\n : {}\n\n return (\n <>\n <StyledLayerItem\n draggable={!!onLayerDragStart}\n onClick={handleSelect}\n isSelected={isSelected}\n style={{\n paddingLeft: `${8 + depth * 14}px`,\n cursor: onLayerDragStart ? 'grab' : 'pointer',\n ...dropStyle,\n }}\n onDragStart={(e) => {\n e.stopPropagation()\n e.dataTransfer.effectAllowed = 'move'\n onLayerDragStart?.(shape.id)\n }}\n onDragOver={(e) => {\n e.preventDefault()\n e.stopPropagation()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const pos = e.clientY < rect.top + rect.height / 2 ? 'before' : 'after'\n onLayerDragOver?.(shape.id, pos)\n }}\n onDrop={(e) => {\n e.preventDefault()\n e.stopPropagation()\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const pos = e.clientY < rect.top + rect.height / 2 ? 'before' : 'after'\n onLayerDrop?.(shape.id, pos)\n }}\n onDragEnd={(e) => {\n e.stopPropagation()\n onLayerDragEnd?.()\n }}\n >\n {hasChildren ? (\n <StyledChevron\n onClick={(e) => {\n e.stopPropagation()\n setExpanded(!expanded)\n }}\n >\n {expanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </StyledChevron>\n ) : (\n <StyledChevronPlaceholder />\n )}\n <StyledIcon>{icon}</StyledIcon>\n <StyledName>{name}</StyledName>\n <StyledActions>\n <StyledActionBtn onClick={handleToggleVisibility}>\n {shape.isHidden ? <EyeClosedIcon /> : <EyeOpenIcon />}\n </StyledActionBtn>\n <StyledActionBtn onClick={handleToggleLock}>\n {shape.isLocked ? <LockClosedIcon /> : <LockOpen1Icon />}\n </StyledActionBtn>\n </StyledActions>\n </StyledLayerItem>\n {hasChildren && expanded && (\n <StyledChildrenWrap>\n {childShapes.map((child) => (\n <LayerItem\n key={child.id}\n shape={child}\n allShapes={allShapes}\n selectedIds={selectedIds}\n app={app}\n depth={depth + 1}\n />\n ))}\n </StyledChildrenWrap>\n )}\n </>\n )\n}\n\n// --- Styles ---\n\nconst StyledPanel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n})\n\nconst StyledTabBar = styled('div', {\n display: 'flex',\n borderBottom: '1px solid $separator',\n flexShrink: 0,\n})\n\nconst StyledTab = styled('button', {\n all: 'unset',\n flex: 1,\n padding: '6px 0',\n fontSize: '9px',\n fontWeight: 600,\n textAlign: 'center',\n color: '$textSecondary',\n cursor: 'pointer',\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n transition: 'all 0.1s',\n borderBottom: '2px solid transparent',\n '&:hover': { color: '$text' },\n variants: {\n isActive: {\n true: {\n color: '$accent',\n borderBottomColor: '$accent',\n },\n },\n },\n})\n\nconst StyledList = styled('div', {\n flex: 1,\n overflowY: 'auto',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': { width: '3px' },\n '&::-webkit-scrollbar-thumb': { background: '$separator', borderRadius: '2px' },\n})\n\nconst StyledEmpty = styled('div', {\n padding: '16px 12px',\n fontSize: '10px',\n color: '$textSecondary',\n fontStyle: 'italic',\n textAlign: 'center',\n})\n\nconst StyledLayerItem = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '26px',\n paddingRight: '6px',\n cursor: 'pointer',\n transition: 'background 0.08s',\n '&:hover': { background: '$hover' },\n variants: {\n isSelected: {\n true: {\n background: 'rgba(13, 153, 255, 0.15)',\n '&:hover': { background: 'rgba(13, 153, 255, 0.2)' },\n },\n },\n },\n})\n\nconst StyledChevron = styled('button', {\n all: 'unset',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n cursor: 'pointer',\n color: '$textSecondary',\n flexShrink: 0,\n '& svg': { width: '10px', height: '10px' },\n '&:hover': { color: '$text' },\n})\n\nconst StyledChevronPlaceholder = styled('div', { width: '14px', flexShrink: 0 })\n\nconst StyledIcon = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n color: '$textSecondary',\n flexShrink: 0,\n})\n\nconst StyledName = styled('span', {\n fontSize: '10px',\n color: '$text',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flex: 1,\n fontWeight: 500,\n})\n\nconst StyledActions = styled('div', {\n display: 'flex',\n gap: '1px',\n opacity: 0,\n transition: 'opacity 0.1s',\n [`${StyledLayerItem}:hover &`]: { opacity: 1 },\n})\n\nconst StyledActionBtn = styled('button', {\n all: 'unset',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n borderRadius: '$0',\n color: '$textSecondary',\n cursor: 'pointer',\n '& svg': { width: '10px', height: '10px' },\n '&:hover': { color: '$text', background: '$hover' },\n})\n\nconst StyledChildrenWrap = styled('div', {\n borderLeft: '1px solid $separator',\n marginLeft: '18px',\n})\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport { useTelvaApp } from '~hooks'\nimport { ReactComponentEntry, useReactRegistry } from '~state/reactRegistry'\nimport { styled } from '~styles'\nimport { TVShapeType } from '~types'\n\n/**\n * ComponentsTab \u2014 lists registered React components from the registry context\n * and allows importing them into the canvas as LIVE ReactComponent shapes.\n */\nexport const ComponentsTab = React.memo(function ComponentsTab() {\n const app = useTelvaApp()\n const registry = useReactRegistry()\n const [importing, setImporting] = React.useState<string | null>(null)\n\n const handleImport = React.useCallback(\n (entry: ReactComponentEntry) => {\n setImporting(entry.id)\n try {\n const [w, h] = entry.defaultSize\n\n // Place at center of viewport\n const pagePoint = app.getPagePoint([\n window.innerWidth / 2 - w / 2,\n window.innerHeight / 2 - h / 2,\n ])\n\n const shapeId = Utils.uniqueId()\n\n // Create a live ReactComponent shape (not a static image!)\n app.createShapes({\n id: shapeId,\n type: TVShapeType.ReactComponent,\n name: entry.name,\n point: pagePoint,\n size: [w, h],\n componentId: entry.id,\n style: { color: 'black' as any, size: 'small' as any, dash: 'draw' as any },\n } as any)\n\n app.select(shapeId)\n } catch (err) {\n console.error('Failed to import component:', err)\n } finally {\n setImporting(null)\n }\n },\n [app]\n )\n\n return (\n <StyledComponentsList>\n {registry.length === 0 ? (\n <StyledEmpty>\n No components registered.\n <br />\n Add components in <code>apps/www/react/registry.tsx</code>\n </StyledEmpty>\n ) : (\n registry.map((entry) => (\n <StyledComponentCard key={entry.id}>\n <StyledPreview style={{ background: entry.previewColor || '#6366f1' }}>\n <span>{'<' + entry.name + ' />'}</span>\n </StyledPreview>\n <StyledCardInfo>\n <StyledCardName>{entry.name}</StyledCardName>\n <StyledCardDesc>{entry.description}</StyledCardDesc>\n <StyledCardPath>{entry.sourcePath}</StyledCardPath>\n </StyledCardInfo>\n <StyledImportBtn onClick={() => handleImport(entry)} disabled={importing === entry.id}>\n {importing === entry.id ? '...' : 'Import'}\n </StyledImportBtn>\n </StyledComponentCard>\n ))\n )}\n\n <StyledHelpText>\n Components render LIVE on your canvas.\n <br />\n </StyledHelpText>\n </StyledComponentsList>\n )\n})\n\n// --- Styles ---\n\nconst StyledComponentsList = styled('div', {\n flex: 1,\n padding: '6px',\n overflowY: 'auto',\n '&::-webkit-scrollbar': { width: '3px' },\n '&::-webkit-scrollbar-thumb': { background: '$separator', borderRadius: '2px' },\n})\n\nconst StyledEmpty = styled('div', {\n padding: '16px 8px',\n fontSize: '10px',\n color: '$textSecondary',\n textAlign: 'center',\n lineHeight: 1.5,\n '& code': { fontSize: '9px', background: '$inputBg', padding: '1px 4px', borderRadius: '$0' },\n})\n\nconst StyledComponentCard = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px',\n borderRadius: '$2',\n border: '1px solid $separator',\n marginBottom: '4px',\n transition: 'background 0.08s',\n '&:hover': { background: '$hover' },\n})\n\nconst StyledPreview = styled('div', {\n width: '36px',\n height: '36px',\n borderRadius: '$1',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n '& span': { fontSize: '7px', color: 'rgba(255,255,255,0.8)', fontFamily: '$mono' },\n})\n\nconst StyledCardInfo = styled('div', { flex: 1, minWidth: 0 })\n\nconst StyledCardName = styled('div', {\n fontSize: '10px',\n fontWeight: 600,\n color: '$text',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n})\n\nconst StyledCardDesc = styled('div', {\n fontSize: '9px',\n color: '$textSecondary',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n})\n\nconst StyledCardPath = styled('div', {\n fontSize: '8px',\n color: '$textSecondary',\n opacity: 0.6,\n fontFamily: '$mono',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n})\n\nconst StyledImportBtn = styled('button', {\n all: 'unset',\n fontSize: '9px',\n fontWeight: 600,\n color: 'white',\n background: '$accent',\n padding: '3px 8px',\n borderRadius: '$1',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'opacity 0.1s',\n '&:hover': { opacity: 0.85 },\n '&:disabled': { opacity: 0.5, cursor: 'not-allowed' },\n})\n\nconst StyledHelpText = styled('div', {\n padding: '10px 6px',\n fontSize: '8px',\n color: '$textSecondary',\n lineHeight: 1.4,\n borderTop: '1px solid $separator',\n marginTop: '6px',\n '& code': { fontSize: '8px', background: '$inputBg', padding: '1px 3px', borderRadius: '$0' },\n})\n", "/**\n * React Component Registry \u2014 Type definitions and context.\n *\n * The actual component registry is configured in apps/www/react/registry.tsx.\n * Components are passed to <Telva> via the `reactComponents` prop.\n */\nimport * as React from 'react'\n\nexport interface ReactComponentEntry {\n id: string\n name: string\n description: string\n /** Default width/height when placed on canvas */\n defaultSize: [number, number]\n /** Source file path (for reference/display) */\n sourcePath: string\n /** Thumbnail color for the components list */\n previewColor?: string\n /** The actual React component to render */\n component: React.ComponentType<any>\n}\n\n/**\n * Context that provides the registry to the ComponentsTab.\n * Populated by Telva from the `reactComponents` prop.\n */\nexport const ReactRegistryContext = React.createContext<ReactComponentEntry[]>([])\n\nexport function useReactRegistry() {\n return React.useContext(ReactRegistryContext)\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { LayersPanel } from './LayersPanel'\n\nexport const LeftPanel = React.memo(function LeftPanel() {\n return (\n <StyledLeftPanel>\n <LayersPanel />\n </StyledLeftPanel>\n )\n})\n\nconst StyledLeftPanel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '200px',\n height: '100%',\n background: '$panel',\n borderRight: '1px solid $separator',\n zIndex: 200,\n pointerEvents: 'all',\n overflow: 'hidden',\n flexShrink: 0,\n})\n", "import * as React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport type { TVSnapshot } from '~types'\n\nconst loadingSelector = (s: TVSnapshot) => s.appState.isLoading\n\nexport function Loading() {\n const app = useTelvaApp()\n const isLoading = app.useStore(loadingSelector)\n\n return (\n <StyledLoadingPanelContainer hidden={!isLoading}>\n <FormattedMessage id=\"loading\" values={{ dots: '...' }} />\n </StyledLoadingPanelContainer>\n )\n}\n\nconst StyledLoadingPanelContainer = styled('div', {\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: `translate(-50%, 0)`,\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n padding: '8px 16px',\n fontFamily: 'var(--fonts-ui)',\n fontSize: 'var(--fontSizes-1)',\n boxShadow: 'var(--shadows-panel)',\n backgroundColor: 'white',\n zIndex: 200,\n pointerEvents: 'none',\n '& > div > *': {\n pointerEvents: 'all',\n },\n variants: {\n transform: {\n hidden: {\n transform: `translate(-50%, 100%)`,\n },\n visible: {\n transform: `translate(-50%, 0%)`,\n },\n },\n },\n})\n", "import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { DialogState, useDialog } from '~hooks'\nimport { styled } from '~styles'\n\ninterface ContentProps {\n children: React.ReactNode\n onClose?: () => void\n container: any\n}\n\nfunction Content({ children, onClose, container }: ContentProps) {\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Escape':\n onClose?.()\n break\n }\n }\n return (\n <AlertDialogPrimitive.Portal container={container}>\n <StyledOverlay />\n <StyledContent onKeyDown={handleKeyDown}>{children}</StyledContent>\n </AlertDialogPrimitive.Portal>\n )\n}\n\nconst StyledDescription = styled(AlertDialogPrimitive.Description, {\n marginBottom: 20,\n color: '$text',\n fontSize: '$2',\n lineHeight: 1.5,\n textAlign: 'center',\n maxWidth: '62%',\n minWidth: 0,\n alignSelf: 'center',\n})\n\nexport const AlertDialogRoot = AlertDialogPrimitive.Root\nexport const AlertDialogContent = Content\nexport const AlertDialogDescription = StyledDescription\nexport const AlertDialogAction = AlertDialogPrimitive.Action\nexport const AlertDialogCancel = AlertDialogPrimitive.Cancel\n\nexport const AlertDialog = ({ container }: { container: any }) => {\n const { setDialogState, dialogState, onCancel, onNo, onYes } = useDialog()\n const intl = useIntl()\n const descriptions: Record<DialogState, string> = {\n saveFirstTime: intl.formatMessage({ id: 'dialog.save.firsttime' }),\n saveAgain: intl.formatMessage({ id: 'dialog.save.again' }),\n }\n\n return (\n <AlertDialogRoot open={dialogState !== null}>\n <AlertDialogContent onClose={() => setDialogState(null)} container={container}>\n {dialogState && (\n <AlertDialogDescription>{descriptions[dialogState]}</AlertDialogDescription>\n )}\n <div\n style={{\n width: '100%',\n gap: '$6',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n {onCancel && (\n <AlertDialogCancel asChild>\n <Button\n css={{ color: '$text' }}\n onClick={() => {\n onCancel()\n setDialogState(null)\n }}\n >\n <FormattedMessage id=\"dialog.cancel\" />\n </Button>\n </AlertDialogCancel>\n )}\n <div style={{ flexShrink: 0 }}>\n {onNo && (\n <AlertDialogAction asChild>\n <Button\n onClick={() => {\n onNo()\n setDialogState(null)\n }}\n >\n <FormattedMessage id=\"dialog.no\" />\n </Button>\n </AlertDialogAction>\n )}\n {onYes && (\n <AlertDialogAction asChild>\n <Button\n css={{ backgroundColor: '#2F80ED', color: 'White' }}\n onClick={() => {\n onYes()\n setDialogState(null)\n }}\n >\n <FormattedMessage id=\"dialog.yes\" />\n </Button>\n </AlertDialogAction>\n )}\n </div>\n </div>\n </AlertDialogContent>\n </AlertDialogRoot>\n )\n}\n\nconst StyledOverlay = styled(AlertDialogPrimitive.Overlay, {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, .15)',\n pointerEvents: 'all',\n})\n\nexport const StyledDialogOverlay = styled(AlertDialogPrimitive.Overlay, {\n backgroundColor: 'rgba(0, 0, 0, .15)',\n position: 'absolute',\n pointerEvents: 'all',\n inset: 0,\n})\n\nconst StyledContent = styled(AlertDialogPrimitive.Content, {\n position: 'fixed',\n font: '$ui',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 'max-content',\n padding: '$3',\n pointerEvents: 'all',\n backgroundColor: '$panel',\n borderRadius: '$3',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n fontFamily: '$ui',\n border: '1px solid $panelContrast',\n boxShadow: '$panel',\n})\n\nexport const Button = styled('button', {\n all: 'unset',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '$2',\n padding: '0 15px',\n fontSize: '$1',\n lineHeight: 1,\n fontWeight: 'normal',\n height: 36,\n color: '$text',\n cursor: 'pointer',\n minWidth: 48,\n})\n", "import * as Dialog from '@radix-ui/react-alert-dialog'\nimport { Pencil1Icon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { useContainer, useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { TextField } from '../TextField'\nimport { Button } from './AlertDialog'\n\ninterface FilenameDialogProps {\n isOpen: boolean\n onClose: () => void\n}\n\nexport const FilenameDialog = ({ isOpen, onClose }: FilenameDialogProps) => {\n const app = useTelvaApp()\n const container = useContainer()\n const intl = useIntl()\n const [filename, setFilename] = React.useState(app.document.name)\n const [format, setFormat] = React.useState<'tldr' | 'tld'>('tldr')\n\n const handleChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value.trimStart()\n setFilename(value)\n }, [])\n\n function stopPropagation(e: React.KeyboardEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n const handleTextFieldKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'Enter': {\n const name = filename.trim().replace(/\\.(tldr|tld)$/, '')\n app.saveProjectAs(name, format)\n onClose()\n break\n }\n case 'Escape': {\n onClose()\n break\n }\n }\n },\n [filename, format]\n )\n\n return (\n <Dialog.Root open={isOpen}>\n <Dialog.Portal container={container.current}>\n <StyledDialogOverlay onPointerDown={onClose} />\n <StyledDialogContent dir=\"ltr\" onKeyDown={stopPropagation} onKeyUp={stopPropagation}>\n <Input\n placeholder={intl.formatMessage({ id: 'enter.file.name' })}\n value={filename}\n onChange={handleChange}\n onKeyDown={handleTextFieldKeyDown}\n icon={<Pencil1Icon />}\n />\n {/* Format selector */}\n <FormatRow>\n <FormatLabel>Format:</FormatLabel>\n <FormatBtn active={format === 'tldr'} onClick={() => setFormat('tldr')}>\n .tldr\n </FormatBtn>\n <FormatBtn active={format === 'tld'} onClick={() => setFormat('tld')}>\n .tld\n </FormatBtn>\n </FormatRow>\n <ActionWrapper>\n <Dialog.Action asChild>\n <Button onClick={onClose}>\n <FormattedMessage id=\"cancel\" />\n </Button>\n </Dialog.Action>\n <Dialog.Action asChild>\n <Button\n css={{ backgroundColor: '#2F80ED', color: 'White' }}\n onClick={() => {\n const name = filename.trim().replace(/\\.(tldr|tld)$/, '')\n app.saveProjectAs(name, format)\n onClose()\n }}\n >\n <FormattedMessage id=\"save\" />\n </Button>\n </Dialog.Action>\n </ActionWrapper>\n </StyledDialogContent>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\nconst StyledDialogContent = styled(Dialog.Content, {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n minWidth: 300,\n maxWidth: 'fit-content',\n maxHeight: '85vh',\n marginTop: '-5vh',\n pointerEvents: 'all',\n backgroundColor: '$panel',\n padding: '$3',\n borderRadius: '$2',\n font: '$ui',\n zIndex: 999999,\n '&:focus': {\n outline: 'none',\n },\n})\n\nconst StyledDialogOverlay = styled(Dialog.Overlay, {\n backgroundColor: 'rgba(0, 0, 0, .15)',\n position: 'absolute',\n pointerEvents: 'all',\n inset: 0,\n zIndex: 999998,\n})\n\nconst ActionWrapper = styled('div', {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n justifyContent: 'flex-end',\n marginTop: 10,\n})\n\nconst Input = styled(TextField, {\n background: '$hover',\n})\n\nconst FormatRow = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginTop: 8,\n})\n\nconst FormatLabel = styled('span', {\n fontSize: 11,\n color: '$textSecondary',\n flexShrink: 0,\n})\n\nconst FormatBtn = styled('button', {\n all: 'unset',\n padding: '3px 10px',\n borderRadius: 4,\n fontSize: 11,\n fontFamily: 'monospace',\n cursor: 'pointer',\n border: '1px solid $separator',\n color: '$textSecondary',\n transition: 'all 0.1s',\n '&:hover': { background: '$hover', color: '$text' },\n variants: {\n active: {\n true: {\n background: '#2F80ED',\n borderColor: '#2F80ED',\n color: 'white',\n '&:hover': { background: '#2F80ED', color: 'white' },\n },\n },\n },\n})\n", "import * as React from 'react'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { styled } from '~styles'\n\nexport interface TextFieldProps extends React.HTMLProps<HTMLInputElement> {\n icon?: React.ReactElement\n}\n\nexport const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n ({ icon, ...rest }, ref) => {\n return (\n <StyledInputWrapper>\n <StyledInput {...rest} ref={ref} />\n {icon ? <StyledInputIcon>{icon}</StyledInputIcon> : null}\n </StyledInputWrapper>\n )\n }\n)\n\nconst StyledInputWrapper = styled('div', {\n position: 'relative',\n width: '100%',\n height: 'min-content',\n})\n\nconst StyledInput = styled('input', {\n color: '$text',\n border: 'none',\n textAlign: 'left',\n width: '100%',\n paddingLeft: '$3',\n paddingRight: '$6',\n backgroundColor: '$background',\n\n height: '32px',\n outline: 'none',\n fontFamily: '$ui',\n fontSize: '$1',\n '&:focus': {\n backgroundColor: '$hover',\n },\n borderRadius: '$2',\n})\n\nconst StyledInputIcon = styled(SmallIcon, {\n top: 0,\n right: 0,\n position: 'absolute',\n paddingLeft: '$3',\n paddingRight: '$3',\n pointerEvents: 'none',\n color: '$text',\n})\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { PropertiesPanel } from './PropertiesPanel'\n\nexport const RightPanel = React.memo(function RightPanel() {\n return (\n <StyledRightPanel>\n <PropertiesPanel />\n </StyledRightPanel>\n )\n})\n\nconst StyledRightPanel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '240px',\n height: '100%',\n background: '$panel',\n borderLeft: '1px solid $separator',\n zIndex: 200,\n pointerEvents: 'all',\n overflow: 'hidden',\n flexShrink: 0,\n})\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport { useTelvaApp } from '~hooks'\nimport { fills, strokes } from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport {\n AlignStyle,\n AlignType,\n DashStyle,\n Decoration,\n DistributeType,\n EffectType,\n FontStyle,\n ShapeStyles,\n StretchType,\n TVEffect,\n TVExportType,\n TVShape,\n TVShapeType,\n TVSnapshot,\n} from '~types'\nimport { ColorSwatchInput, hexToRgb, rgbToHex } from './ColorPicker'\nimport { DraggableInput } from './DraggableInput'\nimport { GradientData, GradientPicker } from './GradientPicker'\n\n// \u2500\u2500\u2500 RGBA helpers (used for labelColor / labelBackground with opacity) \u2500\u2500\u2500\nfunction hexToRgba(hex: string, opacity: number): string {\n const [r, g, b] = hexToRgb(hex)\n return `rgba(${r},${g},${b},${opacity.toFixed(3)})`\n}\nfunction parseCssColor(\n css: string | undefined,\n fallback: string\n): { hex: string; opacity: number } {\n if (!css || css === 'transparent') return { hex: 'transparent', opacity: 1 }\n const m = css.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/)\n if (m) {\n const hex = rgbToHex(parseInt(m[1]), parseInt(m[2]), parseInt(m[3]))\n return { hex, opacity: m[4] !== undefined ? parseFloat(m[4]) : 1 }\n }\n if (css.startsWith('#')) return { hex: css.slice(0, 7), opacity: 1 }\n return { hex: fallback, opacity: 1 }\n}\n\n// === Selectors ===\nconst selectedDataSelector = (s: TVSnapshot) => {\n const page = s.document.pages[s.appState.currentPageId]\n const ids = s.document.pageStates[s.appState.currentPageId].selectedIds\n const shapes = ids.map((id) => page.shapes[id]).filter(Boolean)\n return { shapes, key: JSON.stringify(shapes) }\n}\nconst themeSelector = (s: TVSnapshot) => (s.settings.isDarkMode ? 'dark' : 'light')\n\n// ===================== MAIN =====================\nexport const PropertiesPanel = React.memo(function PropertiesPanel() {\n const app = useTelvaApp()\n const { shapes: selectedShapes } = app.useStore(selectedDataSelector)\n const theme = app.useStore(themeSelector)\n\n if (selectedShapes.length === 0) {\n return (\n <Panel>\n <SectionWrap>\n <SectionTitle>Design</SectionTitle>\n <Hint>Select an element to edit</Hint>\n </SectionWrap>\n </Panel>\n )\n }\n\n const shape = selectedShapes[0]\n const multi = selectedShapes.length > 1\n const isText =\n shape.type === TVShapeType.Text || shape.type === TVShapeType.Sticky || 'label' in shape\n const isArrow = shape.type === TVShapeType.Arrow\n const isRect = shape.type === TVShapeType.Rectangle\n const isNodeEditable =\n shape.type === TVShapeType.Rectangle ||\n shape.type === TVShapeType.Triangle ||\n shape.type === TVShapeType.Ellipse ||\n shape.type === TVShapeType.Draw ||\n shape.type === (TVShapeType as any).Pen\n\n return (\n <Panel>\n <HeaderSection shape={shape} multi={multi} count={selectedShapes.length} />\n <Divider />\n\n {/* {!multi && isNodeEditable && (\n <>\n <NodeEditSection shape={shape} app={app} />\n <Divider />\n </>\n )} */}\n\n {!multi && <PositionSection shape={shape} app={app} />}\n {multi && <AlignmentSection app={app} />}\n <Divider />\n\n {!multi && <LayoutSection shape={shape} app={app} />}\n {!multi && <Divider />}\n\n <AppearanceSection shape={shape} app={app} isRect={isRect} />\n <Divider />\n\n <FillSection style={shape.style} theme={theme} app={app} />\n <Divider />\n\n <CollapsibleRow title=\"Stroke\">\n <StrokeSection style={shape.style} theme={theme} app={app} />\n </CollapsibleRow>\n <Divider />\n\n {/* Gradient Section */}\n <CollapsibleRow title=\"Gradient\">\n <GradientSection shape={shape} app={app} />\n </CollapsibleRow>\n <Divider />\n\n {/* Text Color & Background (for shapes with text) */}\n {isText && (\n <>\n <CollapsibleRow title=\"Text Style\" defaultOpen>\n <TextStyleSection style={shape.style} app={app} theme={theme} />\n </CollapsibleRow>\n <Divider />\n </>\n )}\n\n <CollapsibleRow title=\"Effects\">\n <EffectsSection shape={shape} app={app} />\n </CollapsibleRow>\n <Divider />\n\n {isArrow && !multi && (\n <>\n <CollapsibleRow title=\"Arrow\" defaultOpen>\n <ArrowSection shape={shape} app={app} />\n </CollapsibleRow>\n <Divider />\n </>\n )}\n\n {isText && (\n <>\n <CollapsibleRow title=\"Typography\" defaultOpen>\n <TypographySection style={shape.style} app={app} />\n </CollapsibleRow>\n <Divider />\n </>\n )}\n\n <CollapsibleRow title=\"Export\">\n <ExportSection shape={shape} app={app} />\n </CollapsibleRow>\n\n <div style={{ height: 40 }} />\n </Panel>\n )\n})\n\n// ===================== SECTIONS =====================\n\n// --- Header ---\nfunction HeaderSection({ shape, multi, count }: { shape: TVShape; multi: boolean; count: number }) {\n const name = multi\n ? count + ' Selected'\n : shape.type.charAt(0).toUpperCase() + shape.type.slice(1)\n return (\n <SectionWrap style={{ padding: '10px 12px 6px' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <SectionTitle style={{ marginBottom: 0, fontSize: '11px' }}>{name}</SectionTitle>\n <div style={{ display: 'flex', gap: 4 }}>\n {['\\u229E', '\\u25D1', '\\u229F', '\\u22A0'].map((icon, i) => (\n <IconBtn key={i} title={['Clip Mask', 'Component', 'Boolean', 'Flatten'][i]}>\n {icon}\n </IconBtn>\n ))}\n </div>\n </div>\n </SectionWrap>\n )\n}\n\n// --- Position ---\nfunction PositionSection({ shape, app }: { shape: TVShape; app: any }) {\n const point = shape.point || [0, 0]\n const rotation = Math.round((shape.rotation || 0) * (180 / Math.PI))\n\n const update = React.useCallback(\n (field: string, value: number) => {\n const u: any = { id: shape.id }\n switch (field) {\n case 'x':\n u.point = [value, point[1]]\n break\n case 'y':\n u.point = [point[0], value]\n break\n case 'r':\n u.rotation = (value * Math.PI) / 180\n break\n }\n app.updateShapes(u)\n },\n [shape.id, point, app]\n )\n\n return (\n <SectionWrap>\n <SectionTitle>Position</SectionTitle>\n <AlignGrid>\n {[\n {\n fn: () => app.align(AlignType.Left),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"2\" x2=\"2\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect\n x=\"4\"\n y=\"4\"\n width=\"7\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"4\"\n y=\"8\"\n width=\"5\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Left',\n },\n {\n fn: () => app.align(AlignType.CenterHorizontal),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line\n x1=\"7\"\n y1=\"1\"\n x2=\"7\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeDasharray=\"2 1\"\n />\n <rect\n x=\"3\"\n y=\"4\"\n width=\"8\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"4\"\n y=\"8\"\n width=\"6\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Center H',\n },\n {\n fn: () => app.align(AlignType.Right),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect\n x=\"3\"\n y=\"4\"\n width=\"7\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"5\"\n y=\"8\"\n width=\"5\"\n height=\"2.5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Right',\n },\n {\n fn: () => app.align(AlignType.Top),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect\n x=\"4\"\n y=\"4\"\n width=\"2.5\"\n height=\"7\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"8\"\n y=\"4\"\n width=\"2.5\"\n height=\"5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Top',\n },\n {\n fn: () => app.align(AlignType.CenterVertical),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line\n x1=\"1\"\n y1=\"7\"\n x2=\"13\"\n y2=\"7\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeDasharray=\"2 1\"\n />\n <rect\n x=\"4\"\n y=\"2\"\n width=\"2.5\"\n height=\"10\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"8\"\n y=\"3\"\n width=\"2.5\"\n height=\"8\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Center V',\n },\n {\n fn: () => app.align(AlignType.Bottom),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect\n x=\"4\"\n y=\"3\"\n width=\"2.5\"\n height=\"7\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n <rect\n x=\"8\"\n y=\"5\"\n width=\"2.5\"\n height=\"5\"\n rx=\"0.5\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n />\n </svg>\n ),\n t: 'Bottom',\n },\n ].map(({ fn, icon, t }, i) => (\n <SmallBtn key={i} onClick={fn} title={t}>\n {icon}\n </SmallBtn>\n ))}\n </AlignGrid>\n\n <FieldGrid style={{ marginTop: 8 }}>\n <DraggableInput label=\"X\" value={Math.round(point[0])} onChange={(v) => update('x', v)} />\n <DraggableInput label=\"Y\" value={Math.round(point[1])} onChange={(v) => update('y', v)} />\n </FieldGrid>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, marginTop: 4 }}>\n <DraggableInput\n label=\"R\"\n value={rotation}\n onChange={(v) => update('r', v)}\n suffix={'\\u00B0'}\n style={{ flex: 1 }}\n />\n <div style={{ display: 'flex', gap: 2 }}>\n <SmallBtn onClick={() => app.flipHorizontal()} title=\"Flip Horizontal\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\">\n <path\n d=\"M7 2v10M3 5l-1 4h4zM11 5l1 4h-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n </SmallBtn>\n <SmallBtn onClick={() => app.flipVertical()} title=\"Flip Vertical\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\">\n <path\n d=\"M2 7h10M5 3l4-1v4zM5 11l4 1v-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n </SmallBtn>\n </div>\n </div>\n </SectionWrap>\n )\n}\n\n// --- Layout (W/H + aspect lock) - FIXED UI ---\nfunction LayoutSection({ shape, app }: { shape: TVShape; app: any }) {\n const size =\n 'size' in shape\n ? (shape as any).size\n : 'radius' in shape\n ? [(shape as any).radius[0] * 2, (shape as any).radius[1] * 2]\n : [0, 0]\n const [locked, setLocked] = React.useState(false)\n\n const handleSize = React.useCallback(\n (dim: 'w' | 'h', value: number) => {\n const u: any = { id: shape.id }\n if ('size' in shape) {\n if (dim === 'w') {\n const newH = locked ? (value / size[0]) * size[1] : size[1]\n u.size = [value, newH]\n } else {\n const newW = locked ? (value / size[1]) * size[0] : size[0]\n u.size = [newW, value]\n }\n } else if ('radius' in shape) {\n if (dim === 'w')\n u.radius = [\n value / 2,\n locked ? ((value / 2 / size[0]) * size[1]) / 2 : (shape as any).radius[1],\n ]\n else\n u.radius = [\n locked ? ((value / 2 / size[1]) * size[0]) / 2 : (shape as any).radius[0],\n value / 2,\n ]\n }\n app.updateShapes(u)\n },\n [shape, size, locked, app]\n )\n\n return (\n <SectionWrap>\n <SectionTitle>Layout</SectionTitle>\n <LayoutGrid>\n <DraggableInput\n label=\"W\"\n value={Math.round(size[0])}\n onChange={(v) => handleSize('w', v)}\n min={1}\n />\n {/* <LockBtn\n onClick={(e) => { e.stopPropagation(); setLocked((l) => !l) }}\n title={locked ? 'Unlock aspect ratio' : 'Lock aspect ratio'}\n locked={locked || undefined}\n >\n {locked ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <rect\n x=\"3\"\n y=\"6\"\n width=\"8\"\n height=\"6\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M5 6V4a2 2 0 014 0v2\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <rect\n x=\"3\"\n y=\"6\"\n width=\"8\"\n height=\"6\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M5 6V4a2 2 0 014 0\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n )}\n </LockBtn> */}\n <DraggableInput\n label=\"H\"\n value={Math.round(size[1])}\n onChange={(v) => handleSize('h', v)}\n min={1}\n />\n </LayoutGrid>\n </SectionWrap>\n )\n}\n\n// --- Appearance (Opacity + Corner Radius) ---\nfunction AppearanceSection({ shape, app, isRect }: { shape: TVShape; app: any; isRect: boolean }) {\n const opacityPct = Math.round((shape.style.opacity ?? 1) * 100)\n const borderRadius = shape.style.borderRadius ?? 0\n\n return (\n <SectionWrap>\n <SectionTitle>Appearance</SectionTitle>\n <DraggableInput\n label=\"Opacity\"\n value={opacityPct}\n onChange={(v) => app.style({ opacity: v / 100 })}\n min={0}\n max={100}\n suffix=\"%\"\n labelWidth={36}\n />\n {isRect && (\n <div style={{ marginTop: 4 }}>\n <DraggableInput\n label=\"Corner\"\n value={borderRadius}\n onChange={(v) => app.style({ borderRadius: v })}\n min={0}\n suffix=\"px\"\n labelWidth={36}\n />\n </div>\n )}\n <FieldRow style={{ marginTop: 4 }}>\n <FieldLabel style={{ width: 36 }}>Dash</FieldLabel>\n <BtnGroup>\n {[\n { val: DashStyle.Draw, label: '~' },\n { val: DashStyle.Solid, label: '\\u2014' },\n { val: DashStyle.Dashed, label: '- -' },\n { val: DashStyle.Dotted, label: '\\u00B7\\u00B7\\u00B7' },\n ].map(({ val, label }) => (\n <SmallBtn\n key={val}\n isActive={shape.style.dash === val}\n onClick={() => app.style({ dash: val })}\n >\n {label}\n </SmallBtn>\n ))}\n </BtnGroup>\n </FieldRow>\n </SectionWrap>\n )\n}\n\n// --- Fill Section (uses ColorSwatchInput) ---\nfunction FillSection({ style, theme, app }: { style: ShapeStyles; theme: string; app: any }) {\n const fillHex = style.isFilled\n ? style.fillHex || fills[theme as 'light' | 'dark']?.[style.color] || fills.light[style.color]\n : 'transparent'\n\n const commit = React.useCallback(\n (hex: string, opacity: number) => {\n if (hex === 'transparent') {\n app.style({ isFilled: false })\n } else {\n app.style({ fillHex: hex, isFilled: true, opacity })\n }\n },\n [app]\n )\n\n return (\n <SectionWrap>\n <SectionTitle>Fill</SectionTitle>\n <ColorSwatchInput\n color={fillHex}\n opacity={style.opacity ?? 1}\n onChange={commit}\n showTransparent={true}\n showOpacity={true}\n label=\"Color\"\n />\n {/* <SmallBtn\n onClick={() => app.style({ isFilled: !style.isFilled })}\n title={style.isFilled ? 'Hide fill' : 'Show fill'}\n style={{ flex: 0, width: 24, height: 24 }}\n >\n {style.isFilled ? '\\uD83D\\uDC41' : '\\uD83D\\uDE48'}\n </SmallBtn> */}\n </SectionWrap>\n )\n}\n\n// --- Stroke Section (uses ColorSwatchInput) ---\nfunction StrokeSection({ style, theme, app }: { style: ShapeStyles; theme: string; app: any }) {\n const strokeHex =\n style.strokeHex ||\n strokes[theme as 'light' | 'dark']?.[style.color] ||\n strokes.light[style.color]\n const strokeWidth =\n style.strokeWidthOverride ?? ({ small: 2, medium: 3.5, large: 5 }[style.size] || 2)\n\n return (\n <div>\n <ColorSwatchInput\n color={strokeHex}\n opacity={1}\n onChange={(hex) => app.style({ strokeHex: hex })}\n showTransparent={true}\n showOpacity={false}\n />\n <div style={{ marginTop: 6 }}>\n <DraggableInput\n label=\"Width\"\n value={strokeWidth}\n onChange={(v) => app.style({ strokeWidthOverride: v })}\n min={0}\n step={0.01}\n suffix=\"px\"\n max={10}\n labelWidth={36}\n />\n </div>\n </div>\n )\n}\n\n// --- Gradient Section ---\nfunction GradientSection({ shape, app }: { shape: TVShape; app: any }) {\n const [enabled, setEnabled] = React.useState(!!shape.style.gradient)\n const gradientData = shape.style.gradient as GradientData | undefined\n\n const handleToggle = React.useCallback(() => {\n if (enabled) {\n app.style({ gradient: undefined })\n setEnabled(false)\n } else {\n const defaultGrad: GradientData = {\n type: 'linear',\n stops: [\n { color: '#0D99FF', position: 0, opacity: 1 },\n { color: '#FF6B00', position: 100, opacity: 1 },\n ],\n angle: 90,\n centerX: 50,\n centerY: 50,\n }\n app.style({ gradient: defaultGrad, isFilled: true })\n setEnabled(true)\n }\n }, [enabled, app])\n\n return (\n <div>\n <FieldRow>\n <FieldLabel style={{ width: 36 }}>Enable</FieldLabel>\n <Toggle checked={enabled} onClick={handleToggle}>\n <ToggleThumb checked={enabled} />\n </Toggle>\n </FieldRow>\n {enabled && (\n <div style={{ marginTop: 8 }}>\n <GradientPicker\n value={gradientData}\n onChange={(data, _css) => {\n app.style({ gradient: data })\n }}\n />\n </div>\n )}\n </div>\n )\n}\n\n// --- Text Style Section (Color & Background with opacity) ---\nfunction TextStyleSection({ style, app, theme }: { style: ShapeStyles; app: any; theme: string }) {\n const defaultColor = strokes[theme as 'light' | 'dark']?.[style.color] || '#000000'\n const { hex: labelColorHex, opacity: labelColorOp } = parseCssColor(\n style.labelColor,\n defaultColor\n )\n const { hex: labelBgHex, opacity: labelBgOp } = parseCssColor(\n style.labelBackground,\n 'transparent'\n )\n const textGradient = style.textGradient as GradientData | undefined\n const [textGradEnabled, setTextGradEnabled] = React.useState(!!textGradient)\n\n const handleTextGradToggle = React.useCallback(() => {\n if (textGradEnabled) {\n app.style({ textGradient: undefined })\n setTextGradEnabled(false)\n } else {\n const defaultGrad: GradientData = {\n type: 'linear',\n stops: [\n { color: '#0D99FF', position: 0, opacity: 1 },\n { color: '#FF6B00', position: 100, opacity: 1 },\n ],\n angle: 90,\n centerX: 50,\n centerY: 50,\n }\n app.style({ textGradient: defaultGrad })\n setTextGradEnabled(true)\n }\n }, [textGradEnabled, app])\n\n return (\n <div>\n <ColorSwatchInput\n color={labelColorHex}\n opacity={labelColorOp}\n onChange={(hex, opacity) => {\n const val = hex === 'transparent' ? 'transparent' : hexToRgba(hex, opacity)\n app.style({ labelColor: val })\n }}\n showTransparent={true}\n showOpacity={true}\n label=\"Text\"\n />\n <div style={{ marginTop: 6 }}>\n <ColorSwatchInput\n color={labelBgHex}\n opacity={labelBgOp}\n onChange={(hex, opacity) => {\n const val = hex === 'transparent' ? 'transparent' : hexToRgba(hex, opacity)\n app.style({ labelBackground: val })\n }}\n showTransparent={true}\n showOpacity={true}\n label=\"Text Bg\"\n />\n </div>\n <div style={{ marginTop: 8 }}>\n <FieldRow>\n <FieldLabel style={{ width: 60 }}>Text Grad</FieldLabel>\n <Toggle checked={textGradEnabled} onClick={handleTextGradToggle}>\n <ToggleThumb checked={textGradEnabled} />\n </Toggle>\n </FieldRow>\n {textGradEnabled && (\n <div style={{ marginTop: 8 }}>\n <GradientPicker\n value={textGradient}\n onChange={(data) => app.style({ textGradient: data })}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction normalizeEffects(raw: any): TVEffect[] {\n if (!raw) return []\n if (Array.isArray(raw)) return raw\n const arr: TVEffect[] = []\n if (raw.dropShadow) {\n arr.push({\n id: Utils.uniqueId(),\n type: 'dropShadow',\n enabled: raw.dropShadow.enabled,\n x: raw.dropShadow.x,\n y: raw.dropShadow.y,\n blur: raw.dropShadow.blur,\n spread: raw.dropShadow.spread,\n color: raw.dropShadow.color,\n })\n }\n const defaults: Record<string, number> = {\n layerBlur: 0,\n blur: 0,\n brightness: 100,\n contrast: 100,\n saturate: 100,\n hueRotate: 0,\n grayscale: 0,\n sepia: 0,\n }\n for (const k of Object.keys(defaults)) {\n if (raw[k] !== undefined && raw[k] !== defaults[k]) {\n arr.push({ id: Utils.uniqueId(), type: k as EffectType, enabled: true, value: raw[k] })\n }\n }\n if (raw.invert) arr.push({ id: Utils.uniqueId(), type: 'invert', enabled: true })\n return arr\n}\n\nconst EFFECT_NAMES: Record<EffectType, string> = {\n dropShadow: 'Drop Shadow',\n blur: 'Blur',\n layerBlur: 'Layer Blur',\n brightness: 'Brightness',\n contrast: 'Contrast',\n saturate: 'Saturation',\n hueRotate: 'Hue Rotate',\n grayscale: 'Grayscale',\n sepia: 'Sepia',\n invert: 'Invert',\n}\n\nfunction EffectsSection({ shape, app }: { shape: TVShape; app: any }) {\n const effects = normalizeEffects((shape as any).effects)\n\n const updateEffects = React.useCallback(\n (newEffects: TVEffect[]) => app.updateShapes({ id: shape.id, effects: newEffects }),\n [app, shape.id]\n )\n\n const updateEffect = (id: string, patch: Partial<TVEffect>) => {\n updateEffects(effects.map((e) => (e.id === id ? { ...e, ...patch } : e)))\n }\n\n const removeEffect = (id: string) => {\n updateEffects(effects.filter((e) => e.id !== id))\n }\n\n const addEffect = (type: EffectType) => {\n const newEff: TVEffect = { id: Utils.uniqueId(), type, enabled: true }\n if (type === 'dropShadow') {\n Object.assign(newEff, { x: 2, y: 4, blur: 8, spread: 0, color: '#00000080' })\n } else if (['layerBlur', 'blur'].includes(type)) {\n newEff.value = 4\n } else if (['brightness', 'contrast', 'saturate'].includes(type)) {\n newEff.value = 100\n } else {\n newEff.value = 0\n }\n updateEffects([...effects, newEff])\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {effects.map((eff) => (\n <div\n key={eff.id}\n style={{ borderBottom: '1px solid var(--colors-separator)', paddingBottom: 6 }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <Toggle\n checked={eff.enabled}\n onClick={() => updateEffect(eff.id, { enabled: !eff.enabled })}\n >\n <ToggleThumb checked={eff.enabled} />\n </Toggle>\n <span style={{ fontSize: 10, fontWeight: 500, color: 'var(--colors-text)' }}>\n {EFFECT_NAMES[eff.type]}\n </span>\n </div>\n <button\n onClick={() => removeEffect(eff.id)}\n style={{ all: 'unset', cursor: 'pointer', opacity: 0.5, fontSize: 12, lineHeight: 1 }}\n title=\"Remove effect\"\n >\n \u2715\n </button>\n </div>\n\n {/* Effect Properties */}\n {eff.enabled && (\n <div style={{ paddingLeft: 22 }}>\n {eff.type === 'dropShadow' && (\n <>\n <FieldGrid style={{ marginBottom: 4 }}>\n <DraggableInput\n label=\"X\"\n value={eff.x ?? 0}\n onChange={(v) => updateEffect(eff.id, { x: v })}\n />\n <DraggableInput\n label=\"Y\"\n value={eff.y ?? 0}\n onChange={(v) => updateEffect(eff.id, { y: v })}\n />\n <DraggableInput\n label=\"Blur\"\n value={eff.blur ?? 0}\n onChange={(v) => updateEffect(eff.id, { blur: Math.max(0, v) })}\n labelWidth={26}\n />\n <DraggableInput\n label=\"Sprd\"\n value={eff.spread ?? 0}\n onChange={(v) => updateEffect(eff.id, { spread: v })}\n labelWidth={28}\n />\n </FieldGrid>\n <FieldRow>\n <FieldLabel style={{ width: 40, textAlign: 'left' }}>Color</FieldLabel>\n <input\n type=\"color\"\n value={(eff.color ?? '#000000').slice(0, 7)}\n onChange={(e) => updateEffect(eff.id, { color: e.target.value + '80' })}\n style={{\n width: 24,\n height: 20,\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n }}\n />\n </FieldRow>\n </>\n )}\n {['layerBlur', 'blur'].includes(eff.type) && (\n <DraggableInput\n label=\"Radius\"\n value={eff.value ?? 0}\n onChange={(v) => updateEffect(eff.id, { value: Math.max(0, v) })}\n suffix=\"px\"\n labelWidth={40}\n />\n )}\n {['brightness', 'contrast', 'saturate'].includes(eff.type) && (\n <DraggableInput\n label=\"Amount\"\n value={eff.value ?? 100}\n onChange={(v) => updateEffect(eff.id, { value: Math.max(0, v) })}\n suffix=\"%\"\n labelWidth={40}\n />\n )}\n {['hueRotate'].includes(eff.type) && (\n <DraggableInput\n label=\"Angle\"\n value={eff.value ?? 0}\n onChange={(v) => updateEffect(eff.id, { value: v })}\n suffix=\"\u00B0\"\n labelWidth={40}\n />\n )}\n {['grayscale', 'sepia'].includes(eff.type) && (\n <DraggableInput\n label=\"Amount\"\n value={eff.value ?? 0}\n onChange={(v) => updateEffect(eff.id, { value: Math.max(0, Math.min(100, v)) })}\n suffix=\"%\"\n labelWidth={40}\n />\n )}\n </div>\n )}\n </div>\n ))}\n\n <div style={{ position: 'relative' }}>\n <select\n value=\"\"\n onChange={(e) => addEffect(e.target.value as EffectType)}\n style={{\n width: '100%',\n padding: '4px 6px',\n fontSize: 10,\n borderRadius: 4,\n background: 'var(--colors-inputBg)',\n color: 'var(--colors-textSecondary)',\n border: '1px dashed var(--colors-separator)',\n cursor: 'pointer',\n }}\n >\n <option value=\"\" disabled>\n + Add Effect\n </option>\n {Object.entries(EFFECT_NAMES).map(([val, name]) => (\n <option key={val} value={val}>\n {name}\n </option>\n ))}\n </select>\n </div>\n </div>\n )\n}\n\n// --- Arrow Section ---\nfunction ArrowSection({ shape, app }: { shape: TVShape; app: any }) {\n const arrow = shape as any\n const hasStartDec = !!arrow.decorations?.start\n const hasEndDec = arrow.decorations?.end !== undefined\n\n return (\n <div>\n <FieldRow>\n <FieldLabel style={{ width: 36 }}>Start</FieldLabel>\n <BtnGroup>\n <SmallBtn\n isActive={!hasStartDec}\n onClick={() =>\n app.updateShapes({\n id: shape.id,\n decorations: { ...arrow.decorations, start: undefined },\n })\n }\n >\n None\n </SmallBtn>\n <SmallBtn\n isActive={hasStartDec}\n onClick={() =>\n app.updateShapes({\n id: shape.id,\n decorations: { ...arrow.decorations, start: Decoration.Arrow },\n })\n }\n >\n {'\\u25C4'}\n </SmallBtn>\n </BtnGroup>\n </FieldRow>\n <FieldRow>\n <FieldLabel style={{ width: 36 }}>End</FieldLabel>\n <BtnGroup>\n <SmallBtn\n isActive={!hasEndDec}\n onClick={() =>\n app.updateShapes({\n id: shape.id,\n decorations: { ...arrow.decorations, end: undefined },\n })\n }\n >\n None\n </SmallBtn>\n <SmallBtn\n isActive={hasEndDec}\n onClick={() =>\n app.updateShapes({\n id: shape.id,\n decorations: { ...arrow.decorations, end: Decoration.Arrow },\n })\n }\n >\n {'\\u25BA'}\n </SmallBtn>\n </BtnGroup>\n </FieldRow>\n <div style={{ marginTop: 4 }}>\n <DraggableInput\n label=\"Bend\"\n value={Math.round((arrow.bend || 0) * 100)}\n onChange={(v) => app.updateShapes({ id: shape.id, bend: v / 100 })}\n min={-99}\n max={99}\n suffix=\"%\"\n labelWidth={36}\n />\n </div>\n </div>\n )\n}\n\n// --- Typography Section (Google Fonts) ---\nfunction TypographySection({ style, app }: { style: ShapeStyles; app: any }) {\n const [fontSearch, setFontSearch] = React.useState('')\n const [showDrop, setShowDrop] = React.useState(false)\n const [filtered, setFiltered] = React.useState<\n Array<{ family: string; category: string; variants: string[] }>\n >([])\n const ref = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n import('./googleFonts').then((mod) => {\n setFiltered(mod.searchGoogleFonts(fontSearch))\n })\n }, [fontSearch])\n\n const selectFont = React.useCallback(\n (font: { family: string; category: string; variants: string[] }) => {\n import('./googleFonts').then((mod) => {\n mod.loadGoogleFont(font.family, font.variants)\n // Map Google Fonts category \u2192 telva FontStyle enum\n const fontEnum =\n font.category === 'monospace'\n ? FontStyle.Mono\n : font.category === 'serif'\n ? FontStyle.Serif\n : font.category === 'handwriting'\n ? FontStyle.Script\n : FontStyle.Sans\n // Apply both font enum and exact family name in a single style command\n app.style({ font: fontEnum, fontFamily: font.family } as any)\n setFontSearch('')\n setShowDrop(false)\n })\n },\n [app]\n )\n\n React.useEffect(() => {\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setShowDrop(false)\n setFontSearch('')\n }\n }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [])\n\n const curFont =\n style.font === FontStyle.Mono\n ? 'Monospace'\n : style.font === FontStyle.Serif\n ? 'Serif'\n : style.font === FontStyle.Script\n ? 'Script'\n : 'Sans Serif'\n const displayFont = (style as any).fontFamily || curFont\n const scalePct = Math.round((style.scale ?? 1) * 100)\n\n return (\n <div>\n <FieldRow>\n <FieldLabel style={{ width: 36 }}>Font</FieldLabel>\n <div ref={ref} style={{ position: 'relative', flex: 1 }}>\n <Input\n value={fontSearch || displayFont}\n onChange={(e) => {\n setFontSearch(e.target.value)\n setShowDrop(true)\n }}\n onFocus={() => {\n setShowDrop(true)\n import('./googleFonts').then((m) => m.fetchGoogleFonts())\n }}\n placeholder=\"Search fonts...\"\n style={{ fontSize: 9 }}\n />\n {showDrop && filtered.length > 0 && (\n <Dropdown>\n {filtered.map((f) => (\n <DropItem\n key={f.family}\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault()\n selectFont(f)\n }}\n style={{ fontFamily: f.family }}\n >\n {f.family}\n </DropItem>\n ))}\n </Dropdown>\n )}\n </div>\n </FieldRow>\n <div style={{ marginTop: 4 }}>\n <DraggableInput\n label=\"Size\"\n value={scalePct}\n onChange={(v) => app.style({ scale: v / 100 })}\n min={25}\n max={300}\n suffix=\"%\"\n labelWidth={36}\n />\n </div>\n <FieldRow style={{ marginTop: 4 }}>\n <FieldLabel style={{ width: 36 }}>Align</FieldLabel>\n <BtnGroup>\n {[\n {\n val: AlignStyle.Start,\n svg: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 2H11M1 5H7M1 8H9M1 11H5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n val: AlignStyle.Middle,\n svg: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 2H11M3 5H9M2 8H10M4 11H8\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n val: AlignStyle.End,\n svg: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 2H11M5 5H11M3 8H11M7 11H11\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n val: AlignStyle.Justify,\n svg: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 2H11M1 5H11M1 8H11M1 11H11\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n ].map(({ val, svg }) => (\n <SmallBtn\n key={val}\n isActive={style.textAlign === val}\n onClick={() => app.style({ textAlign: val })}\n >\n {svg}\n </SmallBtn>\n ))}\n </BtnGroup>\n </FieldRow>\n </div>\n )\n}\n\n// --- Alignment Section (multi-select) ---\nfunction AlignmentSection({ app }: { app: any }) {\n return (\n <SectionWrap>\n <SectionTitle>Alignment</SectionTitle>\n <AlignGrid>\n {[\n {\n fn: () => app.align(AlignType.Left),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"2\" x2=\"2\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"4\" y=\"4\" width=\"7\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"4\" y=\"8\" width=\"5\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Left',\n },\n {\n fn: () => app.align(AlignType.CenterHorizontal),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"7\" y1=\"1\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"2 1\" />\n <rect x=\"3\" y=\"4\" width=\"8\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"4\" y=\"8\" width=\"6\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Center H',\n },\n {\n fn: () => app.align(AlignType.Right),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"3\" y=\"4\" width=\"7\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"5\" y=\"8\" width=\"5\" height=\"2.5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Right',\n },\n {\n fn: () => app.align(AlignType.Top),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"4\" y=\"4\" width=\"2.5\" height=\"7\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"8\" y=\"4\" width=\"2.5\" height=\"5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Top',\n },\n {\n fn: () => app.align(AlignType.CenterVertical),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"1\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"2 1\" />\n <rect x=\"4\" y=\"2\" width=\"2.5\" height=\"10\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"8\" y=\"3\" width=\"2.5\" height=\"8\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Center V',\n },\n {\n fn: () => app.align(AlignType.Bottom),\n icon: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"4\" y=\"3\" width=\"2.5\" height=\"7\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n <rect x=\"8\" y=\"5\" width=\"2.5\" height=\"5\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n ),\n t: 'Bottom',\n },\n ].map(({ fn, icon, t }, i) => (\n <SmallBtn key={i} onClick={fn} title={t}>\n {icon}\n </SmallBtn>\n ))}\n </AlignGrid>\n <SmallText style={{ display: 'block', marginTop: 8, marginBottom: 4 }}>Distribute</SmallText>\n <AlignGrid style={{ gridTemplateColumns: 'repeat(2, 1fr)' }}>\n <SmallBtn onClick={() => app.distribute(DistributeType.Horizontal)} title=\"Distribute Horizontal\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"1\" y1=\"2\" x2=\"1\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"4\" y=\"4\" width=\"6\" height=\"6\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.5\" />\n </svg>\n </SmallBtn>\n <SmallBtn onClick={() => app.distribute(DistributeType.Vertical)} title=\"Distribute Vertical\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"1\" x2=\"12\" y2=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"2\" y1=\"13\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <rect x=\"4\" y=\"4\" width=\"6\" height=\"6\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.5\" />\n </svg>\n </SmallBtn>\n </AlignGrid>\n <SmallText style={{ display: 'block', marginTop: 8, marginBottom: 4 }}>Stretch</SmallText>\n <AlignGrid style={{ gridTemplateColumns: 'repeat(2, 1fr)' }}>\n <SmallBtn onClick={() => app.stretch(StretchType.Horizontal)} title=\"Stretch Width\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"1\" y1=\"2\" x2=\"1\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"13\" y1=\"2\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"1\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"2 1\" />\n <path d=\"M3 5.5h8\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" />\n <path d=\"M3 8.5h8\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n </SmallBtn>\n <SmallBtn onClick={() => app.stretch(StretchType.Vertical)} title=\"Stretch Height\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <line x1=\"2\" y1=\"1\" x2=\"12\" y2=\"1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"2\" y1=\"13\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"7\" y1=\"1\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"2 1\" />\n <path d=\"M5.5 3v8\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" />\n <path d=\"M8.5 3v8\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" />\n </svg>\n </SmallBtn>\n </AlignGrid>\n </SectionWrap>\n )\n}\n\n// --- Export Section ---\nfunction _downloadBlob(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n// --- Node Edit Toggle ---\nfunction NodeEditSection({ shape, app }: { shape: TVShape; app: any }) {\n const isNodeEditing = app.useStore((s: TVSnapshot) => s.appState.nodeEditingId === shape.id)\n const toggleNodeEdit = React.useCallback(() => {\n if (isNodeEditing) {\n app.setNodeEditingId(undefined)\n } else {\n app.setNodeEditingId(shape.id)\n }\n }, [app, shape.id, isNodeEditing])\n\n return (\n <SectionWrap>\n <SmallBtn onClick={toggleNodeEdit} isActive={isNodeEditing} style={{ width: '100%' }}>\n {isNodeEditing ? 'Exit Edit Mode' : 'Edit Shape'}\n </SmallBtn>\n </SectionWrap>\n )\n}\n\nfunction ExportSection({ shape, app }: { shape: TVShape; app: any }) {\n const [loading, setLoading] = React.useState<string | null>(null)\n const slug = shape.type + '-' + shape.id.slice(0, 6)\n\n const handleSvg = async () => {\n setLoading('svg')\n try {\n const blob = await app.exportImage(TVExportType.SVG, { ids: [shape.id] })\n if (blob) _downloadBlob(blob, slug + '.svg')\n } catch (e) {\n console.error('SVG export failed', e)\n }\n setLoading(null)\n }\n\n const handlePng = async () => {\n setLoading('png')\n try {\n const blob = await app.exportImage(TVExportType.PNG, { ids: [shape.id] })\n if (blob) _downloadBlob(blob, slug + '.png')\n } catch (e) {\n console.error('PNG export failed', e)\n }\n setLoading(null)\n }\n\n const handleJson = () => {\n const json = JSON.stringify(shape, null, 2)\n navigator.clipboard.writeText(json).catch((_e) => {\n /* fallback: already downloading */\n })\n _downloadBlob(new Blob([json], { type: 'application/json' }), slug + '.json')\n }\n\n return (\n <div>\n <div style={{ display: 'flex', gap: 4 }}>\n <SmallBtn style={{ flex: 1 }} onClick={handleSvg} title=\"Export as SVG\">\n {loading === 'svg' ? '...' : 'SVG'}\n </SmallBtn>\n <SmallBtn style={{ flex: 1 }} onClick={handlePng} title=\"Export as PNG\">\n {loading === 'png' ? '...' : 'PNG'}\n </SmallBtn>\n <SmallBtn style={{ flex: 1 }} onClick={handleJson} title=\"Copy JSON & download\">\n JSON\n </SmallBtn>\n </div>\n </div>\n )\n}\n\n// ===================== COLLAPSIBLE =====================\nfunction CollapsibleRow({\n title,\n children,\n defaultOpen = false,\n}: {\n title: string\n children: React.ReactNode\n defaultOpen?: boolean\n}) {\n const [open, setOpen] = React.useState(defaultOpen)\n return (\n <SectionWrap>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n }}\n onClick={() => setOpen(!open)}\n >\n <SectionTitle style={{ marginBottom: 0 }}>{title}</SectionTitle>\n <IconBtn\n onClick={(e) => {\n e.stopPropagation()\n setOpen(!open)\n }}\n >\n {open ? '\\u2212' : '+'}\n </IconBtn>\n </div>\n {open && <div style={{ marginTop: 8 }}>{children}</div>}\n </SectionWrap>\n )\n}\n\n// ===================== STYLES =====================\nconst Panel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n overflowY: 'auto',\n overflowX: 'hidden',\n '&::-webkit-scrollbar': { width: '3px' },\n '&::-webkit-scrollbar-thumb': { background: '$separator', borderRadius: '2px' },\n})\n\nconst SectionWrap = styled('div', { padding: '8px 12px' })\nconst SectionTitle = styled('div', {\n fontSize: '10px',\n fontWeight: 600,\n color: '$textSecondary',\n textTransform: 'uppercase',\n letterSpacing: '0.06em',\n marginBottom: '8px',\n})\nconst Divider = styled('div', { height: '1px', background: '$separator' })\nconst Hint = styled('div', { fontSize: '10px', color: '$textSecondary', fontStyle: 'italic' })\n\nconst FieldGrid = styled('div', { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '4px' })\nconst FieldRow = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n marginBottom: '4px',\n})\nconst FieldLabel = styled('label', {\n fontSize: '9px',\n color: '$textSecondary',\n fontWeight: 500,\n width: '18px',\n flexShrink: 0,\n textAlign: 'right',\n cursor: 'ew-resize',\n userSelect: 'none',\n})\nconst _Unit = styled('span', { fontSize: '9px', color: '$textSecondary' })\n\nconst Input = styled('input', {\n width: '100%',\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: '$1',\n color: '$text',\n fontSize: '10px',\n padding: '4px 6px',\n fontFamily: '$ui',\n outline: 'none',\n transition: 'border-color 0.1s',\n '&:focus': { borderColor: '$accent' },\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': { display: 'none' },\n})\n\nconst SmallText = styled('span', { fontSize: '9px', color: '$textSecondary', fontFamily: '$mono' })\n\nconst AlignGrid = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: '3px',\n})\n\nconst BtnGroup = styled('div', { display: 'flex', gap: '2px', flex: 1 })\nconst SmallBtn = styled('button', {\n all: 'unset',\n flex: 1,\n height: '24px',\n border: '1px solid $separator',\n borderRadius: '$1',\n color: '$textSecondary',\n cursor: 'pointer',\n fontSize: '9px',\n fontFamily: '$ui',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.08s',\n '&:hover': { background: '$hover', color: '$text' },\n variants: {\n isActive: {\n true: {\n background: '$accent',\n borderColor: '$accent',\n color: 'white',\n '&:hover': { background: '$accent', color: 'white' },\n },\n },\n },\n})\n\nconst IconBtn = styled('button', {\n all: 'unset',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '$0',\n cursor: 'pointer',\n color: '$textSecondary',\n fontSize: '11px',\n '&:hover': { background: '$hover', color: '$text' },\n})\n\nconst Toggle = styled('button', {\n all: 'unset',\n width: '28px',\n height: '16px',\n borderRadius: '$pill',\n cursor: 'pointer',\n padding: '2px',\n transition: 'background 0.12s',\n background: '$inputBg',\n variants: { checked: { true: { background: '$accent' } } },\n})\n\nconst ToggleThumb = styled('div', {\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n background: 'white',\n transition: 'transform 0.12s',\n variants: { checked: { true: { transform: 'translateX(12px)' } } },\n})\n\nconst LayoutGrid = styled('div', {\n display: 'grid',\n gridTemplateColumns: '1fr auto 1fr',\n gap: '4px',\n alignItems: 'center',\n})\n\nconst LockBtn = styled('button', {\n all: 'unset',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: '$1',\n border: '1px solid $separator',\n cursor: 'pointer',\n color: '$textSecondary',\n transition: 'all 0.08s',\n flexShrink: 0,\n '&:hover': { background: '$hover', color: '$text' },\n variants: {\n locked: {\n true: {\n background: 'rgba(13,153,255,0.15)',\n borderColor: '$accent',\n color: '$accent',\n },\n },\n },\n})\n\nconst Dropdown = styled('div', {\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n maxHeight: '140px',\n overflowY: 'auto',\n background: '$panel',\n border: '1px solid $separator',\n borderRadius: '$2',\n zIndex: 1000,\n boxShadow: '0 4px 16px rgba(0,0,0,0.3)',\n marginTop: '2px',\n '&::-webkit-scrollbar': { width: '3px' },\n '&::-webkit-scrollbar-thumb': { background: '$separator', borderRadius: '2px' },\n})\n\nconst DropItem = styled('div', {\n padding: '4px 8px',\n fontSize: '10px',\n color: '$text',\n cursor: 'pointer',\n '&:hover': { background: '$hover' },\n})\n", "import { TLBounds, TLShape, Utils } from 'telva-core'\n\n/**\n * Find the bounds of a rectangular shape.\n * @param shape\n * @param boundsCache\n */\nexport function getBoundsRectangle<T extends TLShape & { size: number[] }>(\n shape: T,\n boundsCache: WeakMap<T, TLBounds>\n) {\n const bounds = Utils.getFromCache(boundsCache, shape, () => {\n const [width, height] = shape.size\n return {\n minX: 0,\n maxX: width,\n minY: 0,\n maxY: height,\n width,\n height,\n }\n })\n\n return Utils.translateBounds(bounds, shape.point)\n}\n", "import { AlignStyle } from '~types'\n\nconst ALIGN_VALUES = {\n [AlignStyle.Start]: 'left',\n [AlignStyle.Middle]: 'center',\n [AlignStyle.End]: 'right',\n [AlignStyle.Justify]: 'justify',\n} as const\n\nexport function getTextAlign(alignStyle: AlignStyle = AlignStyle.Start) {\n return ALIGN_VALUES[alignStyle]\n}\n", "import type { Easing } from '~types'\n\nexport const LETTER_SPACING = '-0.03em'\nexport const LINE_HEIGHT = 1\nexport const GRID_SIZE = 8\nexport const SVG_EXPORT_PADDING = 16\nexport const BINDING_DISTANCE = 16\nexport const CLONING_DISTANCE = 32\nexport const FIT_TO_SCREEN_PADDING = 128\nexport const SNAP_DISTANCE = 5\nexport const EMPTY_ARRAY = [] as any[]\nexport const SLOW_SPEED = 10\nexport const VERY_SLOW_SPEED = 2.5\nexport const GHOSTED_OPACITY = 0.3\nexport const DEAD_ZONE = 3\nexport const LABEL_POINT = [0.5, 0.5]\n\nexport const PI2 = Math.PI * 2\n\nexport const FILE_EXTENSION = '.tldr'\n\nexport const EASINGS: Record<Easing, (t: number) => number> = {\n linear: (t) => t,\n easeInQuad: (t) => t * t,\n easeOutQuad: (t) => t * (2 - t),\n easeInOutQuad: (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t) => t * t * t,\n easeOutCubic: (t) => --t * t * t + 1,\n easeInOutCubic: (t) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t) => t * t * t * t,\n easeOutQuart: (t) => 1 - --t * t * t * t,\n easeInOutQuart: (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),\n easeInQuint: (t) => t * t * t * t * t,\n easeOutQuint: (t) => 1 + --t * t * t * t * t,\n easeInOutQuint: (t) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),\n easeInSine: (t) => 1 - Math.cos((t * Math.PI) / 2),\n easeOutSine: (t) => Math.sin((t * Math.PI) / 2),\n easeInOutSine: (t) => -(Math.cos(Math.PI * t) - 1) / 2,\n easeInExpo: (t) => (t <= 0 ? 0 : Math.pow(2, 10 * t - 10)),\n easeOutExpo: (t) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n easeInOutExpo: (t) =>\n t <= 0\n ? 0\n : t >= 1\n ? 1\n : t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2,\n}\n\nexport const EASING_STRINGS: Record<Easing, string> = {\n linear: `(t) => t`,\n easeInQuad: `(t) => t * t`,\n easeOutQuad: `(t) => t * (2 - t)`,\n easeInOutQuad: `(t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t)`,\n easeInCubic: `(t) => t * t * t`,\n easeOutCubic: `(t) => --t * t * t + 1`,\n easeInOutCubic: `(t) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1`,\n easeInQuart: `(t) => t * t * t * t`,\n easeOutQuart: `(t) => 1 - --t * t * t * t`,\n easeInOutQuart: `(t) => t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t`,\n easeInQuint: `(t) => t * t * t * t * t`,\n easeOutQuint: `(t) => 1 + --t * t * t * t * t`,\n easeInOutQuint: `(t) => t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t`,\n easeInSine: `(t) => 1 - Math.cos((t * Math.PI) / 2)`,\n easeOutSine: `(t) => Math.sin((t * Math.PI) / 2)`,\n easeInOutSine: `(t) => -(Math.cos(Math.PI * t) - 1) / 2`,\n easeInExpo: `(t) => (t <= 0 ? 0 : Math.pow(2, 10 * t - 10))`,\n easeOutExpo: `(t) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t))`,\n easeInOutExpo: `(t) => t <= 0 ? 0 : t >= 1 ? 1 : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2`,\n}\n\nexport const USER_COLORS = [\n '#EC5E41',\n '#F2555A',\n '#F04F88',\n '#E34BA9',\n '#BD54C6',\n '#9D5BD2',\n '#7B66DC',\n '#02B1CC',\n '#11B3A3',\n '#39B178',\n '#55B467',\n '#FF802B',\n]\n\nexport const isSafari =\n typeof Window === 'undefined' ? false : /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n\nexport const isLinux = typeof Window === 'undefined' ? false : /linux/i.test(navigator.userAgent)\n\nexport const IMAGE_EXTENSIONS = ['.png', '.svg', '.jpg', '.jpeg', '.gif']\n\nexport const VIDEO_EXTENSIONS = isSafari ? [] : ['.mp4', '.webm']\n", "import { LETTER_SPACING } from '~constants'\nimport { FontStyle } from '~types'\n\nlet melm: any\n\nfunction getMeasurementDiv() {\n // A div used for measurement\n document.getElementById('__textLabelMeasure')?.remove()\n\n const pre = document.createElement('pre')\n pre.id = '__textLabelMeasure'\n\n Object.assign(pre.style, {\n whiteSpace: 'pre',\n width: 'auto',\n border: '1px solid transparent',\n padding: '4px',\n margin: '0px',\n letterSpacing: LETTER_SPACING,\n opacity: '0',\n position: 'absolute',\n top: '-500px',\n left: '0px',\n zIndex: '9999',\n pointerEvents: 'none',\n userSelect: 'none',\n '-webkit-user-select': 'none',\n alignmentBaseline: 'mathematical',\n dominantBaseline: 'mathematical',\n })\n\n pre.tabIndex = -1\n\n document.body.appendChild(pre)\n return pre\n}\n\nif (typeof window !== 'undefined') {\n melm = getMeasurementDiv()\n}\n\nlet prevText = ''\nconst prevFont = ''\nconst prevSize = [0, 0]\n\nexport function clearPrevSize() {\n prevText = ''\n}\n\nexport function getTextLabelSize(text: string, font: string, maxWidth?: number) {\n if (!text) {\n return [16, 32]\n }\n\n if (!melm) {\n // We're in SSR\n return [10, 10]\n }\n\n if (!melm.parent) document.body.appendChild(melm)\n\n melm.textContent = text\n melm.style.font = font\n\n if (maxWidth) {\n melm.style.whiteSpace = 'pre-wrap'\n melm.style.wordBreak = 'break-word'\n melm.style.width = `${maxWidth}px`\n } else {\n melm.style.whiteSpace = 'pre'\n melm.style.wordBreak = 'normal'\n melm.style.width = 'auto'\n }\n\n // In tests, offsetWidth and offsetHeight will be 0\n const width = melm.offsetWidth || 1\n const height = melm.offsetHeight || 1\n\n return [width, height]\n}\n", "import { LETTER_SPACING } from '~constants'\nimport { AlignStyle } from '~types'\n\n// https://drafts.csswg.org/css-text/#word-separator\n// split on any of these characters\nconst wordSeparator = new RegExp(\n `${[0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091]\n .map((c) => String.fromCodePoint(c))\n .join('|')}`\n)\n\nexport function getTextSvgElement(\n text: string,\n fontSize: number,\n fontFamily: string,\n textAlign: AlignStyle,\n width: number,\n wrap = false\n) {\n const fontWeight = 'normal'\n const lineHeight = 1\n const letterSpacingPct = LETTER_SPACING\n\n // Collect lines\n\n const lines = breakText({\n text,\n wrap,\n width,\n fontSize,\n fontWeight,\n fontFamily,\n fontStyle: 'normal',\n textAlign: 'left',\n letterSpacing: LETTER_SPACING,\n lineHeight: 1,\n })\n\n const textElm = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n textElm.setAttribute('font-size', fontSize + 'px')\n textElm.setAttribute('font-family', fontFamily)\n textElm.setAttribute('font-weight', fontWeight)\n textElm.setAttribute('line-height', lineHeight * fontSize + 'px')\n textElm.setAttribute('letter-spacing', letterSpacingPct)\n textElm.setAttribute('text-align', textAlign ?? 'left')\n textElm.setAttribute('dominant-baseline', 'mathematical')\n textElm.setAttribute('alignment-baseline', 'mathematical')\n\n const textLines = lines.map((line, i) => {\n const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan')\n tspan.textContent = line + '\\n'\n tspan.setAttribute('y', lineHeight * fontSize * (i + 0.5) + 'px')\n textElm.appendChild(tspan)\n return tspan\n })\n\n switch (textAlign) {\n case AlignStyle.Middle: {\n textElm.setAttribute('text-align', 'center')\n textElm.setAttribute('text-anchor', 'middle')\n textLines.forEach((textElm) => textElm.setAttribute('x', width / 2 + ''))\n break\n }\n case AlignStyle.End: {\n textElm.setAttribute('text-align', 'right')\n textElm.setAttribute('text-anchor', 'end')\n textLines.forEach((textElm) => textElm.setAttribute('x', -4 + width + ''))\n break\n }\n default: {\n textElm.setAttribute('text-align', 'left')\n textElm.setAttribute('text-anchor', 'start')\n textLines.forEach((textElm) => textElm.setAttribute('x', 4 + ''))\n }\n }\n\n return textElm\n}\n\nfunction breakText(opts: {\n text: string\n wrap: boolean\n width: number\n fontSize: number\n fontWeight: string\n fontFamily: string\n fontStyle: string\n lineHeight: number\n letterSpacing: string\n textAlign: string\n}): string[] {\n const textElm = document.createElement('div')\n textElm.style.setProperty('position', 'absolute')\n textElm.style.setProperty('top', '-9999px')\n textElm.style.setProperty('left', '-9999px')\n textElm.style.setProperty('width', opts.width + 'px')\n textElm.style.setProperty('height', 'min-content')\n textElm.style.setProperty('font-size', opts.fontSize + 'px')\n textElm.style.setProperty('font-family', opts.fontFamily)\n textElm.style.setProperty('font-weight', opts.fontWeight)\n textElm.style.setProperty('line-height', opts.lineHeight * opts.fontSize + 'px')\n textElm.style.setProperty('letter-spacing', opts.letterSpacing)\n textElm.style.setProperty('text-align', opts.textAlign)\n document.body.appendChild(textElm)\n\n // Collect lines\n\n // Split the text into words\n const words = opts.text\n .split(wordSeparator)\n .flatMap((word) => word.replace('\\n', ' \\n'))\n .join(' ')\n .split(' ')\n\n // Iterate through the words looking for either line breaks, or\n // when the measured line exceeds the width of the container (minus\n // its padding); at either point, create a new line.\n\n textElm.innerText = words[0]\n let prevHeight = textElm.offsetHeight\n\n let currentLine = [words[0]]\n const lines: string[][] = [currentLine]\n\n for (let i = 1; i < words.length; i++) {\n const word = words[i]\n textElm.innerText += ' ' + word\n const newHeight = textElm.offsetHeight\n if (newHeight > prevHeight) {\n prevHeight = newHeight\n currentLine = []\n lines.push(currentLine)\n }\n\n // Push the current word to the current line\n currentLine.push(word)\n }\n\n textElm.remove()\n\n return lines.map((line) => line.join(' '))\n}\n", "import * as React from 'react'\nimport type { TLBounds } from 'telva-core'\n\ninterface WithLabelMaskProps {\n id: string\n bounds: TLBounds\n labelSize: number[]\n offset?: number[]\n scale?: number\n}\n\nexport function LabelMask({ id, bounds, labelSize, offset, scale = 1 }: WithLabelMaskProps) {\n return (\n <defs>\n <mask id={id + '_clip'}>\n <rect\n x={-100}\n y={-100}\n width={bounds.width + 200}\n height={bounds.height + 200}\n fill=\"white\"\n />\n <rect\n x={bounds.width / 2 - (labelSize[0] / 2) * scale + (offset?.[0] || 0)}\n y={bounds.height / 2 - (labelSize[1] / 2) * scale + (offset?.[1] || 0)}\n width={labelSize[0] * scale}\n height={labelSize[1] * scale}\n rx={4 * scale}\n ry={4 * scale}\n fill=\"black\"\n opacity={Math.max(scale, 0.8)}\n />\n </mask>\n </defs>\n )\n}\n", "import { intersectLineLine } from 'telva-intersect'\nimport { Vec } from 'telva-vec'\n\nconst PI2 = Math.PI * 2\n\ntype Vert = number[]\ntype Edge = Vert[]\ntype Polygon = Vert[]\n\nexport class PolygonUtils {\n static inwardEdgeNormal(edge: Edge) {\n // Assuming that polygon vertices are in clockwise order\n const delta = Vec.sub(edge[1], edge[0])\n const len = Vec.len2(delta)\n return [-delta[0] / len, delta[1] / len]\n }\n\n static outwardEdgeNormal(edge: Edge) {\n return Vec.neg(PolygonUtils.inwardEdgeNormal(edge))\n }\n\n // If the slope of line v1,v2 greater than the slope of v1,p then p is on the left side of v1,v2 and the return value is > 0.\n // If p is colinear with v1,v2 then return 0, otherwise return a value < 0.\n\n static leftSide = Vec.isLeft\n\n static isReflexVertex(polygon: Polygon, index: number) {\n const len = polygon.length\n // Assuming that polygon vertices are in clockwise order\n const v0 = polygon[(index + len - 1) % len]\n const v1 = polygon[index]\n const v2 = polygon[(index + 1) % len]\n if (PolygonUtils.leftSide(v0, v2, v1) < 0) return true\n return false\n }\n\n static getEdges(vertices: Vert[]) {\n return vertices.map((vert, i) => [vert, vertices[(i + 1) % vertices.length]])\n }\n\n // based on http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/, A => \"line a\", B => \"line b\"\n static edgesIntersection([A1, A2]: number[][], [B1, B2]: number[][]) {\n const den = (B2[1] - B1[1]) * (A2[0] - A1[0]) - (B2[0] - B1[0]) * (A2[1] - A1[1])\n\n if (den == 0) return null // lines are parallel or conincident\n\n const ua = ((B2[0] - B1[0]) * (A1[1] - B1[1]) - (B2[1] - B1[1]) * (A1[0] - B1[0])) / den\n\n const ub = ((A2[0] - A1[0]) * (A1[1] - B1[1]) - (A2[1] - A1[1]) * (A1[0] - B1[0])) / den\n\n if (ua < 0 || ub < 0 || ua > 1 || ub > 1) return null\n\n return [A1[0] + ua * (A2[0] - A1[0]), A1[1] + ua * (A2[1] - A1[1])]\n }\n\n static appendArc(\n polygon: number[][],\n center: number[],\n radius: number,\n startVertex: number[],\n endVertex: number[],\n isPaddingBoundary = false\n ) {\n const vertices = [...polygon]\n let startAngle = Math.atan2(startVertex[1] - center[1], startVertex[0] - center[0])\n let endAngle = Math.atan2(endVertex[1] - center[1], endVertex[0] - center[0])\n if (startAngle < 0) startAngle += PI2\n if (endAngle < 0) endAngle += PI2\n const arcSegmentCount = 5 // An odd number so that one arc vertex will be eactly arcRadius from center.\n const angle = startAngle > endAngle ? startAngle - endAngle : startAngle + PI2 - endAngle\n const angle5 = (isPaddingBoundary ? -angle : PI2 - angle) / arcSegmentCount\n\n vertices.push(startVertex)\n for (let i = 1; i < arcSegmentCount; ++i) {\n const angle = startAngle + angle5 * i\n vertices.push([center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius])\n }\n vertices.push(endVertex)\n\n return vertices\n }\n\n static createOffsetEdge(edge: Edge, offset: number[]) {\n return edge.map((vert) => Vec.add(vert, offset))\n }\n\n static getOffsetPolygon(polygon: Polygon, offset = 0) {\n const edges = PolygonUtils.getEdges(polygon)\n\n const offsetEdges = edges.map((edge) =>\n PolygonUtils.createOffsetEdge(edge, Vec.mul(PolygonUtils.outwardEdgeNormal(edge), offset))\n )\n\n const vertices = []\n\n for (let i = 0; i < offsetEdges.length; i++) {\n const thisEdge = offsetEdges[i]\n const prevEdge = offsetEdges[(i + offsetEdges.length - 1) % offsetEdges.length]\n const vertex = PolygonUtils.edgesIntersection(prevEdge, thisEdge)\n if (vertex) vertices.push(vertex)\n else {\n PolygonUtils.appendArc(vertices, edges[i][0], offset, prevEdge[1], thisEdge[0], false)\n }\n }\n\n // var marginPolygon = PolygonUtils.createPolygon(vertices)\n // marginPolygon.offsetEdges = offsetEdges\n return vertices\n }\n\n static createPaddingPolygon(polygon: number[][][], shapePadding = 0) {\n const offsetEdges = polygon.map((edge) =>\n PolygonUtils.createOffsetEdge(edge, PolygonUtils.inwardEdgeNormal(edge))\n )\n\n const vertices = []\n for (let i = 0; i < offsetEdges.length; i++) {\n const thisEdge = offsetEdges[i]\n const prevEdge = offsetEdges[(i + offsetEdges.length - 1) % offsetEdges.length]\n const vertex = PolygonUtils.edgesIntersection(prevEdge, thisEdge)\n if (vertex) vertices.push(vertex)\n else {\n PolygonUtils.appendArc(\n vertices,\n polygon[i][0],\n shapePadding,\n prevEdge[1],\n thisEdge[0],\n true\n )\n }\n }\n\n return vertices\n }\n}\n\nexport function getOffsetPolygon(points: number[][], offset: number) {\n if (points.length < 3) throw Error('Polygon must have at least 3 points')\n const len = points.length\n return points\n .map((point, i) => [point, points[(i + 1) % len]])\n .map(([A, B]) => {\n const offsetVector = Vec.mul(Vec.per(Vec.uni(Vec.sub(B, A))), offset)\n return [Vec.add(A, offsetVector), Vec.add(B, offsetVector)]\n })\n .map((edge, i, edges) => {\n const intersection = intersectLineLine(edge, edges[(i + 1) % edges.length])\n if (intersection === undefined) throw Error('Expected an intersection')\n return intersection\n })\n}\n", "import { Utils } from 'telva-core'\nimport { AlignStyle, ColorStyle, DashStyle, FontStyle, ShapeStyles, SizeStyle, Theme } from '~types'\n\nconst canvasLight = '#fafafa'\n\nconst canvasDark = '#343d45'\n\nconst colors = {\n [ColorStyle.White]: '#f0f1f3',\n [ColorStyle.LightGray]: '#c6cbd1',\n [ColorStyle.Gray]: '#788492',\n [ColorStyle.Black]: '#1d1d1d',\n [ColorStyle.Green]: '#36b24d',\n [ColorStyle.Cyan]: '#0e98ad',\n [ColorStyle.Blue]: '#1c7ed6',\n [ColorStyle.Indigo]: '#4263eb',\n [ColorStyle.Violet]: '#7746f1',\n [ColorStyle.Red]: '#ff2133',\n [ColorStyle.Orange]: '#ff9433',\n [ColorStyle.Yellow]: '#ffc936',\n}\n\nexport const stickyFills: Record<Theme, Record<ColorStyle, string>> = {\n light: {\n ...(Object.fromEntries(\n Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasLight, 0.45)])\n ) as Record<ColorStyle, string>),\n [ColorStyle.White]: '#ffffff',\n [ColorStyle.Black]: '#3d3d3d',\n },\n dark: {\n ...(Object.fromEntries(\n Object.entries(colors).map(([k, v]) => [\n k,\n Utils.lerpColor(Utils.lerpColor(v, '#999999', 0.3), canvasDark, 0.4),\n ])\n ) as Record<ColorStyle, string>),\n [ColorStyle.White]: '#1d1d1d',\n [ColorStyle.Black]: '#bbbbbb',\n },\n}\n\nexport const strokes: Record<Theme, Record<ColorStyle, string>> = {\n light: {\n ...colors,\n [ColorStyle.White]: '#1d1d1d',\n },\n dark: {\n ...(Object.fromEntries(\n Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasDark, 0.1)])\n ) as Record<ColorStyle, string>),\n [ColorStyle.White]: '#cecece',\n [ColorStyle.Black]: '#cecece',\n },\n}\n\nexport const fills: Record<Theme, Record<ColorStyle, string>> = {\n light: {\n ...(Object.fromEntries(\n Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasLight, 0.82)])\n ) as Record<ColorStyle, string>),\n [ColorStyle.White]: '#fefefe',\n },\n dark: {\n ...(Object.fromEntries(\n Object.entries(colors).map(([k, v]) => [k, Utils.lerpColor(v, canvasDark, 0.82)])\n ) as Record<ColorStyle, string>),\n [ColorStyle.White]: 'rgb(30,33,37)',\n [ColorStyle.Black]: '#1e1e1f',\n },\n}\n\nconst strokeWidths = {\n [SizeStyle.Small]: 2,\n [SizeStyle.Medium]: 3.5,\n [SizeStyle.Large]: 5,\n}\n\nconst fontSizes = {\n [SizeStyle.Small]: 28,\n [SizeStyle.Medium]: 48,\n [SizeStyle.Large]: 96,\n auto: 'auto',\n}\n\nconst fontFaces = {\n [FontStyle.Script]: '\"Caveat Brush\"',\n [FontStyle.Sans]: '\"Source Sans Pro\"',\n [FontStyle.Serif]: '\"Crimson Pro\"',\n [FontStyle.Mono]: '\"Source Code Pro\"',\n}\n\nconst fontSizeModifiers = {\n [FontStyle.Script]: 1,\n [FontStyle.Sans]: 1,\n [FontStyle.Serif]: 1,\n [FontStyle.Mono]: 1,\n}\n\nconst stickyFontSizes = {\n [SizeStyle.Small]: 24,\n [SizeStyle.Medium]: 36,\n [SizeStyle.Large]: 48,\n auto: 'auto',\n}\n\nexport function getStrokeWidth(size: SizeStyle): number {\n return strokeWidths[size]\n}\n\nexport function getFontSize(size: SizeStyle, fontStyle: FontStyle = FontStyle.Script): number {\n return fontSizes[size] * fontSizeModifiers[fontStyle]\n}\n\nexport function getFontFace(font: FontStyle = FontStyle.Script, fontFamily?: string): string {\n if (fontFamily) return `\"${fontFamily}\"`\n return fontFaces[font]\n}\n\nexport function getStickyFontSize(size: SizeStyle): number {\n return stickyFontSizes[size]\n}\n\nexport function getFontStyle(style: ShapeStyles): string {\n const fontSize = getFontSize(style.size, style.font)\n const fontFace = getFontFace(style.font, style.fontFamily)\n const { scale = 1 } = style\n\n return `${fontSize * scale}px/1 ${fontFace}`\n}\n\nexport function getStickyFontStyle(style: ShapeStyles): string {\n const fontSize = getStickyFontSize(style.size)\n const fontFace = getFontFace(style.font, style.fontFamily)\n const { scale = 1 } = style\n\n return `${fontSize * scale}px/1 ${fontFace}`\n}\n\nexport function getStickyShapeStyle(style: ShapeStyles, isDarkMode = false) {\n const { color } = style\n\n const theme: Theme = isDarkMode ? 'dark' : 'light'\n const adjustedColor =\n color === ColorStyle.White || color === ColorStyle.Black ? ColorStyle.Yellow : color\n\n return {\n fill: style.fillHex ?? stickyFills[theme][adjustedColor],\n stroke: style.strokeHex ?? null,\n color: isDarkMode ? '#1d1d1d' : '#0d0d0d',\n }\n}\n\nexport function getShapeStyle(\n style: ShapeStyles,\n isDarkMode?: boolean\n): {\n stroke: string\n fill: string\n strokeWidth: number\n opacity: number\n} {\n const { color, size, isFilled } = style\n\n const strokeWidth = style.strokeWidthOverride ?? getStrokeWidth(size)\n\n const theme: Theme = isDarkMode ? 'dark' : 'light'\n\n return {\n stroke: style.strokeHex ?? strokes[theme][color],\n fill: isFilled ? style.fillHex ?? fills[theme][color] : 'none',\n strokeWidth,\n opacity: style.opacity ?? 1,\n }\n}\n\nexport const defaultStyle: ShapeStyles = {\n color: ColorStyle.Black,\n size: SizeStyle.Small,\n isFilled: false,\n dash: DashStyle.Draw,\n scale: 1,\n}\n\nexport const defaultTextStyle: ShapeStyles = {\n ...defaultStyle,\n font: FontStyle.Script,\n textAlign: AlignStyle.Middle,\n}\n", "// Adapted (mostly copied) the work of https://github.com/fregante\n// Copyright (c) Federico Brigante <opensource@bfred.it> (bfred.it)\n\ntype ReplacerCallback = (substring: string, ...args: unknown[]) => string\n\nconst INDENT = ' '\n\nexport class TextAreaUtils {\n static insertTextFirefox(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n // Found on https://www.everythingfrontend.com/posts/insert-text-into-textarea-at-cursor-position.html \uD83C\uDF88\n field.setRangeText(\n text,\n field.selectionStart || 0,\n field.selectionEnd || 0,\n 'end' // Without this, the cursor is either at the beginning or `text` remains selected\n )\n\n field.dispatchEvent(\n new InputEvent('input', {\n data: text,\n inputType: 'insertText',\n isComposing: false, // TODO: fix @types/jsdom, this shouldn't be required\n })\n )\n }\n\n /** Inserts `text` at the cursor\u2019s position, replacing any selection, with **undo** support and by firing the `input` event. */\n static insert(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n const document = field.ownerDocument\n const initialFocus = document.activeElement\n if (initialFocus !== field) {\n field.focus()\n }\n\n if (!document.execCommand('insertText', false, text)) {\n TextAreaUtils.insertTextFirefox(field, text)\n }\n\n if (initialFocus === document.body) {\n field.blur()\n } else if (initialFocus instanceof HTMLElement && initialFocus !== field) {\n initialFocus.focus()\n }\n }\n\n /** Replaces the entire content, equivalent to `field.value = text` but with **undo** support and by firing the `input` event. */\n static set(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n field.select()\n TextAreaUtils.insert(field, text)\n }\n\n /** Get the selected text in a field or an empty string if nothing is selected. */\n static getSelection(field: HTMLTextAreaElement | HTMLInputElement): string {\n const { selectionStart, selectionEnd } = field\n return field.value.slice(\n selectionStart ? selectionStart : undefined,\n selectionEnd ? selectionEnd : undefined\n )\n }\n\n /** Adds the `wrappingText` before and after field\u2019s selection (or cursor). If `endWrappingText` is provided, it will be used instead of `wrappingText` at on the right. */\n static wrapSelection(\n field: HTMLTextAreaElement | HTMLInputElement,\n wrap: string,\n wrapEnd?: string\n ): void {\n const { selectionStart, selectionEnd } = field\n const selection = TextAreaUtils.getSelection(field)\n TextAreaUtils.insert(field, wrap + selection + (wrapEnd ?? wrap))\n\n // Restore the selection around the previously-selected text\n field.selectionStart = (selectionStart || 0) + wrap.length\n field.selectionEnd = (selectionEnd || 0) + wrap.length\n }\n\n /** Finds and replaces strings and regex in the field\u2019s value, like `field.value = field.value.replace()` but better */\n static replace(\n field: HTMLTextAreaElement | HTMLInputElement,\n searchValue: string | RegExp,\n replacer: string | ReplacerCallback\n ): void {\n /** Remembers how much each match offset should be adjusted */\n let drift = 0\n\n field.value.replace(searchValue, (...args): string => {\n // Select current match to replace it later\n const matchStart = drift + (args[args.length - 2] as number)\n const matchLength = args[0].length\n field.selectionStart = matchStart\n field.selectionEnd = matchStart + matchLength\n\n const replacement = typeof replacer === 'string' ? replacer : replacer(...args)\n TextAreaUtils.insert(field, replacement)\n\n // Select replacement. Without this, the cursor would be after the replacement\n field.selectionStart = matchStart\n drift += replacement.length - matchLength\n return replacement\n })\n }\n\n static findLineEnd(value: string, currentEnd: number): number {\n // Go to the beginning of the last line\n const lastLineStart = value.lastIndexOf('\\n', currentEnd - 1) + 1\n\n // There's nothing to unindent after the last cursor, so leave it as is\n if (value.charAt(lastLineStart) !== '\\t') {\n return currentEnd\n }\n\n return lastLineStart + 1 // Include the first character, which will be a tab\n }\n\n static indent(element: HTMLTextAreaElement): void {\n const { selectionStart, selectionEnd, value } = element\n const selectedContrast = value.slice(selectionStart, selectionEnd)\n // The first line should be indented, even if it starts with `\\n`\n // The last line should only be indented if includes any character after `\\n`\n const lineBreakCount = /\\n/g.exec(selectedContrast)?.length\n\n if (lineBreakCount && lineBreakCount > 0) {\n // Select full first line to replace everything at once\n const firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\n const newSelection = element.value.slice(firstLineStart, selectionEnd - 1)\n const indentedText = newSelection.replace(\n /^|\\n/g, // Match all line starts\n `$&${INDENT}`\n )\n const replacementsCount = indentedText.length - newSelection.length\n\n // Replace newSelection with indentedText\n element.setSelectionRange(firstLineStart, selectionEnd - 1)\n TextAreaUtils.insert(element, indentedText)\n\n // Restore selection position, including the indentation\n element.setSelectionRange(selectionStart + 1, selectionEnd + replacementsCount)\n } else {\n TextAreaUtils.insert(element, INDENT)\n }\n }\n\n // The first line should always be unindented\n // The last line should only be unindented if the selection includes any characters after `\\n`\n static unindent(element: HTMLTextAreaElement): void {\n const { selectionStart, selectionEnd, value } = element\n\n // Select the whole first line because it might contain \\t\n const firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n const minimumSelectionEnd = TextAreaUtils.findLineEnd(value, selectionEnd)\n\n const newSelection = element.value.slice(firstLineStart, minimumSelectionEnd)\n const indentedText = newSelection.replace(/(^|\\n)(\\t| {1,2})/g, '$1')\n const replacementsCount = newSelection.length - indentedText.length\n\n // Replace newSelection with indentedText\n element.setSelectionRange(firstLineStart, minimumSelectionEnd)\n TextAreaUtils.insert(element, indentedText)\n\n // Restore selection position, including the indentation\n const firstLineIndentation = /\\t| {1,2}/.exec(value.slice(firstLineStart, selectionStart))\n\n const difference = firstLineIndentation ? firstLineIndentation[0].length : 0\n\n const newSelectionStart = selectionStart - difference\n element.setSelectionRange(\n selectionStart - difference,\n Math.max(newSelectionStart, selectionEnd - replacementsCount)\n )\n }\n}\n", "import * as React from 'react'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport { styled } from '~styles'\nimport { buildCssGradient, GradientData } from '~types'\nimport { TextAreaUtils } from './TextAreaUtils'\nimport { getTextLabelSize } from './getTextSize'\n\nexport interface TextLabelProps {\n font: string\n text: string\n color: string\n background?: string\n textGradient?: GradientData\n onBlur?: () => void\n onChange: (text: string) => void\n offsetY?: number\n offsetX?: number\n scale?: number\n isEditing?: boolean\n width?: number\n}\n\nexport const TextLabel = React.memo(function TextLabel({\n font,\n text,\n color,\n background,\n textGradient,\n offsetX = 0,\n offsetY = 0,\n scale = 1,\n isEditing = false,\n width,\n onBlur,\n onChange,\n}: TextLabelProps) {\n const rInput = React.useRef<HTMLTextAreaElement>(null)\n const rIsMounted = React.useRef(false)\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(TVDR.normalizeText(e.currentTarget.value))\n },\n [onChange]\n )\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n onBlur?.()\n return\n }\n\n if (e.key === 'Tab' && text.length === 0) {\n e.preventDefault()\n return\n }\n\n if (!(e.key === 'Meta' || e.metaKey)) {\n e.stopPropagation()\n } else if (e.key === 'z' && e.metaKey) {\n if (e.shiftKey) {\n document.execCommand('redo', false)\n } else {\n document.execCommand('undo', false)\n }\n e.stopPropagation()\n e.preventDefault()\n return\n }\n\n if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n e.preventDefault()\n }\n\n if (e.key === 'Tab') {\n e.preventDefault()\n if (e.shiftKey) {\n TextAreaUtils.unindent(e.currentTarget)\n } else {\n TextAreaUtils.indent(e.currentTarget)\n }\n\n onChange?.(TVDR.normalizeText(e.currentTarget.value))\n }\n },\n [onChange]\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n e.currentTarget.setSelectionRange(0, 0)\n onBlur?.()\n },\n [onBlur]\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!isEditing) return\n if (!rIsMounted.current) return\n\n if (document.activeElement === e.currentTarget) {\n e.currentTarget.select()\n }\n },\n [isEditing]\n )\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLTextAreaElement | HTMLDivElement>) => {\n if (isEditing) {\n e.stopPropagation()\n }\n },\n [isEditing]\n )\n\n const rWasEditing = React.useRef(isEditing)\n\n React.useEffect(() => {\n if (isEditing) {\n rWasEditing.current = true\n requestAnimationFrame(() => {\n rIsMounted.current = true\n const elm = rInput.current\n if (elm) {\n elm.focus()\n elm.select()\n }\n })\n } else if (rWasEditing.current) {\n onBlur?.()\n rWasEditing.current = false\n }\n }, [isEditing, onBlur])\n\n const rInnerWrapper = React.useRef<HTMLDivElement>(null)\n\n React.useLayoutEffect(() => {\n const elm = rInnerWrapper.current\n if (!elm) return\n const size = getTextLabelSize(text, font, width)\n elm.style.transform = `scale(${scale}, ${scale}) translate(${offsetX}px, ${offsetY}px)`\n elm.style.width = width ? `${width}px` : size[0] + 1 + 'px'\n elm.style.height = size[1] + 1 + 'px'\n }, [text, font, offsetY, offsetX, scale, width])\n\n return (\n <TextWrapper>\n <InnerWrapper\n ref={rInnerWrapper}\n hasText={!!text}\n isEditing={isEditing}\n style={{\n font,\n color: (textGradient && !isEditing) ? 'transparent' : color,\n backgroundColor: background && background !== 'transparent' ? background : undefined,\n borderRadius: background && background !== 'transparent' ? 2 : undefined,\n padding: background && background !== 'transparent' ? '4px 6px' : undefined,\n ...(textGradient && !isEditing ? {\n background: buildCssGradient(textGradient),\n WebkitBackgroundClip: 'text',\n backgroundClip: 'text',\n } : {}),\n }}\n >\n {isEditing ? (\n <TextArea\n ref={rInput}\n style={{\n font,\n color,\n }}\n name=\"text\"\n tabIndex={-1}\n autoComplete=\"false\"\n autoCapitalize=\"false\"\n autoCorrect=\"false\"\n autoSave=\"false\"\n autoFocus\n placeholder=\"\"\n spellCheck=\"true\"\n wrap=\"off\"\n dir=\"auto\"\n datatype=\"wysiwyg\"\n defaultValue={text}\n color={color}\n onFocus={handleFocus}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onPointerDown={handlePointerDown}\n onContextMenu={stopPropagation}\n onCopy={stopPropagation}\n onPaste={stopPropagation}\n onCut={stopPropagation}\n />\n ) : (\n text\n )}\n &#8203;\n </InnerWrapper>\n </TextWrapper>\n )\n})\n\nconst TextWrapper = styled('div', {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n userSelect: 'none',\n variants: {\n isGhost: {\n false: { opacity: 1 },\n true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n },\n },\n})\n\nconst commonTextWrapping = {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n letterSpacing: LETTER_SPACING,\n}\n\nconst InnerWrapper = styled('div', {\n position: 'absolute',\n padding: '4px',\n zIndex: 1,\n minHeight: 1,\n minWidth: 1,\n lineHeight: 1,\n outline: 0,\n fontWeight: '500',\n textAlign: 'center',\n backfaceVisibility: 'hidden',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n variants: {\n hasText: {\n false: {\n pointerEvents: 'none',\n },\n true: {\n pointerEvents: 'all',\n },\n },\n isEditing: {\n false: {\n userSelect: 'none',\n },\n true: {\n background: '$boundsBg',\n userSelect: 'text',\n WebkitUserSelect: 'text',\n },\n },\n },\n ...commonTextWrapping,\n})\n\nconst TextArea = styled('textarea', {\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n width: '100%',\n height: '100%',\n border: 'none',\n padding: '4px',\n resize: 'none',\n textAlign: 'inherit',\n minHeight: 'inherit',\n minWidth: 'inherit',\n lineHeight: 'inherit',\n outline: 0,\n fontWeight: 'inherit',\n overflow: 'hidden',\n backfaceVisibility: 'hidden',\n display: 'inline-block',\n pointerEvents: 'all',\n background: '$boundsBg',\n userSelect: 'text',\n WebkitUserSelect: 'text',\n fontSmooth: 'always',\n WebkitFontSmoothing: 'subpixel-antialiased',\n MozOsxFontSmoothing: 'auto',\n ...commonTextWrapping,\n '&:focus': {\n outline: 'none',\n border: 'none',\n },\n})\n", "import type React from 'react'\n\nexport const stopPropagation = (e: KeyboardEvent | React.SyntheticEvent<any, Event>) =>\n e.stopPropagation()\n", "import { TLBounds, TLPageState, TLTransformInfo, Utils } from 'telva-core'\nimport { intersectRayBounds, intersectRayEllipse, intersectRayLineSegment } from 'telva-intersect'\nimport { Vec } from 'telva-vec'\nimport { BINDING_DISTANCE } from '~constants'\nimport {\n ArrowShape,\n ShapesWithProp,\n TVBinding,\n TVExportType,\n TVHandle,\n TVPage,\n TVShape,\n TVShapeType,\n TVSnapshot,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\nimport { deepCopy } from './StateManager/copy'\nimport { getShapeUtil } from './shapes'\nimport type { TVShapeUtil } from './shapes/TVShapeUtil'\nimport { getTrianglePoints } from './shapes/TriangleUtil/triangleHelpers'\n\nconst isDev = process.env.NODE_ENV === 'development'\nexport class TVDR {\n static getShapeUtil<T extends TVShape>(type: T['type']): TVShapeUtil<T>\n static getShapeUtil<T extends TVShape>(shape: T): TVShapeUtil<T>\n static getShapeUtil<T extends TVShape>(shape: T | T['type']) {\n return getShapeUtil<T>(shape)\n }\n\n static getSelectedShapes(data: TVSnapshot, pageId: string) {\n const page = TVDR.getPage(data, pageId)\n const selectedIds = TVDR.getSelectedIds(data, pageId)\n return selectedIds.map((id) => page.shapes[id])\n }\n\n static screenToWorld(data: TVSnapshot, point: number[]) {\n const camera = TVDR.getPageState(data, data.appState.currentPageId).camera\n return Vec.sub(Vec.div(point, camera.zoom), camera.point)\n }\n\n static getCameraZoom(zoom: number) {\n return Utils.clamp(zoom, 0.1, 5)\n }\n\n static getPage(data: TVSnapshot, pageId: string): TVPage {\n return data.document.pages[pageId]\n }\n\n static getPageState(data: TVSnapshot, pageId: string): TLPageState {\n return data.document.pageStates[pageId]\n }\n\n static getSelectedIds(data: TVSnapshot, pageId: string): string[] {\n return TVDR.getPageState(data, pageId).selectedIds\n }\n\n static getShapes(data: TVSnapshot, pageId: string): TVShape[] {\n return Object.values(TVDR.getPage(data, pageId).shapes)\n }\n\n static getCamera(data: TVSnapshot, pageId: string): TLPageState['camera'] {\n return TVDR.getPageState(data, pageId).camera\n }\n\n static getShape<T extends TVShape = TVShape>(\n data: TVSnapshot,\n shapeId: string,\n pageId: string\n ): T {\n return TVDR.getPage(data, pageId).shapes[shapeId] as T\n }\n\n static getCenter<T extends TVShape>(shape: T) {\n return TVDR.getShapeUtil(shape).getCenter(shape)\n }\n\n static getBounds<T extends TVShape>(shape: T) {\n return TVDR.getShapeUtil(shape).getBounds(shape)\n }\n\n static getRotatedBounds<T extends TVShape>(shape: T) {\n return TVDR.getShapeUtil(shape).getRotatedBounds(shape)\n }\n\n static getSelectedBounds(data: TVSnapshot): TLBounds {\n return Utils.getCommonBounds(\n TVDR.getSelectedShapes(data, data.appState.currentPageId).map((shape) =>\n TVDR.getShapeUtil(shape).getBounds(shape)\n )\n )\n }\n\n static getParentId(data: TVSnapshot, id: string, pageId: string) {\n return TVDR.getShape(data, id, pageId).parentId\n }\n\n // static getPointedId(data: TVSnapshot, id: string, pageId: string): string {\n // const page = TVDR.getPage(data, pageId)\n // const pageState = TVDR.getPageState(data, data.appState.currentPageId)\n // const shape = TVDR.getShape(data, id, pageId)\n // if (!shape) return id\n\n // return shape.parentId === pageState.currentParentId || shape.parentId === page.id\n // ? id\n // : TVDR.getPointedId(data, shape.parentId, pageId)\n // }\n\n // static getDrilledPointedId(data: TVSnapshot, id: string, pageId: string): string {\n // const shape = TVDR.getShape(data, id, pageId)\n // const { currentPageId } = data.appState\n // const { currentParentId, pointedId } = TVDR.getPageState(data, data.appState.currentPageId)\n\n // return shape.parentId === currentPageId ||\n // shape.parentId === pointedId ||\n // shape.parentId === currentParentId\n // ? id\n // : TVDR.getDrilledPointedId(data, shape.parentId, pageId)\n // }\n\n // static getTopParentId(data: TVSnapshot, id: string, pageId: string): string {\n // const page = TVDR.getPage(data, pageId)\n // const pageState = TVDR.getPageState(data, pageId)\n // const shape = TVDR.getShape(data, id, pageId)\n\n // if (shape.parentId === shape.id) {\n // throw Error(`Shape has the same id as its parent! ${shape.id}`)\n // }\n\n // return shape.parentId === page.id || shape.parentId === pageState.currentParentId\n // ? id\n // : TVDR.getTopParentId(data, shape.parentId, pageId)\n // }\n\n // Get an array of a shape id and its descendant shapes' ids\n static getDocumentBranch(data: TVSnapshot, id: string, pageId: string): string[] {\n const shape = TVDR.getShape(data, id, pageId)\n\n if (shape.children === undefined) return [id]\n\n return [\n id,\n ...shape.children.flatMap((childId) => TVDR.getDocumentBranch(data, childId, pageId)),\n ]\n }\n\n // Get a deep array of unproxied shapes and their descendants\n static getSelectedBranchSnapshot<K>(\n data: TVSnapshot,\n pageId: string,\n fn: (shape: TVShape) => K\n ): ({ id: string } & K)[]\n static getSelectedBranchSnapshot(data: TVSnapshot, pageId: string): TVShape[]\n static getSelectedBranchSnapshot<K>(\n data: TVSnapshot,\n pageId: string,\n fn?: (shape: TVShape) => K\n ): (TVShape | K)[] {\n const page = TVDR.getPage(data, pageId)\n\n const copies = TVDR.getSelectedIds(data, pageId)\n .flatMap((id) => TVDR.getDocumentBranch(data, id, pageId).map((id) => page.shapes[id]))\n .filter((shape) => !shape.isLocked)\n .map(Utils.deepClone)\n\n if (fn !== undefined) {\n return copies.map((shape) => ({ id: shape.id, ...fn(shape) }))\n }\n\n return copies\n }\n\n // Get a shallow array of unproxied shapes\n static getSelectedShapeSnapshot(data: TVSnapshot, pageId: string): TVShape[]\n static getSelectedShapeSnapshot<K>(\n data: TVSnapshot,\n pageId: string,\n fn?: (shape: TVShape) => K\n ): ({ id: string } & K)[]\n static getSelectedShapeSnapshot<K>(\n data: TVSnapshot,\n pageId: string,\n fn?: (shape: TVShape) => K\n ): (TVShape | K)[] {\n const copies = TVDR.getSelectedShapes(data, pageId)\n .filter((shape) => !shape.isLocked)\n .map(Utils.deepClone)\n\n if (fn !== undefined) {\n return copies.map((shape) => ({ id: shape.id, ...fn(shape) }))\n }\n\n return copies\n }\n\n // For a given array of shape ids, an array of all other shapes that may be affected by a mutation to it.\n // Use this to decide which shapes to clone as before / after for a command.\n static getAllEffectedShapeIds(data: TVSnapshot, ids: string[], pageId: string): string[] {\n const page = TVDR.getPage(data, pageId)\n\n const visited = new Set(ids)\n\n ids.forEach((id) => {\n const shape = page.shapes[id]\n\n // Add descendant shapes\n function collectDescendants(shape: TVShape): void {\n if (shape.children === undefined) return\n shape.children\n .filter((childId) => !visited.has(childId))\n .forEach((childId) => {\n visited.add(childId)\n collectDescendants(page.shapes[childId])\n })\n }\n\n collectDescendants(shape)\n\n // Add asecendant shapes\n function collectAscendants(shape: TVShape): void {\n const parentId = shape.parentId\n if (parentId === page.id) return\n if (visited.has(parentId)) return\n visited.add(parentId)\n collectAscendants(page.shapes[parentId])\n }\n\n collectAscendants(shape)\n\n // Add bindings that are to or from any of the visited shapes (this does not have to be recursive)\n visited.forEach((id) => {\n Object.values(page.bindings)\n .filter((binding) => binding.fromId === id || binding.toId === id)\n .forEach((binding) => visited.add(binding.fromId === id ? binding.toId : binding.fromId))\n })\n })\n\n // Return the unique array of visited shapes\n return Array.from(visited.values())\n }\n\n static getLinkedShapeIds(\n data: TVSnapshot,\n pageId: string,\n direction: 'center' | 'left' | 'right',\n includeArrows = true\n ) {\n const selectedIds = TVDR.getSelectedIds(data, pageId)\n\n const page = TVDR.getPage(data, pageId)\n\n const linkedIds = new Set<string>(selectedIds)\n\n const checkedIds = new Set<string>()\n\n const idsToCheck = [...selectedIds]\n\n const arrows = new Set(\n Object.values(page.shapes).filter((shape) => {\n return (\n shape.type === TVShapeType.Arrow &&\n (shape.handles.start.bindingId || shape.handles?.end.bindingId)\n )\n }) as ArrowShape[]\n )\n\n while (idsToCheck.length) {\n const id = idsToCheck.pop()\n\n if (!(id && arrows.size)) break\n\n if (checkedIds.has(id)) continue\n\n checkedIds.add(id)\n\n arrows.forEach((arrow) => {\n const {\n handles: {\n start: { bindingId: startBindingId },\n end: { bindingId: endBindingId },\n },\n } = arrow\n\n const startBinding = startBindingId ? page.bindings[startBindingId] : null\n const endBinding = endBindingId ? page.bindings[endBindingId] : null\n\n let hit = false\n\n if (startBinding && startBinding.toId === id) {\n if (direction === 'center') {\n hit = true\n } else if (arrow.decorations?.start && endBinding) {\n // The arrow is pointing to this shape at its start\n hit = direction === 'left'\n } else {\n // The arrow is pointing away from this shape\n hit = direction === 'right'\n }\n\n if (hit) {\n // This arrow is bound to this shape\n if (includeArrows) linkedIds.add(arrow.id)\n linkedIds.add(id)\n\n if (endBinding) {\n linkedIds.add(endBinding.toId)\n idsToCheck.push(endBinding.toId)\n }\n }\n } else if (endBinding && endBinding.toId === id) {\n // This arrow is bound to this shape at its end\n if (direction === 'center') {\n hit = true\n } else if (arrow.decorations?.end && startBinding) {\n // The arrow is pointing to this shape\n hit = direction === 'left'\n } else {\n // The arrow is pointing away from this shape\n hit = direction === 'right'\n }\n\n if (hit) {\n if (includeArrows) linkedIds.add(arrow.id)\n linkedIds.add(id)\n\n if (startBinding) {\n linkedIds.add(startBinding.toId)\n idsToCheck.push(startBinding.toId)\n }\n }\n }\n\n if (\n (!startBinding || linkedIds.has(startBinding.toId)) &&\n (!endBinding || linkedIds.has(endBinding.toId))\n ) {\n arrows.delete(arrow)\n }\n })\n }\n\n return Array.from(linkedIds.values())\n }\n\n static getChildIndexAbove(data: TVSnapshot, id: string, pageId: string): number {\n const page = data.document.pages[pageId]\n const shape = page.shapes[id]\n\n let siblings: TVShape[]\n\n if (shape.parentId === page.id) {\n siblings = Object.values(page.shapes)\n .filter((shape) => shape.parentId === page.id)\n .sort((a, b) => a.childIndex - b.childIndex)\n } else {\n const parent = page.shapes[shape.parentId]\n if (!parent.children) throw Error('No children in parent!')\n siblings = parent.children\n .map((childId) => page.shapes[childId])\n .sort((a, b) => a.childIndex - b.childIndex)\n }\n\n const index = siblings.indexOf(shape)\n\n const nextSibling = siblings[index + 1]\n\n if (!nextSibling) return shape.childIndex + 1\n\n return nextSibling.childIndex\n }\n\n /* -------------------------------------------------- */\n /* Mutations */\n /* -------------------------------------------------- */\n\n static getBeforeShape<T extends TVShape>(shape: T, change: Partial<T>): Partial<T> {\n return Object.fromEntries(\n Object.keys(change).map((k) => [k, shape[k as keyof T]])\n ) as Partial<T>\n }\n\n static mutateShapes<T extends TVShape>(\n data: TVSnapshot,\n ids: string[],\n fn: (shape: T, i: number) => Partial<T> | void,\n pageId: string,\n forceChildrenTraversal = false\n ): {\n before: Record<string, Partial<T>>\n after: Record<string, Partial<T>>\n data: TVSnapshot\n } {\n const beforeShapes: Record<string, Partial<T>> = {}\n const afterShapes: Record<string, Partial<T>> = {}\n\n ids.forEach((id, i) => {\n const shape = TVDR.getShape<T>(data, id, pageId)\n if (shape.isLocked) return\n if (shape?.type === 'group' && (ids.length === 1 || forceChildrenTraversal)) {\n shape.children.forEach((id, i) => {\n const shape = TVDR.getShape<T>(data, id, pageId)\n if (shape.isLocked) return\n const change = fn(shape, i)\n if (change) {\n beforeShapes[id] = TVDR.getBeforeShape(shape, change)\n afterShapes[id] = change\n }\n })\n }\n const change = fn(shape, i)\n if (change) {\n beforeShapes[id] = TVDR.getBeforeShape(shape, change)\n afterShapes[id] = change\n }\n })\n\n const dataWithMutations = Utils.deepMerge(data, {\n document: {\n pages: {\n [data.appState.currentPageId]: {\n shapes: afterShapes,\n },\n },\n },\n })\n\n return {\n before: beforeShapes,\n after: afterShapes,\n data: dataWithMutations,\n }\n }\n\n static createShapes(data: TVSnapshot, shapes: TVShape[], pageId: string): TelvaCommand {\n const before: TelvaPatch = {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n ...Object.fromEntries(\n shapes.flatMap((shape) => {\n const results: [string, Partial<TVShape> | undefined][] = [[shape.id, undefined]]\n\n // If the shape is a child of another shape, also save that shape\n if (shape.parentId !== pageId) {\n const parent = TVDR.getShape(data, shape.parentId, pageId)\n if (!parent.children) throw Error('No children in parent!')\n results.push([parent.id, { children: parent.children }])\n }\n\n return results\n })\n ),\n },\n },\n },\n },\n }\n\n const after: TelvaPatch = {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n shapes: {\n ...Object.fromEntries(\n shapes.flatMap((shape) => {\n const results: [string, Partial<TVShape> | undefined][] = [[shape.id, shape]]\n\n // If the shape is a child of a different shape, update its parent\n if (shape.parentId !== pageId) {\n const parent = TVDR.getShape(data, shape.parentId, pageId)\n if (!parent.children) throw Error('No children in parent!')\n results.push([parent.id, { children: [...parent.children, shape.id] }])\n }\n\n return results\n })\n ),\n },\n },\n },\n },\n },\n }\n\n return {\n before,\n after,\n }\n }\n\n static deleteShapes(\n data: TVSnapshot,\n shapes: TVShape[] | string[],\n pageId?: string\n ): TelvaCommand {\n pageId = pageId ? pageId : data.appState.currentPageId\n\n const page = TVDR.getPage(data, pageId)\n\n const shapeIds =\n typeof shapes[0] === 'string'\n ? (shapes as string[])\n : (shapes as TVShape[]).map((shape) => shape.id)\n\n const before: TelvaPatch = {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n // These are the shapes that we're going to delete\n ...Object.fromEntries(\n shapeIds.flatMap((id) => {\n const shape = page.shapes[id]\n const results: [string, Partial<TVShape> | undefined][] = [[shape.id, shape]]\n\n // If the shape is a child of another shape, also add that shape\n if (shape.parentId !== pageId) {\n const parent = page.shapes[shape.parentId]\n if (!parent.children) throw Error('No children in parent!')\n results.push([parent.id, { children: parent.children }])\n }\n\n return results\n })\n ),\n },\n bindings: {\n // These are the bindings that we're going to delete\n ...Object.fromEntries(\n Object.values(page.bindings)\n .filter((binding) => {\n return shapeIds.includes(binding.fromId) || shapeIds.includes(binding.toId)\n })\n .map((binding) => {\n return [binding.id, binding]\n })\n ),\n },\n },\n },\n },\n }\n\n const after: TelvaPatch = {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n ...Object.fromEntries(\n shapeIds.flatMap((id) => {\n const shape = page.shapes[id]\n const results: [string, Partial<TVShape> | undefined][] = [[shape.id, undefined]]\n\n // If the shape is a child of a different shape, update its parent\n if (shape.parentId !== page.id) {\n const parent = page.shapes[shape.parentId]\n\n if (!parent.children) throw Error('No children in parent!')\n\n results.push([\n parent.id,\n { children: parent.children.filter((id) => id !== shape.id) },\n ])\n }\n\n return results\n })\n ),\n },\n },\n },\n },\n }\n\n return {\n before,\n after,\n }\n }\n\n static onSessionComplete<T extends TVShape>(shape: T) {\n const delta = TVDR.getShapeUtil(shape).onSessionComplete?.(shape)\n if (!delta) return shape\n return { ...shape, ...delta }\n }\n\n static onChildrenChange<T extends TVShape>(data: TVSnapshot, shape: T, pageId: string) {\n if (!shape.children) return\n\n const delta = TVDR.getShapeUtil(shape).onChildrenChange?.(\n shape,\n shape.children.map((id) => TVDR.getShape(data, id, pageId))\n )\n\n if (!delta) return shape\n\n return { ...shape, ...delta }\n }\n\n static updateArrowBindings(page: TVPage, arrowShape: ArrowShape) {\n const result = {\n start: deepCopy(arrowShape.handles.start),\n end: deepCopy(arrowShape.handles.end),\n }\n type HandleInfo = {\n handle: TVHandle\n point: number[] // in page space\n } & (\n | {\n isBound: false\n }\n | {\n isBound: true\n hasDecoration: boolean\n binding: TVBinding\n util: TVShapeUtil<TVShape, any>\n target: TVShape\n bounds: TLBounds\n expandedBounds: TLBounds\n intersectBounds: TLBounds\n center: number[]\n }\n )\n let start: HandleInfo = {\n isBound: false,\n handle: arrowShape.handles.start,\n point: Vec.add(arrowShape.handles.start.point, arrowShape.point),\n }\n let end: HandleInfo = {\n isBound: false,\n handle: arrowShape.handles.end,\n point: Vec.add(arrowShape.handles.end.point, arrowShape.point),\n }\n if (arrowShape.handles.start.bindingId) {\n const hasDecoration = arrowShape.decorations?.start !== undefined\n const handle = arrowShape.handles.start\n const binding = page.bindings[arrowShape.handles.start.bindingId]\n if (!binding)\n throw Error(\n \"Could not find a binding to match the start handle's bindingId: \" +\n arrowShape.handles.start.bindingId\n )\n const target = page.shapes[binding.toId]\n const util = TVDR.getShapeUtil(target)\n const bounds = util.getBounds(target)\n const expandedBounds = util.getExpandedBounds(target)\n const intersectBounds = hasDecoration ? Utils.expandBounds(bounds, binding.distance) : bounds\n const { minX, minY, width, height } = expandedBounds\n const anchorPoint = Vec.add(\n [minX, minY],\n Vec.mulV([width, height], Vec.rotWith(binding.point, [0.5, 0.5], target.rotation || 0))\n )\n start = {\n isBound: true,\n hasDecoration,\n binding,\n handle,\n point: anchorPoint,\n util,\n target,\n bounds,\n expandedBounds,\n intersectBounds,\n center: util.getCenter(target),\n }\n }\n if (arrowShape.handles.end.bindingId) {\n const hasDecoration = arrowShape.decorations?.end !== undefined\n const handle = arrowShape.handles.end\n const binding = page.bindings[arrowShape.handles.end.bindingId]\n if (!binding) throw Error(\"Could not find a binding to match the end handle's bindingId\")\n const target = page.shapes[binding.toId]\n const util = TVDR.getShapeUtil(target)\n const bounds = util.getBounds(target)\n const expandedBounds = util.getExpandedBounds(target)\n const intersectBounds = hasDecoration ? Utils.expandBounds(bounds, binding.distance) : bounds\n const { minX, minY, width, height } = expandedBounds\n const anchorPoint = Vec.add(\n [minX, minY],\n Vec.mulV([width, height], Vec.rotWith(binding.point, [0.5, 0.5], target.rotation || 0))\n )\n end = {\n isBound: true,\n hasDecoration,\n binding,\n handle,\n point: anchorPoint,\n util,\n target,\n bounds,\n expandedBounds,\n intersectBounds,\n center: util.getCenter(target),\n }\n }\n\n for (const ID of ['end', 'start'] as const) {\n const A = ID === 'start' ? start : end\n const B = ID === 'start' ? end : start\n if (A.isBound) {\n if (!A.binding.distance) {\n // If the binding distance is zero, then the arrow is bound to a specific point\n // in the target shape. The resulting handle should be exactly at that point.\n result[ID].point = Vec.sub(A.point, arrowShape.point)\n } else {\n // We'll need to figure out the handle's true point based on some intersections\n // between the opposite handle point and this handle point. This is different\n // for each type of shape.\n const direction = Vec.uni(Vec.sub(A.point, B.point))\n switch (A.target.type) {\n case TVShapeType.Ellipse: {\n const hits = intersectRayEllipse(\n B.point,\n direction,\n A.center,\n A.target.radius[0] + (A.hasDecoration ? A.binding.distance : 0),\n A.target.radius[1] + (A.hasDecoration ? A.binding.distance : 0),\n A.target.rotation || 0\n ).points.sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n if (hits[0] !== undefined) {\n result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n }\n break\n }\n case TVShapeType.Triangle: {\n const targetPoint = A.target.point\n const points = getTrianglePoints(\n A.target.size,\n A.hasDecoration ? BINDING_DISTANCE : 0,\n A.target.rotation\n ).map((pt) => Vec.add(pt, targetPoint))\n const hits = Utils.pointsToLineSegments(points, true)\n .map(([p0, p1]) => intersectRayLineSegment(B.point, direction, p0, p1))\n .filter((intersection) => intersection.didIntersect)\n .flatMap((intersection) => intersection.points)\n .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n if (hits[0] !== undefined) {\n result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n }\n break\n }\n default: {\n const hits = intersectRayBounds(\n B.point,\n direction,\n A.intersectBounds,\n A.target.rotation\n )\n .filter((int) => int.didIntersect)\n .map((int) => int.points[0])\n .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n if (!hits[0]) continue\n let bHit: number[] | undefined = undefined\n if (B.isBound) {\n const bHits = intersectRayBounds(\n B.point,\n direction,\n B.intersectBounds,\n B.target.rotation\n )\n .filter((int) => int.didIntersect)\n .map((int) => int.points[0])\n .sort((a, b) => Vec.dist(a, B.point) - Vec.dist(b, B.point))\n bHit = bHits[0]\n }\n if (\n B.isBound &&\n (hits.length < 2 ||\n (bHit &&\n hits[0] &&\n Math.ceil(Vec.dist(hits[0], bHit)) < BINDING_DISTANCE * 2.5) ||\n Utils.boundsContain(A.expandedBounds, B.expandedBounds) ||\n Utils.boundsCollide(A.expandedBounds, B.expandedBounds))\n ) {\n // If the other handle is bound, and if we need to fallback to the short arrow method...\n const shortArrowDirection = Vec.uni(Vec.sub(B.point, A.point))\n const shortArrowHits = intersectRayBounds(\n A.point,\n shortArrowDirection,\n A.bounds,\n A.target.rotation\n )\n .filter((int) => int.didIntersect)\n .map((int) => int.points[0])\n if (!shortArrowHits[0]) continue\n result[ID].point = Vec.toFixed(Vec.sub(shortArrowHits[0], arrowShape.point))\n result[ID === 'start' ? 'end' : 'start'].point = Vec.toFixed(\n Vec.add(\n Vec.sub(shortArrowHits[0], arrowShape.point),\n Vec.mul(\n shortArrowDirection,\n Math.min(\n Vec.dist(shortArrowHits[0], B.point),\n BINDING_DISTANCE *\n 2.5 *\n (Utils.boundsContain(B.bounds, A.intersectBounds) ? -1 : 1)\n )\n )\n )\n )\n } else if (\n !B.isBound &&\n ((hits[0] && Vec.dist(hits[0], B.point) < BINDING_DISTANCE * 2.5) ||\n Utils.pointInBounds(B.point, A.intersectBounds))\n ) {\n // Short arrow time!\n const shortArrowDirection = Vec.uni(Vec.sub(A.center, B.point))\n return TVDR.getShapeUtil<ArrowShape>(arrowShape).onHandleChange?.(arrowShape, {\n [ID]: {\n ...arrowShape.handles[ID],\n point: Vec.toFixed(\n Vec.add(\n Vec.sub(B.point, arrowShape.point),\n Vec.mul(shortArrowDirection, BINDING_DISTANCE * 2.5)\n )\n ),\n },\n })\n } else if (hits[0]) {\n result[ID].point = Vec.toFixed(Vec.sub(hits[0], arrowShape.point))\n }\n }\n }\n }\n }\n }\n\n return TVDR.getShapeUtil<ArrowShape>(arrowShape).onHandleChange?.(arrowShape, result)\n }\n\n static transform<T extends TVShape>(shape: T, bounds: TLBounds, info: TLTransformInfo<T>) {\n const delta = TVDR.getShapeUtil(shape).transform(shape, bounds, info)\n if (!delta) return shape\n return { ...shape, ...delta }\n }\n\n static transformSingle<T extends TVShape>(shape: T, bounds: TLBounds, info: TLTransformInfo<T>) {\n const delta = TVDR.getShapeUtil(shape).transformSingle(shape, bounds, info)\n if (!delta) return shape\n return { ...shape, ...delta }\n }\n\n /**\n * Rotate a shape around an origin point.\n * @param shape a shape.\n * @param center the shape's center in page space.\n * @param origin the page point to rotate around.\n * @param rotation the amount to rotate the shape.\n */\n static getRotatedShapeMutation<T extends TVShape>(\n shape: T, // in page space\n center: number[], // in page space\n origin: number[], // in page space (probably the center of common bounds)\n delta: number // The shape's rotation delta\n ): Partial<T> | void {\n // The shape's center relative to the shape's point\n const relativeCenter = Vec.sub(center, shape.point)\n\n // Rotate the center around the origin\n const rotatedCenter = Vec.rotWith(center, origin, delta)\n\n // Get the top left point relative to the rotated center\n const nextPoint = Vec.toFixed(Vec.sub(rotatedCenter, relativeCenter))\n\n // If the shape has handles, we need to rotate the handles instead\n // of rotating the shape. Shapes with handles should never be rotated,\n // because that makes a lot of other things incredible difficult.\n if (shape.handles !== undefined) {\n const change = this.getShapeUtil(shape).onHandleChange?.(\n // Base the change on a shape with the next point\n { ...shape, point: nextPoint },\n Object.fromEntries(\n Object.entries(shape.handles).map(([handleId, handle]) => {\n // Rotate each handle's point around the shape's center\n // (in relative shape space, as the handle's point will be).\n const point = Vec.toFixed(Vec.rotWith(handle.point, relativeCenter, delta))\n return [handleId, { ...handle, point }]\n })\n ) as T['handles']\n )\n\n return change\n }\n\n // If the shape has no handles, move the shape to the new point\n // and set the rotation.\n\n // Clamp the next rotation between 0 and PI2\n const nextRotation = Utils.clampRadians((shape.rotation || 0) + delta)\n\n return {\n point: nextPoint,\n rotation: nextRotation,\n } as Partial<T>\n }\n\n /* -------------------------------------------------- */\n /* Parents */\n /* -------------------------------------------------- */\n\n static updateParents(data: TVSnapshot, pageId: string, changedShapeIds: string[]): void {\n const page = TVDR.getPage(data, pageId)\n\n if (changedShapeIds.length === 0) return\n\n const { shapes } = TVDR.getPage(data, pageId)\n\n const parentToUpdateIds = Array.from(\n new Set(changedShapeIds.map((id) => shapes[id].parentId).values())\n ).filter((id) => id !== page.id)\n\n for (const parentId of parentToUpdateIds) {\n const parent = shapes[parentId]\n\n if (!parent.children) {\n throw Error('A shape is parented to a shape without a children array.')\n }\n\n TVDR.onChildrenChange(data, parent, pageId)\n }\n\n TVDR.updateParents(data, pageId, parentToUpdateIds)\n }\n\n /* -------------------------------------------------- */\n /* Bindings */\n /* -------------------------------------------------- */\n\n static getBinding(data: TVSnapshot, id: string, pageId: string): TVBinding {\n return TVDR.getPage(data, pageId).bindings[id]\n }\n\n static getBindings(data: TVSnapshot, pageId: string): TVBinding[] {\n const page = TVDR.getPage(data, pageId)\n return Object.values(page.bindings)\n }\n\n static getBindableShapeIds(data: TVSnapshot) {\n return TVDR.getShapes(data, data.appState.currentPageId)\n .filter((shape) => TVDR.getShapeUtil(shape).canBind)\n .sort((a, b) => b.childIndex - a.childIndex)\n .map((shape) => shape.id)\n }\n\n static getBindingsWithShapeIds(data: TVSnapshot, ids: string[], pageId: string): TVBinding[] {\n return Array.from(\n new Set(\n TVDR.getBindings(data, pageId).filter((binding) => {\n return ids.includes(binding.toId) || ids.includes(binding.fromId)\n })\n ).values()\n )\n }\n\n static getRelatedBindings(data: TVSnapshot, ids: string[], pageId: string): TVBinding[] {\n const changedShapeIds = new Set(ids)\n\n const page = TVDR.getPage(data, pageId)\n\n // Find all bindings that we need to update\n const bindingsArr = Object.values(page.bindings)\n\n // Start with bindings that are directly bound to our changed shapes\n const bindingsToUpdate = new Set(\n bindingsArr.filter(\n (binding) => changedShapeIds.has(binding.toId) || changedShapeIds.has(binding.fromId)\n )\n )\n\n // Next, look for other bindings that effect the same shapes\n let prevSize = bindingsToUpdate.size\n let delta = -1\n\n while (delta !== 0) {\n bindingsToUpdate.forEach((binding) => {\n const fromId = binding.fromId\n\n for (const otherBinding of bindingsArr) {\n if (otherBinding.fromId === fromId) {\n bindingsToUpdate.add(otherBinding)\n }\n\n if (otherBinding.toId === fromId) {\n bindingsToUpdate.add(otherBinding)\n }\n }\n })\n\n // Continue until we stop finding new bindings to update\n delta = bindingsToUpdate.size - prevSize\n\n prevSize = bindingsToUpdate.size\n }\n\n return Array.from(bindingsToUpdate.values())\n }\n\n static copyStringToClipboard = (string: string) => {\n try {\n if (navigator.clipboard) {\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': new Blob([string], { type: 'text/plain' }),\n }),\n ])\n }\n } catch (e) {\n const textarea = document.createElement('textarea')\n textarea.setAttribute('position', 'fixed')\n textarea.setAttribute('top', '0')\n textarea.setAttribute('readonly', 'true')\n textarea.setAttribute('contenteditable', 'true')\n textarea.style.position = 'fixed'\n textarea.value = string\n document.body.appendChild(textarea)\n textarea.focus()\n textarea.select()\n\n try {\n const range = document.createRange()\n range.selectNodeContents(textarea)\n const sel = window.getSelection()\n if (sel) {\n sel.removeAllRanges()\n sel.addRange(range)\n textarea.setSelectionRange(0, textarea.value.length)\n }\n document.execCommand('copy')\n } catch (err) {\n null // Could not copy to clipboard\n } finally {\n document.body.removeChild(textarea)\n }\n }\n }\n\n /* -------------------------------------------------- */\n /* Groups */\n /* -------------------------------------------------- */\n\n static flattenShape = (data: TVSnapshot, shape: TVShape): TVShape[] => {\n return [\n shape,\n ...(shape.children ?? [])\n .map((childId) => TVDR.getShape(data, childId, data.appState.currentPageId))\n .sort((a, b) => a.childIndex - b.childIndex)\n .flatMap((shape) => TVDR.flattenShape(data, shape)),\n ]\n }\n\n static flattenPage = (data: TVSnapshot, pageId: string): TVShape[] => {\n return Object.values(data.document.pages[pageId].shapes)\n .sort((a, b) => a.childIndex - b.childIndex)\n .reduce<TVShape[]>((acc, shape) => [...acc, ...TVDR.flattenShape(data, shape)], [])\n }\n\n static getTopChildIndex = (data: TVSnapshot, pageId: string): number => {\n const shapes = TVDR.getShapes(data, pageId)\n return shapes.length === 0\n ? 1\n : shapes\n .filter((shape) => shape.parentId === pageId)\n .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n }\n\n /* -------------------------------------------------- */\n /* Text */\n /* -------------------------------------------------- */\n\n static fixNewLines = /\\r?\\n|\\r/g\n\n static normalizeText(text: string) {\n return text\n .replace(TVDR.fixNewLines, '\\n')\n .split('\\n')\n .map((x) => x || ' ')\n .join('\\n')\n }\n\n /* -------------------------------------------------- */\n /* Assertions */\n /* -------------------------------------------------- */\n\n static assertShapeHasProperty<P extends keyof TVShape>(\n shape: TVShape,\n prop: P\n ): asserts shape is ShapesWithProp<P> {\n if (shape[prop] === undefined) {\n throw new Error()\n }\n }\n\n static warn(e: any) {\n if (isDev) {\n console.warn(e)\n }\n }\n static error(e: any) {\n if (isDev) {\n console.error(e)\n }\n }\n\n /* -------------------------------------------------- */\n /* Export */\n /* -------------------------------------------------- */\n\n static getSvgString(svg: SVGElement, scale = 1) {\n const clone = svg.cloneNode(true) as SVGGraphicsElement\n\n svg.setAttribute('width', +svg.getAttribute('width')! * scale + '')\n svg.setAttribute('height', +svg.getAttribute('height')! * scale + '')\n\n return new XMLSerializer()\n .serializeToString(clone)\n .replaceAll('&#10; ', '')\n .replaceAll(/((\\s|\")[0-9]*\\.[0-9]{2})([0-9]*)(\\b|\"|\\))/g, '$1')\n }\n\n static getSvgAsDataUrl(svg: SVGElement, scale = 1) {\n const svgString = TVDR.getSvgString(svg, scale)\n\n const base64SVG = window.btoa(unescape(svgString))\n\n return `data:image/svg+xml;base64,${base64SVG}`\n }\n\n static async getImageForSvg(\n svg: SVGElement,\n type: Exclude<TVExportType, TVExportType.JSON> = TVExportType.PNG,\n opts = {} as Partial<{\n scale: number\n quality: number\n }>\n ) {\n const { scale = 2, quality = 1 } = opts\n\n const svgString = TVDR.getSvgString(svg, scale)\n\n if (!svgString) return\n\n const canvas = await new Promise<HTMLCanvasElement>((resolve) => {\n const image = new Image()\n\n image.crossOrigin = 'anonymous'\n\n const base64SVG = window.btoa(unescape(encodeURIComponent(svgString)))\n\n const dataUrl = `data:image/svg+xml;base64,${base64SVG}`\n\n image.onload = () => {\n const canvas = document.createElement('canvas') as HTMLCanvasElement\n const context = canvas.getContext('2d')!\n\n const imageWidth = image.width\n const imageHeight = image.height\n\n canvas.width = imageWidth\n canvas.height = imageHeight\n context.drawImage(image, 0, 0, imageWidth, imageHeight)\n\n URL.revokeObjectURL(dataUrl)\n\n resolve(canvas)\n }\n\n image.onerror = () => {\n console.warn('Could not convert that SVG to an image.')\n }\n\n image.src = dataUrl\n })\n\n const blob = await new Promise<Blob>((resolve) =>\n canvas.toBlob((blob) => resolve(blob!), 'image/' + type, quality)\n )\n\n return blob\n }\n}\n", "/**\n * Deep copy function for TypeScript.\n * @param T Generic type of target/copied value.\n * @param target Target value to be copied.\n * @see Source project, ts-deeply https://github.com/ykdr2017/ts-deepcopy\n * @see Code pen https://codepen.io/erikvullings/pen/ejyBYg\n */\nexport function deepCopy<T>(target: T): T {\n if (target === null) {\n return target\n }\n if (target instanceof Date) {\n return new Date(target.getTime()) as any\n }\n\n // First part is for array and second part is for Realm.Collection\n // if (target instanceof Array || typeof (target as any).type === 'string') {\n if (typeof target === 'object') {\n if (typeof target[Symbol.iterator as keyof T] === 'function') {\n const cp = [] as any[]\n if ((target as any as any[]).length > 0) {\n for (const arrayMember of target as any as any[]) {\n cp.push(deepCopy(arrayMember))\n }\n }\n return cp as any as T\n } else {\n const targetKeys = Object.keys(target)\n const cp = {} as T\n if (targetKeys.length > 0) {\n for (const key of targetKeys) {\n cp[key as keyof T] = deepCopy(target[key as keyof T])\n }\n }\n return cp\n }\n }\n\n // Means that object is atomic\n return target\n}\n", "import * as React from 'react'\nimport { SVGContainer, TLBounds, Utils } from 'telva-core'\nimport {\n intersectArcBounds,\n intersectLineSegmentBounds,\n intersectLineSegmentLineSegment,\n} from 'telva-intersect'\nimport { Vec } from 'telva-vec'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n LabelMask,\n TextLabel,\n defaultStyle,\n getFontFace,\n getFontSize,\n getFontStyle,\n getShapeStyle,\n getTextLabelSize,\n getTextSvgElement,\n} from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport {\n AlignStyle,\n ArrowShape,\n DashStyle,\n Decoration,\n TVMeta,\n TVShapeType,\n TransformInfo,\n} from '~types'\nimport {\n getArcLength,\n getArcPoints,\n getArrowPath,\n getBendPoint,\n getCtp,\n isAngleBetween,\n} from './arrowHelpers'\nimport { CurvedArrow } from './components/CurvedArrow.tsx'\nimport { StraightArrow } from './components/StraightArrow'\n\ntype T = ArrowShape\ntype E = HTMLDivElement\n\nexport class ArrowUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Arrow as const\n\n hideBounds = true\n\n canEdit = true\n\n pathCache = new WeakMap<T, string>()\n\n getShape = (props: Partial<T>): T => {\n return {\n id: 'id',\n type: TVShapeType.Arrow,\n name: 'Arrow',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n rotation: 0,\n bend: 0,\n handles: {\n start: {\n id: 'start',\n index: 0,\n point: [0, 0],\n canBind: true,\n ...props.handles?.start,\n },\n end: {\n id: 'end',\n index: 1,\n point: [1, 1],\n canBind: true,\n ...props.handles?.end,\n },\n bend: {\n id: 'bend',\n index: 2,\n point: [0.5, 0.5],\n ...props.handles?.bend,\n },\n },\n decorations: props.decorations ?? {\n end: Decoration.Arrow,\n },\n style: {\n ...defaultStyle,\n isFilled: false,\n ...props.style,\n },\n label: '',\n labelPoint: [0.5, 0.5],\n ...props,\n }\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, isEditing, isGhost, meta, events, onShapeChange, onShapeBlur }, ref) => {\n const {\n id,\n label = '',\n handles: { start, bend, end },\n decorations = {},\n style,\n } = shape\n\n const hasLabel = label?.trim()?.length ?? 0 > 0\n\n const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n\n const font = getFontStyle(style)\n\n const styles = getShapeStyle(style, meta.isDarkMode)\n\n const labelSize = hasLabel || isEditing ? getTextLabelSize(label, font) : [0, 0]\n\n const bounds = this.getBounds(shape)\n\n const dist = React.useMemo(() => {\n const { start, bend, end } = shape.handles\n if (isStraightLine) return Vec.dist(start.point, end.point)\n const circle = getCtp(start.point, bend.point, end.point)\n const center = circle.slice(0, 2)\n const radius = circle[2]\n const length = getArcLength(center, radius, start.point, end.point)\n return Math.abs(length)\n }, [shape.handles])\n\n const scale = Math.max(\n 0.5,\n Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n )\n\n const offset = React.useMemo(() => {\n const bounds = this.getBounds(shape)\n const offset = Vec.sub(\n shape.handles.bend.point,\n Vec.toFixed([bounds.width / 2, bounds.height / 2])\n )\n return offset\n }, [shape, scale])\n\n const handleLabelChange = React.useCallback(\n (label: string) => {\n onShapeChange?.({ id, label })\n },\n [onShapeChange]\n )\n\n const Component = isStraightLine ? StraightArrow : CurvedArrow\n\n return (\n <FullWrapper ref={ref} {...events}>\n <TextLabel\n font={font}\n text={label}\n color={style.labelColor ?? styles.stroke}\n background={style.labelBackground}\n textGradient={style.textGradient}\n offsetX={offset[0]}\n offsetY={offset[1]}\n scale={scale}\n isEditing={isEditing}\n onChange={handleLabelChange}\n onBlur={onShapeBlur}\n />\n <SVGContainer id={shape.id + '_svg'}>\n <defs>\n <mask id={shape.id + '_clip'}>\n <rect\n x={-100}\n y={-100}\n width={bounds.width + 200}\n height={bounds.height + 200}\n fill=\"white\"\n />\n <rect\n x={bounds.width / 2 - (labelSize[0] / 2) * scale + offset[0]}\n y={bounds.height / 2 - (labelSize[1] / 2) * scale + offset[1]}\n width={labelSize[0] * scale}\n height={labelSize[1] * scale}\n rx={4 * scale}\n ry={4 * scale}\n fill=\"black\"\n opacity={1}\n />\n </mask>\n </defs>\n <g\n pointerEvents=\"none\"\n opacity={isGhost ? GHOSTED_OPACITY : styles.opacity}\n mask={hasLabel || isEditing ? `url(#${shape.id}_clip)` : ``}\n >\n <Component\n id={id}\n style={style}\n start={start.point}\n end={end.point}\n bend={bend.point}\n arrowBend={shape.bend}\n decorationStart={decorations?.start}\n decorationEnd={decorations?.end}\n isDraw={style.dash === DashStyle.Draw}\n isDarkMode={meta.isDarkMode}\n />\n </g>\n </SVGContainer>\n </FullWrapper>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<ArrowShape>(({ shape, bounds }) => {\n const {\n style,\n decorations,\n label,\n handles: { start, bend, end },\n } = shape\n\n const hasLabel = label?.trim()?.length ?? 0 > 0\n\n const font = getFontStyle(style)\n const labelSize = hasLabel ? getTextLabelSize(label!, font) : [0, 0]\n const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n\n const dist = React.useMemo(() => {\n const { start, bend, end } = shape.handles\n if (isStraightLine) return Vec.dist(start.point, end.point)\n const circle = getCtp(start.point, bend.point, end.point)\n const center = circle.slice(0, 2)\n const radius = circle[2]\n const length = getArcLength(center, radius, start.point, end.point)\n return Math.abs(length)\n }, [shape.handles])\n\n const scale = Math.max(\n 0.5,\n Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n )\n\n const offset = React.useMemo(() => {\n const bounds = this.getBounds(shape)\n const offset = Vec.sub(shape.handles.bend.point, [bounds.width / 2, bounds.height / 2])\n return offset\n }, [shape, scale])\n\n return (\n <>\n {hasLabel && (\n <LabelMask\n id={shape.id}\n scale={scale}\n offset={offset}\n bounds={bounds}\n labelSize={labelSize}\n />\n )}\n <path\n d={getArrowPath(\n style,\n start.point,\n bend.point,\n end.point,\n decorations?.start,\n decorations?.end\n )}\n mask={hasLabel ? `url(#${shape.id}_clip)` : ``}\n />\n {hasLabel && (\n <rect\n x={bounds.width / 2 - (labelSize[0] / 2) * scale + offset[0]}\n y={bounds.height / 2 - (labelSize[1] / 2) * scale + offset[1]}\n width={labelSize[0] * scale}\n height={labelSize[1] * scale}\n rx={4 * scale}\n ry={4 * scale}\n fill=\"transparent\"\n />\n )}\n </>\n )\n })\n\n getBounds = (shape: T) => {\n const bounds = Utils.getFromCache(this.boundsCache, shape, () => {\n const {\n handles: { start, bend, end },\n } = shape\n return Utils.getBoundsFromPoints(getArcPoints(start.point, bend.point, end.point))\n })\n return Utils.translateBounds(bounds, shape.point)\n }\n\n getRotatedBounds = (shape: T) => {\n const {\n handles: { start, bend, end },\n } = shape\n let points = getArcPoints(start.point, bend.point, end.point)\n const { minX, minY, maxX, maxY } = Utils.getBoundsFromPoints(points)\n if (shape.rotation !== 0) {\n points = points.map((pt) =>\n Vec.rotWith(pt, [(minX + maxX) / 2, (minY + maxY) / 2], shape.rotation || 0)\n )\n }\n\n return Utils.translateBounds(Utils.getBoundsFromPoints(points), shape.point)\n }\n\n getCenter = (shape: T) => {\n const { start, end } = shape.handles\n return Vec.add(shape.point, Vec.med(start.point, end.point))\n }\n\n shouldRender = (prev: T, next: T) => {\n return (\n next.decorations !== prev.decorations ||\n next.handles !== prev.handles ||\n next.style !== prev.style ||\n next.label !== prev.label\n )\n }\n\n hitTestPoint = (shape: T, point: number[]): boolean => {\n const {\n handles: { start, bend, end },\n } = shape\n const pt = Vec.sub(point, shape.point)\n const points = getArcPoints(start.point, bend.point, end.point)\n for (let i = 1; i < points.length; i++) {\n if (Vec.distanceToLineSegment(points[i - 1], points[i], pt) < 1) {\n return true\n }\n }\n return false\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n const {\n handles: { start, bend, end },\n } = shape\n const ptA = Vec.sub(A, shape.point)\n const ptB = Vec.sub(B, shape.point)\n const points = getArcPoints(start.point, bend.point, end.point)\n for (let i = 1; i < points.length; i++) {\n if (intersectLineSegmentLineSegment(points[i - 1], points[i], ptA, ptB).didIntersect) {\n return true\n }\n }\n return false\n }\n\n hitTestBounds = (shape: T, bounds: TLBounds) => {\n const { start, end, bend } = shape.handles\n const sp = Vec.add(shape.point, start.point)\n const ep = Vec.add(shape.point, end.point)\n if (Utils.pointInBounds(sp, bounds) || Utils.pointInBounds(ep, bounds)) {\n return true\n }\n if (Vec.isEqual(Vec.med(start.point, end.point), bend.point)) {\n return intersectLineSegmentBounds(sp, ep, bounds).length > 0\n } else {\n const [cx, cy, r] = getCtp(start.point, bend.point, end.point)\n const cp = Vec.add(shape.point, [cx, cy])\n return intersectArcBounds(cp, r, sp, ep, bounds).length > 0\n }\n }\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { initialShape, scaleX, scaleY }: TransformInfo<T>\n ): Partial<T> => {\n const initialShapeBounds = this.getBounds(initialShape)\n const handles: (keyof T['handles'])[] = ['start', 'end']\n const nextHandles = { ...initialShape.handles }\n\n handles.forEach((handle) => {\n if (handle === 'bend') return\n\n const [x, y] = nextHandles[handle].point\n const nw = x / initialShapeBounds.width\n const nh = y / initialShapeBounds.height\n nextHandles[handle] = {\n ...nextHandles[handle],\n point: [\n bounds.width * (scaleX < 0 ? 1 - nw : nw),\n bounds.height * (scaleY < 0 ? 1 - nh : nh),\n ],\n }\n })\n\n // If we've flipped one of the dimensions (but not both) then invert shape.bend\n\n const nextBend =\n (scaleX > 0 && scaleY < 0) || (scaleX < 0 && scaleY > 0)\n ? -initialShape.bend\n : initialShape.bend\n\n // Find the position of the bend handle based on the new start / end handles and the new bend\n const bendPoint = getBendPoint(nextHandles, nextBend)\n nextHandles.bend.point = bendPoint\n\n return {\n point: Vec.toFixed([bounds.minX, bounds.minY]),\n handles: nextHandles,\n bend: nextBend, // does this change?\n }\n }\n\n onDoubleClickHandle = (shape: T, handle: Partial<T['handles']>): Partial<T> | void => {\n switch (handle) {\n case 'bend': {\n return {\n bend: 0,\n handles: {\n ...shape.handles,\n bend: {\n ...shape.handles.bend,\n point: getBendPoint(shape.handles, shape.bend),\n },\n },\n }\n }\n case 'start': {\n return {\n decorations: {\n ...shape.decorations,\n start: shape.decorations?.start ? undefined : Decoration.Arrow,\n },\n }\n }\n case 'end': {\n return {\n decorations: {\n ...shape.decorations,\n end: shape.decorations?.end ? undefined : Decoration.Arrow,\n },\n }\n }\n }\n\n return this\n }\n\n onHandleChange = (shape: T, handles: Partial<T['handles']>): Partial<T> | void => {\n let nextHandles = Utils.deepMerge<ArrowShape['handles']>(shape.handles, handles)\n let nextBend = shape.bend\n\n nextHandles = Utils.deepMerge(nextHandles, {\n start: {\n point: Vec.toFixed(nextHandles.start.point),\n },\n end: {\n point: Vec.toFixed(nextHandles.end.point),\n },\n })\n\n // This will produce NaN values\n if (Vec.isEqual(nextHandles.start.point, nextHandles.end.point)) return\n\n // If the user is moving the bend handle, we want to move the bend point\n if ('bend' in handles) {\n const { start, end, bend } = nextHandles\n\n const distance = Vec.dist(start.point, end.point)\n const midPoint = Vec.med(start.point, end.point)\n const angle = Vec.angle(start.point, end.point)\n const u = Vec.uni(Vec.vec(start.point, end.point))\n\n // Create a line segment perendicular to the line between the start and end points\n const ap = Vec.add(midPoint, Vec.mul(Vec.per(u), distance))\n const bp = Vec.sub(midPoint, Vec.mul(Vec.per(u), distance))\n\n const bendPoint = Vec.nearestPointOnLineSegment(ap, bp, bend.point, true)\n\n // Find the distance between the midpoint and the nearest point on the\n // line segment to the bend handle's dragged point\n const bendDist = Vec.dist(midPoint, bendPoint)\n\n // The shape's \"bend\" is the ratio of the bend to the distance between\n // the start and end points. If the bend is below a certain amount, the\n // bend should be zero.\n const realBend = bendDist / (distance / 2)\n\n nextBend = Utils.clamp(realBend, -0.99, 0.99)\n\n // If the point is to the left of the line segment, we make the bend\n // negative, otherwise it's positive.\n const angleToBend = Vec.angle(start.point, bendPoint)\n\n // If resulting bend is low enough that the handle will snap to center,\n // then also snap the bend to center\n\n if (Vec.isEqual(midPoint, getBendPoint(nextHandles, nextBend))) {\n nextBend = 0\n } else if (isAngleBetween(angle, angle + Math.PI, angleToBend)) {\n // Otherwise, fix the bend direction\n nextBend *= -1\n }\n }\n\n const nextShape = {\n point: shape.point,\n bend: nextBend,\n handles: {\n ...nextHandles,\n bend: {\n ...nextHandles.bend,\n point: getBendPoint(nextHandles, nextBend),\n },\n },\n }\n\n // Zero out the handles to prevent handles with negative points. If a handle's x or y\n // is below zero, we need to move the shape left or up to make it zero.\n const topLeft = shape.point\n\n const nextBounds = this.getBounds({ ...nextShape } as ArrowShape)\n\n const offset = Vec.sub([nextBounds.minX, nextBounds.minY], topLeft)\n\n if (!Vec.isEqual(offset, [0, 0])) {\n Object.values(nextShape.handles).forEach((handle) => {\n handle.point = Vec.toFixed(Vec.sub(handle.point, offset))\n })\n nextShape.point = Vec.toFixed(Vec.add(nextShape.point, offset))\n }\n\n return nextShape\n }\n\n getSvgElement = (shape: ArrowShape, isDarkMode: boolean): SVGElement | void => {\n const elm = document.getElementById(shape.id + '_svg')?.cloneNode(true) as SVGElement\n if (!elm) return // possibly in test mode\n const hasLabel = shape.label?.trim()?.length ?? 0 > 0\n if (hasLabel) {\n const s = shape as ArrowShape\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n const font = getFontStyle(shape.style)\n const labelSize = getTextLabelSize(shape.label!, font)\n const fontSize = getFontSize(shape.style.size, shape.style.font) * (shape.style.scale ?? 1)\n const fontFamily = getFontFace(shape.style.font).slice(1, -1)\n\n const labelElm = getTextSvgElement(\n s.label!,\n fontSize,\n fontFamily,\n AlignStyle.Start,\n labelSize[0],\n false\n )\n\n let dist: number\n\n const { start, bend, end } = shape.handles\n const isStraightLine = Vec.dist(bend.point, Vec.toFixed(Vec.med(start.point, end.point))) < 1\n if (isStraightLine) {\n dist = Vec.dist(start.point, end.point)\n } else {\n const circle = getCtp(start.point, bend.point, end.point)\n const center = circle.slice(0, 2)\n const radius = circle[2]\n const length = getArcLength(center, radius, start.point, end.point)\n dist = Math.abs(length)\n }\n\n const scale = Math.max(\n 0.5,\n Math.min(1, Math.max(dist / (labelSize[1] + 128), dist / (labelSize[0] + 128)))\n )\n const bounds = this.getBounds(shape)\n\n const offset = Vec.sub(shape.handles.bend.point, [bounds.width / 2, bounds.height / 2])\n const x = bounds.width / 2 - (labelSize[0] / 2) * scale + offset[0]\n const y = bounds.height / 2 - (labelSize[1] / 2) * scale + offset[1]\n\n labelElm.setAttribute('transform', `translate(${x}, ${y})`)\n labelElm.setAttribute('fill', getShapeStyle(shape.style, isDarkMode).stroke)\n labelElm.setAttribute('transform-origin', 'center center')\n g.setAttribute('text-align', 'center')\n g.setAttribute('text-anchor', 'middle')\n g.appendChild(elm)\n g.appendChild(labelElm)\n return g\n }\n return elm\n }\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import * as React from 'react'\nimport { TLShapeUtil, Utils } from 'telva-core'\nimport type { TLBounds, TLPointerInfo } from 'telva-core'\nimport {\n intersectLineSegmentBounds,\n intersectLineSegmentPolyline,\n intersectRayBounds,\n} from 'telva-intersect'\nimport { Vec } from 'telva-vec'\nimport { BINDING_DISTANCE } from '~constants'\nimport { AlignStyle, ShapesWithProp, TVBinding, TVMeta, TVShape, TransformInfo } from '~types'\nimport { getFontFace, getFontSize, getFontStyle, getShapeStyle } from './shared'\nimport { getTextLabelSize } from './shared/getTextSize'\nimport { getTextSvgElement } from './shared/getTextSvgElement'\n\nexport abstract class TVShapeUtil<T extends TVShape, E extends Element = any> extends TLShapeUtil<\n T,\n E,\n TVMeta\n> {\n abstract type: T['type']\n\n canBind = false\n\n canEdit = false\n\n canClone = false\n\n isAspectRatioLocked = false\n\n hideResizeHandles = false\n\n bindingDistance = BINDING_DISTANCE\n\n abstract getShape: (props: Partial<T>) => T\n\n hitTestPoint = (shape: T, point: number[]): boolean => {\n return Utils.pointInBounds(point, this.getRotatedBounds(shape))\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n const box = Utils.getBoundsFromPoints([A, B])\n const bounds = this.getBounds(shape)\n\n return Utils.boundsContain(bounds, box) || shape.rotation\n ? intersectLineSegmentPolyline(A, B, Utils.getRotatedCorners(this.getBounds(shape)))\n .didIntersect\n : intersectLineSegmentBounds(A, B, this.getBounds(shape)).length > 0\n }\n\n create = (props: { id: string } & Partial<T>) => {\n this.refMap.set(props.id, React.createRef())\n return this.getShape(props)\n }\n\n getCenter = (shape: T) => {\n return Utils.getBoundsCenter(this.getBounds(shape))\n }\n\n getExpandedBounds = (shape: T) => {\n return Utils.expandBounds(this.getBounds(shape), this.bindingDistance)\n }\n\n getBindingPoint = <K extends TVShape>(\n shape: T,\n fromShape: K,\n point: number[],\n origin: number[],\n direction: number[],\n bindAnywhere: boolean\n ) => {\n // Algorithm time! We need to find the binding point (a normalized point inside of the shape, or around the shape, where the arrow will point to) and the distance from the binding shape to the anchor.\n\n const bounds = this.getBounds(shape)\n const expandedBounds = this.getExpandedBounds(shape)\n\n // The point must be inside of the expanded bounding box\n if (!Utils.pointInBounds(point, expandedBounds)) return\n\n const intersections = intersectRayBounds(origin, direction, expandedBounds)\n .filter((int) => int.didIntersect)\n .map((int) => int.points[0])\n\n if (!intersections.length) return\n\n // The center of the shape\n const center = this.getCenter(shape)\n\n // Find furthest intersection between ray from origin through point and expanded bounds. TODO: What if the shape has a curve? In that case, should we intersect the circle-from-three-points instead?\n const intersection = intersections.sort((a, b) => Vec.dist(b, origin) - Vec.dist(a, origin))[0]\n\n // The point between the handle and the intersection\n const middlePoint = Vec.med(point, intersection)\n\n // The anchor is the point in the shape where the arrow will be pointing\n let anchor: number[]\n\n // The distance is the distance from the anchor to the handle\n let distance: number\n\n if (bindAnywhere) {\n // If the user is indicating that they want to bind inside of the shape, we just use the handle's point\n anchor = Vec.dist(point, center) < BINDING_DISTANCE / 2 ? center : point\n distance = 0\n } else {\n if (Vec.distanceToLineSegment(point, middlePoint, center) < BINDING_DISTANCE / 2) {\n // If the line segment would pass near to the center, snap the anchor the center point\n anchor = center\n } else {\n // Otherwise, the anchor is the middle point between the handle and the intersection\n anchor = middlePoint\n }\n\n if (Utils.pointInBounds(point, bounds)) {\n // If the point is inside of the shape, use the shape's binding distance\n\n distance = this.bindingDistance\n } else {\n // Otherwise, use the actual distance from the handle point to nearest edge\n distance = Math.max(\n this.bindingDistance,\n Utils.getBoundsSides(bounds)\n .map((side) => Vec.distanceToLineSegment(side[1][0], side[1][1], point))\n .sort((a, b) => a - b)[0]\n )\n }\n }\n\n // The binding point is a normalized point indicating the position of the anchor.\n // An anchor at the middle of the shape would be (0.5, 0.5). When the shape's bounds\n // changes, we will re-recalculate the actual anchor point by multiplying the\n // normalized point by the shape's new bounds.\n const bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n expandedBounds.width,\n expandedBounds.height,\n ])\n\n return {\n point: Vec.clampV(bindingPoint, 0, 1),\n distance,\n }\n }\n\n mutate = (shape: T, props: Partial<T>): Partial<T> => {\n return props\n }\n\n transform = (shape: T, bounds: TLBounds, info: TransformInfo<T>): Partial<T> => {\n return { ...shape, point: [bounds.minX, bounds.minY] }\n }\n\n transformSingle = (shape: T, bounds: TLBounds, info: TransformInfo<T>): Partial<T> | void => {\n return this.transform(shape, bounds, info)\n }\n\n updateChildren?: <K extends TVShape>(shape: T, children: K[]) => Partial<K>[] | void\n\n onChildrenChange?: (shape: T, children: TVShape[]) => Partial<T> | void\n\n onHandleChange?: (shape: T, handles: Partial<T['handles']>) => Partial<T> | void\n\n onRightPointHandle?: (\n shape: T,\n handles: Partial<T['handles']>,\n info: Partial<TLPointerInfo>\n ) => Partial<T> | void\n\n onDoubleClickHandle?: (\n shape: T,\n handles: Partial<T['handles']>,\n info: Partial<TLPointerInfo>\n ) => Partial<T> | void\n\n onDoubleClickBoundsHandle?: (shape: T) => Partial<T> | void\n\n onSessionComplete?: (shape: T) => Partial<T> | void\n\n getSvgElement = (\n shape: T,\n isDarkMode: boolean\n ): SVGElement | Promise<SVGElement | void> | void => {\n const elm = document.getElementById(shape.id + '_svg')?.cloneNode(true) as SVGElement\n if (!elm) return // possibly in test mode\n const hasLabel = shape.label?.trim()?.length ?? 0 > 0\n if (hasLabel) {\n const s = shape as TVShape & { label: string }\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n const font = getFontStyle(shape.style)\n const fontSize = getFontSize(shape.style.size, shape.style.font) * (shape.style.scale ?? 1)\n const fontFamily = getFontFace(shape.style.font).slice(1, -1)\n\n const bounds = this.getBounds(shape)\n const wrapWidth = Math.max(0, bounds.width - 16) // 8px padding each side\n\n const labelSize = getTextLabelSize(shape.label!, font, wrapWidth)\n\n const labelElm = getTextSvgElement(\n s['label'],\n fontSize,\n fontFamily,\n AlignStyle.Middle,\n wrapWidth,\n true\n )\n\n labelElm.setAttribute(\n 'transform',\n `translate(${bounds.width / 2 - wrapWidth / 2}, ${bounds.height / 2 - labelSize[1] / 2})`\n )\n labelElm.setAttribute('fill', getShapeStyle(shape.style, isDarkMode).stroke)\n labelElm.setAttribute('transform-origin', 'center center')\n g.setAttribute('text-align', 'center')\n g.setAttribute('text-anchor', 'middle')\n g.appendChild(elm)\n g.appendChild(labelElm)\n return g\n }\n return elm\n }\n}\n", "import getStroke from 'perfect-freehand'\nimport { Utils } from 'telva-core'\nimport { intersectCircleCircle, intersectCircleLineSegment } from 'telva-intersect'\nimport Vec from 'telva-vec'\nimport { EASINGS } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ArrowShape, Decoration, ShapeStyles } from '~types'\n\nexport function getArrowArcPath(start: number[], end: number[], circle: number[], bend: number) {\n return [\n 'M',\n start[0],\n start[1],\n 'A',\n circle[2],\n circle[2],\n 0,\n 0,\n bend < 0 ? 0 : 1,\n end[0],\n end[1],\n ].join(' ')\n}\n\nexport function getBendPoint(handles: ArrowShape['handles'], bend: number) {\n const { start, end } = handles\n\n const dist = Vec.dist(start.point, end.point)\n\n const midPoint = Vec.med(start.point, end.point)\n\n const bendDist = (dist / 2) * bend\n\n const u = Vec.uni(Vec.vec(start.point, end.point))\n\n const point = Vec.toFixed(\n Math.abs(bendDist) < 10 ? midPoint : Vec.add(midPoint, Vec.mul(Vec.per(u), bendDist))\n )\n\n return point\n}\n\nexport function renderFreehandArrowShaft(\n id: string,\n style: ShapeStyles,\n start: number[],\n end: number[],\n decorationStart: Decoration | undefined,\n decorationEnd: Decoration | undefined\n) {\n const getRandom = Utils.rng(id)\n const strokeWidth = getShapeStyle(style).strokeWidth\n const startPoint = decorationStart ? Vec.nudge(start, end, strokeWidth) : start\n const endPoint = decorationEnd ? Vec.nudge(end, start, strokeWidth) : end\n const stroke = getStroke([startPoint, endPoint], {\n size: strokeWidth,\n thinning: 0.618 + getRandom() * 0.2,\n easing: EASINGS.easeOutQuad,\n simulatePressure: true,\n streamline: 0,\n last: true,\n })\n return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function renderCurvedFreehandArrowShaft(\n id: string,\n style: ShapeStyles,\n start: number[],\n end: number[],\n decorationStart: Decoration | undefined,\n decorationEnd: Decoration | undefined,\n center: number[],\n radius: number,\n length: number,\n easing: (t: number) => number\n) {\n const getRandom = Utils.rng(id)\n const strokeWidth = getShapeStyle(style).strokeWidth\n const startPoint = decorationStart ? Vec.rotWith(start, center, strokeWidth / length) : start\n const endPoint = decorationEnd ? Vec.rotWith(end, center, -(strokeWidth / length)) : end\n const startAngle = Vec.angle(center, startPoint)\n const endAngle = Vec.angle(center, endPoint)\n const points: number[][] = []\n const count = 8 + Math.floor((Math.abs(length) / 20) * 1 + getRandom() / 2)\n for (let i = 0; i < count; i++) {\n const t = easing(i / count)\n const angle = Utils.lerpAngles(startAngle, endAngle, t)\n points.push(Vec.toFixed(Vec.nudgeAtAngle(center, angle, radius)))\n }\n const stroke = getStroke([startPoint, ...points, endPoint], {\n size: 1 + strokeWidth,\n thinning: 0.618 + getRandom() * 0.2,\n easing: EASINGS.easeOutQuad,\n simulatePressure: false,\n streamline: 0,\n last: true,\n })\n return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getCtp(start: number[], bend: number[], end: number[]) {\n return Utils.circleFromThreePoints(start, end, bend)\n}\n\nexport function getCurvedArrowHeadPoints(\n A: number[],\n r1: number,\n C: number[],\n r2: number,\n sweep: boolean\n) {\n const ints = intersectCircleCircle(A, r1 * 0.618, C, r2).points\n if (!ints) {\n TVDR.warn('Could not find an intersection for the arrow head.')\n return { left: A, right: A }\n }\n const int = sweep ? ints[0] : ints[1]\n const left = int ? Vec.nudge(Vec.rotWith(int, A, Math.PI / 6), A, r1 * -0.382) : A\n const right = int ? Vec.nudge(Vec.rotWith(int, A, -Math.PI / 6), A, r1 * -0.382) : A\n return { left, right }\n}\n\nexport function getStraightArrowHeadPoints(A: number[], B: number[], r: number) {\n const ints = intersectCircleLineSegment(A, r, A, B).points\n if (!ints) {\n TVDR.warn('Could not find an intersection for the arrow head.')\n return { left: A, right: A }\n }\n const int = ints[0]\n const left = int ? Vec.rotWith(int, A, Math.PI / 6) : A\n const right = int ? Vec.rotWith(int, A, -Math.PI / 6) : A\n return { left, right }\n}\n\nexport function getCurvedArrowHeadPath(\n A: number[],\n r1: number,\n C: number[],\n r2: number,\n sweep: boolean\n) {\n const { left, right } = getCurvedArrowHeadPoints(A, r1, C, r2, sweep)\n return `M ${left} L ${A} ${right}`\n}\n\nexport function getStraightArrowHeadPath(A: number[], B: number[], r: number) {\n const { left, right } = getStraightArrowHeadPoints(A, B, r)\n return `M ${left} L ${A} ${right}`\n}\n\nexport function getArrowPath(\n style: ShapeStyles,\n start: number[],\n bend: number[],\n end: number[],\n decorationStart: Decoration | undefined,\n decorationEnd: Decoration | undefined\n) {\n const { strokeWidth } = getShapeStyle(style, false)\n const arrowDist = Vec.dist(start, end)\n const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n const path: (string | number)[] = []\n const isStraightLine = Vec.dist(bend, Vec.toFixed(Vec.med(start, end))) < 1\n if (isStraightLine) {\n path.push(`M ${start} L ${end}`)\n if (decorationStart) {\n path.push(getStraightArrowHeadPath(start, end, arrowHeadLength))\n }\n if (decorationEnd) {\n path.push(getStraightArrowHeadPath(end, start, arrowHeadLength))\n }\n } else {\n const circle = getCtp(start, bend, end)\n const center = [circle[0], circle[1]]\n const radius = circle[2]\n const length = getArcLength(center, radius, start, end)\n path.push(`M ${start} A ${radius} ${radius} 0 0 ${length > 0 ? '1' : '0'} ${end}`)\n if (decorationStart)\n path.push(getCurvedArrowHeadPath(start, arrowHeadLength, center, radius, length < 0))\n if (decorationEnd) {\n path.push(getCurvedArrowHeadPath(end, arrowHeadLength, center, radius, length >= 0))\n }\n }\n return path.join(' ')\n}\n\nexport function getArcPoints(start: number[], bend: number[], end: number[]) {\n if (Vec.dist2(bend, Vec.med(start, end)) <= 4) return [start, end]\n // The arc is curved; calculate twenty points along the arc\n const points: number[][] = []\n const circle = getCtp(start, bend, end)\n const center = [circle[0], circle[1]]\n const radius = circle[2]\n const startAngle = Vec.angle(center, start)\n const endAngle = Vec.angle(center, end)\n for (let i = 0; i < 20; i++) {\n const t = i / 19\n const angle = Utils.lerpAngles(startAngle, endAngle, t)\n points.push(Vec.nudgeAtAngle(center, angle, radius))\n }\n return points\n}\n\nexport function isAngleBetween(a: number, b: number, c: number): boolean {\n if (c === a || c === b) return true\n const PI2 = Math.PI * 2\n const AB = (b - a + PI2) % PI2\n const AC = (c - a + PI2) % PI2\n return AB <= Math.PI !== AC > AB\n}\n\nexport function getArcLength(C: number[], r: number, A: number[], B: number[]): number {\n const sweep = Utils.getSweep(C, A, B)\n return r * (2 * Math.PI) * (sweep / (2 * Math.PI))\n}\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { EASINGS } from '~constants'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { Decoration, ShapeStyles } from '~types'\nimport {\n getArcLength,\n getArrowArcPath,\n getCtp,\n getCurvedArrowHeadPoints,\n renderCurvedFreehandArrowShaft,\n} from '../arrowHelpers'\nimport { Arrowhead } from './ArrowHead'\n\ninterface ArrowSvgProps {\n id: string\n style: ShapeStyles\n start: number[]\n bend: number[]\n end: number[]\n arrowBend: number\n decorationStart: Decoration | undefined\n decorationEnd: Decoration | undefined\n isDarkMode: boolean\n isDraw: boolean\n}\n\nexport const CurvedArrow = React.memo(function CurvedArrow({\n id,\n style,\n start,\n bend,\n end,\n arrowBend,\n decorationStart,\n decorationEnd,\n isDraw,\n isDarkMode,\n}: ArrowSvgProps) {\n const arrowDist = Vec.dist(start, end)\n if (arrowDist < 2) return null\n const styles = getShapeStyle(style, isDarkMode)\n const { strokeWidth } = styles\n const sw = 1 + strokeWidth * 1.618\n // Calculate a path as a segment of a circle passing through the three points start, bend, and end\n const circle = getCtp(start, bend, end)\n const center = [circle[0], circle[1]]\n const radius = circle[2]\n const length = getArcLength(center, radius, start, end)\n const getRandom = Utils.rng(id)\n const easing = EASINGS[getRandom() > 0 ? 'easeInOutSine' : 'easeInOutCubic']\n const path = isDraw\n ? renderCurvedFreehandArrowShaft(\n id,\n style,\n start,\n end,\n decorationStart,\n decorationEnd,\n center,\n radius,\n length,\n easing\n )\n : getArrowArcPath(start, end, circle, arrowBend)\n const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n Math.abs(length),\n sw,\n style.dash,\n 2,\n false\n )\n // Arrowheads\n const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n const startArrowHead = decorationStart\n ? getCurvedArrowHeadPoints(start, arrowHeadLength, center, radius, length < 0)\n : null\n const endArrowHead = decorationEnd\n ? getCurvedArrowHeadPoints(end, arrowHeadLength, center, radius, length >= 0)\n : null\n return (\n <>\n <path className=\"tv-stroke-hitarea\" d={path} />\n <path\n d={path}\n fill={isDraw ? styles.stroke : 'none'}\n stroke={styles.stroke}\n strokeWidth={isDraw ? 0 : sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />\n {startArrowHead && (\n <Arrowhead\n left={startArrowHead.left}\n middle={start}\n right={startArrowHead.right}\n stroke={styles.stroke}\n strokeWidth={sw}\n />\n )}\n {endArrowHead && (\n <Arrowhead\n left={endArrowHead.left}\n middle={end}\n right={endArrowHead.right}\n stroke={styles.stroke}\n strokeWidth={sw}\n />\n )}\n </>\n )\n})\n", "import * as React from 'react'\n\nexport interface ArrowheadProps {\n left: number[]\n middle: number[]\n right: number[]\n stroke: string\n strokeWidth: number\n}\n\nexport function Arrowhead({ left, middle, right, stroke, strokeWidth }: ArrowheadProps) {\n return (\n <g>\n <path className=\"tv-stroke-hitarea\" d={`M ${left} L ${middle} ${right}`} />\n <path\n d={`M ${left} L ${middle} ${right}`}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />\n </g>\n )\n}\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { Decoration, ShapeStyles } from '~types'\nimport { getStraightArrowHeadPoints, renderFreehandArrowShaft } from '../arrowHelpers'\nimport { Arrowhead } from './ArrowHead'\n\ninterface ArrowSvgProps {\n id: string\n style: ShapeStyles\n start: number[]\n bend: number[]\n end: number[]\n arrowBend: number\n decorationStart: Decoration | undefined\n decorationEnd: Decoration | undefined\n isDarkMode: boolean\n isDraw: boolean\n}\n\nexport const StraightArrow = React.memo(function StraightArrow({\n id,\n style,\n start,\n end,\n decorationStart,\n decorationEnd,\n isDraw,\n isDarkMode,\n}: ArrowSvgProps) {\n const arrowDist = Vec.dist(start, end)\n if (arrowDist < 2) return null\n const styles = getShapeStyle(style, isDarkMode)\n const { strokeWidth } = styles\n const sw = 1 + strokeWidth * 1.618\n // Path between start and end points\n const path = isDraw\n ? renderFreehandArrowShaft(id, style, start, end, decorationStart, decorationEnd)\n : 'M' + Vec.toFixed(start) + 'L' + Vec.toFixed(end)\n const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n arrowDist,\n strokeWidth * 1.618,\n style.dash,\n 2,\n false\n )\n // Arrowheads\n const arrowHeadLength = Math.min(arrowDist / 3, strokeWidth * 8)\n const startArrowHead = decorationStart\n ? getStraightArrowHeadPoints(start, end, arrowHeadLength)\n : null\n const endArrowHead = decorationEnd\n ? getStraightArrowHeadPoints(end, start, arrowHeadLength)\n : null\n return (\n <>\n <path className=\"tv-stroke-hitarea\" d={path} />\n <path\n d={path}\n fill={styles.stroke}\n stroke={styles.stroke}\n strokeWidth={isDraw ? sw / 2 : sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents=\"stroke\"\n />\n {startArrowHead && (\n <Arrowhead\n left={startArrowHead.left}\n middle={start}\n right={startArrowHead.right}\n stroke={styles.stroke}\n strokeWidth={sw}\n />\n )}\n {endArrowHead && (\n <Arrowhead\n left={endArrowHead.left}\n middle={end}\n right={endArrowHead.right}\n stroke={styles.stroke}\n strokeWidth={sw}\n />\n )}\n </>\n )\n})\n", "import * as React from 'react'\nimport { SVGContainer, TLBounds, Utils } from 'telva-core'\nimport {\n intersectBoundsBounds,\n intersectBoundsPolyline,\n intersectLineSegmentBounds,\n intersectLineSegmentLineSegment,\n} from 'telva-intersect'\nimport { Vec } from 'telva-vec'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport { defaultStyle, getShapeStyle } from '~state/shapes/shared'\nimport { useGradientFill } from '~state/shapes/shared/gradient-fill'\nimport { DashStyle, DrawShape, TVMeta, TVShapeType, TransformInfo } from '~types'\nimport {\n getDrawStrokePathTDSnapshot,\n getFillPath,\n getSolidStrokePathTDSnapshot,\n getStraightFillPath,\n getStraightStrokePath,\n} from './drawHelpers'\n\ntype T = DrawShape\ntype E = SVGSVGElement\n\nexport class DrawUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Draw as const\n\n pointsBoundsCache = new WeakMap<T['points'], TLBounds>([])\n\n shapeBoundsCache = new Map<string, TLBounds>()\n\n rotatedCache = new WeakMap<T, number[][]>([])\n\n pointCache: Record<string, number[]> = {}\n\n canClone = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Draw,\n name: 'Draw',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n rotation: 0,\n style: defaultStyle,\n points: [],\n isComplete: false,\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, meta, isSelected, isGhost, events }, ref) => {\n const { points, style, isComplete } = shape\n const isStraight = meta.canvasMode === 'straight'\n const isNodeEditing = meta.nodeEditingId === shape.id\n\n // \u2500\u2500 All hooks must be called before any conditional return \u2500\u2500\n const app = useTelvaApp()\n const dragRef = React.useRef<{ nodeIdx: number } | null>(null)\n const [hoveredNode, setHoveredNode] = React.useState<number | null>(null)\n\n const screenToLocal = React.useCallback(\n (clientX: number, clientY: number) => {\n return Vec.sub(app.getPagePoint([clientX, clientY]), shape.point)\n },\n [app, shape.point]\n )\n\n const commitNodeMove = React.useCallback(\n (newPts: number[][]) => {\n if (newPts.length === 0) return\n const minX = Math.min(...newPts.map((p) => p[0]))\n const minY = Math.min(...newPts.map((p) => p[1]))\n const normalized = newPts.map(([x, y, pr]) => [\n +((x - minX) as number).toFixed(2),\n +((y - minY) as number).toFixed(2),\n pr ?? 0.5,\n ])\n const newShapePoint = Vec.add(shape.point, [minX, minY])\n app.updateShapes({ id: shape.id, point: newShapePoint, points: normalized })\n },\n [app, shape.id, shape.point]\n )\n\n const polygonPathTDSnapshot = React.useMemo(() => {\n if (isStraight) return getStraightFillPath(shape)\n return getFillPath(shape)\n }, [points, style.size, isStraight, (style as any).strokeWidthOverride])\n\n const pathTDSnapshot = React.useMemo(() => {\n if (isStraight) {\n return getStraightStrokePath(shape)\n }\n return style.dash === DashStyle.Draw\n ? getDrawStrokePathTDSnapshot(shape)\n : getSolidStrokePathTDSnapshot(shape)\n }, [\n points,\n style.size,\n style.dash,\n isComplete,\n isStraight,\n (style as any).strokeWidthOverride,\n ])\n\n const styles = getShapeStyle(style, meta.isDarkMode)\n const { stroke, fill, strokeWidth, opacity: shapeOpacity } = styles\n const { defs, gradFill } = useGradientFill(shape.id, style)\n const activeFill = gradFill ?? fill\n\n // \u2500\u2500 Node editing overlay \u2500\u2500\n const zoom = app.zoom ?? 1\n const nodeOverlay = React.useMemo(() => {\n if (!isNodeEditing || points.length < 1) return null\n\n const r = 5 / zoom\n const rmid = 3.5 / zoom\n\n const nodeHandles = points.map((pt: number[], i: number) => (\n <circle\n key={`n-${i}`}\n cx={pt[0]}\n cy={pt[1]}\n r={hoveredNode === i ? r * 1.4 : r}\n fill={hoveredNode === i ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={1.5 / zoom}\n style={{ cursor: 'move', pointerEvents: 'all' }}\n onPointerEnter={() => setHoveredNode(i)}\n onPointerLeave={() => setHoveredNode(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n dragRef.current = { nodeIdx: i }\n }}\n onPointerMove={(e) => {\n if (!dragRef.current || dragRef.current.nodeIdx !== i) return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const np = [...points]\n np[i] = [local[0], local[1], points[i][2] ?? 0.5]\n app.patchState({\n document: {\n pages: {\n [app.currentPageId]: {\n shapes: { [shape.id]: { points: np } },\n },\n },\n },\n })\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const np = [...points]\n np[i] = [local[0], local[1], points[i][2] ?? 0.5]\n dragRef.current = null\n commitNodeMove(np)\n }}\n />\n ))\n\n const midHandles = points.slice(0, -1).map((pt: number[], i: number) => {\n const next = points[i + 1]\n const mx = (pt[0] + next[0]) / 2\n const my = (pt[1] + next[1]) / 2\n return (\n <circle\n key={`m-${i}`}\n cx={mx}\n cy={my}\n r={rmid}\n fill=\"white\"\n stroke=\"#0D99FF\"\n strokeWidth={1 / zoom}\n strokeDasharray={`${2 / zoom} ${2 / zoom}`}\n style={{ cursor: 'crosshair', pointerEvents: 'all' }}\n onPointerDown={(e) => {\n e.stopPropagation()\n const newPt: number[] = [mx, my, 0.5]\n const np = [...points.slice(0, i + 1), newPt, ...points.slice(i + 1)]\n app.updateShapes({ id: shape.id, points: np })\n }}\n />\n )\n })\n\n return (\n <g style={{ pointerEvents: 'none' }}>\n {/* connector lines */}\n {points.slice(0, -1).map((pt: number[], i: number) => (\n <line\n key={`l-${i}`}\n x1={pt[0]}\n y1={pt[1]}\n x2={points[i + 1][0]}\n y2={points[i + 1][1]}\n stroke=\"#0D99FF\"\n strokeWidth={1 / zoom}\n strokeOpacity={0.4}\n pointerEvents=\"none\"\n />\n ))}\n {midHandles}\n {nodeHandles}\n </g>\n )\n }, [isNodeEditing, points, zoom, hoveredNode, shape.id, app.currentPageId])\n\n // \u2500\u2500 Render \u2500\u2500\n const bounds = this.getBounds(shape)\n const verySmall = bounds.width <= strokeWidth / 2 && bounds.height <= strokeWidth / 2\n\n if (verySmall) {\n const sw = 1 + strokeWidth\n return (\n <SVGContainer ref={ref} id={shape.id + '_svg'} {...events}>\n {defs}\n <circle\n r={sw}\n fill={stroke}\n stroke={stroke}\n pointerEvents=\"all\"\n opacity={isGhost ? GHOSTED_OPACITY : shapeOpacity}\n />\n </SVGContainer>\n )\n }\n\n const shouldFill =\n style.isFilled &&\n points.length > 3 &&\n Vec.dist(points[0], points[points.length - 1]) < strokeWidth * 2\n\n const svgOverflowStyle = isNodeEditing ? { overflow: 'visible' as const } : undefined\n\n if (!isStraight && shape.style.dash === DashStyle.Draw) {\n return (\n <SVGContainer ref={ref} id={shape.id + '_svg'} {...events} style={svgOverflowStyle}>\n {defs}\n <g opacity={isGhost ? GHOSTED_OPACITY : shapeOpacity}>\n <path\n className={shouldFill || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n d={pathTDSnapshot}\n />\n {shouldFill && (\n <path\n d={polygonPathTDSnapshot}\n stroke=\"none\"\n fill={activeFill}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n )}\n <path\n d={pathTDSnapshot}\n fill={stroke}\n stroke={stroke}\n strokeWidth={strokeWidth / 2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n </g>\n {nodeOverlay}\n </SVGContainer>\n )\n }\n\n const strokeDasharray = isStraight\n ? 'none'\n : {\n [DashStyle.Draw]: 'none',\n [DashStyle.Solid]: `none`,\n [DashStyle.Dotted]: `0.1 ${strokeWidth * 4}`,\n [DashStyle.Dashed]: `${strokeWidth * 4} ${strokeWidth * 4}`,\n }[style.dash as DashStyle]\n\n const strokeDashoffset = isStraight\n ? 'none'\n : {\n [DashStyle.Draw]: 'none',\n [DashStyle.Solid]: `none`,\n [DashStyle.Dotted]: `0`,\n [DashStyle.Dashed]: `0`,\n }[style.dash as DashStyle]\n\n const sw = 1 + strokeWidth * 1.5\n\n return (\n <SVGContainer ref={ref} id={shape.id + '_svg'} {...events} style={svgOverflowStyle}>\n {defs}\n <g opacity={isGhost ? GHOSTED_OPACITY : shapeOpacity}>\n <path\n className={shouldFill && isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n d={pathTDSnapshot}\n />\n <path\n d={pathTDSnapshot}\n fill={shouldFill ? activeFill : 'none'}\n stroke=\"none\"\n strokeWidth={Math.min(4, strokeWidth * 2)}\n strokeLinejoin={isStraight ? 'miter' : 'round'}\n strokeLinecap={isStraight ? 'square' : 'round'}\n pointerEvents=\"none\"\n />\n <path\n d={pathTDSnapshot}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n strokeLinejoin={isStraight ? 'miter' : 'round'}\n strokeLinecap={isStraight ? 'square' : 'round'}\n pointerEvents=\"none\"\n />\n </g>\n {nodeOverlay}\n </SVGContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const { points } = shape\n\n const pathTDSnapshot = React.useMemo(() => {\n return getSolidStrokePathTDSnapshot(shape)\n }, [points, shape.style.size, shape.style.strokeWidthOverride])\n\n const bounds = this.getBounds(shape)\n\n const verySmall = bounds.width < 4 && bounds.height < 4\n\n if (verySmall) {\n return <circle x={bounds.width / 2} y={bounds.height / 2} r={1} />\n }\n\n return <path d={pathTDSnapshot} />\n })\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { initialShape, scaleX, scaleY }: TransformInfo<T>\n ): Partial<T> => {\n const initialShapeBounds = Utils.getFromCache(this.boundsCache, initialShape, () =>\n Utils.getBoundsFromPoints(initialShape.points)\n )\n\n const points = initialShape.points.map(([x, y, r]) => {\n return [\n bounds.width *\n (scaleX < 0 // * sin?\n ? 1 - x / initialShapeBounds.width\n : x / initialShapeBounds.width),\n bounds.height *\n (scaleY < 0 // * cos?\n ? 1 - y / initialShapeBounds.height\n : y / initialShapeBounds.height),\n r,\n ]\n })\n\n const newBounds = Utils.getBoundsFromPoints(shape.points)\n\n const point = Vec.sub([bounds.minX, bounds.minY], [newBounds.minX, newBounds.minY])\n\n return {\n points,\n point,\n }\n }\n\n getBounds = (shape: T) => {\n // The goal here is to avoid recalculating the bounds from the\n // points array, which is expensive. However, we still need a\n // new bounds if the point has changed, but we will reuse the\n // previous bounds-from-points result if we can.\n\n const pointsHaveChanged = !this.pointsBoundsCache.has(shape.points)\n const pointHasChanged = !(this.pointCache[shape.id] === shape.point)\n\n if (pointsHaveChanged) {\n // If the points have changed, then bust the points cache\n const bounds = Utils.getBoundsFromPoints(shape.points)\n this.pointsBoundsCache.set(shape.points, bounds)\n this.shapeBoundsCache.set(shape.id, Utils.translateBounds(bounds, shape.point))\n this.pointCache[shape.id] = shape.point\n } else if (pointHasChanged && !pointsHaveChanged) {\n // If the point have has changed, then bust the point cache\n this.pointCache[shape.id] = shape.point\n this.shapeBoundsCache.set(\n shape.id,\n Utils.translateBounds(this.pointsBoundsCache.get(shape.points)!, shape.point)\n )\n }\n\n return this.shapeBoundsCache.get(shape.id)!\n }\n\n shouldRender = (prev: T, next: T) => {\n return (\n next.points !== prev.points ||\n next.style !== prev.style ||\n next.isComplete !== prev.isComplete\n )\n }\n\n hitTestPoint = (shape: T, point: number[]) => {\n const ptA = Vec.sub(point, shape.point)\n return Utils.pointInPolyline(ptA, shape.points)\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n const { points, point } = shape\n const ptA = Vec.sub(A, point)\n const ptB = Vec.sub(B, point)\n const bounds = this.getBounds(shape)\n\n if (bounds.width < 8 && bounds.height < 8) {\n return Vec.distanceToLineSegment(A, B, Utils.getBoundsCenter(bounds)) < 5 // divide by zoom\n }\n\n if (intersectLineSegmentBounds(ptA, ptB, bounds)) {\n for (let i = 1; i < points.length; i++) {\n if (intersectLineSegmentLineSegment(points[i - 1], points[i], ptA, ptB).didIntersect) {\n return true\n }\n }\n }\n\n return false\n }\n\n hitTestBounds = (shape: T, bounds: TLBounds) => {\n // Test axis-aligned shape\n if (!shape.rotation) {\n const shapeBounds = this.getBounds(shape)\n\n return (\n Utils.boundsContain(bounds, shapeBounds) ||\n ((Utils.boundsContain(shapeBounds, bounds) ||\n intersectBoundsBounds(shapeBounds, bounds).length > 0) &&\n intersectBoundsPolyline(Utils.translateBounds(bounds, Vec.neg(shape.point)), shape.points)\n .length > 0)\n )\n }\n\n // Test rotated shape\n const rBounds = this.getRotatedBounds(shape)\n\n const rotatedBounds = Utils.getFromCache(this.rotatedCache, shape, () => {\n const c = Utils.getBoundsCenter(Utils.getBoundsFromPoints(shape.points))\n return shape.points.map((pt) => Vec.rotWith(pt, c, shape.rotation || 0))\n })\n\n return (\n Utils.boundsContain(bounds, rBounds) ||\n intersectBoundsPolyline(Utils.translateBounds(bounds, Vec.neg(shape.point)), rotatedBounds)\n .length > 0\n )\n }\n}\n", "import * as React from 'react'\nimport type { ShapeStyles } from '~types'\n\n/**\n * Returns SVG <defs> element for a gradient defined in style.gradient,\n * and an SVG fill string to reference it.\n */\nexport function useGradientFill(\n id: string,\n style: ShapeStyles\n): { defs: React.ReactElement | null; gradFill: string | null } {\n const g = style.gradient\n if (!g || !style.isFilled || !g.stops || g.stops.length < 2) {\n return { defs: null, gradFill: null }\n }\n\n const gradId = `grad-${id}`\n\n const stops = g.stops.map((s, i) => (\n <stop key={i} offset={`${s.position}%`} stopColor={s.color} stopOpacity={s.opacity} />\n ))\n\n if (g.type === 'linear') {\n const angleDeg = g.angle ?? 90\n // Convert angle to SVG x1/y1 x2/y2 coordinates\n const rad = ((angleDeg - 90) * Math.PI) / 180\n const cos = Math.cos(rad)\n const sin = Math.sin(rad)\n const x1 = 50 - cos * 50\n const y1 = 50 - sin * 50\n const x2 = 50 + cos * 50\n const y2 = 50 + sin * 50\n const defs = (\n <defs>\n <linearGradient\n id={gradId}\n x1={`${x1}%`}\n y1={`${y1}%`}\n x2={`${x2}%`}\n y2={`${y2}%`}\n gradientUnits=\"objectBoundingBox\"\n >\n {stops}\n </linearGradient>\n </defs>\n )\n return { defs, gradFill: `url(#${gradId})` }\n }\n\n if (g.type === 'radial') {\n const cx = (g.centerX ?? 50) / 100\n const cy = (g.centerY ?? 50) / 100\n const defs = (\n <defs>\n <radialGradient id={gradId} cx={cx} cy={cy} r=\"0.5\" gradientUnits=\"objectBoundingBox\">\n {stops}\n </radialGradient>\n </defs>\n )\n return { defs, gradFill: `url(#${gradId})` }\n }\n\n // 'conic' / 'diamond' \u2013 approximate as linear\n const defs = (\n <defs>\n <linearGradient\n id={gradId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"100%\"\n gradientUnits=\"objectBoundingBox\"\n >\n {stops}\n </linearGradient>\n </defs>\n )\n return { defs, gradFill: `url(#${gradId})` }\n}\n", "import {\n StrokeOptions,\n StrokePoint,\n getStrokeOutlinePoints,\n getStrokePoints,\n} from 'perfect-freehand'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { DrawShape } from '~types'\n\nconst simulatePressureSettings: StrokeOptions = {\n easing: (t) => Math.sin((t * Math.PI) / 2),\n simulatePressure: true,\n}\n\nconst realPressureSettings: StrokeOptions = {\n easing: (t) => t * t,\n simulatePressure: false,\n}\n\nexport function getFreehandOptions(shape: DrawShape) {\n const styles = getShapeStyle(shape.style)\n\n const options: StrokeOptions = {\n size: 1 + styles.strokeWidth * 1.5,\n thinning: 0.7,\n streamline: 0.35,\n smoothing: 0.5,\n ...(shape.points[1][2] === 0.5 ? simulatePressureSettings : realPressureSettings),\n last: shape.isComplete,\n }\n\n return options\n}\n\nexport function getFillPath(shape: DrawShape) {\n if (shape.points.length < 2) return ''\n\n return Utils.getSvgPathFromStroke(\n getStrokePoints(shape.points, getFreehandOptions(shape)).map((pt) => pt.point)\n )\n}\n\nexport function getDrawStrokePoints(shape: DrawShape, options: StrokeOptions) {\n return getStrokePoints(shape.points, options)\n}\n\n/**\n * Get path data for a stroke with the DashStyle.Draw dash style.\n */\nexport function getDrawStrokePathTDSnapshot(shape: DrawShape) {\n if (shape.points.length < 2) return ''\n const options = getFreehandOptions(shape)\n const strokePoints = getDrawStrokePoints(shape, options)\n const path = Utils.getSvgPathFromStroke(getStrokeOutlinePoints(strokePoints, options))\n return path\n}\n\n/**\n * Get SVG path data for a shape that has a DashStyle other than DashStyles.Draw.\n */\nexport function getSolidStrokePathTDSnapshot(shape: DrawShape) {\n const { points } = shape\n if (points.length < 2) return 'M 0 0 L 0 0'\n const options = getFreehandOptions(shape)\n const strokePoints = getDrawStrokePoints(shape, options)\n const last = points[points.length - 1]\n if (!Vec.isEqual(strokePoints[0].point, last)) strokePoints.push({ point: last } as StrokePoint)\n const path = Utils.getSvgPathFromStrokePoints(strokePoints)\n return path\n}\n\n/**\n * Get SVG path data for straight-line mode.\n * Simplifies the freehand points into clean line segments.\n */\nexport function getStraightStrokePath(shape: DrawShape) {\n const { points } = shape\n if (points.length < 2) return 'M 0 0 L 0 0'\n\n // Simplify the points using Ramer-Douglas-Peucker algorithm\n const simplified = simplifyPoints(points, 3)\n\n if (simplified.length < 2) {\n return `M ${points[0][0]} ${points[0][1]} L ${points[points.length - 1][0]} ${\n points[points.length - 1][1]\n }`\n }\n\n let path = `M ${simplified[0][0].toFixed(2)} ${simplified[0][1].toFixed(2)}`\n for (let i = 1; i < simplified.length; i++) {\n path += ` L ${simplified[i][0].toFixed(2)} ${simplified[i][1].toFixed(2)}`\n }\n\n return path\n}\n\n/**\n * Get fill path for straight mode.\n */\nexport function getStraightFillPath(shape: DrawShape) {\n const { points } = shape\n if (points.length < 3) return ''\n\n const simplified = simplifyPoints(points, 3)\n if (simplified.length < 3) return ''\n\n let path = `M ${simplified[0][0].toFixed(2)} ${simplified[0][1].toFixed(2)}`\n for (let i = 1; i < simplified.length; i++) {\n path += ` L ${simplified[i][0].toFixed(2)} ${simplified[i][1].toFixed(2)}`\n }\n path += ' Z'\n\n return path\n}\n\n/**\n * Ramer-Douglas-Peucker line simplification.\n */\nexport function simplifyPoints(points: number[][], tolerance: number): number[][] {\n if (points.length <= 2) return points\n\n let maxDist = 0\n let maxIndex = 0\n\n const first = points[0]\n const last = points[points.length - 1]\n\n for (let i = 1; i < points.length - 1; i++) {\n const dist = perpendicularDistance(points[i], first, last)\n if (dist > maxDist) {\n maxDist = dist\n maxIndex = i\n }\n }\n\n if (maxDist > tolerance) {\n const left = simplifyPoints(points.slice(0, maxIndex + 1), tolerance)\n const right = simplifyPoints(points.slice(maxIndex), tolerance)\n return [...left.slice(0, -1), ...right]\n }\n\n return [first, last]\n}\n\nfunction perpendicularDistance(point: number[], lineStart: number[], lineEnd: number[]): number {\n const dx = lineEnd[0] - lineStart[0]\n const dy = lineEnd[1] - lineStart[1]\n const mag = Math.sqrt(dx * dx + dy * dy)\n if (mag === 0) return Vec.dist(point, lineStart)\n const u = ((point[0] - lineStart[0]) * dx + (point[1] - lineStart[1]) * dy) / (mag * mag)\n const closest = [lineStart[0] + u * dx, lineStart[1] + u * dy]\n return Vec.dist(point, closest)\n}\n", "import * as React from 'react'\nimport { SVGContainer, TLBounds, Utils } from 'telva-core'\nimport {\n intersectEllipseBounds,\n intersectLineSegmentEllipse,\n intersectRayEllipse,\n} from 'telva-intersect'\nimport { Vec } from 'telva-vec'\nimport { GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport { TextLabel, defaultStyle, getFontStyle, getShapeStyle } from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { DashStyle, EllipseShape, TVMeta, TVShape, TVShapeType, TransformInfo } from '~types'\nimport { DashedEllipse } from './components/DashedEllipse'\nimport { DrawEllipse } from './components/DrawEllipse'\nimport { getEllipseIndicatorPath } from './ellipseHelpers'\n\ntype T = EllipseShape\ntype E = HTMLDivElement\ntype M = TVMeta\n\nexport class EllipseUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Ellipse as const\n\n canBind = true\n\n canClone = true\n\n canEdit = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Ellipse,\n name: 'Ellipse',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n radius: [1, 1],\n rotation: 0,\n style: defaultStyle,\n label: '',\n labelPoint: [0.5, 0.5],\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n (\n {\n shape,\n isGhost,\n isSelected,\n isBinding,\n isEditing,\n meta,\n bounds,\n events,\n onShapeChange,\n onShapeBlur,\n },\n ref\n ) => {\n const { id, radius, style, label = '', labelPoint = LABEL_POINT } = shape\n const font = getFontStyle(shape.style)\n const styles = getShapeStyle(style, meta.isDarkMode)\n const strokeWidth = styles.strokeWidth\n const sw = 1 + strokeWidth * 1.618\n const rx = Math.max(0, radius[0] - sw / 2)\n const ry = Math.max(0, radius[1] - sw / 2)\n const isStraight = meta.canvasMode === 'straight'\n const Component = !isStraight && style.dash === DashStyle.Draw ? DrawEllipse : DashedEllipse\n const handleLabelChange = React.useCallback(\n (label: string) => onShapeChange?.({ id, label }),\n [onShapeChange]\n )\n\n return (\n <FullWrapper ref={ref} {...events}>\n <TextLabel\n isEditing={isEditing}\n onChange={handleLabelChange}\n onBlur={onShapeBlur}\n font={font}\n text={label}\n color={style.labelColor ?? styles.stroke}\n background={style.labelBackground}\n textGradient={style.textGradient}\n offsetX={(labelPoint[0] - 0.5) * bounds.width}\n offsetY={(labelPoint[1] - 0.5) * bounds.height}\n width={Math.max(0, bounds.width * 0.707 - 16)}\n />\n <SVGContainer id={shape.id + '_svg'} opacity={isGhost ? GHOSTED_OPACITY : styles.opacity}>\n {isBinding && (\n <ellipse\n className=\"tv-binding-indicator\"\n cx={bounds.width / 2}\n cy={bounds.height / 2}\n rx={Math.max(0, bounds.width / 2)}\n ry={Math.max(0, bounds.height / 2)}\n strokeWidth={styles.strokeWidth}\n />\n )}\n <Component\n id={id}\n style={style}\n radius={radius}\n isSelected={isSelected}\n isDarkMode={meta.isDarkMode}\n />\n </SVGContainer>\n </FullWrapper>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T, M>(({ shape, meta }) => {\n const { id, radius, style } = shape\n const styles = getShapeStyle(style)\n const strokeWidth = styles.strokeWidth\n const sw = 1 + strokeWidth * 1.618\n const rx = Math.max(0, radius[0] - sw / 2)\n const ry = Math.max(0, radius[1] - sw / 2)\n const isStraight = (meta as TVMeta)?.canvasMode === 'straight'\n return !isStraight && style.dash === DashStyle.Draw ? (\n <path d={getEllipseIndicatorPath(id, radius, style)} />\n ) : (\n <ellipse cx={radius[0]} cy={radius[1]} rx={rx} ry={ry} />\n )\n })\n\n hitTestPoint = (shape: T, point: number[]): boolean => {\n return (\n Utils.pointInBounds(point, this.getRotatedBounds(shape)) &&\n Utils.pointInEllipse(\n point,\n this.getCenter(shape),\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0\n )\n )\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n return intersectLineSegmentEllipse(\n A,\n B,\n this.getCenter(shape),\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0\n ).didIntersect\n }\n\n getBounds = (shape: T) => {\n return Utils.getFromCache(this.boundsCache, shape, () => {\n return Utils.getRotatedEllipseBounds(\n shape.point[0],\n shape.point[1],\n shape.radius[0],\n shape.radius[1],\n 0\n )\n })\n }\n\n getRotatedBounds = (shape: T): TLBounds => {\n return Utils.getRotatedEllipseBounds(\n shape.point[0],\n shape.point[1],\n shape.radius[0],\n shape.radius[1],\n shape.rotation\n )\n }\n\n hitTestBounds = (shape: T, bounds: TLBounds): boolean => {\n const shapeBounds = this.getBounds(shape)\n\n return (\n Utils.boundsContained(shapeBounds, bounds) ||\n intersectEllipseBounds(\n this.getCenter(shape),\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0,\n bounds\n ).length > 0\n )\n }\n\n shouldRender = (prev: T, next: T): boolean => {\n return next.radius !== prev.radius || next.style !== prev.style || next.label !== prev.label\n }\n\n getCenter = (shape: T): number[] => {\n return Vec.add(shape.point, shape.radius)\n }\n\n getBindingPoint = <K extends TVShape>(\n shape: T,\n fromShape: K,\n point: number[],\n origin: number[],\n direction: number[],\n bindAnywhere: boolean\n ) => {\n {\n const expandedBounds = this.getExpandedBounds(shape)\n const center = this.getCenter(shape)\n let bindingPoint: number[]\n let distance: number\n if (\n !Utils.pointInEllipse(\n point,\n center,\n shape.radius[0] + this.bindingDistance,\n shape.radius[1] + this.bindingDistance\n )\n ) {\n return\n }\n if (bindAnywhere) {\n if (Vec.dist(point, this.getCenter(shape)) < 12) {\n bindingPoint = [0.5, 0.5]\n } else {\n bindingPoint = Vec.divV(Vec.sub(point, [expandedBounds.minX, expandedBounds.minY]), [\n expandedBounds.width,\n expandedBounds.height,\n ])\n }\n distance = 0\n } else {\n let intersection = intersectRayEllipse(\n origin,\n direction,\n center,\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0\n ).points.sort((a, b) => Vec.dist(a, origin) - Vec.dist(b, origin))[0]\n if (!intersection) {\n intersection = intersectLineSegmentEllipse(\n point,\n center,\n center,\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0\n ).points.sort((a, b) => Vec.dist(a, point) - Vec.dist(b, point))[0]\n }\n if (!intersection) {\n return undefined\n }\n // The anchor is a point between the handle and the intersection\n const anchor = Vec.med(point, intersection)\n if (Vec.distanceToLineSegment(point, anchor, this.getCenter(shape)) < 12) {\n // If we're close to the center, snap to the center\n bindingPoint = [0.5, 0.5]\n } else {\n // Or else calculate a normalized point\n bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n expandedBounds.width,\n expandedBounds.height,\n ])\n }\n if (\n Utils.pointInEllipse(point, center, shape.radius[0], shape.radius[1], shape.rotation || 0)\n ) {\n // Pad the arrow out by 16 points\n distance = this.bindingDistance / 2\n } else {\n // Find the distance between the point and the ellipse\n const innerIntersection = intersectLineSegmentEllipse(\n point,\n center,\n center,\n shape.radius[0],\n shape.radius[1],\n shape.rotation || 0\n ).points[0]\n if (!innerIntersection) return undefined\n distance = Math.max(this.bindingDistance / 2, Vec.dist(point, innerIntersection))\n }\n }\n return {\n point: bindingPoint,\n distance,\n }\n }\n }\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { scaleX, scaleY, initialShape }: TransformInfo<T>\n ): Partial<T> => {\n const { rotation = 0 } = initialShape\n return {\n point: [bounds.minX, bounds.minY],\n radius: [bounds.width / 2, bounds.height / 2],\n rotation:\n (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0)\n ? -(rotation || 0)\n : rotation || 0,\n }\n }\n\n transformSingle = (shape: T, bounds: TLBounds): Partial<T> => {\n return {\n point: Vec.toFixed([bounds.minX, bounds.minY]),\n radius: Vec.div([bounds.width, bounds.height], 2),\n }\n }\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\n\ninterface EllipseSvgProps {\n id: string\n radius: number[]\n style: ShapeStyles\n isSelected: boolean\n isDarkMode: boolean\n}\n\nexport const DashedEllipse = React.memo(function DashedEllipse({\n id,\n radius,\n style,\n isSelected,\n isDarkMode,\n}: EllipseSvgProps) {\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n const sw = 1 + strokeWidth * 1.618\n const rx = Math.max(0, radius[0] - sw / 2)\n const ry = Math.max(0, radius[1] - sw / 2)\n const perimeter = Utils.perimeterOfEllipse(rx, ry)\n const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n perimeter < 64 ? perimeter * 2 : perimeter,\n strokeWidth * 1.618,\n style.dash,\n 4\n )\n\n return (\n <>\n {defs}\n <ellipse\n className={style.isFilled || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n cx={radius[0]}\n cy={radius[1]}\n rx={radius[0]}\n ry={radius[1]}\n />\n <ellipse\n cx={radius[0]}\n cy={radius[1]}\n rx={rx}\n ry={ry}\n fill={activeFill}\n stroke={stroke}\n strokeWidth={sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n pointerEvents=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </>\n )\n})\n", "import * as React from 'react'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getEllipseIndicatorPath, getEllipsePath } from '../ellipseHelpers'\n\ninterface EllipseSvgProps {\n id: string\n radius: number[]\n style: ShapeStyles\n isSelected: boolean\n isDarkMode: boolean\n}\n\nexport const DrawEllipse = React.memo(function DrawEllipse({\n id,\n radius,\n style,\n isSelected,\n isDarkMode,\n}: EllipseSvgProps) {\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n const innerPath = getEllipsePath(id, radius, style)\n\n return (\n <>\n {defs}\n <ellipse\n className={style.isFilled || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n cx={radius[0]}\n cy={radius[1]}\n rx={radius[0]}\n ry={radius[1]}\n />\n {style.isFilled && (\n <path\n d={getEllipseIndicatorPath(id, radius, style)}\n stroke=\"none\"\n fill={activeFill}\n pointerEvents=\"none\"\n />\n )}\n <path\n d={innerPath}\n fill={stroke}\n stroke={stroke}\n strokeWidth={strokeWidth}\n pointerEvents=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </>\n )\n})\n", "import { getStrokeOutlinePoints, getStrokePoints } from 'perfect-freehand'\nimport { Utils } from 'telva-core'\nimport { EASINGS } from '~constants'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\n\nexport function getEllipseStrokePoints(id: string, radius: number[], style: ShapeStyles) {\n const { strokeWidth } = getShapeStyle(style)\n const getRandom = Utils.rng(id)\n const rx = radius[0] + getRandom() * strokeWidth * 2\n const ry = radius[1] + getRandom() * strokeWidth * 2\n const perimeter = Utils.perimeterOfEllipse(rx, ry)\n const points: number[][] = []\n const start = Math.PI + Math.PI * getRandom()\n const extra = Math.abs(getRandom())\n const count = Math.max(16, perimeter / 10)\n for (let i = 0; i < count; i++) {\n const t = EASINGS.easeInOutSine(i / (count + 1))\n const rads = start * 2 + Math.PI * (2 + extra) * t\n const c = Math.cos(rads)\n const s = Math.sin(rads)\n points.push([rx * c + radius[0], ry * s + radius[1], t + 0.5 + getRandom() / 2])\n }\n return getStrokePoints(points, {\n size: 1 + strokeWidth * 2,\n thinning: 0.618,\n end: { taper: perimeter / 8 },\n start: { taper: perimeter / 12 },\n streamline: 0,\n simulatePressure: true,\n })\n}\n\nexport function getEllipsePath(id: string, radius: number[], style: ShapeStyles) {\n const { strokeWidth } = getShapeStyle(style)\n const getRandom = Utils.rng(id)\n const rx = radius[0] + getRandom() * strokeWidth * 2\n const ry = radius[1] + getRandom() * strokeWidth * 2\n const perimeter = Utils.perimeterOfEllipse(rx, ry)\n return Utils.getSvgPathFromStroke(\n getStrokeOutlinePoints(getEllipseStrokePoints(id, radius, style), {\n size: 2 + strokeWidth * 2,\n thinning: 0.618,\n end: { taper: perimeter / 8 },\n start: { taper: perimeter / 12 },\n streamline: 0,\n simulatePressure: true,\n })\n )\n}\n\nexport function getEllipseIndicatorPath(id: string, radius: number[], style: ShapeStyles) {\n return Utils.getSvgPathFromStrokePoints(getEllipseStrokePoints(id, radius, style))\n}\n", "import * as React from 'react'\nimport { SVGContainer, Utils } from 'telva-core'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport { defaultStyle, getBoundsRectangle } from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { ColorStyle, GroupShape, TVMeta, TVShapeType } from '~types'\n\ntype T = GroupShape\ntype E = SVGSVGElement\n\nexport class GroupUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Group as const\n\n canBind = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Group,\n name: 'Group',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [100, 100],\n rotation: 0,\n children: [],\n style: defaultStyle,\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, isBinding, isGhost, isHovered, isSelected, events }, ref) => {\n const { id, size } = shape\n\n const sw = 2\n const w = Math.max(0, size[0] - sw / 2)\n const h = Math.max(0, size[1] - sw / 2)\n\n const strokes: [number[], number[], number][] = [\n [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n [[w, sw / 2], [w, h], h - sw / 2],\n [[w, h], [sw / 2, h], w - sw / 2],\n [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n ]\n\n const paths = strokes.map(([start, end], i) => {\n return <line key={id + '_' + i} x1={start[0]} y1={start[1]} x2={end[0]} y2={end[1]} />\n })\n\n return (\n <SVGContainer ref={ref} {...events}>\n {isBinding && (\n <rect className=\"tv-binding-indicator\" strokeWidth={this.bindingDistance} />\n )}\n <g opacity={isGhost ? GHOSTED_OPACITY : 1}>\n <rect\n x={0}\n y={0}\n width={size[0]}\n height={size[1]}\n fill=\"transparent\"\n pointerEvents=\"all\"\n />\n <ScaledLines\n stroke={ColorStyle.Black}\n opacity={isHovered || isSelected ? 1 : 0}\n strokeLinecap=\"round\"\n pointerEvents=\"stroke\"\n >\n {paths}\n </ScaledLines>\n </g>\n </SVGContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const { id, size } = shape\n\n const sw = 2\n const w = Math.max(0, size[0] - sw / 2)\n const h = Math.max(0, size[1] - sw / 2)\n\n const strokes: [number[], number[], number][] = [\n [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n [[w, sw / 2], [w, h], h - sw / 2],\n [[w, h], [sw / 2, h], w - sw / 2],\n [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n ]\n\n const paths = strokes.map(([start, end], i) => {\n return <line key={id + '_' + i} x1={start[0]} y1={start[1]} x2={end[0]} y2={end[1]} />\n })\n\n return (\n <ScaledLines strokeLinecap=\"round\" pointerEvents=\"stroke\">\n {paths}\n </ScaledLines>\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style\n }\n}\n\nconst ScaledLines = styled('g', {\n strokeWidth: 'calc(1.5px * var(--tv-scale))',\n strokeDasharray: `calc(1px * var(--tv-scale)), calc(3px * var(--tv-scale))`,\n})\n", "import { styled } from '@stitches/react'\nimport * as React from 'react'\nimport { HTMLContainer, Utils } from 'telva-core'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n defaultStyle,\n getBoundsRectangle,\n transformRectangle,\n transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { ImageShape, TVImageAsset, TVMeta, TVShapeType } from '~types'\n\ntype T = ImageShape\ntype E = HTMLDivElement\n\nexport class ImageUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Image as const\n\n canBind = true\n\n canClone = true\n\n isAspectRatioLocked = true\n\n showCloneHandles = false\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'image',\n type: TVShapeType.Image,\n name: 'Image',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [1, 1],\n rotation: 0,\n style: { ...defaultStyle, isFilled: true },\n assetId: 'assetId',\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, asset = { src: '' }, isBinding, isGhost, meta, events, onShapeChange }, ref) => {\n const { size, style } = shape\n const { bindingDistance } = this\n\n const rImage = React.useRef<HTMLImageElement>(null)\n const rWrapper = React.useRef<HTMLDivElement>(null)\n\n React.useLayoutEffect(() => {\n const wrapper = rWrapper.current\n if (!wrapper) return\n const [width, height] = size\n wrapper.style.width = `${width}px`\n wrapper.style.height = `${height}px`\n }, [size])\n\n return (\n <HTMLContainer ref={ref} {...events}>\n {isBinding && (\n <div\n className=\"tv-binding-indicator\"\n style={{\n position: 'absolute',\n top: `calc(${-bindingDistance}px * var(--tv-zoom))`,\n left: `calc(${-bindingDistance}px * var(--tv-zoom))`,\n width: `calc(100% + ${bindingDistance * 2}px * var(--tv-zoom))`,\n height: `calc(100% + ${bindingDistance * 2}px * var(--tv-zoom))`,\n backgroundColor: 'var(--tv-selectFill)',\n }}\n />\n )}\n <Wrapper\n ref={rWrapper}\n isDarkMode={meta.isDarkMode} //\n isFilled={style.isFilled}\n isGhost={isGhost}\n >\n <ImageElement\n id={shape.id + '_image'}\n ref={rImage}\n src={(asset as TVImageAsset).src}\n alt=\"tl_image_asset\"\n draggable={false}\n />\n </Wrapper>\n </HTMLContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const {\n size: [width, height],\n } = shape\n\n return (\n <rect x={0} y={0} rx={2} ry={2} width={Math.max(1, width)} height={Math.max(1, height)} />\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style\n }\n\n transform = transformRectangle\n\n transformSingle = transformSingleRectangle\n\n getSvgElement = (shape: ImageShape) => {\n const bounds = this.getBounds(shape)\n const elm = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n elm.setAttribute('width', `${bounds.width}`)\n elm.setAttribute('height', `${bounds.height}`)\n elm.setAttribute('xmlns:xlink', `http://www.w3.org/1999/xlink`)\n return elm\n }\n}\n\nconst Wrapper = styled('div', {\n pointerEvents: 'all',\n position: 'relative',\n fontFamily: 'sans-serif',\n fontSize: '2em',\n height: '100%',\n width: '100%',\n borderRadius: '3px',\n perspective: '800px',\n overflow: 'hidden',\n p: {\n userSelect: 'none',\n },\n img: {\n userSelect: 'none',\n },\n variants: {\n isGhost: {\n false: { opacity: 1 },\n true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n },\n isFilled: {\n true: {},\n false: {},\n },\n isDarkMode: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n {\n isFilled: true,\n isDarkMode: true,\n css: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n },\n },\n {\n isFilled: true,\n isDarkMode: false,\n css: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16), 1px 1px 2px rgba(0,0,0,.16)',\n },\n },\n ],\n})\n\nconst ImageElement = styled('img', {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n maxWidth: '100%',\n minWidth: '100%',\n pointerEvents: 'none',\n objectFit: 'cover',\n userSelect: 'none',\n borderRadius: 2,\n})\n", "import * as React from 'react'\nimport { SVGContainer, TLBounds, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport { defaultStyle, getShapeStyle } from '~state/shapes/shared'\nimport { useGradientFill } from '~state/shapes/shared/gradient-fill'\nimport { DashStyle, PenSegment, PenShape, TVMeta, TVShapeType } from '~types'\nimport { getSegmentsBounds, mirrorHandle, segmentsToPath } from './penHelpers'\n\ntype T = PenShape\ntype E = SVGSVGElement\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Node editing drag state\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ntype DragTarget =\n | { kind: 'node'; idx: number }\n | { kind: 'cp1'; idx: number }\n | { kind: 'cp2'; idx: number }\n\nexport class PenUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Pen as const\n\n canClone = true\n\n pointsBoundsCache = new WeakMap<T['segments'], TLBounds>()\n shapeBoundsCache = new Map<string, TLBounds>()\n pointCache: Record<string, number[]> = {}\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Pen,\n name: 'Pen',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n rotation: 0,\n style: defaultStyle,\n segments: [],\n isClosed: false,\n isComplete: false,\n previewPoint: undefined,\n isPlacingHandle: false,\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, meta, isSelected, isGhost, events }, ref) => {\n const { segments, style, isClosed, isComplete, previewPoint, isPlacingHandle } = shape\n const isNodeEditing = meta.nodeEditingId === shape.id\n\n // \u2500\u2500 Hooks (must be before any conditional returns) \u2500\u2500\n const app = useTelvaApp()\n const dragRef = React.useRef<DragTarget | null>(null)\n const [hoveredTarget, setHoveredTarget] = React.useState<string | null>(null)\n\n const screenToLocal = React.useCallback(\n (clientX: number, clientY: number) =>\n Vec.sub(app.getPagePoint([clientX, clientY]), shape.point),\n [app, shape.point]\n )\n\n const patchSegments = React.useCallback(\n (newSegs: PenSegment[]) => {\n app.patchState({\n document: {\n pages: {\n [app.currentPageId]: { shapes: { [shape.id]: { segments: newSegs } } },\n },\n },\n })\n },\n [app, shape.id]\n )\n\n const commitSegments = React.useCallback(\n (newSegs: PenSegment[]) => {\n // No normalization during node editing \u2014 shape.point stays fixed.\n // Normalization only happens in PenTool.finishShape / closePath.\n app.updateShapes({ id: shape.id, segments: newSegs })\n },\n [app, shape.id]\n )\n\n const styles = getShapeStyle(style, meta.isDarkMode)\n const { stroke, fill, strokeWidth, opacity: shapeOpacity } = styles\n const { defs, gradFill } = useGradientFill(shape.id, style)\n const activeFill = gradFill ?? fill\n\n const pathData = React.useMemo(() => segmentsToPath(segments, isClosed), [segments, isClosed])\n\n const zoom = app.zoom ?? 1\n\n // \u2500\u2500 SVG stroking style \u2500\u2500\n const sw = 1 + strokeWidth * 1.5\n const strokeDasharray =\n {\n [DashStyle.Draw]: 'none',\n [DashStyle.Solid]: 'none',\n [DashStyle.Dotted]: `0.1 ${strokeWidth * 4}`,\n [DashStyle.Dashed]: `${strokeWidth * 4} ${strokeWidth * 4}`,\n }[style.dash as DashStyle] ?? 'none'\n\n const strokeDashoffset =\n {\n [DashStyle.Draw]: '0',\n [DashStyle.Solid]: '0',\n [DashStyle.Dotted]: '0',\n [DashStyle.Dashed]: '0',\n }[style.dash as DashStyle] ?? '0'\n\n // \u2500\u2500 Node editing overlay \u2500\u2500\n const nodeOverlay = React.useMemo(() => {\n if (!isNodeEditing || segments.length === 0) return null\n\n const nodeR = 5 / zoom\n const handleR = 3.5 / zoom\n const lineW = 1 / zoom\n\n const nodeEls: React.ReactElement[] = []\n const handleEls: React.ReactElement[] = []\n const lineEls: React.ReactElement[] = []\n\n segments.forEach((seg: PenSegment, i: number) => {\n const [px, py] = seg.point\n\n // Incoming handle (cp1)\n if (seg.cp1) {\n const [hx, hy] = seg.cp1\n const hKey = `cp1-${i}`\n lineEls.push(\n <line\n key={`lcp1-${i}`}\n x1={px}\n y1={py}\n x2={hx}\n y2={hy}\n stroke=\"#0D99FF\"\n strokeWidth={lineW}\n strokeOpacity={0.6}\n pointerEvents=\"none\"\n />\n )\n handleEls.push(\n <circle\n key={hKey}\n cx={hx}\n cy={hy}\n r={hoveredTarget === hKey ? handleR * 1.4 : handleR}\n fill={hoveredTarget === hKey ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={lineW}\n style={{ cursor: 'move' }}\n onPointerEnter={() => setHoveredTarget(hKey)}\n onPointerLeave={() => setHoveredTarget(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n dragRef.current = { kind: 'cp1', idx: i }\n }}\n onPointerMove={(e) => {\n if (\n !dragRef.current ||\n dragRef.current.kind !== 'cp1' ||\n dragRef.current.idx !== i\n )\n return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const ns = [...segments]\n ns[i] = { ...ns[i], cp1: local }\n patchSegments(ns)\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const ns = [...segments]\n ns[i] = { ...ns[i], cp1: local }\n dragRef.current = null\n commitSegments(ns)\n }}\n />\n )\n }\n\n // Outgoing handle (cp2)\n if (seg.cp2) {\n const [hx, hy] = seg.cp2\n const hKey = `cp2-${i}`\n lineEls.push(\n <line\n key={`lcp2-${i}`}\n x1={px}\n y1={py}\n x2={hx}\n y2={hy}\n stroke=\"#0D99FF\"\n strokeWidth={lineW}\n strokeOpacity={0.6}\n pointerEvents=\"none\"\n />\n )\n handleEls.push(\n <circle\n key={hKey}\n cx={hx}\n cy={hy}\n r={hoveredTarget === hKey ? handleR * 1.4 : handleR}\n fill={hoveredTarget === hKey ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={lineW}\n style={{ cursor: 'move' }}\n onPointerEnter={() => setHoveredTarget(hKey)}\n onPointerLeave={() => setHoveredTarget(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n dragRef.current = { kind: 'cp2', idx: i }\n }}\n onPointerMove={(e) => {\n if (\n !dragRef.current ||\n dragRef.current.kind !== 'cp2' ||\n dragRef.current.idx !== i\n )\n return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const ns = [...segments]\n ns[i] = { ...ns[i], cp2: local }\n // Mirror to cp1 of next segment for smooth node\n if (i + 1 < ns.length) {\n ns[i + 1] = { ...ns[i + 1], cp1: mirrorHandle(ns[i].point, local) }\n }\n patchSegments(ns)\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const ns = [...segments]\n ns[i] = { ...ns[i], cp2: local }\n if (i + 1 < ns.length) {\n ns[i + 1] = { ...ns[i + 1], cp1: mirrorHandle(ns[i].point, local) }\n }\n dragRef.current = null\n commitSegments(ns)\n }}\n />\n )\n }\n\n // Anchor node\n const nKey = `node-${i}`\n nodeEls.push(\n <circle\n key={nKey}\n cx={px}\n cy={py}\n r={hoveredTarget === nKey ? nodeR * 1.4 : nodeR}\n fill={hoveredTarget === nKey ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={1.5 / zoom}\n style={{ cursor: 'move' }}\n onPointerEnter={() => setHoveredTarget(nKey)}\n onPointerLeave={() => setHoveredTarget(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n dragRef.current = { kind: 'node', idx: i }\n }}\n onPointerMove={(e) => {\n if (\n !dragRef.current ||\n dragRef.current.kind !== 'node' ||\n dragRef.current.idx !== i\n )\n return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const prev = segments[i].point\n const delta = Vec.sub(local, prev)\n const ns = [...segments]\n ns[i] = {\n ...ns[i],\n point: local,\n cp1: ns[i].cp1 ? Vec.add(ns[i].cp1!, delta) : undefined,\n cp2: ns[i].cp2 ? Vec.add(ns[i].cp2!, delta) : undefined,\n }\n patchSegments(ns)\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const local = screenToLocal(e.clientX, e.clientY)\n const prev = segments[i].point\n const delta = Vec.sub(local, prev)\n const ns = [...segments]\n ns[i] = {\n ...ns[i],\n point: local,\n cp1: ns[i].cp1 ? Vec.add(ns[i].cp1!, delta) : undefined,\n cp2: ns[i].cp2 ? Vec.add(ns[i].cp2!, delta) : undefined,\n }\n dragRef.current = null\n commitSegments(ns)\n }}\n />\n )\n\n // Midpoint insertion\n if (i < segments.length - 1) {\n const next = segments[i + 1]\n const mx = (px + next.point[0]) / 2\n const my = (py + next.point[1]) / 2\n nodeEls.push(\n <circle\n key={`mid-${i}`}\n cx={mx}\n cy={my}\n r={handleR}\n fill=\"white\"\n stroke=\"#0D99FF\"\n strokeWidth={lineW}\n strokeDasharray={`${2 / zoom} ${2 / zoom}`}\n style={{ cursor: 'crosshair' }}\n onPointerDown={(e) => {\n e.stopPropagation()\n const newSeg: PenSegment = { point: [mx, my] }\n const ns = [...segments.slice(0, i + 1), newSeg, ...segments.slice(i + 1)]\n app.updateShapes({ id: shape.id, segments: ns })\n }}\n />\n )\n }\n })\n\n // Note: NO pointerEvents:none on outer <g> \u2014 individual non-interactive\n // elements use pointerEvents=\"none\" attribute directly.\n return (\n <g>\n {lineEls}\n {handleEls}\n {nodeEls}\n </g>\n )\n }, [\n isNodeEditing,\n segments,\n zoom,\n hoveredTarget,\n shape.id,\n screenToLocal,\n patchSegments,\n commitSegments,\n app,\n ])\n\n // \u2500\u2500 Render \u2500\u2500\n if (segments.length === 0) {\n return (\n <SVGContainer ref={ref} id={shape.id + '_svg'} {...events}>\n <circle r={4} fill={stroke} stroke={stroke} pointerEvents=\"all\" />\n </SVGContainer>\n )\n }\n\n const svgOverflowStyle =\n isNodeEditing || !isComplete ? { overflow: 'visible' as const } : undefined\n\n return (\n <SVGContainer ref={ref} id={shape.id + '_svg'} {...events} style={svgOverflowStyle}>\n {defs}\n <g opacity={isGhost ? GHOSTED_OPACITY : shapeOpacity}>\n <path\n className={style.isFilled && isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n d={pathData}\n />\n {style.isFilled && isClosed && (\n <path d={pathData} fill={activeFill} stroke=\"none\" pointerEvents=\"none\" />\n )}\n <path\n d={pathData}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n pointerEvents=\"none\"\n />\n {/* Live rubber-band preview: last anchor \u2192 cursor */}\n {!isComplete &&\n previewPoint &&\n segments.length > 0 &&\n (() => {\n const last = segments[segments.length - 1]\n let previewD: string\n if (isPlacingHandle && last.cp2) {\n // Show tentative bezier curve from last anchor using current cp2\n const [ax, ay] = last.point\n const [c2x, c2y] = last.cp2\n const [px, py] = previewPoint\n previewD = `M ${ax} ${ay} C ${c2x} ${c2y} ${px} ${py} ${px} ${py}`\n } else {\n const [ax, ay] = last.point\n const [px, py] = previewPoint\n previewD = `M ${ax} ${ay} L ${px} ${py}`\n }\n return (\n <path\n d={previewD}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={sw * 0.8}\n strokeDasharray={`${sw * 4} ${sw * 3}`}\n strokeLinecap=\"round\"\n opacity={0.55}\n pointerEvents=\"none\"\n />\n )\n })()}\n {/* Close-snap indicator: highlight first node when cursor is near it */}\n {!isComplete &&\n previewPoint &&\n segments.length >= 2 &&\n (() => {\n const first = segments[0]\n const dist = Math.hypot(\n previewPoint[0] - first.point[0],\n previewPoint[1] - first.point[1]\n )\n const snapLocalDist = 12 / zoom\n return dist <= snapLocalDist ? (\n <circle\n cx={first.point[0]}\n cy={first.point[1]}\n r={8 / zoom}\n fill=\"none\"\n stroke=\"#0D99FF\"\n strokeWidth={1.5 / zoom}\n opacity={0.8}\n pointerEvents=\"none\"\n />\n ) : null\n })()}\n {/* Dot on last placed anchor while drawing */}\n {!isComplete && segments.length > 0 && (\n <circle\n cx={segments[segments.length - 1].point[0]}\n cy={segments[segments.length - 1].point[1]}\n r={4 / zoom}\n fill={stroke}\n stroke=\"none\"\n pointerEvents=\"none\"\n />\n )}\n </g>\n {nodeOverlay}\n </SVGContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const { segments, isClosed } = shape\n const pathData = segmentsToPath(segments, isClosed)\n if (!pathData) return <circle r={1} />\n return <path d={pathData} />\n })\n\n getBounds = (shape: T) => {\n const pointsHaveChanged = !this.pointsBoundsCache.has(shape.segments)\n const pointHasChanged = !(this.pointCache[shape.id] === shape.point)\n\n if (pointsHaveChanged) {\n const bounds =\n shape.segments.length > 0\n ? getSegmentsBounds(shape.segments)\n : { minX: 0, minY: 0, maxX: 1, maxY: 1, width: 1, height: 1 }\n\n // Ensure minimum size\n const safeBounds = {\n ...bounds,\n width: Math.max(bounds.width, 1),\n height: Math.max(bounds.height, 1),\n }\n this.pointsBoundsCache.set(shape.segments, safeBounds as TLBounds)\n this.shapeBoundsCache.set(\n shape.id,\n Utils.translateBounds(safeBounds as TLBounds, shape.point)\n )\n this.pointCache[shape.id] = shape.point\n } else if (pointHasChanged) {\n this.pointCache[shape.id] = shape.point\n this.shapeBoundsCache.set(\n shape.id,\n Utils.translateBounds(this.pointsBoundsCache.get(shape.segments)!, shape.point)\n )\n }\n\n return this.shapeBoundsCache.get(shape.id)!\n }\n\n shouldRender = (prev: T, next: T) => {\n return (\n next.segments !== prev.segments ||\n next.style !== prev.style ||\n next.isClosed !== prev.isClosed ||\n next.isComplete !== prev.isComplete ||\n next.previewPoint !== prev.previewPoint ||\n next.isPlacingHandle !== prev.isPlacingHandle\n )\n }\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { initialShape, scaleX, scaleY }: { initialShape: T; scaleX: number; scaleY: number }\n ): Partial<T> => {\n const initialBounds = this.getBounds(initialShape)\n const iW = Math.max(initialBounds.width, 1)\n const iH = Math.max(initialBounds.height, 1)\n\n const scaleSegment = (seg: PenSegment): PenSegment => ({\n point: [\n bounds.width *\n (scaleX < 0\n ? 1 - (seg.point[0] - initialBounds.minX) / iW\n : (seg.point[0] - initialBounds.minX) / iW),\n bounds.height *\n (scaleY < 0\n ? 1 - (seg.point[1] - initialBounds.minY) / iH\n : (seg.point[1] - initialBounds.minY) / iH),\n ],\n cp1: seg.cp1\n ? [\n bounds.width *\n (scaleX < 0\n ? 1 - (seg.cp1[0] - initialBounds.minX) / iW\n : (seg.cp1[0] - initialBounds.minX) / iW),\n bounds.height *\n (scaleY < 0\n ? 1 - (seg.cp1[1] - initialBounds.minY) / iH\n : (seg.cp1[1] - initialBounds.minY) / iH),\n ]\n : undefined,\n cp2: seg.cp2\n ? [\n bounds.width *\n (scaleX < 0\n ? 1 - (seg.cp2[0] - initialBounds.minX) / iW\n : (seg.cp2[0] - initialBounds.minX) / iW),\n bounds.height *\n (scaleY < 0\n ? 1 - (seg.cp2[1] - initialBounds.minY) / iH\n : (seg.cp2[1] - initialBounds.minY) / iH),\n ]\n : undefined,\n })\n\n const newSegs = initialShape.segments.map(scaleSegment)\n const newBounds = getSegmentsBounds(newSegs)\n const point = Vec.sub([bounds.minX, bounds.minY], [newBounds.minX, newBounds.minY])\n\n return { segments: newSegs, point } as Partial<T>\n }\n\n hitTestPoint = (shape: T, point: number[]) => {\n const ptA = Vec.sub(point, shape.point)\n // Simple point-in-segments proximity check\n for (const seg of shape.segments) {\n if (Vec.dist(ptA, seg.point) < 8) return true\n }\n return false\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]) => {\n const bounds = this.getBounds(shape)\n return Utils.boundsContain(bounds, {\n minX: Math.min(A[0], B[0]),\n minY: Math.min(A[1], B[1]),\n maxX: Math.max(A[0], B[0]),\n maxY: Math.max(A[1], B[1]),\n width: Math.abs(B[0] - A[0]),\n height: Math.abs(B[1] - A[1]),\n })\n }\n\n hitTestBounds = (shape: T, bounds: TLBounds) => {\n const shapeBounds = this.getBounds(shape)\n return Utils.boundsContain(bounds, shapeBounds) || Utils.boundsContain(shapeBounds, bounds)\n }\n}\n", "import { Utils } from 'telva-core'\nimport type { PenSegment } from '~types'\n\n/**\n * Build SVG path `d` string from PenShape segments.\n * Uses cubic B\u00E9zier (C) when handles are present, else line (L).\n */\nexport function segmentsToPath(segments: PenSegment[], isClosed: boolean): string {\n if (segments.length === 0) return ''\n if (segments.length === 1) {\n const { point } = segments[0]\n return `M ${point[0]} ${point[1]}`\n }\n\n let d = `M ${segments[0].point[0].toFixed(2)} ${segments[0].point[1].toFixed(2)}`\n\n for (let i = 1; i < segments.length; i++) {\n const prev = segments[i - 1]\n const curr = segments[i]\n const c1 = prev.cp2 ?? prev.point\n const c2 = curr.cp1 ?? curr.point\n const hasHandles = prev.cp2 != null || curr.cp1 != null\n if (hasHandles) {\n d += ` C ${c1[0].toFixed(2)} ${c1[1].toFixed(2)} ${c2[0].toFixed(2)} ${c2[1].toFixed(\n 2\n )} ${curr.point[0].toFixed(2)} ${curr.point[1].toFixed(2)}`\n } else {\n d += ` L ${curr.point[0].toFixed(2)} ${curr.point[1].toFixed(2)}`\n }\n }\n\n if (isClosed && segments.length > 2) {\n const prev = segments[segments.length - 1]\n const curr = segments[0]\n const c1 = prev.cp2 ?? prev.point\n const c2 = curr.cp1 ?? curr.point\n const hasHandles = prev.cp2 != null || curr.cp1 != null\n if (hasHandles) {\n d += ` C ${c1[0].toFixed(2)} ${c1[1].toFixed(2)} ${c2[0].toFixed(2)} ${c2[1].toFixed(\n 2\n )} ${curr.point[0].toFixed(2)} ${curr.point[1].toFixed(2)}`\n }\n d += ' Z'\n }\n\n return d\n}\n\n/**\n * Compute bounding box from anchor points ONLY.\n * Bezier handles (cp1/cp2) are intentionally excluded so they don't\n * inflate the selection box or affect resize transforms.\n */\nexport function getSegmentsBounds(segments: PenSegment[]) {\n if (segments.length === 0) return { minX: 0, minY: 0, maxX: 1, maxY: 1, width: 1, height: 1 }\n\n const pts = segments.map((s) => s.point)\n return Utils.getBoundsFromPoints(pts)\n}\n\n/**\n * Normalize segments so bounding box top-left = (0, 0).\n * Returns normalized segments + the offset to add to shape.point.\n */\nexport function normalizeSegments(segments: PenSegment[]): {\n segments: PenSegment[]\n offset: number[]\n} {\n if (segments.length === 0) return { segments, offset: [0, 0] }\n const bounds = getSegmentsBounds(segments)\n const offset = [bounds.minX, bounds.minY]\n const normalized = segments.map((s) => ({\n point: [s.point[0] - offset[0], s.point[1] - offset[1]],\n cp1: s.cp1 ? [s.cp1[0] - offset[0], s.cp1[1] - offset[1]] : undefined,\n cp2: s.cp2 ? [s.cp2[0] - offset[0], s.cp2[1] - offset[1]] : undefined,\n }))\n return { segments: normalized, offset }\n}\n\n/**\n * Return the symmetric opposite of a handle (for smooth bezier nodes).\n */\nexport function mirrorHandle(anchor: number[], handle: number[]): number[] {\n return [2 * anchor[0] - handle[0], 2 * anchor[1] - handle[1]]\n}\n", "import * as React from 'react'\nimport { HTMLContainer, Utils } from 'telva-core'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { useReactRegistry } from '~state/reactRegistry'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n defaultStyle,\n getBoundsRectangle,\n transformRectangle,\n transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { ReactComponentShape, TVMeta, TVShapeType } from '~types'\n\ntype T = ReactComponentShape\ntype E = HTMLDivElement\n\nexport class ReactComponentUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.ReactComponent as const\n\n canBind = false\n canClone = true\n isAspectRatioLocked = false\n showCloneHandles = false\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'reactComponent',\n type: TVShapeType.ReactComponent,\n name: 'React Component',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [400, 300],\n rotation: 0,\n style: { ...defaultStyle, isFilled: true },\n componentId: '',\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(({ shape, isGhost, events }, ref) => {\n const { size, componentId } = shape\n const rWrapper = React.useRef<HTMLDivElement>(null)\n\n // Keep wrapper dimensions in sync with shape size\n React.useLayoutEffect(() => {\n const wrapper = rWrapper.current\n if (!wrapper) return\n wrapper.style.width = `${size[0]}px`\n wrapper.style.height = `${size[1]}px`\n }, [size])\n\n return (\n <HTMLContainer ref={ref} {...events}>\n <div\n id={`${shape.id}_react_component`}\n ref={rWrapper}\n style={{\n width: `${size[0]}px`,\n height: `${size[1]}px`,\n position: 'relative',\n overflow: 'hidden',\n borderRadius: '4px',\n opacity: isGhost ? GHOSTED_OPACITY : 1,\n pointerEvents: 'all',\n }}\n >\n <LiveReactComponent componentId={componentId} width={size[0]} height={size[1]} />\n </div>\n </HTMLContainer>\n )\n })\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const {\n size: [width, height],\n } = shape\n return (\n <rect\n x={0}\n y={0}\n rx={4}\n ry={4}\n width={Math.max(1, width)}\n height={Math.max(1, height)}\n fill=\"none\"\n stroke=\"var(--tv-selected)\"\n />\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return (\n next.size !== prev.size || next.style !== prev.style || next.componentId !== prev.componentId\n )\n }\n\n transform = transformRectangle\n transformSingle = transformSingleRectangle\n\n getSvgElement = async (shape: T, isDarkMode: boolean): Promise<SVGElement | void> => {\n // Attempt to capture the component directly\n const wrapper = document.getElementById(`${shape.id}_react_component`)\n if (!wrapper) return\n\n const [width, height] = shape.size\n\n try {\n // For WebGL, try to grab the canvas dataUrl first if possible\n const canvasEl = wrapper.querySelector('canvas')\n let dataUrl = ''\n\n if (canvasEl) {\n // Try getting it directly from canvas to preserve WebGL context if preserveDrawingBuffer is on\n dataUrl = canvasEl.toDataURL('image/png')\n }\n\n // Fallback: use html2canvas for everything else\n if (!dataUrl || dataUrl === 'data:,') {\n // Clone the element outside of telva's CSS transform context so\n // html2canvas can measure and capture it correctly.\n const clone = document.createElement('div')\n clone.style.cssText = [\n `position:fixed`,\n `top:0`,\n `left:0`,\n `width:${width}px`,\n `height:${height}px`,\n `overflow:hidden`,\n `border-radius:4px`,\n `background:#ffffff`,\n `z-index:-9999`,\n `pointer-events:none`,\n ].join(';')\n // Copy rendered DOM content (static snapshot is enough for export)\n clone.innerHTML = wrapper.innerHTML\n document.body.appendChild(clone)\n\n try {\n const html2canvas = (await import('html2canvas')).default\n const captured = await html2canvas(clone, {\n width,\n height,\n useCORS: true,\n backgroundColor: '#ffffff',\n logging: false,\n })\n dataUrl = captured.toDataURL('image/png')\n } finally {\n document.body.removeChild(clone)\n }\n }\n\n if (!dataUrl || dataUrl === 'data:,') return\n\n const elm = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n elm.setAttribute('width', `${width}`)\n elm.setAttribute('height', `${height}`)\n elm.setAttribute('href', dataUrl)\n return elm\n } catch (err) {\n console.warn('Failed to snapshot React Component for SVG export', err)\n }\n }\n}\n\n/**\n * Resolves a React component from the registry and renders it.\n * The parent wrapper div (in Component above) provides explicit pixel\n * dimensions so ResizeObserver / CSS 100% / h-full all work correctly.\n */\nfunction LiveReactComponent({\n componentId,\n width,\n height,\n}: {\n componentId: string\n width: number\n height: number\n}) {\n const registry = useReactRegistry()\n const entry = React.useMemo(\n () => registry.find((r) => r.id === componentId),\n [registry, componentId]\n )\n\n if (!entry) {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n color: 'white',\n fontSize: 14,\n fontFamily: 'DM Sans, sans-serif',\n borderRadius: 4,\n }}\n >\n Component \"{componentId}\" not found\n </div>\n )\n }\n\n const Comp = entry.component\n\n // Render the component \u2014 it fills its parent which has explicit pixel dims\n return <Comp />\n}\n", "import * as React from 'react'\nimport { SVGContainer, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n TextLabel,\n defaultStyle,\n getBoundsRectangle,\n getFontStyle,\n getShapeStyle,\n transformRectangle,\n transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { DashStyle, RectangleShape, TVMeta, TVShapeType } from '~types'\nimport { BindingIndicator } from './components/BindingIndicator'\nimport { DashedRectangle } from './components/DashedRectangle'\nimport { DrawRectangle } from './components/DrawRectangle'\nimport { getRectangleIndicatorPathTDSnapshot } from './rectangleHelpers'\n\ntype T = RectangleShape\ntype E = HTMLDivElement\n\nexport class RectangleUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Rectangle as const\n\n canBind = true\n\n canClone = true\n\n canEdit = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Rectangle,\n name: 'Rectangle',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [1, 1],\n rotation: 0,\n style: defaultStyle,\n label: '',\n labelPoint: [0.5, 0.5],\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n (\n {\n shape,\n isEditing,\n isBinding,\n isSelected,\n isGhost,\n meta,\n bounds,\n events,\n onShapeBlur,\n onShapeChange,\n },\n ref\n ) => {\n const { id, size, style, label = '', labelPoint = LABEL_POINT } = shape\n const font = getFontStyle(style)\n const styles = getShapeStyle(style, meta.isDarkMode)\n const isStraight = meta.canvasMode === 'straight'\n const Component =\n !isStraight && style.dash === DashStyle.Draw ? DrawRectangle : DashedRectangle\n const handleLabelChange = React.useCallback(\n (label: string) => onShapeChange?.({ id, label }),\n [onShapeChange]\n )\n\n // \u2500\u2500 Node editing \u2500\u2500\n const isNodeEditing = meta.nodeEditingId === shape.id\n const app = useTelvaApp()\n const dragRef = React.useRef<{ nodeIdx: number; fixedPage: number[] } | null>(null)\n const [hoveredNode, setHoveredNode] = React.useState<number | null>(null)\n const zoom = app.zoom ?? 1\n\n const nodeOverlay = React.useMemo(() => {\n if (!isNodeEditing) return null\n const [w, h] = size\n const corners: number[][] = [\n [0, 0],\n [w, 0],\n [w, h],\n [0, h],\n ]\n const opposites = [2, 3, 0, 1]\n const r = 5 / zoom\n const lw = 1 / zoom\n\n return (\n <g>\n {corners.map((c, ci) => {\n const next = corners[(ci + 1) % 4]\n return (\n <line\n key={`el-${ci}`}\n x1={c[0]}\n y1={c[1]}\n x2={next[0]}\n y2={next[1]}\n stroke=\"#0D99FF\"\n strokeWidth={lw}\n strokeOpacity={0.4}\n pointerEvents=\"none\"\n />\n )\n })}\n {corners.map(([cx, cy], ci) => (\n <circle\n key={`cn-${ci}`}\n cx={cx}\n cy={cy}\n r={hoveredNode === ci ? r * 1.4 : r}\n fill={hoveredNode === ci ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={1.5 / zoom}\n style={{ cursor: 'nwse-resize' }}\n onPointerEnter={() => setHoveredNode(ci)}\n onPointerLeave={() => setHoveredNode(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n const fixedLocal = corners[opposites[ci]]\n dragRef.current = {\n nodeIdx: ci,\n fixedPage: Vec.add(shape.point, fixedLocal),\n }\n }}\n onPointerMove={(e) => {\n if (!dragRef.current || dragRef.current.nodeIdx !== ci) return\n e.stopPropagation()\n const pp = app.getPagePoint([e.clientX, e.clientY])\n const fp = dragRef.current.fixedPage\n const x0 = Math.min(pp[0], fp[0]),\n y0 = Math.min(pp[1], fp[1])\n const x1 = Math.max(pp[0], fp[0]),\n y1 = Math.max(pp[1], fp[1])\n app.patchState({\n document: {\n pages: {\n [app.currentPageId]: {\n shapes: {\n [shape.id]: {\n point: [x0, y0],\n size: [Math.max(1, x1 - x0), Math.max(1, y1 - y0)],\n },\n },\n },\n },\n },\n })\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const pp = app.getPagePoint([e.clientX, e.clientY])\n const fp = dragRef.current.fixedPage\n const x0 = Math.min(pp[0], fp[0]),\n y0 = Math.min(pp[1], fp[1])\n const x1 = Math.max(pp[0], fp[0]),\n y1 = Math.max(pp[1], fp[1])\n dragRef.current = null\n app.updateShapes({\n id: shape.id,\n point: [x0, y0],\n size: [Math.max(1, x1 - x0), Math.max(1, y1 - y0)],\n })\n }}\n />\n ))}\n {/* Midpoint insertion nodes */}\n {corners.map((c, ci) => {\n const next = corners[(ci + 1) % 4]\n const mx = (c[0] + next[0]) / 2\n const my = (c[1] + next[1]) / 2\n return (\n <circle\n key={`mid-${ci}`}\n cx={mx}\n cy={my}\n r={3.5 / zoom}\n fill=\"white\"\n stroke=\"#0D99FF\"\n strokeWidth={lw}\n strokeDasharray={`${2 / zoom} ${2 / zoom}`}\n style={{ cursor: 'crosshair' }}\n pointerEvents=\"none\"\n />\n )\n })}\n </g>\n )\n }, [isNodeEditing, size, zoom, hoveredNode, shape.id, shape.point, app])\n\n const svgOverflow = isNodeEditing ? { overflow: 'visible' as const } : undefined\n\n return (\n <FullWrapper ref={ref} {...events}>\n <TextLabel\n isEditing={isEditing}\n onChange={handleLabelChange}\n onBlur={onShapeBlur}\n font={font}\n text={label}\n color={style.labelColor ?? styles.stroke}\n background={style.labelBackground}\n textGradient={style.textGradient}\n offsetX={(labelPoint[0] - 0.5) * bounds.width}\n offsetY={(labelPoint[1] - 0.5) * bounds.height}\n width={Math.max(0, bounds.width - 16)}\n />\n <SVGContainer\n id={shape.id + '_svg'}\n opacity={isGhost ? GHOSTED_OPACITY : styles.opacity}\n style={svgOverflow}\n >\n {isBinding && <BindingIndicator strokeWidth={styles.strokeWidth} size={size} />}\n <Component\n id={id}\n style={style}\n size={size}\n isSelected={isSelected}\n isDarkMode={meta.isDarkMode}\n />\n {nodeOverlay}\n </SVGContainer>\n </FullWrapper>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape, meta }) => {\n const { id, style, size } = shape\n const isStraight = (meta as any)?.canvasMode === 'straight'\n\n if (!isStraight && style.dash === DashStyle.Draw) {\n return <path d={getRectangleIndicatorPathTDSnapshot(id, style, size)} />\n }\n\n return (\n <rect\n x={0}\n y={0}\n rx={style.borderRadius ?? 0}\n ry={style.borderRadius ?? 0}\n width={Math.max(1, size[0])}\n height={Math.max(1, size[1])}\n />\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style || next.label !== prev.label\n }\n\n transform = transformRectangle\n\n transformSingle = transformSingleRectangle\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import * as React from 'react'\nimport { BINDING_DISTANCE } from '~constants'\n\ninterface BindingIndicatorProps {\n strokeWidth: number\n size: number[]\n}\nexport function BindingIndicator({ strokeWidth, size }: BindingIndicatorProps) {\n return (\n <rect\n className=\"tv-binding-indicator\"\n x={strokeWidth}\n y={strokeWidth}\n width={Math.max(0, size[0] - strokeWidth / 2)}\n height={Math.max(0, size[1] - strokeWidth / 2)}\n strokeWidth={BINDING_DISTANCE * 2}\n />\n )\n}\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport { BINDING_DISTANCE } from '~constants'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\n\ninterface RectangleSvgProps {\n id: string\n style: ShapeStyles\n isSelected: boolean\n size: number[]\n isDarkMode: boolean\n}\n\nexport const DashedRectangle = React.memo(function DashedRectangle({\n id,\n style,\n size,\n isSelected,\n isDarkMode,\n}: RectangleSvgProps) {\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n\n const sw = 1 + strokeWidth * 1.618\n const w = Math.max(0, size[0] - sw / 2)\n const h = Math.max(0, size[1] - sw / 2)\n const r = style.borderRadius ?? 0\n\n // When borderRadius > 0 or solid, use a <rect> with rx/ry instead of line segments\n const useRect = r > 0 || style.dash === 'solid'\n\n const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n 2 * (w + h),\n strokeWidth * 1.618,\n style.dash\n )\n\n return (\n <>\n {defs}\n <rect\n className={isSelected || style.isFilled ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n x={sw / 2}\n y={sw / 2}\n width={w}\n height={h}\n rx={r}\n ry={r}\n strokeWidth={BINDING_DISTANCE}\n />\n {style.isFilled && (\n <rect\n x={sw / 2}\n y={sw / 2}\n width={w}\n height={h}\n rx={r}\n ry={r}\n fill={activeFill}\n pointerEvents=\"none\"\n />\n )}\n {useRect ? (\n <rect\n x={sw / 2}\n y={sw / 2}\n width={w}\n height={h}\n rx={r}\n ry={r}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={sw}\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n pointerEvents=\"none\"\n strokeLinecap=\"round\"\n />\n ) : (\n <g pointerEvents=\"none\" stroke={stroke} strokeWidth={sw} strokeLinecap=\"round\">\n {[\n [[sw / 2, sw / 2], [w, sw / 2], w - sw / 2],\n [[w, sw / 2], [w, h], h - sw / 2],\n [[w, h], [sw / 2, h], w - sw / 2],\n [[sw / 2, h], [sw / 2, sw / 2], h - sw / 2],\n ].map(([start, end, length], i) => {\n const dash = Utils.getPerfectDashProps(\n length as number,\n strokeWidth * 1.618,\n style.dash\n )\n return (\n <line\n key={id + '_' + i}\n x1={(start as number[])[0]}\n y1={(start as number[])[1]}\n x2={(end as number[])[0]}\n y2={(end as number[])[1]}\n strokeDasharray={dash.strokeDasharray}\n strokeDashoffset={dash.strokeDashoffset}\n />\n )\n })}\n </g>\n )}\n </>\n )\n})\n", "import * as React from 'react'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getRectangleIndicatorPathTDSnapshot, getRectanglePath } from '../rectangleHelpers'\n\ninterface RectangleSvgProps {\n id: string\n style: ShapeStyles\n isSelected: boolean\n isDarkMode: boolean\n size: number[]\n}\n\nexport const DrawRectangle = React.memo(function DrawRectangle({\n id,\n style,\n size,\n isSelected,\n isDarkMode,\n}: RectangleSvgProps) {\n const { isFilled } = style\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n const pathTDSnapshot = getRectanglePath(id, style, size)\n const innerPath = getRectangleIndicatorPathTDSnapshot(id, style, size)\n\n return (\n <>\n {defs}\n <path\n className={style.isFilled || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n d={innerPath}\n />\n {isFilled && <path d={innerPath} fill={activeFill} pointerEvents=\"none\" />}\n <path\n d={pathTDSnapshot}\n fill={stroke}\n stroke={stroke}\n strokeWidth={strokeWidth}\n pointerEvents=\"none\"\n />\n </>\n )\n})\n", "import getStroke, { getStrokePoints } from 'perfect-freehand'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\n\nfunction getRectangleDrawPoints(id: string, style: ShapeStyles, size: number[]) {\n const styles = getShapeStyle(style)\n\n const getRandom = Utils.rng(id)\n\n const sw = styles.strokeWidth\n\n // Dimensions\n const w = Math.max(0, size[0])\n const h = Math.max(0, size[1])\n\n // Random corner offsets\n const offsets = Array.from(Array(4)).map(() => {\n return [getRandom() * sw * 0.75, getRandom() * sw * 0.75]\n })\n\n // Corners\n const tl = Vec.add([sw / 2, sw / 2], offsets[0])\n const tr = Vec.add([w - sw / 2, sw / 2], offsets[1])\n const br = Vec.add([w - sw / 2, h - sw / 2], offsets[2])\n const bl = Vec.add([sw / 2, h - sw / 2], offsets[3])\n\n // Which side to start drawing first\n const rm = Math.round(Math.abs(getRandom() * 2 * 4))\n\n // Corner radii\n const rx = Math.min(w / 4, sw * 2)\n const ry = Math.min(h / 4, sw * 2)\n\n // Number of points per side\n const px = Math.max(8, Math.floor(w / 16))\n const py = Math.max(8, Math.floor(h / 16))\n\n // Inset each line by the corner radii and let the freehand algo\n // interpolate points for the corners.\n const lines = Utils.rotateArray(\n [\n Vec.pointsBetween(Vec.add(tl, [rx, 0]), Vec.sub(tr, [rx, 0]), px),\n Vec.pointsBetween(Vec.add(tr, [0, ry]), Vec.sub(br, [0, ry]), py),\n Vec.pointsBetween(Vec.sub(br, [rx, 0]), Vec.add(bl, [rx, 0]), px),\n Vec.pointsBetween(Vec.sub(bl, [0, ry]), Vec.add(tl, [0, ry]), py),\n ],\n rm\n )\n\n // For the final points, include the first half of the first line again,\n // so that the line wraps around and avoids ending on a sharp corner.\n // This has a bit of finesse and magic\u2014if you change the points between\n // function, then you'll likely need to change this one too.\n\n const points = [...lines.flat(), ...lines[0]].slice(\n 5,\n Math.floor((rm % 2 === 0 ? px : py) / -2) + 3\n )\n\n return {\n points,\n }\n}\n\nfunction getDrawStrokeInfo(id: string, style: ShapeStyles, size: number[]) {\n const { points } = getRectangleDrawPoints(id, style, size)\n const { strokeWidth } = getShapeStyle(style)\n const options = {\n size: strokeWidth,\n thinning: 0.65,\n streamline: 0.3,\n smoothing: 1,\n simulatePressure: false,\n last: true,\n }\n return { points, options }\n}\n\nexport function getRectanglePath(id: string, style: ShapeStyles, size: number[]) {\n const { points, options } = getDrawStrokeInfo(id, style, size)\n const stroke = getStroke(points, options)\n return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getRectangleIndicatorPathTDSnapshot(\n id: string,\n style: ShapeStyles,\n size: number[]\n) {\n const { points, options } = getDrawStrokeInfo(id, style, size)\n return Utils.getSvgPathFromStrokePoints(getStrokePoints(points, options))\n}\n", "import * as React from 'react'\nimport { HTMLContainer, TLBounds, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n TextAreaUtils,\n defaultTextStyle,\n getBoundsRectangle,\n getFontFace,\n getStickyFontSize,\n getStickyFontStyle,\n getStickyShapeStyle,\n getTextSvgElement,\n} from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { AlignStyle, StickyShape, TVMeta, TVShapeType, TransformInfo, buildCssGradient } from '~types'\n\ntype T = StickyShape\ntype E = HTMLDivElement\n\nexport class StickyUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Sticky as const\n\n canBind = true\n\n canEdit = true\n\n canClone = true\n\n hideResizeHandles = true\n\n showCloneHandles = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Sticky,\n name: 'Sticky',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [200, 200],\n text: '',\n rotation: 0,\n style: defaultTextStyle,\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, meta, events, isGhost, isBinding, isEditing, onShapeBlur, onShapeChange }, ref) => {\n const font = getStickyFontStyle(shape.style)\n\n const { color, fill, stroke } = getStickyShapeStyle(shape.style, meta.isDarkMode)\n\n const rContainer = React.useRef<HTMLDivElement>(null)\n\n const rTextArea = React.useRef<HTMLTextAreaElement>(null)\n\n const rText = React.useRef<HTMLDivElement>(null)\n\n const rIsMounted = React.useRef(false)\n\n const handlePointerDown = React.useCallback((e: React.PointerEvent) => {\n e.stopPropagation()\n }, [])\n\n const onChange = React.useCallback(\n (text: string) => {\n onShapeChange?.({\n id: shape.id,\n type: shape.type,\n text: TVDR.normalizeText(text),\n })\n },\n [shape.id]\n )\n\n const handleTextChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.currentTarget.value)\n },\n [onShapeChange, onChange]\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n onShapeBlur?.()\n return\n }\n\n if (e.key === 'Tab' && shape.text.length === 0) {\n e.preventDefault()\n return\n }\n\n if (!(e.key === 'Meta' || e.metaKey)) {\n e.stopPropagation()\n } else if (e.key === 'z' && e.metaKey) {\n if (e.shiftKey) {\n document.execCommand('redo', false)\n } else {\n document.execCommand('undo', false)\n }\n e.stopPropagation()\n e.preventDefault()\n return\n }\n if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n e.preventDefault()\n }\n if (e.key === 'Tab') {\n e.preventDefault()\n if (e.shiftKey) {\n TextAreaUtils.unindent(e.currentTarget)\n } else {\n TextAreaUtils.indent(e.currentTarget)\n }\n\n onShapeChange?.({ ...shape, text: TVDR.normalizeText(e.currentTarget.value) })\n }\n },\n [shape, onShapeChange]\n )\n\n const handleBlur = React.useCallback((e: React.FocusEvent<HTMLTextAreaElement>) => {\n e.currentTarget.setSelectionRange(0, 0)\n onShapeBlur?.()\n }, [])\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!isEditing) return\n if (!rIsMounted.current) return\n e.currentTarget.select()\n },\n [isEditing]\n )\n\n // Focus when editing changes to true\n React.useEffect(() => {\n if (isEditing) {\n rIsMounted.current = true\n const elm = rTextArea.current!\n elm.focus()\n elm.select()\n }\n }, [isEditing])\n\n // Resize to fit text\n React.useEffect(() => {\n const text = rText.current!\n\n const { size } = shape\n const { offsetHeight: currTextHeight } = text\n const minTextHeight = MIN_CONTAINER_HEIGHT - PADDING * 2\n const prevTextHeight = size[1] - PADDING * 2\n\n // Same size? We can quit here\n if (currTextHeight === prevTextHeight) return\n\n if (currTextHeight > minTextHeight) {\n // Snap the size to the text content if the text only when the\n // text is larger than the minimum text height.\n onShapeChange?.({ id: shape.id, size: [size[0], currTextHeight + PADDING * 2] })\n return\n }\n\n if (currTextHeight < minTextHeight && size[1] > MIN_CONTAINER_HEIGHT) {\n // If we're smaller than the minimum height and the container\n // is too tall, snap it down to the minimum container height\n onShapeChange?.({ id: shape.id, size: [size[0], MIN_CONTAINER_HEIGHT] })\n return\n }\n\n const textarea = rTextArea.current\n textarea?.focus()\n }, [shape.text, shape.size[1], shape.style])\n\n const textGradient = shape.style.textGradient\n const style = {\n font,\n color: textGradient ? 'transparent' : color,\n textShadow: meta.isDarkMode\n ? `0.5px 0.5px 2px rgba(255, 255, 255,.25)`\n : `0.5px 0.5px 2px rgba(255, 255, 255,.5)`,\n ...(textGradient ? {\n background: buildCssGradient(textGradient),\n WebkitBackgroundClip: 'text',\n backgroundClip: 'text',\n } : {}),\n }\n\n return (\n <HTMLContainer ref={ref} {...events}>\n <StyledStickyContainer\n ref={rContainer}\n isDarkMode={meta.isDarkMode}\n isGhost={isGhost}\n style={{\n backgroundColor: fill,\n border: stroke ? `2px solid ${stroke}` : undefined,\n ...style,\n }}\n >\n {isBinding && (\n <div\n className=\"tv-binding-indicator\"\n style={{\n position: 'absolute',\n top: -this.bindingDistance,\n left: -this.bindingDistance,\n width: `calc(100% + ${this.bindingDistance * 2}px)`,\n height: `calc(100% + ${this.bindingDistance * 2}px)`,\n backgroundColor: 'var(--tv-selectFill)',\n }}\n />\n )}\n <StyledText ref={rText} isEditing={isEditing} alignment={shape.style.textAlign}>\n {shape.text}&#8203;\n </StyledText>\n {isEditing && (\n <StyledTextArea\n ref={rTextArea}\n onPointerDown={handlePointerDown}\n value={shape.text}\n onChange={handleTextChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n autoComplete=\"false\"\n autoCapitalize=\"false\"\n autoCorrect=\"false\"\n autoSave=\"false\"\n autoFocus\n spellCheck={true}\n alignment={shape.style.textAlign}\n onContextMenu={stopPropagation}\n onCopy={stopPropagation}\n onPaste={stopPropagation}\n onCut={stopPropagation}\n />\n )}\n </StyledStickyContainer>\n </HTMLContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const {\n size: [width, height],\n } = shape\n\n return (\n <rect x={0} y={0} rx={3} ry={3} width={Math.max(1, width)} height={Math.max(1, height)} />\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style || next.text !== prev.text\n }\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { scaleX, scaleY, transformOrigin }: TransformInfo<T>\n ): Partial<T> => {\n const point = Vec.toFixed([\n bounds.minX +\n (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]),\n bounds.minY +\n (bounds.height - shape.size[1]) *\n (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]),\n ])\n\n return {\n point,\n }\n }\n\n transformSingle = (shape: T): Partial<T> => {\n return shape\n }\n\n getSvgElement = (shape: T, isDarkMode: boolean): SVGElement | void => {\n const bounds = this.getBounds(shape)\n\n const style = getStickyShapeStyle(shape.style, isDarkMode)\n\n const fontSize = getStickyFontSize(shape.style.size) * (shape.style.scale ?? 1)\n const fontFamily = getFontFace(shape.style.font, shape.style.fontFamily).slice(1, -1)\n const textAlign = shape.style.textAlign ?? AlignStyle.Start\n\n const textElm = getTextSvgElement(\n shape.text,\n fontSize,\n fontFamily,\n textAlign,\n bounds.width - PADDING * 2,\n true\n )\n\n textElm.setAttribute('fill', style.color)\n textElm.setAttribute('transform', `translate(${PADDING}, ${PADDING})`)\n\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.setAttribute('width', bounds.width + '')\n rect.setAttribute('height', bounds.height + '')\n rect.setAttribute('fill', style.fill)\n if (style.stroke) {\n rect.setAttribute('stroke', style.stroke)\n rect.setAttribute('stroke-width', '2')\n }\n rect.setAttribute('rx', '3')\n rect.setAttribute('ry', '3')\n\n g.appendChild(rect)\n g.appendChild(textElm)\n\n return g\n }\n}\n\n/* -------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------- */\n\nconst PADDING = 16\nconst MIN_CONTAINER_HEIGHT = 200\n\nconst StyledStickyContainer = styled('div', {\n pointerEvents: 'all',\n position: 'relative',\n backgroundColor: 'rgba(255, 220, 100)',\n fontFamily: 'sans-serif',\n height: '100%',\n width: '100%',\n padding: PADDING + 'px',\n borderRadius: '3px',\n perspective: '800px',\n variants: {\n isGhost: {\n false: { opacity: 1 },\n true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n },\n isDarkMode: {\n true: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n },\n false: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16), 1px 1px 2px rgba(0,0,0,.16)',\n },\n },\n },\n})\n\nconst commonTextWrapping = {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n letterSpacing: LETTER_SPACING,\n}\n\nconst StyledText = styled('div', {\n position: 'absolute',\n top: PADDING,\n left: PADDING,\n width: `calc(100% - ${PADDING * 2}px)`,\n height: 'fit-content',\n font: 'inherit',\n pointerEvents: 'none',\n userSelect: 'none',\n variants: {\n isEditing: {\n true: {\n opacity: 1,\n },\n false: {\n opacity: 1,\n },\n },\n alignment: {\n [AlignStyle.Start]: {\n textAlign: 'left',\n },\n [AlignStyle.Middle]: {\n textAlign: 'center',\n },\n [AlignStyle.End]: {\n textAlign: 'right',\n },\n [AlignStyle.Justify]: {\n textAlign: 'justify',\n },\n },\n },\n ...commonTextWrapping,\n})\n\nconst StyledTextArea = styled('textarea', {\n width: '100%',\n height: '100%',\n border: 'none',\n overflow: 'hidden',\n background: 'none',\n outline: 'none',\n textAlign: 'left',\n font: 'inherit',\n padding: 0,\n color: 'transparent',\n verticalAlign: 'top',\n resize: 'none',\n caretColor: 'black',\n ...commonTextWrapping,\n variants: {\n alignment: {\n [AlignStyle.Start]: {\n textAlign: 'left',\n },\n [AlignStyle.Middle]: {\n textAlign: 'center',\n },\n [AlignStyle.End]: {\n textAlign: 'right',\n },\n [AlignStyle.Justify]: {\n textAlign: 'justify',\n },\n },\n },\n '&:focus': {\n outline: 'none',\n border: 'none',\n },\n})\n", "import * as React from 'react'\nimport { HTMLContainer, TLBounds, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { BINDING_DISTANCE, GHOSTED_OPACITY, LETTER_SPACING } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n TextAreaUtils,\n defaultTextStyle,\n getFontFace,\n getFontSize,\n getFontStyle,\n getShapeStyle,\n getTextAlign,\n getTextSvgElement,\n} from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { AlignStyle, TVMeta, TVShapeType, TextShape, TransformInfo, buildCssGradient } from '~types'\n\ntype T = TextShape\ntype E = HTMLDivElement\n\nexport class TextUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Text as const\n\n isAspectRatioLocked = false\n\n canEdit = true\n\n canBind = true\n\n canClone = true\n\n bindingDistance = BINDING_DISTANCE / 2\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Text,\n name: 'Text',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n rotation: 0,\n text: ' ',\n style: defaultTextStyle,\n },\n props\n )\n }\n\n texts = new Map<string, string>()\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n ({ shape, isBinding, isGhost, isEditing, onShapeBlur, onShapeChange, meta, events }, ref) => {\n const { text, style } = shape\n const styles = getShapeStyle(style, meta.isDarkMode)\n const font = getFontStyle(shape.style)\n const rInput = React.useRef<HTMLTextAreaElement>(null)\n const rIsMounted = React.useRef(false)\n\n const rEditedText = React.useRef(text)\n\n React.useLayoutEffect(() => {\n if (text !== rEditedText.current) {\n let delta = [0, 0]\n this.texts.set(shape.id, text)\n const currentBounds = this.getBounds(shape)\n const nextBounds = this.getBounds(shape)\n switch (shape.style.textAlign) {\n case AlignStyle.Start: {\n break\n }\n case AlignStyle.Middle: {\n delta = Vec.div([nextBounds.width - currentBounds.width, 0], 2)\n break\n }\n case AlignStyle.End: {\n delta = [nextBounds.width - currentBounds.width, 0]\n break\n }\n }\n\n rEditedText.current = text\n\n onShapeChange?.({\n ...shape,\n id: shape.id,\n point: Vec.sub(shape.point, delta),\n text,\n })\n }\n }, [text])\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n let delta = [0, 0]\n const newText = TVDR.normalizeText(e.currentTarget.value)\n const currentBounds = this.getBounds(shape)\n this.texts.set(shape.id, newText)\n const nextBounds = this.getBounds({\n ...shape,\n text: newText,\n })\n\n switch (shape.style.textAlign) {\n case AlignStyle.Start: {\n break\n }\n case AlignStyle.Middle: {\n delta = Vec.div([nextBounds.width - currentBounds.width, 0], 2)\n break\n }\n case AlignStyle.End: {\n delta = [nextBounds.width - currentBounds.width, 0]\n break\n }\n }\n\n rEditedText.current = newText\n\n onShapeChange?.({\n ...shape,\n id: shape.id,\n point: Vec.sub(shape.point, delta),\n text: newText,\n })\n },\n [shape.id, shape.point]\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n onShapeBlur?.()\n return\n }\n\n if (e.key === 'Tab' && shape.text.length === 0) {\n e.preventDefault()\n return\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n e.stopPropagation()\n rInput.current!.blur()\n return\n }\n\n if (!(e.key === 'Meta' || e.metaKey)) {\n e.stopPropagation()\n } else if (e.key === 'z' && e.metaKey) {\n if (e.shiftKey) {\n document.execCommand('redo', false)\n } else {\n document.execCommand('undo', false)\n }\n e.stopPropagation()\n e.preventDefault()\n return\n }\n if ((e.metaKey || e.ctrlKey) && e.key === '=') {\n e.preventDefault()\n }\n if (e.key === 'Tab') {\n e.preventDefault()\n if (e.shiftKey) {\n TextAreaUtils.unindent(e.currentTarget)\n } else {\n TextAreaUtils.indent(e.currentTarget)\n }\n\n onShapeChange?.({ ...shape, text: TVDR.normalizeText(e.currentTarget.value) })\n }\n },\n [shape, onShapeChange]\n )\n\n const handleBlur = React.useCallback((e: React.FocusEvent<HTMLTextAreaElement>) => {\n e.currentTarget.setSelectionRange(0, 0)\n onShapeBlur?.()\n }, [])\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!isEditing) return\n if (!rIsMounted.current) return\n if (document.activeElement === e.currentTarget) {\n e.currentTarget.select()\n }\n },\n [isEditing]\n )\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement | HTMLTextAreaElement>) => {\n if (isEditing) {\n e.stopPropagation()\n }\n },\n [isEditing]\n )\n\n const rWasEditing = React.useRef(isEditing)\n\n React.useEffect(() => {\n if (isEditing) {\n rWasEditing.current = true\n this.texts.set(shape.id, text)\n requestAnimationFrame(() => {\n rIsMounted.current = true\n const elm = rInput.current\n if (elm) {\n elm.focus()\n elm.select()\n }\n })\n } else if (rWasEditing.current) {\n rWasEditing.current = false\n onShapeBlur?.()\n }\n }, [isEditing])\n\n return (\n <HTMLContainer ref={ref} {...events}>\n <Wrapper\n isGhost={isGhost}\n isEditing={isEditing}\n onPointerDown={handlePointerDown}\n style={{ opacity: isGhost ? undefined : styles.opacity }}\n >\n <InnerWrapper\n style={{\n font,\n color: (style.textGradient && !isEditing) ? 'transparent' : styles.stroke,\n textAlign: getTextAlign(style.textAlign),\n width: shape.size ? `${shape.size[0]}px` : 'auto',\n whiteSpace: shape.size ? 'pre-wrap' : 'pre',\n wordBreak: shape.size ? 'break-word' : 'normal',\n overflowWrap: shape.size ? 'break-word' : 'normal',\n ...(style.textGradient && !isEditing ? {\n background: buildCssGradient(style.textGradient),\n WebkitBackgroundClip: 'text',\n backgroundClip: 'text',\n } : {}),\n }}\n >\n {isBinding && (\n <div\n className=\"tv-binding-indicator\"\n style={{\n position: 'absolute',\n top: -this.bindingDistance,\n left: -this.bindingDistance,\n width: `calc(100% + ${this.bindingDistance * 2}px)`,\n height: `calc(100% + ${this.bindingDistance * 2}px)`,\n backgroundColor: 'var(--tv-selectFill)',\n }}\n />\n )}\n {isEditing ? (\n <TextArea\n ref={rInput}\n style={{\n font,\n color: styles.stroke,\n }}\n name=\"text\"\n tabIndex={-1}\n autoComplete=\"false\"\n autoCapitalize=\"false\"\n autoCorrect=\"false\"\n autoSave=\"false\"\n autoFocus\n placeholder=\"\"\n spellCheck=\"true\"\n wrap=\"off\"\n dir=\"auto\"\n datatype=\"wysiwyg\"\n defaultValue={text}\n color={styles.stroke}\n onFocus={handleFocus}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onPointerDown={handlePointerDown}\n onContextMenu={stopPropagation}\n onCopy={stopPropagation}\n onPaste={stopPropagation}\n onCut={stopPropagation}\n />\n ) : (\n text\n )}\n &#8203;\n </InnerWrapper>\n </Wrapper>\n </HTMLContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const { width, height } = this.getBounds(shape)\n return <rect x={0} y={0} width={width} height={height} />\n })\n\n getBounds = (shape: T) => {\n const bounds = Utils.getFromCache(this.boundsCache, shape, () => {\n if (!melm) {\n // We're in SSR\n return { minX: 0, minY: 0, maxX: 10, maxY: 10, width: 10, height: 10 }\n }\n\n if (!melm.parentNode) document.body.appendChild(melm)\n\n melm.style.font = getFontStyle(shape.style)\n melm.textContent = this.texts.get(shape.id) ?? shape.text\n\n if (shape.size) {\n melm.style.whiteSpace = 'pre-wrap'\n melm.style.wordBreak = 'break-word'\n melm.style.overflowWrap = 'break-word'\n melm.style.width = `${shape.size[0]}px`\n } else {\n melm.style.whiteSpace = 'pre'\n melm.style.wordBreak = 'normal'\n melm.style.overflowWrap = 'normal'\n melm.style.width = 'auto'\n }\n\n // In tests, offsetWidth and offsetHeight will be 0\n const width = shape.size ? shape.size[0] : melm.offsetWidth || 1\n const height = melm.offsetHeight || 1\n\n return {\n minX: 0,\n maxX: width,\n minY: 0,\n maxY: height,\n width,\n height,\n }\n })\n\n return Utils.translateBounds(bounds, shape.point)\n }\n\n shouldRender = (prev: T, next: T): boolean => {\n return (\n next.text !== prev.text ||\n next.style.scale !== prev.style.scale ||\n next.style !== prev.style ||\n next.size !== prev.size\n )\n }\n\n transform = (\n shape: T,\n bounds: TLBounds,\n { initialShape, scaleX, scaleY }: TransformInfo<T>\n ): Partial<T> => {\n const {\n rotation = 0,\n style: { scale = 1 },\n } = initialShape\n\n const nextScale = scale * Math.abs(Math.min(scaleX, scaleY))\n\n return {\n point: [bounds.minX, bounds.minY],\n size: [bounds.width, bounds.height],\n rotation:\n (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0) ? -(rotation || 0) : rotation,\n style: { ...initialShape.style, scale: nextScale },\n }\n }\n\n transformSingle = (\n shape: T,\n bounds: TLBounds,\n { initialShape, scaleX, scaleY }: TransformInfo<T>\n ): Partial<T> | void => {\n return {\n point: Vec.toFixed([bounds.minX, bounds.minY]),\n size: [bounds.width, bounds.height],\n }\n }\n\n onDoubleClickBoundsHandle = (shape: T) => {\n const center = this.getCenter(shape)\n\n const newCenter = this.getCenter({\n ...shape,\n style: {\n ...shape.style,\n scale: 1,\n },\n })\n\n return {\n style: {\n ...shape.style,\n scale: 1,\n },\n point: Vec.toFixed(Vec.add(shape.point, Vec.sub(center, newCenter))),\n }\n }\n\n getSvgElement = (shape: T, isDarkMode: boolean): SVGElement | void => {\n const bounds = this.getBounds(shape)\n const style = getShapeStyle(shape.style, isDarkMode)\n\n const fontSize = getFontSize(shape.style.size, shape.style.font) * (shape.style.scale ?? 1)\n const fontFamily = getFontFace(shape.style.font).slice(1, -1)\n const textAlign = shape.style.textAlign ?? AlignStyle.Middle\n\n const textElm = getTextSvgElement(\n shape.text,\n fontSize,\n fontFamily,\n textAlign,\n shape.size ? shape.size[0] : bounds.width,\n !!shape.size\n )\n\n textElm.setAttribute('fill', style.stroke)\n\n return textElm\n }\n}\n\n/* -------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------- */\n\nlet melm: any\n\nfunction getMeasurementDiv() {\n // A div used for measurement\n document.getElementById('__textMeasure')?.remove()\n\n const pre = document.createElement('pre')\n pre.id = '__textMeasure'\n\n Object.assign(pre.style, {\n whiteSpace: 'pre',\n width: 'auto',\n border: '1px solid transparent',\n padding: '4px',\n margin: '0px',\n letterSpacing: LETTER_SPACING,\n opacity: '0',\n position: 'absolute',\n top: '-500px',\n left: '0px',\n zIndex: '9999',\n pointerEvents: 'none',\n userSelect: 'none',\n alignmentBaseline: 'mathematical',\n dominantBaseline: 'mathematical',\n })\n\n pre.tabIndex = -1\n\n document.body.appendChild(pre)\n return pre\n}\n\nif (typeof window !== 'undefined') {\n melm = getMeasurementDiv()\n}\n\nconst Wrapper = styled('div', {\n width: '100%',\n height: '100%',\n variants: {\n isGhost: {\n false: { opacity: 1 },\n true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n },\n isEditing: {\n false: {\n pointerEvents: 'all',\n userSelect: 'all',\n },\n true: {\n pointerEvents: 'none',\n userSelect: 'none',\n },\n },\n },\n})\n\nconst commonTextWrapping = {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n}\n\nconst InnerWrapper = styled('div', {\n position: 'absolute',\n width: '100%',\n height: '100%',\n padding: '4px',\n zIndex: 1,\n minHeight: 1,\n minWidth: 1,\n lineHeight: 1,\n letterSpacing: LETTER_SPACING,\n outline: 0,\n fontWeight: '500',\n backfaceVisibility: 'hidden',\n userSelect: 'none',\n pointerEvents: 'none',\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n isEditing: {\n false: {},\n true: {\n pointerEvents: 'all',\n background: '$boundsBg',\n userSelect: 'text',\n WebkitUserSelect: 'text',\n },\n },\n ...commonTextWrapping,\n})\n\nconst TextArea = styled('textarea', {\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1,\n width: '100%',\n height: '100%',\n border: 'none',\n padding: '4px',\n resize: 'none',\n textAlign: 'inherit',\n minHeight: 'inherit',\n minWidth: 'inherit',\n lineHeight: 'inherit',\n letterSpacing: 'inherit',\n outline: 0,\n fontWeight: 'inherit',\n overflow: 'hidden',\n backfaceVisibility: 'hidden',\n display: 'inline-block',\n pointerEvents: 'all',\n background: '$boundsBg',\n userSelect: 'text',\n WebkitUserSelect: 'text',\n ...commonTextWrapping,\n '&:focus': {\n outline: 'none',\n border: 'none',\n },\n})\n", "import * as React from 'react'\nimport { SVGContainer, TLBounds, Utils } from 'telva-core'\nimport {\n intersectBoundsPolygon,\n intersectLineSegmentPolyline,\n intersectRayLineSegment,\n} from 'telva-intersect'\nimport Vec from 'telva-vec'\nimport { BINDING_DISTANCE, GHOSTED_OPACITY, LABEL_POINT } from '~constants'\nimport { useTelvaApp } from '~hooks'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n TextLabel,\n defaultStyle,\n getBoundsRectangle,\n getFontStyle,\n getShapeStyle,\n transformRectangle,\n transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport { DashStyle, TVMeta, TVShape, TVShapeType, TriangleShape } from '~types'\nimport { DashedTriangle } from './components/DashedTriangle'\nimport { DrawTriangle } from './components/DrawTriangle'\nimport { TriangleBindingIndicator } from './components/TriangleBindingIndicator'\nimport { getTriangleCentroid, getTrianglePoints } from './triangleHelpers'\n\ntype T = TriangleShape\ntype E = HTMLDivElement\n\nexport class TriangleUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Triangle as const\n\n canBind = true\n\n canClone = true\n\n canEdit = true\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'id',\n type: TVShapeType.Triangle,\n name: 'Triangle',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [1, 1],\n rotation: 0,\n style: defaultStyle,\n label: '',\n labelPoint: [0.5, 0.5],\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n (\n {\n shape,\n bounds,\n isBinding,\n isEditing,\n isSelected,\n isGhost,\n meta,\n events,\n onShapeChange,\n onShapeBlur,\n },\n ref\n ) => {\n const { id, label = '', size, style, labelPoint = LABEL_POINT } = shape\n const font = getFontStyle(style)\n const styles = getShapeStyle(style, meta.isDarkMode)\n const isStraight = meta.canvasMode === 'straight'\n const Component = !isStraight && style.dash === DashStyle.Draw ? DrawTriangle : DashedTriangle\n const handleLabelChange = React.useCallback(\n (label: string) => onShapeChange?.({ id, label }),\n [onShapeChange]\n )\n const offsetY = React.useMemo(() => {\n const center = Vec.div(size, 2)\n const centroid = getTriangleCentroid(size)\n return (centroid[1] - center[1]) * 0.72\n }, [size])\n\n // \u2500\u2500 Node editing \u2500\u2500\n const isNodeEditing = meta.nodeEditingId === shape.id\n const app = useTelvaApp()\n const dragRef = React.useRef<{ nodeIdx: number; fixedPage: number[] } | null>(null)\n const [hoveredNode, setHoveredNode] = React.useState<number | null>(null)\n const zoom = app.zoom ?? 1\n\n const nodeOverlay = React.useMemo(() => {\n if (!isNodeEditing) return null\n const [w, h] = size\n const corners: number[][] = [\n [0, 0],\n [w, 0],\n [w, h],\n [0, h],\n ]\n const opposites = [2, 3, 0, 1]\n const r = 5 / zoom\n const lw = 1 / zoom\n\n // Also draw the triangle vertices for visual reference\n const verts = getTrianglePoints(size)\n\n return (\n <g>\n {/* Triangle edges (visual guide) */}\n {verts.map((v: number[], vi: number) => {\n const next = verts[(vi + 1) % verts.length]\n return (\n <line\n key={`tl-${vi}`}\n x1={v[0]}\n y1={v[1]}\n x2={next[0]}\n y2={next[1]}\n stroke=\"#0D99FF\"\n strokeWidth={lw}\n strokeOpacity={0.3}\n pointerEvents=\"none\"\n />\n )\n })}\n {/* Corner resize nodes */}\n {corners.map(([cx, cy], ci) => (\n <circle\n key={`cn-${ci}`}\n cx={cx}\n cy={cy}\n r={hoveredNode === ci ? r * 1.4 : r}\n fill={hoveredNode === ci ? '#0D99FF' : 'white'}\n stroke=\"#0D99FF\"\n strokeWidth={1.5 / zoom}\n style={{ cursor: 'nwse-resize' }}\n onPointerEnter={() => setHoveredNode(ci)}\n onPointerLeave={() => setHoveredNode(null)}\n onPointerDown={(e) => {\n e.stopPropagation()\n ;(e.currentTarget as SVGCircleElement).setPointerCapture(e.pointerId)\n const fixedLocal = corners[opposites[ci]]\n dragRef.current = {\n nodeIdx: ci,\n fixedPage: Vec.add(shape.point, fixedLocal),\n }\n }}\n onPointerMove={(e) => {\n if (!dragRef.current || dragRef.current.nodeIdx !== ci) return\n e.stopPropagation()\n const pp = app.getPagePoint([e.clientX, e.clientY])\n const fp = dragRef.current.fixedPage\n const x0 = Math.min(pp[0], fp[0]),\n y0 = Math.min(pp[1], fp[1])\n const x1 = Math.max(pp[0], fp[0]),\n y1 = Math.max(pp[1], fp[1])\n app.patchState({\n document: {\n pages: {\n [app.currentPageId]: {\n shapes: {\n [shape.id]: {\n point: [x0, y0],\n size: [Math.max(1, x1 - x0), Math.max(1, y1 - y0)],\n },\n },\n },\n },\n },\n })\n }}\n onPointerUp={(e) => {\n if (!dragRef.current) return\n e.stopPropagation()\n const pp = app.getPagePoint([e.clientX, e.clientY])\n const fp = dragRef.current.fixedPage\n const x0 = Math.min(pp[0], fp[0]),\n y0 = Math.min(pp[1], fp[1])\n const x1 = Math.max(pp[0], fp[0]),\n y1 = Math.max(pp[1], fp[1])\n dragRef.current = null\n app.updateShapes({\n id: shape.id,\n point: [x0, y0],\n size: [Math.max(1, x1 - x0), Math.max(1, y1 - y0)],\n })\n }}\n />\n ))}\n </g>\n )\n }, [isNodeEditing, size, zoom, hoveredNode, shape.id, shape.point, app])\n\n const svgOverflow = isNodeEditing ? { overflow: 'visible' as const } : undefined\n\n return (\n <FullWrapper ref={ref} {...events}>\n <TextLabel\n font={font}\n text={label}\n color={style.labelColor ?? styles.stroke}\n background={style.labelBackground}\n textGradient={style.textGradient}\n offsetX={(labelPoint[0] - 0.5) * bounds.width}\n offsetY={offsetY + (labelPoint[1] - 0.5) * bounds.height}\n width={Math.max(0, bounds.width * 0.5 - 16)}\n isEditing={isEditing}\n onChange={handleLabelChange}\n onBlur={onShapeBlur}\n />\n <SVGContainer\n id={shape.id + '_svg'}\n opacity={isGhost ? GHOSTED_OPACITY : styles.opacity}\n style={svgOverflow}\n >\n {isBinding && <TriangleBindingIndicator size={size} />}\n <Component\n id={id}\n style={style}\n size={size}\n isSelected={isSelected}\n isDarkMode={meta.isDarkMode}\n />\n {nodeOverlay}\n </SVGContainer>\n </FullWrapper>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const { size } = shape\n return <polygon points={getTrianglePoints(size).join()} />\n })\n\n private getPoints(shape: T) {\n const {\n rotation = 0,\n point: [x, y],\n size: [w, h],\n } = shape\n return [\n [x + w / 2, y],\n [x, y + h],\n [x + w, y + h],\n ].map((pt) => Vec.rotWith(pt, this.getCenter(shape), rotation))\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style || next.label !== prev.label\n }\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n getExpandedBounds = (shape: T) => {\n return Utils.getBoundsFromPoints(\n getTrianglePoints(shape.size, this.bindingDistance).map((pt) => Vec.add(pt, shape.point))\n )\n }\n\n hitTestLineSegment = (shape: T, A: number[], B: number[]): boolean => {\n return intersectLineSegmentPolyline(A, B, this.getPoints(shape)).didIntersect\n }\n\n hitTestBounds = (shape: T, bounds: TLBounds): boolean => {\n return (\n Utils.boundsContained(this.getBounds(shape), bounds) ||\n intersectBoundsPolygon(bounds, this.getPoints(shape)).length > 0\n )\n }\n\n getBindingPoint = <K extends TVShape>(\n shape: T,\n fromShape: K,\n point: number[],\n origin: number[],\n direction: number[],\n bindAnywhere: boolean\n ) => {\n // Algorithm time! We need to find the binding point (a normalized point inside of the shape, or around the shape, where the arrow will point to) and the distance from the binding shape to the anchor.\n\n const expandedBounds = this.getExpandedBounds(shape)\n\n if (!Utils.pointInBounds(point, expandedBounds)) return\n\n const points = getTrianglePoints(shape.size).map((pt) => Vec.add(pt, shape.point))\n\n const expandedPoints = getTrianglePoints(shape.size, this.bindingDistance).map((pt) =>\n Vec.add(pt, shape.point)\n )\n\n const closestDistanceToEdge = Utils.pointsToLineSegments(points, true)\n .map(([a, b]) => Vec.distanceToLineSegment(a, b, point))\n .sort((a, b) => a - b)[0]\n\n if (\n !(Utils.pointInPolygon(point, expandedPoints) || closestDistanceToEdge < this.bindingDistance)\n )\n return\n\n const intersections = Utils.pointsToLineSegments(expandedPoints.concat([expandedPoints[0]]))\n .map((segment) => intersectRayLineSegment(origin, direction, segment[0], segment[1]))\n .filter((intersection) => intersection.didIntersect)\n .flatMap((intersection) => intersection.points)\n\n if (!intersections.length) return\n\n // The center of the triangle\n const center = Vec.add(getTriangleCentroid(shape.size), shape.point)\n\n // Find furthest intersection between ray from origin through point and expanded bounds. TODO: What if the shape has a curve? In that case, should we intersect the circle-from-three-points instead?\n const intersection = intersections.sort((a, b) => Vec.dist(b, origin) - Vec.dist(a, origin))[0]\n\n // The point between the handle and the intersection\n const middlePoint = Vec.med(point, intersection)\n\n let anchor: number[]\n let distance: number\n\n if (bindAnywhere) {\n anchor = Vec.dist(point, center) < BINDING_DISTANCE / 2 ? center : point\n distance = 0\n } else {\n if (Vec.distanceToLineSegment(point, middlePoint, center) < BINDING_DISTANCE / 2) {\n anchor = center\n } else {\n anchor = middlePoint\n }\n\n if (Utils.pointInPolygon(point, points)) {\n distance = this.bindingDistance\n } else {\n distance = Math.max(this.bindingDistance, closestDistanceToEdge)\n }\n }\n\n const bindingPoint = Vec.divV(Vec.sub(anchor, [expandedBounds.minX, expandedBounds.minY]), [\n expandedBounds.width,\n expandedBounds.height,\n ])\n\n return {\n point: Vec.clampV(bindingPoint, 0, 1),\n distance,\n }\n }\n\n transform = transformRectangle\n\n transformSingle = transformSingleRectangle\n}\n\nconst FullWrapper = styled('div', { width: '100%', height: '100%' })\n", "import * as React from 'react'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getTrianglePoints } from '../triangleHelpers'\n\ninterface TriangleSvgProps {\n id: string\n size: number[]\n style: ShapeStyles\n isSelected: boolean\n isDarkMode: boolean\n}\n\nexport const DashedTriangle = React.memo(function DashedTriangle({\n id,\n size,\n style,\n isSelected,\n isDarkMode,\n}: TriangleSvgProps) {\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n const sw = 1 + strokeWidth * 1.618\n const points = getTrianglePoints(size)\n const sides = Utils.pointsToLineSegments(points, true)\n const paths = sides.map(([start, end], i) => {\n const { strokeDasharray, strokeDashoffset } = Utils.getPerfectDashProps(\n Vec.dist(start, end),\n strokeWidth * 1.618,\n style.dash\n )\n\n return (\n <line\n key={id + '_' + i}\n x1={start[0]}\n y1={start[1]}\n x2={end[0]}\n y2={end[1]}\n stroke={stroke}\n strokeWidth={sw}\n strokeLinecap=\"round\"\n strokeDasharray={strokeDasharray}\n strokeDashoffset={strokeDashoffset}\n />\n )\n })\n\n const bgPath = points.join()\n\n return (\n <>\n {defs}\n <polygon\n className={style.isFilled || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n points={bgPath}\n />\n {style.isFilled && <polygon fill={activeFill} points={bgPath} pointerEvents=\"none\" />}\n <g pointerEvents=\"stroke\">{paths}</g>\n </>\n )\n})\n", "import getStroke, { getStrokePoints } from 'perfect-freehand'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { getOffsetPolygon, getShapeStyle } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\n\nexport function getTrianglePoints(size: number[], offset = 0, rotation = 0) {\n const [w, h] = size\n let points = [\n [w / 2, 0],\n [w, h],\n [0, h],\n ]\n if (offset) points = getOffsetPolygon(points, offset)\n if (rotation) points = points.map((pt) => Vec.rotWith(pt, [w / 2, h / 2], rotation))\n\n return points\n}\n\nexport function getTriangleCentroid(size: number[]) {\n const [w, h] = size\n const points = [\n [w / 2, 0],\n [w, h],\n [0, h],\n ]\n return [\n (points[0][0] + points[1][0] + points[2][0]) / 3,\n (points[0][1] + points[1][1] + points[2][1]) / 3,\n ]\n}\n\nfunction getTriangleDrawPoints(id: string, size: number[], strokeWidth: number) {\n const [w, h] = size\n const getRandom = Utils.rng(id)\n // Random corner offsets\n const offsets = Array.from(Array(3)).map(() => {\n return [getRandom() * strokeWidth * 0.75, getRandom() * strokeWidth * 0.75]\n })\n // Corners\n const corners = [\n Vec.add([w / 2, 0], offsets[0]),\n Vec.add([w, h], offsets[1]),\n Vec.add([0, h], offsets[2]),\n ]\n // Which side to start drawing first\n const rm = Math.round(Math.abs(getRandom() * 2 * 3))\n // Number of points per side\n // Inset each line by the corner radii and let the freehand algo\n // interpolate points for the corners.\n const lines = Utils.rotateArray(\n [\n Vec.pointsBetween(corners[0], corners[1], 32),\n Vec.pointsBetween(corners[1], corners[2], 32),\n Vec.pointsBetween(corners[2], corners[0], 32),\n ],\n rm\n )\n // For the final points, include the first half of the first line again,\n // so that the line wraps around and avoids ending on a sharp corner.\n // This has a bit of finesse and magic\u2014if you change the points between\n // function, then you'll likely need to change this one too.\n const points = [...lines.flat(), ...lines[0]]\n return {\n points,\n }\n}\n\nfunction getDrawStrokeInfo(id: string, size: number[], style: ShapeStyles) {\n const { strokeWidth } = getShapeStyle(style)\n const { points } = getTriangleDrawPoints(id, size, strokeWidth)\n const options = {\n size: strokeWidth,\n thinning: 0.65,\n streamline: 0.3,\n smoothing: 1,\n simulatePressure: false,\n last: true,\n }\n return { points, options }\n}\n\nexport function getTrianglePath(id: string, size: number[], style: ShapeStyles) {\n const { points, options } = getDrawStrokeInfo(id, size, style)\n const stroke = getStroke(points, options)\n return Utils.getSvgPathFromStroke(stroke)\n}\n\nexport function getTriangleIndicatorPathTDSnapshot(id: string, size: number[], style: ShapeStyles) {\n const { points, options } = getDrawStrokeInfo(id, size, style)\n return Utils.getSvgPathFromStrokePoints(getStrokePoints(points, options))\n}\n", "import * as React from 'react'\nimport { getShapeStyle, useGradientFill } from '~state/shapes/shared'\nimport type { ShapeStyles } from '~types'\nimport { getTriangleIndicatorPathTDSnapshot, getTrianglePath } from '../triangleHelpers'\n\ninterface TriangleSvgProps {\n id: string\n size: number[]\n style: ShapeStyles\n isSelected: boolean\n isDarkMode: boolean\n}\n\nexport const DrawTriangle = React.memo(function DrawTriangle({\n id,\n size,\n style,\n isSelected,\n isDarkMode,\n}: TriangleSvgProps) {\n const { stroke, strokeWidth, fill } = getShapeStyle(style, isDarkMode)\n const { defs, gradFill } = useGradientFill(id, style)\n const activeFill = gradFill ?? fill\n const pathTDSnapshot = getTrianglePath(id, size, style)\n const indicatorPath = getTriangleIndicatorPathTDSnapshot(id, size, style)\n return (\n <>\n {defs}\n <path\n className={style.isFilled || isSelected ? 'tv-fill-hitarea' : 'tv-stroke-hitarea'}\n d={indicatorPath}\n />\n {style.isFilled && <path d={indicatorPath} fill={activeFill} pointerEvents=\"none\" />}\n <path\n d={pathTDSnapshot}\n fill={stroke}\n stroke={stroke}\n strokeWidth={strokeWidth}\n pointerEvents=\"none\"\n />\n </>\n )\n})\n", "import * as React from 'react'\nimport { BINDING_DISTANCE } from '~constants'\nimport { getTrianglePoints } from '../triangleHelpers'\n\ninterface TriangleBindingIndicatorProps {\n size: number[]\n}\n\nexport function TriangleBindingIndicator({ size }: TriangleBindingIndicatorProps) {\n const trianglePoints = getTrianglePoints(size).join()\n return (\n <polygon\n className=\"tv-binding-indicator\"\n points={trianglePoints}\n strokeWidth={BINDING_DISTANCE * 2}\n />\n )\n}\n", "import { styled } from '@stitches/react'\nimport * as React from 'react'\nimport { HTMLContainer, Utils } from 'telva-core'\nimport { GHOSTED_OPACITY } from '~constants'\nimport { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport {\n defaultStyle,\n getBoundsRectangle,\n transformRectangle,\n transformSingleRectangle,\n} from '~state/shapes/shared'\nimport { TVMeta, TVShapeType, TVVideoAsset, VideoShape } from '~types'\n\ntype T = VideoShape\ntype E = HTMLDivElement\n\nexport class VideoUtil extends TVShapeUtil<T, E> {\n type = TVShapeType.Video as const\n canBind = true\n canEdit = true\n canClone = true\n isAspectRatioLocked = true\n showCloneHandles = false\n isStateful = true // don't unmount\n\n getShape = (props: Partial<T>): T => {\n return Utils.deepMerge<T>(\n {\n id: 'video',\n type: TVShapeType.Video,\n name: 'Video',\n parentId: 'page',\n childIndex: 1,\n point: [0, 0],\n size: [1, 1],\n rotation: 0,\n style: defaultStyle,\n assetId: 'assetId',\n isPlaying: true,\n currentTime: 0,\n },\n props\n )\n }\n\n Component = TVShapeUtil.Component<T, E, TVMeta>(\n (\n { shape, asset = { src: '' }, isBinding, isEditing, isGhost, meta, events, onShapeChange },\n ref\n ) => {\n const rVideo = React.useRef<HTMLVideoElement>(null)\n const rWrapper = React.useRef<HTMLDivElement>(null)\n\n const { currentTime = 0, size, isPlaying, style } = shape\n\n React.useLayoutEffect(() => {\n const wrapper = rWrapper.current\n if (!wrapper) return\n const [width, height] = size\n wrapper.style.width = `${width}px`\n wrapper.style.height = `${height}px`\n }, [size])\n\n React.useLayoutEffect(() => {\n const video = rVideo.current\n if (!video) return\n if (isPlaying) video.play()\n // throws error on safari\n else video.pause()\n }, [isPlaying])\n\n React.useLayoutEffect(() => {\n const video = rVideo.current\n if (!video) return\n if (currentTime !== video.currentTime) {\n video.currentTime = currentTime\n }\n }, [currentTime])\n\n const handlePlay = React.useCallback(() => {\n onShapeChange?.({ id: shape.id, isPlaying: true })\n }, [])\n\n const handlePause = React.useCallback(() => {\n onShapeChange?.({ id: shape.id, isPlaying: false })\n }, [])\n\n const handleSetCurrentTime = React.useCallback(() => {\n const video = rVideo.current\n if (!video) return\n if (!isEditing) return\n onShapeChange?.({ id: shape.id, currentTime: video.currentTime })\n }, [isEditing])\n\n return (\n <HTMLContainer ref={ref} {...events}>\n {isBinding && (\n <div\n className=\"tv-binding-indicator\"\n style={{\n position: 'absolute',\n top: -this.bindingDistance,\n left: -this.bindingDistance,\n width: `calc(100% + ${this.bindingDistance * 2}px)`,\n height: `calc(100% + ${this.bindingDistance * 2}px)`,\n backgroundColor: 'var(--tv-selectFill)',\n }}\n />\n )}\n <Wrapper\n ref={rWrapper}\n isDarkMode={meta.isDarkMode}\n isGhost={isGhost}\n isFilled={style.isFilled}\n >\n <VideoElement\n ref={rVideo}\n id={shape.id + '_video'}\n muted\n loop\n playsInline\n disableRemotePlayback\n disablePictureInPicture\n controls={isEditing}\n autoPlay={isPlaying}\n onPlay={handlePlay}\n onPause={handlePause}\n onTimeUpdate={handleSetCurrentTime}\n >\n <source src={(asset as TVVideoAsset).src} />\n </VideoElement>\n </Wrapper>\n </HTMLContainer>\n )\n }\n )\n\n Indicator = TVShapeUtil.Indicator<T>(({ shape }) => {\n const {\n size: [width, height],\n } = shape\n\n return (\n <rect x={0} y={0} rx={2} ry={2} width={Math.max(1, width)} height={Math.max(1, height)} />\n )\n })\n\n getBounds = (shape: T) => {\n return getBoundsRectangle(shape, this.boundsCache)\n }\n\n shouldRender = (prev: T, next: T) => {\n return next.size !== prev.size || next.style !== prev.style || next.isPlaying !== prev.isPlaying\n }\n\n getSvgElement = (shape: VideoShape) => {\n const bounds = this.getBounds(shape)\n const elm = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n elm.setAttribute('width', `${bounds.width}`)\n elm.setAttribute('height', `${bounds.height}`)\n elm.setAttribute('xmlns:xlink', `http://www.w3.org/1999/xlink`)\n return elm\n }\n\n transform = transformRectangle\n\n transformSingle = transformSingleRectangle\n}\n\nconst Wrapper = styled('div', {\n pointerEvents: 'all',\n position: 'relative',\n fontFamily: 'sans-serif',\n fontSize: '2em',\n height: '100%',\n width: '100%',\n borderRadius: '3px',\n perspective: '800px',\n overflow: 'hidden',\n p: {\n userSelect: 'none',\n },\n img: {\n userSelect: 'none',\n },\n variants: {\n isGhost: {\n false: { opacity: 1 },\n true: { transition: 'opacity .2s', opacity: GHOSTED_OPACITY },\n },\n isFilled: {\n true: {},\n false: {},\n },\n isDarkMode: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n {\n isFilled: true,\n isDarkMode: true,\n css: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.3), 1px 1px 4px rgba(0,0,0,.3), 1px 1px 2px rgba(0,0,0,.3)',\n },\n },\n {\n isFilled: true,\n isDarkMode: false,\n css: {\n boxShadow:\n '2px 3px 12px -2px rgba(0,0,0,.2), 1px 1px 4px rgba(0,0,0,.16), 1px 1px 2px rgba(0,0,0,.16)',\n },\n },\n ],\n})\n\nconst VideoElement = styled('video', {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n maxWidth: '100%',\n minWidth: '100%',\n pointerEvents: 'none',\n objectFit: 'cover',\n userSelect: 'none',\n borderRadius: 2,\n})\n", "import type { TVShapeUtil } from '~state/shapes/TVShapeUtil'\nimport { TVShape, TVShapeType } from '~types'\nimport { ArrowUtil } from './ArrowUtil'\nimport { DrawUtil } from './DrawUtil'\nimport { EllipseUtil } from './EllipseUtil'\nimport { GroupUtil } from './GroupUtil'\nimport { ImageUtil } from './ImageUtil'\nimport { PenUtil } from './PenUtil'\nimport { ReactComponentUtil } from './ReactComponentUtil/ReactComponentUtil'\nimport { RectangleUtil } from './RectangleUtil'\nimport { StickyUtil } from './StickyUtil'\nimport { TextUtil } from './TextUtil'\nimport { TriangleUtil } from './TriangleUtil'\nimport { VideoUtil } from './VideoUtil'\n\nexport const Rectangle = new RectangleUtil()\nexport const Triangle = new TriangleUtil()\nexport const Ellipse = new EllipseUtil()\nexport const Draw = new DrawUtil()\nexport const Arrow = new ArrowUtil()\nexport const Text = new TextUtil()\nexport const Group = new GroupUtil()\nexport const Sticky = new StickyUtil()\nexport const Image = new ImageUtil()\nexport const Video = new VideoUtil()\nexport const ReactComponent = new ReactComponentUtil()\nexport const Pen = new PenUtil()\n\nexport const shapeUtils = {\n [TVShapeType.Rectangle]: Rectangle,\n [TVShapeType.Triangle]: Triangle,\n [TVShapeType.Ellipse]: Ellipse,\n [TVShapeType.Draw]: Draw,\n [TVShapeType.Arrow]: Arrow,\n [TVShapeType.Text]: Text,\n [TVShapeType.Group]: Group,\n [TVShapeType.Sticky]: Sticky,\n [TVShapeType.Image]: Image,\n [TVShapeType.Video]: Video,\n [TVShapeType.ReactComponent]: ReactComponent,\n [TVShapeType.Pen]: Pen,\n}\n\nexport const getShapeUtil = <T extends TVShape>(shape: T | T['type']) => {\n if (typeof shape === 'string') return shapeUtils[shape] as unknown as TVShapeUtil<T>\n return shapeUtils[shape.type] as unknown as TVShapeUtil<T>\n}\n", "import type { TLBounds, TLShape, TLTransformInfo } from 'telva-core'\nimport Vec from 'telva-vec'\n\n/**\n * Transform a rectangular shape.\n * @param shape\n * @param bounds\n * @param param2\n */\nexport function transformRectangle<T extends TLShape & { size: number[] }>(\n shape: T,\n bounds: TLBounds,\n { initialShape, transformOrigin, scaleX, scaleY }: TLTransformInfo<T>\n) {\n if (shape.rotation || initialShape.isAspectRatioLocked) {\n const size = Vec.toFixed(\n Vec.mul(initialShape.size, Math.min(Math.abs(scaleX), Math.abs(scaleY)))\n )\n const point = Vec.toFixed([\n bounds.minX +\n (bounds.width - shape.size[0]) * (scaleX < 0 ? 1 - transformOrigin[0] : transformOrigin[0]),\n bounds.minY +\n (bounds.height - shape.size[1]) *\n (scaleY < 0 ? 1 - transformOrigin[1] : transformOrigin[1]),\n ])\n const rotation =\n (scaleX < 0 && scaleY >= 0) || (scaleY < 0 && scaleX >= 0)\n ? initialShape.rotation\n ? -initialShape.rotation\n : 0\n : initialShape.rotation\n return {\n size,\n point,\n rotation,\n }\n } else {\n return {\n point: Vec.toFixed([bounds.minX, bounds.minY]),\n size: Vec.toFixed([bounds.width, bounds.height]),\n }\n }\n}\n", "import type { TLBounds, TLShape } from 'telva-core'\nimport Vec from 'telva-vec'\n\n/**\n * Transform a single rectangular shape.\n * @param shape\n * @param bounds\n */\nexport function transformSingleRectangle<T extends TLShape & { size: number[] }>(\n shape: T,\n bounds: TLBounds\n) {\n return {\n size: Vec.toFixed([bounds.width, bounds.height]),\n point: Vec.toFixed([bounds.minX, bounds.minY]),\n }\n}\n", "import * as React from 'react'\nimport { styled } from '~styles'\n\n// \u2500\u2500\u2500 Color Utilities \u2500\u2500\u2500\nexport function hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n h = h / 360\n s = s / 100\n v = v / 100\n let r = 0,\n g = 0,\n b = 0\n const i = Math.floor(h * 6),\n f = h * 6 - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s)\n switch (i % 6) {\n case 0:\n r = v\n g = t\n b = p\n break\n case 1:\n r = q\n g = v\n b = p\n break\n case 2:\n r = p\n g = v\n b = t\n break\n case 3:\n r = p\n g = q\n b = v\n break\n case 4:\n r = t\n g = p\n b = v\n break\n case 5:\n r = v\n g = p\n b = q\n break\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255\n g /= 255\n b /= 255\n const mx = Math.max(r, g, b),\n mn = Math.min(r, g, b),\n d = mx - mn\n let h = 0\n if (d !== 0) {\n if (mx === r) h = ((g - b) / d) % 6\n else if (mx === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h = Math.round(h * 60)\n if (h < 0) h += 360\n }\n const s = mx === 0 ? 0 : Math.round((d / mx) * 100)\n const v = Math.round(mx * 100)\n return [h, s, v]\n}\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const m = hex.replace('#', '').match(/.{2}/g)\n if (!m) return [0, 0, 0]\n return [parseInt(m[0], 16), parseInt(m[1], 16), parseInt(m[2], 16)]\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')\n}\n\n// \u2500\u2500\u2500 History \u2500\u2500\u2500\nconst HISTORY_KEY = 'telva_color_history'\nexport function getColorHistory(): string[] {\n try {\n return JSON.parse(localStorage.getItem(HISTORY_KEY) || '[]').slice(0, 16)\n } catch {\n return []\n }\n}\nexport function pushColorHistory(hex: string) {\n if (hex === 'transparent') return\n const h = getColorHistory().filter((c) => c !== hex)\n h.unshift(hex)\n localStorage.setItem(HISTORY_KEY, JSON.stringify(h.slice(0, 16)))\n}\n\n// \u2500\u2500\u2500 Checker pattern for transparent \u2500\u2500\u2500\nconst CHECKER =\n 'url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQYV2P8////fwYkwMjIyIjCZmBgYEBlMDIiiwEAGiYFA/wQA1AAAAAASUVORK5CYII=\")'\nexport { CHECKER }\n\ninterface ColorPickerProps {\n color: string\n opacity?: number\n onChange: (color: string, opacity: number) => void\n showTransparent?: boolean\n showOpacity?: boolean\n}\n\nexport const ColorPicker = React.memo(function ColorPicker({\n color,\n opacity = 1,\n onChange,\n showTransparent = true,\n showOpacity = true,\n}: ColorPickerProps) {\n const isTransparent = color === 'transparent'\n const rgb = isTransparent ? ([255, 255, 255] as [number, number, number]) : hexToRgb(color)\n const [hsv, setHsv] = React.useState<[number, number, number]>(() => rgbToHsv(...rgb))\n\n React.useEffect(() => {\n if (!isTransparent) {\n const newRgb = hexToRgb(color)\n const newHsv = rgbToHsv(...newRgb)\n setHsv(newHsv)\n }\n }, [color])\n\n const satCanvasRef = React.useRef<HTMLCanvasElement>(null)\n const hueCanvasRef = React.useRef<HTMLCanvasElement>(null)\n\n React.useEffect(() => {\n const canvas = satCanvasRef.current\n if (!canvas) return\n const ctx = canvas.getContext('2d')!\n const w = canvas.width,\n h = canvas.height\n const [r, g, b] = hsvToRgb(hsv[0], 100, 100)\n ctx.fillStyle = `rgb(${r},${g},${b})`\n ctx.fillRect(0, 0, w, h)\n const gw = ctx.createLinearGradient(0, 0, w, 0)\n gw.addColorStop(0, 'rgba(255,255,255,1)')\n gw.addColorStop(1, 'rgba(255,255,255,0)')\n ctx.fillStyle = gw\n ctx.fillRect(0, 0, w, h)\n const gb = ctx.createLinearGradient(0, 0, 0, h)\n gb.addColorStop(0, 'rgba(0,0,0,0)')\n gb.addColorStop(1, 'rgba(0,0,0,1)')\n ctx.fillStyle = gb\n ctx.fillRect(0, 0, w, h)\n }, [hsv[0]])\n\n React.useEffect(() => {\n const canvas = hueCanvasRef.current\n if (!canvas) return\n const ctx = canvas.getContext('2d')!\n const w = canvas.width\n const g = ctx.createLinearGradient(0, 0, w, 0)\n for (let i = 0; i <= 6; i++) {\n const [r, gb2, b] = hsvToRgb((i / 6) * 360, 100, 100)\n g.addColorStop(i / 6, `rgb(${r},${gb2},${b})`)\n }\n ctx.fillStyle = g\n ctx.fillRect(0, 0, w, canvas.height)\n }, [])\n\n const emit = React.useCallback(\n (h: number, s: number, v: number, a: number) => {\n const [r, g, b] = hsvToRgb(h, s, v)\n const hex = rgbToHex(r, g, b)\n pushColorHistory(hex)\n onChange(hex, a)\n },\n [onChange]\n )\n\n const onSatDown = React.useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n e.stopPropagation()\n const canvas = satCanvasRef.current!\n const rect = canvas.getBoundingClientRect()\n const update = (ev: { clientX: number; clientY: number }) => {\n const s = Math.max(0, Math.min(100, ((ev.clientX - rect.left) / rect.width) * 100))\n const v = Math.max(0, Math.min(100, (1 - (ev.clientY - rect.top) / rect.height) * 100))\n setHsv([hsv[0], s, v])\n emit(hsv[0], s, v, opacity)\n }\n update(e)\n const onMove = (ev: PointerEvent) => update(ev)\n const onUp = () => {\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [hsv, opacity, emit]\n )\n\n const onHueDown = React.useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.preventDefault()\n e.stopPropagation()\n const canvas = hueCanvasRef.current!\n const rect = canvas.getBoundingClientRect()\n const update = (ev: { clientX: number }) => {\n const h = Math.max(0, Math.min(360, ((ev.clientX - rect.left) / rect.width) * 360))\n setHsv([h, hsv[1], hsv[2]])\n emit(h, hsv[1], hsv[2], opacity)\n }\n update(e)\n const onMove = (ev: PointerEvent) => update(ev)\n const onUp = () => {\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [hsv, opacity, emit]\n )\n\n const opacityBarRef = React.useRef<HTMLDivElement>(null)\n const onOpacityDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n const bar = opacityBarRef.current!\n const rect = bar.getBoundingClientRect()\n const update = (ev: { clientX: number }) => {\n const a = Math.max(0, Math.min(1, (ev.clientX - rect.left) / rect.width))\n if (!isTransparent) emit(hsv[0], hsv[1], hsv[2], a)\n else onChange('transparent', a)\n }\n update(e)\n const onMove = (ev: PointerEvent) => update(ev)\n const onUp = () => {\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [hsv, isTransparent, emit, onChange]\n )\n\n const currentHex = isTransparent ? 'transparent' : rgbToHex(...hsvToRgb(hsv[0], hsv[1], hsv[2]))\n const currentRgb = isTransparent ? [255, 255, 255] : hsvToRgb(hsv[0], hsv[1], hsv[2])\n\n return (\n <Wrapper onClick={(e) => e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}>\n <SatPanel>\n <canvas\n ref={satCanvasRef}\n width={200}\n height={130}\n onPointerDown={onSatDown}\n style={{ width: '100%', height: '100%', cursor: 'crosshair', borderRadius: 4 }}\n />\n {!isTransparent && (\n <SatMarker\n style={{\n left: `${hsv[1]}%`,\n top: `${100 - hsv[2]}%`,\n borderColor: hsv[2] > 50 ? '#000' : '#fff',\n }}\n />\n )}\n </SatPanel>\n\n <BarWrap>\n <canvas\n ref={hueCanvasRef}\n width={200}\n height={12}\n onPointerDown={onHueDown}\n style={{ width: '100%', height: '100%', cursor: 'pointer', borderRadius: 6 }}\n />\n {!isTransparent && <BarThumb style={{ left: `${(hsv[0] / 360) * 100}%` }} />}\n </BarWrap>\n\n {showOpacity && (\n <BarWrap>\n <OpacityBar\n ref={opacityBarRef}\n onPointerDown={onOpacityDown}\n style={{\n background: `linear-gradient(to right, transparent, ${\n currentHex === 'transparent' ? '#fff' : currentHex\n })`,\n cursor: 'pointer',\n }}\n />\n <BarThumb style={{ left: `${opacity * 100}%` }} />\n </BarWrap>\n )}\n\n <InputRow>\n <HexInput\n value={isTransparent ? '' : currentHex.replace('#', '')}\n placeholder=\"hex\"\n maxLength={6}\n onChange={(e) => {\n const v = e.target.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6)\n if (v.length === 6) {\n const r2 = hexToRgb('#' + v)\n setHsv(rgbToHsv(...r2))\n onChange('#' + v, opacity)\n pushColorHistory('#' + v)\n }\n }}\n onKeyDown={(e) => e.stopPropagation()}\n />\n {[0, 1, 2].map((i) => (\n <RgbInput\n key={i}\n value={currentRgb[i]}\n type=\"number\"\n min={0}\n max={255}\n onChange={(e) => {\n const v = Math.max(0, Math.min(255, Number(e.target.value)))\n const newRgb = [...currentRgb] as [number, number, number]\n newRgb[i] = v\n setHsv(rgbToHsv(...newRgb))\n const hex = rgbToHex(...newRgb)\n onChange(hex, opacity)\n pushColorHistory(hex)\n }}\n onKeyDown={(e) => e.stopPropagation()}\n />\n ))}\n {showOpacity && (\n <RgbInput\n value={Math.round(opacity * 100)}\n type=\"number\"\n min={0}\n max={100}\n onChange={(e) => {\n const a = Math.max(0, Math.min(100, Number(e.target.value))) / 100\n if (!isTransparent) emit(hsv[0], hsv[1], hsv[2], a)\n else onChange('transparent', a)\n }}\n onKeyDown={(e) => e.stopPropagation()}\n style={{ width: 32 }}\n />\n )}\n </InputRow>\n <InputLabels>\n <span style={{ flex: 2 }}>Hex</span>\n <span>R</span>\n <span>G</span>\n <span>B</span>\n {showOpacity && <span>A</span>}\n </InputLabels>\n\n <SwatchRow>\n {showTransparent && (\n <Swatch\n title=\"Transparent\"\n $active={isTransparent}\n style={{ backgroundImage: CHECKER, backgroundSize: '6px 6px' }}\n onClick={() => onChange('transparent', opacity)}\n />\n )}\n {getColorHistory().map((c) => (\n <Swatch\n key={c}\n style={{ backgroundColor: c }}\n $active={currentHex === c}\n onClick={() => {\n const r2 = hexToRgb(c)\n setHsv(rgbToHsv(...r2))\n onChange(c, opacity)\n }}\n />\n ))}\n </SwatchRow>\n </Wrapper>\n )\n})\n\n// \u2500\u2500\u2500 Inline Color Swatch (for use in property rows) \u2500\u2500\u2500\ninterface ColorSwatchInputProps {\n color: string\n opacity?: number\n onChange: (color: string, opacity: number) => void\n showTransparent?: boolean\n showOpacity?: boolean\n label?: string\n}\n\nexport const ColorSwatchInput = React.memo(function ColorSwatchInput({\n color,\n opacity = 1,\n onChange,\n showTransparent = true,\n showOpacity = true,\n label,\n}: ColorSwatchInputProps) {\n const [open, setOpen] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n const isTransparent = color === 'transparent'\n\n React.useEffect(() => {\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [])\n\n const displayHex = isTransparent ? 'transparent' : color\n\n return (\n <SwatchInputWrap ref={ref}>\n <SwatchInputRow>\n {label && <SwatchLabel>{label}</SwatchLabel>}\n <SwatchPreview\n onClick={() => setOpen(!open)}\n style={{\n backgroundColor: isTransparent ? 'transparent' : color,\n backgroundImage: isTransparent ? CHECKER : 'none',\n backgroundSize: '6px 6px',\n }}\n />\n <SwatchHexText\n value={isTransparent ? '' : displayHex.replace('#', '').toUpperCase()}\n placeholder=\"\u2014\"\n maxLength={6}\n onChange={(e) => {\n const v = e.target.value\n if (v.toLowerCase() === 'transparent') {\n onChange('transparent', opacity)\n return\n }\n const clean = v.replace(/[^0-9a-fA-F#]/g, '').slice(0, 7)\n if (/^#[0-9a-fA-F]{6}$/i.test(clean) || /^[0-9a-fA-F]{6}$/i.test(clean)) {\n const hex = clean.startsWith('#') ? clean : '#' + clean\n onChange(hex, opacity)\n pushColorHistory(hex)\n }\n }}\n onKeyDown={(e) => e.stopPropagation()}\n />\n <SwatchOpacityText>{Math.round(opacity * 100)}%</SwatchOpacityText>\n </SwatchInputRow>\n {open && (\n <SwatchPopover>\n <ColorPicker\n color={color}\n opacity={opacity}\n onChange={(c, a) => onChange(c, a)}\n showTransparent={showTransparent}\n showOpacity={showOpacity}\n />\n </SwatchPopover>\n )}\n </SwatchInputWrap>\n )\n})\n\n// \u2500\u2500\u2500 Styles \u2500\u2500\u2500\nconst Wrapper = styled('div', {\n background: '$panel',\n border: '1px solid $separator',\n borderRadius: '8px',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n boxShadow: '0 8px 32px rgba(0,0,0,0.45)',\n minWidth: 210,\n})\n\nconst SatPanel = styled('div', {\n position: 'relative',\n width: '100%',\n height: 130,\n borderRadius: 4,\n overflow: 'hidden',\n})\n\nconst SatMarker = styled('div', {\n position: 'absolute',\n width: 10,\n height: 10,\n borderRadius: '50%',\n border: '2px solid white',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n boxShadow: '0 0 2px rgba(0,0,0,0.5)',\n})\n\nconst BarWrap = styled('div', {\n position: 'relative',\n width: '100%',\n height: 12,\n borderRadius: 6,\n overflow: 'visible',\n})\n\nconst BarThumb = styled('div', {\n position: 'absolute',\n top: '50%',\n width: 14,\n height: 14,\n borderRadius: '50%',\n background: '#fff',\n border: '2px solid rgba(0,0,0,0.2)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.3)',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n})\n\nconst OpacityBar = styled('div', {\n width: '100%',\n height: '100%',\n borderRadius: 6,\n backgroundImage: CHECKER,\n backgroundSize: '8px 8px',\n position: 'relative',\n})\n\nconst InputRow = styled('div', {\n display: 'flex',\n gap: 3,\n alignItems: 'center',\n})\n\nconst InputLabels = styled('div', {\n display: 'flex',\n gap: 3,\n fontSize: '7px',\n color: 'rgba(255,255,255,0.35)',\n padding: '0 1px',\n '& > span': { flex: 1, textAlign: 'center' },\n})\n\nconst HexInput = styled('input', {\n flex: 2,\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: 4,\n color: '$text',\n fontSize: '9px',\n padding: '3px 5px',\n fontFamily: '$mono',\n outline: 'none',\n textTransform: 'uppercase',\n '&:focus': { borderColor: '$accent' },\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': { display: 'none' },\n})\n\nconst RgbInput = styled('input', {\n flex: 1,\n width: 28,\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: 4,\n color: '$text',\n fontSize: '9px',\n padding: '3px 4px',\n fontFamily: '$mono',\n outline: 'none',\n textAlign: 'center',\n '&:focus': { borderColor: '$accent' },\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': { display: 'none' },\n})\n\nconst SwatchRow = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n paddingTop: 2,\n})\n\nconst Swatch = styled('div', {\n width: 18,\n height: 18,\n borderRadius: 3,\n cursor: 'pointer',\n border: '1px solid $separator',\n transition: 'transform 0.08s, box-shadow 0.08s',\n '&:hover': { transform: 'scale(1.15)' },\n variants: {\n $active: {\n true: {\n boxShadow: '0 0 0 2px $colors$accent',\n transform: 'scale(1.1)',\n },\n },\n },\n})\n\nconst SwatchInputWrap = styled('div', {\n position: 'relative',\n width: '100%',\n})\n\nconst SwatchInputRow = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n})\n\nconst SwatchLabel = styled('label', {\n fontSize: '9px',\n color: '$textSecondary',\n fontWeight: 500,\n width: 36,\n flexShrink: 0,\n textAlign: 'right',\n})\n\nconst SwatchPreview = styled('div', {\n width: 20,\n height: 20,\n borderRadius: '$0',\n border: '1px solid $separator',\n flexShrink: 0,\n cursor: 'pointer',\n transition: 'box-shadow 0.08s',\n '&:hover': { boxShadow: '0 0 0 1px $colors$accent' },\n})\n\nconst SwatchHexText = styled('input', {\n flex: 1,\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: '$1',\n color: '$text',\n fontSize: '9px',\n padding: '3px 5px',\n fontFamily: '$mono',\n outline: 'none',\n textTransform: 'uppercase',\n '&:focus': { borderColor: '$accent' },\n})\n\nconst SwatchOpacityText = styled('span', {\n fontSize: '9px',\n color: '$textSecondary',\n fontFamily: '$mono',\n width: 32,\n textAlign: 'initial',\n flexShrink: 0,\n})\n\nconst SwatchPopover = styled('div', {\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n zIndex: 1000,\n marginTop: 4,\n boxShadow: '0 8px 32px rgba(0,0,0,0.5)',\n borderRadius: '$2',\n overflow: 'visible',\n})\n", "import * as React from 'react'\nimport { styled } from '~styles'\n\ninterface DraggableInputProps {\n value: number\n onChange: (value: number) => void\n label?: string\n min?: number\n max?: number\n step?: number\n suffix?: string\n style?: React.CSSProperties\n labelWidth?: number\n}\n\nexport const DraggableInput = React.memo(function DraggableInput({\n value,\n onChange,\n label,\n min = -Infinity,\n max = Infinity,\n step = 1,\n suffix,\n style,\n labelWidth = 18,\n}: DraggableInputProps) {\n const [editing, setEditing] = React.useState(false)\n const [editValue, setEditValue] = React.useState(String(value))\n const inputRef = React.useRef<HTMLInputElement>(null)\n const dragRef = React.useRef({ active: false, startX: 0, startVal: 0 })\n\n React.useEffect(() => {\n if (!editing) setEditValue(String(Math.round(value * 100) / 100))\n }, [value, editing])\n\n const clamp = (v: number) => Math.min(max, Math.max(min, v))\n\n // Drag from label\n const onLabelPointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLLabelElement>) => {\n e.preventDefault()\n e.stopPropagation()\n dragRef.current = { active: true, startX: e.clientX, startVal: value }\n const el = e.currentTarget\n el.setPointerCapture(e.pointerId)\n\n const onMove = (ev: PointerEvent) => {\n if (!dragRef.current.active) return\n const dx = ev.clientX - dragRef.current.startX\n const speed = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1\n const delta = Math.round(dx * speed * step)\n onChange(clamp(dragRef.current.startVal + delta))\n }\n\n const onUp = () => {\n dragRef.current.active = false\n el.releasePointerCapture(e.pointerId)\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [value, onChange, min, max, step]\n )\n\n // Drag from value display\n const onValuePointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n e.stopPropagation()\n const startX = e.clientX\n const startVal = value\n let dragged = false\n dragRef.current = { active: true, startX, startVal }\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX\n if (Math.abs(dx) > 2) dragged = true\n if (!dragged) return\n const speed = ev.shiftKey ? 10 : ev.altKey ? 0.1 : 1\n const delta = Math.round(dx * speed * step)\n onChange(clamp(startVal + delta))\n }\n\n const onUp = () => {\n dragRef.current.active = false\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n if (!dragged) {\n setEditing(true)\n setTimeout(() => inputRef.current?.select(), 0)\n }\n }\n\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [value, onChange, min, max, step]\n )\n\n const commitEdit = React.useCallback(() => {\n setEditing(false)\n const n = parseFloat(editValue)\n if (!isNaN(n)) onChange(clamp(n))\n }, [editValue, onChange, min, max])\n\n return (\n <Wrap style={style}>\n {label && (\n <DragLabel\n style={{ width: labelWidth, cursor: 'ew-resize' }}\n onPointerDown={onLabelPointerDown}\n >\n {label}\n </DragLabel>\n )}\n {editing ? (\n <StyledInput\n ref={inputRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commitEdit()\n if (e.key === 'Escape') setEditing(false)\n e.stopPropagation()\n }}\n autoFocus\n />\n ) : (\n <ValueDisplay onPointerDown={onValuePointerDown}>\n {Math.round(value * 100) / 100}\n {suffix && <Suffix>{suffix}</Suffix>}\n </ValueDisplay>\n )}\n </Wrap>\n )\n})\n\nconst Wrap = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n minWidth: 0,\n})\n\nconst DragLabel = styled('label', {\n fontSize: '9px',\n color: '$textSecondary',\n fontWeight: 500,\n flexShrink: 0,\n textAlign: 'right',\n userSelect: 'none',\n cursor: 'ew-resize',\n '&:active': { cursor: 'ew-resize' },\n})\n\nconst StyledInput = styled('input', {\n width: '100%',\n background: '$inputBg',\n border: '1px solid $accent',\n borderRadius: '$1',\n color: '$text',\n fontSize: '10px',\n padding: '3px 5px',\n fontFamily: '$mono',\n outline: 'none',\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': { display: 'none' },\n})\n\nconst ValueDisplay = styled('div', {\n flex: 1,\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: '$1',\n color: '$text',\n fontSize: '10px',\n padding: '3px 5px',\n fontFamily: '$mono',\n cursor: 'ew-resize',\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n userSelect: 'none',\n transition: 'border-color 0.1s',\n '&:hover': { borderColor: '$accent' },\n})\n\nconst Suffix = styled('span', {\n fontSize: '8px',\n color: '$textSecondary',\n marginLeft: '1px',\n})\n", "import * as React from 'react'\nimport { styled } from '~styles'\nimport { ColorPicker, pushColorHistory } from './ColorPicker'\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\nexport interface GradientStop {\n color: string\n position: number // 0-100\n opacity: number // 0-1\n}\n\nexport type GradientType = 'linear' | 'radial' | 'conic' | 'diamond'\n\nexport interface GradientData {\n type: GradientType\n stops: GradientStop[]\n angle: number\n centerX: number\n centerY: number\n}\n\n// \u2500\u2500\u2500 Utils \u2500\u2500\u2500\nexport function buildCssGradient(data: GradientData): string {\n const sorted = [...data.stops].sort((a, b) => a.position - b.position)\n const stops = sorted\n .map((s) => {\n const hex = s.color\n const alpha = Math.round(s.opacity * 255)\n .toString(16)\n .padStart(2, '0')\n return `${hex}${alpha} ${s.position}%`\n })\n .join(', ')\n\n switch (data.type) {\n case 'linear':\n return `linear-gradient(${data.angle}deg, ${stops})`\n case 'radial':\n return `radial-gradient(circle at ${data.centerX}% ${data.centerY}%, ${stops})`\n case 'conic':\n return `conic-gradient(from ${data.angle}deg at ${data.centerX}% ${data.centerY}%, ${stops})`\n case 'diamond':\n return `conic-gradient(from ${data.angle}deg, ${stops})`\n }\n}\n\nconst DEFAULT_DATA: GradientData = {\n type: 'linear',\n stops: [\n { color: '#0D99FF', position: 0, opacity: 1 },\n { color: '#FF6B00', position: 100, opacity: 1 },\n ],\n angle: 90,\n centerX: 50,\n centerY: 50,\n}\n\n// \u2500\u2500\u2500 Presets \u2500\u2500\u2500\nconst PRESETS_KEY = 'telva_gradient_presets'\nfunction getPresets(): GradientData[] {\n try {\n return JSON.parse(localStorage.getItem(PRESETS_KEY) || '[]')\n } catch {\n return []\n }\n}\nfunction savePreset(data: GradientData) {\n const presets = getPresets()\n presets.unshift(data)\n localStorage.setItem(PRESETS_KEY, JSON.stringify(presets.slice(0, 12)))\n}\nfunction removePreset(idx: number) {\n const presets = getPresets()\n presets.splice(idx, 1)\n localStorage.setItem(PRESETS_KEY, JSON.stringify(presets))\n}\n\n// \u2500\u2500\u2500 Type Icons \u2500\u2500\u2500\nfunction LinearIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <defs>\n <linearGradient id=\"lg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#0D99FF\" />\n <stop offset=\"100%\" stopColor=\"#FF6B00\" />\n </linearGradient>\n </defs>\n <rect x=\"1\" y=\"1\" width=\"12\" height=\"12\" rx=\"2\" fill=\"url(#lg)\" />\n </svg>\n )\n}\nfunction RadialIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <defs>\n <radialGradient id=\"rg\">\n <stop offset=\"0%\" stopColor=\"#0D99FF\" />\n <stop offset=\"100%\" stopColor=\"#FF6B00\" />\n </radialGradient>\n </defs>\n <rect x=\"1\" y=\"1\" width=\"12\" height=\"12\" rx=\"2\" fill=\"url(#rg)\" />\n </svg>\n )\n}\nfunction ConicIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"none\" stroke=\"#0D99FF\" strokeWidth=\"1.5\" />\n <line x1=\"7\" y1=\"7\" x2=\"7\" y2=\"1\" stroke=\"#FF6B00\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\nfunction DiamondIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <polygon points=\"7,1 13,7 7,13 1,7\" fill=\"none\" stroke=\"#0D99FF\" strokeWidth=\"1.2\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" fill=\"#FF6B00\" />\n </svg>\n )\n}\n\nconst TYPE_ICONS: Record<GradientType, React.ReactNode> = {\n linear: <LinearIcon />,\n radial: <RadialIcon />,\n conic: <ConicIcon />,\n diamond: <DiamondIcon />,\n}\n\ninterface GradientPickerProps {\n value?: GradientData\n onChange: (data: GradientData, css: string) => void\n}\n\nexport const GradientPicker = React.memo(function GradientPicker({\n value,\n onChange,\n}: GradientPickerProps) {\n const [data, setData] = React.useState<GradientData>(value || DEFAULT_DATA)\n const [selectedIdx, setSelectedIdx] = React.useState(0)\n const [showPresets, setShowPresets] = React.useState(false)\n const barRef = React.useRef<HTMLDivElement>(null)\n const wrapperRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (value) setData(value)\n }, [value])\n\n // Handle Delete key for removing selected stop\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (data.stops.length > 2) {\n e.preventDefault()\n removeStopAtIdx(selectedIdx)\n }\n }\n }\n const el = wrapperRef.current\n if (el) {\n el.addEventListener('keydown', onKey)\n return () => el.removeEventListener('keydown', onKey)\n }\n return undefined\n }, [data.stops.length, selectedIdx])\n\n const update = React.useCallback(\n (patch: Partial<GradientData>) => {\n setData((d) => {\n const next = { ...d, ...patch }\n onChange(next, buildCssGradient(next))\n return next\n })\n },\n [onChange]\n )\n\n const updateStop = React.useCallback(\n (idx: number, patch: Partial<GradientStop>) => {\n setData((d) => {\n const stops = d.stops.map((s, i) => (i === idx ? { ...s, ...patch } : s))\n const next = { ...d, stops }\n onChange(next, buildCssGradient(next))\n return next\n })\n },\n [onChange]\n )\n\n const addStop = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!barRef.current || (e.target as HTMLElement).dataset.thumb) return\n const rect = barRef.current.getBoundingClientRect()\n const pos = Math.round(((e.clientX - rect.left) / rect.width) * 100)\n const newStop: GradientStop = { color: '#888888', position: pos, opacity: 1 }\n setData((d) => {\n const stops = [...d.stops, newStop]\n const next = { ...d, stops }\n onChange(next, buildCssGradient(next))\n setSelectedIdx(stops.length - 1)\n return next\n })\n },\n [onChange]\n )\n\n const removeStopAtIdx = React.useCallback(\n (idx: number) => {\n if (data.stops.length <= 2) return\n setData((d) => {\n const stops = d.stops.filter((_, i) => i !== idx)\n const next = { ...d, stops }\n onChange(next, buildCssGradient(next))\n setSelectedIdx(Math.min(idx, stops.length - 1))\n return next\n })\n },\n [data.stops.length, onChange]\n )\n\n const onThumbDown = React.useCallback(\n (e: React.PointerEvent, idx: number) => {\n e.preventDefault()\n e.stopPropagation()\n setSelectedIdx(idx)\n const rect = barRef.current!.getBoundingClientRect()\n const onMove = (ev: PointerEvent) => {\n const pos = Math.max(\n 0,\n Math.min(100, Math.round(((ev.clientX - rect.left) / rect.width) * 100))\n )\n updateStop(idx, { position: pos })\n }\n const onUp = () => {\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [updateStop]\n )\n\n const cssGrad = buildCssGradient(data)\n const selectedStop = data.stops[selectedIdx]\n const presets = getPresets()\n\n return (\n <Wrapper\n ref={wrapperRef}\n tabIndex={-1}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Type selector */}\n <TypeRow>\n {(['linear', 'radial', 'conic', 'diamond'] as const).map((t) => (\n <TypeBtn\n key={t}\n $active={data.type === t}\n onClick={() => update({ type: t })}\n title={t.charAt(0).toUpperCase() + t.slice(1)}\n >\n {TYPE_ICONS[t]}\n <TypeLabel>{t.charAt(0).toUpperCase() + t.slice(1)}</TypeLabel>\n </TypeBtn>\n ))}\n </TypeRow>\n\n {/* Preview */}\n <PreviewBox style={{ background: cssGrad }} />\n\n {/* Gradient bar + stop thumbs */}\n <BarSection>\n <BarLabel>Stops ({data.stops.length})</BarLabel>\n <BarContainer ref={barRef} onClick={addStop}>\n <GradientBar style={{ background: cssGrad }} />\n {data.stops.map((stop, i) => (\n <StopThumb\n key={i}\n data-thumb=\"true\"\n $selected={i === selectedIdx}\n style={{ left: `${stop.position}%`, backgroundColor: stop.color }}\n onPointerDown={(e) => onThumbDown(e, i)}\n onDoubleClick={() => removeStopAtIdx(i)}\n />\n ))}\n </BarContainer>\n <BarHint>Click to add \u00B7 Double-click to remove \u00B7 Drag to move</BarHint>\n </BarSection>\n\n {/* Selected stop position */}\n {selectedStop && (\n <StopPosRow>\n <StopPosLabel>Stop {selectedIdx + 1}</StopPosLabel>\n <GeomInput\n type=\"number\"\n min={0}\n max={100}\n value={selectedStop.position}\n onChange={(e) =>\n updateStop(selectedIdx, {\n position: Math.max(0, Math.min(100, Number(e.target.value))),\n })\n }\n onKeyDown={(e) => e.stopPropagation()}\n />\n <GeomLabel>%</GeomLabel>\n </StopPosRow>\n )}\n\n {/* Selected stop's color picker */}\n {selectedStop && (\n <ColorPicker\n color={selectedStop.color}\n opacity={selectedStop.opacity}\n onChange={(c, a) => {\n updateStop(selectedIdx, { color: c, opacity: a })\n if (c !== 'transparent') pushColorHistory(c)\n }}\n showTransparent={false}\n />\n )}\n\n {/* Geometry controls */}\n <GeomSection>\n <GeomSectionTitle>Geometry</GeomSectionTitle>\n {(data.type === 'linear' || data.type === 'conic') && (\n <GeomRow>\n <GeomLabel>Angle</GeomLabel>\n <AngleDial\n style={{ transform: `rotate(${data.angle}deg)` }}\n onPointerDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n const rect = e.currentTarget.getBoundingClientRect()\n const cx = rect.left + rect.width / 2,\n cy = rect.top + rect.height / 2\n const onMove = (ev: PointerEvent) => {\n const ang = Math.round(\n Math.atan2(ev.clientY - cy, ev.clientX - cx) * (180 / Math.PI) + 90\n )\n update({ angle: ((ang % 360) + 360) % 360 })\n }\n const onUp = () => {\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n }}\n >\n <DialLine />\n </AngleDial>\n <GeomInput\n type=\"number\"\n value={data.angle}\n onChange={(e) => update({ angle: ((Number(e.target.value) % 360) + 360) % 360 })}\n onKeyDown={(e) => e.stopPropagation()}\n />\n <GeomLabel>\u00B0</GeomLabel>\n </GeomRow>\n )}\n {(data.type === 'radial' || data.type === 'conic' || data.type === 'diamond') && (\n <GeomRow>\n <GeomLabel>Center</GeomLabel>\n <GeomLabel>X</GeomLabel>\n <GeomInput\n type=\"number\"\n min={0}\n max={100}\n value={data.centerX}\n onChange={(e) => update({ centerX: Number(e.target.value) })}\n onKeyDown={(e) => e.stopPropagation()}\n />\n <GeomLabel>%</GeomLabel>\n <GeomLabel style={{ marginLeft: 4 }}>Y</GeomLabel>\n <GeomInput\n type=\"number\"\n min={0}\n max={100}\n value={data.centerY}\n onChange={(e) => update({ centerY: Number(e.target.value) })}\n onKeyDown={(e) => e.stopPropagation()}\n />\n <GeomLabel>%</GeomLabel>\n </GeomRow>\n )}\n </GeomSection>\n\n {/* Actions */}\n <ActionRow>\n <ActionBtn\n onClick={() => {\n const reversed = [...data.stops].map((s) => ({ ...s, position: 100 - s.position }))\n update({ stops: reversed })\n }}\n title=\"Reverse gradient\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path\n d=\"M1 6h10M3 4l-2 2 2 2M9 4l2 2-2 2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n />\n </svg>\n Reverse\n </ActionBtn>\n <ActionBtn\n onClick={() => removeStopAtIdx(selectedIdx)}\n disabled={data.stops.length <= 2}\n title=\"Remove selected stop\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path d=\"M3 3l6 6M9 3l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n Remove\n </ActionBtn>\n <ActionBtn\n onClick={() => {\n savePreset(data)\n setShowPresets(true)\n }}\n title=\"Save as preset\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path d=\"M2 2h8v8H2z\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path d=\"M4 2v3h4V2\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"0.8\" />\n <rect x=\"3\" y=\"7\" width=\"6\" height=\"1\" fill=\"currentColor\" opacity=\"0.5\" />\n </svg>\n Save\n </ActionBtn>\n </ActionRow>\n\n {/* Presets */}\n {(showPresets || presets.length > 0) && (\n <PresetsSection>\n <PresetsTitle onClick={() => setShowPresets(!showPresets)}>\n Presets ({presets.length})<PresetsToggle>{showPresets ? '\u2212' : '+'}</PresetsToggle>\n </PresetsTitle>\n {showPresets && (\n <PresetsGrid>\n {presets.map((p, i) => (\n <PresetSwatch\n key={i}\n style={{ background: buildCssGradient(p) }}\n onClick={() => {\n setData(p)\n onChange(p, buildCssGradient(p))\n setSelectedIdx(0)\n }}\n onContextMenu={(e) => {\n e.preventDefault()\n removePreset(i)\n setShowPresets(true)\n }}\n title=\"Click to apply \u00B7 Right-click to remove\"\n />\n ))}\n {presets.length === 0 && <BarHint>No presets saved yet</BarHint>}\n </PresetsGrid>\n )}\n </PresetsSection>\n )}\n </Wrapper>\n )\n})\n\n// \u2500\u2500\u2500 Styles \u2500\u2500\u2500\nconst Wrapper = styled('div', {\n background: '$panel',\n border: '1px solid $separator',\n borderRadius: '8px',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n boxShadow: '0 8px 32px rgba(0,0,0,0.45)',\n outline: 'none',\n})\n\nconst TypeRow = styled('div', {\n display: 'flex',\n gap: 2,\n background: '$inputBg',\n borderRadius: 6,\n padding: 2,\n})\n\nconst TypeBtn = styled('button', {\n all: 'unset',\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n fontSize: '8px',\n fontWeight: 600,\n textAlign: 'center',\n padding: '5px 0',\n borderRadius: 4,\n color: '$textSecondary',\n cursor: 'pointer',\n transition: 'all 0.12s',\n '&:hover': { color: '$text' },\n variants: {\n $active: {\n true: {\n background: '$accent',\n color: '#fff',\n },\n },\n },\n})\n\nconst TypeLabel = styled('span', {\n fontSize: '7px',\n fontWeight: 500,\n letterSpacing: '0.02em',\n})\n\nconst PreviewBox = styled('div', {\n width: '100%',\n height: 40,\n borderRadius: 6,\n border: '1px solid $separator',\n})\n\nconst BarSection = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n})\n\nconst BarLabel = styled('span', {\n fontSize: '8px',\n color: '$textSecondary',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n})\n\nconst BarContainer = styled('div', {\n position: 'relative',\n height: 24,\n borderRadius: 6,\n cursor: 'crosshair',\n overflow: 'visible',\n})\n\nconst GradientBar = styled('div', {\n width: '100%',\n height: '100%',\n borderRadius: 6,\n border: '1px solid $separator',\n})\n\nconst StopThumb = styled('div', {\n position: 'absolute',\n top: '50%',\n width: 14,\n height: 14,\n borderRadius: '50%',\n border: '2px solid #fff',\n transform: 'translate(-50%, -50%)',\n cursor: 'ew-resize',\n boxShadow: '0 1px 3px rgba(0,0,0,0.4)',\n transition: 'box-shadow 0.08s',\n zIndex: 2,\n variants: {\n $selected: {\n true: {\n boxShadow: '0 0 0 2px $colors$accent, 0 1px 4px rgba(0,0,0,0.5)',\n zIndex: 3,\n width: 16,\n height: 16,\n },\n },\n },\n})\n\nconst BarHint = styled('span', {\n fontSize: '7px',\n color: '$textSecondary',\n fontStyle: 'italic',\n opacity: 0.6,\n})\n\nconst StopPosRow = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n})\n\nconst StopPosLabel = styled('span', {\n fontSize: '8px',\n color: '$textSecondary',\n fontWeight: 500,\n flex: 1,\n})\n\nconst GeomSection = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n borderTop: '1px solid $separator',\n paddingTop: 8,\n})\n\nconst GeomSectionTitle = styled('span', {\n fontSize: '8px',\n color: '$textSecondary',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n})\n\nconst GeomRow = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n})\n\nconst GeomLabel = styled('span', {\n fontSize: '8px',\n color: '$textSecondary',\n fontWeight: 500,\n})\n\nconst GeomInput = styled('input', {\n width: 40,\n background: '$inputBg',\n border: '1px solid $inputBorder',\n borderRadius: 4,\n color: '$text',\n fontSize: '9px',\n padding: '3px 4px',\n fontFamily: '$mono',\n textAlign: 'center',\n outline: 'none',\n '&:focus': { borderColor: '$accent' },\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': { display: 'none' },\n})\n\nconst AngleDial = styled('div', {\n width: 28,\n height: 28,\n borderRadius: '50%',\n border: '1px solid $inputBorder',\n background: '$inputBg',\n cursor: 'pointer',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n})\n\nconst DialLine = styled('div', {\n width: 2,\n height: '40%',\n background: '$accent',\n borderRadius: 1,\n position: 'absolute',\n top: 3,\n left: '50%',\n transform: 'translateX(-50%)',\n})\n\nconst ActionRow = styled('div', {\n display: 'flex',\n gap: 3,\n borderTop: '1px solid $separator',\n paddingTop: 8,\n})\n\nconst ActionBtn = styled('button', {\n all: 'unset',\n flex: 1,\n fontSize: '8px',\n fontWeight: 500,\n textAlign: 'center',\n padding: '5px 0',\n borderRadius: 4,\n color: '$textSecondary',\n border: '1px solid $separator',\n cursor: 'pointer',\n transition: 'all 0.1s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n '&:hover': { background: '$hover', color: '$text' },\n '&:disabled': { opacity: 0.3, cursor: 'default' },\n})\n\nconst PresetsSection = styled('div', {\n borderTop: '1px solid $separator',\n paddingTop: 6,\n})\n\nconst PresetsTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: '8px',\n color: '$textSecondary',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n cursor: 'pointer',\n '&:hover': { color: '$text' },\n})\n\nconst PresetsToggle = styled('span', {\n fontSize: '10px',\n color: '$textSecondary',\n})\n\nconst PresetsGrid = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'repeat(4, 1fr)',\n gap: 4,\n marginTop: 6,\n})\n\nconst PresetSwatch = styled('div', {\n height: 24,\n borderRadius: 4,\n border: '1px solid $separator',\n cursor: 'pointer',\n transition: 'transform 0.08s, box-shadow 0.08s',\n '&:hover': { transform: 'scale(1.05)', boxShadow: '0 0 0 1px $colors$accent' },\n})\n", "import * as React from 'react'\nimport { useIntl } from 'react-intl'\nimport { Panel } from '~components/Primitives/Panel'\nimport { ToolButton, ToolButtonWithTooltip } from '~components/Primitives/ToolButton'\nimport { UndoIcon } from '~components/Primitives/icons'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { Menu } from './Menu/Menu'\nimport { MultiplayerMenu } from './MultiplayerMenu'\nimport { PageMenu } from './PageMenu'\nimport { StyleMenu } from './StyleMenu'\nimport { ZoomMenu } from './ZoomMenu'\n\ninterface TopPanelProps {\n readOnly: boolean\n showPages: boolean\n showMenu: boolean\n showStyles: boolean\n showZoom: boolean\n showMultiplayerMenu: boolean\n}\n\nexport function _TopPanel({\n readOnly,\n showPages,\n showMenu,\n showStyles,\n showZoom,\n showMultiplayerMenu,\n}: TopPanelProps) {\n const app = useTelvaApp()\n const intl = useIntl()\n\n return (\n <StyledTopPanel>\n {(showMenu || showPages) && (\n <Panel side=\"left\" id=\"TD-MenuPanel\">\n {showMenu && <Menu readOnly={readOnly} />}\n {showMultiplayerMenu && <MultiplayerMenu />}\n {showPages && <PageMenu />}\n </Panel>\n )}\n <StyledSpacer />\n {(showStyles || showZoom) && (\n <Panel side=\"right\">\n {app.readOnly ? (\n <ReadOnlyLabel>Read Only</ReadOnlyLabel>\n ) : (\n <>\n <ToolButtonWithTooltip\n kbd={'#Z'}\n label={intl.formatMessage({ id: 'undo' })}\n onClick={app.undo}\n id=\"TD-TopPanel-Undo\"\n aria-label={intl.formatMessage({ id: 'undo' })}\n >\n <UndoIcon />\n </ToolButtonWithTooltip>\n <ToolButtonWithTooltip\n kbd={'#\u21E7Z'}\n label={intl.formatMessage({ id: 'redo' })}\n onClick={app.redo}\n id=\"TD-TopPanel-Redo\"\n aria-label={intl.formatMessage({ id: 'redo' })}\n >\n <UndoIcon flipHorizontal />\n </ToolButtonWithTooltip>\n </>\n )}\n {showZoom && <ZoomMenu />}\n {showStyles && !readOnly && <StyleMenu />}\n </Panel>\n )}\n </StyledTopPanel>\n )\n}\n\nconst StyledTopPanel = styled('div', {\n width: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n display: 'flex',\n flexDirection: 'row',\n pointerEvents: 'none',\n '& > *': {\n pointerEvents: 'all',\n },\n})\n\nconst StyledSpacer = styled('div', {\n flexGrow: 2,\n pointerEvents: 'none',\n})\n\nconst ReadOnlyLabel = styled('div', {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: '$ui',\n fontSize: '$1',\n paddingLeft: '$4',\n paddingRight: '$1',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n})\n\nexport const TopPanel = React.memo(_TopPanel)\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { HamburgerMenuIcon } from '@radix-ui/react-icons'\nimport { supported } from 'browser-fs-access'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { FilenameDialog } from '~components/Primitives/AlertDialog'\nimport { Divider } from '~components/Primitives/Divider'\nimport { DMContent, DMItem, DMSubMenu, DMTriggerIcon } from '~components/Primitives/DropdownMenu'\nimport { preventEvent } from '~components/preventEvent'\nimport { useTelvaApp } from '~hooks'\nimport { useFileSystemHandlers } from '~hooks'\nimport { TVExportType, TVSnapshot } from '~types'\nimport { PreferencesMenu } from '../PreferencesMenu'\n\ninterface MenuProps {\n readOnly: boolean\n}\n\nconst numberOfSelectedIdsSelector = (s: TVSnapshot) => {\n return s.document.pageStates[s.appState.currentPageId].selectedIds.length\n}\n\nconst disableAssetsSelector = (s: TVSnapshot) => {\n return s.appState.disableAssets\n}\n\nexport const Menu = React.memo(function Menu({ readOnly }: MenuProps) {\n const app = useTelvaApp()\n const intl = useIntl()\n const [openDialog, setOpenDialog] = React.useState(false)\n\n const numberOfSelectedIds = app.useStore(numberOfSelectedIdsSelector)\n\n const disableAssets = app.useStore(disableAssetsSelector)\n\n const [_, setForce] = React.useState(0)\n\n React.useEffect(() => setForce(1), [])\n\n const { onNewProject, onOpenProject, onSaveProject, onSaveProjectAs } = useFileSystemHandlers()\n\n const handleSaveProjectAs = React.useCallback(() => {\n // Always open the dialog so the user can choose filename + format (.tldr / .tld)\n setOpenDialog(true)\n }, [])\n\n const handleDelete = React.useCallback(() => {\n app.delete()\n }, [app])\n\n const handleCopySVG = React.useCallback(() => {\n app.copyImage(TVExportType.SVG, { scale: 1, quality: 1, transparentBackground: false })\n }, [app])\n\n const handleCopyPNG = React.useCallback(() => {\n app.copyImage(TVExportType.PNG, { scale: 2, quality: 1, transparentBackground: true })\n }, [app])\n\n const handleExportPNG = React.useCallback(async () => {\n app.exportImage(TVExportType.PNG, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportJPG = React.useCallback(async () => {\n app.exportImage(TVExportType.JPG, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportWEBP = React.useCallback(async () => {\n app.exportImage(TVExportType.WEBP, { scale: 2, quality: 1 })\n }, [app])\n\n const handleExportSVG = React.useCallback(async () => {\n app.exportImage(TVExportType.SVG, { scale: 2, quality: 1 })\n }, [app])\n\n const handleCopyJSON = React.useCallback(async () => {\n app.copyJson()\n }, [app])\n\n const handleExportJSON = React.useCallback(async () => {\n app.exportJson()\n }, [app])\n\n const handleCut = React.useCallback(() => {\n app.cut()\n }, [app])\n\n const handleCopy = React.useCallback(() => {\n app.copy()\n }, [app])\n\n const handlePaste = React.useCallback(() => {\n app.paste()\n }, [app])\n\n const handleSelectAll = React.useCallback(() => {\n app.selectAll()\n }, [app])\n\n const handleSelectNone = React.useCallback(() => {\n app.selectNone()\n }, [app])\n\n const handleUploadMedia = React.useCallback(() => {\n app.openAsset()\n }, [app])\n\n const handleZoomTo100 = React.useCallback(() => {\n app.zoomTo(1)\n }, [app])\n\n const showFileMenu =\n app.callbacks.onNewProject ||\n app.callbacks.onOpenProject ||\n app.callbacks.onSaveProject ||\n app.callbacks.onSaveProjectAs ||\n app.callbacks.onExport\n\n const hasSelection = numberOfSelectedIds > 0\n\n return (\n <>\n <DropdownMenu.Root dir=\"ltr\">\n <DMTriggerIcon id=\"TD-MenuIcon\">\n <HamburgerMenuIcon />\n </DMTriggerIcon>\n <DMContent\n variant=\"menu\"\n id=\"TD-Menu\"\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n alignOffset={4}\n >\n {showFileMenu && (\n <DMSubMenu\n label={`${intl.formatMessage({ id: 'menu.file' })}...`}\n id=\"TD-MenuItem-File\"\n >\n {app.callbacks.onNewProject && (\n <DMItem onClick={onNewProject} kbd=\"#N\" id=\"TD-MenuItem-File-New_Project\">\n <FormattedMessage id=\"new.project\" />\n </DMItem>\n )}\n {app.callbacks.onOpenProject && (\n <DMItem onClick={onOpenProject} kbd=\"#O\" id=\"TD-MenuItem-File-Open\">\n <FormattedMessage id=\"open\" />\n ...\n </DMItem>\n )}\n {app.callbacks.onSaveProject && (\n <DMItem onClick={onSaveProject} kbd=\"#S\" id=\"TD-MenuItem-File-Save\">\n <FormattedMessage id=\"save\" />\n </DMItem>\n )}\n {app.callbacks.onSaveProjectAs && (\n <DMItem\n onClick={handleSaveProjectAs}\n kbd=\"#\u21E7S\"\n id=\"TD-MenuItem-File-Save_As\"\n >\n <FormattedMessage id=\"save.as\" />\n ...\n </DMItem>\n )}\n <DMSubMenu\n label={`${intl.formatMessage({ id: 'export.as' })}...`}\n size=\"small\"\n id=\"TD-MenuItem-Export\"\n >\n <DMItem onClick={handleExportSVG} id=\"TD-MenuItem-Export-SVG\">\n SVG\n </DMItem>\n <DMItem onClick={handleExportPNG} id=\"TD-MenuItem-Export-PNG\">\n PNG\n </DMItem>\n <DMItem onClick={handleExportJPG} id=\"TD-MenuItem-Export-JPG\">\n JPG\n </DMItem>\n <DMItem onClick={handleExportWEBP} id=\"TD-MenuItem-Export-WEBP\">\n WEBP\n </DMItem>\n <DMItem onClick={handleExportJSON} id=\"TD-MenuItem-Export-JSON\">\n JSON\n </DMItem>\n </DMSubMenu>\n {!disableAssets && (\n <>\n <Divider />\n <DMItem onClick={handleUploadMedia} kbd=\"#U\" id=\"TD-MenuItem-File-Upload_Media\">\n <FormattedMessage id=\"upload.media\" />\n </DMItem>\n </>\n )}\n </DMSubMenu>\n )}\n <DMSubMenu label={`${intl.formatMessage({ id: 'menu.edit' })}...`} id=\"TD-MenuItem-Edit\">\n <DMItem\n onSelect={preventEvent}\n onClick={app.undo}\n disabled={readOnly}\n kbd=\"#Z\"\n id=\"TD-MenuItem-Edit-Undo\"\n >\n <FormattedMessage id=\"undo\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={app.redo}\n disabled={readOnly}\n kbd=\"#\u21E7Z\"\n id=\"TD-MenuItem-Edit-Redo\"\n >\n <FormattedMessage id=\"redo\" />\n </DMItem>\n <Divider />\n <DMItem\n onSelect={preventEvent}\n disabled={!hasSelection || readOnly}\n onClick={handleCut}\n kbd=\"#X\"\n id=\"TD-MenuItem-Edit-Cut\"\n >\n <FormattedMessage id=\"cut\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n disabled={!hasSelection}\n onClick={handleCopy}\n kbd=\"#C\"\n id=\"TD-MenuItem-Edit-Copy\"\n >\n <FormattedMessage id=\"copy\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={handlePaste}\n kbd=\"#V\"\n id=\"TD-MenuItem-Edit-Paste\"\n >\n <FormattedMessage id=\"paste\" />\n </DMItem>\n <Divider />\n <DMSubMenu\n label={`${intl.formatMessage({ id: 'copy.as' })}...`}\n size=\"small\"\n id=\"TD-MenuItem-Copy-As\"\n >\n <DMItem onClick={handleCopySVG} id=\"TD-MenuItem-Copy-as-SVG\">\n SVG\n </DMItem>\n <DMItem onClick={handleCopyPNG} id=\"TD-MenuItem-Copy-As-PNG\">\n PNG\n </DMItem>\n <DMItem onClick={handleCopyJSON} id=\"TD-MenuItem-Copy_as_JSON\">\n JSON\n </DMItem>\n </DMSubMenu>\n\n <Divider />\n <DMItem\n onSelect={preventEvent}\n onClick={handleSelectAll}\n kbd=\"#A\"\n id=\"TD-MenuItem-Select_All\"\n >\n <FormattedMessage id=\"select.all\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n disabled={!hasSelection}\n onClick={handleSelectNone}\n id=\"TD-MenuItem-Select_None\"\n >\n <FormattedMessage id=\"select.none\" />\n </DMItem>\n <Divider />\n <DMItem\n onSelect={handleDelete}\n disabled={!hasSelection}\n kbd=\"\u232B\"\n id=\"TD-MenuItem-Delete\"\n >\n <FormattedMessage id=\"delete\" />\n </DMItem>\n </DMSubMenu>\n <DMSubMenu label={intl.formatMessage({ id: 'menu.view' })} id=\"TD-MenuItem-Edit\">\n <DMItem\n onSelect={preventEvent}\n onClick={app.zoomIn}\n kbd=\"#+\"\n id=\"TD-MenuItem-View-ZoomIn\"\n >\n <FormattedMessage id=\"zoom.in\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={app.zoomOut}\n kbd=\"#-\"\n id=\"TD-MenuItem-View-ZoomOut\"\n >\n <FormattedMessage id=\"zoom.out\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={handleZoomTo100}\n kbd=\"\u21E7+0\"\n id=\"TD-MenuItem-View-ZoomTo100\"\n >\n <FormattedMessage id=\"zoom.to\" /> 100%\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={app.zoomToFit}\n kbd=\"\u21E7+1\"\n id=\"TD-MenuItem-View-ZoomToFit\"\n >\n <FormattedMessage id=\"zoom.to.fit\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={app.zoomToSelection}\n kbd=\"\u21E7+2\"\n id=\"TD-MenuItem-View-ZoomToSelection\"\n >\n <FormattedMessage id=\"zoom.to.selection\" />\n </DMItem>\n </DMSubMenu>\n <Divider />\n <PreferencesMenu />\n </DMContent>\n </DropdownMenu.Root>\n <FilenameDialog isOpen={openDialog} onClose={() => setOpenDialog(false)} />\n </>\n )\n})\n", "import { Item } from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\n\nexport function DMItem({\n onSelect,\n id,\n ...rest\n}: RowButtonProps & { onSelect?: (event: Event) => void; id?: string }) {\n return (\n <Item dir=\"ltr\" asChild onSelect={onSelect} id={id}>\n <RowButton {...rest} />\n </Item>\n )\n}\n", "import { CheckboxItem } from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { preventEvent } from '~components/preventEvent'\n\ninterface DMCheckboxItemProps {\n checked: boolean\n disabled?: boolean\n onCheckedChange: (isChecked: boolean) => void\n children: React.ReactNode\n variant?: RowButtonProps['variant']\n kbd?: string\n id?: string\n ariaLabel?: string\n}\n\nexport function DMCheckboxItem({\n checked,\n disabled = false,\n variant,\n onCheckedChange,\n kbd,\n id,\n ariaLabel,\n children,\n}: DMCheckboxItemProps) {\n return (\n <CheckboxItem\n dir=\"ltr\"\n onSelect={preventEvent}\n onCheckedChange={onCheckedChange}\n checked={checked}\n disabled={disabled}\n asChild\n id={id}\n aria-label={ariaLabel}\n >\n <RowButton kbd={kbd} variant={variant} hasIndicator>\n {children}\n </RowButton>\n </CheckboxItem>\n )\n}\n", "export const preventEvent = (e: Event) => e.preventDefault()\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { stopPropagation } from '~components/stopPropagation'\nimport { useContainer } from '~hooks'\nimport { styled } from '~styles/stitches.config'\n\nexport interface DMContentProps {\n variant?: 'menu' | 'horizontal'\n align?: 'start' | 'center' | 'end'\n alignOffset?: number\n sideOffset?: number\n children: React.ReactNode\n overflow?: boolean\n id?: string\n side?: 'top' | 'left' | 'right' | 'bottom' | undefined\n}\n\nexport function DMContent({\n sideOffset = 4,\n alignOffset = 0,\n children,\n align,\n variant,\n id,\n overflow = false,\n side = 'bottom',\n}: DMContentProps) {\n const container = useContainer()\n\n return (\n <DropdownMenu.Portal container={container.current} dir=\"ltr\">\n <DropdownMenu.Content\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n onEscapeKeyDown={stopPropagation}\n asChild\n id={id}\n side={side}\n >\n <StyledContent variant={variant} overflow={overflow}>\n {children}\n </StyledContent>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n )\n}\n\nexport const StyledContent = styled(MenuContent, {\n width: 'fit-content',\n height: 'fit-content',\n minWidth: 0,\n maxHeight: '100vh',\n overflowY: 'auto',\n overflowX: 'hidden',\n '&::webkit-scrollbar': {\n display: 'none',\n },\n '-ms-overflow-style': 'none' /* for Internet Explorer, Edge */,\n scrollbarWidth: 'none',\n variants: {\n variant: {\n horizontal: {\n flexDirection: 'row',\n },\n menu: {\n minWidth: 128,\n },\n },\n overflow: {\n true: {\n maxHeight: '60vh',\n },\n },\n },\n})\n", "import { Separator } from '@radix-ui/react-dropdown-menu'\nimport { styled } from '~styles/stitches.config'\n\nexport const DMDivider = styled(Separator, {\n backgroundColor: '$hover',\n height: 1,\n marginTop: '$2',\n marginRight: '-$2',\n marginBottom: '$2',\n marginLeft: '-$2',\n})\n", "import { RadioItem } from '@radix-ui/react-dropdown-menu'\nimport { styled } from '~styles/stitches.config'\n\nexport const DMRadioItem = styled(RadioItem, {\n height: '32px',\n width: '32px',\n backgroundColor: '$panel',\n borderRadius: '4px',\n padding: '0',\n margin: '0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n outline: 'none',\n border: 'none',\n pointerEvents: 'all',\n cursor: 'pointer',\n\n variants: {\n isActive: {\n true: {\n backgroundColor: '$selected',\n color: 'white',\n },\n false: {},\n },\n bp: {\n mobile: {},\n small: {},\n },\n },\n\n compoundVariants: [\n {\n isActive: false,\n bp: 'small',\n css: {\n '&:focus': {\n backgroundColor: '$hover',\n },\n '&:hover:not(:disabled)': {\n backgroundColor: '$hover',\n },\n },\n },\n ],\n})\n", "import { Arrow, Sub, SubContent, SubTrigger } from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { MenuContent } from '~components/Primitives/MenuContent'\nimport { RowButton } from '~components/Primitives/RowButton'\n\nexport interface DMSubMenuProps {\n label: string\n size?: 'small'\n disabled?: boolean\n children: React.ReactNode\n overflow?: boolean\n id?: string\n}\n\nexport function DMSubMenu({\n children,\n size,\n overflow = false,\n disabled = false,\n label,\n id,\n}: DMSubMenuProps) {\n return (\n <Sub key={id}>\n <SubTrigger dir=\"ltr\" asChild>\n <RowButton disabled={disabled} hasArrow>\n {label}\n </RowButton>\n </SubTrigger>\n <SubContent asChild sideOffset={4} alignOffset={-4}>\n <MenuContent size={size} overflow={overflow}>\n {children}\n <Arrow offset={13} />\n </MenuContent>\n </SubContent>\n </Sub>\n )\n}\n", "import { Trigger } from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { ToolButton, ToolButtonProps } from '~components/Primitives/ToolButton'\n\ninterface DMTriggerIconProps extends ToolButtonProps {\n children: React.ReactNode\n id?: string\n}\n\nexport function DMTriggerIcon({ id, children, ...rest }: DMTriggerIconProps) {\n return (\n <Trigger asChild id={id}>\n <ToolButton {...rest}>{children}</ToolButton>\n </Trigger>\n )\n}\n", "import * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\nimport { DMCheckboxItem, DMSubMenu } from '~components/Primitives/DropdownMenu'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport { TVDockPosition, TVExportBackground, TVSnapshot } from '~types'\n\nconst settingsSelector = (s: TVSnapshot) => s.settings\n\nconst DockPosition = ['bottom', 'left', 'right', 'top']\n\nexport function PreferencesMenu() {\n const app = useTelvaApp()\n const intl = useIntl()\n\n const settings = app.useStore(settingsSelector)\n\n const toggleDebugMode = React.useCallback(() => {\n app.setSetting('isDebugMode', (v) => !v)\n }, [app])\n\n const toggleDarkMode = React.useCallback(() => {\n app.setSetting('isDarkMode', (v) => !v)\n }, [app])\n\n const toggleFocusMode = React.useCallback(() => {\n app.setSetting('isFocusMode', (v) => !v)\n }, [app])\n\n const toggleGrid = React.useCallback(() => {\n app.setSetting('showGrid', (v) => !v)\n }, [app])\n\n const toggleKeepStyleMenuOpen = React.useCallback(() => {\n app.setSetting('keepStyleMenuOpen', (v) => !v)\n }, [app])\n\n const toggleCadSelectMode = React.useCallback(() => {\n app.setSetting('isCadSelectMode', (v) => !v)\n }, [app])\n\n const handleChangeDockPosition = React.useCallback(\n (position: TVDockPosition) => {\n app.setSetting('dockPosition', position)\n },\n [app]\n )\n\n const selectExportBackground = React.useCallback(\n (background: TVExportBackground) => {\n app.setSetting('exportBackground', background)\n },\n [app]\n )\n\n return (\n <DMSubMenu label={intl.formatMessage({ id: 'menu.preferences' })} id=\"TD-MenuItem-Preferences\">\n <DMCheckboxItem\n checked={settings.isDarkMode}\n onCheckedChange={toggleDarkMode}\n kbd=\"#\u21E7D\"\n id=\"TD-MenuItem-Preferences-Dark_Mode\"\n ariaLabel={intl.formatMessage({ id: 'preferences.dark.mode' })}\n >\n <FormattedMessage id=\"preferences.dark.mode\" />\n </DMCheckboxItem>\n <DMCheckboxItem\n checked={settings.isFocusMode}\n onCheckedChange={toggleFocusMode}\n kbd=\"#.\"\n id=\"TD-MenuItem-Preferences-Focus_Mode\"\n ariaLabel={intl.formatMessage({ id: 'preferences.focus.mode' })}\n >\n <FormattedMessage id=\"preferences.focus.mode\" />\n </DMCheckboxItem>\n <DMCheckboxItem\n checked={settings.isDebugMode}\n onCheckedChange={toggleDebugMode}\n id=\"TD-MenuItem-Preferences-Debug_Mode\"\n ariaLabel={intl.formatMessage({ id: 'preferences.debug.mode' })}\n >\n <FormattedMessage id=\"preferences.debug.mode\" />\n </DMCheckboxItem>\n <Divider />\n <DMCheckboxItem\n checked={settings.showGrid}\n onCheckedChange={toggleGrid}\n kbd=\"#\u21E7G\"\n id=\"TD-MenuItem-Preferences-Grid\"\n ariaLabel={intl.formatMessage({ id: 'preferences.show.grid' })}\n >\n <FormattedMessage id=\"preferences.show.grid\" />\n </DMCheckboxItem>\n <DMCheckboxItem\n checked={settings.isCadSelectMode}\n onCheckedChange={toggleCadSelectMode}\n id=\"TD-MenuItem-Preferences-Cad_Selection\"\n ariaLabel={intl.formatMessage({ id: 'preferences.use.cad.selection' })}\n >\n <FormattedMessage id=\"preferences.use.cad.selection\" />\n </DMCheckboxItem>\n <DMCheckboxItem\n checked={settings.keepStyleMenuOpen}\n onCheckedChange={toggleKeepStyleMenuOpen}\n id=\"TD-MenuItem-Preferences-Style_menu\"\n ariaLabel={intl.formatMessage({ id: 'preferences.keep.stylemenu.open' })}\n >\n <FormattedMessage id=\"preferences.keep.stylemenu.open\" />\n </DMCheckboxItem>\n <DMSubMenu label={intl.formatMessage({ id: 'dock.position' })}>\n {DockPosition.map((position) => (\n <DMCheckboxItem\n key={position}\n checked={settings.dockPosition === position}\n onCheckedChange={() => handleChangeDockPosition(position as TVDockPosition)}\n id={`TD-MenuItem-DockPosition-${position}`}\n ariaLabel={`DockPosition-${position}`}\n >\n <StyledText>\n <FormattedMessage id={position} />\n </StyledText>\n </DMCheckboxItem>\n ))}\n </DMSubMenu>\n <DMSubMenu label={intl.formatMessage({ id: 'export.background' })}>\n {Object.values(TVExportBackground).map((exportBackground) => (\n <DMCheckboxItem\n key={exportBackground}\n checked={settings.exportBackground === exportBackground}\n onCheckedChange={() => selectExportBackground(exportBackground as TVExportBackground)}\n id={`TD-MenuItem-ExportBackground-${exportBackground}`}\n ariaLabel={`ExportBackground-${exportBackground}`}\n >\n <StyledText>\n <FormattedMessage id={exportBackground as string} />\n </StyledText>\n </DMCheckboxItem>\n ))}\n </DMSubMenu>\n </DMSubMenu>\n )\n}\n\nconst StyledText = styled('span', {\n textTransform: 'capitalize',\n})\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ClipboardIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { Utils } from 'telva-core'\nimport { Divider } from '~components/Primitives/Divider'\nimport { DMContent, DMItem, DMTriggerIcon } from '~components/Primitives/DropdownMenu'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { MultiplayerIcon2 } from '~components/Primitives/icons/MultiplayerIcon2'\nimport { useTelvaApp } from '~hooks'\nimport { TVDR } from '~state/TVDR'\nimport { TVAssetType, TVSnapshot } from '~types'\n\nconst roomSelector = (state: TVSnapshot) => state.room\n\nexport const MultiplayerMenu = function MultiplayerMenu() {\n const app = useTelvaApp()\n\n const room = app.useStore(roomSelector)\n\n const [copied, setCopied] = React.useState(false)\n\n const rTimeout = React.useRef<any>(0)\n\n const handleCopySelect = React.useCallback(() => {\n setCopied(true)\n TVDR.copyStringToClipboard(window.location.href)\n clearTimeout(rTimeout.current)\n rTimeout.current = setTimeout(() => setCopied(false), 1200)\n }, [])\n\n const handleCopyReadOnlySelect = React.useCallback(() => {\n setCopied(true)\n const segs = window.location.href.split('/')\n segs[segs.length - 2] = 'v'\n segs[segs.length - 1] = Utils.lns(segs[segs.length - 1])\n TVDR.copyStringToClipboard(segs.join('/'))\n clearTimeout(rTimeout.current)\n rTimeout.current = setTimeout(() => setCopied(false), 1200)\n }, [])\n\n const handleCreateMultiplayerProject = React.useCallback(async () => {\n if (app.isDirty) {\n if (app.fileSystemHandle) {\n if (window.confirm('Do you want to save changes to your current project?')) {\n await app.saveProject()\n }\n } else {\n if (window.confirm('Do you want to save your current project?')) {\n await app.saveProject()\n }\n }\n } else if (!app.fileSystemHandle) {\n if (window.confirm('Do you want to save your current project?')) {\n await app.saveProject()\n }\n }\n }, [])\n\n const handleCopyToMultiplayerProject = React.useCallback(async () => {\n const nextDocument = Utils.deepClone(app.document)\n\n app.setIsLoading(true)\n\n try {\n if (app.callbacks.onAssetUpload) {\n for (const id in nextDocument.assets) {\n const asset = nextDocument.assets[id]\n if (asset.src.includes('base64')) {\n const file = dataURLtoFile(\n asset.src,\n asset.fileName ?? asset.type === TVAssetType.Video ? 'image.png' : 'image.mp4'\n )\n const newSrc = await app.callbacks.onAssetUpload(app, file, id)\n if (newSrc) {\n asset.src = newSrc\n } else {\n asset.src = ''\n }\n }\n }\n }\n\n const result = await fetch(`/api/create`, {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n roomId: Utils.uniqueId(),\n pageId: app.currentPageId,\n document: nextDocument,\n }),\n }).then((d) => d.json())\n\n if (result?.url) {\n window.location.href = result.url\n } else {\n TVDR.warn(result?.message)\n }\n } catch (e) {\n TVDR.warn((e as any).message)\n }\n\n app.setIsLoading(false)\n }, [])\n\n return (\n <DropdownMenu.Root dir=\"ltr\">\n <DMTriggerIcon id=\"TD-MultiplayerMenuIcon\" isActive={!!room}>\n <MultiplayerIcon2 />\n </DMTriggerIcon>\n <DMContent variant=\"menu\" id=\"TD-MultiplayerMenu\" side=\"bottom\" align=\"start\" sideOffset={4}>\n <DMItem id=\"TD-Multiplayer-CopyInviteLink\" onClick={handleCopySelect} disabled={!room}>\n <FormattedMessage id=\"copy.invite.link\" />\n <SmallIcon>{copied ? <CheckIcon /> : <ClipboardIcon />}</SmallIcon>\n </DMItem>\n <DMItem\n id=\"TD-Multiplayer-CopyReadOnlyLink\"\n onClick={handleCopyReadOnlySelect}\n disabled={!room}\n >\n <FormattedMessage id=\"copy.readonly.link\" />\n <SmallIcon>{copied ? <CheckIcon /> : <ClipboardIcon />}</SmallIcon>\n </DMItem>\n <Divider />\n <DMItem\n id=\"TD-Multiplayer-CreateMultiplayerProject\"\n onClick={handleCreateMultiplayerProject}\n >\n <a href={`${window.location.origin}/r`}>\n <FormattedMessage id=\"create.multiplayer.project\" />\n </a>\n </DMItem>\n <DMItem\n id=\"TD-Multiplayer-CopyToMultiplayerProject\"\n onClick={handleCopyToMultiplayerProject}\n >\n <FormattedMessage id=\"copy.multiplayer.project\" />\n </DMItem>\n </DMContent>\n </DropdownMenu.Root>\n )\n}\n\nfunction dataURLtoFile(dataurl: string, filename: string) {\n const arr = dataurl.split(',')\n const mime = arr[0]?.match(/:(.*?);/)?.[1]\n const bstr = window.atob(arr[1])\n let n = bstr.length\n const u8arr = new Uint8Array(n)\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n)\n }\n\n return new File([u8arr], filename, { type: mime })\n}\n", "import * as React from 'react'\n\nexport function MultiplayerIcon2() {\n return (\n <svg\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n >\n <path d=\"M1.36482 4.71089C1.36482 3.21371 2.57853 2 4.07572 2C5.5729 2 6.78661 3.21371 6.78661 4.71089C6.78661 5.76842 6.18106 6.68452 5.29779 7.13136C5.80465 7.24611 6.26407 7.44186 6.66028 7.73182C7.18674 8.11711 7.57215 8.64722 7.81073 9.30983C7.81452 9.30606 7.81832 9.3023 7.82212 9.29855C8.30448 8.82317 8.91325 8.52463 9.60905 8.37275C8.68812 7.922 8.05394 6.97569 8.05394 5.88126C8.05394 4.35017 9.29513 3.10898 10.8262 3.10898C12.3573 3.10898 13.5985 4.35017 13.5985 5.88126C13.5985 6.97561 12.9644 7.92186 12.0436 8.37265C12.7396 8.52449 13.3486 8.82306 13.831 9.29854C14.5795 10.0361 14.9481 11.1249 14.9481 12.5176C14.9481 12.7799 14.7354 12.9926 14.473 12.9926C14.2107 12.9926 13.9981 12.7799 13.9981 12.5175C13.9981 11.2848 13.6738 10.4774 13.1642 9.97518C12.6532 9.4716 11.8802 9.20024 10.8266 9.20024C9.77294 9.20024 8.99993 9.4716 8.48896 9.97518C7.97939 10.4774 7.65513 11.2848 7.65513 12.5176C7.65513 12.7799 7.44247 12.9926 7.18013 12.9926C6.9178 12.9926 6.70513 12.7799 6.70513 12.5176C6.70513 11.6734 6.84053 10.941 7.11384 10.3307C7.0922 10.2895 7.0763 10.2444 7.06737 10.1962C6.91739 9.38749 6.57392 8.84586 6.09923 8.49845C5.61626 8.14499 4.94481 7.95427 4.07574 7.95427C3.05232 7.95427 2.30368 8.21784 1.80952 8.70485C1.31675 9.19047 1.00176 9.97257 1.00176 11.1702C1.00176 11.4326 0.789093 11.6452 0.526758 11.6452C0.264423 11.6452 0.0517578 11.4326 0.0517578 11.1702C0.0517578 9.81263 0.411052 8.74925 1.14268 8.02821C1.60624 7.57137 2.18892 7.28191 2.85378 7.13142C1.97043 6.68461 1.36482 5.76848 1.36482 4.71089ZM4.07572 2.95C3.1032 2.95 2.31482 3.73838 2.31482 4.71089C2.31482 5.68341 3.1032 6.47178 4.07572 6.47178C5.04823 6.47178 5.83661 5.68341 5.83661 4.71089C5.83661 3.73838 5.04823 2.95 4.07572 2.95ZM10.8262 4.05898C9.8198 4.05898 9.00394 4.87484 9.00394 5.88126C9.00394 6.88768 9.8198 7.70355 10.8262 7.70355C11.8326 7.70355 12.6485 6.88768 12.6485 5.88126C12.6485 4.87484 11.8326 4.05898 10.8262 4.05898Z\" />\n </svg>\n )\n}\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, PlusIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\nimport { DMContent } from '~components/Primitives/DropdownMenu'\nimport { RowButton } from '~components/Primitives/RowButton'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport type { TVSnapshot } from '~types'\nimport { PageOptionsDialog } from '../PageOptionsDialog'\n\nconst sortedSelector = (s: TVSnapshot) =>\n Object.values(s.document.pages).sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n\nconst currentPageNameSelector = (s: TVSnapshot) => s.document.pages[s.appState.currentPageId].name\n\nconst currentPageIdSelector = (s: TVSnapshot) => s.document.pages[s.appState.currentPageId].id\n\nexport function PageMenu() {\n const app = useTelvaApp()\n\n const intl = useIntl()\n\n const rIsOpen = React.useRef(false)\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n React.useEffect(() => {\n if (rIsOpen.current !== isOpen) {\n rIsOpen.current = isOpen\n }\n }, [isOpen])\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false)\n }, [setIsOpen])\n\n const handleOpenChange = React.useCallback(\n (isOpen: boolean) => {\n if (rIsOpen.current !== isOpen) {\n setIsOpen(isOpen)\n }\n },\n [setIsOpen]\n )\n const currentPageName = app.useStore(currentPageNameSelector)\n\n return (\n <DropdownMenu.Root dir=\"ltr\" open={isOpen} onOpenChange={handleOpenChange}>\n <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-Page\">\n <ToolButton variant=\"text\">\n {currentPageName || intl.formatMessage({ id: 'page' })}\n </ToolButton>\n </DropdownMenu.Trigger>\n <DMContent variant=\"menu\" align=\"start\" sideOffset={4}>\n {isOpen && <PageMenuContent onClose={handleClose} />}\n </DMContent>\n </DropdownMenu.Root>\n )\n}\n\nfunction PageMenuContent({ onClose }: { onClose: () => void }) {\n const app = useTelvaApp()\n const intl = useIntl()\n\n const sortedPages = app.useStore(sortedSelector)\n\n const currentPageId = app.useStore(currentPageIdSelector)\n\n const defaultPageName = intl.formatMessage({ id: 'page' })\n\n const handleCreatePage = React.useCallback(() => {\n const pageName = defaultPageName + ' ' + (Object.keys(app.document.pages).length + 1)\n app.createPage(undefined, pageName)\n }, [app])\n\n const handleChangePage = React.useCallback(\n (id: string) => {\n onClose()\n app.changePage(id)\n },\n [app]\n )\n\n const [dragId, setDragId] = React.useState<null | string>(null)\n\n const [dropIndex, setDropIndex] = React.useState<null | number>(null)\n\n const handleDragStart = React.useCallback((ev: React.DragEvent<HTMLDivElement>) => {\n setDragId(ev.currentTarget.id)\n setDropIndex(sortedPages.findIndex((p) => p.id === ev.currentTarget.id))\n ev.dataTransfer.effectAllowed = 'move'\n }, [])\n\n const handleDrag = React.useCallback(\n (ev: React.DragEvent<HTMLDivElement>) => {\n ev.preventDefault()\n\n let dropIndex = sortedPages.findIndex((p) => p.id === ev.currentTarget.id)\n\n const rect = ev.currentTarget.getBoundingClientRect()\n const ny = (ev.clientY - rect.top) / rect.height\n\n dropIndex = ny < 0.5 ? dropIndex : dropIndex + 1\n\n setDropIndex(dropIndex)\n },\n [dragId, sortedPages]\n )\n\n const handleDrop = React.useCallback(() => {\n if (dragId !== null && dropIndex !== null) {\n app.movePage(dragId, dropIndex)\n }\n\n setDragId(null)\n setDropIndex(null)\n }, [dragId, dropIndex])\n\n return (\n <>\n <DropdownMenu.RadioGroup dir=\"ltr\" value={currentPageId} onValueChange={handleChangePage}>\n {sortedPages.map((page, i) => (\n <ButtonWithOptions\n key={page.id}\n isDropAbove={i === dropIndex && i === 0}\n isDropBelow={dropIndex !== null && i === dropIndex - 1}\n >\n <DropdownMenu.RadioItem\n title={page.name || defaultPageName}\n value={page.id}\n key={page.id}\n id={page.id}\n asChild\n onDragOver={handleDrag}\n onDragStart={handleDragStart}\n // onDrag={handleDrag}\n onDrop={handleDrop}\n draggable={true}\n >\n <PageButton>\n <span id={page.id}>{page.name || defaultPageName}</span>\n <DropdownMenu.ItemIndicator>\n <SmallIcon>\n <CheckIcon />\n </SmallIcon>\n </DropdownMenu.ItemIndicator>\n </PageButton>\n </DropdownMenu.RadioItem>\n <PageOptionsDialog page={page} onClose={onClose} />\n </ButtonWithOptions>\n ))}\n </DropdownMenu.RadioGroup>\n <Divider />\n <DropdownMenu.Item onSelect={handleCreatePage} asChild>\n <RowButton>\n <span>\n <FormattedMessage id=\"create.page\" />\n </span>\n <SmallIcon>\n <PlusIcon />\n </SmallIcon>\n </RowButton>\n </DropdownMenu.Item>\n </>\n )\n}\n\nconst ButtonWithOptions = styled('div', {\n position: 'relative',\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n gridAutoFlow: 'column',\n margin: 0,\n\n '& > *[data-shy=\"true\"]': {\n opacity: 0,\n },\n\n '&:hover > *[data-shy=\"true\"]': {\n opacity: 1,\n },\n\n variants: {\n isDropAbove: {\n true: {\n '&::after': {\n content: '',\n display: 'block',\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '1px',\n backgroundColor: '$selected',\n zIndex: 999,\n pointerEvents: 'none',\n },\n },\n },\n isDropBelow: {\n true: {\n '&::after': {\n content: '',\n display: 'block',\n position: 'absolute',\n width: '100%',\n height: '1px',\n top: '100%',\n backgroundColor: '$selected',\n zIndex: 999,\n pointerEvents: 'none',\n },\n },\n },\n },\n})\n\nexport const PageButton = styled(RowButton, {\n minWidth: 128,\n})\n", "import * as Dialog from '@radix-ui/react-alert-dialog'\nimport { MixerVerticalIcon, Pencil1Icon } from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\nimport { IconButton } from '~components/Primitives/IconButton/IconButton'\nimport { RowButton, RowButtonProps } from '~components/Primitives/RowButton'\nimport { SmallIcon } from '~components/Primitives/SmallIcon'\nimport { TextField } from '~components/Primitives/TextField'\nimport { breakpoints } from '~components/breakpoints'\nimport { useContainer, useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport type { TVPage, TVSnapshot } from '~types'\n\nconst canDeleteSelector = (s: TVSnapshot) => {\n return Object.keys(s.document.pages).length > 1\n}\n\ninterface PageOptionsDialogProps {\n page: TVPage\n onOpen?: () => void\n onClose?: () => void\n}\n\nexport function PageOptionsDialog({ page, onOpen, onClose }: PageOptionsDialogProps) {\n const app = useTelvaApp()\n const intl = useIntl()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [pageName, setPageName] = React.useState(page.name || 'Page')\n\n const canDelete = app.useStore(canDeleteSelector)\n\n const rInput = React.useRef<HTMLInputElement>(null)\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false)\n }, [])\n\n const handleDuplicate = React.useCallback(() => {\n app.duplicatePage(page.id)\n }, [app])\n\n const handleDelete = React.useCallback(() => {\n if (window.confirm(`Are you sure you want to delete this page?`)) {\n app.deletePage(page.id)\n }\n }, [app])\n\n const handleOpenChange = React.useCallback(\n (isOpen: boolean) => {\n setIsOpen(isOpen)\n\n if (isOpen) {\n onOpen?.()\n return\n }\n },\n [app]\n )\n\n function stopPropagation(e: React.KeyboardEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n const rInitialName = React.useRef(page.name || 'Page')\n const rCurrentName = React.useRef(rInitialName.current)\n\n const handleTextFieldChange = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value.trimStart()\n rCurrentName.current = value\n setPageName(value)\n }, [])\n\n const handleTextFieldKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'Enter': {\n if (rCurrentName.current === rInitialName.current) {\n setIsOpen(false)\n } else {\n rInitialName.current = rCurrentName.current\n app.renamePage(page.id, rCurrentName.current.trim())\n setIsOpen(false)\n }\n\n break\n }\n case 'Escape': {\n // If the name hasn't changed, close the menu\n if (rCurrentName.current === rInitialName.current) {\n setIsOpen(false)\n return\n }\n\n // If the name has changed, revert the change\n rCurrentName.current = rInitialName.current\n setPageName(rInitialName.current)\n\n // ...and refocus the input\n requestAnimationFrame(() => {\n const elm = rInput.current\n if (elm) {\n elm.focus()\n elm.setSelectionRange(0, elm.value.length)\n }\n })\n break\n }\n }\n }, [])\n\n const rWasOpen = React.useRef(false)\n\n React.useEffect(() => {\n if (isOpen) {\n rWasOpen.current = true\n rInitialName.current = page.name || 'Page'\n rCurrentName.current = rInitialName.current\n\n requestAnimationFrame(() => {\n const elm = rInput.current\n if (elm) {\n elm.focus()\n elm.setSelectionRange(0, elm.value.length)\n }\n })\n } else if (rWasOpen.current) {\n onClose?.()\n }\n\n return () => {\n if (rCurrentName.current !== rInitialName.current) {\n rInitialName.current = rCurrentName.current\n app.renamePage(page.id, rCurrentName.current)\n }\n }\n }, [isOpen])\n\n const container = useContainer()\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={handleOpenChange}>\n <Dialog.Trigger asChild data-shy=\"true\">\n <IconButton bp={breakpoints}>\n <SmallIcon>\n <MixerVerticalIcon />\n </SmallIcon>\n </IconButton>\n </Dialog.Trigger>\n <Dialog.Portal container={container.current}>\n <StyledDialogOverlay onPointerDown={handleClose} />\n <StyledDialogContent dir=\"ltr\" onKeyDown={stopPropagation} onKeyUp={stopPropagation}>\n <TextField\n ref={rInput}\n placeholder={intl.formatMessage({ id: 'page.name' })}\n value={pageName}\n onChange={handleTextFieldChange}\n onKeyDown={handleTextFieldKeyDown}\n icon={<Pencil1Icon />}\n />\n <Divider />\n <DialogAction onSelect={handleDuplicate}>\n <FormattedMessage id=\"duplicate\" />\n </DialogAction>\n <DialogAction disabled={!canDelete} onSelect={handleDelete}>\n <FormattedMessage id=\"delete\" />\n </DialogAction>\n <Divider />\n <Dialog.Cancel asChild>\n <RowButton>\n <FormattedMessage id=\"cancel\" />\n </RowButton>\n </Dialog.Cancel>\n </StyledDialogContent>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n\n/* -------------------------------------------------- */\n/* Dialog */\n/* -------------------------------------------------- */\n\nexport const StyledDialogContent = styled(Dialog.Content, {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n minWidth: 240,\n maxWidth: 'fit-content',\n maxHeight: '85vh',\n marginTop: '-5vh',\n pointerEvents: 'all',\n backgroundColor: '$panel',\n padding: '$1',\n borderRadius: '$2',\n font: '$ui',\n zIndex: 999999,\n '&:focus': {\n outline: 'none',\n },\n})\n\nexport const StyledDialogOverlay = styled(Dialog.Overlay, {\n backgroundColor: 'rgba(0, 0, 0, .15)',\n position: 'absolute',\n pointerEvents: 'all',\n inset: 0,\n zIndex: 999998,\n})\n\nfunction DialogAction({\n onSelect,\n ...rest\n}: RowButtonProps & { onSelect: (e: React.SyntheticEvent<HTMLButtonElement, Event>) => void }) {\n return (\n <Dialog.Action asChild onClick={onSelect} onSelect={onSelect}>\n <RowButton {...rest} />\n </Dialog.Action>\n )\n}\n", "import { styled } from '~styles'\n\nexport const IconButton = styled('button', {\n position: 'relative',\n height: '32px',\n width: '32px',\n backgroundColor: '$panel',\n borderRadius: '4px',\n padding: '0',\n margin: '0',\n outline: 'none',\n border: 'none',\n pointerEvents: 'all',\n fontSize: '$0',\n color: '$text',\n cursor: 'pointer',\n display: 'grid',\n alignItems: 'center',\n justifyContent: 'center',\n\n '& > *': {\n gridRow: 1,\n gridColumn: 1,\n },\n\n '&:disabled': {\n opacity: '0.5',\n },\n\n '& > span': {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n },\n\n variants: {\n bp: {\n mobile: {\n backgroundColor: 'transparent',\n },\n small: {\n '&:hover:not(:disabled)': {\n backgroundColor: '$hover',\n },\n },\n },\n size: {\n small: {\n height: 32,\n width: 32,\n '& svg:nth-of-type(1)': {\n height: '16px',\n width: '16px',\n },\n },\n medium: {\n height: 44,\n width: 44,\n '& svg:nth-of-type(1)': {\n height: '18px',\n width: '18px',\n },\n },\n large: {\n height: 44,\n width: 44,\n '& svg:nth-of-type(1)': {\n height: '20px',\n width: '20px',\n },\n },\n },\n isActive: {\n true: {\n color: '$selected',\n },\n },\n },\n})\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport {\n TextAlignCenterIcon,\n TextAlignJustifyIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n} from '@radix-ui/react-icons'\nimport * as React from 'react'\nimport { FormattedMessage, useIntl } from 'react-intl'\nimport { Divider } from '~components/Primitives/Divider'\nimport { DMCheckboxItem, DMContent, DMRadioItem } from '~components/Primitives/DropdownMenu'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport {\n CircleIcon,\n DashDashedIcon,\n DashDottedIcon,\n DashDrawIcon,\n DashSolidIcon,\n SizeLargeIcon,\n SizeMediumIcon,\n SizeSmallIcon,\n} from '~components/Primitives/icons'\nimport { breakpoints } from '~components/breakpoints'\nimport { preventEvent } from '~components/preventEvent'\nimport { useTelvaApp } from '~hooks'\nimport { defaultTextStyle, fills, strokes } from '~state/shapes/shared'\nimport { styled } from '~styles'\nimport {\n AlignStyle,\n ColorStyle,\n DashStyle,\n FontStyle,\n ShapeStyles,\n SizeStyle,\n TVShapeType,\n TVSnapshot,\n} from '~types'\n\nconst currentStyleSelector = (s: TVSnapshot) => s.appState.currentStyle\nconst selectedIdsSelector = (s: TVSnapshot) =>\n s.document.pageStates[s.appState.currentPageId].selectedIds\n\nconst STYLE_KEYS = Object.keys(defaultTextStyle) as (keyof ShapeStyles)[]\n\nconst DASH_ICONS = {\n [DashStyle.Draw]: <DashDrawIcon />,\n [DashStyle.Solid]: <DashSolidIcon />,\n [DashStyle.Dashed]: <DashDashedIcon />,\n [DashStyle.Dotted]: <DashDottedIcon />,\n}\n\nconst SIZE_ICONS = {\n [SizeStyle.Small]: <SizeSmallIcon />,\n [SizeStyle.Medium]: <SizeMediumIcon />,\n [SizeStyle.Large]: <SizeLargeIcon />,\n}\n\nconst ALIGN_ICONS = {\n [AlignStyle.Start]: <TextAlignLeftIcon />,\n [AlignStyle.Middle]: <TextAlignCenterIcon />,\n [AlignStyle.End]: <TextAlignRightIcon />,\n [AlignStyle.Justify]: <TextAlignJustifyIcon />,\n}\n\nconst themeSelector = (s: TVSnapshot) => (s.settings.isDarkMode ? 'dark' : 'light')\n\nconst keepOpenSelector = (s: TVSnapshot) => s.settings.keepStyleMenuOpen\n\nconst optionsSelector = (s: TVSnapshot) => {\n const { activeTool, currentPageId: pageId } = s.appState\n switch (activeTool) {\n case 'select': {\n const page = s.document.pages[pageId]\n let hasText = false\n let hasLabel = false\n for (const id of s.document.pageStates[pageId].selectedIds) {\n if ('text' in page.shapes[id]) hasText = true\n if ('label' in page.shapes[id]) hasLabel = true\n }\n return hasText ? 'text' : hasLabel ? 'label' : ''\n }\n case TVShapeType.Text: {\n return 'text'\n }\n case TVShapeType.Rectangle: {\n return 'label'\n }\n case TVShapeType.Ellipse: {\n return 'label'\n }\n case TVShapeType.Triangle: {\n return 'label'\n }\n case TVShapeType.Arrow: {\n return 'label'\n }\n case TVShapeType.Line: {\n return 'label'\n }\n }\n\n return false\n}\n\nexport const StyleMenu = React.memo(function ColorMenu() {\n const app = useTelvaApp()\n\n const intl = useIntl()\n\n const theme = app.useStore(themeSelector)\n\n const keepOpen = app.useStore(keepOpenSelector)\n\n const options = app.useStore(optionsSelector)\n\n const currentStyle = app.useStore(currentStyleSelector)\n\n const selectedIds = app.useStore(selectedIdsSelector)\n\n const [displayedStyle, setDisplayedStyle] = React.useState(currentStyle)\n\n const rDisplayedStyle = React.useRef(currentStyle)\n\n React.useEffect(() => {\n const {\n appState: { currentStyle },\n page,\n selectedIds,\n } = app\n let commonStyle = {} as ShapeStyles\n if (selectedIds.length <= 0) {\n commonStyle = currentStyle\n } else {\n const overrides = new Set<string>([])\n app.selectedIds\n .map((id) => page.shapes[id])\n .forEach((shape) => {\n STYLE_KEYS.forEach((key) => {\n if (overrides.has(key)) return\n if (commonStyle[key] === undefined) {\n // @ts-ignore\n commonStyle[key] = shape.style[key]\n } else {\n if (commonStyle[key] === shape.style[key]) return\n // @ts-ignore\n commonStyle[key] = shape.style[key]\n overrides.add(key)\n }\n })\n })\n }\n // Until we can work out the correct logic for deciding whether or not to\n // update the selected style, do a string comparison. Yuck!\n if (JSON.stringify(commonStyle) !== JSON.stringify(rDisplayedStyle.current)) {\n rDisplayedStyle.current = commonStyle\n setDisplayedStyle(commonStyle)\n }\n }, [currentStyle, selectedIds])\n\n const handleToggleKeepOpen = React.useCallback((checked: boolean) => {\n app.setSetting('keepStyleMenuOpen', checked)\n }, [])\n\n const handleToggleFilled = React.useCallback((checked: boolean) => {\n app.style({ isFilled: checked })\n }, [])\n\n const handleDashChange = React.useCallback((value: string) => {\n app.style({ dash: value as DashStyle })\n }, [])\n\n const handleSizeChange = React.useCallback((value: string) => {\n app.style({ size: value as SizeStyle })\n }, [])\n\n const handleFontChange = React.useCallback((value: string) => {\n app.style({ font: value as FontStyle })\n }, [])\n\n const handleTextAlignChange = React.useCallback((value: string) => {\n app.style({ textAlign: value as AlignStyle })\n }, [])\n\n const handleMenuOpenChange = React.useCallback(\n (open: boolean) => {\n app.setMenuOpen(open)\n },\n [app]\n )\n\n return (\n <DropdownMenu.Root\n dir=\"ltr\"\n onOpenChange={handleMenuOpenChange}\n open={keepOpen ? true : undefined}\n modal={false}\n >\n <DropdownMenu.Trigger asChild id=\"TD-Styles\">\n <ToolButton aria-label={intl.formatMessage({ id: 'styles' })} variant=\"text\">\n <FormattedMessage id=\"styles\" />\n <OverlapIcons\n style={{\n color: strokes[theme][displayedStyle.color as ColorStyle],\n }}\n >\n {displayedStyle.isFilled && (\n <CircleIcon\n size={16}\n stroke=\"none\"\n fill={fills[theme][displayedStyle.color as ColorStyle]}\n />\n )}\n {DASH_ICONS[displayedStyle.dash]}\n </OverlapIcons>\n </ToolButton>\n </DropdownMenu.Trigger>\n <DMContent id=\"TD-StylesMenu\" side=\"bottom\" align=\"end\" sideOffset={4} alignOffset={4}>\n <StyledRow variant=\"tall\" id=\"TD-Styles-Color-Container\">\n <span>\n <FormattedMessage id=\"style.menu.color\" />\n </span>\n <ColorGrid>\n {Object.keys(strokes.light).map((style: string) => (\n <DropdownMenu.Item\n key={style}\n onSelect={preventEvent}\n asChild\n id={`TD-Styles-Color-Swatch-${style}`}\n >\n <ToolButton\n variant=\"icon\"\n isActive={displayedStyle.color === style}\n onClick={() => app.style({ color: style as ColorStyle })}\n aria-label={intl.formatMessage({ id: style })}\n >\n <CircleIcon\n size={18}\n strokeWidth={2.5}\n fill={\n displayedStyle.isFilled ? fills[theme][style as ColorStyle] : 'transparent'\n }\n stroke={strokes.light[style as ColorStyle]}\n />\n </ToolButton>\n </DropdownMenu.Item>\n ))}\n </ColorGrid>\n </StyledRow>\n <DMCheckboxItem\n variant=\"styleMenu\"\n checked={!!displayedStyle.isFilled}\n onCheckedChange={handleToggleFilled}\n id=\"TD-Styles-Fill\"\n >\n <FormattedMessage id=\"style.menu.fill\" />\n </DMCheckboxItem>\n <StyledRow id=\"TD-Styles-Dash-Container\">\n <FormattedMessage id=\"style.menu.dash\" />\n <StyledGroup dir=\"ltr\" value={displayedStyle.dash} onValueChange={handleDashChange}>\n {Object.values(DashStyle).map((style) => (\n <DMRadioItem\n key={style}\n isActive={style === displayedStyle.dash}\n value={style}\n onSelect={preventEvent}\n bp={breakpoints}\n id={`TD-Styles-Dash-${style}`}\n aria-label={intl.formatMessage({ id: style })}\n >\n {DASH_ICONS[style as DashStyle]}\n </DMRadioItem>\n ))}\n </StyledGroup>\n </StyledRow>\n <StyledRow id=\"TD-Styles-Size-Container\">\n <FormattedMessage id=\"style.menu.size\" />\n <StyledGroup dir=\"ltr\" value={displayedStyle.size} onValueChange={handleSizeChange}>\n {Object.values(SizeStyle).map((sizeStyle) => (\n <DMRadioItem\n key={sizeStyle}\n isActive={sizeStyle === displayedStyle.size}\n value={sizeStyle}\n onSelect={preventEvent}\n bp={breakpoints}\n id={`TD-Styles-Dash-${sizeStyle}`}\n aria-label={intl.formatMessage({ id: sizeStyle })}\n >\n {SIZE_ICONS[sizeStyle as SizeStyle]}\n </DMRadioItem>\n ))}\n </StyledGroup>\n </StyledRow>\n {(options === 'text' || options === 'label') && (\n <>\n <Divider />\n <StyledRow id=\"TD-Styles-Font-Container\">\n <FormattedMessage id=\"style.menu.font\" />\n <StyledGroup dir=\"ltr\" value={displayedStyle.font} onValueChange={handleFontChange}>\n {Object.values(FontStyle).map((fontStyle) => (\n <DMRadioItem\n key={fontStyle}\n isActive={fontStyle === displayedStyle.font}\n value={fontStyle}\n onSelect={preventEvent}\n bp={breakpoints}\n id={`TD-Styles-Font-${fontStyle}`}\n >\n <FontIcon fontStyle={fontStyle}>Aa</FontIcon>\n </DMRadioItem>\n ))}\n </StyledGroup>\n </StyledRow>\n {options === 'text' && (\n <StyledRow id=\"TD-Styles-Align-Container\">\n <FormattedMessage id=\"style.menu.align\" />\n <StyledGroup\n dir=\"ltr\"\n value={displayedStyle.textAlign}\n onValueChange={handleTextAlignChange}\n >\n {Object.values(AlignStyle).map((style) => (\n <DMRadioItem\n key={style}\n isActive={style === displayedStyle.textAlign}\n value={style}\n onSelect={preventEvent}\n bp={breakpoints}\n id={`TD-Styles-Align-${style}`}\n >\n {ALIGN_ICONS[style]}\n </DMRadioItem>\n ))}\n </StyledGroup>\n </StyledRow>\n )}\n </>\n )}\n <Divider />\n <DMCheckboxItem\n variant=\"styleMenu\"\n checked={keepOpen}\n onCheckedChange={handleToggleKeepOpen}\n id=\"TD-Styles-Keep-Open\"\n >\n <FormattedMessage id=\"style.menu.keep.open\" />\n </DMCheckboxItem>\n </DMContent>\n </DropdownMenu.Root>\n )\n})\n\nconst ColorGrid = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'repeat(4, auto)',\n gap: 0,\n})\n\nexport const StyledRow = styled('div', {\n position: 'relative',\n width: '100%',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n minHeight: '32px',\n outline: 'none',\n color: '$text',\n fontFamily: '$ui',\n fontWeight: 400,\n fontSize: '$1',\n padding: '$2 0 $2 $3',\n borderRadius: 4,\n userSelect: 'none',\n WebkitUserSelect: 'none',\n margin: 0,\n display: 'flex',\n gap: '$3',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n variants: {\n variant: {\n tall: {\n alignItems: 'flex-start',\n padding: '0 0 0 $3',\n '& > span': {\n paddingTop: '$4',\n },\n },\n },\n },\n})\n\nconst StyledGroup = styled(DropdownMenu.DropdownMenuRadioGroup, {\n display: 'flex',\n flexDirection: 'row',\n gap: '$1',\n})\n\nconst OverlapIcons = styled('div', {\n display: 'grid',\n '& > *': {\n gridColumn: 1,\n gridRow: 1,\n },\n})\n\nconst FontIcon = styled('div', {\n width: 32,\n height: 32,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '$3',\n variants: {\n fontStyle: {\n [FontStyle.Script]: {\n fontFamily: 'Caveat Brush',\n },\n [FontStyle.Sans]: {\n fontFamily: 'Recursive',\n },\n [FontStyle.Serif]: {\n fontFamily: 'Georgia',\n },\n [FontStyle.Mono]: {\n fontFamily: 'Recursive Mono',\n },\n },\n },\n})\n", "import * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport * as React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport { DMContent, DMItem } from '~components/Primitives/DropdownMenu'\nimport { ToolButton } from '~components/Primitives/ToolButton'\nimport { preventEvent } from '~components/preventEvent'\nimport { useTelvaApp } from '~hooks'\nimport { styled } from '~styles'\nimport type { TVSnapshot } from '~types'\n\nconst zoomSelector = (s: TVSnapshot) => s.document.pageStates[s.appState.currentPageId].camera.zoom\n\nexport const ZoomMenu = function ZoomMenu() {\n const app = useTelvaApp()\n\n const zoom = app.useStore(zoomSelector)\n\n return (\n <DropdownMenu.Root dir=\"ltr\">\n <DropdownMenu.Trigger dir=\"ltr\" asChild id=\"TD-Zoom\">\n <FixedWidthToolButton onDoubleClick={app.resetZoom} variant=\"text\">\n {Math.round(zoom * 100)}%\n </FixedWidthToolButton>\n </DropdownMenu.Trigger>\n <DMContent align=\"end\">\n <DMItem onSelect={preventEvent} onClick={app.zoomIn} kbd=\"#+\" id=\"TD-Zoom-Zoom_In\">\n <FormattedMessage id=\"zoom.in\" />\n </DMItem>\n <DMItem onSelect={preventEvent} onClick={app.zoomOut} kbd=\"#\u2212\" id=\"TD-Zoom-Zoom_Out\">\n <FormattedMessage id=\"zoom.out\" />\n </DMItem>\n <DMItem onSelect={preventEvent} onClick={app.resetZoom} kbd=\"\u21E70\" id=\"TD-Zoom-Zoom_To_100%\">\n <FormattedMessage id=\"zoom.to\" /> 100%\n </DMItem>\n <DMItem onSelect={preventEvent} onClick={app.zoomToFit} kbd=\"\u21E71\" id=\"TD-Zoom-To_Fit\">\n <FormattedMessage id=\"zoom.to.fit\" />\n </DMItem>\n <DMItem\n onSelect={preventEvent}\n onClick={app.zoomToSelection}\n kbd=\"\u21E72\"\n id=\"TD-Zoom-To_Selection\"\n >\n <FormattedMessage id=\"zoom.to.selection\" />\n </DMItem>\n </DMContent>\n </DropdownMenu.Root>\n )\n}\n\nconst FixedWidthToolButton = styled(ToolButton, {\n minWidth: 56,\n})\n", "import React, { RefObject } from 'react'\n\nexport function useCursor(ref: RefObject<HTMLDivElement>) {\n React.useEffect(() => {\n let isPointing = false\n let isSpacePanning = false\n\n const elm = ref.current\n if (!elm) return\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === ' ' && !isSpacePanning) {\n isSpacePanning = true\n\n if (isPointing) {\n elm.setAttribute('style', 'cursor: grabbing !important')\n } else {\n elm.setAttribute('style', 'cursor: grab !important')\n }\n }\n }\n\n const onKeyUp = (e: KeyboardEvent) => {\n if (e.key === ' ') {\n isSpacePanning = false\n elm.setAttribute('style', 'cursor: initial')\n }\n }\n\n const onPointerDown = (e: PointerEvent) => {\n isPointing = true\n\n // On middle mouse down\n if (e.button === 1) {\n elm.setAttribute('style', 'cursor: grabbing !important')\n }\n\n // On left mouse down\n if (e.button === 0) {\n if (isSpacePanning) {\n elm.setAttribute('style', 'cursor: grabbing !important')\n }\n }\n }\n\n const onPointerUp = () => {\n isPointing = false\n\n if (isSpacePanning) {\n elm.setAttribute('style', 'cursor: grab !important')\n } else {\n elm.setAttribute('style', 'cursor: initial')\n }\n }\n\n elm.addEventListener('keydown', onKeyDown)\n elm.addEventListener('keyup', onKeyUp)\n elm.addEventListener('pointerdown', onPointerDown)\n elm.addEventListener('pointerup', onPointerUp)\n\n return () => {\n elm.removeEventListener('keydown', onKeyDown)\n elm.removeEventListener('keyup', onKeyUp)\n elm.removeEventListener('pointerdown', onPointerDown)\n elm.removeEventListener('pointerup', onPointerUp)\n }\n }, [ref.current])\n}\n", "import {\n TLBounds,\n TLBoundsEventHandler,\n TLBoundsHandleEventHandler,\n TLCanvasEventHandler,\n TLDropEventHandler,\n TLKeyboardEventHandler,\n TLPageState,\n TLPinchEventHandler,\n TLPointerEventHandler,\n TLShape,\n TLShapeCloneHandler,\n TLWheelEventHandler,\n Utils,\n} from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport {\n FIT_TO_SCREEN_PADDING,\n GRID_SIZE,\n IMAGE_EXTENSIONS,\n SVG_EXPORT_PADDING,\n USER_COLORS,\n VIDEO_EXTENSIONS,\n isLinux,\n} from '~constants'\nimport { DialogState } from '~hooks'\nimport { shapeUtils } from '~state/shapes'\nimport { defaultStyle } from '~state/shapes/shared'\nimport {\n AlignStyle,\n AlignType,\n ArrowShape,\n DistributeType,\n FlipType,\n GroupShape,\n MoveType,\n SessionType,\n ShapeStyles,\n StretchType,\n TVAsset,\n TVAssetType,\n TVAssets,\n TVBinding,\n TVDocument,\n TVExport,\n TVExportBackground,\n TVExportType,\n TVPage,\n TVShape,\n TVShapeType,\n TVSnapshot,\n TVStatus,\n TVToolType,\n TVUser,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\nimport { getClipboard, setClipboard } from './IdbClipboard'\nimport { StateManager } from './StateManager'\nimport { deepCopy } from './StateManager/copy'\nimport { TVDR } from './TVDR'\nimport * as Commands from './commands'\nimport {\n fileToBase64,\n fileToText,\n getImageSizeFromSrc,\n getVideoSizeFromSrc,\n loadFileHandle,\n migrate,\n openAssetsFromFileSystem,\n openFromFileSystem,\n saveToFileSystem,\n} from './data'\nimport { SessionArgsOfType, TelvaSession, getSession } from './sessions'\nimport { clearPrevSize } from './shapes/shared/getTextSize'\nimport { ArrowTool } from './tools/ArrowTool'\nimport type { BaseTool } from './tools/BaseTool'\nimport { DrawTool } from './tools/DrawTool'\nimport { EllipseTool } from './tools/EllipseTool'\nimport { EraseTool } from './tools/EraseTool'\nimport { LineTool } from './tools/LineTool'\nimport { PenTool } from './tools/PenTool'\nimport { RectangleTool } from './tools/RectangleTool'\nimport { SelectTool } from './tools/SelectTool'\nimport { StickyTool } from './tools/StickyTool'\nimport { TextTool } from './tools/TextTool'\nimport { TriangleTool } from './tools/TriangleTool'\n\nconst uuid = Utils.uniqueId()\n\nexport interface TVCallbacks {\n /**\n * (optional) A callback to run when the component mounts.\n */\n onMount?: (app: TelvaApp) => void\n /**\n * (optional) A callback to run when the component's state changes.\n */\n onChange?: (app: TelvaApp, reason?: string) => void\n /**\n * (optional) A callback to run when the user creates a new project through the menu or through a keyboard shortcut.\n */\n onNewProject?: (\n app: TelvaApp,\n openDialog: (\n dialogState: DialogState,\n onYes: () => void,\n onNo: () => void,\n onCancel: () => void\n ) => void,\n e?: KeyboardEvent\n ) => void\n /**\n * (optional) A callback to run when the user saves a project through the menu or through a keyboard shortcut.\n */\n onSaveProject?: (app: TelvaApp, e?: KeyboardEvent) => void\n /**\n * (optional) A callback to run when the user saves a project as a new project through the menu or through a keyboard shortcut.\n */\n onSaveProjectAs?: (app: TelvaApp, e?: KeyboardEvent) => void\n /**\n * (optional) A callback to run when the user opens new project through the menu or through a keyboard shortcut.\n */\n onOpenProject?: (\n app: TelvaApp,\n openDialog: (\n dialogState: DialogState,\n onYes: () => void,\n onNo: () => void,\n onCancel: () => void\n ) => void,\n e?: KeyboardEvent\n ) => void\n /**\n * (optional) A callback to run when the opens a file to upload.\n */\n onOpenMedia?: (app: TelvaApp) => void\n /**\n * (optional) A callback to run when the state is patched.\n */\n onPatch?: (app: TelvaApp, patch: TelvaPatch, reason?: string) => void\n /**\n * (optional) A callback to run when the state is changed with a command.\n */\n onCommand?: (app: TelvaApp, command: TelvaCommand, reason?: string) => void\n /**\n * (optional) A callback to run when the state is persisted.\n */\n onPersist?: (app: TelvaApp) => void\n /**\n * (optional) A callback to run when the user undos.\n */\n onUndo?: (app: TelvaApp) => void\n /**\n * (optional) A callback to run when the user redos.\n */\n onRedo?: (app: TelvaApp) => void\n /**\n * (optional) A callback to run when the user changes the current page's shapes.\n */\n onChangePage?: (\n app: TelvaApp,\n shapes: Record<string, TVShape | undefined>,\n bindings: Record<string, TVBinding | undefined>,\n assets: Record<string, TVAsset | undefined>,\n addToHistory: boolean\n ) => void\n /**\n * (optional) A callback to run when the user creates a new project.\n */\n onChangePresence?: (app: TelvaApp, user: TVUser) => void\n /**\n * (optional) A callback to run when an asset will be deleted.\n */\n onAssetDelete?: (app: TelvaApp, assetId: string) => void\n /**\n * (optional) A callback to run when an asset will be created. Should return the value for the image/video's `src` property.\n */\n onAssetCreate?: (app: TelvaApp, file: File, id: string) => Promise<string | false>\n /**\n * (optional) A callback to run when an asset will be uploaded. Should return the value for the image/video's `src` property.\n */\n onAssetUpload?: (app: TelvaApp, file: File, id: string) => Promise<string | false>\n /**\n * (optional) A callback to run when the user exports their page or selection.\n */\n onExport?: (app: TelvaApp, info: TVExport) => Promise<void>\n /**\n * (optional) A callback to run when a session begins.\n */\n onSessionStart?: (app: TelvaApp, id: string) => void\n /**\n * (optional) A callback to run when a session ends.\n */\n onSessionEnd?: (app: TelvaApp, id: string) => void\n}\n\nexport class TelvaApp extends StateManager<TVSnapshot> {\n callbacks: TVCallbacks = {}\n\n tools = {\n select: new SelectTool(this),\n erase: new EraseTool(this),\n [TVShapeType.Text]: new TextTool(this),\n [TVShapeType.Draw]: new DrawTool(this),\n [TVShapeType.Ellipse]: new EllipseTool(this),\n [TVShapeType.Rectangle]: new RectangleTool(this),\n [TVShapeType.Triangle]: new TriangleTool(this),\n [TVShapeType.Line]: new LineTool(this),\n [TVShapeType.Arrow]: new ArrowTool(this),\n [TVShapeType.Sticky]: new StickyTool(this),\n [TVShapeType.Pen]: new PenTool(this),\n }\n\n currentTool: BaseTool = this.tools.select\n\n session?: TelvaSession\n\n readOnly = false\n\n isDirty = false\n\n isCreating = false\n\n originPoint = [0, 0]\n\n currentPoint = [0, 0]\n\n previousPoint = [0, 0]\n\n shiftKey = false\n\n altKey = false\n\n metaKey = false\n\n ctrlKey = false\n\n spaceKey = false\n\n isPointing = false\n\n isForcePanning = false\n\n isErasingWithPen = false\n\n isPastePrevented = false\n\n editingStartTime = -1\n\n fileSystemHandle: FileSystemFileHandle | null = null\n\n viewport = Utils.getBoundsFromPoints([\n [0, 0],\n [100, 100],\n ])\n\n rendererBounds = Utils.getBoundsFromPoints([\n [0, 0],\n [100, 100],\n ])\n\n selectHistory = {\n stack: [[]] as string[][],\n pointer: 0,\n }\n\n clipboard?: {\n shapes: TVShape[]\n bindings: TVBinding[]\n assets: TVAsset[]\n }\n\n rotationInfo = {\n selectedIds: [] as string[],\n center: [0, 0],\n }\n\n constructor(id?: string, callbacks = {} as TVCallbacks) {\n super(TelvaApp.defaultState, id, TelvaApp.version, (prev, next, prevVersion) => {\n return migrate(\n {\n ...next,\n document: { ...next.document, ...prev.document, version: prevVersion },\n },\n TelvaApp.version\n )\n })\n\n this.callbacks = callbacks\n }\n\n /* -------------------- Internal -------------------- */\n\n protected migrate = (state: TVSnapshot): TVSnapshot => {\n return migrate(state, TelvaApp.version)\n }\n\n protected onReady = () => {\n this.loadDocument(this.document)\n\n loadFileHandle().then((fileHandle) => {\n this.fileSystemHandle = fileHandle\n })\n\n try {\n this.patchState({\n ...migrate(this.state, TelvaApp.version),\n appState: {\n status: TVStatus.Idle,\n },\n })\n } catch (e) {\n console.error('The data appears to be corrupted. Resetting!', e)\n localStorage.setItem(this.document.id + '_corrupted', JSON.stringify(this.document))\n\n this.patchState({\n ...TelvaApp.defaultState,\n appState: {\n ...TelvaApp.defaultState.appState,\n status: TVStatus.Idle,\n },\n })\n }\n\n this.callbacks.onMount?.(this)\n }\n\n /**\n * Cleanup the state after each state change.\n * @param state The new state\n * @param prev The previous state\n * @protected\n * @returns The final state\n */\n protected cleanup = (state: TVSnapshot, prev: TVSnapshot): TVSnapshot => {\n const next: TVSnapshot = { ...state }\n\n // Remove deleted shapes and bindings (in Commands, these will be set to undefined)\n if (next.document !== prev.document) {\n Object.entries(next.document.pages).forEach(([pageId, page]) => {\n if (page === undefined) {\n // If page is undefined, delete the page and pagestate\n delete next.document.pages[pageId]\n delete next.document.pageStates[pageId]\n return\n }\n\n const prevPage = prev.document.pages[pageId]\n\n const changedShapes: Record<string, TVShape | undefined> = {}\n\n if (!prevPage || page.shapes !== prevPage.shapes || page.bindings !== prevPage.bindings) {\n page.shapes = { ...page.shapes }\n page.bindings = { ...page.bindings }\n\n const groupsToUpdate = new Set<GroupShape>()\n\n // If shape is undefined, delete the shape\n Object.entries(page.shapes).forEach(([id, shape]) => {\n let parentId: string\n\n if (!shape) {\n parentId = prevPage?.shapes[id]?.parentId\n delete page.shapes[id]\n } else {\n parentId = shape.parentId\n }\n\n if (page.id === next.appState.currentPageId) {\n if (prevPage?.shapes[id] !== shape) {\n changedShapes[id] = shape\n }\n }\n\n // If the shape is the child of a group, then update the group\n // (unless the group is being deleted too)\n if (parentId && parentId !== pageId) {\n const group = page.shapes[parentId]\n if (group !== undefined) {\n groupsToUpdate.add(page.shapes[parentId] as GroupShape)\n }\n }\n })\n\n // If binding is undefined, delete the binding\n Object.keys(page.bindings).forEach((id) => {\n if (!page.bindings[id]) {\n delete page.bindings[id]\n }\n })\n\n next.document.pages[pageId] = page\n\n // Get bindings related to the changed shapes\n const bindingsToUpdate = TVDR.getRelatedBindings(next, Object.keys(changedShapes), pageId)\n\n const visitedShapes = new Set<ArrowShape>()\n\n // Update all of the bindings we've just collected\n bindingsToUpdate.forEach((binding) => {\n if (!page.bindings[binding.id]) {\n return\n }\n\n const toShape = page.shapes[binding.toId]\n const fromShape = page.shapes[binding.fromId] as ArrowShape\n\n if (!(toShape && fromShape)) {\n delete next.document.pages[pageId].bindings[binding.id]\n return\n }\n\n if (visitedShapes.has(fromShape)) {\n return\n }\n // We only need to update the binding's \"from\" shape (an arrow)\n const fromDelta = TVDR.updateArrowBindings(page, fromShape)\n visitedShapes.add(fromShape)\n\n if (fromDelta) {\n const nextShape = {\n ...fromShape,\n ...fromDelta,\n } as ArrowShape\n page.shapes[fromShape.id] = nextShape\n }\n })\n\n groupsToUpdate.forEach((group) => {\n if (!group) throw Error('no group!')\n const children = group.children.filter((id) => page.shapes[id] !== undefined)\n\n const commonBounds = Utils.getCommonBounds(\n children\n .map((id) => page.shapes[id])\n .filter(Boolean)\n .map((shape) => TVDR.getRotatedBounds(shape))\n )\n\n page.shapes[group.id] = {\n ...group,\n point: [commonBounds.minX, commonBounds.minY],\n size: [commonBounds.width, commonBounds.height],\n children,\n }\n })\n }\n\n // Clean up page state, preventing hovers on deleted shapes\n\n const nextPageState: TLPageState = {\n ...next.document.pageStates[pageId],\n }\n\n if (!nextPageState.brush) {\n delete nextPageState.brush\n }\n\n if (nextPageState.hoveredId && !page.shapes[nextPageState.hoveredId]) {\n delete nextPageState.hoveredId\n }\n\n if (nextPageState.bindingId && !page.bindings[nextPageState.bindingId]) {\n TVDR.warn(`Could not find the binding of ${pageId}`)\n delete nextPageState.bindingId\n }\n\n if (nextPageState.editingId && !page.shapes[nextPageState.editingId]) {\n TVDR.warn('Could not find the editing shape!')\n delete nextPageState.editingId\n }\n\n next.document.pageStates[pageId] = nextPageState\n })\n }\n\n Object.keys(next.document.assets ?? {}).forEach((id) => {\n if (!next.document.assets?.[id]) {\n delete next.document.assets?.[id]\n }\n })\n\n const currentPageId = next.appState.currentPageId\n\n const currentPageState = next.document.pageStates[currentPageId]\n\n if (next.room && next.room !== prev.room) {\n const room = { ...next.room, users: { ...next.room.users } }\n\n // Remove any exited users\n if (prev.room) {\n Object.values(prev.room.users)\n .filter(Boolean)\n .forEach((user) => {\n if (room.users[user.id] === undefined) {\n delete room.users[user.id]\n }\n })\n }\n\n next.room = room\n }\n\n if (next.room) {\n next.room.users[next.room.userId] = {\n ...next.room.users[next.room.userId],\n point: this.currentPoint,\n selectedIds: currentPageState.selectedIds,\n }\n }\n\n // Temporary block on editing pages while in readonly mode.\n // This is a broad solution but not a very good one: the UX\n // for interacting with a readOnly document will be more nuanced.\n if (this.readOnly) {\n next.document.pages = prev.document.pages\n }\n\n return next\n }\n\n private broadcastPatch = (patch: TelvaPatch, addToHistory: boolean) => {\n const changedShapes: Record<string, TVShape | undefined> = {}\n const changedBindings: Record<string, TVBinding | undefined> = {}\n const changedAssets: Record<string, TVAsset | undefined> = {}\n\n const shapes = patch?.document?.pages?.[this.currentPageId]?.shapes\n const bindings = patch?.document?.pages?.[this.currentPageId]?.bindings\n const assets = patch?.document?.assets\n\n if (shapes) {\n Object.keys(shapes).forEach((id) => {\n changedShapes[id!] = this.getShape(id, this.currentPageId)\n })\n }\n\n if (bindings) {\n Object.keys(bindings).forEach((id) => {\n changedBindings[id] = this.getBinding(id, this.currentPageId)\n })\n }\n\n if (assets) {\n Object.keys(assets).forEach((id) => {\n changedAssets[id] = this.document.assets[id]\n })\n }\n\n this.callbacks.onChangePage?.(this, changedShapes, changedBindings, changedAssets, addToHistory)\n }\n\n onPatch = (state: TVSnapshot, patch: TelvaPatch, id?: string) => {\n if (\n (this.callbacks.onChangePage && patch?.document?.pages?.[this.currentPageId]) ||\n patch?.document?.assets\n ) {\n if (\n patch?.document?.assets ||\n (this.session &&\n this.session.type !== SessionType.Brush &&\n this.session.type !== SessionType.Erase &&\n this.session.type !== SessionType.Draw)\n ) {\n this.broadcastPatch(patch, false)\n }\n }\n\n this.callbacks.onPatch?.(this, patch, id)\n }\n\n onCommand = (state: TVSnapshot, command: TelvaCommand, id?: string) => {\n this.clearSelectHistory()\n this.isDirty = true\n this.callbacks.onCommand?.(this, command, id)\n }\n\n onReplace = () => {\n this.clearSelectHistory()\n this.isDirty = false\n }\n\n onUndo = () => {\n this.rotationInfo.selectedIds = [...this.selectedIds]\n this.callbacks.onUndo?.(this)\n }\n\n onRedo = () => {\n this.rotationInfo.selectedIds = [...this.selectedIds]\n this.callbacks.onRedo?.(this)\n }\n\n onPersist = (state: TVSnapshot, patch: TelvaPatch) => {\n // If we are part of a room, send our changes to the server\n\n this.callbacks.onPersist?.(this)\n this.broadcastPatch(patch, true)\n }\n\n private prevSelectedIds = this.selectedIds\n\n /**\n * Clear the selection history after each new command, undo or redo.\n * @param state\n * @param id\n */\n protected onStateDidChange = (_state: TVSnapshot, id?: string): void => {\n this.callbacks.onChange?.(this, id)\n\n if (this.room && this.selectedIds !== this.prevSelectedIds) {\n this.callbacks.onChangePresence?.(this, {\n ...this.room.users[this.room.userId],\n selectedIds: this.selectedIds,\n session: !!this.session,\n })\n this.prevSelectedIds = this.selectedIds\n }\n }\n\n private preventPaste = () => {\n if (this.isPastePrevented) return\n\n const prevent = (event: ClipboardEvent) => event.stopImmediatePropagation()\n\n const enable = () => {\n setTimeout(() => {\n document.removeEventListener('paste', prevent, { capture: true })\n this.isPastePrevented = false\n }, 50)\n }\n\n document.addEventListener('paste', prevent, { capture: true })\n window.addEventListener('pointerup', enable, { once: true })\n this.isPastePrevented = true\n }\n\n /* ----------- Managing Multiplayer State ----------- */\n\n private justSent = false\n\n getReservedContent = (coreReservedIds: string[], pageId = this.currentPageId) => {\n const { bindings } = this.document.pages[pageId]\n\n // We want to know which shapes we need to\n const reservedShapes: Record<string, TVShape> = {}\n const reservedBindings: Record<string, TVBinding> = {}\n\n // Quick lookup maps for bindings\n const bindingsArr = Object.values(bindings)\n const boundTos = new Map(bindingsArr.map((binding) => [binding.toId, binding]))\n const boundFroms = new Map(bindingsArr.map((binding) => [binding.fromId, binding]))\n const bindingMaps = [boundTos, boundFroms]\n\n // Unique set of shape ids that are going to be reserved\n const reservedShapeIds: string[] = []\n\n if (this.session) coreReservedIds.forEach((id) => reservedShapeIds.push(id))\n if (this.pageState.editingId) reservedShapeIds.push(this.pageState.editingId)\n\n const strongReservedShapeIds = new Set(reservedShapeIds)\n\n // Which shape ids have we already visited?\n const visited = new Set<string>()\n\n // Time to visit every reserved shape and every related shape and binding.\n while (reservedShapeIds.length > 0) {\n const id = reservedShapeIds.pop()\n if (!id) break\n if (visited.has(id)) continue\n\n // Add to set so that we don't process this id a second time\n visited.add(id)\n\n // Get the shape and reserve it\n const shape = this.getShape(id)\n reservedShapes[id] = shape\n\n if (shape.parentId !== pageId) reservedShapeIds.push(shape.parentId)\n\n // If the shape has children, add the shape's children to the list of ids to process\n if (shape.children) reservedShapeIds.push(...shape.children)\n\n // If there are binding for this shape, reserve the bindings and\n // add its related shapes to the list of ids to process\n bindingMaps\n .map((map) => map.get(shape.id)!)\n .filter(Boolean)\n .forEach((binding) => {\n reservedBindings[binding.id] = binding\n reservedShapeIds.push(binding.toId, binding.fromId)\n })\n }\n\n return { reservedShapes, reservedBindings, strongReservedShapeIds }\n }\n\n /**\n * Manually patch in page content.\n */\n public replacePageContent = (\n shapes: Record<string, TVShape>,\n bindings: Record<string, TVBinding>,\n assets: Record<string, TVAsset>,\n pageId = this.currentPageId\n ): this => {\n if (this.justSent) {\n // The incoming update was caused by an update that the client sent, noop.\n this.justSent = false\n return this\n }\n\n const page = this.document.pages[this.currentPageId]\n\n Object.values(shapes).forEach((shape) => {\n if (shape.parentId !== pageId && !(page.shapes[shape.parentId] || shapes[shape.parentId])) {\n console.warn('Added a shape without a parent on the page')\n shape.parentId = pageId\n }\n })\n\n this.useStore.setState((current) => {\n const { hoveredId, editingId, bindingId, selectedIds } = current.document.pageStates[pageId]\n\n const coreReservedIds = [...selectedIds]\n\n const editingShape = editingId && current.document.pages[this.currentPageId].shapes[editingId]\n if (editingShape) coreReservedIds.push(editingShape.id)\n\n const { reservedShapes, reservedBindings, strongReservedShapeIds } = this.getReservedContent(\n coreReservedIds,\n this.currentPageId\n )\n\n // Merge in certain changes to reserved shapes\n Object.values(reservedShapes)\n // Don't merge updates to shapes with text (Text or Sticky)\n .filter((reservedShape) => !('text' in reservedShape))\n .forEach((reservedShape) => {\n const incomingShape = shapes[reservedShape.id]\n if (!incomingShape) return\n\n // If the shape isn't \"strongly reserved\", then use the incoming shape;\n // note that this is only if the incoming shape exists! If the shape was\n // deleted in the incoming shapes, then we'll keep out reserved shape.\n // This logic would need more work for arrows, because the incoming shape\n // include a binding change that we'll need to resolve with our reserved bindings.\n if (\n !(\n reservedShape.type === TVShapeType.Arrow ||\n strongReservedShapeIds.has(reservedShape.id)\n )\n ) {\n shapes[reservedShape.id] = incomingShape\n return\n }\n\n // Only allow certain merges.\n\n // Allow decorations (of an arrow) to be changed\n if ('decorations' in incomingShape && 'decorations' in reservedShape) {\n shapes[reservedShape.id] = { ...reservedShape, decorations: incomingShape.decorations }\n }\n\n // Allow the shape's style to be changed\n reservedShape.style = incomingShape.style\n })\n\n // Use the incoming shapes / bindings as comparisons for what\n // will have changed. This is important because we want to restore\n // related shapes that may not have changed on our side, but which\n // were deleted on the server.\n\n const nextShapes = {\n ...shapes,\n ...reservedShapes,\n }\n\n if (editingShape) {\n nextShapes[editingShape.id] = editingShape\n }\n\n const nextBindings = {\n ...bindings,\n ...reservedBindings,\n }\n const nextAssets = {\n ...assets,\n }\n\n const next: TVSnapshot = {\n ...current,\n document: {\n ...current.document,\n pages: {\n [pageId]: {\n ...current.document.pages[pageId],\n shapes: nextShapes,\n bindings: nextBindings,\n },\n },\n assets: nextAssets,\n pageStates: {\n ...current.document.pageStates,\n [pageId]: {\n ...current.document.pageStates[pageId],\n selectedIds: selectedIds.filter((id) => nextShapes[id] !== undefined),\n hoveredId: hoveredId\n ? nextShapes[hoveredId] === undefined\n ? undefined\n : hoveredId\n : undefined,\n editingId: editingId,\n bindingId: bindingId\n ? nextBindings[bindingId] === undefined\n ? undefined\n : bindingId\n : undefined,\n },\n },\n },\n }\n const page = next.document.pages[pageId]\n\n // Get bindings related to the changed shapes\n const bindingsToUpdate = TVDR.getRelatedBindings(next, Object.keys(nextShapes), pageId)\n\n const visitedShapes = new Set<ArrowShape>()\n\n // Update all of the bindings we've just collected\n bindingsToUpdate.forEach((binding) => {\n if (!page.bindings[binding.id]) {\n return\n }\n\n const fromShape = page.shapes[binding.fromId] as ArrowShape\n\n if (visitedShapes.has(fromShape)) {\n return\n }\n\n // We only need to update the binding's \"from\" shape (an arrow)\n const fromDelta = TVDR.updateArrowBindings(page, fromShape)\n visitedShapes.add(fromShape)\n\n if (fromDelta) {\n const nextShape = {\n ...fromShape,\n ...fromDelta,\n } as TVShape\n\n page.shapes[fromShape.id] = nextShape\n }\n })\n\n Object.values(nextShapes).forEach((shape) => {\n if (shape.type !== TVShapeType.Group) return\n\n const children = shape.children.filter((id) => page.shapes[id] !== undefined)\n\n const commonBounds = Utils.getCommonBounds(\n children\n .map((id) => page.shapes[id])\n .filter(Boolean)\n .map((shape) => TVDR.getRotatedBounds(shape))\n )\n\n page.shapes[shape.id] = {\n ...shape,\n point: [commonBounds.minX, commonBounds.minY],\n size: [commonBounds.width, commonBounds.height],\n children,\n }\n })\n\n this.state.document = next.document\n\n return next\n }, true)\n\n return this\n }\n\n /**\n * Set the current status.\n * @param status The new status to set.\n * @private\n * @returns\n */\n setStatus(status: string) {\n return this.patchState(\n {\n appState: { status },\n },\n `set_status:${status}`\n )\n }\n\n /**\n * Update the bounding box when the renderer's bounds change.\n * @param bounds\n */\n updateBounds = (bounds: TLBounds) => {\n this.rendererBounds = bounds\n const { point, zoom } = this.camera\n this.updateViewport(point, zoom)\n\n if (!this.readOnly && this.session) {\n this.session.update()\n }\n }\n\n updateViewport = (point: number[], zoom: number) => {\n const { width, height } = this.rendererBounds\n const [minX, minY] = Vec.sub(Vec.div([0, 0], zoom), point)\n const [maxX, maxY] = Vec.sub(Vec.div([width, height], zoom), point)\n\n this.viewport = {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n }\n }\n\n /**\n * Set or clear the editing id\n * @param id [string]\n */\n setEditingId = (id?: string, isCreating = false) => {\n if (this.readOnly) return\n\n if (id) {\n // Start a new editing session\n this.startSession(SessionType.Edit, id, isCreating)\n } else {\n // If we're clearing the editing id and we don't have one, bail\n if (!this.pageState.editingId) return\n\n // If we're clearing the editing id and we do have one, complete the session\n this.completeSession()\n }\n\n this.editingStartTime = performance.now()\n\n this.patchState(\n {\n document: {\n pageStates: {\n [this.currentPageId]: {\n editingId: id,\n },\n },\n },\n },\n `set_editing_id`\n )\n }\n\n /**\n * Set or clear the hovered id\n * @param id [string]\n */\n setHoveredId = (id?: string) => {\n this.patchState(\n {\n document: {\n pageStates: {\n [this.currentPageId]: {\n hoveredId: id,\n },\n },\n },\n },\n `set_hovered_id`\n )\n }\n\n /* -------------------------------------------------- */\n /* Settings & UI */\n /* -------------------------------------------------- */\n\n /**\n * Set or clear the node-editing shape id (for draw-path vertex editing).\n * @param id [string | undefined]\n */\n setNodeEditingId = (id?: string) => {\n this.patchState({ appState: { nodeEditingId: id } }, `set_node_editing_id`)\n }\n\n /**\n * Set a setting.\n */\n setSetting = <T extends keyof TVSnapshot['settings'], V extends TVSnapshot['settings'][T]>(\n name: T,\n value: V | ((value: V) => V)\n ): this => {\n if (this.session) return this\n\n const patch = {\n settings: {\n [name]: typeof value === 'function' ? value(this.settings[name] as V) : value,\n },\n }\n\n this.patchState(patch, `settings:${name}`)\n\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle pen mode.\n */\n toggleFocusMode = (): this => {\n if (this.session) return this\n const patch = {\n settings: {\n isFocusMode: !this.settings.isFocusMode,\n },\n }\n\n this.patchState(patch, `settings:toggled_focus_mode`)\n\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle pen mode.\n */\n togglePenMode = (): this => {\n if (this.session) return this\n const patch = {\n settings: {\n isPenMode: !this.settings.isPenMode,\n },\n }\n this.patchState(patch, `settings:toggled_pen_mode`)\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle dark mode.\n */\n toggleDarkMode = (): this => {\n if (this.session) return this\n const patch = { settings: { isDarkMode: !this.settings.isDarkMode } }\n this.patchState(patch, `settings:toggled_dark_mode`)\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle zoom snap.\n */\n toggleZoomSnap = () => {\n if (this.session) return this\n const patch = { settings: { isZoomSnap: !this.settings.isZoomSnap } }\n this.patchState(patch, `settings:toggled_zoom_snap`)\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle debug mode.\n */\n toggleDebugMode = () => {\n if (this.session) return this\n const patch = { settings: { isDebugMode: !this.settings.isDebugMode } }\n this.patchState(patch, `settings:toggled_debug`)\n this.persist(patch)\n return this\n }\n\n /**\n * Toggles the state if menu is opened\n */\n setMenuOpen = (isOpen: boolean): this => {\n const patch = { appState: { isMenuOpen: isOpen } }\n this.patchState(patch, 'ui:toggled_menu_opened')\n this.persist(patch)\n return this\n }\n\n /**\n * Toggles the state if something is loading\n */\n setIsLoading = (isLoading: boolean): this => {\n const patch = { appState: { isLoading } }\n this.patchState(patch, 'ui:toggled_is_loading')\n this.persist(patch)\n return this\n }\n\n setDisableAssets = (disableAssets: boolean): this => {\n this.patchState({ appState: { disableAssets } }, 'ui:toggled_disable_images')\n return this\n }\n\n get isMenuOpen(): boolean {\n return this.appState.isMenuOpen\n }\n\n get isLoading(): boolean {\n return this.appState.isLoading\n }\n\n get disableAssets(): boolean {\n return this.appState.disableAssets\n }\n\n /**\n * Toggle grids.\n */\n toggleGrid = (): this => {\n if (this.session) return this\n const patch = { settings: { showGrid: !this.settings.showGrid } }\n this.patchState(patch, 'settings:toggled_grid')\n this.persist(patch)\n return this\n }\n\n /**\n * Toggle canvas mode between freehand and straight.\n */\n toggleCanvasMode = (): this => {\n if (this.session) return this\n const nextMode = this.settings.canvasMode === 'freehand' ? 'straight' : 'freehand'\n const patch = { settings: { canvasMode: nextMode as 'freehand' | 'straight' } }\n this.patchState(patch, 'settings:toggled_canvas_mode')\n this.persist(patch)\n return this\n }\n\n get canvasMode() {\n return this.settings.canvasMode ?? 'freehand'\n }\n\n /**\n * Select a tool.\n * @param tool The tool to select, or \"select\".\n */\n selectTool = (type: TVToolType): this => {\n if (this.readOnly || this.session) return this\n\n this.isPointing = false // reset pointer state, in case something weird happened\n\n const tool = this.tools[type]\n\n if (tool === this.currentTool) {\n this.patchState({\n appState: {\n isToolLocked: false,\n },\n })\n return this\n }\n\n this.currentTool.onExit()\n tool.previous = this.currentTool.type\n this.currentTool = tool\n this.currentTool.onEnter()\n\n return this.patchState(\n {\n appState: {\n activeTool: type,\n isToolLocked: false,\n },\n },\n `selected_tool:${type}`\n )\n }\n\n /**\n * Toggle the tool lock option.\n */\n toggleToolLock = (): this => {\n if (this.session) return this\n return this.patchState(\n {\n appState: {\n isToolLocked: !this.appState.isToolLocked,\n },\n },\n `toggled_tool_lock`\n )\n }\n\n /* -------------------------------------------------- */\n /* Document */\n /* -------------------------------------------------- */\n\n /**\n * Reset the document to a blank state.\n */\n resetDocument = (): this => {\n if (this.session) return this\n this.session = undefined\n this.currentTool = this.tools.select\n\n const doc = TelvaApp.defaultDocument\n\n // Set the default page name to the localized version of \"Page\"\n doc.pages['page'].name = 'Page 1'\n\n this.resetHistory().clearSelectHistory().loadDocument(TelvaApp.defaultDocument).persist({})\n\n return this\n }\n\n /**\n *\n * @param document\n */\n updateUsers = (users: TVUser[], isOwnUpdate = false) => {\n this.patchState(\n {\n room: {\n users: Object.fromEntries(users.map((user) => [user.id, user])),\n },\n },\n isOwnUpdate ? 'room:self:update' : 'room:user:update'\n )\n }\n\n removeUser = (userId: string) => {\n this.patchState({\n room: {\n users: {\n [userId]: undefined,\n },\n },\n })\n }\n\n /**\n * Merge a new document patch into the current document.\n * @param document\n */\n mergeDocument = (document: TVDocument): this => {\n // If it's a new document, do a full change.\n if (this.document.id !== document.id) {\n this.replaceState({\n ...migrate(\n {\n ...this.state,\n document,\n },\n TelvaApp.version\n ),\n appState: {\n ...this.appState,\n currentPageId: Object.keys(document.pages)[0],\n },\n })\n return this\n }\n\n // Have we deleted any pages? If so, drop everything and change\n // to the first page. This is an edge case.\n const currentPageStates = { ...this.document.pageStates }\n\n // Update the app state's current page id if needed\n const nextAppState = {\n ...this.appState,\n currentPageId: document.pages[this.currentPageId]\n ? this.currentPageId\n : Object.keys(document.pages)[0],\n pages: Object.values(document.pages).map((page, i) => ({\n id: page.id,\n name: page.name,\n childIndex: page.childIndex || i,\n })),\n }\n\n // Reset the history (for now)\n this.resetHistory()\n\n Object.keys(this.document.pages).forEach((pageId) => {\n if (!document.pages[pageId]) {\n if (pageId === this.appState.currentPageId) {\n this.cancelSession()\n this.selectNone()\n }\n\n currentPageStates[pageId] = undefined as unknown as TLPageState\n }\n })\n\n // Don't allow the selected ids to be deleted during a session\u2014if\n // they've been removed, put them back in the client's document.\n if (this.session) {\n this.selectedIds\n .filter((id) => !document.pages[this.currentPageId].shapes[id])\n .forEach((id) => (document.pages[this.currentPageId].shapes[id] = this.page.shapes[id]))\n }\n\n // For other pages, remove any selected ids that were deleted.\n Object.entries(currentPageStates).forEach(([pageId, pageState]) => {\n pageState.selectedIds = pageState.selectedIds.filter(\n (id) => !!document.pages[pageId].shapes[id]\n )\n })\n\n // If the user is currently creating a shape (ie drawing), then put that\n // shape back onto the page for the client.\n const { editingId } = this.pageState\n\n if (editingId) {\n document.pages[this.currentPageId].shapes[editingId] = this.page.shapes[editingId]\n currentPageStates[this.currentPageId].selectedIds = [editingId]\n }\n\n return this.replaceState(\n {\n ...migrate(\n { ...this.state, document: { ...document, pageStates: currentPageStates } },\n TelvaApp.version\n ),\n appState: nextAppState,\n },\n 'merge'\n )\n }\n\n /**\n * Update the current document.\n * @param document\n */\n updateDocument = (document: TVDocument, reason = 'updated_document'): this => {\n const prevState = this.state\n\n const nextState = {\n ...prevState,\n document: {\n ...prevState.document,\n assets: document.assets,\n },\n }\n\n if (!document.pages[this.currentPageId]) {\n nextState.appState = {\n ...prevState.appState,\n currentPageId: Object.keys(document.pages)[0],\n }\n }\n\n let i = 1\n\n for (const nextPage of Object.values(document.pages)) {\n if (nextPage !== prevState.document.pages[nextPage.id]) {\n nextState.document.pages[nextPage.id] = nextPage\n\n if (!nextPage.name) {\n nextState.document.pages[nextPage.id].name = `Page ${i + 1}`\n i++\n }\n }\n }\n\n for (const nextPageState of Object.values(document.pageStates)) {\n if (nextPageState !== prevState.document.pageStates[nextPageState.id]) {\n nextState.document.pageStates[nextPageState.id] = nextPageState\n\n const nextPage = document.pages[nextPageState.id]\n const keysToCheck = ['bindingId', 'editingId', 'hoveredId', 'pointedId'] as const\n\n for (const key of keysToCheck) {\n if (!nextPage.shapes[key]) {\n nextPageState[key] = undefined\n }\n }\n\n nextPageState.selectedIds = nextPageState.selectedIds.filter(\n (id) => !!document.pages[nextPage.id].shapes[id]\n )\n }\n }\n\n return this.replaceState(\n migrate(nextState, nextState.document.version || 0),\n `${reason}:${document.id}`\n )\n }\n\n /**\n * Load a fresh room into the state.\n * @param roomId\n */\n loadRoom = (roomId: string): this => {\n this.patchState({\n room: {\n id: roomId,\n userId: uuid,\n users: {\n [uuid]: {\n id: uuid,\n color: USER_COLORS[Math.floor(Math.random() * USER_COLORS.length)],\n point: [100, 100],\n selectedIds: [],\n activeShapes: [],\n },\n },\n },\n })\n return this\n }\n\n /**\n * Load a new document.\n * @param document The document to load\n */\n loadDocument = (document: TVDocument): this => {\n this.setIsLoading(true)\n this.selectNone()\n this.resetHistory()\n this.clearSelectHistory()\n this.session = undefined\n\n const state = {\n ...TelvaApp.defaultState,\n settings: {\n ...this.state.settings,\n },\n document,\n appState: {\n ...TelvaApp.defaultState.appState,\n ...this.state.appState,\n currentPageId: Object.keys(document.pages)[0],\n disableAssets: this.disableAssets,\n },\n }\n\n this.replaceState(migrate(state, TelvaApp.version), 'loaded_document')\n const { point, zoom } = this.camera\n this.updateViewport(point, zoom)\n this.setIsLoading(false)\n return this\n }\n\n /**\n * load content from URL\n * @param page\n * @param pageState\n * @returns\n */\n loadPageFromURL = (page: TVPage, pageState: Record<string, TLPageState>) => {\n const pageId = page.id\n const nextDocument = {\n ...this.state.document,\n pageStates: {\n ...this.state.document.pageStates,\n [pageId]: pageState,\n },\n pages: {\n ...this.document.pages,\n [pageId]: page,\n },\n }\n this.loadDocument(nextDocument as TVDocument)\n this.persist({})\n }\n\n // Should we move this to the app layer? onSave, onSaveAs, etc?\n\n /**\n * Create a new project.\n */\n newProject = () => {\n if (!this.isLocal) return\n this.fileSystemHandle = null\n this.resetDocument()\n }\n\n /**\n * Save the current project.\n */\n saveProject = async () => {\n if (this.readOnly) return\n const fileHandle = await saveToFileSystem(\n migrate(this.state, TelvaApp.version).document,\n this.fileSystemHandle\n )\n this.fileSystemHandle = fileHandle\n this.persist({})\n this.isDirty = false\n return this\n }\n\n /**\n * Save the current project as a new file.\n * @param filename Optional file name (without extension).\n * @param format 'tldr' (default Telva format) | 'tld' (tldraw v2 JSON format)\n */\n saveProjectAs = async (filename?: string, format?: 'tldr' | 'tld') => {\n try {\n const fileHandle = await saveToFileSystem(this.document, null, filename, format)\n this.fileSystemHandle = fileHandle\n this.persist({})\n this.isDirty = false\n } catch (e: any) {\n // Likely cancelled\n console.error(e.message)\n }\n return this\n }\n\n /**\n * Load a project from the filesystem.\n * @todo\n */\n openProject = async () => {\n if (!this.isLocal) return\n\n try {\n const result = await openFromFileSystem()\n if (!result) {\n throw Error()\n }\n\n const { fileHandle, document } = result\n this.loadDocument(document)\n this.fileSystemHandle = fileHandle\n this.zoomToFit()\n this.persist({})\n } catch (e) {\n console.error(e)\n } finally {\n this.persist({})\n }\n }\n\n /**\n * Upload media from file\n */\n openAsset = async () => {\n if (!this.disableAssets)\n try {\n const file = await openAssetsFromFileSystem()\n if (Array.isArray(file)) {\n this.addMediaFromFiles(file, this.centerPoint)\n } else {\n if (!file) return\n this.addMediaFromFiles([file])\n }\n } catch (e) {\n console.error(e)\n } finally {\n this.persist({})\n }\n }\n\n /**\n * Sign out of the current account.\n * Should move to the www layer.\n * @todo\n */\n signOut = () => {\n // todo\n }\n /* -------------------- Getters --------------------- */\n\n /**\n * Get the current app state.\n */\n getAppState = (): TVSnapshot['appState'] => {\n return this.appState\n }\n\n /**\n * Get a page.\n * @param pageId (optional) The page's id.\n */\n getPage = (pageId = this.currentPageId): TVPage => {\n return TVDR.getPage(this.state, pageId || this.currentPageId)\n }\n\n /**\n * Get the shapes (as an array) from a given page.\n * @param pageId (optional) The page's id.\n */\n getShapes = (pageId = this.currentPageId): TVShape[] => {\n return TVDR.getShapes(this.state, pageId || this.currentPageId)\n }\n\n /**\n * Get the bindings from a given page.\n * @param pageId (optional) The page's id.\n */\n getBindings = (pageId = this.currentPageId): TVBinding[] => {\n return TVDR.getBindings(this.state, pageId || this.currentPageId)\n }\n\n /**\n * Get a shape from a given page.\n * @param id The shape's id.\n * @param pageId (optional) The page's id.\n */\n getShape = <T extends TVShape = TVShape>(id: string, pageId = this.currentPageId): T => {\n return TVDR.getShape<T>(this.state, id, pageId)\n }\n\n /**\n * Get the bounds of a shape on a given page.\n * @param id The shape's id.\n * @param pageId (optional) The page's id.\n */\n getShapeBounds = (id: string, pageId = this.currentPageId): TLBounds => {\n return TVDR.getBounds(this.getShape(id, pageId))\n }\n\n /**\n * Get a binding from a given page.\n * @param id The binding's id.\n * @param pageId (optional) The page's id.\n */\n getBinding = (id: string, pageId = this.currentPageId): TVBinding => {\n return TVDR.getBinding(this.state, id, pageId)\n }\n\n /**\n * Get the page state for a given page.\n * @param pageId (optional) The page's id.\n */\n getPageState = (pageId = this.currentPageId): TLPageState => {\n return TVDR.getPageState(this.state, pageId || this.currentPageId)\n }\n\n /**\n * Turn a screen point into a point on the page.\n * @param point The screen point\n * @param pageId (optional) The page to use\n */\n getPagePoint = (point: number[], pageId = this.currentPageId): number[] => {\n const { camera } = this.getPageState(pageId)\n return Vec.sub(Vec.div(point, camera.zoom), camera.point)\n }\n\n /**\n * Get the current undo/redo stack.\n */\n get history() {\n return this.stack.slice(0, this.pointer + 1)\n }\n\n /**\n * Replace the current history stack.\n */\n set history(commands: TelvaCommand[]) {\n this.replaceHistory(commands)\n }\n\n /**\n * The current document.\n */\n get document(): TVDocument {\n return this.state.document\n }\n\n /**\n * The current app state.\n */\n get settings(): TVSnapshot['settings'] {\n return this.state.settings\n }\n\n /**\n * The current app state.\n */\n get appState(): TVSnapshot['appState'] {\n return this.state.appState\n }\n\n /**\n * The current page id.\n */\n get currentPageId(): string {\n return this.state.appState.currentPageId\n }\n\n /**\n * The current page.\n */\n get page(): TVPage {\n return this.state.document.pages[this.currentPageId]\n }\n\n /**\n * The current page's shapes (as an array).\n */\n get shapes(): TVShape[] {\n return Object.values(this.page.shapes)\n }\n\n /**\n * The current page's bindings.\n */\n get bindings(): TVBinding[] {\n return Object.values(this.page.bindings)\n }\n\n /**\n * The document's assets (as an array).\n */\n get assets(): TVAsset[] {\n return Object.values(this.document.assets)\n }\n\n /**\n * The current page's state.\n */\n get pageState(): TLPageState {\n return this.state.document.pageStates[this.currentPageId]\n }\n\n get camera(): {\n point: number[]\n zoom: number\n } {\n return this.pageState.camera\n }\n\n get zoom(): number {\n return this.pageState.camera.zoom\n }\n\n /**\n * The page's current selected ids.\n */\n get selectedIds(): string[] {\n return this.pageState.selectedIds\n }\n\n /* -------------------------------------------------- */\n /* Pages */\n /* -------------------------------------------------- */\n\n /**\n * Create a new page.\n * @param pageId (optional) The new page's id.\n */\n createPage = (id?: string, name?: string): this => {\n if (this.readOnly) return this\n const { width, height } = this.rendererBounds\n return this.setState(Commands.createPage(this, [-width / 2, -height / 2], id, name))\n }\n\n /**\n * Change the current page.\n * @param pageId The new current page's id.\n */\n changePage = (pageId: string): this => {\n return this.setState(Commands.changePage(this, pageId))\n }\n\n /**\n * Move a page above another.\n * @param pageId The page to move.\n * @param index The page above which to move.\n */\n movePage = (pageId: string, index: number): this => {\n if (this.readOnly) return this\n\n return this.setState(Commands.movePage(this, pageId, index))\n }\n\n /**\n * Rename a page.\n * @param pageId The id of the page to rename.\n * @param name The page's new name\n */\n renamePage = (pageId: string, name: string): this => {\n if (this.readOnly) return this\n return this.setState(Commands.renamePage(this, pageId, name))\n }\n\n /**\n * Duplicate a page.\n * @param pageId The id of the page to duplicate.\n */\n duplicatePage = (pageId: string): this => {\n if (this.readOnly) return this\n return this.setState(Commands.duplicatePage(this, pageId))\n }\n\n /**\n * Delete a page.\n * @param pageId The id of the page to delete.\n */\n deletePage = (pageId?: string): this => {\n if (this.readOnly) return this\n if (Object.values(this.document.pages).length <= 1) return this\n return this.setState(Commands.deletePage(this, pageId ? pageId : this.currentPageId))\n }\n\n /* -------------------------------------------------- */\n /* Clipboard */\n /* -------------------------------------------------- */\n\n /**\n * Cut (copy and delete) one or more shapes to the clipboard.\n * @param ids The ids of the shapes to cut.\n */\n cut = (ids = this.selectedIds, e?: ClipboardEvent): this => {\n e?.preventDefault()\n\n this.copy(ids, e)\n\n if (!this.readOnly) {\n this.delete(ids)\n }\n\n return this\n }\n\n /**\n * Copy one or more shapes to the clipboard.\n * @param ids The ids of the shapes to copy.\n */\n copy = (ids = this.selectedIds, e?: ClipboardEvent): this => {\n // Allow when in readOnly mode\n\n e?.preventDefault()\n\n this.clipboard = this.getContent(ids)\n\n const jsonString = JSON.stringify({\n type: 'telva/clipboard',\n shapes: [],\n assets: [],\n bindings: [],\n ...this.clipboard,\n })\n\n const telvaString = `<telva>${jsonString}</telva>`\n\n setClipboard(telvaString)\n\n if (e) {\n e.clipboardData?.setData('text/html', telvaString)\n }\n\n if (navigator.clipboard && window.ClipboardItem) {\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([telvaString], { type: 'text/html' }),\n }),\n ])\n }\n\n return this\n }\n\n /**\n * Paste shapes (or text) from clipboard to a certain point.\n * @param point\n */\n paste = async (point?: number[], e?: ClipboardEvent) => {\n if (this.readOnly) return\n\n const filesToPaste: File[] = []\n const shapesToCreate: TVShape[] = []\n\n let clipboardData: any\n\n const getSvgFromText = async (text: string) => {\n const div = document.createElement('div')\n div.innerHTML = text\n const svg = div.firstChild as SVGSVGElement\n\n svg.style.setProperty('background-color', 'transparent')\n\n const imageBlob = await TVDR.getImageForSvg(svg, TVExportType.SVG, {\n scale: 1,\n quality: 1,\n })\n\n if (imageBlob) {\n const file = new File([imageBlob], 'image.svg')\n filesToPaste.push(file)\n } else {\n getShapeFromText(text)\n }\n }\n\n const getShapeFromText = (text: string) => {\n const pagePoint = this.getPagePoint(point ?? this.centerPoint, this.currentPageId)\n\n const isMultiline = text.includes('\\n')\n\n shapesToCreate.push(\n TVDR.getShapeUtil(TVShapeType.Text).getShape({\n id: Utils.uniqueId(),\n type: TVShapeType.Text,\n parentId: this.appState.currentPageId,\n text: TVDR.normalizeText(text.trim()),\n point: pagePoint,\n style: {\n ...this.appState.currentStyle,\n textAlign: isMultiline ? AlignStyle.Start : this.appState.currentStyle.textAlign,\n },\n })\n )\n }\n\n const getShapeFromHtml = (html: string) => {\n try {\n const maybeJson = html.match(/<telva>(.*)<\\/telva>/)?.[1]\n\n if (!maybeJson) return\n\n const json: {\n type: string\n shapes: (TVShape & { text: string })[]\n bindings: TVBinding[]\n assets: TVAsset[]\n } = JSON.parse(maybeJson)\n if (json.type === 'telva/clipboard') {\n clipboardData = json\n return\n } else {\n throw Error('Not telva data!')\n }\n } catch (e) {\n getShapeFromText(html)\n }\n }\n\n if (e !== undefined) {\n const items = Array.from(e.clipboardData?.items ?? [])\n\n await Promise.all(\n items.map(async (item) => {\n const { type, kind } = item\n\n switch (kind) {\n case 'string': {\n const str: string = await new Promise((resolve) => item.getAsString(resolve))\n\n switch (type) {\n case 'text/html': {\n if (str.match(/<telva>(.*)<\\/telva>/)?.[1]) {\n getShapeFromHtml(str)\n return\n }\n break\n }\n case 'text/plain': {\n if (str.startsWith('<svg')) {\n await getSvgFromText(str)\n } else {\n getShapeFromText(str)\n }\n break\n }\n }\n\n break\n }\n case 'file': {\n const file = item.getAsFile()\n if (file) filesToPaste.push(file)\n break\n }\n }\n })\n )\n }\n\n if (clipboardData) {\n this.insertContent(clipboardData, { point, select: true })\n return this\n }\n\n if (filesToPaste.length) {\n this.addMediaFromFiles(filesToPaste, point)\n return this\n }\n\n if (shapesToCreate.length) {\n const pagePoint = this.getPagePoint(point ?? this.centerPoint, this.currentPageId)\n\n const currentPoint = Vec.add(pagePoint, [0, 0])\n\n shapesToCreate.forEach((shape, i) => {\n const bounds = TVDR.getBounds(shape)\n\n if (i === 0) {\n // For the first shape, offset the current point so\n // that the first shape's center is at the page point\n currentPoint[0] -= bounds.width / 2\n currentPoint[1] -= bounds.height / 2\n }\n\n // Set the shape's point the current point\n shape.point = [...currentPoint]\n\n // Then bump the page current point by this shape's width\n currentPoint[0] += bounds.width\n })\n\n this.createShapes(...shapesToCreate)\n return this\n }\n\n if (this.clipboard) {\n // try to get clipboard data from the scene itself\n this.insertContent(this.clipboard)\n } else {\n // last chance to get the clipboard data, is it in storage?\n getClipboard().then((text) => {\n if (text) getShapeFromHtml(text)\n })\n }\n\n return this\n }\n\n getSvg = async (\n ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes),\n opts = {} as Partial<{ includeFonts: boolean }>\n ): Promise<SVGElement | undefined> => {\n if (ids.length === 0) return\n\n // Embed our custom fonts\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const style = document.createElementNS('http://www.w3.org/2000/svg', 'style')\n\n if (typeof window !== 'undefined') {\n window.focus() // weird but necessary\n }\n\n if (opts.includeFonts) {\n try {\n const { fonts } = await fetch(TelvaApp.assetSrc, { mode: 'no-cors' }).then((d) => d.json())\n\n style.textContent = `\n @font-face {\n font-family: 'Caveat Brush';\n src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.caveat}) format('woff');\n font-weight: 500;\n font-style: normal;\n }\n @font-face {\n font-family: 'Source Code Pro';\n src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.source_code_pro}) format('woff');\n font-weight: 500;\n font-style: normal;\n }\n @font-face {\n font-family: 'Source Sans Pro';\n src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.source_sans_pro}) format('woff');\n font-weight: 500;\n font-style: normal;\n }\n @font-face {\n font-family: 'Crimson Pro';\n src: url(data:application/x-font-woff;charset=utf-8;base64,${fonts.crimson_pro}) format('woff');\n font-weight: 500;\n font-style: normal;\n }\n `\n } catch (e) {\n TVDR.warn('Could not find telva-assets.json file.')\n }\n } else {\n style.textContent = `@import url('https://fonts.googleapis.com/css2?family=Caveat+Brush&family=Source+Code+Pro&family=Source+Sans+Pro&family=Crimson+Pro&display=block');`\n }\n\n defs.append(style)\n svg.append(defs)\n\n // Get the shapes in order\n const shapes = ids\n .map((id) => this.getShape(id, this.currentPageId))\n .sort((a, b) => a.childIndex - b.childIndex)\n\n // Find their common bounding box. Shapes will be positioned relative to this box\n const commonBounds = Utils.getCommonBounds(shapes.map(TVDR.getRotatedBounds))\n\n // A quick routine to get an SVG element for each shape\n const getSvgElementForShape = async (shape: TVShape) => {\n const util = TVDR.getShapeUtil(shape)\n const bounds = util.getBounds(shape)\n const elm = await util.getSvgElement(shape, this.settings.isDarkMode)\n\n if (!elm) return\n\n // If the element is an image, set the asset src as the xlinkhref\n if (shape.type === TVShapeType.Image) {\n elm.setAttribute('href', this.document.assets[shape.assetId].src)\n } else if (shape.type === TVShapeType.Video) {\n elm.setAttribute('href', this.serializeVideo(shape.id))\n }\n\n // Put the element in the correct position relative to the common bounds\n elm.setAttribute(\n 'transform',\n `translate(${(SVG_EXPORT_PADDING + shape.point[0] - commonBounds.minX).toFixed(2)}, ${(\n SVG_EXPORT_PADDING +\n shape.point[1] -\n commonBounds.minY\n ).toFixed(2)}) rotate(${(((shape.rotation || 0) * 180) / Math.PI).toFixed(2)}, ${(\n bounds.width / 2\n ).toFixed(2)}, ${(bounds.height / 2).toFixed(2)})`\n )\n\n return elm\n }\n\n // Assemble the final SVG by iterating through each shape and its children\n for (const shape of shapes) {\n // The shape is a group! Just add the children.\n if (shape.children?.length) {\n // Create a group <g> elm for shape\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n // Get the shape's children as elms and add them to the group\n for (const childId of shape.children) {\n const childShape = this.getShape(childId, this.currentPageId)\n const elm = await getSvgElementForShape(childShape)\n\n if (elm) {\n g.append(elm)\n }\n }\n\n // Add the group elm to the SVG\n svg.append(g)\n continue\n }\n\n // Just add the shape's element to the\n const elm = await getSvgElementForShape(shape)\n\n if (elm) {\n svg.append(elm)\n }\n }\n\n // Resize the elm to the bounding box\n svg.setAttribute(\n 'viewBox',\n [\n 0,\n 0,\n commonBounds.width + SVG_EXPORT_PADDING * 2,\n commonBounds.height + SVG_EXPORT_PADDING * 2,\n ].join(' ')\n )\n\n // Clean up the SVG by removing any hidden elements\n svg.setAttribute('width', (commonBounds.width + SVG_EXPORT_PADDING * 2).toString())\n svg.setAttribute('height', (commonBounds.height + SVG_EXPORT_PADDING * 2).toString())\n\n // Set export background\n const exportBackground: TVExportBackground = this.settings.exportBackground\n const darkBackground = '#212529'\n const lightBackground = 'rgb(248, 249, 250)'\n\n switch (exportBackground) {\n case TVExportBackground.Auto: {\n svg.style.setProperty(\n 'background-color',\n this.settings.isDarkMode ? darkBackground : lightBackground\n )\n break\n }\n case TVExportBackground.Dark: {\n svg.style.setProperty('background-color', darkBackground)\n break\n }\n case TVExportBackground.Light: {\n svg.style.setProperty('background-color', lightBackground)\n break\n }\n case TVExportBackground.Transparent:\n default: {\n svg.style.setProperty('background-color', 'transparent')\n break\n }\n }\n\n svg\n .querySelectorAll('.tv-fill-hitarea, .tv-stroke-hitarea, .tv-binding-indicator')\n .forEach((elm) => elm.remove())\n\n return svg\n }\n\n /**\n * Copy one or more shapes as SVG.\n * @param ids The ids of the shapes to copy.\n * @returns A string containing the JSON.\n */\n copySvg = async (\n ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes)\n ) => {\n if (ids.length === 0) return\n\n const svg = await this.getSvg(ids)\n\n if (!svg) return\n\n const svgString = TVDR.getSvgString(svg, 1)\n\n this.clipboard = this.getContent(ids)\n\n const telvaString = JSON.stringify({\n type: 'telva/clipboard',\n shapes: [],\n assets: [],\n bindings: [],\n ...this.clipboard,\n })\n\n if (navigator.clipboard && window.ClipboardItem) {\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([telvaString], { type: 'text/html' }),\n 'text/plain': new Blob([svgString], { type: 'text/plain' }),\n }),\n ])\n }\n\n return svgString\n }\n\n /**\n * Get the shapes and bindings for the current selection, if any, or else the current page.\n *\n * @param ids The ids of the shapes to get content for.\n */\n getContent = (ids?: string[]) => {\n const page = this.getPage(this.currentPageId)\n\n // If ids is explicitly empty ([]) return\n if (ids && ids.length === 0) return\n\n // If ids was not provided, use the selected ids\n if (!ids) ids = this.selectedIds\n\n // If there are no selected ids, use all the page's shape ids\n if (ids.length === 0) ids = Object.keys(page.shapes)\n\n // If the page was empty, return\n if (ids.length === 0) return\n\n const shapes = ids\n .map((id) => page.shapes[id])\n .flatMap((shape) => [shape, ...(shape.children ?? []).map((childId) => page.shapes[childId])])\n .map(deepCopy)\n\n const idsSet = new Set(shapes.map((s) => s.id))\n\n shapes.forEach((shape) => {\n if (shape.parentId === this.currentPageId) {\n shape.parentId = 'currentPageId'\n }\n })\n\n // If a binding's from and to are included, then include the binding;\n // but if only one shape is included, discard the binding\n const bindings = Object.values(page.bindings)\n .filter((binding) => {\n if (idsSet.has(binding.fromId) || idsSet.has(binding.toId)) {\n return true\n }\n\n if (idsSet.has(binding.fromId)) {\n const shape = shapes.find((s) => s.id === binding.fromId)\n const handles = shape!.handles\n if (handles) {\n Object.values(handles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = undefined\n }\n })\n }\n }\n\n if (idsSet.has(binding.toId)) {\n const shape = shapes.find((s) => s.id === binding.toId)\n const handles = shape!.handles\n if (handles) {\n Object.values(handles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = undefined\n }\n })\n }\n }\n\n return false\n })\n .map(deepCopy)\n\n const assets = [\n ...new Set(\n shapes\n .map((shape) => {\n if (!shape.assetId) return\n return this.document.assets[shape.assetId]\n })\n .filter(Boolean)\n .map(deepCopy)\n ),\n ] as TVAsset[]\n\n return { shapes, bindings, assets }\n }\n\n /**\n * Copy one or more shapes as JSON.\n * @param ids The ids of the shapes to copy.\n * @returns A string containing the JSON.\n */\n copyJson = (ids = this.selectedIds) => {\n const content = this.getContent(ids)\n\n if (content) {\n TVDR.copyStringToClipboard(JSON.stringify(content))\n }\n\n return this\n }\n\n /**\n * Export one or more shapes as JSON.\n * @param ids The ids of the shapes to copy from the current page.\n * @returns A string containing the JSON.\n */\n exportJson = (ids = this.selectedIds) => {\n const content = this.getContent(ids)\n\n if (content) {\n const blob = new Blob([JSON.stringify(content)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `export.json`\n link.click()\n }\n\n return this\n }\n\n /**\n * Insert content.\n *\n * @param content The content to insert.\n * @param content.shapes An array of TVShape objects.\n * @param content.bindings (optional) An array of TVBinding objects.\n * @param content.assets (optional) An array of TVAsset objects.\n * @param opts (optional) An options object\n * @param opts.point (optional) A point at which to paste the content.\n * @param opts.select (optional) When true, the inserted shapes will be selected. Defaults to false.\n * @param opts.overwrite (optional) When true, the inserted shapes and bindings will overwrite any existing shapes and bindings. Defaults to false.\n */\n insertContent = (\n content: { shapes: TVShape[]; bindings?: TVBinding[]; assets?: TVAsset[] },\n opts = {} as { point?: number[]; select?: boolean; overwrite?: boolean }\n ) => {\n return this.setState(Commands.insertContent(this, content, opts), 'insert_content')\n }\n\n /**\n * Get an image of the selected shapes.\n *\n * @param format The format to export the image as.\n * @param opts (optional) An object containing options for the image.\n * @param opts.ids (optional) The ids of the shapes (on the current page) to get an image for.\n * @param opts.scale (optional) The id of the page from which to get an image.\n * @param opts.quality (optional) The quality (between 0 and 1) for the image if lossy format.\n */\n getImage = async (\n format: Exclude<TVExportType, TVExportType.JSON> = TVExportType.PNG,\n opts = {} as Partial<{\n ids: string[]\n scale: number\n quality: number\n transparentBackground: boolean\n }>\n ): Promise<Blob | undefined> => {\n const { ids = this.selectedIds.length ? this.selectedIds : Object.keys(this.page.shapes) } =\n opts\n\n const svg = await this.getSvg(ids, {\n includeFonts: format !== TVExportType.SVG,\n })\n\n if (!svg) return\n\n if (format === TVExportType.SVG) {\n const svgString = TVDR.getSvgString(svg, 1)\n const blob = new Blob([svgString], { type: 'image/svg+xml' })\n return blob\n }\n\n const imageBlob = await TVDR.getImageForSvg(svg, format, opts)\n\n if (!imageBlob) return\n\n return imageBlob\n }\n\n /**\n * Copy an image of the selected shapes.\n *\n * @param format The format to export the image as.\n * @param opts (optional) An object containing options for the image.\n * @param opts.ids (optional) The ids of the shapes (on the current page) to get an image for.\n * @param opts.scale (optional) The id of the page from which to get an image.\n * @param opts.quality (optional) The quality (between 0 and 1) for the image if lossy format.\n */\n copyImage = async (\n format: TVExportType.PNG | TVExportType.SVG = TVExportType.PNG,\n opts = {} as Partial<{\n ids: string[]\n scale: number\n quality: number\n transparentBackground: boolean\n }>\n ) => {\n if (format === TVExportType.SVG) {\n this.copySvg(opts.ids)\n return\n }\n\n if (!(navigator.clipboard && window.ClipboardItem)) {\n console.warn('Sorry, your browser does not support copying images.')\n return\n }\n\n const blob = await this.getImage(format, opts)\n\n if (!blob) return\n\n navigator.clipboard.write([\n new ClipboardItem({\n [blob.type]: blob,\n }),\n ])\n }\n\n exportImage = async (\n format: Exclude<TVExportType, TVExportType.JSON> = TVExportType.PNG,\n opts = {} as Partial<{\n ids: string[]\n pageId: string\n scale: number\n quality: number\n }>\n ) => {\n const { pageId = this.currentPageId } = opts\n\n const blob = await this.getImage(format, opts)\n\n if (!blob) return\n\n const name = this.document.pages[pageId].name ?? 'export'\n\n if (this.callbacks.onExport) {\n this.callbacks.onExport(this, {\n name,\n type: format,\n blob,\n })\n } else {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `${name}.${format}`\n link.click()\n }\n }\n\n /* -------------------------------------------------- */\n /* Convert to Image */\n /* -------------------------------------------------- */\n\n /**\n * Convert the selected ReactComponent shapes into static Image shapes.\n * This takes a snapshot of the live component and swaps it out on the canvas.\n */\n convertToImage = async () => {\n const selectedIds = this.selectedIds\n if (!selectedIds.length) return\n\n const newShapes: TVShape[] = []\n const shapesToDelete: string[] = []\n\n for (const id of selectedIds) {\n const shape = this.getShape(id)\n if (shape.type !== TVShapeType.ReactComponent) continue\n\n const util = TVDR.getShapeUtil(shape) as any\n if (!util.getSvgElement) continue\n\n // Use the utility's getSvgElement which handles canvas/html2canvas capturing\n // We pass isDarkMode=false since we just want the raw component look\n const svgElm = await util.getSvgElement(shape, this.settings.isDarkMode)\n if (!svgElm) continue\n\n const href = svgElm.getAttribute('href')\n if (!href) continue\n\n // Create a new image shape with the dataUrl\n const imageShape = TVDR.getShapeUtil(TVShapeType.Image).create({\n id: Utils.uniqueId(),\n parentId: shape.parentId,\n childIndex: shape.childIndex,\n point: [...shape.point],\n size: [...(shape as any).size],\n style: { ...shape.style },\n assetId: 'asset-' + Utils.uniqueId(),\n })\n\n // Add the asset to the document\n this.patchState(\n {\n document: {\n assets: {\n [`${imageShape.assetId}`]: {\n id: imageShape.assetId,\n type: 'image',\n src: href,\n size: (shape as any).size,\n fileName: 'component-snapshot.png',\n } as any,\n },\n },\n },\n 'add_asset'\n )\n\n newShapes.push(imageShape)\n shapesToDelete.push(shape.id)\n }\n\n if (newShapes.length > 0) {\n this.createShapes(...newShapes)\n this.delete(shapesToDelete)\n this.select(...newShapes.map((s) => s.id))\n }\n }\n\n /* -------------------------------------------------- */\n /* Camera */\n /* -------------------------------------------------- */\n\n /**\n * Set the camera to a specific point and zoom.\n * @param point The camera point (top left of the viewport).\n * @param zoom The zoom level.\n * @param reason Why did the camera change?\n */\n setCamera = (point: number[], zoom: number, reason: string): this => {\n this.updateViewport(point, zoom)\n this.patchState(\n {\n document: {\n pageStates: {\n [this.currentPageId]: { camera: { point, zoom } },\n },\n },\n },\n reason\n )\n return this\n }\n\n /**\n * Reset the camera to the default position\n */\n resetCamera = (): this => {\n return this.setCamera(this.centerPoint, 1, `reset_camera`)\n }\n\n /**\n * Pan the camera\n * @param delta\n */\n pan = (delta: number[]): this => {\n const { camera } = this.pageState\n return this.setCamera(Vec.toFixed(Vec.sub(camera.point, delta)), camera.zoom, `panned`)\n }\n\n /**\n * Pinch to a new zoom level, possibly together with a pan.\n * @param point The current point under the cursor.\n * @param delta The movement delta.\n * @param zoomDelta The zoom detal\n */\n pinchZoom = (point: number[], delta: number[], zoom: number): this => {\n const { camera } = this.pageState\n const nextPoint = Vec.sub(camera.point, Vec.div(delta, camera.zoom))\n const nextZoom = zoom\n const p0 = Vec.sub(Vec.div(point, camera.zoom), nextPoint)\n const p1 = Vec.sub(Vec.div(point, nextZoom), nextPoint)\n return this.setCamera(\n Vec.toFixed(Vec.add(nextPoint, Vec.sub(p1, p0))),\n nextZoom,\n `pinch_zoomed`\n )\n }\n\n /**\n * Zoom to a new zoom level, keeping the point under the cursor in the same position\n * @param next The new zoom level.\n * @param center The point to zoom towards (defaults to screen center).\n */\n zoomTo = (next: number, center = this.centerPoint): this => {\n const { zoom, point } = this.camera\n const p0 = Vec.sub(Vec.div(center, zoom), point)\n const p1 = Vec.sub(Vec.div(center, next), point)\n return this.setCamera(Vec.toFixed(Vec.add(point, Vec.sub(p1, p0))), next, `zoomed_camera`)\n }\n\n /**\n * Zoom out by 25%\n */\n zoomIn = (): this => {\n const i = Math.round((this.camera.zoom * 100) / 25)\n const nextZoom = TVDR.getCameraZoom((i + 1) * 0.25)\n return this.zoomTo(nextZoom)\n }\n\n /**\n * Zoom in by 25%.\n */\n zoomOut = (): this => {\n const i = Math.round((this.camera.zoom * 100) / 25)\n const nextZoom = TVDR.getCameraZoom((i - 1) * 0.25)\n return this.zoomTo(nextZoom)\n }\n\n /**\n * Zoom to fit the page's shapes.\n */\n zoomToFit = (): this => {\n const {\n shapes,\n pageState: { camera },\n } = this\n if (shapes.length === 0) return this\n const { rendererBounds } = this\n const commonBounds = Utils.getCommonBounds(shapes.map(TVDR.getBounds))\n let zoom = TVDR.getCameraZoom(\n Math.min(\n (rendererBounds.width - FIT_TO_SCREEN_PADDING) / commonBounds.width,\n (rendererBounds.height - FIT_TO_SCREEN_PADDING) / commonBounds.height\n )\n )\n zoom = camera.zoom === zoom || camera.zoom < 1 ? Math.min(1, zoom) : zoom\n const mx = (rendererBounds.width - commonBounds.width * zoom) / 2 / zoom\n const my = (rendererBounds.height - commonBounds.height * zoom) / 2 / zoom\n return this.setCamera(\n Vec.toFixed(Vec.sub([mx, my], [commonBounds.minX, commonBounds.minY])),\n zoom,\n `zoomed_to_fit`\n )\n }\n\n /**\n * Zoom to the selected shapes.\n */\n zoomToSelection = (): this => {\n if (this.selectedIds.length === 0) return this\n\n const { rendererBounds } = this\n const selectedBounds = TVDR.getSelectedBounds(this.state)\n\n let zoom = TVDR.getCameraZoom(\n Math.min(\n (rendererBounds.width - FIT_TO_SCREEN_PADDING) / selectedBounds.width,\n (rendererBounds.height - FIT_TO_SCREEN_PADDING) / selectedBounds.height\n )\n )\n\n zoom = this.camera.zoom === zoom || this.camera.zoom < 1 ? Math.min(1, zoom) : zoom\n\n const mx = (rendererBounds.width - selectedBounds.width * zoom) / 2 / zoom\n const my = (rendererBounds.height - selectedBounds.height * zoom) / 2 / zoom\n\n return this.setCamera(\n Vec.toFixed(Vec.sub([mx, my], [selectedBounds.minX, selectedBounds.minY])),\n zoom,\n `zoomed_to_selection`\n )\n }\n\n /**\n * Zoom back to content when the canvas is empty.\n */\n zoomToContent = (): this => {\n const shapes = this.shapes\n const pageState = this.pageState\n\n if (shapes.length === 0) return this\n\n const { rendererBounds } = this\n const { zoom } = pageState.camera\n const commonBounds = Utils.getCommonBounds(shapes.map(TVDR.getBounds))\n\n const mx = (rendererBounds.width - commonBounds.width * zoom) / 2 / zoom\n const my = (rendererBounds.height - commonBounds.height * zoom) / 2 / zoom\n\n return this.setCamera(\n Vec.toFixed(Vec.sub([mx, my], [commonBounds.minX, commonBounds.minY])),\n this.camera.zoom,\n `zoomed_to_content`\n )\n }\n\n /**\n * Zoom the camera to 100%.\n */\n resetZoom = (): this => {\n return this.zoomTo(1)\n }\n\n /**\n * Zoom the camera by a certain delta.\n * @param delta The zoom delta.\n * @param center The point to zoom toward.\n */\n zoomBy = Utils.throttle((delta: number, center?: number[]): this => {\n const { zoom } = this.camera\n const nextZoom = TVDR.getCameraZoom(zoom - delta * zoom)\n return this.zoomTo(nextZoom, center)\n }, 16)\n\n /* -------------------------------------------------- */\n /* Selection */\n /* -------------------------------------------------- */\n\n /**\n * Clear the selection history (undo/redo stack for selection).\n */\n private clearSelectHistory = (): this => {\n this.selectHistory.pointer = 0\n this.selectHistory.stack = [this.selectedIds]\n return this\n }\n\n /**\n * Adds a selection to the selection history (undo/redo stack for selection).\n */\n private addToSelectHistory = (ids: string[]): this => {\n if (this.selectHistory.pointer < this.selectHistory.stack.length) {\n this.selectHistory.stack = this.selectHistory.stack.slice(0, this.selectHistory.pointer + 1)\n }\n this.selectHistory.pointer++\n this.selectHistory.stack.push(ids)\n return this\n }\n\n /**\n * Set the current selection.\n * @param ids The ids to select\n * @param push Whether to add the ids to the current selection instead.\n */\n private setSelectedIds = (ids: string[], push = false): this => {\n const nextIds = push ? [...this.pageState.selectedIds, ...ids] : [...ids]\n\n return this.patchState(\n {\n appState: {\n activeTool: 'select',\n },\n document: {\n pageStates: {\n [this.currentPageId]: {\n selectedIds: nextIds,\n },\n },\n },\n },\n `selected`\n )\n }\n\n /**\n * Undo the most recent selection.\n */\n undoSelect = (): this => {\n if (this.selectHistory.pointer > 0) {\n this.selectHistory.pointer--\n this.setSelectedIds(this.selectHistory.stack[this.selectHistory.pointer])\n }\n return this\n }\n\n /**\n * Redo the previous selection.\n */\n redoSelect = (): this => {\n if (this.selectHistory.pointer < this.selectHistory.stack.length - 1) {\n this.selectHistory.pointer++\n this.setSelectedIds(this.selectHistory.stack[this.selectHistory.pointer])\n }\n return this\n }\n\n /**\n * Select one or more shapes.\n * @param ids The shape ids to select.\n */\n select = (...ids: string[]): this => {\n ids.forEach((id) => {\n if (!this.page.shapes[id]) {\n throw Error(`That shape does not exist on page ${this.currentPageId}`)\n }\n })\n this.setSelectedIds(ids)\n this.addToSelectHistory(ids)\n return this\n }\n\n /**\n * Select all shapes on the page.\n */\n selectAll = (pageId = this.currentPageId): this => {\n if (this.session) return this\n\n // Select only shapes that are the direct child of the page\n this.setSelectedIds(\n Object.values(this.document.pages[pageId].shapes)\n .filter((shape) => shape.parentId === pageId)\n .map((shape) => shape.id)\n )\n\n this.addToSelectHistory(this.selectedIds)\n\n this.selectTool('select')\n\n return this\n }\n\n /**\n * Deselect any selected shapes.\n */\n selectNone = (): this => {\n this.setSelectedIds([])\n this.addToSelectHistory(this.selectedIds)\n return this\n }\n\n /* -------------------------------------------------- */\n /* Sessions p */\n /* -------------------------------------------------- */\n\n /**\n * Start a new session.\n * @param type The session type\n * @param args arguments of the session's start method.\n */\n startSession = <T extends SessionType>(type: T, ...args: SessionArgsOfType<T>): this => {\n if (this.readOnly && type !== SessionType.Brush) return this\n\n if (this.session) {\n TVDR.warn(`Already in a session! (${this.session.constructor.name})`)\n this.cancelSession()\n }\n\n const Session = getSession(type) as any\n this.session = new Session(this, ...args)\n\n const result = this.session!.start()\n\n if (result) {\n this.patchState(result, `session:start_${this.session!.constructor.name}`)\n }\n\n this.callbacks.onSessionStart?.(this, this.session!.constructor.name)\n\n return this\n // return this.setStatus(this.session.status)\n }\n\n /**\n * updateSession.\n * @param args The arguments of the current session's update method.\n */\n updateSession = (): this => {\n const { session } = this\n if (!session) return this\n\n // @ts-ignore\n const patch = session.update()\n if (!patch) return this\n return this.patchState(patch, `session:${session?.constructor.name}`)\n }\n\n /**\n * Cancel the current session.\n * @param args The arguments of the current session's cancel method.\n */\n cancelSession = (): this => {\n const { session } = this\n if (!session) return this\n this.session = undefined\n\n const result = session.cancel()\n\n if (result) {\n this.patchState(result, `session:cancel:${session.constructor.name}`)\n }\n\n this.setEditingId()\n\n this.callbacks.onSessionEnd?.(this, session.constructor.name)\n\n return this\n }\n\n /**\n * Complete the current session.\n * @param args The arguments of the current session's complete method.\n */\n completeSession = (): this => {\n const { session } = this\n\n if (!session) return this\n\n this.session = undefined\n const result = session.complete()\n\n if (result === undefined) {\n this.isCreating = false\n\n this.patchState(\n {\n appState: {\n status: TVStatus.Idle,\n },\n document: {\n pageStates: {\n [this.currentPageId]: {\n editingId: undefined,\n bindingId: undefined,\n hoveredId: undefined,\n },\n },\n },\n },\n `session:complete:${session.constructor.name}`\n )\n } else if ('after' in result) {\n // Session ended with a command\n\n if (this.isCreating) {\n // We're currently creating a shape. Override the command's\n // before state so that when we undo the command, we remove\n // the shape we just created.\n\n result.before = {\n appState: {\n ...result.before.appState,\n status: TVStatus.Idle,\n },\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: Object.fromEntries(this.selectedIds.map((id) => [id, undefined])),\n },\n },\n pageStates: {\n [this.currentPageId]: {\n selectedIds: [],\n editingId: null,\n bindingId: null,\n hoveredId: null,\n },\n },\n },\n }\n\n if (this.appState.isToolLocked) {\n const pageState = result.after?.document?.pageStates?.[this.currentPageId] || {}\n pageState.selectedIds = []\n }\n\n this.isCreating = false\n }\n\n result.after.appState = {\n ...result.after.appState,\n status: TVStatus.Idle,\n }\n\n result.after.document = {\n ...result.after.document,\n pageStates: {\n ...result.after.document?.pageStates,\n [this.currentPageId]: {\n ...(result.after.document?.pageStates || {})[this.currentPageId],\n editingId: null,\n },\n },\n }\n\n this.setState(result, `session:complete:${session.constructor.name}`)\n } else {\n this.patchState(\n {\n ...result,\n appState: {\n ...result.appState,\n status: TVStatus.Idle,\n },\n document: {\n ...result.document,\n pageStates: {\n [this.currentPageId]: {\n ...result.document?.pageStates?.[this.currentPageId],\n editingId: null,\n },\n },\n },\n },\n `session:complete:${session.constructor.name}`\n )\n }\n\n this.callbacks.onSessionEnd?.(this, session.constructor.name)\n\n return this\n }\n\n /* -------------------------------------------------- */\n /* Shape Functions */\n /* -------------------------------------------------- */\n\n /**\n * Manually create shapes on the page.\n * @param shapes An array of shape partials, containing the initial props for the shapes.\n * @command\n */\n createShapes = (...shapes: ({ id: string; type: TVShapeType } & Partial<TVShape>)[]): this => {\n if (shapes.length === 0) return this\n\n return this.create(\n shapes.map((shape) => {\n return TVDR.getShapeUtil(shape.type).create({\n parentId: this.currentPageId,\n ...shape,\n })\n })\n )\n }\n\n /**\n * Manually update a set of shapes.\n * @param shapes An array of shape partials, containing the changes to be made to each shape.\n * @command\n */\n updateShapes = (...shapes: ({ id: string } & Partial<TVShape>)[]): this => {\n const pageShapes = this.document.pages[this.currentPageId].shapes\n const shapesToUpdate = shapes.filter((shape) => pageShapes[shape.id])\n if (shapesToUpdate.length === 0) return this\n return this.setState(\n Commands.updateShapes(this, shapesToUpdate, this.currentPageId),\n 'updated_shapes'\n )\n }\n\n createTextShapeAtPoint(point: number[], id?: string, patch?: boolean): this {\n const {\n shapes,\n appState: { currentPageId, currentStyle },\n } = this\n\n const childIndex =\n shapes.length === 0\n ? 1\n : shapes\n .filter((shape) => shape.parentId === currentPageId)\n .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n\n const Text = shapeUtils[TVShapeType.Text]\n\n const newShape = Text.create({\n id: id || Utils.uniqueId(),\n parentId: currentPageId,\n childIndex,\n point,\n style: { ...currentStyle },\n })\n\n const bounds = Text.getBounds(newShape)\n newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n\n if (patch) {\n this.patchCreate([TVDR.getShapeUtil(newShape.type).create(newShape)])\n } else {\n this.createShapes(newShape)\n }\n\n this.setEditingId(newShape.id, true)\n\n return this\n }\n\n getImageOrVideoShapeAtPoint(\n id: string,\n type: TVShapeType.Image | TVShapeType.Video,\n point: number[],\n size: number[],\n assetId: string\n ) {\n const {\n shapes,\n appState: { currentPageId, currentStyle },\n } = this\n\n const childIndex =\n shapes.length === 0\n ? 1\n : shapes\n .filter((shape) => shape.parentId === currentPageId)\n .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n\n const Shape = shapeUtils[type]\n\n // Ensure that the pasted shape fits inside of the current viewport\n\n if (size[0] > this.viewport.width) {\n const r = size[1] / size[0]\n size[0] = this.viewport.width - (FIT_TO_SCREEN_PADDING / this.camera.zoom) * 2\n size[1] = size[0] * r\n if (size[1] < 32 || size[1] < 32) {\n size[1] = 32\n size[0] = size[1] / r\n }\n } else if (size[1] > this.viewport.height) {\n const r = size[0] / size[1]\n size[1] = this.viewport.height - (FIT_TO_SCREEN_PADDING / this.camera.zoom) * 2\n size[0] = size[1] * r\n if (size[1] < 32 || size[1] < 32) {\n size[0] = 32\n size[1] = size[0] / r\n }\n }\n\n const newShape = Shape.create({\n id,\n parentId: currentPageId,\n childIndex,\n point,\n size,\n style: { ...currentStyle },\n assetId,\n })\n\n return newShape\n }\n\n /**\n * Create one or more shapes.\n * @param shapes An array of shapes.\n * @command\n */\n create = (shapes: TVShape[] = [], bindings: TVBinding[] = []): this => {\n if (shapes.length === 0) return this\n return this.setState(Commands.createShapes(this, shapes, bindings))\n }\n\n /**\n * Patch in a new set of shapes\n * @param shapes\n * @param bindings\n */\n patchCreate = (shapes: TVShape[] = [], bindings: TVBinding[] = []): this => {\n if (shapes.length === 0) return this\n return this.patchState(Commands.createShapes(this, shapes, bindings).after)\n }\n\n /**\n * Delete one or more shapes.\n * @param ids The ids of the shapes to delete.\n * @command\n */\n delete = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n\n if (this.session) return this\n const drawCommand = Commands.deleteShapes(this, ids)\n\n if (\n this.callbacks.onAssetDelete &&\n drawCommand.before.document?.assets &&\n drawCommand.after.document?.assets\n ) {\n const beforeAssetIds = Object.keys(drawCommand.before.document.assets).filter(\n (k) => !!drawCommand.before.document!.assets![k]\n )\n const afterAssetIds = Object.keys(drawCommand.after.document.assets).filter(\n (k) => !!drawCommand.after.document!.assets![k]\n )\n\n const intersection = beforeAssetIds.filter((x) => !afterAssetIds.includes(x))\n intersection.forEach((id) => this.callbacks.onAssetDelete!(this, id))\n }\n\n return this.setState(drawCommand)\n }\n\n /**\n * Delete all shapes on the page.\n */\n deleteAll = (): this => {\n this.selectAll()\n this.delete()\n return this\n }\n\n /**\n * Change the style for one or more shapes.\n * @param style A style partial to apply to the shapes.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n style = (style: Partial<ShapeStyles>, ids = this.selectedIds): this => {\n return this.setState(Commands.styleShapes(this, ids, style))\n }\n\n /**\n * Align one or more shapes.\n * @param direction Whether to align horizontally or vertically.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n align = (type: AlignType, ids = this.selectedIds): this => {\n if (ids.length < 2) return this\n return this.setState(Commands.alignShapes(this, ids, type))\n }\n\n /**\n * Distribute one or more shapes.\n * @param direction Whether to distribute horizontally or vertically..\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n distribute = (direction: DistributeType, ids = this.selectedIds): this => {\n if (ids.length < 3) return this\n return this.setState(Commands.distributeShapes(this, ids, direction))\n }\n\n /**\n * Stretch one or more shapes to their common bounds.\n * @param direction Whether to stretch horizontally or vertically.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n stretch = (direction: StretchType, ids = this.selectedIds): this => {\n if (ids.length < 2) return this\n return this.setState(Commands.stretchShapes(this, ids, direction))\n }\n\n /**\n * Flip one or more shapes horizontally.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n flipHorizontal = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.flipShapes(this, ids, FlipType.Horizontal))\n }\n\n /**\n * Flip one or more shapes vertically.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n flipVertical = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.flipShapes(this, ids, FlipType.Vertical))\n }\n\n /**\n * Move one or more shapes to a new page. Will also break or move bindings.\n * @param toPageId The id of the page to move the shapes to.\n * @param fromPageId The id of the page to move the shapes from (defaults to current page).\n * @param ids The ids of the shapes to move (defaults to selection).\n */\n moveToPage = (\n toPageId: string,\n fromPageId = this.currentPageId,\n ids = this.selectedIds\n ): this => {\n if (ids.length === 0) return this\n const { rendererBounds } = this\n this.setState(Commands.moveShapesToPage(this, ids, rendererBounds, fromPageId, toPageId))\n return this\n }\n\n /**\n * Move one or more shapes to the back of the page.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n moveToBack = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.reorderShapes(this, ids, MoveType.ToBack))\n }\n\n /**\n * Move one or more shapes backward on of the page.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n moveBackward = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.reorderShapes(this, ids, MoveType.Backward))\n }\n\n /**\n * Move one or more shapes forward on the page.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n moveForward = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.reorderShapes(this, ids, MoveType.Forward))\n }\n\n /**\n * Move one or more shapes to the front of the page.\n * @param ids The ids of the shapes to change (defaults to selection).\n */\n moveToFront = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.reorderShapes(this, ids, MoveType.ToFront))\n }\n\n /**\n * Nudge one or more shapes in a direction.\n * @param delta The direction to nudge the shapes.\n * @param isMajor Whether this is a major (i.e. shift) nudge.\n * @param ids The ids to change (defaults to selection).\n */\n nudge = (delta: number[], isMajor = false, ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n const size = isMajor\n ? this.settings.showGrid\n ? this.currentGrid * 4\n : 10\n : this.settings.showGrid\n ? this.currentGrid\n : 1\n\n return this.setState(Commands.translateShapes(this, ids, Vec.mul(delta, size)))\n }\n\n /**\n * Duplicate one or more shapes.\n * @param ids The ids to duplicate (defaults to selection).\n */\n duplicate = (ids = this.selectedIds, point?: number[]): this => {\n if (this.readOnly) return this\n if (ids.length === 0) return this\n return this.setState(Commands.duplicateShapes(this, ids, point))\n }\n\n /**\n * Reset the bounds for one or more shapes. Usually when the\n * bounding box of a shape is double-clicked. Different shapes may\n * handle this differently.\n * @param ids The ids to change (defaults to selection).\n */\n resetBounds = (ids = this.selectedIds): this => {\n const command = Commands.resetBounds(this, ids, this.currentPageId)\n return this.setState(Commands.resetBounds(this, ids, this.currentPageId), command.id)\n }\n\n /**\n * Toggle the hidden property of one or more shapes.\n * @param ids The ids to change (defaults to selection).\n */\n toggleHidden = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.toggleShapeProp(this, ids, 'isHidden'))\n }\n\n /**\n * Toggle the locked property of one or more shapes.\n * @param ids The ids to change (defaults to selection).\n */\n toggleLocked = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.toggleShapeProp(this, ids, 'isLocked'))\n }\n\n /**\n * Toggle the fixed-aspect-ratio property of one or more shapes.\n * @param ids The ids to change (defaults to selection).\n */\n toggleAspectRatioLocked = (ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n return this.setState(Commands.toggleShapeProp(this, ids, 'isAspectRatioLocked'))\n }\n\n /**\n * Toggle the decoration at a handle of one or more shapes.\n * @param handleId The handle to toggle.\n * @param ids The ids of the shapes to toggle the decoration on.\n */\n toggleDecoration = (handleId: string, ids = this.selectedIds): this => {\n if (ids.length === 0 || !(handleId === 'start' || handleId === 'end')) return this\n return this.setState(Commands.toggleShapesDecoration(this, ids, handleId))\n }\n\n /**\n * Set the props of one or more shapes\n * @param props The props to set on the shapes.\n * @param ids The ids of the shapes to set props on.\n */\n setShapeProps = <T extends TVShape>(props: Partial<T>, ids = this.selectedIds) => {\n return this.setState(Commands.setShapesProps(this, ids, props))\n }\n\n /**\n * Rotate one or more shapes by a delta.\n * @param delta The delta in radians.\n * @param ids The ids to rotate (defaults to selection).\n */\n rotate = (delta = Math.PI * -0.5, ids = this.selectedIds): this => {\n if (ids.length === 0) return this\n const change = Commands.rotateShapes(this, ids, delta)\n if (!change) return this\n return this.setState(change)\n }\n\n /**\n * Group the selected shapes.\n * @param ids The ids to group (defaults to selection).\n * @param groupId The new group's id.\n */\n group = (\n ids = this.selectedIds,\n groupId = Utils.uniqueId(),\n pageId = this.currentPageId\n ): this => {\n if (this.readOnly) return this\n\n if (ids.length === 1 && this.getShape(ids[0], pageId).type === TVShapeType.Group) {\n return this.ungroup(ids, pageId)\n }\n\n if (ids.length < 2) return this\n\n const command = Commands.groupShapes(this, ids, groupId, pageId)\n if (!command) return this\n return this.setState(command)\n }\n\n /**\n * Ungroup the selected groups.\n * @todo\n */\n ungroup = (ids = this.selectedIds, pageId = this.currentPageId): this => {\n if (this.readOnly) return this\n\n const groups = ids\n .map((id) => this.getShape(id, pageId))\n .filter((shape) => shape.type === TVShapeType.Group)\n\n if (groups.length === 0) return this\n\n const command = Commands.ungroupShapes(this, ids, groups as GroupShape[], pageId)\n\n if (!command) {\n return this\n }\n\n return this.setState(command)\n }\n\n /**\n * Cancel the current session.\n */\n cancel = (): this => {\n this.currentTool.onCancel?.()\n\n return this\n }\n\n addMediaFromFiles = async (files: File[], point = this.centerPoint) => {\n this.setIsLoading(true)\n\n // Rather than creating each shape individually (which will produce undo / redo entries\n // for each shape), create an array of all the shapes that we'll need to create. We'll\n // iterate through these at the bottom of the function to set their points, then create\n // them through a single call to `createShapes`.\n\n const shapesToCreate: TVShape[] = []\n\n const pagePoint = this.getPagePoint(point)\n\n for (const file of files) {\n const id = Utils.uniqueId()\n const extension = file.name.match(/\\.[0-9a-z]+$/i)\n\n if (!extension) throw Error('No extension')\n\n const isImage = IMAGE_EXTENSIONS.includes(extension[0].toLowerCase())\n const isVideo = VIDEO_EXTENSIONS.includes(extension[0].toLowerCase())\n\n if (!(isImage || isVideo)) throw Error('Wrong extension')\n\n const shapeType = isImage ? TVShapeType.Image : TVShapeType.Video\n const assetType = isImage ? TVAssetType.Image : TVAssetType.Video\n\n let src: string | ArrayBuffer | null\n\n try {\n if (this.callbacks.onAssetCreate) {\n const result = await this.callbacks.onAssetCreate(this, file, id)\n\n if (!result) throw Error('Asset creation callback returned false')\n\n src = result\n } else {\n src = await fileToBase64(file)\n }\n\n if (typeof src === 'string') {\n let size = [0, 0]\n\n if (isImage) {\n // attempt to get actual svg size from viewBox attribute as\n if (extension[0] == '.svg') {\n let viewBox: string[]\n const svgString = await fileToText(file)\n const viewBoxAttribute = this.getViewboxFromSVG(svgString)\n\n if (viewBoxAttribute) {\n viewBox = viewBoxAttribute.split(' ')\n size[0] = parseFloat(viewBox[2])\n size[1] = parseFloat(viewBox[3])\n }\n }\n if (Vec.isEqual(size, [0, 0])) {\n size = await getImageSizeFromSrc(src)\n }\n } else {\n size = await getVideoSizeFromSrc(src)\n }\n\n const match = Object.values(this.document.assets).find(\n (asset) => asset.type === assetType && asset.src === src\n )\n\n let assetId: string\n\n if (!match) {\n assetId = id\n\n const asset = {\n id: assetId,\n type: assetType,\n name: file.name,\n src,\n size,\n }\n\n this.patchState({\n document: {\n assets: {\n [assetId]: asset,\n },\n },\n })\n } else {\n assetId = match.id\n }\n\n shapesToCreate.push(this.getImageOrVideoShapeAtPoint(id, shapeType, point, size, assetId))\n }\n } catch (error) {\n // Even if one shape errors, keep going (we might have had other shapes that didn't error)\n console.warn(error)\n }\n }\n\n if (shapesToCreate.length) {\n const currentPoint = Vec.add(pagePoint, [0, 0])\n\n shapesToCreate.forEach((shape, i) => {\n const bounds = TVDR.getBounds(shape)\n\n if (i === 0) {\n // For the first shape, offset the current point so\n // that the first shape's center is at the page point\n currentPoint[0] -= bounds.width / 2\n currentPoint[1] -= bounds.height / 2\n }\n\n // Set the shape's point the current point\n shape.point = [...currentPoint]\n\n // Then bump the page current point by this shape's width\n currentPoint[0] += bounds.width\n })\n\n const commonBounds = Utils.getCommonBounds(shapesToCreate.map(TVDR.getBounds))\n\n this.createShapes(...shapesToCreate)\n\n // Are the common bounds too big for the viewport?\n if (!Utils.boundsContain(this.viewport, commonBounds)) {\n this.zoomToSelection()\n if (this.zoom > 1) {\n this.resetZoom()\n }\n }\n }\n\n this.setIsLoading(false)\n return this\n }\n\n private getViewboxFromSVG = (svgStr: string | ArrayBuffer | null) => {\n const viewBoxRegex = /.*?viewBox=[\"'](-?[\\d.]+[, ]+-?[\\d.]+[, ][\\d.]+[, ][\\d.]+)[\"']/\n\n if (typeof svgStr === 'string') {\n const matches = svgStr.match(viewBoxRegex)\n return matches && matches.length >= 2 ? matches[1] : null\n }\n\n this.setIsLoading(false)\n\n return null\n }\n\n /* -------------------------------------------------- */\n /* Event Handlers */\n /* -------------------------------------------------- */\n\n /* ----------------- Keyboard Events ---------------- */\n\n onKeyDown: TLKeyboardEventHandler = (key, info, e) => {\n switch (e.key) {\n case '/': {\n if (this.status === 'idle' && !this.pageState.editingId) {\n const { shiftKey, metaKey, altKey, ctrlKey, spaceKey } = this\n\n this.onPointerDown(\n {\n target: 'canvas',\n pointerId: 0,\n origin: info.point,\n point: info.point,\n delta: [0, 0],\n pressure: 0.5,\n shiftKey,\n ctrlKey,\n metaKey,\n altKey,\n spaceKey,\n },\n {\n shiftKey,\n altKey,\n ctrlKey,\n pointerId: 0,\n clientX: info.point[0],\n clientY: info.point[1],\n } as unknown as React.PointerEvent<HTMLDivElement>\n )\n }\n break\n }\n case 'Escape': {\n this.cancel()\n break\n }\n case 'Meta': {\n this.metaKey = true\n break\n }\n case 'Alt': {\n this.altKey = true\n break\n }\n case 'Control': {\n this.ctrlKey = true\n break\n }\n case ' ': {\n this.isForcePanning = true\n this.spaceKey = true\n break\n }\n }\n\n this.currentTool.onKeyDown?.(key, info, e)\n\n return this\n }\n\n onKeyUp: TLKeyboardEventHandler = (key, info, e) => {\n if (!info) return\n\n switch (e.key) {\n case '/': {\n const { currentPoint, shiftKey, metaKey, altKey, ctrlKey, spaceKey } = this\n\n this.onPointerUp(\n {\n target: 'canvas',\n pointerId: 0,\n origin: currentPoint,\n point: currentPoint,\n delta: [0, 0],\n pressure: 0.5,\n shiftKey,\n ctrlKey,\n metaKey,\n altKey,\n spaceKey,\n },\n {\n shiftKey,\n altKey,\n ctrlKey,\n pointerId: 0,\n clientX: currentPoint[0],\n clientY: currentPoint[1],\n } as unknown as React.PointerEvent<HTMLDivElement>\n )\n break\n }\n case 'Meta': {\n this.metaKey = false\n break\n }\n case 'Alt': {\n this.altKey = false\n break\n }\n case 'Control': {\n this.ctrlKey = false\n break\n }\n case ' ': {\n this.isForcePanning = false\n this.spaceKey = false\n break\n }\n }\n\n this.currentTool.onKeyUp?.(key, info, e)\n }\n\n /** Force bounding boxes to reset when the document loads. */\n refreshBoundingBoxes = () => {\n // force a change to every text shape\n const force = this.shapes.map((shape) => {\n return [\n shape.id,\n {\n point: [...shape.point],\n ...('label' in shape && { label: '' }),\n },\n ]\n })\n\n const restore = this.shapes.map((shape) => {\n return [\n shape.id,\n {\n point: [...shape.point],\n ...('label' in shape && { label: shape.label }),\n },\n ]\n })\n\n clearPrevSize()\n\n this.patchState({\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: Object.fromEntries(force),\n },\n },\n },\n })\n this.patchState({\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: Object.fromEntries(restore),\n },\n },\n },\n })\n }\n\n /* ------------- Renderer Event Handlers ------------ */\n\n onDragOver: TLDropEventHandler = (e) => {\n e.preventDefault()\n }\n\n onDrop: TLDropEventHandler = async (e) => {\n e.preventDefault()\n if (this.disableAssets) return this\n if (e.dataTransfer.files?.length) {\n this.addMediaFromFiles(Object.values(e.dataTransfer.files), [e.clientX, e.clientY])\n }\n return this\n }\n\n onPinchStart: TLPinchEventHandler = (info, e) => {\n this.currentTool.onPinchStart?.(info, e)\n }\n\n onPinchEnd: TLPinchEventHandler = (info, e) => this.currentTool.onPinchEnd?.(info, e)\n\n onPinch: TLPinchEventHandler = (info, e) => this.currentTool.onPinch?.(info, e)\n\n onPan: TLWheelEventHandler = (info, e) => {\n if (this.appState.status === 'pinching') return\n // TODO: Pan and pinchzoom are firing at the same time. Considering turning one of them off!\n\n const delta = Vec.div(info.delta, this.camera.zoom)\n const prev = this.camera.point\n const next = Vec.sub(prev, delta)\n\n if (Vec.isEqual(next, prev)) return\n\n this.pan(delta)\n\n // When panning, we also want to call onPointerMove, except when \"force panning\" via spacebar / middle wheel button (it's called elsewhere in that case)\n if (!this.isForcePanning) this.onPointerMove(info, e as unknown as React.PointerEvent)\n\n // prevent middle click paste on linux\n if (isLinux && this.isForcePanning) this.preventPaste()\n }\n\n onZoom: TLWheelEventHandler = (info, e) => {\n if (this.state.appState.status !== TVStatus.Idle) return\n const delta = info.delta[2] / 50\n this.zoomBy(delta, info.point)\n this.onPointerMove(info, e as unknown as React.PointerEvent)\n }\n\n /* ----------------- Pointer Events ----------------- */\n\n updateInputs: TLPointerEventHandler = (info) => {\n this.currentPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.shiftKey = info.shiftKey\n this.altKey = info.altKey\n this.ctrlKey = info.ctrlKey\n this.metaKey = info.metaKey\n }\n\n onPointerMove: TLPointerEventHandler = (info, e) => {\n this.previousPoint = this.currentPoint\n this.updateInputs(info, e)\n if (this.isForcePanning && this.isPointing) {\n this.onPan?.({ ...info, delta: Vec.neg(info.delta) }, e as unknown as WheelEvent)\n return\n }\n\n // Several events (e.g. pan) can trigger the same \"pointer move\" behavior\n this.currentTool.onPointerMove?.(info, e)\n\n // Move this to an emitted event\n if (this.state.room) {\n const { users, userId } = this.state.room\n\n this.callbacks.onChangePresence?.(this, {\n ...users[userId],\n point: this.getPagePoint(info.point),\n session: !!this.session,\n })\n }\n }\n\n onPointerDown: TLPointerEventHandler = (info, e) => {\n if (e.buttons === 4) {\n this.isForcePanning = true\n } else if (this.isPointing) {\n return\n }\n this.isPointing = true\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n if (this.isForcePanning) return\n if (this.currentTool.type === TVShapeType.Draw && e.pointerType === 'pen' && e.button === 5) {\n this.selectTool('erase')\n this.isErasingWithPen = true\n }\n this.currentTool.onPointerDown?.(info, e)\n }\n\n onPointerUp: TLPointerEventHandler = (info, e) => {\n this.isPointing = false\n if (!this.shiftKey) this.isForcePanning = false\n this.updateInputs(info, e)\n this.currentTool.onPointerUp?.(info, e)\n if (this.isErasingWithPen && e.pointerType === 'pen' && e.button === 5) {\n this.selectTool(TVShapeType.Draw)\n this.isErasingWithPen = false\n }\n }\n\n // Canvas (background)\n onPointCanvas: TLCanvasEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onPointCanvas?.(info, e)\n }\n\n onDoubleClickCanvas: TLCanvasEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDoubleClickCanvas?.(info, e)\n }\n\n onRightPointCanvas: TLCanvasEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onRightPointCanvas?.(info, e)\n }\n\n onDragCanvas: TLCanvasEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDragCanvas?.(info, e)\n }\n\n onReleaseCanvas: TLCanvasEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onReleaseCanvas?.(info, e)\n }\n\n // Shape\n onPointShape: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onPointShape?.(info, e)\n }\n\n onReleaseShape: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onReleaseShape?.(info, e)\n }\n\n onDoubleClickShape: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onDoubleClickShape?.(info, e)\n }\n\n onRightPointShape: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onRightPointShape?.(info, e)\n }\n\n onDragShape: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDragShape?.(info, e)\n }\n\n onHoverShape: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onHoverShape?.(info, e)\n }\n\n onUnhoverShape: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onUnhoverShape?.(info, e)\n }\n\n // Bounds (bounding box background)\n onPointBounds: TLBoundsEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onPointBounds?.(info, e)\n }\n\n onDoubleClickBounds: TLBoundsEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onDoubleClickBounds?.(info, e)\n }\n\n onRightPointBounds: TLBoundsEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onRightPointBounds?.(info, e)\n }\n\n onDragBounds: TLBoundsEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDragBounds?.(info, e)\n }\n\n onHoverBounds: TLBoundsEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onHoverBounds?.(info, e)\n }\n\n onUnhoverBounds: TLBoundsEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onUnhoverBounds?.(info, e)\n }\n\n onReleaseBounds: TLBoundsEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onReleaseBounds?.(info, e)\n }\n\n // Bounds handles (corners, edges)\n onPointBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onPointBoundsHandle?.(info, e)\n }\n\n onDoubleClickBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onDoubleClickBoundsHandle?.(info, e)\n\n // hack time to reset the size / clipping of an image\n if (this.selectedIds.length !== 1) return\n\n const shape = this.getShape(this.selectedIds[0])\n\n if (shape.type === TVShapeType.Image || shape.type === TVShapeType.Video) {\n const asset = this.document.assets[shape.assetId]\n const util = TVDR.getShapeUtil(shape)\n const centerA = util.getCenter(shape)\n const centerB = util.getCenter({ ...shape, size: asset.size })\n const delta = Vec.sub(centerB, centerA)\n\n this.updateShapes({\n id: shape.id,\n point: Vec.sub(shape.point, delta),\n size: asset.size,\n })\n }\n }\n\n onRightPointBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onRightPointBoundsHandle?.(info, e)\n }\n\n onDragBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDragBoundsHandle?.(info, e)\n }\n\n onHoverBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onHoverBoundsHandle?.(info, e)\n }\n\n onUnhoverBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onUnhoverBoundsHandle?.(info, e)\n }\n\n onReleaseBoundsHandle: TLBoundsHandleEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onReleaseBoundsHandle?.(info, e)\n }\n\n // Handles (ie the handles of a selected arrow)\n onPointHandle: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onPointHandle?.(info, e)\n }\n\n onDoubleClickHandle: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onDoubleClickHandle?.(info, e)\n }\n\n onRightPointHandle: TLPointerEventHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onRightPointHandle?.(info, e)\n }\n\n onDragHandle: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onDragHandle?.(info, e)\n }\n\n onHoverHandle: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onHoverHandle?.(info, e)\n }\n\n onUnhoverHandle: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onUnhoverHandle?.(info, e)\n }\n\n onReleaseHandle: TLPointerEventHandler = (info, e) => {\n this.updateInputs(info, e)\n this.currentTool.onReleaseHandle?.(info, e)\n }\n\n onShapeChange = (shape: { id: string } & Partial<TLShape>) => {\n const pageShapes = this.document.pages[this.currentPageId].shapes\n const shapeToUpdate = { ...(pageShapes[shape.id] as any), ...shape }\n const patch = Commands.updateShapes(this, [shapeToUpdate], this.currentPageId).after\n return this.patchState(patch, 'patched_shapes')\n // this.updateShapes(shape)\n }\n\n onShapeBlur = () => {\n // This prevents an auto-blur event from Safari\n if (performance.now() - this.editingStartTime < 50) return\n\n const { editingId } = this.pageState\n const { isToolLocked } = this.getAppState()\n\n if (editingId) {\n // If we're editing text, then delete the text if it's empty\n const shape = this.getShape(editingId)\n this.setEditingId()\n if (shape.type === TVShapeType.Text) {\n if (shape.text.trim().length <= 0) {\n this.patchState(Commands.deleteShapes(this, [editingId]).after, 'delete_empty_text')\n } else if (!isToolLocked) {\n this.select(editingId)\n }\n }\n }\n\n this.currentTool.onShapeBlur?.()\n }\n\n onShapeClone: TLShapeCloneHandler = (info, e) => {\n this.originPoint = this.getPagePoint(info.point).concat(info.pressure)\n this.updateInputs(info, e)\n this.currentTool.onShapeClone?.(info, e)\n }\n\n onRenderCountChange = (ids: string[]) => {\n const appState = this.getAppState()\n if (appState.isEmptyCanvas && ids.length > 0) {\n this.patchState(\n {\n appState: {\n isEmptyCanvas: false,\n },\n },\n 'empty_canvas:false'\n )\n } else if (!appState.isEmptyCanvas && ids.length <= 0) {\n this.patchState(\n {\n appState: {\n isEmptyCanvas: true,\n },\n },\n 'empty_canvas:true'\n )\n }\n }\n\n onError = () => {\n // TODO\n }\n\n isSelected(id: string) {\n return this.selectedIds.includes(id)\n }\n\n /* ----------------- Export ----------------- */\n\n /**\n * Get a snapshot of a video at current frame as base64 encoded image\n * @param id ID of video shape\n * @returns base64 encoded frame\n * @throws Error if video shape with given ID does not exist\n */\n serializeVideo(id: string): string {\n const video = document.getElementById(id + '_video') as HTMLVideoElement\n if (video) {\n const canvas = document.createElement('canvas')\n canvas.width = video.videoWidth\n canvas.height = video.videoHeight\n canvas.getContext('2d')!.drawImage(video, 0, 0)\n return canvas.toDataURL('image/png')\n } else throw new Error('Video with id ' + id + ' not found')\n }\n\n /**\n * Get a snapshot of a image (e.g. a GIF) as base64 encoded image\n * @param id ID of image shape\n * @returns base64 encoded frame\n * @throws Error if image shape with given ID does not exist\n */\n serializeImage(id: string): string {\n const image = document.getElementById(id + '_image') as HTMLImageElement\n if (image) {\n const canvas = document.createElement('canvas')\n canvas.width = image.width\n canvas.height = image.height\n canvas.getContext('2d')!.drawImage(image, 0, 0)\n return canvas.toDataURL('image/png')\n } else throw new Error('Image with id ' + id + ' not found')\n }\n\n patchAssets(assets: TVAssets) {\n this.document.assets = {\n ...this.document.assets,\n ...assets,\n }\n }\n\n get room() {\n return this.state.room\n }\n\n get isLocal() {\n return this.state.room === undefined || this.state.room.id === 'local'\n }\n\n get status() {\n return this.appState.status\n }\n\n get currentUser() {\n if (!this.state.room) return\n return this.state.room.users[this.state.room.userId]\n }\n\n // The center of the component (in screen space)\n get centerPoint() {\n const { width, height } = this.rendererBounds\n return Vec.toFixed([width / 2, height / 2])\n }\n\n get currentGrid() {\n const { zoom } = this.camera\n if (zoom < 0.15) {\n return GRID_SIZE * 16\n } else if (zoom < 1) {\n return GRID_SIZE * 4\n } else {\n return GRID_SIZE * 1\n }\n }\n\n getShapeUtil = TVDR.getShapeUtil\n\n static version = 15.5\n\n static defaultDocument: TVDocument = {\n id: 'doc',\n name: 'New Document',\n version: TelvaApp.version,\n pages: {\n page: {\n id: 'page',\n name: 'Page 1',\n childIndex: 1,\n shapes: {},\n bindings: {},\n },\n },\n pageStates: {\n page: {\n id: 'page',\n selectedIds: [],\n camera: {\n point: [0, 0],\n zoom: 1,\n },\n },\n },\n assets: {},\n }\n\n static defaultState: TVSnapshot = {\n settings: {\n isCadSelectMode: false,\n isPenMode: false,\n isDarkMode: false,\n isZoomSnap: false,\n isFocusMode: false,\n isSnapping: true,\n isDebugMode: false,\n isReadonlyMode: false,\n keepStyleMenuOpen: false,\n nudgeDistanceLarge: 16,\n nudgeDistanceSmall: 1,\n showRotateHandles: true,\n showBindingHandles: true,\n showCloneHandles: false,\n showGrid: false,\n language: 'en',\n dockPosition: 'bottom',\n exportBackground: TVExportBackground.Transparent,\n canvasMode: 'freehand' as const,\n },\n appState: {\n status: TVStatus.Idle,\n activeTool: 'select',\n hoveredId: undefined,\n currentPageId: 'page',\n currentStyle: defaultStyle,\n isToolLocked: false,\n isMenuOpen: false,\n isEmptyCanvas: false,\n eraseLine: [],\n snapLines: [],\n isLoading: false,\n disableAssets: false,\n },\n document: TelvaApp.defaultDocument,\n }\n\n static assetSrc = 'telva-assets.json'\n}\n", "import { del, get, set } from 'idb-keyval'\n\n// Used for clipboard\n\nconst ID = 'telva_clipboard'\n\nexport async function getClipboard(): Promise<string | undefined> {\n return get(ID)\n}\n\nexport async function setClipboard(item: string): Promise<void> {\n return set(ID, item)\n}\n\nexport function clearClipboard(): Promise<void> {\n return del(ID)\n}\n", "import * as idb from 'idb-keyval'\nimport { Utils } from 'telva-core'\nimport create, { UseBoundStore } from 'zustand'\nimport createVanilla, { StoreApi } from 'zustand/vanilla'\nimport type { Command, Patch } from '~types'\nimport { deepCopy } from './copy'\n\nexport class StateManager<T extends Record<string, any>> {\n /**\n * An ID used to persist state in indexdb.\n */\n protected _idbId?: string\n\n /**\n * The initial state.\n */\n private initialState: T\n\n /**\n * A zustand store that also holds the state.\n */\n private store: StoreApi<T>\n\n /**\n * The index of the current command.\n */\n protected pointer = -1\n\n /**\n * The current state.\n */\n private _state: T\n\n /**\n * The state manager's current status, with regard to restoring persisted state.\n */\n private _status: 'loading' | 'ready' = 'loading'\n\n /**\n * A stack of commands used for history (undo and redo).\n */\n protected stack: Command<T>[] = []\n\n /**\n * A snapshot of the current state.\n */\n protected _snapshot: T\n\n /**\n * A React hook for accessing the zustand store.\n */\n public readonly useStore: UseBoundStore<StoreApi<T>>\n\n /**\n * A promise that will resolve when the state manager has loaded any peristed state.\n */\n public ready: Promise<'none' | 'restored' | 'migrated'>\n\n public isPaused = false\n\n constructor(\n initialState: T,\n id?: string,\n version?: number,\n update?: (prev: T, next: T, prevVersion: number) => T\n ) {\n this._idbId = id\n this._state = deepCopy(initialState)\n this._snapshot = deepCopy(initialState)\n this.initialState = deepCopy(initialState)\n this.store = createVanilla(() => this._state)\n this.useStore = create(this.store)\n\n this.ready = new Promise<'none' | 'restored' | 'migrated'>((resolve) => {\n let message: 'none' | 'restored' | 'migrated' = 'none'\n\n if (this._idbId) {\n message = 'restored'\n\n idb\n .get(this._idbId)\n .then(async (saved) => {\n if (saved) {\n let next = saved\n\n if (version) {\n const savedVersion = await idb.get<number>(id + '_version')\n\n if (savedVersion && savedVersion < version) {\n next = update ? update(saved, initialState, savedVersion) : initialState\n\n message = 'migrated'\n }\n }\n\n await idb.set(id + '_version', version || -1)\n\n // why is this necessary? but it is...\n const prevEmpty = this._state.appState.isEmptyCanvas\n\n next = this.migrate(next)\n\n this._state = deepCopy(next)\n this._snapshot = deepCopy(next)\n\n this._state.appState.isEmptyCanvas = prevEmpty\n this.store.setState(this._state, true)\n } else {\n await idb.set(id + '_version', version || -1)\n }\n this._status = 'ready'\n resolve(message)\n })\n .catch((e) => console.error(e))\n } else {\n // We need to wait for any override to `onReady` to take effect.\n this._status = 'ready'\n resolve(message)\n }\n }).then((message) => {\n if (this.onReady) this.onReady(message)\n return message\n })\n }\n\n /**\n * Save the current state to indexdb.\n */\n protected persist = (patch: Patch<T>, id?: string): void | Promise<void> => {\n if (this._status !== 'ready') return\n\n if (this.onPersist) {\n this.onPersist(this._state, patch, id)\n }\n\n if (this._idbId) {\n return idb.set(this._idbId, this._state).catch((e) => console.error(e))\n }\n }\n\n /**\n * Apply a patch to the current state.\n * This does not effect the undo/redo stack.\n * This does not persist the state.\n * @param patch The patch to apply.\n * @param id (optional) An id for the patch.\n */\n private applyPatch = (patch: Patch<T>, id?: string) => {\n const prev = this._state\n const next = Utils.deepMerge(this._state, patch as any)\n const final = this.cleanup(next, prev, patch, id)\n if (this.onStateWillChange) {\n this.onStateWillChange(final, id)\n }\n this._state = final\n this.store.setState(this._state, true)\n if (this.onStateDidChange) {\n this.onStateDidChange(this._state, id)\n }\n return this\n }\n\n // Internal API ---------------------------------\n\n protected migrate = (next: T): T => {\n return next\n }\n\n /**\n * Perform any last changes to the state before updating.\n * Override this on your extending class.\n * @param nextState The next state.\n * @param prevState The previous state.\n * @param patch The patch that was just applied.\n * @param id (optional) An id for the just-applied patch.\n * @returns The final new state to apply.\n */\n protected cleanup = (nextState: T, _prevState: T, _patch: Patch<T>, _id?: string): T => nextState\n\n /**\n * A life-cycle method called when the state is about to change.\n * @param state The next state.\n * @param id An id for the change.\n */\n protected onStateWillChange?: (state: T, id?: string) => void\n\n /**\n * A life-cycle method called when the state has changed.\n * @param state The next state.\n * @param id An id for the change.\n */\n protected onStateDidChange?: (state: T, id?: string) => void\n\n /**\n * Apply a patch to the current state.\n * This does not effect the undo/redo stack.\n * This does not persist the state.\n * @param patch The patch to apply.\n * @param id (optional) An id for this patch.\n */\n patchState = (patch: Patch<T>, id?: string): this => {\n this.applyPatch(patch, id)\n if (this.onPatch) {\n this.onPatch(this._state, patch, id)\n }\n return this\n }\n\n /**\n * Replace the current state.\n * This does not effect the undo/redo stack.\n * This does not persist the state.\n * @param state The new state.\n * @param id An id for this change.\n */\n protected replaceState = (state: T, id?: string): this => {\n const final = this.cleanup(state, this._state, state, id)\n if (this.onStateWillChange) {\n this.onStateWillChange(final, 'replace')\n }\n this._state = final\n this.store.setState(this._state, true)\n if (this.onStateDidChange) {\n this.onStateDidChange(this._state, 'replace')\n }\n return this\n }\n\n /**\n * Update the state using a Command.\n * This effects the undo/redo stack.\n * This persists the state.\n * @param command The command to apply and add to the undo/redo stack.\n * @param id (optional) An id for this command.\n */\n protected setState = (command: Command<T>, id = command.id) => {\n if (this.pointer < this.stack.length - 1) {\n this.stack = this.stack.slice(0, this.pointer + 1)\n }\n this.stack.push({ ...command, id })\n this.pointer = this.stack.length - 1\n this.applyPatch(command.after, id)\n if (this.onCommand) this.onCommand(this._state, command, id)\n this.persist(command.after, id)\n return this\n }\n\n // Public API ---------------------------------\n\n public pause() {\n this.isPaused = true\n }\n\n public resume() {\n this.isPaused = false\n }\n\n /**\n * A callback fired when the constructor finishes loading any\n * persisted data.\n */\n protected onReady?: (message: 'none' | 'restored' | 'migrated') => void\n\n /**\n * A callback fired when a patch is applied.\n */\n public onPatch?: (state: T, patch: Patch<T>, id?: string) => void\n\n /**\n * A callback fired when a patch is applied.\n */\n public onCommand?: (state: T, command: Command<T>, id?: string) => void\n\n /**\n * A callback fired when the state is persisted.\n */\n public onPersist?: (state: T, patch: Patch<T>, id?: string) => void\n\n /**\n * A callback fired when the state is replaced.\n */\n public onReplace?: (state: T) => void\n\n /**\n * A callback fired when the state is reset.\n */\n public onReset?: (state: T) => void\n\n /**\n * A callback fired when the history is reset.\n */\n public onResetHistory?: (state: T) => void\n\n /**\n * A callback fired when a command is undone.\n */\n public onUndo?: (state: T) => void\n\n /**\n * A callback fired when a command is redone.\n */\n public onRedo?: (state: T) => void\n\n /**\n * Reset the state to the initial state and reset history.\n */\n public reset = () => {\n if (this.onStateWillChange) {\n this.onStateWillChange(this.initialState, 'reset')\n }\n this._state = this.initialState\n this.store.setState(this._state, true)\n this.resetHistory()\n this.persist({}, 'reset')\n if (this.onStateDidChange) {\n this.onStateDidChange(this._state, 'reset')\n }\n if (this.onReset) {\n this.onReset(this._state)\n }\n return this\n }\n\n /**\n * Force replace a new undo/redo history. It's your responsibility\n * to make sure that this is compatible with the current state!\n * @param history The new array of commands.\n * @param pointer (optional) The new pointer position.\n */\n public replaceHistory = (history: Command<T>[], pointer = history.length - 1): this => {\n this.stack = history\n this.pointer = pointer\n if (this.onReplace) {\n this.onReplace(this._state)\n }\n return this\n }\n\n /**\n * Reset the history stack (without resetting the state).\n */\n public resetHistory = (): this => {\n this.stack = []\n this.pointer = -1\n if (this.onResetHistory) {\n this.onResetHistory(this._state)\n }\n return this\n }\n\n /**\n * Move backward in the undo/redo stack.\n */\n public undo = (): this => {\n if (!this.isPaused) {\n if (!this.canUndo) return this\n const command = this.stack[this.pointer]\n this.pointer--\n this.applyPatch(command.before, `undo`)\n this.persist(command.before, 'undo')\n }\n if (this.onUndo) this.onUndo(this._state)\n return this\n }\n\n /**\n * Move forward in the undo/redo stack.\n */\n public redo = (): this => {\n if (!this.isPaused) {\n if (!this.canRedo) return this\n this.pointer++\n const command = this.stack[this.pointer]\n this.applyPatch(command.after, 'redo')\n this.persist(command.after, 'undo')\n }\n if (this.onRedo) this.onRedo(this._state)\n return this\n }\n\n /**\n * Save a snapshot of the current state, accessible at `this.snapshot`.\n */\n public setSnapshot = (): this => {\n this._snapshot = { ...this._state }\n return this\n }\n\n /**\n * Force the zustand state to update.\n */\n public forceUpdate = () => {\n this.store.setState(this._state, true)\n }\n\n /**\n * Get whether the state manager can undo.\n */\n public get canUndo(): boolean {\n return this.pointer > -1\n }\n\n /**\n * Get whether the state manager can redo.\n */\n public get canRedo(): boolean {\n return this.pointer < this.stack.length - 1\n }\n\n /**\n * The current state.\n */\n public get state(): T {\n return this._state\n }\n\n /**\n * The current status.\n */\n public get status(): string {\n return this._status\n }\n\n /**\n * The most-recent snapshot.\n */\n protected get snapshot(): T {\n return this._snapshot\n }\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { AlignType, TVShapeType, TelvaCommand } from '~types'\n\nexport function alignShapes(app: TelvaApp, ids: string[], type: AlignType): TelvaCommand {\n const { currentPageId } = app\n\n const initialShapes = ids.map((id) => app.getShape(id))\n\n const boundsForShapes = initialShapes.map((shape) => {\n return {\n id: shape.id,\n point: [...shape.point],\n bounds: TVDR.getBounds(shape),\n }\n })\n\n const commonBounds = Utils.getCommonBounds(boundsForShapes.map(({ bounds }) => bounds))\n\n const midX = commonBounds.minX + commonBounds.width / 2\n const midY = commonBounds.minY + commonBounds.height / 2\n\n const deltaMap = Object.fromEntries(\n boundsForShapes.map(({ id, point, bounds }) => {\n return [\n id,\n {\n prev: point,\n next: {\n [AlignType.Top]: [point[0], commonBounds.minY],\n [AlignType.CenterVertical]: [point[0], midY - bounds.height / 2],\n [AlignType.Bottom]: [point[0], commonBounds.maxY - bounds.height],\n [AlignType.Left]: [commonBounds.minX, point[1]],\n [AlignType.CenterHorizontal]: [midX - bounds.width / 2, point[1]],\n [AlignType.Right]: [commonBounds.maxX - bounds.width, point[1]],\n }[type],\n },\n ]\n })\n )\n\n const { before, after } = TVDR.mutateShapes(\n app.state,\n ids,\n (shape) => {\n if (!deltaMap[shape.id]) return shape\n return { point: deltaMap[shape.id].next }\n },\n currentPageId,\n false\n )\n\n initialShapes.forEach((shape) => {\n if (shape.type === TVShapeType.Group) {\n const delta = Vec.sub(after[shape.id].point!, before[shape.id].point!)\n\n shape.children.forEach((id) => {\n const child = app.getShape(id)\n before[child.id] = { point: child.point }\n after[child.id] = { point: Vec.add(child.point, delta) }\n })\n\n delete before[shape.id]\n delete after[shape.id]\n }\n })\n\n return {\n id: 'align',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: before,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: after,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport type { TelvaCommand } from '~types'\n\nexport function changePage(app: TelvaApp, pageId: string): TelvaCommand {\n return {\n id: 'change_page',\n before: {\n appState: {\n currentPageId: app.currentPageId,\n },\n },\n after: {\n appState: {\n currentPageId: pageId,\n },\n },\n }\n}\n", "import { TLPageState, Utils } from 'telva-core'\nimport type { TelvaApp } from '~state'\nimport { getIncrementedName } from '~state/commands/shared'\nimport type { TVPage, TelvaCommand } from '~types'\n\nexport function createPage(\n app: TelvaApp,\n center: number[],\n pageId = Utils.uniqueId(),\n pageName = 'Page'\n): TelvaCommand {\n const { currentPageId } = app\n\n const pages = Object.values(app.state.document.pages).sort(\n (a, b) => (a.childIndex ?? 0) - (b.childIndex ?? 0)\n )\n\n const topPage = pages[pages.length - 1]\n\n const nextChildIndex = topPage?.childIndex ? topPage?.childIndex + 1 : 1\n\n const page: TVPage = {\n id: pageId,\n name: getIncrementedName(\n pageName,\n pages.map((p) => p.name ?? '')\n ),\n childIndex: nextChildIndex,\n shapes: {},\n bindings: {},\n }\n\n const pageState: TLPageState = {\n id: pageId,\n selectedIds: [],\n camera: { point: center, zoom: 1 },\n editingId: undefined,\n bindingId: undefined,\n hoveredId: undefined,\n pointedId: undefined,\n }\n\n return {\n id: 'create_page',\n before: {\n appState: {\n currentPageId,\n },\n document: {\n pages: {\n [pageId]: undefined,\n },\n pageStates: {\n [pageId]: undefined,\n },\n },\n },\n after: {\n appState: {\n currentPageId: page.id,\n },\n document: {\n pages: {\n [pageId]: page,\n },\n pageStates: {\n [pageId]: pageState,\n },\n },\n },\n }\n}\n", "/**\n * Get an incremented name (e.g. Page 2) from a name (e.g. Page 1), based on an array of existing names.\n *\n * @param name The name to increment.\n * @param others The array of existing names.\n */\nexport function getIncrementedName(name: string, others: string[]) {\n let result = name\n const set = new Set(others)\n\n while (set.has(result)) {\n result = /^.*(\\d+)$/.exec(result)?.[1]\n ? result.replace(/(\\d+)(?=\\D?)$/, (m) => (+m + 1).toString())\n : `${result} 1`\n }\n\n return result\n}\n", "import { TVDR } from '~state/TVDR'\nimport type { ArrowShape, GroupShape, PagePartial, TVSnapshot } from '~types'\n\nexport function removeShapesFromPage(data: TVSnapshot, ids: string[], pageId: string) {\n const before: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const after: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const parentsToUpdate: GroupShape[] = []\n const deletedIds = new Set()\n const assetsToRemove = new Set<string>()\n\n // These are the shapes we're definitely going to delete\n\n ids\n .filter((id) => !TVDR.getShape(data, id, pageId).isLocked)\n .forEach((id) => {\n deletedIds.add(id)\n const shape = TVDR.getShape(data, id, pageId)\n before.shapes[id] = shape\n after.shapes[id] = undefined\n\n // Also delete the shape's children\n\n if (shape.children !== undefined) {\n shape.children.forEach((childId) => {\n deletedIds.add(childId)\n const child = TVDR.getShape(data, childId, pageId)\n before.shapes[childId] = child\n after.shapes[childId] = undefined\n })\n }\n\n if (shape.parentId !== pageId) {\n parentsToUpdate.push(TVDR.getShape(data, shape.parentId, pageId))\n }\n\n if (shape.assetId) {\n assetsToRemove.add(shape.assetId)\n }\n })\n\n parentsToUpdate.forEach((parent) => {\n if (ids.includes(parent.id)) return\n deletedIds.add(parent.id)\n before.shapes[parent.id] = { children: parent.children }\n after.shapes[parent.id] = { children: parent.children.filter((id) => !ids.includes(id)) }\n if (after.shapes[parent.id]?.children!.length === 0) {\n after.shapes[parent.id] = undefined\n before.shapes[parent.id] = TVDR.getShape(data, parent.id, pageId)\n }\n })\n\n // Recursively check for empty parents?\n\n const page = TVDR.getPage(data, pageId)\n\n // We also need to delete bindings that reference the deleted shapes\n Object.values(page.bindings)\n .filter((binding) => deletedIds.has(binding.fromId) || deletedIds.has(binding.toId))\n .forEach((binding) => {\n for (const id of [binding.toId, binding.fromId]) {\n // If the binding references a deleted shape...\n if (after.shapes[id] === undefined) {\n // Delete this binding\n before.bindings[binding.id] = binding\n after.bindings[binding.id] = undefined\n\n // Let's also look each the bound shape...\n const shape = page.shapes[id]\n\n // If the bound shape has a handle that references the deleted binding...\n if (shape && shape.handles) {\n Object.values(shape.handles)\n .filter((handle) => handle.bindingId === binding.id)\n .forEach((handle) => {\n // Save the binding reference in the before patch\n before.shapes[id] = {\n ...before.shapes[id],\n handles: {\n ...before.shapes[id]?.handles,\n [handle.id]: {\n ...before.shapes[id]?.handles?.[handle.id as keyof ArrowShape['handles']],\n bindingId: binding.id,\n },\n },\n }\n\n // Unless we're currently deleting the shape, remove the\n // binding reference from the after patch\n if (!deletedIds.has(id)) {\n after.shapes[id] = {\n ...after.shapes[id],\n handles: {\n ...after.shapes[id]?.handles,\n [handle.id]: {\n ...after.shapes[id]?.handles?.[handle.id as keyof ArrowShape['handles']],\n bindingId: undefined,\n },\n },\n }\n }\n })\n }\n }\n }\n })\n\n // If any other shapes are using the deleted assets, don't remove them\n Object.values(data.document.pages)\n .flatMap((page) => Object.values(page.shapes))\n .forEach((shape) => {\n if ('assetId' in shape && shape.assetId && !deletedIds.has(shape.id)) {\n assetsToRemove.delete(shape.assetId)\n }\n })\n\n return { before, after, assetsToRemove: Array.from(assetsToRemove) }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport type { Patch, TVBinding, TVShape, TelvaCommand } from '~types'\n\nexport function createShapes(\n app: TelvaApp,\n shapes: TVShape[],\n bindings: TVBinding[] = []\n): TelvaCommand {\n const { currentPageId } = app\n\n const beforeShapes: Record<string, Patch<TVShape> | undefined> = {}\n const afterShapes: Record<string, Patch<TVShape> | undefined> = {}\n\n shapes.forEach((shape) => {\n beforeShapes[shape.id] = undefined\n afterShapes[shape.id] = shape\n })\n\n const beforeBindings: Record<string, Patch<TVBinding> | undefined> = {}\n const afterBindings: Record<string, Patch<TVBinding> | undefined> = {}\n\n bindings.forEach((binding) => {\n beforeBindings[binding.id] = undefined\n afterBindings[binding.id] = binding\n })\n\n return {\n id: 'create',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: [...app.selectedIds],\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n bindings: afterBindings,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: shapes.map((shape) => shape.id),\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport type { TelvaCommand } from '~types'\n\nexport function deletePage(app: TelvaApp, pageId: string): TelvaCommand {\n const {\n currentPageId,\n document: { pages, pageStates },\n } = app\n\n const pagesArr = Object.values(pages).sort((a, b) => (a.childIndex || 0) - (b.childIndex || 0))\n\n const currentIndex = pagesArr.findIndex((page) => page.id === pageId)\n\n let nextCurrentPageId: string\n\n if (pageId === currentPageId) {\n if (currentIndex === pagesArr.length - 1) {\n nextCurrentPageId = pagesArr[pagesArr.length - 2].id\n } else {\n nextCurrentPageId = pagesArr[currentIndex + 1].id\n }\n } else {\n nextCurrentPageId = currentPageId\n }\n\n return {\n id: 'delete_page',\n before: {\n appState: {\n currentPageId: pageId,\n },\n document: {\n pages: {\n [pageId]: { ...pages[pageId] },\n },\n pageStates: {\n [pageId]: { ...pageStates[pageId] },\n },\n },\n },\n after: {\n appState: {\n currentPageId: nextCurrentPageId,\n },\n document: {\n pages: {\n [pageId]: undefined,\n },\n pageStates: {\n [pageId]: undefined,\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport { removeShapesFromPage } from '~state/commands/shared'\nimport type { TVAsset, TVAssets, TelvaCommand } from '~types'\n\nconst removeAssetsFromDocument = (assets: TVAssets, idsToRemove: string[]) => {\n const afterAssets: Record<string, TVAsset | undefined> = { ...assets }\n idsToRemove.forEach((id) => (afterAssets[id] = undefined))\n return afterAssets\n}\n\nexport function deleteShapes(\n app: TelvaApp,\n ids: string[],\n pageId = app.currentPageId\n): TelvaCommand {\n const {\n pageState,\n selectedIds,\n document: { assets: beforeAssets },\n } = app\n const { before, after, assetsToRemove } = removeShapesFromPage(app.state, ids, pageId)\n const afterAssets = removeAssetsFromDocument(beforeAssets, assetsToRemove)\n\n return {\n id: 'delete',\n before: {\n document: {\n assets: beforeAssets,\n pages: {\n [pageId]: before,\n },\n pageStates: {\n [pageId]: { selectedIds: [...app.selectedIds] },\n },\n },\n },\n after: {\n document: {\n assets: afterAssets,\n pages: {\n [pageId]: after,\n },\n pageStates: {\n [pageId]: {\n selectedIds: selectedIds.filter((id) => !ids.includes(id)),\n hoveredId:\n pageState.hoveredId && ids.includes(pageState.hoveredId)\n ? undefined\n : pageState.hoveredId,\n },\n },\n },\n },\n }\n}\n", "import { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { DistributeType, TVShape, TVShapeType, TelvaCommand } from '~types'\n\nexport function distributeShapes(app: TelvaApp, ids: string[], type: DistributeType): TelvaCommand {\n const { currentPageId } = app\n\n const initialShapes = ids.map((id) => app.getShape(id))\n\n const deltaMap = Object.fromEntries(getDistributions(initialShapes, type).map((d) => [d.id, d]))\n\n const { before, after } = TVDR.mutateShapes(\n app.state,\n ids.filter((id) => deltaMap[id] !== undefined),\n (shape) => ({ point: deltaMap[shape.id]?.next }),\n currentPageId\n )\n\n initialShapes.forEach((shape) => {\n if (shape.type === TVShapeType.Group) {\n const delta = Vec.sub(after[shape.id].point!, before[shape.id].point!)\n\n shape.children.forEach((id) => {\n const child = app.getShape(id)\n before[child.id] = { point: child.point }\n after[child.id] = { point: Vec.add(child.point, delta) }\n })\n\n delete before[shape.id]\n delete after[shape.id]\n }\n })\n\n return {\n id: 'distribute',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n\nfunction getDistributions(initialShapes: TVShape[], type: DistributeType) {\n const entries = initialShapes.map((shape) => {\n const utils = TVDR.getShapeUtil(shape)\n return {\n id: shape.id,\n point: [...shape.point],\n bounds: utils.getBounds(shape),\n center: utils.getCenter(shape),\n }\n })\n\n const len = entries.length\n const commonBounds = Utils.getCommonBounds(entries.map(({ bounds }) => bounds))\n\n const results: { id: string; prev: number[]; next: number[] }[] = []\n\n switch (type) {\n case DistributeType.Horizontal: {\n const span = entries.reduce((a, c) => a + c.bounds.width, 0)\n\n if (span > commonBounds.width) {\n const left = entries.sort((a, b) => a.bounds.minX - b.bounds.minX)[0]\n\n const right = entries.sort((a, b) => b.bounds.maxX - a.bounds.maxX)[0]\n\n const entriesToMove = entries\n .filter((a) => a !== left && a !== right)\n .sort((a, b) => a.center[0] - b.center[0])\n\n const step = (right.center[0] - left.center[0]) / (len - 1)\n\n const x = left.center[0] + step\n\n entriesToMove.forEach(({ id, point, bounds }, i) => {\n results.push({\n id,\n prev: point,\n next: [x + step * i - bounds.width / 2, bounds.minY],\n })\n })\n } else {\n const entriesToMove = entries.sort((a, b) => a.center[0] - b.center[0])\n\n let x = commonBounds.minX\n const step = (commonBounds.width - span) / (len - 1)\n\n entriesToMove.forEach(({ id, point, bounds }) => {\n results.push({ id, prev: point, next: [x, bounds.minY] })\n x += bounds.width + step\n })\n }\n break\n }\n case DistributeType.Vertical: {\n const span = entries.reduce((a, c) => a + c.bounds.height, 0)\n\n if (span > commonBounds.height) {\n const top = entries.sort((a, b) => a.bounds.minY - b.bounds.minY)[0]\n\n const bottom = entries.sort((a, b) => b.bounds.maxY - a.bounds.maxY)[0]\n\n const entriesToMove = entries\n .filter((a) => a !== top && a !== bottom)\n .sort((a, b) => a.center[1] - b.center[1])\n\n const step = (bottom.center[1] - top.center[1]) / (len - 1)\n\n const y = top.center[1] + step\n\n entriesToMove.forEach(({ id, point, bounds }, i) => {\n results.push({\n id,\n prev: point,\n next: [bounds.minX, y + step * i - bounds.height / 2],\n })\n })\n } else {\n const entriesToMove = entries.sort((a, b) => a.center[1] - b.center[1])\n\n let y = commonBounds.minY\n const step = (commonBounds.height - span) / (len - 1)\n\n entriesToMove.forEach(({ id, point, bounds }) => {\n results.push({ id, prev: point, next: [bounds.minX, y] })\n y += bounds.height + step\n })\n }\n\n break\n }\n }\n\n return results\n}\n", "import { Utils } from 'telva-core'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { TelvaCommand } from '~types'\n\nexport function duplicatePage(app: TelvaApp, pageId: string): TelvaCommand {\n const {\n currentPageId,\n pageState: { camera },\n } = app\n\n const page = app.document.pages[pageId]\n\n const newId = Utils.uniqueId()\n\n // Map shapes and bindings onto new IDs\n const oldToNewIds: Record<string, string> = Object.fromEntries([\n [page.id, newId],\n ...Object.keys(page.shapes).map((id) => [id, Utils.uniqueId()]),\n ...Object.keys(page.bindings).map((id) => [id, Utils.uniqueId()]),\n ])\n\n const shapes = Object.fromEntries(\n Object.entries(page.shapes).map(([id, shape]) => [\n oldToNewIds[id],\n {\n ...Utils.deepClone(shape),\n id: oldToNewIds[id],\n parentId: oldToNewIds[shape.parentId],\n },\n ])\n )\n\n const bindings = Object.fromEntries(\n Object.entries(page.bindings).map(([id, binding]) => [\n oldToNewIds[id],\n {\n ...Utils.deepClone(binding),\n id: oldToNewIds[binding.id],\n fromId: oldToNewIds[binding.fromId],\n toId: oldToNewIds[binding.toId],\n },\n ])\n )\n\n // Update the shape's to and from references to the new bindingid\n Object.values(page.bindings).forEach((binding) => {\n const fromId = oldToNewIds[binding.fromId]\n const fromHandles = shapes[fromId]!.handles\n\n if (fromHandles) {\n Object.values(fromHandles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = oldToNewIds[binding.id]\n }\n })\n }\n\n const toId = oldToNewIds[binding.toId]\n const toHandles = shapes[toId]!.handles\n\n if (toHandles) {\n Object.values(toHandles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = oldToNewIds[binding.id]\n }\n })\n }\n })\n\n const nextPage = {\n ...page,\n id: oldToNewIds[page.id],\n name: page.name + ' Copy',\n shapes,\n bindings,\n }\n\n return {\n id: 'duplicate_page',\n before: {\n appState: {\n currentPageId,\n },\n document: {\n pages: {\n [newId]: undefined,\n },\n pageStates: {\n [newId]: undefined,\n },\n },\n },\n after: {\n appState: {\n currentPageId: newId,\n },\n document: {\n pages: {\n [newId]: nextPage,\n },\n pageStates: {\n [newId]: {\n ...page,\n id: newId,\n selectedIds: [],\n camera: { ...camera },\n editingId: undefined,\n bindingId: undefined,\n hoveredId: undefined,\n pointedId: undefined,\n },\n },\n },\n },\n }\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { PagePartial, TVShape, TelvaCommand } from '~types'\n\nexport function duplicateShapes(app: TelvaApp, ids: string[], point?: number[]): TelvaCommand {\n const { selectedIds, currentPageId, page, shapes } = app\n\n const before: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const after: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const duplicateMap: Record<string, string> = {}\n\n const shapesToDuplicate = ids\n .map((id) => app.getShape(id))\n .filter((shape) => !ids.includes(shape.parentId))\n\n // Create duplicates\n shapesToDuplicate.forEach((shape) => {\n const duplicatedId = Utils.uniqueId()\n before.shapes[duplicatedId] = undefined\n\n after.shapes[duplicatedId] = {\n ...Utils.deepClone(shape),\n id: duplicatedId,\n childIndex: TVDR.getChildIndexAbove(app.state, shape.id, currentPageId),\n }\n\n if (shape.children) {\n after.shapes[duplicatedId]!.children = []\n }\n\n if (shape.parentId !== currentPageId) {\n const parent = app.getShape(shape.parentId)\n\n before.shapes[parent.id] = {\n ...before.shapes[parent.id],\n children: parent.children,\n }\n\n after.shapes[parent.id] = {\n ...after.shapes[parent.id],\n children: [...(after.shapes[parent.id] || parent).children!, duplicatedId],\n }\n }\n\n duplicateMap[shape.id] = duplicatedId\n })\n\n // If the shapes have children, then duplicate those too\n shapesToDuplicate.forEach((shape) => {\n if (shape.children) {\n shape.children.forEach((childId) => {\n const child = app.getShape(childId)\n const duplicatedId = Utils.uniqueId()\n const duplicatedParentId = duplicateMap[shape.id]\n before.shapes[duplicatedId] = undefined\n after.shapes[duplicatedId] = {\n ...Utils.deepClone(child),\n id: duplicatedId,\n parentId: duplicatedParentId,\n childIndex: TVDR.getChildIndexAbove(app.state, child.id, currentPageId),\n }\n duplicateMap[childId] = duplicatedId\n after.shapes[duplicateMap[shape.id]]?.children?.push(duplicatedId)\n })\n }\n })\n\n // Which ids did we end up duplicating?\n const dupedShapeIds = new Set(Object.keys(duplicateMap))\n\n // Handle bindings that effect duplicated shapes\n Object.values(page.bindings)\n .filter((binding) => dupedShapeIds.has(binding.fromId) || dupedShapeIds.has(binding.toId))\n .forEach((binding) => {\n if (dupedShapeIds.has(binding.fromId)) {\n if (dupedShapeIds.has(binding.toId)) {\n // If the binding is between two duplicating shapes then\n // duplicate the binding, too\n const duplicatedBindingId = Utils.uniqueId()\n\n const duplicatedBinding = {\n ...Utils.deepClone(binding),\n id: duplicatedBindingId,\n fromId: duplicateMap[binding.fromId],\n toId: duplicateMap[binding.toId],\n }\n\n before.bindings[duplicatedBindingId] = undefined\n after.bindings[duplicatedBindingId] = duplicatedBinding\n\n // Change the duplicated shape's handle so that it reference\n // the duplicated binding\n const boundShape = after.shapes[duplicatedBinding.fromId]\n Object.values(boundShape!.handles!).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = duplicatedBindingId\n }\n })\n } else {\n // If only the fromId is selected, delete the binding on\n // the duplicated shape's handles\n const boundShape = after.shapes[duplicateMap[binding.fromId]]\n Object.values(boundShape!.handles!).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = undefined\n }\n })\n }\n }\n })\n\n // Now move the shapes\n\n const shapesToMove = Object.values(after.shapes) as TVShape[]\n\n if (point) {\n const commonBounds = Utils.getCommonBounds(shapesToMove.map((shape) => TVDR.getBounds(shape)))\n const center = Utils.getBoundsCenter(commonBounds)\n shapesToMove.forEach((shape) => {\n // Could be a group\n if (!shape.point) return\n shape.point = Vec.sub(point, Vec.sub(center, shape.point))\n })\n } else {\n const offset = [16, 16]\n shapesToMove.forEach((shape) => {\n // Could be a group\n if (!shape.point) return\n shape.point = Vec.add(shape.point, offset)\n })\n }\n\n // Unlock any locked shapes\n shapesToMove.forEach((shape) => {\n if (shape.isLocked) {\n shape.isLocked = false\n }\n })\n\n return {\n id: 'duplicate',\n before: {\n document: {\n pages: {\n [currentPageId]: before,\n },\n pageStates: {\n [currentPageId]: { selectedIds },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: after,\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: Array.from(dupedShapeIds.values()).map((id) => duplicateMap[id]),\n },\n },\n },\n },\n }\n}\n", "import { TLBoundsCorner, Utils } from 'telva-core'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { FlipType } from '~types'\nimport type { TelvaCommand } from '~types'\n\nexport function flipShapes(app: TelvaApp, ids: string[], type: FlipType): TelvaCommand {\n const {\n selectedIds,\n currentPageId,\n page: { shapes },\n } = app\n\n const boundsForShapes = ids.map((id) => TVDR.getBounds(shapes[id]))\n\n const isSinglySelectedGroup = ids.length === 1 && shapes[ids[0]].type === 'group'\n\n const commonBounds = Utils.getCommonBounds(boundsForShapes)\n\n const { before, after } = TVDR.mutateShapes(\n app.state,\n ids,\n (shape) => {\n const shapeBounds = TVDR.getBounds(shape)\n const isChildOfGroup = shape.parentId !== currentPageId\n switch (type) {\n case FlipType.Horizontal: {\n if (isChildOfGroup && !isSinglySelectedGroup) {\n // do translation of this child\n const groupBounds = TVDR.getBounds(shapes[shape.parentId])\n const newGroupBounds = Utils.getRelativeTransformedBoundingBox(\n commonBounds,\n commonBounds,\n groupBounds,\n true,\n false\n )\n const dx = newGroupBounds.minX - groupBounds.minX\n return TVDR.getShapeUtil(shape).transform(\n shape,\n { ...shapeBounds, minX: shapeBounds.minX + dx, maxX: shapeBounds.maxX + dx },\n {\n type: TLBoundsCorner.TopLeft,\n scaleX: 1,\n scaleY: 1,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n }\n )\n }\n\n const newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n commonBounds,\n commonBounds,\n shapeBounds,\n true,\n false\n )\n\n return TVDR.getShapeUtil(shape).transform(shape, newShapeBounds, {\n type: TLBoundsCorner.TopLeft,\n scaleX: -1,\n scaleY: 1,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n })\n }\n case FlipType.Vertical: {\n if (isChildOfGroup && !isSinglySelectedGroup) {\n // do translation of this child\n const groupBounds = TVDR.getBounds(shapes[shape.parentId])\n const newGroupBounds = Utils.getRelativeTransformedBoundingBox(\n commonBounds,\n commonBounds,\n groupBounds,\n false,\n true\n )\n const dy = newGroupBounds.minY - groupBounds.minY\n return TVDR.getShapeUtil(shape).transform(\n shape,\n { ...shapeBounds, minY: shapeBounds.minY + dy, maxY: shapeBounds.maxY + dy },\n {\n type: TLBoundsCorner.TopLeft,\n scaleX: 1,\n scaleY: 1,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n }\n )\n }\n const newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n commonBounds,\n commonBounds,\n shapeBounds,\n false,\n true\n )\n\n return TVDR.getShapeUtil(shape).transform(shape, newShapeBounds, {\n type: TLBoundsCorner.TopLeft,\n scaleX: 1,\n scaleY: -1,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n })\n }\n }\n },\n currentPageId,\n true\n )\n\n return {\n id: 'flip',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { Utils } from 'telva-core'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { TVShape, TVShapeType } from '~types'\nimport type { Patch, TVBinding, TelvaCommand } from '~types'\n\nexport function groupShapes(\n app: TelvaApp,\n ids: string[],\n groupId: string,\n pageId: string\n): TelvaCommand | undefined {\n if (ids.length < 2) return\n\n const beforeShapes: Record<string, Patch<TVShape | undefined>> = {}\n const afterShapes: Record<string, Patch<TVShape | undefined>> = {}\n\n const beforeBindings: Record<string, Patch<TVBinding | undefined>> = {}\n const afterBindings: Record<string, Patch<TVBinding | undefined>> = {}\n\n const idsToGroup = [...ids]\n const shapesToGroup: TVShape[] = []\n const deletedGroupIds: string[] = []\n const otherEffectedGroups: TVShape[] = []\n\n // Collect all of the shapes to group (and their ids)\n for (const id of ids) {\n const shape = app.getShape(id)\n if (shape.isLocked) continue\n\n if (shape.children === undefined) {\n shapesToGroup.push(shape)\n } else {\n const childIds = shape.children.filter((id) => !app.getShape(id).isLocked)\n otherEffectedGroups.push(shape)\n idsToGroup.push(...childIds)\n shapesToGroup.push(...childIds.map((id) => app.getShape(id)).filter(Boolean))\n }\n }\n\n // 1. Can we create this group?\n\n // Do the shapes have the same parent?\n if (shapesToGroup.every((shape) => shape.parentId === shapesToGroup[0].parentId)) {\n // Is the common parent a shape (not the page)?\n if (shapesToGroup[0].parentId !== pageId) {\n const commonParent = app.getShape(shapesToGroup[0].parentId)\n // Are all of the common parent's shapes selected?\n if (commonParent.children?.length === idsToGroup.length) {\n // Don't create a group if that group would be the same as the\n // existing group.\n return\n }\n }\n }\n\n // A flattened array of shapes from the page\n const flattenedShapes = TVDR.flattenPage(app.state, pageId)\n\n // A map of shapes to their index in flattendShapes\n const shapeIndexMap = Object.fromEntries(\n shapesToGroup.map((shape) => [shape.id, flattenedShapes.indexOf(shape)])\n )\n\n // An array of shapes in order by their index in flattendShapes\n const sortedShapes = shapesToGroup.sort((a, b) => shapeIndexMap[a.id] - shapeIndexMap[b.id])\n\n // The parentId is always the current page\n const groupParentId = pageId // sortedShapes[0].parentId\n\n // The childIndex should be the lowest index of the selected shapes\n // with a parent that is the current page; or else the child index\n // of the lowest selected shape.\n const groupChildIndex = (\n sortedShapes.filter((shape) => shape.parentId === pageId)[0] || sortedShapes[0]\n ).childIndex\n\n // The shape's point is the min point of its childrens' common bounds\n const groupBounds = Utils.getCommonBounds(shapesToGroup.map((shape) => TVDR.getBounds(shape)))\n\n // Create the group\n beforeShapes[groupId] = undefined\n\n afterShapes[groupId] = TVDR.getShapeUtil(TVShapeType.Group).create({\n id: groupId,\n childIndex: groupChildIndex,\n parentId: groupParentId,\n point: [groupBounds.minX, groupBounds.minY],\n size: [groupBounds.width, groupBounds.height],\n children: sortedShapes.map((shape) => shape.id),\n })\n\n // Reparent shapes to the new group\n sortedShapes.forEach((shape, index) => {\n // If the shape is part of a different group, mark the parent shape for cleanup\n if (shape.parentId !== pageId) {\n const parentShape = app.getShape(shape.parentId)\n otherEffectedGroups.push(parentShape)\n }\n\n beforeShapes[shape.id] = {\n ...beforeShapes[shape.id],\n parentId: shape.parentId,\n childIndex: shape.childIndex,\n }\n\n afterShapes[shape.id] = {\n ...afterShapes[shape.id],\n parentId: groupId,\n childIndex: index + 1,\n }\n })\n\n // Clean up effected parents\n while (otherEffectedGroups.length > 0) {\n const shape = otherEffectedGroups.pop()\n if (!shape) break\n\n const nextChildren = (beforeShapes[shape.id]?.children || shape.children)!.filter(\n (childId) => childId && !(idsToGroup.includes(childId) || deletedGroupIds.includes(childId))\n )\n\n // If the parent has no children, remove it\n if (nextChildren.length === 0) {\n beforeShapes[shape.id] = shape\n afterShapes[shape.id] = undefined\n\n // And if that parent is part of a different group, mark it for cleanup\n // (This is necessary only when we implement nested groups.)\n if (shape.parentId !== pageId) {\n deletedGroupIds.push(shape.id)\n otherEffectedGroups.push(app.getShape(shape.parentId))\n }\n } else {\n beforeShapes[shape.id] = {\n ...beforeShapes[shape.id],\n children: shape.children,\n }\n\n afterShapes[shape.id] = {\n ...afterShapes[shape.id],\n children: nextChildren,\n }\n }\n }\n\n // TODO: This code is copied from delete.command. Create a shared helper!\n\n const { bindings } = app\n\n const deletedGroupIdsSet = new Set(deletedGroupIds)\n\n // We also need to delete bindings that reference the deleted shapes\n bindings.forEach((binding) => {\n for (const id of [binding.toId, binding.fromId]) {\n // If the binding references a deleted shape...\n if (deletedGroupIdsSet.has(id)) {\n // Delete this binding\n beforeBindings[binding.id] = binding\n afterBindings[binding.id] = undefined\n\n // Let's also look each the bound shape...\n const shape = app.getShape(id)\n\n // If the bound shape has a handle that references the deleted binding...\n if (shape.handles) {\n Object.values(shape.handles)\n .filter((handle) => handle.bindingId === binding.id)\n .forEach((handle) => {\n // Save the binding reference in the before patch\n beforeShapes[id] = {\n ...beforeShapes[id],\n handles: {\n ...beforeShapes[id]?.handles,\n [handle.id]: { bindingId: binding.id },\n },\n }\n\n // Unless we're currently deleting the shape, remove the\n // binding reference from the after patch\n if (!deletedGroupIds.includes(id)) {\n afterShapes[id] = {\n ...afterShapes[id],\n handles: {\n ...afterShapes[id]?.handles,\n [handle.id]: { bindingId: undefined },\n },\n }\n }\n })\n }\n }\n }\n })\n\n return {\n id: 'group',\n before: {\n document: {\n pages: {\n [pageId]: {\n shapes: beforeShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [pageId]: {\n shapes: afterShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: [groupId],\n },\n },\n },\n },\n }\n}\n", "import { TLBounds, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { ArrowShape, PagePartial, TVShape, TelvaCommand } from '~types'\n\nexport function moveShapesToPage(\n app: TelvaApp,\n ids: string[],\n viewportBounds: TLBounds,\n fromPageId: string,\n toPageId: string\n): TelvaCommand {\n const { page } = app\n\n const fromPage: Record<string, PagePartial> = {\n before: {\n shapes: {},\n bindings: {},\n },\n after: {\n shapes: {},\n bindings: {},\n },\n }\n\n const toPage: Record<string, PagePartial> = {\n before: {\n shapes: {},\n bindings: {},\n },\n after: {\n shapes: {},\n bindings: {},\n },\n }\n\n // Collect all the shapes to move and their keys.\n const movingShapeIds = new Set<string>()\n const shapesToMove = new Set<TVShape>()\n\n ids\n .map((id) => app.getShape(id, fromPageId))\n .filter((shape) => !shape.isLocked)\n .forEach((shape) => {\n movingShapeIds.add(shape.id)\n shapesToMove.add(shape)\n if (shape.children !== undefined) {\n shape.children.forEach((childId) => {\n movingShapeIds.add(childId)\n shapesToMove.add(app.getShape(childId, fromPageId))\n })\n }\n })\n\n // Where should we put start putting shapes on the \"to\" page?\n const startingChildIndex = TVDR.getTopChildIndex(app.state, toPageId)\n\n // Which shapes are we moving?\n const movingShapes = Array.from(shapesToMove.values())\n\n movingShapes.forEach((shape, i) => {\n // Remove the shape from the fromPage\n fromPage.before.shapes[shape.id] = shape\n fromPage.after.shapes[shape.id] = undefined\n\n // But the moved shape on the \"to\" page\n toPage.before.shapes[shape.id] = undefined\n toPage.after.shapes[shape.id] = shape\n\n // If the shape's parent isn't moving too, reparent the shape to\n // the \"to\" page, at the top of the z stack\n if (!movingShapeIds.has(shape.parentId)) {\n toPage.after.shapes[shape.id] = {\n ...shape,\n parentId: toPageId,\n childIndex: startingChildIndex + i,\n }\n\n // If the shape was in a group, then pull the shape from the\n // parent's children array.\n if (shape.parentId !== fromPageId) {\n const parent = app.getShape(shape.parentId, fromPageId)\n fromPage.before.shapes[parent.id] = {\n children: parent.children,\n }\n\n fromPage.after.shapes[parent.id] = {\n children: parent.children!.filter((childId) => childId !== shape.id),\n }\n }\n }\n })\n\n // Handle bindings that effect duplicated shapes\n Object.values(page.bindings)\n .filter((binding) => movingShapeIds.has(binding.fromId) || movingShapeIds.has(binding.toId))\n .forEach((binding) => {\n // Always delete the binding from the from page\n\n fromPage.before.bindings[binding.id] = binding\n fromPage.after.bindings[binding.id] = undefined\n\n // Delete the reference from the binding's fromShape\n\n const fromBoundShape = app.getShape(binding.fromId, fromPageId)\n\n // Will we be copying this binding to the new page?\n\n const shouldCopy = movingShapeIds.has(binding.fromId) && movingShapeIds.has(binding.toId)\n\n if (shouldCopy) {\n // Just move the binding to the new page\n toPage.before.bindings[binding.id] = undefined\n toPage.after.bindings[binding.id] = binding\n } else {\n if (movingShapeIds.has(binding.fromId)) {\n // If we are only moving the \"from\" shape, we need to delete\n // the binding reference from the \"from\" shapes handles\n const fromShape = app.getShape(binding.fromId, fromPageId)\n const handle = Object.values(fromBoundShape.handles!).find(\n (handle) => handle.bindingId === binding.id\n )!\n\n // Remove the handle from the shape on the toPage\n\n const handleId = handle.id as keyof ArrowShape['handles']\n\n const toPageShape = toPage.after.shapes[fromShape.id]!\n\n toPageShape.handles = {\n ...toPageShape.handles,\n [handleId]: {\n ...toPageShape.handles![handleId],\n bindingId: undefined,\n },\n }\n } else {\n // If we are only moving the \"to\" shape, we need to delete\n // the binding reference from the \"from\" shape's handles\n const fromShape = app.getShape(binding.fromId, fromPageId)\n const handle = Object.values(fromBoundShape.handles!).find(\n (handle) => handle.bindingId === binding.id\n )!\n\n fromPage.before.shapes[fromShape.id] = {\n handles: { [handle.id]: { bindingId: binding.id } },\n }\n\n fromPage.after.shapes[fromShape.id] = {\n handles: { [handle.id]: { bindingId: undefined } },\n }\n }\n }\n })\n\n // Finally, center camera on selection\n\n const toPageState = app.state.document.pageStates[toPageId]\n\n const bounds = Utils.getCommonBounds(movingShapes.map((shape) => TVDR.getBounds(shape)))\n\n const zoom = TVDR.getCameraZoom(\n viewportBounds.width < viewportBounds.height\n ? (viewportBounds.width - 128) / bounds.width\n : (viewportBounds.height - 128) / bounds.height\n )\n\n const mx = (viewportBounds.width - bounds.width * zoom) / 2 / zoom\n const my = (viewportBounds.height - bounds.height * zoom) / 2 / zoom\n\n const point = Vec.toFixed(Vec.add([-bounds.minX, -bounds.minY], [mx, my]))\n\n return {\n id: 'move_to_page',\n before: {\n appState: {\n currentPageId: fromPageId,\n },\n document: {\n pages: {\n [fromPageId]: fromPage.before,\n [toPageId]: toPage.before,\n },\n pageStates: {\n [fromPageId]: { selectedIds: ids },\n [toPageId]: {\n selectedIds: toPageState.selectedIds,\n camera: toPageState.camera,\n },\n },\n },\n },\n after: {\n appState: {\n currentPageId: toPageId,\n },\n document: {\n pages: {\n [fromPageId]: fromPage.after,\n [toPageId]: toPage.after,\n },\n pageStates: {\n [fromPageId]: { selectedIds: [] },\n [toPageId]: {\n selectedIds: ids,\n camera: {\n zoom,\n point,\n },\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport type { TVPage, TelvaCommand } from '~types'\n\nexport function movePage(app: TelvaApp, pageId: string, index: number): TelvaCommand {\n const { pages } = app.document\n\n const movingPage = pages[pageId]\n\n const beforePages = Object.values(pages).sort((a, b) => (a.childIndex ?? 0) - (b.childIndex ?? 0))\n\n const fromIndex = beforePages.indexOf(movingPage)\n\n const afterPages = [...beforePages]\n afterPages.splice(fromIndex, 1)\n afterPages.splice(index > fromIndex ? index - 1 : index, 0, movingPage)\n\n return {\n id: 'move_page',\n before: {\n document: {\n pages: Object.fromEntries(\n beforePages.map((p: TVPage) => [p.id, { childIndex: p.childIndex }])\n ),\n },\n },\n after: {\n document: {\n pages: Object.fromEntries(\n afterPages.map((p: TVPage, childIndex) => [p.id, { childIndex }])\n ),\n },\n },\n }\n}\n", "import { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { MoveType, TVShape, TelvaCommand } from '~types'\n\nexport function reorderShapes(app: TelvaApp, ids: string[], type: MoveType): TelvaCommand {\n const { currentPageId, page } = app\n\n // Get the unique parent ids for the selected elements\n const parentIds = new Set(ids.map((id) => app.getShape(id).parentId))\n\n let result: {\n before: Record<string, Partial<TVShape>>\n after: Record<string, Partial<TVShape>>\n } = { before: {}, after: {} }\n\n let startIndex: number\n let startChildIndex: number\n let step: number\n\n // Collect shapes with common parents into a table under their parent id\n Array.from(parentIds.values()).forEach((parentId) => {\n let sortedChildren: TVShape[] = []\n if (parentId === page.id) {\n sortedChildren = Object.values(page.shapes).sort((a, b) => a.childIndex - b.childIndex)\n } else {\n const parent = app.getShape(parentId)\n if (!parent.children) throw Error('No children in parent!')\n\n sortedChildren = parent.children\n .map((childId) => app.getShape(childId))\n .sort((a, b) => a.childIndex - b.childIndex)\n }\n\n const sortedChildIds = sortedChildren.map((shape) => shape.id)\n\n const sortedIndicesToMove = ids\n .filter((id) => sortedChildIds.includes(id))\n .map((id) => sortedChildIds.indexOf(id))\n .sort((a, b) => a - b)\n\n if (sortedIndicesToMove.length === sortedChildIds.length) return\n\n switch (type) {\n case MoveType.ToBack: {\n // a b c\n // Initial 1 2 3 4 5 6 7\n // Final .25 .5 .75 1 3 6 7\n // a b c\n\n // Find the lowest \"open\" index\n for (let i = 0; i < sortedChildIds.length; i++) {\n if (sortedIndicesToMove.includes(i)) continue\n startIndex = i\n break\n }\n\n // Find the lowest child index that isn't in sortedIndicesToMove\n startChildIndex = sortedChildren[startIndex].childIndex\n\n // Find the step for each additional child\n step = startChildIndex / (sortedIndicesToMove.length + 1)\n\n // Get the results of moving the selected shapes below the first open index's shape\n result = TVDR.mutateShapes(\n app.state,\n sortedIndicesToMove.map((i) => sortedChildren[i].id).reverse(),\n (_shape, i) => ({\n childIndex: startChildIndex - (i + 1) * step,\n }),\n currentPageId\n )\n\n break\n }\n case MoveType.ToFront: {\n // a b c\n // Initial 1 2 3 4 5 6 7\n // Final 1 3 6 7 8 9 10\n // a b c\n\n // Find the highest \"open\" index\n for (let i = sortedChildIds.length - 1; i >= 0; i--) {\n if (sortedIndicesToMove.includes(i)) continue\n startIndex = i\n break\n }\n\n // Find the lowest child index that isn't in sortedIndicesToMove\n startChildIndex = sortedChildren[startIndex].childIndex\n\n // Find the step for each additional child\n step = 1\n\n // Get the results of moving the selected shapes below the first open index's shape\n result = TVDR.mutateShapes(\n app.state,\n sortedIndicesToMove.map((i) => sortedChildren[i].id),\n (_shape, i) => ({\n childIndex: startChildIndex + (i + 1),\n }),\n currentPageId\n )\n\n break\n }\n case MoveType.Backward: {\n // a b c\n // Initial 1 2 3 4 5 6 7\n // Final .5 1 1.66 2.33 3 6 7\n // a b c\n\n const indexMap: Record<string, number> = {}\n\n // Starting from the top...\n for (let i = sortedChildIds.length - 1; i >= 0; i--) {\n // If we found a moving index...\n if (sortedIndicesToMove.includes(i)) {\n for (let j = i; j >= 0; j--) {\n // iterate downward until we find an open spot\n if (!sortedIndicesToMove.includes(j)) {\n // i = the index of the first closed spot\n // j = the index of the first open spot\n\n const endChildIndex = sortedChildren[j].childIndex\n let startChildIndex: number\n let step: number\n\n if (j === 0) {\n // We're moving below the first child, start from\n // half of its child index.\n\n startChildIndex = endChildIndex / 2\n step = endChildIndex / 2 / (i - j + 1)\n } else {\n // Start from the child index of the child below the\n // child above.\n startChildIndex = sortedChildren[j - 1].childIndex\n step = (endChildIndex - startChildIndex) / (i - j + 1)\n startChildIndex += step\n }\n\n for (let k = 0; k < i - j; k++) {\n indexMap[sortedChildren[j + k + 1].id] = startChildIndex + step * k\n }\n\n break\n }\n }\n }\n }\n\n if (Object.values(indexMap).length > 0) {\n // Get the results of moving the selected shapes below the first open index's shape\n result = TVDR.mutateShapes(\n app.state,\n sortedIndicesToMove.map((i) => sortedChildren[i].id),\n (shape) => ({\n childIndex: indexMap[shape.id],\n }),\n currentPageId\n )\n }\n\n break\n }\n case MoveType.Forward: {\n // a b c\n // Initial 1 2 3 4 5 6 7\n // Final 1 3 3.5 6 7 8 9\n // a b c\n\n const indexMap: Record<string, number> = {}\n\n // Starting from the top...\n for (let i = 0; i < sortedChildIds.length; i++) {\n // If we found a moving index...\n if (sortedIndicesToMove.includes(i)) {\n // Search for the first open spot above this one\n for (let j = i; j < sortedChildIds.length; j++) {\n if (!sortedIndicesToMove.includes(j)) {\n // i = the low index of the first closed spot\n // j = the high index of the first open spot\n\n startChildIndex = sortedChildren[j].childIndex\n\n const step =\n j === sortedChildIds.length - 1\n ? 1\n : (sortedChildren[j + 1].childIndex - startChildIndex) / (j - i + 1)\n\n for (let k = 0; k < j - i; k++) {\n indexMap[sortedChildren[i + k].id] = startChildIndex + step * (k + 1)\n }\n\n break\n }\n }\n }\n }\n\n if (Object.values(indexMap).length > 0) {\n // Get the results of moving the selected shapes below the first open index's shape\n result = TVDR.mutateShapes(\n app.state,\n sortedIndicesToMove.map((i) => sortedChildren[i].id),\n (shape) => ({\n childIndex: indexMap[shape.id],\n }),\n currentPageId\n )\n }\n\n break\n }\n }\n })\n\n return {\n id: 'move',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: result.before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: result.after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport type { TelvaCommand } from '~types'\n\nexport function renamePage(app: TelvaApp, pageId: string, name: string): TelvaCommand {\n const { page } = app\n\n return {\n id: 'rename_page',\n before: {\n document: {\n pages: {\n [pageId]: { name: page.name },\n },\n },\n },\n after: {\n document: {\n pages: {\n [pageId]: { name: name },\n },\n },\n },\n }\n}\n", "import { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { TelvaCommand } from '~types'\n\nexport function resetBounds(app: TelvaApp, ids: string[], pageId: string): TelvaCommand {\n const { currentPageId } = app\n\n const { before, after } = TVDR.mutateShapes(\n app.state,\n ids,\n (shape) => app.getShapeUtil(shape).onDoubleClickBoundsHandle?.(shape),\n pageId\n )\n\n return {\n id: 'reset_bounds',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { Utils } from 'telva-core'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { TVShape, TelvaCommand } from '~types'\n\nconst PI2 = Math.PI * 2\n\nexport function rotateShapes(app: TelvaApp, ids: string[], delta = -PI2 / 4): TelvaCommand | void {\n const { currentPageId } = app\n\n // The shapes for the before patch\n const before: Record<string, Partial<TVShape>> = {}\n\n // The shapes for the after patch\n const after: Record<string, Partial<TVShape>> = {}\n\n // Find the shapes that we want to rotate.\n // We don't rotate groups: we rotate their children instead.\n const shapesToRotate = ids\n .flatMap((id) => {\n const shape = app.getShape(id)\n return shape.children ? shape.children.map((childId) => app.getShape(childId)) : shape\n })\n .filter((shape) => !shape.isLocked)\n\n // Find the common center to all shapes\n // This is the point that we'll rotate around\n const origin = Utils.getBoundsCenter(\n Utils.getCommonBounds(shapesToRotate.map((shape) => TVDR.getBounds(shape)))\n )\n\n // Find the rotate mutations for each shape\n shapesToRotate.forEach((shape) => {\n const change = TVDR.getRotatedShapeMutation(shape, TVDR.getCenter(shape), origin, delta)\n if (!change) return\n before[shape.id] = TVDR.getBeforeShape(shape, change)\n after[shape.id] = change\n })\n\n return {\n id: 'rotate',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { TLBoundsCorner, Utils } from 'telva-core'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { StretchType, TVShapeType } from '~types'\nimport type { TelvaCommand } from '~types'\n\nexport function stretchShapes(app: TelvaApp, ids: string[], type: StretchType): TelvaCommand {\n const { currentPageId, selectedIds } = app\n\n const initialShapes = ids.map((id) => app.getShape(id))\n\n const boundsForShapes = initialShapes.map((shape) => TVDR.getBounds(shape))\n\n const commonBounds = Utils.getCommonBounds(boundsForShapes)\n\n const idsToMutate = ids\n .flatMap((id) => {\n const shape = app.getShape(id)\n return shape.children ? shape.children : shape.id\n })\n .filter((id) => !app.getShape(id).isLocked)\n\n const { before, after } = TVDR.mutateShapes(\n app.state,\n idsToMutate,\n (shape) => {\n const bounds = TVDR.getBounds(shape)\n\n switch (type) {\n case StretchType.Horizontal: {\n const newBounds = {\n ...bounds,\n minX: commonBounds.minX,\n maxX: commonBounds.maxX,\n width: commonBounds.width,\n }\n\n return TVDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n type: TLBoundsCorner.TopLeft,\n scaleX: newBounds.width / bounds.width,\n scaleY: 1,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n })\n }\n case StretchType.Vertical: {\n const newBounds = {\n ...bounds,\n minY: commonBounds.minY,\n maxY: commonBounds.maxY,\n height: commonBounds.height,\n }\n\n return TVDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n type: TLBoundsCorner.TopLeft,\n scaleX: 1,\n scaleY: newBounds.height / bounds.height,\n initialShape: shape,\n transformOrigin: [0.5, 0.5],\n })\n }\n }\n },\n currentPageId\n )\n\n initialShapes.forEach((shape) => {\n if (shape.type === TVShapeType.Group) {\n delete before[shape.id]\n delete after[shape.id]\n }\n })\n\n return {\n id: 'stretch',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: before },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: after },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { Patch, ShapeStyles, TVShape, TVShapeType, TelvaCommand, TextShape } from '~types'\n\nexport function styleShapes(\n app: TelvaApp,\n ids: string[],\n changes: Partial<ShapeStyles>\n): TelvaCommand {\n const { currentPageId, selectedIds } = app\n\n const shapeIdsToMutate = ids\n .flatMap((id) => TVDR.getDocumentBranch(app.state, id, currentPageId))\n .filter((id) => !app.getShape(id).isLocked)\n\n const beforeShapes: Record<string, Patch<TVShape>> = {}\n const afterShapes: Record<string, Patch<TVShape>> = {}\n\n shapeIdsToMutate\n .map((id) => app.getShape(id))\n .filter((shape) => !shape.isLocked)\n .forEach((shape) => {\n beforeShapes[shape.id] = {\n style: {\n ...Object.fromEntries(\n Object.keys(changes).map((key) => [key, shape.style[key as keyof typeof shape.style]])\n ),\n },\n }\n\n afterShapes[shape.id] = {\n style: changes,\n }\n\n if (shape.type === TVShapeType.Text) {\n beforeShapes[shape.id].point = shape.point\n afterShapes[shape.id].point = Vec.toFixed(\n Vec.add(\n shape.point,\n Vec.sub(\n app.getShapeUtil(shape).getCenter(shape),\n app.getShapeUtil(shape).getCenter({\n ...shape,\n style: { ...shape.style, ...changes },\n } as TextShape)\n )\n )\n )\n }\n })\n\n return {\n id: 'style',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: selectedIds,\n },\n },\n },\n appState: {\n currentStyle: { ...app.appState.currentStyle },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n appState: {\n currentStyle: changes,\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state/internal'\nimport { Decoration } from '~types'\nimport type { ArrowShape, Patch, TelvaCommand } from '~types'\n\nexport function toggleShapesDecoration(\n app: TelvaApp,\n ids: string[],\n decorationId: 'start' | 'end'\n): TelvaCommand {\n const { currentPageId, selectedIds } = app\n\n const beforeShapes: Record<string, Patch<ArrowShape>> = Object.fromEntries(\n ids.map((id) => [\n id,\n {\n decorations: {\n [decorationId]: app.getShape<ArrowShape>(id).decorations?.[decorationId],\n },\n },\n ])\n )\n\n const afterShapes: Record<string, Patch<ArrowShape>> = Object.fromEntries(\n ids\n .filter((id) => !app.getShape(id).isLocked)\n .map((id) => [\n id,\n {\n decorations: {\n [decorationId]: app.getShape<ArrowShape>(id).decorations?.[decorationId]\n ? undefined\n : Decoration.Arrow,\n },\n },\n ])\n )\n\n return {\n id: 'toggle_decorations',\n before: {\n document: {\n pages: {\n [currentPageId]: { shapes: beforeShapes },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: { shapes: afterShapes },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state'\nimport type { TVShape, TelvaCommand } from '~types'\n\nexport function toggleShapeProp(app: TelvaApp, ids: string[], prop: keyof TVShape): TelvaCommand {\n const { currentPageId } = app\n\n const initialShapes = ids\n .map((id) => app.getShape(id))\n .filter((shape) => (prop === 'isLocked' ? true : !shape.isLocked))\n\n const isAllToggled = initialShapes.every((shape) => shape[prop])\n\n const before: Record<string, Partial<TVShape>> = {}\n const after: Record<string, Partial<TVShape>> = {}\n\n initialShapes.forEach((shape) => {\n before[shape.id] = { [prop]: shape[prop] }\n after[shape.id] = { [prop]: !isAllToggled }\n })\n\n return {\n id: 'toggle',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: before,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: after,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { PagePartial, TelvaCommand } from '~types'\n\nexport function translateShapes(app: TelvaApp, ids: string[], delta: number[]): TelvaCommand {\n const { currentPageId, selectedIds } = app\n\n // Clear session cache\n app.rotationInfo.selectedIds = [...selectedIds]\n\n const before: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const after: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const idsToMutate = ids\n .flatMap((id) => {\n const shape = app.getShape(id)\n return shape.children ? shape.children : shape.id\n })\n .filter((id) => !app.getShape(id).isLocked)\n\n const change = TVDR.mutateShapes(\n app.state,\n idsToMutate,\n (shape) => ({\n point: Vec.toFixed(Vec.add(shape.point, delta)),\n }),\n currentPageId\n )\n\n before.shapes = change.before\n after.shapes = change.after\n\n // Delete bindings from nudged shapes, unless both bound and bound-to shapes are selected\n const bindingsToDelete = TVDR.getBindings(app.state, currentPageId).filter(\n (binding) => ids.includes(binding.fromId) && !ids.includes(binding.toId)\n )\n\n bindingsToDelete.forEach((binding) => {\n before.bindings[binding.id] = binding\n after.bindings[binding.id] = undefined\n\n for (const id of [binding.toId, binding.fromId]) {\n // Let's also look at the bound shape...\n const shape = app.getShape(id)\n\n if (!shape.handles) continue\n\n // If the bound shape has a handle that references the deleted binding, delete that reference\n\n Object.values(shape.handles)\n .filter((handle) => handle.bindingId === binding.id)\n .forEach((handle) => {\n before.shapes[id] = {\n ...before.shapes[id],\n handles: {\n ...before.shapes[id]?.handles,\n [handle.id]: { bindingId: binding.id },\n },\n }\n after.shapes[id] = {\n ...after.shapes[id],\n handles: { ...after.shapes[id]?.handles, [handle.id]: { bindingId: undefined } },\n }\n })\n }\n })\n\n return {\n id: 'translate',\n before: {\n document: {\n pages: {\n [currentPageId]: before,\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: after,\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: ids,\n },\n },\n },\n },\n }\n}\n", "import { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { GroupShape, Patch, TVBinding, TVShape } from '~types'\nimport type { TelvaCommand } from '~types'\n\nexport function ungroupShapes(\n app: TelvaApp,\n selectedIds: string[],\n groupShapes: GroupShape[],\n pageId: string\n): TelvaCommand | undefined {\n const { bindings } = app\n\n const beforeShapes: Record<string, Patch<TVShape | undefined>> = {}\n const afterShapes: Record<string, Patch<TVShape | undefined>> = {}\n\n const beforeBindings: Record<string, Patch<TVBinding | undefined>> = {}\n const afterBindings: Record<string, Patch<TVBinding | undefined>> = {}\n\n const beforeSelectedIds = selectedIds\n const afterSelectedIds = selectedIds.filter((id) => !groupShapes.find((shape) => shape.id === id))\n\n // The group shape\n groupShapes\n .filter((shape) => !shape.isLocked)\n .forEach((groupShape) => {\n const shapesToReparent: TVShape[] = []\n const deletedGroupIds: string[] = []\n\n // Remove the group shape in the next state\n beforeShapes[groupShape.id] = groupShape\n afterShapes[groupShape.id] = undefined\n\n // Select its children in the next state\n groupShape.children.forEach((id) => {\n afterSelectedIds.push(id)\n const shape = app.getShape(id, pageId)\n shapesToReparent.push(shape)\n })\n\n // We'll start placing the shapes at this childIndex\n const startingChildIndex = groupShape.childIndex\n\n // And we'll need to fit them under this child index\n const endingChildIndex = TVDR.getChildIndexAbove(app.state, groupShape.id, pageId)\n\n const step = (endingChildIndex - startingChildIndex) / shapesToReparent.length\n\n // An array of shapes in order by their child index\n const sortedShapes = shapesToReparent.sort((a, b) => a.childIndex - b.childIndex)\n\n // Reparent shapes to the page\n sortedShapes.forEach((shape, index) => {\n beforeShapes[shape.id] = {\n parentId: shape.parentId,\n childIndex: shape.childIndex,\n }\n\n afterShapes[shape.id] = {\n parentId: pageId,\n childIndex: startingChildIndex + step * index,\n }\n })\n\n // We also need to delete bindings that reference the deleted shapes\n bindings\n .filter((binding) => binding.toId === groupShape.id || binding.fromId === groupShape.id)\n .forEach((binding) => {\n for (const id of [binding.toId, binding.fromId]) {\n // If the binding references the deleted group...\n if (afterShapes[id] === undefined) {\n // Delete the binding\n beforeBindings[binding.id] = binding\n afterBindings[binding.id] = undefined\n\n // Let's also look each the bound shape...\n const shape = app.getShape(id, pageId)\n\n // If the bound shape has a handle that references the deleted binding...\n if (shape.handles) {\n Object.values(shape.handles)\n .filter((handle) => handle.bindingId === binding.id)\n .forEach((handle) => {\n // Save the binding reference in the before patch\n beforeShapes[id] = {\n ...beforeShapes[id],\n handles: {\n ...beforeShapes[id]?.handles,\n [handle.id]: { bindingId: binding.id },\n },\n }\n\n // Unless we're currently deleting the shape, remove the\n // binding reference from the after patch\n if (!deletedGroupIds.includes(id)) {\n afterShapes[id] = {\n ...afterShapes[id],\n handles: {\n ...afterShapes[id]?.handles,\n [handle.id]: { bindingId: undefined },\n },\n }\n }\n })\n }\n }\n }\n })\n })\n\n return {\n id: 'ungroup',\n before: {\n document: {\n pages: {\n [pageId]: {\n shapes: beforeShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: beforeSelectedIds,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [pageId]: {\n shapes: afterShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: afterSelectedIds,\n },\n },\n },\n },\n }\n}\n", "import { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { TVShape, TelvaCommand } from '~types'\n\nexport function updateShapes(\n app: TelvaApp,\n updates: ({ id: string } & Partial<TVShape>)[],\n pageId: string\n): TelvaCommand {\n const ids = updates.map((update) => update.id)\n\n const change = TVDR.mutateShapes(\n app.state,\n ids.filter((id) => !app.getShape(id, pageId).isLocked),\n (_shape, i) => updates[i],\n pageId\n )\n\n return {\n id: 'update',\n before: {\n document: {\n pages: {\n [pageId]: {\n shapes: change.before,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [pageId]: {\n shapes: change.after,\n },\n },\n },\n },\n }\n}\n", "import type { TelvaApp } from '~state'\nimport type { TVShape, TelvaCommand } from '~types'\n\nexport function setShapesProps<T extends TVShape>(\n app: TelvaApp,\n ids: string[],\n partial: Partial<T>\n): TelvaCommand {\n const { currentPageId, selectedIds } = app\n\n const initialShapes = ids\n .map((id) => app.getShape<T>(id))\n .filter((shape) => (partial['isLocked'] ? true : !shape.isLocked))\n\n const before: Record<string, Partial<TVShape>> = {}\n const after: Record<string, Partial<TVShape>> = {}\n\n const keys = Object.keys(partial) as (keyof T)[]\n\n initialShapes.forEach((shape) => {\n before[shape.id] = Object.fromEntries(keys.map((key) => [key, shape[key]]))\n after[shape.id] = partial\n })\n\n return {\n id: 'set_props',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: before,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: after,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds,\n },\n },\n },\n },\n }\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { PagePartial, TVAsset, TVBinding, TVShape, TelvaCommand } from '~types'\n\nexport function insertContent(\n app: TelvaApp,\n content: { shapes: TVShape[]; bindings?: TVBinding[]; assets?: TVAsset[] },\n opts = {} as { point?: number[]; select?: boolean; overwrite?: boolean }\n): TelvaCommand {\n const { currentPageId } = app\n const { point, select, overwrite } = opts\n\n const page = app.document.pages[currentPageId]\n\n const before: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n const afterAssets: Record<string, TVAsset> = {}\n\n const after: PagePartial = {\n shapes: {},\n bindings: {},\n }\n\n if (overwrite) {\n // Map shapes and bindings onto new IDs to avoid overwriting existing content.\n for (const shape of content.shapes) {\n before.shapes[shape.id] = page.shapes[shape.id]\n after.shapes[shape.id] = shape\n }\n if (content.bindings) {\n for (const binding of content.bindings) {\n before.bindings[binding.id] = page.bindings[binding.id]\n after.bindings[binding.id] = binding\n }\n }\n if (content.assets) {\n for (const asset of content.assets) {\n afterAssets[asset.id] = asset\n }\n }\n } else {\n // Map shapes and bindings onto new IDs to avoid overwriting existing content.\n\n const oldToNewIds: Record<string, string> = {}\n\n // The index of the new shape\n let nextIndex = TVDR.getTopChildIndex(app.state, currentPageId)\n\n const shapesToInsert: TVShape[] = content.shapes\n .sort((a, b) => a.childIndex - b.childIndex)\n .map((shape) => {\n const newShapeId = Utils.uniqueId()\n oldToNewIds[shape.id] = newShapeId\n\n // The redo should include a clone of the new shape\n return {\n ...Utils.deepClone(shape),\n id: newShapeId,\n }\n })\n\n const visited = new Set<string>()\n\n // Iterate through the list, starting from the front\n while (shapesToInsert.length > 0) {\n const shape = shapesToInsert.shift()\n\n if (!shape) break\n\n visited.add(shape.id)\n\n if (shape.parentId === 'currentPageId') {\n shape.parentId = currentPageId\n shape.childIndex = nextIndex++\n } else {\n // The shape had another shape as its parent.\n\n // Re-assign the shape's parentId to the new id\n shape.parentId = oldToNewIds[shape.parentId]\n\n // Has that parent been added yet to the after object?\n const parent = after.shapes[shape.parentId]\n\n if (!parent) {\n if (visited.has(shape.id)) {\n // If we've already visited this shape, then that means\n // its parent was not among the shapes to insert. Set it\n // to be a child of the current page instead.\n shape.parentId = 'currentPageId'\n }\n\n // If the parent hasn't been added yet, push this shape\n // to back of the queue; we'll try and add it again later\n shapesToInsert.push(shape)\n continue\n }\n\n // If we've found the parent, add this shape's id to its children\n parent.children!.push(shape.id)\n }\n\n // If the inserting shape has its own children, set the children to\n // an empty array; we'll add them later, as just shown above\n if (shape.children) {\n shape.children = []\n }\n\n // The undo should remove the inserted shape\n before.shapes[shape.id] = undefined\n\n // The redo should include the inserted shape\n after.shapes[shape.id] = shape\n }\n\n Object.values(after.shapes).forEach((shape) => {\n // If the shape used to have children, but no longer does have children,\n // then delete the shape. This prevents inserting groups without children.\n if (shape!.children && shape!.children.length === 0) {\n delete before.shapes[shape!.id!]\n delete after.shapes[shape!.id!]\n }\n })\n\n // Insert bindings\n if (content.bindings) {\n content.bindings.forEach((binding) => {\n const newBindingId = Utils.uniqueId()\n oldToNewIds[binding.id] = newBindingId\n\n const toId = oldToNewIds[binding.toId]\n const fromId = oldToNewIds[binding.fromId]\n\n // If the binding is \"to\" or \"from\" a shape that hasn't been inserted,\n // we'll need to skip the binding and remove it from any shape that\n // references it.\n if (!toId || !fromId) {\n if (fromId) {\n const handles = after.shapes[fromId]!.handles\n if (handles) {\n Object.values(handles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = undefined\n }\n })\n }\n }\n\n if (toId) {\n const handles = after.shapes[toId]!.handles\n if (handles) {\n Object.values(handles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = undefined\n }\n })\n }\n }\n\n return\n }\n\n // Update the shape's to and from references to the new bindingid\n\n const fromHandles = after.shapes[fromId]!.handles\n if (fromHandles) {\n Object.values(fromHandles).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = newBindingId\n }\n })\n }\n\n const toHandles = after.shapes[toId]!.handles\n if (toHandles) {\n Object.values(after.shapes[toId]!.handles!).forEach((handle) => {\n if (handle!.bindingId === binding.id) {\n handle!.bindingId = newBindingId\n }\n })\n }\n\n const newBinding = {\n ...Utils.deepClone(binding),\n id: newBindingId,\n toId,\n fromId,\n }\n\n // The undo should remove the inserted binding\n before.bindings[newBinding.id] = undefined\n\n // The redo should include the inserted binding\n after.bindings[newBinding.id] = newBinding\n })\n }\n\n // Now move the shapes\n\n const shapesToMove = Object.values(after.shapes) as TVShape[]\n\n if (shapesToMove.length > 0) {\n if (point) {\n // Move the shapes so that they're centered on the given point\n const commonBounds = Utils.getCommonBounds(\n shapesToMove.map((shape) => TVDR.getBounds(shape))\n )\n const center = Utils.getBoundsCenter(commonBounds)\n shapesToMove.forEach((shape) => {\n if (!shape.point) return\n shape.point = Vec.sub(point, Vec.sub(center, shape.point))\n })\n } else {\n const commonBounds = Utils.getCommonBounds(shapesToMove.map(TVDR.getBounds))\n\n if (\n !(\n Utils.boundsContain(app.viewport, commonBounds) ||\n Utils.boundsCollide(app.viewport, commonBounds)\n )\n ) {\n const center = Vec.toFixed(app.getPagePoint(app.centerPoint))\n\n const centeredBounds = Utils.centerBounds(commonBounds, center)\n\n const delta = Vec.sub(\n Utils.getBoundsCenter(centeredBounds),\n Utils.getBoundsCenter(commonBounds)\n )\n\n shapesToMove.forEach((shape) => {\n shape.point = Vec.toFixed(Vec.add(shape.point, delta))\n })\n }\n }\n }\n if (content.assets) {\n for (const asset of content.assets) {\n afterAssets[asset.id] = asset\n }\n }\n }\n\n const elm = document.createElement('textarea')\n\n Object.values(after.shapes as Record<string, TVShape>).forEach((shape) => {\n if ('text' in shape) {\n elm.innerHTML = shape.text\n shape.text = elm.value\n }\n\n if ('label' in shape) {\n elm.innerHTML = shape.label!\n shape.label = elm.value\n }\n })\n\n elm.remove()\n\n return {\n id: 'insert',\n before: {\n document: {\n pages: {\n [currentPageId]: before,\n },\n pageStates: {\n [currentPageId]: { selectedIds: [...app.selectedIds] },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: after,\n },\n assets: afterAssets,\n pageStates: {\n [currentPageId]: {\n selectedIds: select ? Object.keys(after.shapes) : [...app.selectedIds],\n },\n },\n },\n },\n }\n}\n", "export * from './migrate'\nexport * from './filesystem'\nexport * from 'browser-fs-access'\n", "import {\n Decoration,\n FontStyle,\n TVExportBackground,\n TVShapeType,\n TVSnapshot,\n TextShape,\n} from '~types'\n\nexport function migrate(state: TVSnapshot, newVersion: number): TVSnapshot {\n const { document, settings } = state\n const { version = 0 } = document\n\n if (!('assets' in document)) {\n document.assets = {}\n }\n\n // Remove unused assets when loading a document\n const assetIdsInUse = new Set<string>()\n\n Object.values(document.pages).forEach((page) =>\n Object.values(page.shapes).forEach((shape) => {\n const { parentId, children, assetId } = shape\n\n if (assetId) {\n assetIdsInUse.add(assetId)\n }\n\n // Fix missing parent bug\n if (parentId !== page.id && !page.shapes[parentId]) {\n console.warn('Encountered a shape with a missing parent!')\n shape.parentId = page.id\n }\n\n if (shape.type === TVShapeType.Group && children) {\n children.forEach((childId) => {\n if (!page.shapes[childId]) {\n console.warn('Encountered a parent with a missing child!', shape.id, childId)\n children?.splice(children.indexOf(childId), 1)\n }\n })\n\n // TODO: Remove the shape if it has no children\n }\n })\n )\n\n Object.keys(document.assets).forEach((assetId) => {\n if (!assetIdsInUse.has(assetId)) {\n delete document.assets[assetId]\n }\n })\n\n if (version !== newVersion) {\n if (version < 14) {\n Object.values(document.pages).forEach((page) => {\n Object.values(page.shapes)\n .filter((shape) => shape.type === TVShapeType.Text)\n .forEach((shape) => (shape as TextShape).style.font === FontStyle.Script)\n })\n }\n\n // Lowercase styles, move binding meta to binding\n if (version <= 13) {\n Object.values(document.pages).forEach((page) => {\n Object.values(page.bindings).forEach((binding) => {\n Object.assign(binding, (binding as any).meta)\n })\n\n Object.values(page.shapes).forEach((shape) => {\n Object.entries(shape.style).forEach(([id, style]) => {\n if (typeof style === 'string') {\n // @ts-ignore\n shape.style[id] = style.toLowerCase()\n }\n })\n\n if (shape.type === TVShapeType.Arrow) {\n if (shape.decorations) {\n Object.entries(shape.decorations).forEach(([id, decoration]) => {\n if ((decoration as unknown) === 'Arrow') {\n shape.decorations = {\n ...shape.decorations,\n [id]: Decoration.Arrow,\n }\n }\n })\n }\n }\n })\n })\n }\n\n // Add document name and file system handle\n if (version <= 13.1) {\n document.name = 'New Document'\n }\n\n if (version < 15) {\n document.assets = {}\n }\n\n Object.values(document.pages).forEach((page) => {\n Object.values(page.shapes).forEach((shape) => {\n if (version < 15.2) {\n if (shape.type === TVShapeType.Image || shape.type === TVShapeType.Video) {\n shape.style.isFilled = true\n }\n }\n\n if (version < 15.3) {\n if (\n shape.type === TVShapeType.Rectangle ||\n shape.type === TVShapeType.Triangle ||\n shape.type === TVShapeType.Ellipse ||\n shape.type === TVShapeType.Arrow\n ) {\n shape.label = (shape as any).text || ''\n shape.labelPoint = [0.5, 0.5]\n }\n }\n })\n })\n\n if (version < 15.4) {\n settings.dockPosition = 'bottom'\n }\n\n if (version < 15.5) {\n settings.exportBackground = TVExportBackground.Transparent\n }\n }\n\n // Cleanup\n Object.values(document.pageStates).forEach((pageState) => {\n pageState.selectedIds = pageState.selectedIds.filter((id) => {\n return document.pages[pageState.id].shapes[id] !== undefined\n })\n pageState.bindingId = undefined\n pageState.editingId = undefined\n pageState.hoveredId = undefined\n pageState.pointedId = undefined\n })\n\n // \u2500\u2500 Repair Arrow shapes that are missing handles (e.g. loaded from .tld) \u2500\u2500\n Object.values(document.pages).forEach((page) => {\n Object.values(page.shapes).forEach((shape) => {\n if (shape.type === TVShapeType.Arrow) {\n const arrow = shape as any\n if (!arrow.handles || !arrow.handles.start || !arrow.handles.end || !arrow.handles.bend) {\n const startPt: number[] = arrow.handles?.start?.point ?? [0, 0]\n const endPt: number[] = arrow.handles?.end?.point ?? [100, 0]\n const bendPt: number[] = arrow.handles?.bend?.point ?? [\n (startPt[0] + endPt[0]) / 2,\n (startPt[1] + endPt[1]) / 2,\n ]\n arrow.handles = {\n start: { id: 'start', index: 0, point: startPt, canBind: true, ...arrow.handles?.start },\n bend: { id: 'bend', index: 1, point: bendPt, ...arrow.handles?.bend },\n end: { id: 'end', index: 2, point: endPt, canBind: true, ...arrow.handles?.end },\n }\n }\n // Ensure bend scalar exists\n if (typeof arrow.bend !== 'number') {\n arrow.bend = 0\n }\n }\n })\n })\n\n document.version = newVersion\n\n return state\n}\n", "import { fileOpen, fileSave, supported } from 'browser-fs-access'\nimport type { FileSystemHandle } from 'browser-fs-access'\nimport { get as getFromIdb, set as setToIdb } from 'idb-keyval'\nimport { FILE_EXTENSION, IMAGE_EXTENSIONS, VIDEO_EXTENSIONS } from '~constants'\nimport type { TVDocument, TVFile } from '~types'\n\nconst options = { mode: 'readwrite' as const }\n\nconst checkPermissions = async (handle: FileSystemFileHandle) => {\n return (\n (await (handle as unknown as FileSystemHandle).queryPermission(options)) === 'granted' ||\n (await (handle as unknown as FileSystemHandle).requestPermission(options)) === 'granted'\n )\n}\n\nexport async function loadFileHandle() {\n if (typeof Window === 'undefined' || !('_location' in Window)) return\n const fileHandle = await getFromIdb(`Telva_file_handle_${window.location.origin}`)\n if (!fileHandle) return null\n return fileHandle\n}\n\nexport async function saveFileHandle(fileHandle: FileSystemFileHandle | null) {\n return setToIdb(`Telva_file_handle_${window.location.origin}`, fileHandle)\n}\n\n// \u2500\u2500\u2500 tldraw v2 \u2194 TVDocument conversion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Minimal tldraw v2 file schema used when saving / loading .tld files */\nconst TLD_SCHEMA = {\n schemaVersion: 1,\n storeVersion: 4,\n recordVersions: {\n asset: { version: 1, subTypeKey: 'type', subTypeVersions: { image: 2, video: 2, bookmark: 0 } },\n camera: { version: 1 },\n document: { version: 2 },\n instance: { version: 22 },\n instance_page_state: { version: 5 },\n page: { version: 1 },\n shape: { version: 3, subTypeKey: 'type', subTypeVersions: {} },\n instance_presence: { version: 5 },\n pointer: { version: 1 },\n },\n}\n\n/**\n * Convert a TVDocument to tldraw v2 JSON format (records-based).\n * The TVDocument is also embedded inside the document record as `telvaDocument`\n * so round-trips are lossless.\n */\nexport function tvDocumentToTldrawFile(document: TVDocument): object {\n const records: object[] = []\n\n // document record\n records.push({\n gridSize: 10,\n name: document.name || '',\n meta: {},\n id: 'document:document',\n typeName: 'document',\n // embed original for lossless round-trip\n telvaDocument: document,\n })\n\n let pageIndex = 0\n for (const pageId of Object.keys(document.pages)) {\n const page = document.pages[pageId]\n const pageState = document.pageStates[pageId]\n const indexStr = `a${pageIndex + 1}`\n\n // page record\n records.push({\n meta: {},\n id: `page:${pageId}`,\n name: (page as any).name || `Page ${pageIndex + 1}`,\n index: indexStr,\n typeName: 'page',\n })\n\n // instance_page_state record\n records.push({\n editingShapeId: null,\n croppingShapeId: null,\n selectedShapeIds: pageState?.selectedIds ?? [],\n hoveredShapeId: null,\n erasingShapeIds: [],\n hintingShapeIds: [],\n focusedGroupId: null,\n meta: {},\n id: `instance_page_state:page:${pageId}`,\n pageId: `page:${pageId}`,\n typeName: 'instance_page_state',\n })\n\n // shape records\n const shapes = page.shapes ?? {}\n let shapeIdx = 0\n for (const shapeId of Object.keys(shapes)) {\n const shape = (shapes as any)[shapeId]\n const { point, rotation, style, type, ...rest } = shape\n records.push({\n x: point?.[0] ?? 0,\n y: point?.[1] ?? 0,\n rotation: rotation ?? 0,\n isLocked: (shape as any).isLocked ?? false,\n opacity: style?.opacity ?? 1,\n meta: {},\n id: `shape:${shapeId}`,\n parentId: `page:${pageId}`,\n type,\n props: { ...rest, ...style },\n index: `a${shapeIdx + 1}`,\n typeName: 'shape',\n })\n shapeIdx++\n }\n\n pageIndex++\n }\n\n return {\n tldrawFileFormatVersion: 1,\n schema: TLD_SCHEMA,\n records,\n }\n}\n\n/**\n * Convert a tldraw v2 records file back into a TVDocument.\n * If the file has an embedded `telvaDocument` (saved by this app), it is used\n * for a lossless round-trip. Otherwise a best-effort conversion is done.\n */\nexport function tldrawFileToTVDocument(tldFile: any): TVDocument {\n const records: any[] = tldFile.records ?? []\n\n // --- lossless round-trip via embedded telvaDocument ---\n const docRecord = records.find((r: any) => r.typeName === 'document')\n if (docRecord?.telvaDocument) {\n return docRecord.telvaDocument as TVDocument\n }\n\n // --- best-effort conversion ---\n const pageRecords = records.filter((r: any) => r.typeName === 'page')\n const shapeRecords = records.filter((r: any) => r.typeName === 'shape')\n const pageStateRecords = records.filter((r: any) => r.typeName === 'instance_page_state')\n\n const pages: TVDocument['pages'] = {}\n const pageStates: TVDocument['pageStates'] = {}\n\n for (const pr of pageRecords) {\n // page IDs in tldraw v2 look like \"page:pageId\" \u2013 strip the prefix\n const rawId = pr.id.startsWith('page:') ? pr.id.slice(5) : pr.id\n\n // shapes belonging to this page\n const shapesForPage: Record<string, any> = {}\n for (const sr of shapeRecords) {\n const expectedParent = `page:${rawId}`\n if (sr.parentId !== expectedParent && sr.parentId !== rawId) continue\n\n const rawShapeId = sr.id.startsWith('shape:') ? sr.id.slice(6) : sr.id\n const { props = {}, x, y, rotation, type } = sr\n const { opacity, start, end, bend, arrowheadStart, arrowheadEnd, ...restProps } = props\n\n const base: Record<string, any> = {\n id: rawShapeId,\n type,\n point: [x ?? 0, y ?? 0],\n rotation: rotation ?? 0,\n style: { opacity: opacity ?? 1, ...restProps },\n ...restProps,\n }\n\n // Arrow shapes: reconstruct top-level `handles` from tld props\n if (type === 'arrow') {\n const startPt = start?.x !== undefined ? [start.x, start.y] : [0, 0]\n const endPt = end?.x !== undefined ? [end.x, end.y] : [1, 1]\n const bendVal = typeof bend === 'number' ? bend : 0\n // mid-point for bend handle\n const bendPt = [\n (startPt[0] + endPt[0]) / 2,\n (startPt[1] + endPt[1]) / 2,\n ]\n base.handles = {\n start: {\n id: 'start',\n index: 0,\n point: startPt,\n canBind: true,\n bindingId: start?.boundShapeId\n ? Object.keys(shapesForPage).find(() => true) // will be resolved by loadDocument\n : undefined,\n },\n bend: { id: 'bend', index: 1, point: bendPt },\n end: {\n id: 'end',\n index: 2,\n point: endPt,\n canBind: true,\n bindingId: end?.boundShapeId ? end.boundShapeId : undefined,\n },\n }\n base.bend = bendVal\n if (arrowheadStart || arrowheadEnd) {\n base.decorations = {\n start: arrowheadStart && arrowheadStart !== 'none' ? arrowheadStart : undefined,\n end: arrowheadEnd && arrowheadEnd !== 'none' ? arrowheadEnd : undefined,\n }\n }\n }\n\n shapesForPage[rawShapeId] = base\n }\n\n pages[rawId] = {\n id: rawId,\n name: pr.name || `Page`,\n shapes: shapesForPage,\n bindings: {},\n } as any\n\n // page state\n const ps = pageStateRecords.find(\n (r: any) => r.pageId === `page:${rawId}` || r.pageId === rawId\n )\n pageStates[rawId] = {\n id: rawId,\n selectedIds: ps?.selectedShapeIds ?? [],\n camera: { point: [0, 0], zoom: 1 },\n } as any\n }\n\n // Fallback: if no pages were found create an empty one\n if (Object.keys(pages).length === 0) {\n const pid = 'page'\n pages[pid] = { id: pid, name: 'Page 1', shapes: {}, bindings: {} } as any\n pageStates[pid] = { id: pid, selectedIds: [], camera: { point: [0, 0], zoom: 1 } } as any\n }\n\n return {\n id: 'document',\n name: docRecord?.name || 'Imported Document',\n version: 15,\n pages,\n pageStates,\n assets: {},\n }\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function saveToFileSystem(\n document: TVDocument,\n fileHandle: FileSystemFileHandle | null,\n name?: string,\n format?: 'tldr' | 'tld'\n) {\n const ext = format === 'tld' ? '.tld' : FILE_EXTENSION\n\n let json: string\n let mimeType: string\n\n if (format === 'tld') {\n // Save in tldraw v2 records format\n const tldFile = tvDocumentToTldrawFile(document)\n json =\n process.env.NODE_ENV === 'production'\n ? JSON.stringify(tldFile)\n : JSON.stringify(tldFile, null, 2)\n mimeType = 'application/vnd.tldraw+json'\n } else {\n // Default: save in TVFile format\n const file: TVFile = {\n name: document.name || 'New Document',\n fileHandle: fileHandle ?? null,\n document,\n }\n json =\n process.env.NODE_ENV === 'production' ? JSON.stringify(file) : JSON.stringify(file, null, 2)\n mimeType = 'application/vnd.Telva+json'\n }\n\n const blob = new Blob([json], { type: mimeType })\n\n if (fileHandle) {\n const hasPermissions = await checkPermissions(fileHandle)\n if (!hasPermissions) return null\n }\n\n const docName = document.name || 'New Document'\n const filename = !supported && name?.length ? name : docName\n\n const newFileHandle = await fileSave(\n blob,\n {\n fileName: `${filename}${ext}`,\n description: format === 'tld' ? 'TLDraw File' : 'Telva File',\n extensions: [ext],\n },\n fileHandle\n )\n\n await saveFileHandle(newFileHandle)\n return newFileHandle\n}\n\nexport async function openFromFileSystem(): Promise<null | {\n fileHandle: FileSystemFileHandle | null\n document: TVDocument\n}> {\n // Accept both .tldr (native Telva) and .tld (tldraw v2) files\n const blob = await fileOpen({\n description: 'Telva / TLDraw File',\n extensions: [FILE_EXTENSION, '.tld'],\n multiple: false,\n })\n\n if (!blob) return null\n\n // Read JSON text\n const json: string = await new Promise((resolve) => {\n const reader = new FileReader()\n reader.onloadend = () => {\n if (reader.readyState === FileReader.DONE) {\n resolve(reader.result as string)\n }\n }\n reader.readAsText(blob, 'utf8')\n })\n\n const parsed = JSON.parse(json)\n\n // \u2500\u2500 tldraw v2 format \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if ('tldrawFileFormatVersion' in parsed) {\n const fileHandle = blob.handle ?? null\n await saveFileHandle(fileHandle)\n return {\n fileHandle,\n document: tldrawFileToTVDocument(parsed),\n }\n }\n\n // \u2500\u2500 legacy telvaFileFormatVersion warning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if ('telvaFileFormatVersion' in parsed) {\n alert('This file was created in a newer version of Telva. Please visit beta.telva.com to open it.')\n return null\n }\n\n // \u2500\u2500 native TVFile format \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const file: TVFile = parsed\n const fileHandle = blob.handle ?? null\n await saveFileHandle(fileHandle)\n return {\n fileHandle,\n document: file.document,\n }\n}\n\nexport async function openAssetsFromFileSystem() {\n return fileOpen({\n description: 'Image or Video',\n extensions: [...IMAGE_EXTENSIONS, ...VIDEO_EXTENSIONS],\n multiple: true,\n })\n}\n\nexport function fileToBase64(file: Blob): Promise<string | ArrayBuffer | null> {\n return new Promise((resolve, reject) => {\n if (file) {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n reader.onload = () => resolve(reader.result)\n reader.onerror = (error) => reject(error)\n reader.onabort = (error) => reject(error)\n }\n })\n}\n\nexport function fileToText(file: Blob): Promise<string | ArrayBuffer | null> {\n return new Promise((resolve, reject) => {\n if (file) {\n const reader = new FileReader()\n reader.readAsText(file)\n reader.onload = () => resolve(reader.result)\n reader.onerror = (error) => reject(error)\n reader.onabort = (error) => reject(error)\n }\n })\n}\n\nexport function getImageSizeFromSrc(src: string): Promise<number[]> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve([img.width, img.height])\n img.onerror = () => reject(new Error('Could not get image size'))\n img.src = src\n })\n}\n\nexport function getVideoSizeFromSrc(src: string): Promise<number[]> {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video')\n video.onloadedmetadata = () => resolve([video.videoWidth, video.videoHeight])\n video.onerror = () => reject(new Error('Could not get video size'))\n video.src = src\n })\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { deepCopy } from '~state/StateManager/copy'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { shapeUtils } from '~state/shapes'\nimport {\n ArrowBinding,\n ArrowShape,\n SessionType,\n TVBinding,\n TVShape,\n TVShapeType,\n TVStatus,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\n\nexport class ArrowSession extends BaseSession {\n type = SessionType.Arrow\n performanceMode = undefined\n status = TVStatus.TranslatingHandle\n newStartBindingId = Utils.uniqueId()\n draggedBindingId = Utils.uniqueId()\n didBind = false\n initialShape: ArrowShape\n handleId: 'start' | 'end'\n bindableShapeIds: string[]\n initialBinding?: TVBinding\n startBindingShapeId?: string\n isCreate: boolean\n\n constructor(app: TelvaApp, shapeId: string, handleId: 'start' | 'end', isCreate = false) {\n super(app)\n\n this.isCreate = isCreate\n\n const { currentPageId } = app.state.appState\n\n const page = app.state.document.pages[currentPageId]\n\n this.handleId = handleId\n\n this.initialShape = deepCopy(page.shapes[shapeId] as ArrowShape)\n\n this.bindableShapeIds = TVDR.getBindableShapeIds(app.state).filter(\n (id) => !(id === this.initialShape.id || id === this.initialShape.parentId)\n )\n\n // TODO: find out why this the oppositeHandleBindingId is sometimes missing\n const oppositeHandleBindingId =\n this.initialShape.handles[handleId === 'start' ? 'end' : 'start']?.bindingId\n\n if (oppositeHandleBindingId) {\n const oppositeToId = page.bindings[oppositeHandleBindingId]?.toId\n if (oppositeToId) {\n this.bindableShapeIds = this.bindableShapeIds.filter((id) => id !== oppositeToId)\n }\n }\n\n const { originPoint } = this.app\n\n if (this.isCreate) {\n // If we're creating a new shape, should we bind its first point?\n // The method may return undefined, which is correct if there is no\n // bindable shape under the pointer.\n this.startBindingShapeId = this.bindableShapeIds\n .map((id) => page.shapes[id])\n .filter(\n (shape) =>\n !shape.isLocked &&\n Utils.pointInBounds(originPoint, TVDR.getShapeUtil(shape).getBounds(shape))\n )\n .sort((a, b) => {\n // TODO - We should be smarter here, what's the right logic?\n return b.childIndex - a.childIndex\n })[0]?.id\n\n if (this.startBindingShapeId) {\n this.bindableShapeIds.splice(this.bindableShapeIds.indexOf(this.startBindingShapeId), 1)\n }\n } else {\n // If we're editing an existing line, is there a binding already\n // for the dragging handle?\n const initialBindingId = this.initialShape.handles[this.handleId].bindingId\n\n if (initialBindingId) {\n this.initialBinding = page.bindings[initialBindingId]\n } else {\n // If not, explicitly set this handle to undefined, so that it gets deleted on undo\n this.initialShape.handles[this.handleId].bindingId = undefined\n }\n }\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const { initialShape } = this\n const {\n currentPoint,\n shiftKey,\n altKey,\n metaKey,\n currentGrid,\n settings: { showGrid },\n } = this.app\n\n const shape = this.app.getShape<ArrowShape>(initialShape.id)\n\n if (shape.isLocked) return\n\n const { handles } = initialShape\n\n const handleId = this.handleId as keyof typeof handles\n // If the handle can bind, then we need to search bindable shapes for\n // a binding.\n if (!handles[handleId].canBind) return\n\n // Find the delta (in shape space)\n let delta = Vec.sub(currentPoint, Vec.add(handles[handleId].point, initialShape.point))\n\n if (shiftKey) {\n const A = altKey\n ? Vec.med(handles.start.point, handles.end.point)\n : handles[handleId === 'start' ? 'end' : 'start'].point\n const B = handles[handleId].point\n const C = Vec.add(B, delta)\n\n const angle = Vec.angle(A, C)\n\n const adjusted = Vec.rotWith(C, A, Utils.snapAngleToSegments(angle, 24) - angle)\n\n delta = Vec.add(delta, Vec.sub(adjusted, C))\n }\n\n const nextPoint = Vec.add(handles[handleId].point, delta)\n\n const handleChanges = {\n [handleId]: {\n ...handles[handleId],\n point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n bindingId: undefined,\n },\n }\n\n // if (altKey) {\n // // If the user is holding alt key, apply the inverse delta\n // // to the oppoosite handle.\n // const oppositeHandleId = handleId === 'start' ? 'end' : 'start'\n\n // const nextPoint = Vec.sub(handles[oppositeHandleId].point, delta)\n\n // handleChanges[oppositeHandleId] = {\n // ...handles[oppositeHandleId],\n // point: showGrid ? Vec.snap(nextPoint, currentGrid) : Vec.toFixed(nextPoint),\n // bindingId: undefined,\n // }\n // }\n\n const utils = shapeUtils[TVShapeType.Arrow]\n const handleChange = utils.onHandleChange?.(initialShape, handleChanges)\n\n // If the handle changed produced no change, bail here\n if (!handleChange) return\n\n // If nothing changes, we want these to be the same object reference as\n // before. If it does change, we'll redefine this later on. And if we've\n // made it this far, the shape should be a new object reference that\n // incorporates the changes we've made due to the handle movement.\n const next: { shape: ArrowShape; bindings: Record<string, TVBinding | undefined> } = {\n shape: Utils.deepMerge(shape, handleChange),\n bindings: {},\n }\n\n let draggedBinding: ArrowBinding | undefined\n\n const draggingHandle = next.shape.handles[this.handleId]\n\n const oppositeHandle = next.shape.handles[this.handleId === 'start' ? 'end' : 'start']\n\n // START BINDING\n // If we have a start binding shape id, the recompute the binding\n // point based on the current end handle position\n if (this.startBindingShapeId) {\n let nextStartBinding: ArrowBinding | undefined\n\n const startTarget = this.app.page.shapes[this.startBindingShapeId]\n\n const startTargetUtils = TVDR.getShapeUtil(startTarget)\n\n const center = startTargetUtils.getCenter(startTarget)\n\n const startHandle = next.shape.handles.start\n\n const endHandle = next.shape.handles.end\n\n const rayPoint = Vec.add(startHandle.point, next.shape.point)\n\n if (Vec.isEqual(rayPoint, center)) rayPoint[1]++ // Fix bug where ray and center are identical\n\n const rayOrigin = center\n\n const isInsideShape = startTargetUtils.hitTestPoint(startTarget, currentPoint)\n\n const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n\n const hasStartBinding = this.app.getBinding(this.newStartBindingId) !== undefined\n\n // Don't bind the start handle if both handles are inside of the target shape.\n if (\n !metaKey &&\n !startTargetUtils.hitTestPoint(startTarget, Vec.add(next.shape.point, endHandle.point))\n ) {\n nextStartBinding = this.findBindingPoint(\n shape,\n startTarget,\n 'start',\n this.newStartBindingId,\n center,\n rayOrigin,\n rayDirection,\n isInsideShape\n )\n }\n\n if (nextStartBinding && !hasStartBinding) {\n // Bind the arrow's start handle to the start target\n this.didBind = true\n\n next.bindings[this.newStartBindingId] = nextStartBinding\n\n next.shape = Utils.deepMerge(next.shape, {\n handles: {\n start: {\n bindingId: nextStartBinding.id,\n },\n },\n })\n } else if (!nextStartBinding && hasStartBinding) {\n // Remove the start binding\n this.didBind = false\n\n next.bindings[this.newStartBindingId] = undefined\n\n next.shape = Utils.deepMerge(initialShape, {\n handles: {\n start: {\n bindingId: undefined,\n },\n },\n })\n }\n }\n\n // DRAGGED POINT BINDING\n if (!metaKey) {\n const rayOrigin = Vec.add(oppositeHandle.point, next.shape.point)\n\n const rayPoint = Vec.add(draggingHandle.point, next.shape.point)\n\n const rayDirection = Vec.uni(Vec.sub(rayPoint, rayOrigin))\n\n const startPoint = Vec.add(next.shape.point!, next.shape.handles!.start.point!)\n\n const endPoint = Vec.add(next.shape.point!, next.shape.handles!.end.point!)\n\n const targets = this.bindableShapeIds\n .map((id) => this.app.page.shapes[id])\n .sort((a, b) => b.childIndex - a.childIndex)\n .filter((shape) => {\n if (shape.isLocked) return false\n const utils = TVDR.getShapeUtil(shape)\n return ![startPoint, endPoint].every((point) => utils.hitTestPoint(shape, point))\n })\n\n for (const target of targets) {\n draggedBinding = this.findBindingPoint(\n shape,\n target,\n this.handleId,\n this.draggedBindingId,\n rayPoint,\n rayOrigin,\n rayDirection,\n altKey\n )\n\n if (draggedBinding) break\n }\n }\n\n if (draggedBinding) {\n // Create the dragged point binding\n this.didBind = true\n\n next.bindings[this.draggedBindingId] = draggedBinding\n\n next.shape = Utils.deepMerge(next.shape, {\n handles: {\n [this.handleId]: {\n bindingId: this.draggedBindingId,\n },\n },\n })\n } else {\n // Remove the dragging point binding\n this.didBind = this.didBind || false\n\n const currentBindingId = shape.handles[this.handleId].bindingId\n\n if (currentBindingId !== undefined) {\n next.bindings[currentBindingId] = undefined\n\n next.shape = Utils.deepMerge(next.shape, {\n handles: {\n [this.handleId]: {\n bindingId: undefined,\n },\n },\n })\n }\n }\n\n const change = TVDR.getShapeUtil<ArrowShape>(next.shape).onHandleChange?.(\n next.shape,\n next.shape.handles\n )\n\n return {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [shape.id]: { ...next.shape, ...(change ?? {}) },\n },\n bindings: next.bindings,\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n bindingId: next.shape.handles[handleId].bindingId,\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const { initialShape, initialBinding, newStartBindingId, draggedBindingId } = this\n\n const currentShape = TVDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ArrowShape\n\n const isDeleting =\n this.isCreate ||\n Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point) < 4\n\n const afterBindings: Record<string, TVBinding | undefined> = {}\n\n afterBindings[draggedBindingId] = undefined\n\n if (initialBinding) {\n afterBindings[initialBinding.id] = isDeleting ? undefined : initialBinding\n }\n\n if (newStartBindingId) {\n afterBindings[newStartBindingId] = undefined\n }\n\n return {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [initialShape.id]: isDeleting ? undefined : initialShape,\n },\n bindings: afterBindings,\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: isDeleting ? [] : [initialShape.id],\n bindingId: undefined,\n hoveredId: undefined,\n editingId: undefined,\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const { initialShape, initialBinding, newStartBindingId, startBindingShapeId, handleId } = this\n\n const currentShape = TVDR.onSessionComplete(this.app.page.shapes[initialShape.id]) as ArrowShape\n\n const currentBindingId = currentShape.handles[handleId].bindingId\n\n const length = Vec.dist(currentShape.handles.start.point, currentShape.handles.end.point)\n\n if (!(currentBindingId || initialBinding) && length < 4) return this.cancel()\n\n const beforeBindings: Partial<Record<string, TVBinding>> = {}\n\n const afterBindings: Partial<Record<string, TVBinding>> = {}\n\n if (initialBinding) {\n beforeBindings[initialBinding.id] = this.isCreate ? undefined : initialBinding\n afterBindings[initialBinding.id] = undefined\n }\n\n if (currentBindingId) {\n beforeBindings[currentBindingId] = undefined\n afterBindings[currentBindingId] = this.app.page.bindings[currentBindingId]\n }\n\n if (startBindingShapeId) {\n beforeBindings[newStartBindingId] = undefined\n afterBindings[newStartBindingId] = this.app.page.bindings[newStartBindingId]\n }\n\n return {\n id: 'arrow',\n before: {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [initialShape.id]: this.isCreate ? undefined : initialShape,\n },\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: this.isCreate ? [] : [initialShape.id],\n bindingId: undefined,\n hoveredId: undefined,\n editingId: undefined,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [initialShape.id]: currentShape,\n },\n bindings: afterBindings,\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: [initialShape.id],\n bindingId: undefined,\n hoveredId: undefined,\n editingId: undefined,\n },\n },\n },\n },\n }\n }\n\n private findBindingPoint = (\n shape: ArrowShape,\n target: TVShape,\n handleId: 'start' | 'end',\n bindingId: string,\n point: number[],\n origin: number[],\n direction: number[],\n bindAnywhere: boolean\n ) => {\n const util = TVDR.getShapeUtil<TVShape>(target.type)\n\n const bindingPoint = util.getBindingPoint(\n target,\n shape,\n point, // fix dead center bug\n origin,\n direction,\n bindAnywhere\n )\n\n // Not all shapes will produce a binding point\n if (!bindingPoint) return\n\n return {\n id: bindingId,\n type: 'arrow',\n fromId: shape.id,\n toId: target.id,\n handleId: handleId,\n point: Vec.toFixed(bindingPoint.point),\n distance: bindingPoint.distance,\n }\n }\n}\n", "import type { TLPerformanceMode } from 'telva-core'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport type { SessionType, TelvaCommand, TelvaPatch } from '~types'\n\nexport abstract class BaseSession {\n abstract type: SessionType\n abstract performanceMode: TLPerformanceMode | undefined\n constructor(public app: TelvaApp) {}\n abstract start: () => TelvaPatch | undefined\n abstract update: () => TelvaPatch | undefined\n abstract complete: () => TelvaPatch | TelvaCommand | undefined\n abstract cancel: () => TelvaPatch | undefined\n}\n", "import { TLBounds, Utils } from 'telva-core'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\nexport class BrushSession extends BaseSession {\n type = SessionType.Brush\n performanceMode = undefined\n status = TVStatus.Brushing\n initialSelectedIds: Set<string>\n shapesToTest: {\n id: string\n bounds: TLBounds\n selectId: string\n }[]\n\n constructor(app: TelvaApp) {\n super(app)\n const { currentPageId } = app\n this.initialSelectedIds = new Set(this.app.selectedIds)\n this.shapesToTest = this.app.shapes\n .filter(\n (shape) =>\n !(\n shape.isLocked ||\n shape.isHidden ||\n shape.parentId !== currentPageId ||\n this.initialSelectedIds.has(shape.id) ||\n this.initialSelectedIds.has(shape.parentId)\n )\n )\n .map((shape) => ({\n id: shape.id,\n bounds: this.app.getShapeUtil(shape).getBounds(shape),\n selectId: shape.id, //TVDR.getTopParentId(data, shape.id, currentPageId),\n }))\n\n this.update()\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const {\n initialSelectedIds,\n shapesToTest,\n app: { metaKey, settings, originPoint, currentPoint },\n } = this\n\n // Create a bounding box between the origin and the new point\n const brush = Utils.getBoundsFromPoints([originPoint, currentPoint])\n\n // Decide weather to select by intersecting or by overlapping\n // Using a xor to revers the behaviour if the ctrl key is pressed\n // Do it only if the user choose to enable cad like selection\n const selectByContain = settings.isCadSelectMode\n ? !metaKey && originPoint[0] < currentPoint[0]\n : metaKey\n\n // Find ids of brushed shapes\n const hits = new Set<string>()\n\n const selectedIds = new Set(initialSelectedIds)\n\n shapesToTest.forEach(({ id, selectId }) => {\n const shape = this.app.getShape(id)\n\n if (!hits.has(selectId)) {\n const util = this.app.getShapeUtil(shape)\n if (\n selectByContain\n ? Utils.boundsContain(brush, util.getBounds(shape))\n : util.hitTestBounds(shape, brush)\n ) {\n hits.add(selectId)\n\n // When brushing a shape, select its top group parent.\n if (!selectedIds.has(selectId)) {\n selectedIds.add(selectId)\n }\n } else if (selectedIds.has(selectId)) {\n selectedIds.delete(selectId)\n }\n }\n })\n\n const currentSelectedIds = this.app.selectedIds\n\n const didChange =\n selectedIds.size !== currentSelectedIds.length ||\n currentSelectedIds.some((id) => !selectedIds.has(id))\n\n const afterSelectedIds = didChange ? Array.from(selectedIds.values()) : currentSelectedIds\n\n if (!didChange)\n return {\n appState: {\n selectByContain,\n },\n document: {\n pageStates: {\n [this.app.currentPageId]: {\n brush,\n },\n },\n },\n }\n\n return {\n appState: {\n selectByContain,\n },\n document: {\n pageStates: {\n [this.app.currentPageId]: {\n brush,\n selectedIds: afterSelectedIds,\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n return {\n appState: {\n selectByContain: false,\n },\n document: {\n pageStates: {\n [this.app.currentPageId]: {\n brush: null,\n selectedIds: Array.from(this.initialSelectedIds.values()),\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n return {\n appState: {\n selectByContain: false,\n },\n document: {\n pageStates: {\n [this.app.currentPageId]: {\n brush: null,\n selectedIds: [...this.app.selectedIds],\n },\n },\n },\n }\n }\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { DrawShape, SessionType, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\nexport class DrawSession extends BaseSession {\n type = SessionType.Draw\n performanceMode = undefined\n status = TVStatus.Creating\n topLeft: number[]\n points: number[][]\n initialShape: DrawShape\n lastAdjustedPoint: number[]\n shiftedPoints: number[][] = []\n shapeId: string\n isLocked?: boolean\n isExtending: boolean\n lockedDirection?: 'horizontal' | 'vertical'\n\n constructor(app: TelvaApp, id: string) {\n super(app)\n const { originPoint } = this.app\n this.shapeId = id\n this.initialShape = this.app.getShape<DrawShape>(id)\n this.topLeft = [...this.initialShape.point]\n const currentPoint = [0, 0, originPoint[2] ?? 0.5]\n const delta = Vec.sub(originPoint, this.topLeft)\n const initialPoints = this.initialShape.points.map((pt) => Vec.sub(pt, delta).concat(pt[2]))\n this.isExtending = initialPoints.length > 0\n const newPoints: number[][] = []\n if (this.isExtending) {\n // Continuing with shift\n const prevPoint = initialPoints[initialPoints.length - 1]\n if (prevPoint) {\n newPoints.push(prevPoint, prevPoint)\n const len = Math.floor(Vec.dist(prevPoint, currentPoint) / 16)\n\n if (len > 1) {\n for (let i = 0; i < len; i++) {\n const t = i / (len - 1)\n newPoints.push(Vec.lrp(prevPoint, currentPoint, t).concat(prevPoint[2]))\n }\n } else {\n newPoints.push(currentPoint, currentPoint)\n }\n }\n } else {\n newPoints.push(currentPoint)\n }\n // Add a first point but don't update the shape yet. We'll update\n // when the draw session ends; if the user hasn't added additional\n // points, this single point will be interpreted as a \"dot\" shape.\n this.points = [...initialPoints, ...newPoints]\n this.shiftedPoints = this.points.map((pt) => Vec.add(pt, delta).concat(pt[2]))\n this.lastAdjustedPoint = this.points[this.points.length - 1]\n }\n\n start = () => {\n const currentPoint = this.app.originPoint\n const newAdjustedPoint = [0, 0, currentPoint[2] ?? 0.5]\n // Add the new adjusted point to the points array\n this.points.push(newAdjustedPoint)\n const topLeft = [\n Math.min(this.topLeft[0], currentPoint[0]),\n Math.min(this.topLeft[1], currentPoint[1]),\n ]\n const delta = Vec.sub(topLeft, currentPoint)\n this.topLeft = topLeft\n this.shiftedPoints = this.points.map((pt) => Vec.toFixed(Vec.sub(pt, delta)).concat(pt[2]))\n\n return {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [this.shapeId]: {\n point: this.topLeft,\n points: this.shiftedPoints,\n },\n },\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: [this.shapeId],\n },\n },\n },\n }\n }\n\n update = (): TelvaPatch | undefined => {\n const { shapeId } = this\n const { currentPoint, originPoint, shiftKey, zoom } = this.app\n\n // Even if we're not locked yet, we base the future locking direction\n // on the first dimension to reach a threshold, or the bigger dimension\n // once one or both dimensions have reached the threshold.\n if (!this.lockedDirection && this.points.length > 1) {\n const delta = Vec.sub(currentPoint, originPoint)\n if (Vec.len(delta) > 3 / zoom) {\n this.lockedDirection = Math.abs(delta[0]) > Math.abs(delta[1]) ? 'horizontal' : 'vertical'\n }\n }\n\n // Drawing while holding shift will \"lock\" the pen to either the\n // x or y axis, depending on the locking direction.\n if (shiftKey) {\n if (!this.isLocked && this.points.length > 2) {\n // If we're locking before knowing what direction we're in, set it\n // early based on the bigger dimension.\n if (!this.lockedDirection) {\n const delta = Vec.sub(currentPoint, originPoint)\n if (Vec.len(delta) > 3 / zoom) {\n this.lockedDirection =\n Math.abs(delta[0]) > Math.abs(delta[1]) ? 'horizontal' : 'vertical'\n }\n }\n\n this.isLocked = true\n // Start locking\n const returning = [...this.lastAdjustedPoint]\n\n if (this.lockedDirection === 'vertical') {\n returning[0] = 0\n } else {\n returning[1] = 0\n }\n\n this.points.push(returning.concat(currentPoint[2]))\n }\n } else if (this.isLocked) {\n this.isLocked = false\n }\n\n if (this.isLocked) {\n if (this.lockedDirection === 'vertical') {\n currentPoint[0] = originPoint[0]\n } else {\n currentPoint[1] = originPoint[1]\n }\n }\n\n const change = this.addPoint(currentPoint)\n\n if (!change) return\n\n return {\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: {\n [shapeId]: change,\n },\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: [shapeId],\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const { shapeId } = this\n const pageId = this.app.currentPageId\n\n return {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n [shapeId]: this.isExtending ? this.initialShape : undefined,\n },\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: [],\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const { shapeId } = this\n const pageId = this.app.currentPageId\n const shape = this.app.getShape<DrawShape>(shapeId)\n return {\n id: 'create_draw',\n before: {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n [shapeId]: this.isExtending ? this.initialShape : undefined,\n },\n },\n },\n pageStates: {\n [pageId]: {\n selectedIds: [],\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [pageId]: {\n shapes: {\n [shapeId]: {\n ...shape,\n point: Vec.toFixed(shape.point),\n points: shape.points.map((pt) => Vec.toFixed(pt)),\n isComplete: true,\n },\n },\n },\n },\n pageStates: {\n [this.app.currentPageId]: {\n selectedIds: [],\n },\n },\n },\n },\n }\n }\n\n addPoint = (currentPoint: number[]) => {\n const { originPoint } = this.app\n // The new adjusted point\n const newAdjustedPoint = Vec.toFixed(Vec.sub(currentPoint, originPoint)).concat(currentPoint[2])\n\n // Don't add duplicate points.\n if (Vec.isEqual(this.lastAdjustedPoint, newAdjustedPoint)) return\n\n // Add the new adjusted point to the points array\n this.points.push(newAdjustedPoint)\n\n // The new adjusted point is now the previous adjusted point.\n this.lastAdjustedPoint = newAdjustedPoint\n\n // Does the input point create a new top left?\n const prevTopLeft = [...this.topLeft]\n\n const topLeft = [\n Math.min(this.topLeft[0], currentPoint[0]),\n Math.min(this.topLeft[1], currentPoint[1]),\n ]\n\n const delta = Vec.sub(topLeft, originPoint)\n\n // Time to shift some points!\n let points: number[][]\n\n if (prevTopLeft[0] !== topLeft[0] || prevTopLeft[1] !== topLeft[1]) {\n this.topLeft = topLeft\n // If we have a new top left, then we need to iterate through\n // the \"unshifted\" points array and shift them based on the\n // offset between the new top left and the original top left.\n points = this.points.map((pt) => Vec.toFixed(Vec.sub(pt, delta)).concat(pt[2]))\n } else {\n // If the new top left is the same as the previous top left,\n // we don't need to shift anything: we just shift the new point\n // and add it to the shifted points array.\n points = [...this.shiftedPoints, Vec.sub(newAdjustedPoint, delta).concat(newAdjustedPoint[2])]\n }\n\n this.shiftedPoints = points\n\n return {\n point: this.topLeft,\n points,\n }\n }\n}\n", "import type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, TVShape, TelvaCommand, TelvaPatch } from '~types'\n\nexport class EditSession extends BaseSession {\n type = SessionType.Edit\n performanceMode = undefined\n\n initialShape: TVShape\n initialSelectedIds: string[]\n currentPageId: string\n isCreating: boolean\n\n constructor(app: TelvaApp, id: string, isCreating: boolean) {\n super(app)\n this.initialShape = app.getShape(id, app.currentPageId)\n this.currentPageId = app.currentPageId\n this.isCreating = isCreating\n this.initialSelectedIds = [...app.selectedIds]\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => void null\n\n cancel = (): TelvaPatch | undefined => {\n return {\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: {\n [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,\n },\n },\n },\n pageStates: {\n [this.currentPageId]: {\n selectedIds: this.isCreating ? [] : this.initialSelectedIds,\n editingId: undefined,\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const shape = this.app.getShape(this.initialShape.id)\n\n return {\n id: 'edit',\n before: {\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: {\n [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,\n },\n },\n },\n pageStates: {\n [this.currentPageId]: {\n selectedIds: this.isCreating ? [] : this.initialSelectedIds,\n editingId: undefined,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [this.currentPageId]: {\n shapes: {\n [this.initialShape.id]: shape,\n },\n },\n },\n pageStates: {\n [this.currentPageId]: {\n selectedIds: [shape.id],\n editingId: undefined,\n },\n },\n },\n },\n }\n }\n}\n", "import { Vec } from 'telva-vec'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport {\n PagePartial,\n SessionType,\n TVBinding,\n TVShape,\n TVStatus,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\n\nexport class EraseSession extends BaseSession {\n type = SessionType.Draw\n performanceMode = undefined\n status = TVStatus.Creating\n isLocked?: boolean\n lockedDirection?: 'horizontal' | 'vertical'\n erasedShapes = new Set<TVShape>()\n erasedBindings = new Set<TVBinding>()\n initialSelectedShapes: TVShape[]\n erasableShapes: Set<TVShape>\n prevPoint: number[]\n prevEraseShapesSize = 0\n\n constructor(app: TelvaApp) {\n super(app)\n this.prevPoint = [...app.originPoint]\n this.initialSelectedShapes = this.app.selectedIds.map((id) => this.app.getShape(id))\n this.erasableShapes = new Set(this.app.shapes.filter((shape) => !shape.isLocked))\n this.interval = this.loop()\n }\n\n interval: any\n timestamp1 = 0\n timestamp2 = 0\n prevErasePoint: number[] = []\n\n loop = () => {\n const now = Date.now()\n const elapsed1 = now - this.timestamp1\n const elapsed2 = now - this.timestamp2\n const { eraseLine } = this.app.appState\n\n let next = [...eraseLine]\n let didUpdate = false\n\n if (elapsed1 > 16 && this.prevErasePoint !== this.prevPoint) {\n didUpdate = true\n next = [...eraseLine, this.prevPoint]\n this.prevErasePoint = this.prevPoint\n }\n\n if (elapsed2 > 32) {\n if (next.length > 1) {\n didUpdate = true\n next.splice(0, Math.ceil(next.length * 0.1))\n this.timestamp2 = now\n }\n }\n\n if (didUpdate) {\n this.app.patchState(\n {\n appState: {\n eraseLine: next,\n },\n },\n 'eraseline'\n )\n }\n\n this.interval = requestAnimationFrame(this.loop)\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const { page, shiftKey, originPoint, currentPoint, zoom } = this.app\n\n if (shiftKey) {\n const delta = Vec.sub(currentPoint, originPoint)\n if (!this.isLocked && Vec.len(delta) > 3 / zoom) {\n // If we're locking before knowing what direction we're in, set it\n // early based on the bigger dimension.\n if (!this.lockedDirection) {\n const delta = Vec.sub(currentPoint, originPoint)\n this.lockedDirection = Math.abs(delta[0]) > Math.abs(delta[1]) ? 'horizontal' : 'vertical'\n }\n\n this.isLocked = true\n }\n } else if (this.isLocked) {\n this.isLocked = false\n }\n\n if (this.isLocked) {\n if (this.lockedDirection === 'vertical') {\n currentPoint[0] = originPoint[0]\n } else {\n currentPoint[1] = originPoint[1]\n }\n }\n\n const newPoint = Vec.toFixed(Vec.add(originPoint, Vec.sub(currentPoint, originPoint)))\n\n const deletedShapeIds = new Set<string>([])\n\n this.erasableShapes.forEach((shape) => {\n if (this.erasedShapes.has(shape)) return\n if (this.app.getShapeUtil(shape).hitTestLineSegment(shape, this.prevPoint, newPoint)) {\n this.erasedShapes.add(shape)\n deletedShapeIds.add(shape.id)\n\n if (shape.children !== undefined) {\n for (const childId of shape.children) {\n this.erasedShapes.add(this.app.getShape(childId))\n deletedShapeIds.add(childId)\n }\n }\n }\n })\n\n // Erase bindings that reference deleted shapes\n\n Object.values(page.bindings).forEach((binding) => {\n for (const id of [binding.toId, binding.fromId]) {\n if (deletedShapeIds.has(id)) {\n this.erasedBindings.add(binding)\n }\n }\n })\n\n this.erasedShapes.forEach((shape) => {\n // Has the shape been deleted? If so, pull it from the list.\n if (!this.app.getShape(shape.id)) {\n this.erasedShapes.delete(shape)\n this.erasableShapes.delete(shape)\n deletedShapeIds.delete(shape.id)\n }\n })\n\n const erasedShapes = Array.from(this.erasedShapes.values())\n\n this.prevPoint = newPoint\n\n if (erasedShapes.length === this.prevEraseShapesSize) {\n return\n }\n\n this.prevEraseShapesSize = erasedShapes.length\n\n return {\n document: {\n pages: {\n [page.id]: {\n shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, { isGhost: true }])),\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const { page } = this.app\n\n cancelAnimationFrame(this.interval)\n\n this.erasedShapes.forEach((shape) => {\n if (!this.app.getShape(shape.id)) {\n this.erasedShapes.delete(shape)\n this.erasableShapes.delete(shape)\n }\n })\n\n const erasedShapes = Array.from(this.erasedShapes.values())\n\n return {\n document: {\n pages: {\n [page.id]: {\n shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, { isGhost: false }])),\n },\n },\n pageStates: {\n [page.id]: {\n selectedIds: this.initialSelectedShapes.map((shape) => shape.id),\n },\n },\n },\n appState: {\n eraseLine: [],\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const { page } = this.app\n\n cancelAnimationFrame(this.interval)\n\n this.erasedShapes.forEach((shape) => {\n if (!this.app.getShape(shape.id)) {\n this.erasedShapes.delete(shape)\n this.erasableShapes.delete(shape)\n }\n })\n\n this.erasedBindings.forEach((binding) => {\n if (!this.app.getBinding(binding.id)) {\n this.erasedBindings.delete(binding)\n }\n })\n\n const erasedShapes = Array.from(this.erasedShapes.values())\n const erasedBindings = Array.from(this.erasedBindings.values())\n const erasedShapeIds = erasedShapes.map((shape) => shape.id)\n const erasedBindingIds = erasedBindings.map((binding) => binding.id)\n\n const before: PagePartial = {\n shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, shape])),\n bindings: Object.fromEntries(erasedBindings.map((binding) => [binding.id, binding])),\n }\n\n const after: PagePartial = {\n shapes: Object.fromEntries(erasedShapes.map((shape) => [shape.id, undefined])),\n bindings: Object.fromEntries(erasedBindings.map((binding) => [binding.id, undefined])),\n }\n\n // Remove references on any shape's handles to any deleted bindings\n this.app.shapes.forEach((shape) => {\n if (shape.handles && !after.shapes[shape.id]) {\n Object.values(shape.handles).forEach((handle) => {\n if (handle.bindingId && erasedBindingIds.includes(handle.bindingId)) {\n // Save the binding reference in the before patch\n before.shapes[shape.id] = {\n ...before.shapes[shape.id],\n handles: {\n ...before.shapes[shape.id]?.handles,\n [handle.id]: handle,\n },\n }\n\n // Save the binding reference in the before patch\n if (!erasedShapeIds.includes(shape.id)) {\n after.shapes[shape.id] = {\n ...after.shapes[shape.id],\n handles: {\n ...after.shapes[shape.id]?.handles,\n [handle.id]: {\n ...handle,\n bindingId: undefined,\n },\n },\n }\n }\n }\n })\n }\n })\n\n return {\n id: 'erase',\n before: {\n document: {\n pages: {\n [page.id]: before,\n },\n pageStates: {\n [page.id]: {\n selectedIds: this.initialSelectedShapes\n .filter((shape) => !!this.app.getShape(shape.id))\n .map((shape) => shape.id),\n },\n },\n },\n appState: {\n eraseLine: [],\n },\n },\n after: {\n document: {\n pages: {\n [page.id]: after,\n },\n pageStates: {\n [page.id]: {\n selectedIds: this.initialSelectedShapes\n .filter((shape) => !!this.app.getShape(shape.id))\n .filter((shape) => !erasedShapeIds.includes(shape.id))\n .map((shape) => shape.id),\n },\n },\n },\n appState: {\n eraseLine: [],\n },\n },\n }\n }\n}\n", "import { TLBounds, TLPageState, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport {\n Patch,\n SessionType,\n TVShape,\n TVShapeType,\n TVStatus,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\n\nexport class GridSession extends BaseSession {\n type = SessionType.Grid\n performanceMode = undefined\n status = TVStatus.Translating\n shape: TVShape\n bounds: TLBounds\n initialSelectedIds: string[]\n initialSiblings?: string[]\n grid: Record<string, string> = {}\n columns = 1\n rows = 1\n isCopying = false\n\n constructor(app: TelvaApp, id: string) {\n super(app)\n this.shape = this.app.getShape(id)\n this.grid['0_0'] = this.shape.id\n this.bounds = this.app.getShapeBounds(id)\n this.initialSelectedIds = [...this.app.selectedIds]\n if (this.shape.parentId !== this.app.currentPageId) {\n this.initialSiblings = this.app\n .getShape(this.shape.parentId)\n .children?.filter((id) => id !== this.shape.id)\n }\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const { currentPageId, altKey, shiftKey, currentPoint } = this.app\n\n const nextShapes: Patch<Record<string, TVShape>> = {}\n\n const nextPageState: Patch<TLPageState> = {}\n\n const center = Utils.getBoundsCenter(this.bounds)\n\n const offset = Vec.sub(currentPoint, center)\n\n if (shiftKey) {\n if (Math.abs(offset[0]) < Math.abs(offset[1])) {\n offset[0] = 0\n } else {\n offset[1] = 0\n }\n }\n // use the distance from center to determine the grid\n\n const gapX = this.bounds.width + 32\n const gapY = this.bounds.height + 32\n\n const columns = Math.ceil(offset[0] / gapX)\n const rows = Math.ceil(offset[1] / gapY)\n\n const minX = Math.min(columns, 0)\n const minY = Math.min(rows, 0)\n const maxX = Math.max(columns, 1)\n const maxY = Math.max(rows, 1)\n\n const inGrid = new Set<string>()\n\n const isCopying = altKey\n\n if (isCopying !== this.isCopying) {\n // Recreate shapes copying\n Object.values(this.grid)\n .filter((id) => id !== this.shape.id)\n .forEach((id) => (nextShapes[id] = undefined))\n\n this.grid = { '0_0': this.shape.id }\n\n this.isCopying = isCopying\n }\n\n // Go through grid, adding items in positions\n // that aren't already filled.\n for (let x = minX; x < maxX; x++) {\n for (let y = minY; y < maxY; y++) {\n const position = `${x}_${y}`\n\n inGrid.add(position)\n\n if (this.grid[position]) continue\n\n if (x === 0 && y === 0) continue\n\n const clone = this.getClone(Vec.add(this.shape.point, [x * gapX, y * gapY]), isCopying)\n\n nextShapes[clone.id] = clone\n\n this.grid[position] = clone.id\n }\n }\n\n // Remove any other items from the grid\n Object.entries(this.grid).forEach(([position, id]) => {\n if (!inGrid.has(position)) {\n nextShapes[id] = undefined\n delete this.grid[position]\n }\n })\n\n if (Object.values(nextShapes).length === 0) return\n\n // Add shapes to parent id\n if (this.initialSiblings) {\n nextShapes[this.shape.parentId] = {\n children: [...this.initialSiblings, ...Object.values(this.grid)],\n }\n }\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes: nextShapes,\n },\n },\n pageStates: {\n [currentPageId]: nextPageState,\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const { currentPageId } = this.app\n const nextShapes: Record<string, Partial<TVShape> | undefined> = {}\n\n // Delete clones\n Object.values(this.grid).forEach((id) => {\n nextShapes[id] = undefined\n // TODO: Remove from parent if grouped\n })\n\n // Put back the initial shape\n nextShapes[this.shape.id] = { ...nextShapes[this.shape.id], point: this.shape.point }\n\n if (this.initialSiblings) {\n nextShapes[this.shape.parentId] = {\n children: [...this.initialSiblings, this.shape.id],\n }\n }\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes: nextShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: [this.shape.id],\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const { currentPageId } = this.app\n\n const beforeShapes: Patch<Record<string, TVShape>> = {}\n\n const afterShapes: Patch<Record<string, TVShape>> = {}\n\n const afterSelectedIds: string[] = []\n\n Object.values(this.grid).forEach((id) => {\n beforeShapes[id] = undefined\n afterShapes[id] = this.app.getShape(id)\n afterSelectedIds.push(id)\n // TODO: Add shape to parent if grouped\n })\n\n beforeShapes[this.shape.id] = this.shape\n\n // Add shapes to parent id\n if (this.initialSiblings) {\n beforeShapes[this.shape.parentId] = {\n children: [...this.initialSiblings, this.shape.id],\n }\n\n afterShapes[this.shape.parentId] = {\n children: [...this.initialSiblings, ...Object.values(this.grid)],\n }\n }\n\n // If no new shapes have been created, bail\n if (afterSelectedIds.length === 1) return\n\n return {\n id: 'grid',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: [],\n hoveredId: undefined,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: afterSelectedIds,\n hoveredId: undefined,\n },\n },\n },\n },\n }\n }\n\n private getClone = (point: number[], copy: boolean) => {\n const clone = {\n ...this.shape,\n id: Utils.uniqueId(),\n point,\n }\n\n if (!copy) {\n if (clone.type === TVShapeType.Sticky) {\n clone.text = ''\n }\n }\n\n return clone\n }\n}\n", "import { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, ShapesWithProp, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\nexport class HandleSession extends BaseSession {\n type = SessionType.Handle\n performanceMode = undefined\n status = TVStatus.TranslatingHandle\n commandId: string\n topLeft: number[]\n shiftKey = false\n initialShape: ShapesWithProp<'handles'>\n handleId: string\n\n constructor(app: TelvaApp, shapeId: string, handleId: string, commandId = 'move_handle') {\n super(app)\n const { originPoint } = app\n this.topLeft = [...originPoint]\n this.handleId = handleId\n this.initialShape = this.app.getShape(shapeId)\n this.commandId = commandId\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const {\n initialShape,\n app: { currentPageId, currentPoint },\n } = this\n\n const shape = this.app.getShape<ShapesWithProp<'handles'>>(initialShape.id)\n\n if (shape.isLocked) return void null\n\n const handles = shape.handles\n\n const handleId = this.handleId as keyof typeof handles\n\n const delta = Vec.sub(currentPoint, handles[handleId].point)\n\n const handleChanges = {\n [handleId]: {\n ...handles[handleId],\n point: Vec.sub(Vec.add(handles[handleId].point, delta), shape.point),\n },\n }\n\n // First update the handle's next point\n const change = TVDR.getShapeUtil(shape).onHandleChange?.(shape, handleChanges)\n\n if (!change) return\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes: {\n [shape.id]: change,\n },\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const {\n initialShape,\n app: { currentPageId },\n } = this\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes: {\n [initialShape.id]: initialShape,\n },\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const {\n initialShape,\n app: { currentPageId },\n } = this\n\n return {\n id: this.commandId,\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: {\n [initialShape.id]: initialShape,\n },\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: {\n [initialShape.id]: TVDR.onSessionComplete(this.app.getShape(this.initialShape.id)),\n },\n },\n },\n },\n },\n }\n }\n}\n", "import { Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, TVShape, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\nexport class RotateSession extends BaseSession {\n type = SessionType.Rotate\n status = TVStatus.Transforming\n performanceMode = undefined\n delta = [0, 0]\n commonBoundsCenter: number[]\n initialAngle: number\n initialShapes: {\n shape: TVShape\n center: number[]\n }[]\n changes: Record<string, Partial<TVShape>> = {}\n\n constructor(app: TelvaApp) {\n super(app)\n\n const {\n app: { currentPageId, pageState, originPoint },\n } = this\n\n const initialShapes = TVDR.getSelectedBranchSnapshot(app.state, currentPageId).filter(\n (shape) => !shape.isLocked\n )\n\n if (initialShapes.length === 0) {\n throw Error('No selected shapes!')\n }\n\n if (app.rotationInfo.selectedIds === pageState.selectedIds) {\n if (app.rotationInfo.center === undefined) {\n throw Error('We should have a center for rotation!')\n }\n\n this.commonBoundsCenter = app.rotationInfo.center\n } else {\n this.commonBoundsCenter = Utils.getBoundsCenter(\n Utils.getCommonBounds(initialShapes.map(TVDR.getBounds))\n )\n app.rotationInfo.selectedIds = pageState.selectedIds\n app.rotationInfo.center = this.commonBoundsCenter\n }\n\n this.initialShapes = initialShapes\n .filter((shape) => shape.children === undefined)\n .map((shape) => {\n return {\n shape,\n center: this.app.getShapeUtil(shape).getCenter(shape),\n }\n })\n\n this.initialAngle = Vec.angle(this.commonBoundsCenter, originPoint)\n }\n\n start = (): TelvaPatch | undefined => void null\n\n update = (): TelvaPatch | undefined => {\n const {\n commonBoundsCenter,\n initialShapes,\n app: { currentPageId, currentPoint, shiftKey },\n } = this\n\n const shapes: Record<string, Partial<TVShape>> = {}\n\n let directionDelta = Vec.angle(commonBoundsCenter, currentPoint) - this.initialAngle\n\n if (shiftKey) {\n directionDelta = Utils.snapAngleToSegments(directionDelta, 24) // 15 degrees\n }\n\n // Update the shapes\n initialShapes.forEach(({ center, shape }) => {\n const { rotation = 0 } = shape\n let shapeDelta = 0\n\n if (shiftKey) {\n const snappedRotation = Utils.snapAngleToSegments(rotation, 24)\n shapeDelta = snappedRotation - rotation\n }\n\n const change = TVDR.getRotatedShapeMutation(\n shape,\n center,\n commonBoundsCenter,\n shiftKey ? directionDelta + shapeDelta : directionDelta\n )\n\n if (change) {\n shapes[shape.id] = change\n }\n })\n\n this.changes = shapes\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const {\n initialShapes,\n app: { currentPageId },\n } = this\n\n const shapes: Record<string, TVShape> = {}\n initialShapes.forEach(({ shape }) => (shapes[shape.id] = shape))\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const {\n initialShapes,\n app: { currentPageId },\n } = this\n\n const beforeShapes = {} as Record<string, Partial<TVShape>>\n const afterShapes = this.changes\n\n initialShapes.forEach(({ shape: { id, point, rotation, handles } }) => {\n beforeShapes[id] = { point, rotation, handles }\n })\n\n return {\n id: 'rotate',\n before: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n },\n },\n },\n },\n after: {\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n },\n },\n },\n },\n }\n }\n}\n", "import { TLBounds, TLBoundsCorner, TLBoundsEdge, Utils } from 'telva-core'\nimport type { TLBoundsWithCenter, TLSnapLine } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, TVShape, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\ntype SnapInfo =\n | {\n state: 'empty'\n }\n | {\n state: 'ready'\n bounds: TLBoundsWithCenter[]\n }\n\nexport class TransformSession extends BaseSession {\n type = SessionType.Transform\n performanceMode = undefined\n status = TVStatus.Transforming\n scaleX = 1\n scaleY = 1\n initialShapes: TVShape[]\n initialShapeIds: string[]\n initialSelectedIds: string[]\n shapeBounds: {\n initialShape: TVShape\n initialShapeBounds: TLBounds\n transformOrigin: number[]\n }[]\n hasUnlockedShapes: boolean\n isAllAspectRatioLocked: boolean\n initialCommonBounds: TLBounds\n snapInfo: SnapInfo = { state: 'empty' }\n prevPoint = [0, 0]\n speed = 1\n\n constructor(\n app: TelvaApp,\n public transformType: TLBoundsEdge | TLBoundsCorner = TLBoundsCorner.BottomRight,\n public isCreate = false\n ) {\n super(app)\n this.initialSelectedIds = [...this.app.selectedIds]\n this.app.rotationInfo.selectedIds = [...this.initialSelectedIds]\n\n this.initialShapes = TVDR.getSelectedBranchSnapshot(\n this.app.state,\n this.app.currentPageId\n ).filter((shape) => !shape.isLocked)\n\n this.initialShapeIds = this.initialShapes.map((shape) => shape.id)\n\n this.hasUnlockedShapes = this.initialShapes.length > 0\n\n this.isAllAspectRatioLocked = this.initialShapes.every(\n (shape) => shape.isAspectRatioLocked || TVDR.getShapeUtil(shape).isAspectRatioLocked\n )\n\n const shapesBounds = Object.fromEntries(\n this.initialShapes.map((shape) => [shape.id, TVDR.getBounds(shape)])\n )\n\n const boundsArr = Object.values(shapesBounds)\n\n this.initialCommonBounds = Utils.getCommonBounds(boundsArr)\n\n const initialInnerBounds = Utils.getBoundsFromPoints(boundsArr.map(Utils.getBoundsCenter))\n\n // Return a mapping of shapes to bounds together with the relative\n // positions of the shape's bounds within the common bounds shape.\n this.shapeBounds = this.initialShapes.map((shape) => {\n const initialShapeBounds = shapesBounds[shape.id]\n const ic = Utils.getBoundsCenter(initialShapeBounds)\n\n const ix = (ic[0] - initialInnerBounds.minX) / initialInnerBounds.width\n const iy = (ic[1] - initialInnerBounds.minY) / initialInnerBounds.height\n\n return {\n initialShape: shape,\n initialShapeBounds,\n transformOrigin: [ix, iy],\n }\n })\n }\n\n start = (): TelvaPatch | undefined => {\n this.snapInfo = {\n state: 'ready',\n bounds: this.app.shapes\n .filter((shape) => !this.initialShapeIds.includes(shape.id))\n .map((shape) => Utils.getBoundsWithCenter(TVDR.getRotatedBounds(shape))),\n }\n\n return void null\n }\n\n update = (): TelvaPatch | undefined => {\n const {\n transformType,\n shapeBounds,\n initialCommonBounds,\n isAllAspectRatioLocked,\n app: {\n currentPageId,\n pageState: { camera },\n viewport,\n currentPoint,\n previousPoint,\n originPoint,\n shiftKey,\n altKey,\n metaKey,\n currentGrid,\n settings: { isSnapping, showGrid },\n },\n } = this\n\n const shapes = {} as Record<string, TVShape>\n\n const delta = altKey\n ? Vec.mul(Vec.sub(currentPoint, originPoint), 2)\n : Vec.sub(currentPoint, originPoint)\n\n let newBounds = Utils.getTransformedBoundingBox(\n initialCommonBounds,\n transformType,\n delta,\n 0,\n shiftKey || isAllAspectRatioLocked\n )\n\n if (altKey) {\n newBounds = {\n ...newBounds,\n ...Utils.centerBounds(newBounds, Utils.getBoundsCenter(initialCommonBounds)),\n }\n }\n\n if (showGrid) {\n newBounds = {\n ...newBounds,\n ...Utils.snapBoundsToGrid(newBounds, currentGrid),\n }\n }\n\n // Should we snap?\n\n const speed = Vec.dist(currentPoint, previousPoint)\n\n const speedChange = speed - this.speed\n\n this.speed = this.speed + speedChange * (speedChange > 1 ? 0.5 : 0.15)\n\n let snapLines: TLSnapLine[] = []\n\n if (\n ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n this.speed * camera.zoom < SLOW_SPEED &&\n this.snapInfo.state === 'ready'\n ) {\n const snapResult = Utils.getSnapPoints(\n Utils.getBoundsWithCenter(newBounds),\n this.snapInfo.bounds.filter(\n (bounds) => Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n ),\n SNAP_DISTANCE / camera.zoom\n )\n\n if (snapResult) {\n snapLines = snapResult.snapLines\n\n newBounds = Utils.getTransformedBoundingBox(\n initialCommonBounds,\n transformType,\n Vec.sub(delta, snapResult.offset),\n 0,\n shiftKey || isAllAspectRatioLocked\n )\n }\n }\n\n // Now work backward to calculate a new bounding box for each of the shapes.\n\n this.scaleX = newBounds.scaleX\n this.scaleY = newBounds.scaleY\n\n shapeBounds.forEach(({ initialShape, initialShapeBounds, transformOrigin }) => {\n let newShapeBounds = Utils.getRelativeTransformedBoundingBox(\n newBounds,\n initialCommonBounds,\n initialShapeBounds,\n this.scaleX < 0,\n this.scaleY < 0\n )\n\n if (showGrid) {\n newShapeBounds = Utils.snapBoundsToGrid(newShapeBounds, currentGrid)\n }\n\n const afterShape = TVDR.transform(this.app.getShape(initialShape.id), newShapeBounds, {\n type: this.transformType,\n initialShape,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n transformOrigin,\n })\n\n shapes[initialShape.id] = afterShape\n })\n\n return {\n appState: {\n snapLines,\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const {\n shapeBounds,\n app: { currentPageId },\n } = this\n\n const shapes = {} as Record<string, TVShape | undefined>\n\n if (this.isCreate) {\n shapeBounds.forEach((shape) => (shapes[shape.initialShape.id] = undefined))\n } else {\n shapeBounds.forEach((shape) => (shapes[shape.initialShape.id] = shape.initialShape))\n }\n\n return {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: this.isCreate ? [] : shapeBounds.map((shape) => shape.initialShape.id),\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const {\n isCreate,\n shapeBounds,\n hasUnlockedShapes,\n app: { currentPageId },\n } = this\n\n if (!hasUnlockedShapes) return\n\n if (this.isCreate && Vec.dist(this.app.originPoint, this.app.currentPoint) < 2) {\n return this.cancel()\n }\n\n const beforeShapes: Record<string, TVShape | undefined> = {}\n const afterShapes: Record<string, TVShape> = {}\n\n let beforeSelectedIds: string[]\n let afterSelectedIds: string[]\n\n if (isCreate) {\n beforeSelectedIds = []\n afterSelectedIds = []\n shapeBounds.forEach(({ initialShape }) => {\n beforeShapes[initialShape.id] = undefined\n afterShapes[initialShape.id] = this.app.getShape(initialShape.id)\n })\n } else {\n beforeSelectedIds = this.initialSelectedIds\n afterSelectedIds = this.initialSelectedIds\n shapeBounds.forEach(({ initialShape }) => {\n beforeShapes[initialShape.id] = initialShape\n afterShapes[initialShape.id] = this.app.getShape(initialShape.id)\n })\n }\n\n return {\n id: 'transform',\n before: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: beforeSelectedIds,\n hoveredId: undefined,\n editingId: undefined,\n },\n },\n },\n },\n after: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: afterSelectedIds,\n hoveredId: undefined,\n editingId: undefined,\n },\n },\n },\n },\n }\n }\n}\n", "import {\n TLBounds,\n TLBoundsCorner,\n TLBoundsEdge,\n TLBoundsWithCenter,\n TLSnapLine,\n Utils,\n} from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport { SessionType, TVShape, TVStatus, TelvaCommand, TelvaPatch } from '~types'\n\ntype SnapInfo =\n | {\n state: 'empty'\n }\n | {\n state: 'ready'\n bounds: TLBoundsWithCenter[]\n }\n\nexport class TransformSingleSession extends BaseSession {\n type = SessionType.TransformSingle\n status = TVStatus.Transforming\n performanceMode = undefined\n transformType: TLBoundsEdge | TLBoundsCorner\n scaleX = 1\n scaleY = 1\n isCreate: boolean\n initialShape: TVShape\n initialShapeBounds: TLBounds\n initialCommonBounds: TLBounds\n snapInfo: SnapInfo = { state: 'empty' }\n prevPoint = [0, 0]\n speed = 1\n\n constructor(\n app: TelvaApp,\n id: string,\n transformType: TLBoundsEdge | TLBoundsCorner,\n isCreate = false\n ) {\n super(app)\n this.isCreate = isCreate\n this.transformType = transformType\n\n const shape = this.app.getShape(id)\n this.initialShape = shape\n this.initialShapeBounds = TVDR.getBounds(shape)\n this.initialCommonBounds = TVDR.getRotatedBounds(shape)\n this.app.rotationInfo.selectedIds = [shape.id]\n }\n\n start = (): TelvaPatch | undefined => {\n this.snapInfo = {\n state: 'ready',\n bounds: this.app.shapes\n .filter((shape) => shape.id !== this.initialShape.id)\n .map((shape) => Utils.getBoundsWithCenter(TVDR.getRotatedBounds(shape))),\n }\n\n return void null\n }\n\n update = (): TelvaPatch | undefined => {\n const {\n transformType,\n initialShape,\n initialShapeBounds,\n app: {\n settings: { isSnapping, showGrid },\n currentPageId,\n pageState: { camera },\n viewport,\n currentPoint,\n previousPoint,\n originPoint,\n currentGrid,\n shiftKey,\n altKey,\n metaKey,\n },\n } = this\n\n if (initialShape.isLocked) return void null\n\n const shapes = {} as Record<string, Partial<TVShape>>\n\n const delta = altKey\n ? Vec.mul(Vec.sub(currentPoint, originPoint), 2)\n : Vec.sub(currentPoint, originPoint)\n\n const shape = this.app.getShape(initialShape.id)\n\n const utils = TVDR.getShapeUtil(shape)\n\n let newBounds = Utils.getTransformedBoundingBox(\n initialShapeBounds,\n transformType,\n delta,\n shape.rotation,\n shiftKey || shape.isAspectRatioLocked || utils.isAspectRatioLocked\n )\n\n if (altKey) {\n newBounds = {\n ...newBounds,\n ...Utils.centerBounds(newBounds, Utils.getBoundsCenter(initialShapeBounds)),\n }\n }\n\n if (showGrid) {\n newBounds = {\n ...newBounds,\n ...Utils.snapBoundsToGrid(newBounds, currentGrid),\n }\n }\n\n // Should we snap?\n\n const speed = Vec.dist(currentPoint, previousPoint)\n\n const speedChange = speed - this.speed\n\n this.speed = this.speed + speedChange * (speedChange > 1 ? 0.5 : 0.15)\n\n let snapLines: TLSnapLine[] = []\n\n if (\n ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n !initialShape.rotation && // not now anyway\n this.speed * camera.zoom < SLOW_SPEED &&\n this.snapInfo.state === 'ready'\n ) {\n const snapResult = Utils.getSnapPoints(\n Utils.getBoundsWithCenter(newBounds),\n this.snapInfo.bounds.filter(\n (bounds) => Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n ),\n SNAP_DISTANCE / camera.zoom\n )\n\n if (snapResult) {\n snapLines = snapResult.snapLines\n\n newBounds = Utils.getTransformedBoundingBox(\n initialShapeBounds,\n transformType,\n Vec.sub(delta, snapResult.offset),\n shape.rotation,\n shiftKey || shape.isAspectRatioLocked || utils.isAspectRatioLocked\n )\n }\n }\n\n const afterShape = TVDR.getShapeUtil(shape).transformSingle(shape, newBounds, {\n initialShape,\n type: this.transformType,\n scaleX: newBounds.scaleX,\n scaleY: newBounds.scaleY,\n transformOrigin: [0.5, 0.5],\n })\n\n if (afterShape) {\n shapes[shape.id] = afterShape\n }\n\n if (showGrid && afterShape && afterShape.point) {\n afterShape.point = Vec.snap(afterShape.point, currentGrid)\n }\n\n return {\n appState: {\n snapLines,\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const {\n initialShape,\n app: { currentPageId },\n } = this\n\n const shapes = {} as Record<string, TVShape | undefined>\n\n if (this.isCreate) {\n shapes[initialShape.id] = undefined\n } else {\n shapes[initialShape.id] = initialShape\n }\n\n return {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: this.isCreate ? [] : [initialShape.id],\n },\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const {\n initialShape,\n app: { currentPageId },\n } = this\n\n if (initialShape.isLocked) return\n\n if (this.isCreate && Vec.dist(this.app.originPoint, this.app.currentPoint) < 2) {\n return this.cancel()\n }\n\n const beforeShapes = {} as Record<string, Partial<TVShape> | undefined>\n const afterShapes = {} as Record<string, Partial<TVShape>>\n\n beforeShapes[initialShape.id] = this.isCreate ? undefined : initialShape\n\n afterShapes[initialShape.id] = TVDR.onSessionComplete(this.app.getShape(initialShape.id))\n\n return {\n id: 'transform_single',\n before: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: this.isCreate ? [] : [initialShape.id],\n editingId: undefined,\n hoveredId: undefined,\n },\n },\n },\n },\n after: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: [initialShape.id],\n editingId: undefined,\n hoveredId: undefined,\n },\n },\n },\n },\n }\n }\n}\n", "import { TLBounds, TLBoundsWithCenter, TLPageState, TLSnapLine, Utils } from 'telva-core'\nimport { Vec } from 'telva-vec'\nimport { SLOW_SPEED, SNAP_DISTANCE } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { BaseSession } from '~state/sessions/BaseSession'\nimport {\n ArrowBinding,\n ArrowShape,\n GroupShape,\n Patch,\n SessionType,\n TVBinding,\n TVShape,\n TVShapeType,\n TVStatus,\n TelvaCommand,\n TelvaPatch,\n} from '~types'\n\ntype CloneInfo =\n | {\n state: 'empty'\n }\n | {\n state: 'ready'\n cloneMap: Record<string, string>\n clones: TVShape[]\n clonedBindings: ArrowBinding[]\n }\n\ntype SnapInfo =\n | {\n state: 'empty'\n }\n | {\n state: 'ready'\n others: TLBoundsWithCenter[]\n bounds: TLBoundsWithCenter[]\n }\n\nexport class TranslateSession extends BaseSession {\n performanceMode = undefined\n type = SessionType.Translate\n status = TVStatus.Translating\n delta = [0, 0]\n prev = [0, 0]\n prevPoint = [0, 0]\n speed = 1\n cloneInfo: CloneInfo = {\n state: 'empty',\n }\n snapInfo: SnapInfo = {\n state: 'empty',\n }\n snapLines: TLSnapLine[] = []\n isCloning = false\n isCreate: boolean\n link: 'left' | 'right' | 'center' | false\n\n initialIds: Set<string>\n hasUnlockedShapes: boolean\n initialSelectedIds: string[]\n initialCommonBounds: TLBounds\n initialShapes: TVShape[]\n initialParentChildren: Record<string, string[]>\n bindingsToDelete: ArrowBinding[]\n\n constructor(app: TelvaApp, isCreate = false, link: 'left' | 'right' | 'center' | false = false) {\n super(app)\n this.isCreate = isCreate\n this.link = link\n\n const { currentPageId, selectedIds, page } = this.app\n\n this.initialSelectedIds = [...selectedIds]\n\n const selectedShapes = (\n link ? TVDR.getLinkedShapeIds(this.app.state, currentPageId, link, false) : selectedIds\n )\n .map((id) => this.app.getShape(id))\n .filter((shape) => !shape.isLocked)\n\n const selectedShapeIds = new Set(selectedShapes.map((shape) => shape.id))\n\n this.hasUnlockedShapes = selectedShapes.length > 0\n\n this.initialShapes = Array.from(\n new Set(\n selectedShapes\n .filter((shape) => !selectedShapeIds.has(shape.parentId))\n .flatMap((shape) => {\n return shape.children\n ? [shape, ...shape.children.map((childId) => this.app.getShape(childId))]\n : [shape]\n })\n ).values()\n )\n\n this.initialIds = new Set(this.initialShapes.map((shape) => shape.id))\n\n this.bindingsToDelete = []\n\n Object.values(page.bindings)\n .filter((binding) => this.initialIds.has(binding.fromId) || this.initialIds.has(binding.toId))\n .forEach((binding) => {\n if (this.initialIds.has(binding.fromId)) {\n if (!this.initialIds.has(binding.toId)) {\n this.bindingsToDelete.push(binding)\n }\n }\n })\n\n this.initialParentChildren = {}\n\n this.initialShapes\n .map((s) => s.parentId)\n .filter((id) => id !== page.id)\n .forEach((id) => {\n this.initialParentChildren[id] = this.app.getShape(id).children!\n })\n\n this.initialCommonBounds = Utils.getCommonBounds(this.initialShapes.map(TVDR.getRotatedBounds))\n\n this.app.rotationInfo.selectedIds = [...this.app.selectedIds]\n }\n\n start = (): TelvaPatch | undefined => {\n const {\n bindingsToDelete,\n initialIds,\n app: { currentPageId, page },\n } = this\n\n const allBounds: TLBoundsWithCenter[] = []\n const otherBounds: TLBoundsWithCenter[] = []\n\n Object.values(page.shapes).forEach((shape) => {\n const bounds = Utils.getBoundsWithCenter(TVDR.getRotatedBounds(shape))\n allBounds.push(bounds)\n if (!initialIds.has(shape.id)) {\n otherBounds.push(bounds)\n }\n })\n\n this.snapInfo = {\n state: 'ready',\n bounds: allBounds,\n others: otherBounds,\n }\n\n if (bindingsToDelete.length === 0) return\n\n const nextBindings: Patch<Record<string, TVBinding>> = {}\n const nextShapes: Patch<Record<string, TVShape>> = {}\n\n bindingsToDelete.forEach((binding) => {\n nextBindings[binding.id] = undefined\n const fromShape = this.app.getShape(binding.fromId)\n nextShapes[binding.fromId] = {\n handles: {\n ...fromShape.handles,\n [binding.handleId]: {\n // @ts-expect-error\n ...fromShape.handles[binding.handleId],\n bindingId: undefined,\n },\n },\n }\n })\n\n return {\n document: {\n pages: {\n [currentPageId]: {\n bindings: nextBindings,\n shapes: nextShapes,\n },\n },\n },\n }\n }\n\n update = (): TelvaPatch | undefined => {\n const {\n initialParentChildren,\n initialShapes,\n initialCommonBounds,\n bindingsToDelete,\n app: {\n pageState: { camera },\n settings: { isSnapping, showGrid },\n currentPageId,\n viewport,\n selectedIds,\n currentPoint,\n previousPoint,\n originPoint,\n altKey,\n shiftKey,\n metaKey,\n currentGrid,\n },\n } = this\n\n const nextBindings: Patch<Record<string, TVBinding>> = {}\n const nextShapes: Patch<Record<string, TVShape>> = {}\n const nextPageState: Patch<TLPageState> = {}\n\n let delta = Vec.sub(currentPoint, originPoint)\n\n let didChangeCloning = false\n\n if (!this.isCreate) {\n if (altKey && !this.isCloning) {\n this.isCloning = true\n didChangeCloning = true\n } else if (!altKey && this.isCloning) {\n this.isCloning = false\n didChangeCloning = true\n }\n }\n\n if (shiftKey) {\n if (Math.abs(delta[0]) < Math.abs(delta[1])) {\n delta[0] = 0\n } else {\n delta[1] = 0\n }\n }\n\n // Should we snap?\n\n // Speed is used to decide which snap points to use. At a high\n // speed, we don't use any snap points. At a low speed, we only\n // allow center-to-center snap points. At very low speed, we\n // enable all snap points (still preferring middle snaps). We're\n // using an acceleration function here to smooth the changes in\n // speed, but we also want the speed to accelerate faster than\n // it decelerates.\n\n const speed = Vec.dist(currentPoint, previousPoint)\n\n const change = speed - this.speed\n\n this.speed = this.speed + change * (change > 1 ? 0.5 : 0.15)\n\n this.snapLines = []\n\n if (\n ((isSnapping && !metaKey) || (!isSnapping && metaKey)) &&\n this.speed * camera.zoom < SLOW_SPEED &&\n this.snapInfo.state === 'ready'\n ) {\n const snapResult = Utils.getSnapPoints(\n Utils.getBoundsWithCenter(\n showGrid\n ? Utils.snapBoundsToGrid(Utils.translateBounds(initialCommonBounds, delta), currentGrid)\n : Utils.translateBounds(initialCommonBounds, delta)\n ),\n (this.isCloning ? this.snapInfo.bounds : this.snapInfo.others).filter((bounds) => {\n return Utils.boundsContain(viewport, bounds) || Utils.boundsCollide(viewport, bounds)\n }),\n SNAP_DISTANCE / camera.zoom\n )\n\n if (snapResult) {\n this.snapLines = snapResult.snapLines\n delta = Vec.sub(delta, snapResult.offset)\n }\n }\n\n // We've now calculated the \"delta\", or difference between the\n // cursor's position (real or adjusted by snaps or axis locking)\n // and the cursor's original position (\"origin\").\n\n // The \"movement\" is the actual change of position between this\n // computed position and the previous computed position.\n\n this.prev = delta\n\n // If cloning...\n if (this.isCloning) {\n // Not Cloning -> Cloning\n if (didChangeCloning) {\n if (this.cloneInfo.state === 'empty') {\n this.createCloneInfo()\n }\n\n if (this.cloneInfo.state === 'empty') {\n throw Error\n }\n\n const { clones, clonedBindings } = this.cloneInfo\n\n this.isCloning = true\n\n // Put back any bindings we deleted\n bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = binding))\n\n // Move original shapes back to start\n initialShapes.forEach((shape) => (nextShapes[shape.id] = { point: shape.point }))\n\n // Add the clones to the page\n clones.forEach((clone) => {\n nextShapes[clone.id] = { ...clone }\n\n // Add clones to non-selected parents\n if (clone.parentId !== currentPageId && !selectedIds.includes(clone.parentId)) {\n const children =\n nextShapes[clone.parentId]?.children || initialParentChildren[clone.parentId]\n\n if (!children.includes(clone.id)) {\n nextShapes[clone.parentId] = {\n ...nextShapes[clone.parentId],\n children: [...children, clone.id],\n }\n }\n }\n })\n\n // Add the cloned bindings\n for (const binding of clonedBindings) {\n nextBindings[binding.id] = binding\n }\n\n // Set the selected ids to the clones\n nextPageState.selectedIds = clones.map((clone) => clone.id)\n\n // Either way, move the clones\n clones.forEach((clone) => {\n nextShapes[clone.id] = {\n ...clone,\n point: showGrid\n ? Vec.snap(Vec.toFixed(Vec.add(clone.point, delta)), currentGrid)\n : Vec.toFixed(Vec.add(clone.point, delta)),\n }\n })\n } else {\n if (this.cloneInfo.state === 'empty') throw Error\n\n const { clones } = this.cloneInfo\n\n clones.forEach((clone) => {\n nextShapes[clone.id] = {\n point: showGrid\n ? Vec.snap(Vec.toFixed(Vec.add(clone.point, delta)), currentGrid)\n : Vec.toFixed(Vec.add(clone.point, delta)),\n }\n })\n }\n } else {\n // If not cloning...\n\n // Cloning -> Not Cloning\n if (didChangeCloning) {\n if (this.cloneInfo.state === 'empty') throw Error\n\n const { clones, clonedBindings } = this.cloneInfo\n\n this.isCloning = false\n\n // Delete the bindings\n bindingsToDelete.forEach((binding) => (nextBindings[binding.id] = undefined))\n\n // Remove the clones from parents\n clones.forEach((clone) => {\n if (clone.parentId !== currentPageId) {\n nextShapes[clone.parentId] = {\n ...nextShapes[clone.parentId],\n children: initialParentChildren[clone.parentId],\n }\n }\n })\n\n // Delete the clones (including any parent clones)\n clones.forEach((clone) => (nextShapes[clone.id] = undefined))\n\n // Move the original shapes back to the cursor position\n initialShapes.forEach((shape) => {\n nextShapes[shape.id] = {\n point: showGrid\n ? Vec.snap(Vec.toFixed(Vec.add(shape.point, delta)), currentGrid)\n : Vec.toFixed(Vec.add(shape.point, delta)),\n }\n })\n\n // Delete the cloned bindings\n for (const binding of clonedBindings) {\n nextBindings[binding.id] = undefined\n }\n\n // Set selected ids\n nextPageState.selectedIds = initialShapes.map((shape) => shape.id)\n } else {\n // Move the shapes by the delta\n initialShapes.forEach((shape) => {\n // const current = (nextShapes[shape.id] || this.app.getShape(shape.id)) as TVShape\n\n nextShapes[shape.id] = {\n point: showGrid\n ? Vec.snap(Vec.toFixed(Vec.add(shape.point, delta)), currentGrid)\n : Vec.toFixed(Vec.add(shape.point, delta)),\n }\n })\n }\n }\n\n return {\n appState: {\n snapLines: this.snapLines,\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: nextShapes,\n bindings: nextBindings,\n },\n },\n pageStates: {\n [currentPageId]: nextPageState,\n },\n },\n }\n }\n\n cancel = (): TelvaPatch | undefined => {\n const {\n initialShapes,\n initialSelectedIds,\n bindingsToDelete,\n app: { currentPageId },\n } = this\n\n const nextBindings: Record<string, Partial<TVBinding> | undefined> = {}\n const nextShapes: Record<string, Partial<TVShape> | undefined> = {}\n const nextPageState: Partial<TLPageState> = {\n editingId: undefined,\n hoveredId: undefined,\n }\n\n if (this.isCreate) {\n initialShapes.forEach(({ id }) => (nextShapes[id] = undefined))\n nextPageState.selectedIds = []\n } else {\n // Put initial shapes back to where they started\n initialShapes.forEach(\n ({ id, point, handles }) =>\n (nextShapes[id] = handles\n ? ({ ...nextShapes[id], point, handles } as any)\n : { ...nextShapes[id], point })\n )\n nextPageState.selectedIds = initialSelectedIds\n\n // Put back any deleted bindings\n bindingsToDelete.forEach((binding) => {\n nextBindings[binding.id] = binding\n })\n }\n\n if (this.cloneInfo.state === 'ready') {\n const { clones, clonedBindings } = this.cloneInfo\n // Delete clones\n clones.forEach((clone) => (nextShapes[clone.id] = undefined))\n\n // Delete cloned bindings\n clonedBindings.forEach((binding) => (nextBindings[binding.id] = undefined))\n }\n\n return {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: nextShapes,\n bindings: nextBindings,\n },\n },\n pageStates: {\n [currentPageId]: nextPageState,\n },\n },\n }\n }\n\n complete = (): TelvaPatch | TelvaCommand | undefined => {\n const {\n initialShapes,\n initialParentChildren,\n bindingsToDelete,\n app: { currentPageId },\n } = this\n\n const beforeBindings: Patch<Record<string, TVBinding>> = {}\n const beforeShapes: Patch<Record<string, TVShape>> = {}\n\n const afterBindings: Patch<Record<string, TVBinding>> = {}\n const afterShapes: Patch<Record<string, TVShape>> = {}\n\n if (this.isCloning) {\n if (this.cloneInfo.state === 'empty') {\n this.createCloneInfo()\n }\n\n if (this.cloneInfo.state !== 'ready') throw Error\n const { clones, clonedBindings } = this.cloneInfo\n\n // Update the clones\n clones.forEach((clone) => {\n beforeShapes[clone.id] = undefined\n\n afterShapes[clone.id] = this.app.getShape(clone.id)\n\n if (clone.parentId !== currentPageId) {\n beforeShapes[clone.parentId] = {\n ...beforeShapes[clone.parentId],\n children: initialParentChildren[clone.parentId],\n }\n\n afterShapes[clone.parentId] = {\n ...afterShapes[clone.parentId],\n children: this.app.getShape<GroupShape>(clone.parentId).children,\n }\n }\n })\n\n // Update the cloned bindings\n clonedBindings.forEach((binding) => {\n beforeBindings[binding.id] = undefined\n afterBindings[binding.id] = this.app.getBinding(binding.id)\n })\n } else {\n // If we aren't cloning, then update the initial shapes\n initialShapes.forEach((shape) => {\n beforeShapes[shape.id] = this.isCreate\n ? undefined\n : {\n ...beforeShapes[shape.id],\n point: shape.point,\n }\n\n afterShapes[shape.id] = {\n ...afterShapes[shape.id],\n ...(this.isCreate\n ? this.app.getShape(shape.id)\n : { point: this.app.getShape(shape.id).point }),\n }\n })\n }\n\n // Update the deleted bindings and any associated shapes\n bindingsToDelete.forEach((binding) => {\n beforeBindings[binding.id] = binding\n\n beforeShapes[binding.fromId] = {\n ...beforeShapes[binding.fromId],\n id: binding.fromId,\n handles: {\n ...beforeShapes[binding.fromId]?.handles,\n [binding.handleId]: {\n ...beforeShapes[binding.fromId]?.handles?.[binding.handleId],\n bindingId: binding.id,\n },\n },\n }\n\n afterShapes[binding.fromId] = {\n ...afterShapes[binding.fromId],\n id: binding.fromId,\n handles: {\n // @ts-expect-error\n ...afterShapes[binding.fromId].handles!,\n [binding.handleId]: {\n ...afterShapes[binding.fromId]?.handles?.[binding.handleId],\n bindingId: undefined,\n },\n },\n }\n })\n\n bindingsToDelete.forEach((binding) => (afterBindings[binding.id] = undefined))\n\n return {\n id: 'translate',\n before: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: beforeShapes,\n bindings: beforeBindings,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: this.isCreate ? [] : [...this.initialSelectedIds],\n },\n },\n },\n },\n after: {\n appState: {\n snapLines: [],\n },\n document: {\n pages: {\n [currentPageId]: {\n shapes: afterShapes,\n bindings: afterBindings,\n },\n },\n pageStates: {\n [currentPageId]: {\n selectedIds: [...this.app.selectedIds],\n },\n },\n },\n },\n }\n }\n\n private createCloneInfo = () => {\n // Create clones when as they're needed.\n // Consider doing this work in a worker.\n\n const {\n initialShapes,\n initialParentChildren,\n app: { selectedIds, currentPageId, page },\n } = this\n\n const cloneMap: Record<string, string> = {}\n const clonedBindingsMap: Record<string, string> = {}\n const clonedBindings: TVBinding[] = []\n\n // Create clones of selected shapes\n const clones: TVShape[] = []\n\n initialShapes.forEach((shape) => {\n const newId = Utils.uniqueId()\n\n initialParentChildren[newId] = initialParentChildren[shape.id]\n\n cloneMap[shape.id] = newId\n\n const clone = {\n ...Utils.deepClone(shape),\n id: newId,\n parentId: shape.parentId,\n childIndex: TVDR.getChildIndexAbove(this.app.state, shape.id, currentPageId),\n }\n\n if (clone.type === TVShapeType.Video) {\n const element = document.getElementById(shape.id + '_video') as HTMLVideoElement\n if (element) clone.currentTime = (element.currentTime + 16) % element.duration\n }\n\n clones.push(clone)\n })\n\n clones.forEach((clone) => {\n if (clone.children !== undefined) {\n clone.children = clone.children.map((childId) => cloneMap[childId])\n }\n })\n\n clones.forEach((clone) => {\n if (selectedIds.includes(clone.parentId)) {\n clone.parentId = cloneMap[clone.parentId]\n }\n })\n\n // Potentially confusing name here: these are the ids of the\n // original shapes that were cloned, not their clones' ids.\n const clonedShapeIds = new Set(Object.keys(cloneMap))\n\n // Create cloned bindings for shapes where both to and from shapes are selected\n // (if the user clones, then we will create a new binding for the clones)\n Object.values(page.bindings)\n .filter((binding) => clonedShapeIds.has(binding.fromId) || clonedShapeIds.has(binding.toId))\n .forEach((binding) => {\n if (clonedShapeIds.has(binding.fromId)) {\n if (clonedShapeIds.has(binding.toId)) {\n const cloneId = Utils.uniqueId()\n\n const cloneBinding = {\n ...Utils.deepClone(binding),\n id: cloneId,\n fromId: cloneMap[binding.fromId] || binding.fromId,\n toId: cloneMap[binding.toId] || binding.toId,\n }\n clonedBindingsMap[binding.id] = cloneId\n clonedBindings.push(cloneBinding)\n }\n }\n })\n\n // Assign new binding ids to clones (or delete them!)\n clones.forEach((clone) => {\n if (clone.handles) {\n if (clone.handles) {\n for (const id in clone.handles) {\n const handle = clone.handles[id as keyof ArrowShape['handles']]\n handle.bindingId = handle.bindingId ? clonedBindingsMap[handle.bindingId] : undefined\n }\n }\n }\n })\n\n clones.forEach((clone) => {\n if (page.shapes[clone.id]) {\n throw Error(\"uh oh, we didn't clone correctly\")\n }\n })\n\n this.cloneInfo = {\n state: 'ready',\n clones,\n cloneMap,\n clonedBindings,\n }\n }\n}\n", "import { ExceptFirst, SessionType } from '~types'\nimport { ArrowSession } from './ArrowSession'\nimport { BrushSession } from './BrushSession'\nimport { DrawSession } from './DrawSession'\nimport { EditSession } from './EditSession'\nimport { EraseSession } from './EraseSession'\nimport { GridSession } from './GridSession'\nimport { HandleSession } from './HandleSession'\nimport { RotateSession } from './RotateSession'\nimport { TransformSession } from './TransformSession'\nimport { TransformSingleSession } from './TransformSingleSession'\nimport { TranslateSession } from './TranslateSession'\n\nexport type TelvaSession =\n | ArrowSession\n | BrushSession\n | DrawSession\n | HandleSession\n | RotateSession\n | TransformSession\n | TransformSingleSession\n | TranslateSession\n | EraseSession\n | GridSession\n | EditSession\n\nexport interface SessionsMap {\n [SessionType.Arrow]: typeof ArrowSession\n [SessionType.Brush]: typeof BrushSession\n [SessionType.Draw]: typeof DrawSession\n [SessionType.Erase]: typeof EraseSession\n [SessionType.Handle]: typeof HandleSession\n [SessionType.Rotate]: typeof RotateSession\n [SessionType.Transform]: typeof TransformSession\n [SessionType.TransformSingle]: typeof TransformSingleSession\n [SessionType.Translate]: typeof TranslateSession\n [SessionType.Grid]: typeof GridSession\n [SessionType.Edit]: typeof EditSession\n}\n\nexport type SessionOfType<K extends SessionType> = SessionsMap[K]\n\nexport type SessionArgsOfType<K extends SessionType> = ExceptFirst<\n ConstructorParameters<SessionOfType<K>>\n>\n\nexport const sessions: { [K in SessionType]: SessionsMap[K] } = {\n [SessionType.Arrow]: ArrowSession,\n [SessionType.Brush]: BrushSession,\n [SessionType.Draw]: DrawSession,\n [SessionType.Erase]: EraseSession,\n [SessionType.Handle]: HandleSession,\n [SessionType.Rotate]: RotateSession,\n [SessionType.Transform]: TransformSession,\n [SessionType.TransformSingle]: TransformSingleSession,\n [SessionType.Translate]: TranslateSession,\n [SessionType.Grid]: GridSession,\n [SessionType.Edit]: EditSession,\n}\n\nexport const getSession = <K extends SessionType>(type: K): SessionOfType<K> => {\n return sessions[type]\n}\n", "import { TLPointerEventHandler, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Arrow } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class ArrowTool extends BaseTool {\n type = TVShapeType.Arrow as const\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.status !== Status.Idle) return\n\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n const newShape = Arrow.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n style: { ...currentStyle },\n })\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(SessionType.Arrow, newShape.id, 'end', true)\n\n this.setStatus(Status.Creating)\n }\n}\n", "import {\n TLKeyboardEventHandler,\n TLPinchEventHandler,\n TLPointerEventHandler,\n Utils,\n} from 'telva-core'\nimport type { TelvaApp } from '~state/TelvaApp'\nimport { TVEventHandler, TVToolType } from '~types'\n\nexport enum Status {\n Idle = 'idle',\n Creating = 'creating',\n Pinching = 'pinching',\n}\n\nexport abstract class BaseTool<T extends string = any> extends TVEventHandler {\n type: TVToolType = 'select' as const\n\n previous?: TVToolType\n\n status: Status | T = Status.Idle\n\n constructor(public app: TelvaApp) {\n super()\n }\n\n protected readonly setStatus = (status: Status | T) => {\n this.status = status as Status | T\n this.app.setStatus(this.status as string)\n }\n\n onEnter = () => {\n this.setStatus(Status.Idle)\n }\n\n onExit = () => {\n this.setStatus(Status.Idle)\n }\n\n onCancel = () => {\n if (this.status === Status.Idle) {\n this.app.selectTool('select')\n } else {\n this.setStatus(Status.Idle)\n }\n\n this.app.cancelSession()\n }\n\n getNextChildIndex = () => {\n const {\n shapes,\n appState: { currentPageId },\n } = this.app\n\n return shapes.length === 0\n ? 1\n : shapes\n .filter((shape) => shape.parentId === currentPageId)\n .sort((a, b) => b.childIndex - a.childIndex)[0].childIndex + 1\n }\n\n /* --------------------- Camera --------------------- */\n\n onPinchStart: TLPinchEventHandler = () => {\n this.app.cancelSession()\n this.setStatus(Status.Pinching)\n }\n\n onPinchEnd: TLPinchEventHandler = () => {\n if (Utils.isMobileSafari()) {\n this.app.undoSelect()\n }\n this.setStatus(Status.Idle)\n }\n\n onPinch: TLPinchEventHandler = (info, e) => {\n if (this.status !== 'pinching') return\n if (isNaN(info.delta[0]) || isNaN(info.delta[1])) return\n this.app.pinchZoom(info.point, info.delta, info.delta[2])\n this.onPointerMove?.(info, e as unknown as React.PointerEvent)\n }\n\n /* ---------------------- Keys ---------------------- */\n\n onKeyDown: TLKeyboardEventHandler = (key) => {\n if (key === 'Escape') {\n this.onCancel()\n return\n }\n\n if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n this.app.updateSession()\n return\n }\n }\n\n onKeyUp: TLKeyboardEventHandler = (key) => {\n if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n this.app.updateSession()\n return\n }\n }\n\n /* --------------------- Pointer -------------------- */\n\n onPointerMove: TLPointerEventHandler = () => {\n if (this.status === Status.Creating) {\n this.app.updateSession()\n }\n }\n\n onPointerUp: TLPointerEventHandler = () => {\n if (this.status === Status.Creating) {\n this.app.completeSession()\n\n const { isToolLocked } = this.app.appState\n\n if (!isToolLocked) {\n this.app.selectTool('select')\n }\n }\n\n this.setStatus(Status.Idle)\n }\n}\n", "import { TLPointerEventHandler, Utils } from 'telva-core'\nimport { Draw } from '~state/shapes'\nimport { BaseTool } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nenum Status {\n Idle = 'idle',\n Creating = 'creating',\n Extending = 'extending',\n Pinching = 'pinching',\n}\n\nexport class DrawTool extends BaseTool {\n type = TVShapeType.Draw as const\n\n private lastShapeId?: string\n\n onEnter = () => {\n this.lastShapeId = undefined\n }\n\n onCancel = () => {\n switch (this.status) {\n case Status.Idle: {\n this.app.selectTool('select')\n break\n }\n default: {\n this.setStatus(Status.Idle)\n break\n }\n }\n\n this.app.cancelSession()\n }\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = (info) => {\n if (this.status !== Status.Idle) return\n if (this.app.readOnly) return\n const {\n currentPoint,\n appState: { currentPageId, currentStyle },\n } = this.app\n const previous = this.lastShapeId && this.app.getShape(this.lastShapeId)\n if (info.shiftKey && previous) {\n // Extend the previous shape\n this.app.startSession(SessionType.Draw, previous.id)\n this.setStatus(Status.Extending)\n } else {\n // Create a new shape\n const childIndex = this.getNextChildIndex()\n const id = Utils.uniqueId()\n const newShape = Draw.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: currentPoint,\n style: { ...currentStyle },\n })\n this.lastShapeId = id\n this.app.patchCreate([newShape])\n this.app.startSession(SessionType.Draw, id)\n this.setStatus(Status.Creating)\n }\n }\n\n onPointerMove: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n\n switch (this.status) {\n case Status.Extending:\n case Status.Creating: {\n this.app.updateSession()\n }\n }\n }\n\n onPointerUp: TLPointerEventHandler = () => {\n this.app.completeSession()\n this.setStatus(Status.Idle)\n }\n}\n", "import { TLBoundsCorner, TLPointerEventHandler, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Ellipse } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class EllipseTool extends BaseTool {\n type = TVShapeType.Ellipse as const\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status !== Status.Idle) return\n\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n const newShape = Ellipse.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n style: { ...currentStyle },\n })\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(\n SessionType.TransformSingle,\n newShape.id,\n TLBoundsCorner.BottomRight,\n true\n )\n\n this.setStatus(Status.Creating)\n }\n}\n", "import type { TLPointerEventHandler } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { DEAD_ZONE } from '~constants'\nimport { BaseTool } from '~state/tools/BaseTool'\nimport { SessionType } from '~types'\n\nenum Status {\n Idle = 'idle',\n Pointing = 'pointing',\n Erasing = 'erasing',\n}\n\nexport class EraseTool extends BaseTool {\n type = 'erase' as const\n\n status: Status = Status.Idle\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status !== Status.Idle) return\n\n this.setStatus(Status.Pointing)\n }\n\n onPointerMove: TLPointerEventHandler = (info) => {\n if (this.app.readOnly) return\n switch (this.status) {\n case Status.Pointing: {\n if (Vec.dist(info.origin, info.point) > DEAD_ZONE) {\n this.app.startSession(SessionType.Erase)\n this.app.updateSession()\n this.setStatus(Status.Erasing)\n }\n break\n }\n case Status.Erasing: {\n this.app.updateSession()\n }\n }\n }\n\n onPointerUp: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n switch (this.status) {\n case Status.Pointing: {\n const shapeIdsAtPoint = this.app.shapes\n .filter((shape) => !shape.isLocked)\n .filter((shape) =>\n this.app.getShapeUtil(shape).hitTestPoint(shape, this.app.currentPoint)\n )\n .flatMap((shape) => (shape.children ? [shape.id, ...shape.children] : shape.id))\n\n this.app.delete(shapeIdsAtPoint)\n\n break\n }\n case Status.Erasing: {\n this.app.completeSession()\n\n // Should the app go back to the previous state, the select\n // state, or stay in the eraser state?\n\n // if (this.previous) {\n // this.app.selectTool(this.previous)\n // } else {\n // this.app.selectTool('select')\n // }\n }\n }\n\n this.setStatus(Status.Idle)\n }\n\n onCancel = () => {\n if (this.status === Status.Idle) {\n if (this.previous) {\n this.app.selectTool(this.previous)\n } else {\n this.app.selectTool('select')\n }\n } else {\n this.setStatus(Status.Idle)\n }\n\n this.app.cancelSession()\n }\n}\n", "import { TLPointerEventHandler, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Arrow } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class LineTool extends BaseTool {\n type = TVShapeType.Line as const\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status !== Status.Idle) return\n\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n const newShape = Arrow.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n decorations: {\n start: undefined,\n end: undefined,\n },\n style: { ...currentStyle },\n })\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(SessionType.Arrow, newShape.id, 'end', true)\n\n this.setStatus(Status.Creating)\n }\n}\n", "import {\n TLCanvasEventHandler,\n TLKeyboardEventHandler,\n TLPointerEventHandler,\n Utils,\n} from 'telva-core'\nimport Vec from 'telva-vec'\nimport { mirrorHandle, normalizeSegments } from '~state/shapes/PenUtil/penHelpers'\nimport { BaseTool } from '~state/tools/BaseTool'\nimport { PenSegment, PenShape, TVShapeType } from '~types'\n\nenum Status {\n Idle = 'idle',\n Drawing = 'drawing', // placed one or more nodes, pointer is UP, waiting\n PlacingHandle = 'placing', // pointer is DOWN, dragging to create handles on new node\n}\n\nconst DRAG_THRESHOLD = 4 // px before we start creating handles\n\nexport class PenTool extends BaseTool<Status> {\n type = TVShapeType.Pen as const\n\n currentShapeId?: string\n downPoint?: number[] // pointer-down page position\n currentSegmentIdx = 0\n\n onEnter = () => {\n this.currentShapeId = undefined\n this.setStatus(Status.Idle)\n }\n\n onExit = () => {\n // Finish any in-progress shape\n if (this.currentShapeId) this.finishShape()\n this.currentShapeId = undefined\n this.setStatus(Status.Idle)\n }\n\n onCancel = () => {\n if (this.currentShapeId) {\n // Delete the incomplete shape\n this.app.delete([this.currentShapeId])\n this.currentShapeId = undefined\n }\n this.setStatus(Status.Idle)\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private getShape(): PenShape | undefined {\n if (!this.currentShapeId) return undefined\n return this.app.getShape<PenShape>(this.currentShapeId)\n }\n\n private get currentSegments(): PenSegment[] {\n return this.getShape()?.segments ?? []\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n private startNewShape(pagePoint: number[]) {\n const {\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const id = Utils.uniqueId()\n const childIndex = this.getNextChildIndex()\n\n const firstSeg: PenSegment = { point: [0, 0] }\n\n const newShape = {\n id,\n type: TVShapeType.Pen,\n name: 'Pen',\n parentId: currentPageId,\n childIndex,\n point: pagePoint,\n rotation: 0,\n style: { ...currentStyle },\n segments: [firstSeg],\n isClosed: false,\n isComplete: false,\n } as PenShape\n\n this.currentShapeId = id\n this.currentSegmentIdx = 0\n\n this.app.patchCreate([newShape])\n }\n\n private addSegment(localPoint: number[], cp1?: number[], cp2?: number[]) {\n const shape = this.getShape()\n if (!shape) return\n\n const newSeg: PenSegment = { point: localPoint, cp1, cp2 }\n const newSegs = [...shape.segments, newSeg]\n\n this.currentSegmentIdx = newSegs.length - 1\n\n this.app.patchState({\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: { [shape.id]: { segments: newSegs } },\n },\n },\n },\n })\n }\n\n private updateLastSegmentHandles(cp1?: number[], cp2?: number[]) {\n const shape = this.getShape()\n if (!shape || shape.segments.length === 0) return\n\n const segs = [...shape.segments]\n const last = segs[segs.length - 1]\n segs[segs.length - 1] = {\n ...last,\n cp1: cp1 ?? last.cp1,\n cp2: cp2 ?? last.cp2,\n }\n\n this.app.patchState({\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: { [shape.id]: { segments: segs } },\n },\n },\n },\n })\n }\n\n private commitHandles(cp1?: number[], cp2?: number[]) {\n const shape = this.getShape()\n if (!shape || shape.segments.length === 0) return\n\n const segs = [...shape.segments]\n const last = segs[segs.length - 1]\n segs[segs.length - 1] = {\n ...last,\n cp1: cp1 !== undefined ? cp1 : last.cp1,\n cp2: cp2 !== undefined ? cp2 : last.cp2,\n }\n\n this.app.patchState({\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: { [shape.id]: { segments: segs } },\n },\n },\n },\n })\n }\n\n /** Convert page coordinates to shape-local coordinates */\n private toLocal(pagePoint: number[]): number[] {\n const shape = this.getShape()\n if (!shape) return pagePoint\n return Vec.sub(pagePoint, shape.point)\n }\n\n /** Detect if a page point is near the first segment (to close path) */\n private isNearFirstNode(pagePoint: number[]): boolean {\n const shape = this.getShape()\n if (!shape || shape.segments.length < 2) return false\n const firstNodePage = Vec.add(shape.point, shape.segments[0].point)\n return Vec.dist(pagePoint, firstNodePage) <= 10 / (this.app.zoom ?? 1)\n }\n\n private finishShape() {\n const shapeId = this.currentShapeId\n if (!shapeId) return\n\n const shape = this.app.getShape<PenShape>(shapeId)\n if (!shape) return\n\n // Normalize positions and mark complete\n const { segments: normalized, offset } = normalizeSegments(shape.segments)\n const newPoint = Vec.add(shape.point, offset)\n\n this.app.updateShapes({\n id: shapeId,\n point: newPoint,\n segments: normalized,\n isComplete: true,\n })\n\n this.app.select(shapeId)\n this.currentShapeId = undefined\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Event Handlers\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n onPointerDown: TLPointerEventHandler = (info) => {\n if (info.spaceKey) return\n\n const pagePoint = this.app.getPagePoint(info.point)\n this.downPoint = pagePoint\n\n if (this.status === Status.Idle || !this.currentShapeId) {\n // Start a new shape\n this.startNewShape(pagePoint)\n this.setStatus(Status.PlacingHandle)\n return\n }\n\n if (this.status === Status.Drawing) {\n // Check if clicking on first node to close path\n if (this.isNearFirstNode(pagePoint)) {\n const shape = this.getShape()\n if (shape && shape.segments.length >= 2) {\n const { segments: normalized, offset } = normalizeSegments(shape.segments)\n this.app.updateShapes({\n id: shape.id,\n point: Vec.add(shape.point, offset),\n segments: normalized,\n isClosed: true,\n isComplete: true,\n })\n this.app.select(shape.id)\n this.currentShapeId = undefined\n this.setStatus(Status.Idle)\n return\n }\n }\n\n // Add a new segment at this point\n const local = this.toLocal(pagePoint)\n this.addSegment(local)\n this.setStatus(Status.PlacingHandle)\n }\n }\n\n onPointerMove: TLPointerEventHandler = (info) => {\n if (info.spaceKey) return\n\n if (this.status === Status.PlacingHandle && this.downPoint) {\n const pagePoint = this.app.getPagePoint(info.point)\n const dragDist = Vec.dist(pagePoint, this.downPoint)\n\n if (dragDist > DRAG_THRESHOLD) {\n // Compute drag vector relative to last anchor point in local space\n const shape = this.getShape()\n if (!shape || shape.segments.length === 0) return\n\n const anchor = shape.segments[shape.segments.length - 1].point\n const localDown = Vec.sub(this.downPoint, shape.point)\n const delta = Vec.sub(Vec.sub(pagePoint, shape.point), localDown)\n\n // cp2 = anchor + delta (outgoing, in drag direction)\n // cp1 = anchor - delta (incoming, mirror for smooth node)\n const cp2 = Vec.add(anchor, delta)\n const cp1 = mirrorHandle(anchor, cp2)\n\n this.updateLastSegmentHandles(cp1, cp2)\n }\n }\n }\n\n onPointerUp: TLPointerEventHandler = (info) => {\n if (this.status === Status.PlacingHandle) {\n this.setStatus(Status.Drawing)\n }\n }\n\n onDoubleClickCanvas: TLCanvasEventHandler = () => {\n if (this.currentShapeId) {\n // Remove the last segment that was added on this double-click's first click\n const shape = this.getShape()\n if (shape && shape.segments.length > 1) {\n const trimmed = shape.segments.slice(0, -1)\n this.app.patchState({\n document: {\n pages: {\n [this.app.currentPageId]: {\n shapes: { [shape.id]: { segments: trimmed } },\n },\n },\n },\n })\n }\n this.finishShape()\n this.setStatus(Status.Idle)\n }\n }\n\n onKeyDown: TLKeyboardEventHandler = (key, info, e) => {\n switch (key) {\n case 'Escape': {\n this.onCancel()\n break\n }\n case 'Enter': {\n if (this.currentShapeId) {\n this.finishShape()\n this.setStatus(Status.Idle)\n }\n break\n }\n }\n }\n}\n", "import { TLBoundsCorner, TLPointerEventHandler, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Rectangle } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class RectangleTool extends BaseTool {\n type = TVShapeType.Rectangle as const\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status !== Status.Idle) return\n\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n const newShape = Rectangle.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n style: { ...currentStyle },\n })\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(\n SessionType.TransformSingle,\n newShape.id,\n TLBoundsCorner.BottomRight,\n true\n )\n\n this.setStatus(Status.Creating)\n }\n}\n", "import {\n TLBoundsCorner,\n TLBoundsEdge,\n TLBoundsEventHandler,\n TLBoundsHandleEventHandler,\n TLCanvasEventHandler,\n TLKeyboardEventHandler,\n TLPointerEventHandler,\n TLShapeCloneHandler,\n Utils,\n} from 'telva-core'\nimport Vec from 'telva-vec'\nimport { CLONING_DISTANCE, DEAD_ZONE } from '~constants'\nimport { TVDR } from '~state/TVDR'\nimport { BaseTool } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nenum Status {\n Idle = 'idle',\n Creating = 'creating',\n Pinching = 'pinching',\n PointingCanvas = 'pointingCanvas',\n PointingHandle = 'pointingHandle',\n PointingBounds = 'pointingBounds',\n PointingClone = 'pointingClone',\n TranslatingClone = 'translatingClone',\n PointingBoundsHandle = 'pointingBoundsHandle',\n TranslatingHandle = 'translatingHandle',\n Translating = 'translating',\n Transforming = 'transforming',\n Rotating = 'rotating',\n Brushing = 'brushing',\n GridCloning = 'gridCloning',\n ClonePainting = 'clonePainting',\n}\n\nexport class SelectTool extends BaseTool<Status> {\n type = 'select' as const\n\n pointedId?: string\n\n selectedGroupId?: string\n\n pointedHandleId?: 'start' | 'end' | 'bend'\n\n pointedBoundsHandle?: TLBoundsCorner | TLBoundsEdge | 'rotate' | 'center' | 'left' | 'right'\n\n pointedLinkHandleId?: 'left' | 'center' | 'right'\n\n /* --------------------- Methods -------------------- */\n\n private deselect(id: string) {\n this.app.select(...this.app.selectedIds.filter((oid) => oid !== id))\n }\n\n private select(id: string) {\n this.app.select(id)\n }\n\n private pushSelect(id: string) {\n const shape = this.app.getShape(id)\n this.app.select(...this.app.selectedIds.filter((oid) => oid !== shape.parentId), id)\n }\n\n private selectNone() {\n this.app.selectNone()\n }\n\n onEnter = () => {\n this.setStatus(Status.Idle)\n }\n\n onExit = () => {\n this.setStatus(Status.Idle)\n }\n\n clonePaint = (point: number[]) => {\n if (this.app.selectedIds.length === 0) return\n\n const shapes = this.app.selectedIds.map((id) => this.app.getShape(id))\n\n const bounds = Utils.expandBounds(Utils.getCommonBounds(shapes.map(TVDR.getBounds)), 16)\n\n const center = Utils.getBoundsCenter(bounds)\n\n const size = [bounds.width, bounds.height]\n\n const gridPoint = [\n center[0] + size[0] * Math.floor((point[0] + size[0] / 2 - center[0]) / size[0]),\n center[1] + size[1] * Math.floor((point[1] + size[1] / 2 - center[1]) / size[1]),\n ]\n\n const centeredBounds = Utils.centerBounds(bounds, gridPoint)\n\n const hit = this.app.shapes.some((shape) =>\n TVDR.getShapeUtil(shape).hitTestBounds(shape, centeredBounds)\n )\n\n if (!hit) {\n this.app.duplicate(this.app.selectedIds, gridPoint)\n }\n }\n\n getShapeClone = (\n id: string,\n side:\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'topLeft'\n | 'topRight'\n | 'bottomRight'\n | 'bottomLeft'\n ) => {\n const shape = this.app.getShape(id)\n\n const utils = TVDR.getShapeUtil(shape)\n\n if (utils.canClone) {\n const bounds = utils.getBounds(shape)\n\n const center = utils.getCenter(shape)\n\n let point = {\n top: [bounds.minX, bounds.minY - (bounds.height + CLONING_DISTANCE)],\n right: [bounds.maxX + CLONING_DISTANCE, bounds.minY],\n bottom: [bounds.minX, bounds.maxY + CLONING_DISTANCE],\n left: [bounds.minX - (bounds.width + CLONING_DISTANCE), bounds.minY],\n topLeft: [\n bounds.minX - (bounds.width + CLONING_DISTANCE),\n bounds.minY - (bounds.height + CLONING_DISTANCE),\n ],\n topRight: [\n bounds.maxX + CLONING_DISTANCE,\n bounds.minY - (bounds.height + CLONING_DISTANCE),\n ],\n bottomLeft: [\n bounds.minX - (bounds.width + CLONING_DISTANCE),\n bounds.maxY + CLONING_DISTANCE,\n ],\n bottomRight: [bounds.maxX + CLONING_DISTANCE, bounds.maxY + CLONING_DISTANCE],\n }[side]\n\n if (shape.rotation !== 0) {\n const newCenter = Vec.add(point, [bounds.width / 2, bounds.height / 2])\n\n const rotatedCenter = Vec.rotWith(newCenter, center, shape.rotation || 0)\n\n point = Vec.sub(rotatedCenter, [bounds.width / 2, bounds.height / 2])\n }\n\n const id = Utils.uniqueId()\n\n const clone = {\n ...shape,\n id,\n point,\n }\n\n if (clone.type === TVShapeType.Sticky) {\n clone.text = ''\n }\n\n return clone\n }\n\n return\n }\n\n /* ----------------- Event Handlers ----------------- */\n\n onCancel = () => {\n if (this.app.session) {\n this.app.cancelSession()\n } else {\n this.selectNone()\n }\n\n this.setStatus(Status.Idle)\n }\n\n onKeyDown: TLKeyboardEventHandler = (key, info, e) => {\n switch (key) {\n case 'Escape': {\n this.onCancel()\n break\n }\n case 'Tab': {\n if (this.app.readOnly) return\n\n if (\n !this.app.pageState.editingId &&\n this.status === Status.Idle &&\n this.app.selectedIds.length === 1\n ) {\n const [selectedId] = this.app.selectedIds\n const clonedShape = this.getShapeClone(selectedId, 'right')\n\n if (clonedShape) {\n this.app.createShapes(clonedShape)\n this.setStatus(Status.Idle)\n if (clonedShape.type === TVShapeType.Sticky) {\n this.app.select(clonedShape.id)\n this.app.setEditingId(clonedShape.id)\n }\n }\n }\n break\n }\n case 'Meta':\n case 'Control':\n case 'Alt': {\n this.app.updateSession()\n break\n }\n case 'Enter': {\n if (this.app.readOnly) return\n\n const { pageState } = this.app\n if (pageState.selectedIds.length === 1 && !pageState.editingId) {\n this.app.setEditingId(pageState.selectedIds[0])\n e.preventDefault()\n }\n }\n }\n }\n\n onKeyUp: TLKeyboardEventHandler = (key, info) => {\n if (this.status === Status.ClonePainting && !(info.altKey && info.shiftKey)) {\n this.setStatus(Status.Idle)\n return\n }\n\n /* noop */\n if (key === 'Meta' || key === 'Control' || key === 'Alt') {\n this.app.updateSession()\n return\n }\n }\n\n // Keyup is handled on BaseTool\n\n // Pointer Events (generic)\n\n onPointerMove: TLPointerEventHandler = () => {\n const { originPoint, currentPoint } = this.app\n\n if (this.app.readOnly && this.app.isPointing) {\n if (this.app.session) {\n this.app.updateSession()\n } else {\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n this.app.startSession(SessionType.Brush)\n this.setStatus(Status.Brushing)\n }\n }\n return\n }\n\n switch (this.status) {\n case Status.PointingBoundsHandle: {\n if (!this.pointedBoundsHandle) throw Error('No pointed bounds handle')\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n if (this.pointedBoundsHandle === 'rotate') {\n // Stat a rotate session\n this.setStatus(Status.Rotating)\n this.app.startSession(SessionType.Rotate)\n } else if (\n this.pointedBoundsHandle === 'center' ||\n this.pointedBoundsHandle === 'left' ||\n this.pointedBoundsHandle === 'right'\n ) {\n this.setStatus(Status.Translating)\n this.app.startSession(SessionType.Translate, false, this.pointedBoundsHandle)\n } else {\n // Stat a transform session\n this.setStatus(Status.Transforming)\n const idsToTransform = this.app.selectedIds.flatMap((id) =>\n TVDR.getDocumentBranch(this.app.state, id, this.app.currentPageId)\n )\n if (idsToTransform.length === 1) {\n // if only one shape is selected, transform single\n this.app.startSession(\n SessionType.TransformSingle,\n idsToTransform[0],\n this.pointedBoundsHandle\n )\n } else {\n // otherwise, transform\n this.app.startSession(SessionType.Transform, this.pointedBoundsHandle)\n }\n }\n\n // Also update the session with the current point\n this.app.updateSession()\n }\n break\n }\n case Status.PointingCanvas: {\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n this.app.startSession(SessionType.Brush)\n this.setStatus(Status.Brushing)\n }\n break\n }\n case Status.PointingClone: {\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n this.setStatus(Status.TranslatingClone)\n this.app.startSession(SessionType.Translate)\n this.app.updateSession()\n }\n break\n }\n case Status.PointingBounds: {\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n this.setStatus(Status.Translating)\n this.app.startSession(SessionType.Translate)\n this.app.updateSession()\n }\n break\n }\n case Status.PointingHandle: {\n if (!this.pointedHandleId) throw Error('No pointed handle')\n if (Vec.dist(originPoint, currentPoint) > DEAD_ZONE) {\n this.setStatus(Status.TranslatingHandle)\n const selectedShape = this.app.getShape(this.app.selectedIds[0])\n if (selectedShape) {\n if (this.pointedHandleId === 'bend') {\n this.app.startSession(SessionType.Handle, selectedShape.id, this.pointedHandleId)\n this.app.updateSession()\n } else {\n this.app.startSession(\n SessionType.Arrow,\n selectedShape.id,\n this.pointedHandleId,\n false\n )\n this.app.updateSession()\n }\n }\n }\n break\n }\n case Status.ClonePainting: {\n this.clonePaint(currentPoint)\n break\n }\n default: {\n if (this.app.session) {\n this.app.updateSession()\n break\n }\n }\n }\n }\n\n onPointerDown: TLPointerEventHandler = (info, e) => {\n if (info.target === 'canvas' && this.status === Status.Idle) {\n const { currentPoint } = this.app\n\n if (info.spaceKey && e.buttons === 1) return\n\n if (this.status === Status.Idle && info.altKey && info.shiftKey) {\n this.setStatus(Status.ClonePainting)\n this.clonePaint(currentPoint)\n return\n }\n\n // Unless the user is holding shift or meta, clear the current selection\n if (!info.shiftKey) {\n this.app.onShapeBlur()\n\n if (info.altKey && this.app.selectedIds.length > 0) {\n this.app.duplicate(this.app.selectedIds, currentPoint)\n return\n }\n\n this.selectNone()\n }\n\n this.setStatus(Status.PointingCanvas)\n }\n }\n\n onPointerUp: TLPointerEventHandler = (info) => {\n if (this.status === Status.TranslatingClone || this.status === Status.PointingClone) {\n if (this.pointedId) {\n this.app.completeSession()\n this.app.setEditingId(this.pointedId)\n }\n this.setStatus(Status.Idle)\n this.pointedId = undefined\n return\n }\n\n if (this.status === Status.PointingBounds) {\n if (info.target === 'bounds') {\n // If we just clicked the selecting bounds's background,\n // clear the selection\n this.selectNone()\n } else if (this.app.isSelected(info.target)) {\n // If we're holding shift...\n if (info.shiftKey) {\n // unless we just shift-selected the shape, remove it from\n // the selected shapes\n if (this.pointedId !== info.target) {\n this.deselect(info.target)\n }\n } else {\n // If we have other selected shapes, select this one instead\n if (this.pointedId !== info.target && this.app.selectedIds.length > 1) {\n this.select(info.target)\n }\n }\n } else if (this.pointedId === info.target) {\n if (this.app.getShape(info.target).isLocked) return\n // If the target is not selected and was just pointed\n // on pointer down...\n if (info.shiftKey) {\n this.pushSelect(info.target)\n } else {\n this.select(info.target)\n }\n }\n }\n\n // Complete the current session, if any; and reset the status\n\n this.setStatus(Status.Idle)\n this.pointedBoundsHandle = undefined\n this.pointedHandleId = undefined\n this.pointedId = undefined\n\n // Don't complete a session if we've just started one\n if (this.app.session?.type === SessionType.Edit) {\n return\n }\n\n this.app.completeSession()\n }\n\n // Canvas\n\n onDoubleClickCanvas: TLCanvasEventHandler = () => {\n if (this.app.readOnly) return\n // Needs debugging\n // const { currentPoint } = this.app\n // this.app.selectTool(TVShapeType.Text)\n // this.setStatus(Status.Idle)\n // this.app.createTextShapeAtPoint(currentPoint)\n }\n\n // Shape\n\n onPointShape: TLPointerEventHandler = (info, e) => {\n if (info.spaceKey && e.buttons === 1) return\n\n if (this.app.getShape(info.target).isLocked) return\n\n const { editingId, hoveredId } = this.app.pageState\n\n if (editingId && info.target !== editingId) {\n this.app.onShapeBlur()\n }\n\n // While holding command and shift, select or deselect\n // the shape, ignoring any group that may contain it. Yikes!\n if (\n (this.status === Status.Idle || this.status === Status.PointingBounds) &&\n info.metaKey &&\n info.shiftKey &&\n hoveredId\n ) {\n this.pointedId = hoveredId\n\n if (this.app.isSelected(hoveredId)) {\n this.deselect(hoveredId)\n } else {\n this.pushSelect(hoveredId)\n this.setStatus(Status.PointingBounds)\n }\n\n return\n }\n\n if (this.status === Status.PointingBounds) {\n // The pointed id should be the shape's group, if it belongs\n // to a group, or else the shape itself, if it is on the page.\n const { parentId } = this.app.getShape(info.target)\n this.pointedId = parentId === this.app.currentPageId ? info.target : parentId\n return\n }\n\n if (this.status === Status.Idle) {\n this.setStatus(Status.PointingBounds)\n\n if (info.metaKey) {\n if (!info.shiftKey) {\n this.selectNone()\n }\n\n this.app.startSession(SessionType.Brush)\n\n this.setStatus(Status.Brushing)\n return\n }\n\n // If we've clicked on a shape that is inside of a group,\n // then select the group rather than the shape.\n let shapeIdToSelect: string\n const { parentId } = this.app.getShape(info.target)\n\n // If the pointed shape is a child of the page, select the\n // target shape and clear the selected group id.\n if (parentId === this.app.currentPageId) {\n shapeIdToSelect = info.target\n this.selectedGroupId = undefined\n } else {\n // If the parent is some other group...\n if (parentId === this.selectedGroupId) {\n // If that group is the selected group, then select\n // the target shape.\n shapeIdToSelect = info.target\n } else {\n // Otherwise, select the group and clear the selected\n // group id.\n shapeIdToSelect = parentId\n\n this.selectedGroupId = undefined\n }\n }\n\n if (!this.app.isSelected(shapeIdToSelect)) {\n // Set the pointed ID to the shape that was clicked.\n this.pointedId = shapeIdToSelect\n\n // If the shape is not selected: then if the user is pressing shift,\n // add the shape to the current selection; otherwise, set the shape as\n // the only selected shape.\n if (info.shiftKey) {\n this.pushSelect(shapeIdToSelect)\n } else {\n this.select(shapeIdToSelect)\n }\n }\n }\n }\n\n onDoubleClickShape: TLPointerEventHandler = (info) => {\n if (this.app.readOnly) return\n\n const shape = this.app.getShape(info.target)\n\n if (shape.isLocked) {\n this.app.select(info.target)\n return\n }\n\n // If we can edit the shape (and if we can select the shape) then\n // start editing\n if (\n TVDR.getShapeUtil(shape.type).canEdit &&\n (shape.parentId === this.app.currentPageId || shape.parentId === this.selectedGroupId)\n ) {\n this.app.setEditingId(info.target)\n }\n\n // If the shape is the child of a group, then drill into the group?\n if (shape.parentId !== this.app.currentPageId) {\n this.selectedGroupId = shape.parentId\n }\n\n this.app.select(info.target)\n }\n\n onRightPointShape: TLPointerEventHandler = (info) => {\n if (!this.app.isSelected(info.target)) {\n this.app.select(info.target)\n }\n }\n\n onHoverShape: TLPointerEventHandler = (info) => {\n this.app.setHoveredId(info.target)\n }\n\n onUnhoverShape: TLPointerEventHandler = (info) => {\n const { currentPageId: oldCurrentPageId } = this.app\n\n // Wait a frame; and if we haven't changed the hovered id,\n // clear the current hovered id\n requestAnimationFrame(() => {\n if (\n oldCurrentPageId === this.app.currentPageId &&\n this.app.pageState.hoveredId === info.target\n ) {\n this.app.setHoveredId(undefined)\n }\n })\n }\n\n /* --------------------- Bounds --------------------- */\n\n onPointBounds: TLBoundsEventHandler = (info) => {\n if (info.metaKey) {\n if (!info.shiftKey) {\n this.selectNone()\n }\n\n this.app.startSession(SessionType.Brush)\n\n this.setStatus(Status.Brushing)\n return\n }\n\n this.setStatus(Status.PointingBounds)\n }\n\n onRightPointBounds: TLPointerEventHandler = (info, e) => {\n e.stopPropagation()\n }\n\n onReleaseBounds: TLBoundsEventHandler = () => {\n if (this.status === Status.Translating || this.status === Status.Brushing) {\n this.app.completeSession()\n }\n\n this.setStatus(Status.Idle)\n }\n\n /* ----------------- Bounds Handles ----------------- */\n\n onPointBoundsHandle: TLBoundsHandleEventHandler = (info) => {\n this.pointedBoundsHandle = info.target\n this.setStatus(Status.PointingBoundsHandle)\n }\n\n onDoubleClickBoundsHandle: TLBoundsHandleEventHandler = (info) => {\n switch (info.target) {\n case 'center':\n case 'left':\n case 'right': {\n this.app.select(\n ...TVDR.getLinkedShapeIds(\n this.app.state,\n this.app.currentPageId,\n info.target,\n info.shiftKey\n )\n )\n break\n }\n default: {\n if (this.app.selectedIds.length === 1) {\n this.app.resetBounds(this.app.selectedIds)\n const shape = this.app.getShape(this.app.selectedIds[0])\n if ('label' in shape) {\n this.app.setEditingId(shape.id)\n }\n }\n }\n }\n }\n\n onReleaseBoundsHandle: TLBoundsHandleEventHandler = () => {\n this.setStatus(Status.Idle)\n }\n\n /* --------------------- Handles -------------------- */\n\n onPointHandle: TLPointerEventHandler = (info) => {\n this.pointedHandleId = info.target as 'start' | 'end'\n this.setStatus(Status.PointingHandle)\n }\n\n onDoubleClickHandle: TLPointerEventHandler = (info) => {\n if (info.target === 'bend') {\n const { selectedIds } = this.app\n if (selectedIds.length !== 1) return\n const shape = this.app.getShape(selectedIds[0])\n if (\n TVDR.getShapeUtil(shape.type).canEdit &&\n (shape.parentId === this.app.currentPageId || shape.parentId === this.selectedGroupId)\n ) {\n this.app.setEditingId(shape.id)\n }\n return\n }\n\n this.app.toggleDecoration(info.target)\n }\n\n onReleaseHandle: TLPointerEventHandler = () => {\n this.setStatus(Status.Idle)\n }\n\n /* ---------------------- Misc ---------------------- */\n\n onShapeClone: TLShapeCloneHandler = (info) => {\n const selectedShapeId = this.app.selectedIds[0]\n\n const clonedShape = this.getShapeClone(selectedShapeId, info.target)\n\n if (\n info.target === 'left' ||\n info.target === 'right' ||\n info.target === 'top' ||\n info.target === 'bottom'\n ) {\n if (clonedShape) {\n this.app.createShapes(clonedShape)\n\n // Now start pointing the bounds, so that a user can start\n // dragging to reposition if they wish.\n this.pointedId = clonedShape.id\n this.setStatus(Status.PointingClone)\n }\n } else {\n this.setStatus(Status.GridCloning)\n this.app.startSession(SessionType.Grid, selectedShapeId)\n }\n }\n}\n", "import type { TLPointerEventHandler } from 'telva-core'\nimport { Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Sticky } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class StickyTool extends BaseTool {\n type = TVShapeType.Sticky as const\n\n shapeId?: string\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status === Status.Creating) {\n this.setStatus(Status.Idle)\n\n if (!this.app.appState.isToolLocked) {\n this.app.selectTool('select')\n }\n\n return\n }\n\n if (this.status === Status.Idle) {\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n this.shapeId = id\n\n const newShape = Sticky.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n style: { ...currentStyle },\n })\n\n const bounds = Sticky.getBounds(newShape)\n\n newShape.point = Vec.sub(newShape.point, [bounds.width / 2, bounds.height / 2])\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(SessionType.Translate)\n\n this.setStatus(Status.Creating)\n }\n }\n\n onPointerUp: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status === Status.Creating) {\n this.setStatus(Status.Idle)\n this.app.completeSession()\n this.app.selectTool('select')\n this.app.setEditingId(this.shapeId)\n }\n }\n}\n", "import type { TLKeyboardEventHandler, TLPointerEventHandler } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { TVShapeType } from '~types'\n\nexport class TextTool extends BaseTool {\n type = TVShapeType.Text as const\n\n /* --------------------- Methods -------------------- */\n\n stopEditingShape = () => {\n this.setStatus(Status.Idle)\n\n if (!this.app.appState.isToolLocked) {\n this.app.selectTool('select')\n }\n }\n\n /* ----------------- Event Handlers ----------------- */\n\n onKeyUp: TLKeyboardEventHandler = () => {\n // noop\n }\n\n onKeyDown: TLKeyboardEventHandler = () => {\n // noop\n }\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.status === Status.Creating) {\n this.stopEditingShape()\n return\n }\n\n if (this.status === Status.Idle) {\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n } = this.app\n\n this.app.createTextShapeAtPoint(\n showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n undefined,\n true\n )\n this.setStatus(Status.Creating)\n return\n }\n }\n\n onPointerUp: TLPointerEventHandler = () => {\n // noop important! We don't want the inherited event\n // from BaseUtil to run.\n }\n\n onPointShape: TLPointerEventHandler = (info) => {\n if (this.app.readOnly) return\n const shape = this.app.getShape(info.target)\n if (shape.type === TVShapeType.Text) {\n this.setStatus(Status.Idle)\n this.app.setEditingId(shape.id)\n }\n }\n\n onShapeBlur = () => {\n if (this.app.readOnly) return\n this.stopEditingShape()\n }\n}\n", "import { TLBoundsCorner, TLPointerEventHandler, Utils } from 'telva-core'\nimport Vec from 'telva-vec'\nimport { Triangle } from '~state/shapes'\nimport { BaseTool, Status } from '~state/tools/BaseTool'\nimport { SessionType, TVShapeType } from '~types'\n\nexport class TriangleTool extends BaseTool {\n type = TVShapeType.Triangle as const\n\n /* ----------------- Event Handlers ----------------- */\n\n onPointerDown: TLPointerEventHandler = () => {\n if (this.app.readOnly) return\n if (this.status !== Status.Idle) return\n\n const {\n currentPoint,\n currentGrid,\n settings: { showGrid },\n appState: { currentPageId, currentStyle },\n } = this.app\n\n const childIndex = this.getNextChildIndex()\n\n const id = Utils.uniqueId()\n\n const newShape = Triangle.create({\n id,\n parentId: currentPageId,\n childIndex,\n point: showGrid ? Vec.snap(currentPoint, currentGrid) : currentPoint,\n style: { ...currentStyle },\n })\n\n this.app.patchCreate([newShape])\n\n this.app.startSession(\n SessionType.TransformSingle,\n newShape.id,\n TLBoundsCorner.BottomRight,\n true\n )\n\n this.setStatus(Status.Creating)\n }\n}\n", "import { TVShapeType, TVToolType } from '~types'\nimport { ArrowTool } from './ArrowTool'\nimport { DrawTool } from './DrawTool'\nimport { EllipseTool } from './EllipseTool'\nimport { EraseTool } from './EraseTool'\nimport { LineTool } from './LineTool'\nimport { PenTool } from './PenTool'\nimport { RectangleTool } from './RectangleTool'\nimport { SelectTool } from './SelectTool'\nimport { StickyTool } from './StickyTool'\nimport { TextTool } from './TextTool'\nimport { TriangleTool } from './TriangleTool'\n\nexport interface ToolsMap {\n select: typeof SelectTool\n erase: typeof EraseTool\n [TVShapeType.Text]: typeof TextTool\n [TVShapeType.Draw]: typeof DrawTool\n [TVShapeType.Ellipse]: typeof EllipseTool\n [TVShapeType.Rectangle]: typeof RectangleTool\n [TVShapeType.Triangle]: typeof TriangleTool\n [TVShapeType.Line]: typeof LineTool\n [TVShapeType.Arrow]: typeof ArrowTool\n [TVShapeType.Sticky]: typeof StickyTool\n [TVShapeType.Pen]: typeof PenTool\n}\n\nexport type ToolOfType<K extends TVToolType> = ToolsMap[K]\n\nexport type ArgsOfType<K extends TVToolType> = ConstructorParameters<ToolOfType<K>>\n\nexport const tools: { [K in TVToolType]: ToolsMap[K] } = {\n select: SelectTool,\n erase: EraseTool,\n [TVShapeType.Text]: TextTool,\n [TVShapeType.Draw]: DrawTool,\n [TVShapeType.Ellipse]: EllipseTool,\n [TVShapeType.Rectangle]: RectangleTool,\n [TVShapeType.Triangle]: TriangleTool,\n [TVShapeType.Line]: LineTool,\n [TVShapeType.Arrow]: ArrowTool,\n [TVShapeType.Sticky]: StickyTool,\n [TVShapeType.Pen]: PenTool,\n}\n"],
5
+ "mappings": "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E,EAAe,GACpBF,EAAI,qBAA+B,CACrC,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,MACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,iBAA2B,CACjC,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,MACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,kBAA4B,CAClC,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,MACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,iBAA2B,CACjC,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,MACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,mBAA6B,CACnC,EACA,OACA,CAACA,CAAG,CACN,KAMA,cACE,8BACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,eAAe,EACnBM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAIA,cACE,kBACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,gBAAgB,CACtB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,8BACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,EAIA,GAAM,CAAE,aAAAS,EAAc,cAAAC,EAAe,cAAAC,EAAe,gBAAAC,EAAiB,YAAAC,CAAY,EAC/EC,GAAsB,KAExB,cACE,kBACCR,GAAM,CACLA,EAAE,eAAe,EACZJ,EAAe,GACpBO,EAAaH,CAAC,CAChB,EACA,OACA,CAACN,CAAG,CACN,KACA,cACE,kBACCM,GAAM,CACD,CAACJ,EAAe,GAEpBS,EAAcL,CAAC,CACjB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,8BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBU,EAAgBN,CAAC,CACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,0BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBF,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,EACA,OACA,CAACA,CAAG,CACN,KACA,cACE,0BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBF,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,EACA,OACA,CAACA,CAAG,CACN,KACA,cACE,0BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBF,EAAI,mBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,EACA,OACA,CAACA,CAAG,CACN,KACA,cACE,0BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBF,EAAI,mBAA+B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC7D,EACA,OACA,CAACA,CAAG,CACN,KACA,cACE,0BACCM,GAAM,CACD,CAACJ,EAAe,GAEpBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,kBACCM,GAAM,CACD,CAACJ,EAAe,GAEpBQ,EAAcJ,CAAC,CACjB,EACA,OACA,CAACN,CAAG,CACN,KACA,cACE,kBACCM,GAAM,CACD,CAACJ,EAAe,GACpBW,EAAYP,CAAC,CACf,EACA,OACA,CAACN,CAAG,CACN,KAIA,cACE,kBACCM,GAAM,CACLA,EAAE,eAAe,EACZJ,EAAe,EAAI,IAEpBF,EAAI,QACNA,EAAI,cAAc,EAElBA,EAAI,KAAK,EAEb,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,8BACA,IAAM,CACA,CAACE,EAAe,EAAI,IAEpBF,EAAI,QACNA,EAAI,cAAc,EAElBA,EAAI,KAAK,EAEb,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,kBACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,8BACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,KAMA,cACE,8CACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,OAAO,EACXM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,wDACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IAExBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,wCACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,gBAAgB,CACtB,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,kBACCM,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,UAAU,EACdM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAIA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,eAAe,CACrB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,SACA,IAAM,CACA,CAACE,EAAe,EAAI,GAExBF,EAAI,OAAO,CACb,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,gBACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,OAAO,CACb,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,kBACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,UAAU,CAChB,EACA,OACA,CAACA,CAAG,CACN,KAIA,cACE,KACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,EAAE,EAAG,EAAK,CAC1B,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,QACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAK,CACzB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,OACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAK,CACzB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,OACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,GAAI,CAAC,EAAG,EAAK,CAC1B,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,WACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,EAAE,EAAG,EAAI,CACzB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,cACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAI,CACxB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,aACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,EAAG,CAAC,EAAG,EAAI,CACxB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,aACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,MAAM,CAAC,GAAI,CAAC,EAAG,EAAI,CACzB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,8BACA,IAAM,CACA,CAACE,EAAe,GACpBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,KAcA,cACE,8BACCM,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAyBA,cACE,kBACCM,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,MAAM,EACVM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,8BACCM,GAAM,CACD,CAACJ,EAAe,IAEpBF,EAAI,QAAQ,EACZM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAIA,cACE,IACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,aAAa,CACnB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,IACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,YAAY,CAClB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,WAAW,CACjB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,UACA,IAAM,CACA,CAACE,EAAe,EAAI,GACxBF,EAAI,YAAY,CAClB,EACA,OACA,CAACA,CAAG,CACN,KAEA,cACE,8CACCM,GAAM,CACD,CAACJ,EAAe,IAChBF,EAAI,SAAS,aACfA,EAAI,cAAc,EAEpBM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAIA,cACE,2BACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,MAAM,CAAE,iBAA4B,CAAC,EACzCM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,2BACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,MAAM,CAAE,kBAA6B,CAAC,EAC1CM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,KAEA,cACE,2BACCM,GAAM,CACD,CAACJ,EAAe,EAAI,IACxBF,EAAI,MAAM,CAAE,eAA0B,CAAC,EACvCM,EAAE,eAAe,EACnB,EACA,OACA,CAACN,CAAG,CACN,CACF,CEjuBA,IAAAe,GAAuB,oBAGVC,GAAqB,iBAAwB,CAAC,CAAa,EAElEC,GAAiB,IAAM,CAC3B,GAAM,CAACC,EAAQC,CAAQ,EAAU,YAAS,CAAC,EACrC,aAAU,IAAMA,EAAS,CAAC,CAAC,CACnC,EAEO,SAASC,GAAc,CAE5B,OADsB,cAAWJ,EAAY,CAE/C,CAEO,IAAMK,GAAyB,iBAAc,CAAC,CAAoC,EAElF,SAASC,IAAe,CAC7B,IAAMC,EAAgB,cAAWF,EAAgB,EACjD,OAAAJ,GAAe,EACRM,CACT,CCrBA,IAAAC,GAAuB,861JCmChB,IAAMC,GAA+B,CAC1C,CAAE,OAAQ,KAAM,MAAO,2BAAQ,SAAUC,EAAG,EAC5C,CAAE,OAAQ,KAAM,MAAO,SAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,KAAM,MAAO,UAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,UAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,aAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,iCAAS,SAAUC,EAAG,EAC7C,CAAE,OAAQ,KAAM,MAAO,cAAY,SAAUC,EAAG,EAChD,CAAE,OAAQ,KAAM,MAAO,SAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,KAAM,MAAO,iCAAS,SAAUC,EAAG,EAC7C,CAAE,OAAQ,KAAM,MAAO,WAAY,SAAUC,EAAG,EAChD,CAAE,OAAQ,KAAM,MAAO,qBAAO,SAAUC,EAAG,EAC3C,CAAE,OAAQ,QAAS,MAAO,qBAAO,SAAUC,EAAM,EACjD,CAAE,OAAQ,KAAM,MAAO,mDAAY,SAAUC,EAAG,EAChD,CAAE,OAAQ,QAAS,MAAO,sBAAoB,SAAUC,EAAM,EAC9D,CAAE,OAAQ,KAAM,MAAO,uCAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,QAAS,MAAO,oBAAqB,SAAUC,EAAM,EAC/D,CAAE,OAAQ,KAAM,MAAO,SAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,KAAM,MAAO,yBAAuB,SAAUC,EAAM,EAC9D,CAAE,OAAQ,QAAS,MAAO,wBAAsB,SAAUC,EAAM,EAChE,CAAE,OAAQ,KAAM,MAAO,UAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,UAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,uCAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,KAAM,MAAO,eAAU,SAAUC,EAAG,EAC9C,CAAE,OAAQ,KAAM,MAAO,YAAa,SAAUC,EAAG,EACjD,CAAE,OAAQ,QAAS,MAAO,2BAAQ,SAAUC,EAAM,EAClD,CAAE,OAAQ,QAAS,MAAO,0CAAa,SAAUC,EAAM,EACvD,CAAE,OAAQ,KAAM,MAAO,6CAAW,SAAUC,EAAG,EAC/C,CAAE,OAAQ,KAAM,MAAO,iCAAS,SAAUC,EAAG,CAC/C,EAIA5B,GAAa,KAAK,CAAC6B,EAAGC,IAAOD,EAAE,OAASC,EAAE,OAAS,GAAK,CAAE,EAYnD,SAASC,GAAeC,EAAmC,CAhFlE,IAAAC,EAiFE,IAAMC,EAAclC,GAAa,KAAM,GAAM,EAAE,SAAWgC,CAAM,EAEhE,MAAO,CACL,OAAAA,EACA,OAAOC,EAAAC,GAAA,YAAAA,EAAa,QAAb,KAAAD,EAAsBD,EAC7B,SAAUG,IAAA,GACLC,IACAF,GAAA,YAAAA,EAAa,SAEpB,CACF,CDxFO,SAASG,GAAeC,EAAqB,CAClD,OAAa,WAAQ,IACZC,GAAeD,GAAA,KAAAA,EAAU,UAAU,SAAS,MAAM,MAAM,EAAE,EAAE,EAClE,CAACA,CAAM,CAAC,CACb,CEPA,IAAAE,GAAuB,oBAkBVC,GAA2B,iBAAgC,CAAC,CAAqB,EAEjFC,GAAY,IAAM,CAC7B,IAAMC,EAAgB,cAAWF,EAAkB,EACnD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,+CAA+C,EAC7E,OAAOA,CACT,EXxBA,IAAAC,GAAA,6BAmBaC,GAAmB,cAC9B,CACEC,EAaAC,IACG,CAdH,IAAAC,EAAAF,EACE,UAAAG,EACA,QAAAC,EACA,cAAAC,EACA,QAAAC,EACA,SAAAC,EACA,aAAAC,EAAe,GACf,SAAAC,EAAW,GACX,SAAAC,EAAW,GACX,UAAAC,EACA,GAAAC,CA/BN,EAqBIV,EAWKW,EAAAC,GAXLZ,EAWK,CAVH,WACA,UACA,gBACA,UACA,WACA,eACA,WACA,WACA,YACA,OAKF,SACE,SAACa,GAAAC,EAAAC,EAAA,CACC,IAAKhB,EACL,SAAUS,EACV,QAASJ,EACT,QAASF,EACT,SAAUK,EACV,cAAeN,EACf,cAAeE,EACf,UAAWM,EACX,GAAIO,GACJ,GAAIN,GACAC,GAXL,CAaC,qBAACM,GAAA,CAAuB,SAAAZ,EAAS,EAChCC,MAAgB,QAACY,GAAA,EAAkB,IACtC,CAEJ,CACF,EAWO,SAASC,GAAsBrB,EAMP,CANO,IAAAE,EAAAF,EACpC,OAAAsB,EACA,IAAAC,EACA,QAAAjB,EACA,SAAAkB,CAtEF,EAkEsCtB,EAKjCW,EAAAC,GALiCZ,EAKjC,CAJH,QACA,MACA,UACA,aAGA,IAAMuB,EAAMC,EAAY,EAElBC,EAA0B,eAAY,IAAM,CAChDF,EAAI,eAAe,CACrB,EAAG,CAAC,CAAC,EAECG,EAAsB,eAAaC,GAA8C,CACjFA,EAAE,MAAQ,KAAOJ,EAAI,gBACvBI,EAAE,eAAe,CAErB,EAAG,CAAC,CAAC,EAEL,SACE,QAACC,GAAA,CAAQ,MAAOR,EAAM,GAAG,YAAY,EAAIA,EAAM,MAAM,CAAC,EAAG,IAAKC,EAC5D,oBAACxB,GAAAiB,EAAAC,EAAA,GACKJ,GADL,CAEC,QAASP,EACT,aAAckB,GAAYX,EAAK,SAC/B,cAAec,EACf,UAAWC,EACX,aAAYN,EAAM,GAAG,YAAY,EAAIA,EAAM,MAAM,CAAC,GACpD,EACF,CAEJ,CAEO,IAAMH,GAAwBY,EAAO,MAAO,CACjD,SAAU,WACV,OAAQ,OACR,MAAO,OACP,gBAAiB,SACjB,aAAc,KACd,OAAQ,IACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,MACZ,MAAO,UACP,WAAY,OACZ,iBAAkB,OAClB,UAAW,aACX,OAAQ,wBACR,8BAA+B,cAC/B,sBAAuB,aACzB,CAAC,EAEYhB,GAAmBgB,EAAO,SAAU,CAC/C,SAAU,WACV,MAAO,QACP,SAAU,KACV,WAAY,OACZ,OAAQ,IACR,QAAS,KACT,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,OAAQ,UACR,cAAe,MACf,OAAQ,OACR,MAAO,OACP,OAAQ,mBACR,8BAA+B,cAC/B,sBAAuB,cAEvB,CAAC,cAAcZ,MAA0B,CACvC,QAAS,IACX,EAEA,SAAU,CACR,QAAS,CACP,QAAS,CACP,UAAW,GACb,EACA,KAAM,CACJ,CAAC,KAAKA,MAA0B,CAC9B,QAAS,OACT,QAAS,CACP,QAAS,EACT,WAAY,CACd,CACF,CACF,EACA,KAAM,CACJ,MAAO,OACP,CAAC,KAAKA,MAA0B,CAC9B,SAAU,KACV,QAAS,OACT,IAAK,IACP,CACF,EACA,OAAQ,CACN,QAAS,EACT,OAAQ,GACR,MAAO,GACP,OAAQ,OACR,CAAC,KAAKA,MAA0B,CAC9B,OAAQ,2BACR,aAAc,OACd,UAAW,QACb,EACA,CAAC,KAAKA,YAAgC,CACpC,MAAO,GACP,OAAQ,EACV,CACF,CACF,EACA,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CAAC,CACV,EACA,GAAI,CACF,OAAQ,CACN,QAAS,CACX,EACA,MAAO,CAAC,CACV,CACF,EACA,iBAAkB,CAChB,CACE,QAAS,UACT,GAAI,SACJ,IAAK,CACH,OAAQ,GACR,MAAO,GACP,CAAC,KAAKA,YAAgC,CACpC,MAAO,GACP,OAAQ,EACV,CACF,CACF,EACA,CACE,QAAS,UACT,GAAI,QACJ,IAAK,CACH,OAAQ,OACR,MAAO,OACP,CAAC,KAAKA,YAAgC,CACpC,MAAO,GACP,OAAQ,EACV,CACF,CACF,EACA,CACE,SAAU,GACV,IAAK,CACH,CAAC,GAAGA,MAA0B,CAC5B,gBAAiB,YACjB,MAAO,mBACT,CACF,CACF,EACA,CACE,SAAU,GACV,GAAI,QACJ,IAAK,CACH,CAAC,0BAA0BA,MAA0B,CACnD,gBAAiB,QACnB,EACA,CAAC,0BAA0BA,MAA0B,CACnD,gBAAiB,QACnB,CACF,CACF,CACF,CACF,CAAC,EAEKC,GAAoBW,EAAO,MAAO,CACtC,SAAU,WACV,MAAO,GACP,OAAQ,GACR,gBAAiB,YACjB,aAAc,OACd,OAAQ,GACR,OAAQ,mBACR,OAAQ,GACV,CAAC,EHzPD,IAAAC,GAAA,6BAsBMC,GAA4B,wCAKlC,EAEMC,GAAkB,CACtB,iBAAyB,QAAC,gBAAW,EACrC,eAAuB,QAAC,gBAAW,EACnC,gBAAwB,QAAC,oBAAe,EACxC,YAAoB,QAACC,GAAA,EAAS,CAChC,EAEMC,GAAqBC,GAAkBA,EAAE,SAAS,aAE3CC,GAAmB,QAAK,SAAoB,CACvD,WAAAC,EACA,aAAAC,CACF,EAAoB,CAClB,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EAEfC,EAAeH,EAAI,SAASL,EAAiB,EAE7C,CAACS,EAAgBC,CAAiB,EAAU,uBAA0C,EAEtF,aAAU,IAAM,CAChBb,GAAY,SAASM,CAAwB,GAAKM,IAAmBN,GACvEO,EAAkBP,CAAwB,CAE9C,EAAG,CAACA,CAAU,CAAC,EAEf,IAAMQ,EAAwB,eAAY,IAAM,CAC9CN,EAAI,WAAWI,CAAc,CAC/B,EAAG,CAACN,EAAYE,CAAG,CAAC,EAEdO,EAA0B,eAAY,IAAM,CAChDP,EAAI,eAAe,CACrB,EAAG,CAACA,CAAG,CAAC,EAEFQ,EAAsB,eAAaC,GAA8C,CACjFA,EAAE,MAAQ,KACRT,EAAI,UACNS,EAAE,eAAe,CAGvB,EAAG,CAAC,CAAC,EAECC,EAAWlB,GAAY,SAASM,CAAwB,EACxDa,EAAcR,IAAiB,UAAYA,IAAiB,MAAQ,MAAQA,EAE5ES,EAAaT,IAAiB,UAAYA,IAAiB,MAAQ,MAAQ,SAEjF,SACE,SAAc,QAAb,CAAkB,IAAI,MAAM,aAAcG,EACzC,qBAAc,WAAb,CAAqB,IAAI,MAAM,QAAO,GAAC,GAAG,yBACzC,oBAACO,GAAA,CACC,SAAUH,GAAYV,EAAI,SAC1B,QAAQ,UACR,cAAeO,EACf,aAAcG,GAAYX,EAC1B,SAAUW,EACV,UAAWF,EACX,aAAYN,EAAK,cAAc,CAAE,GAAI,QAAS,CAAC,EAE9C,SAAAT,GAAgBW,GACnB,EACF,KACA,QAAc,WAAb,CAAqB,QAAO,GAAC,KAAMO,EAAa,WAAY,GAC3D,oBAACG,GAAA,CAAM,KAAK,SAAS,MAAO,CAAE,cAAeF,CAAW,EACrD,SAAApB,GAAY,IAAI,CAACuB,EAAOC,OACvB,QAACC,GAAA,CAEC,MAAOf,EAAK,cAAc,CAAE,GAAIa,CAAM,CAAC,EACvC,KAAM,EAAIC,GAAG,SAAS,EACtB,GAAI,0BAA0BD,IAE9B,oBAAc,QAAb,CAAkB,QAAO,GACxB,oBAACF,GAAA,CACC,aAAYX,EAAK,cAAc,CAAE,GAAIa,CAAM,CAAC,EAC5C,QAAQ,UACR,QAAS,IAAM,CACbf,EAAI,WAAWe,CAAK,EACpBV,EAAkBU,CAAK,CACzB,EAEC,SAAAtB,GAAgBsB,GACnB,EACF,GAhBKA,CAiBP,CACD,EACH,EACF,GACF,CAEJ,CAAC,EftHD,IAAAG,GAAA,6BAeMC,GAAsBC,GAAkBA,EAAE,SAAS,WACnDC,GAAsBD,GAAkBA,EAAE,SAAS,aACnDE,GAAsBF,GAAkBA,EAAE,SAAS,WAE5CG,GAAsB,QAAK,UAAyB,CAC/D,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EACfC,EAAaH,EAAI,SAASL,EAAkB,EAC5CS,EAAeJ,EAAI,SAASH,EAAkB,EAC9CQ,EAAaL,EAAI,SAASF,EAAkB,EAE5CQ,EAAyB,eAAY,IAAMN,EAAI,WAAW,QAAQ,EAAG,CAACA,CAAG,CAAC,EAC1EO,EAAwB,eAAY,IAAMP,EAAI,WAAW,OAAO,EAAG,CAACA,CAAG,CAAC,EACxEQ,EAAuB,eAAY,IAAMR,EAAI,iBAA2B,EAAG,CAACA,CAAG,CAAC,EAChFS,EAAsB,eAAY,IAAMT,EAAI,gBAA0B,EAAG,CAACA,CAAG,CAAC,EAC9EU,EAAwB,eAAY,IAAMV,EAAI,kBAA4B,EAAG,CAACA,CAAG,CAAC,EAClFW,EAAuB,eAAY,IAAMX,EAAI,iBAA2B,EAAG,CAACA,CAAG,CAAC,EAChFY,EAAyB,eAAY,IAAMZ,EAAI,mBAA6B,EAAG,CAACA,CAAG,CAAC,EACpFa,EAAqB,eAAY,IAASC,EAAA,sBAAG,OAAAd,EAAI,UAAU,IAAG,CAACA,CAAG,CAAC,EACnEe,EAAyB,eAAY,IAAMf,EAAI,iBAAiB,EAAG,CAACA,CAAG,CAAC,EAExEgB,EAA0B,eAAaC,GAA0B,CACrEA,EAAE,gBAAgB,CACpB,EAAG,CAAC,CAAC,EAEL,SACE,QAACC,GAAA,CAAkB,cAAeF,EAChC,qBAACG,GAAA,CACC,qBAACC,GAAA,CACC,QAASd,EACT,SAAUH,IAAe,SACzB,MAAOD,EAAK,cAAc,CAAE,GAAI,QAAS,CAAC,EAE1C,oBAAC,qBAAgB,EACnB,KAEA,QAACmB,GAAA,EAAc,KAEf,QAACD,GAAA,CACC,QAASZ,EACT,SAAUL,WACV,MAAOD,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAExC,oBAAC,iBAAY,EACf,KAEA,QAACkB,GAAA,CACC,QAASb,EACT,SAAUJ,IAAe,QACzB,MAAOD,EAAK,cAAc,CAAE,GAAI,QAAS,CAAC,EAE1C,oBAACoB,GAAA,EAAW,EACd,KAEA,QAACD,GAAA,EAAc,KAEf,QAACE,GAAA,CACC,oBAACC,GAAA,CAAW,WAAYrB,EAAY,aAAcC,EAAc,EAClE,KAEA,QAACgB,GAAA,CACC,QAASV,EACT,SAAUP,YACV,MAAOD,EAAK,cAAc,CAAE,GAAI,OAAQ,CAAC,EAEzC,oBAAC,uBAAkB,EACrB,KAEA,QAACkB,GAAA,CACC,QAAST,EACT,SAAUR,WACV,MAAOD,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAExC,oBAAC,cAAS,EACZ,KAEA,QAACkB,GAAA,CACC,QAASR,EACT,SAAUT,aACV,MAAM,cAEN,qBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,qBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,KACN,OAAO,KACP,GAAG,IACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,KACA,QAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,IAAI,KACzE,QAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,eAAe,YAAY,IAAI,GAC1E,EACF,KAEA,QAACiB,GAAA,CAAQ,QAASP,EAAc,MAAOX,EAAK,cAAc,CAAE,GAAI,OAAQ,CAAC,EACvE,oBAAC,eAAU,EACb,KAEA,QAACmB,GAAA,EAAc,KAEf,QAACD,GAAA,CACC,QAASL,EACT,SAAUV,IAAe,WACzB,MAAOA,IAAe,WAAa,gBAAkB,gBAEpD,SAAAA,IAAe,cACd,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,mCACF,OAAO,eACP,YAAY,MACZ,cAAc,QACd,KAAK,OACP,EACF,KAEA,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,oBACF,OAAO,eACP,YAAY,MACZ,cAAc,QACd,eAAe,QACf,KAAK,OACP,EACF,EAEJ,GACF,EACF,CAEJ,CAAC,EAIKa,GAAoBO,EAAO,MAAO,CACtC,SAAU,WACV,OAAQ,OACR,KAAM,MACN,UAAW,mBACX,OAAQ,IACR,cAAe,KACjB,CAAC,EAEKN,GAAoBM,EAAO,MAAO,CACtC,QAAS,OACT,WAAY,SACZ,IAAK,MACL,QAAS,UACT,WAAY,SACZ,aAAc,QACd,UAAW,gEACX,eAAgB,YAClB,CAAC,EAEKL,GAAUK,EAAO,SAAU,CAC/B,IAAK,QACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,OAAQ,OACR,aAAc,KACd,MAAO,iBACP,OAAQ,UACR,WAAY,iBACZ,WAAY,EAEZ,QAAS,CACP,MAAO,OACP,OAAQ,MACV,EAEA,UAAW,CACT,WAAY,SACZ,MAAO,OACT,EAEA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,WAAY,UACZ,MAAO,QACP,UAAW,CACT,WAAY,UACZ,MAAO,OACT,CACF,CACF,CACF,CACF,CAAC,EAEKJ,GAAgBI,EAAO,MAAO,CAClC,MAAO,MACP,OAAQ,OACR,WAAY,aACZ,OAAQ,QACR,WAAY,EACZ,QAAS,EACX,CAAC,EAEKF,GAAiBE,EAAO,MAAO,CACnC,QAAS,OACT,WAAY,CACV,MAAO,OACP,OAAQ,OACR,QAAS,EACT,aAAc,KACd,OAAQ,MACV,EACA,qCAAsC,CACpC,aAAc,KACd,WAAY,aACd,CACF,CAAC,E8BxOD,IAAAC,GAAkC,2CAClCC,GAWO,iCACPC,GAAuB,oBACvBC,GAA0C,sBCZnC,IAAMC,GAAUC,EAAO,KAAM,CAClC,OAAQ,EACR,WAAY,EACZ,MAAO,iBACP,gBAAiB,SACjB,OAAQ,OACR,OAAQ,SACV,CAAC,ECPM,IAAMC,GAAcC,EAAO,MAAO,CACvC,SAAU,WACV,SAAU,SACV,WAAY,OACZ,iBAAkB,OAClB,QAAS,OACT,cAAe,SACf,OAAQ,MACR,SAAU,IACV,cAAe,MACf,gBAAiB,SACjB,OAAQ,2BACR,UAAW,SACX,QAAS,QACT,aAAc,KACd,KAAM,MACN,UAAW,QACX,UAAW,OACX,UAAW,SACX,sBAAuB,CACrB,QAAS,MACX,EACA,qBAAsB,OACtB,eAAgB,OAChB,SAAU,CACR,KAAM,CACJ,MAAO,CACL,SAAU,EACZ,CACF,EACA,SAAU,CACR,KAAM,CACJ,UAAW,MACb,CACF,CACF,CACF,CAAC,ECtCD,IAAAC,GAA8B,yCAC9BC,GAA4C,iCAC5CC,GAAuB,oBCAhB,IAAMC,GAAYC,EAAO,MAAO,CACrC,OAAQ,OACR,aAAc,MACd,YAAa,MACb,MAAO,cACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,OAAQ,OACR,cAAe,MACf,OAAQ,UACR,MAAO,eAEP,QAAS,CACP,OAAQ,GACR,MAAO,GACP,YAAa,CACf,EAEA,QAAS,CACP,QAAS,EACT,WAAY,CACd,CACF,CAAC,ED1BD,IAAAC,GAAA,6BAqBaC,GAAkB,cAC7B,CACEC,EAYAC,IACG,CAbH,IAAAC,EAAAF,EACE,SAAAG,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,aAAAC,EAAe,GACf,SAAAC,EAAW,GACX,SAAAC,EAAW,GACX,QAAAC,EACA,IAAAC,EACA,SAAAC,CAhCN,EAuBIT,EAUKU,EAAAC,GAVLX,EAUK,CATH,UACA,WACA,YACA,eACA,WACA,WACA,UACA,MACA,aAKF,SACE,QAACY,GAAAC,EAAAC,EAAA,CACC,IAAKf,EACL,GAAIgB,GACJ,UAAWZ,EACX,SAAUD,EACV,SAAUI,EACV,QAASL,EACT,QAASM,GACLG,GARL,CAUC,qBAACM,GAAA,CACE,UAAAP,EACAD,KAAM,QAACS,GAAA,CAAI,QAAQ,OAAQ,SAAAT,EAAI,EAAS,OACxCJ,MACC,QAAC,kBAAc,IAAI,MACjB,oBAACc,GAAA,CACC,oBAAC,eAAU,EACb,EACF,EAEDb,MACC,QAACa,GAAA,CACC,oBAAC,sBAAiB,EACpB,GAEJ,GACF,CAEJ,CACF,EAEMF,GAAuBG,EAAO,MAAO,CACzC,OAAQ,OACR,MAAO,OACP,gBAAiB,SACjB,aAAc,KACd,QAAS,OACT,IAAK,KACL,cAAe,MACf,WAAY,SACZ,QAAS,OACT,eAAgB,gBAChB,OAAQ,wBAER,QAAS,CACP,SAAU,WACV,OAAQ,WACR,YAAa,EACb,OAAQ,CACV,EAEA,CAAC,OAAOD,MAAc,CACpB,YAAa,IACf,CACF,CAAC,EAEYN,GAAkBO,EAAO,SAAU,CAC9C,SAAU,WACV,MAAO,OACP,WAAY,OACZ,OAAQ,OACR,OAAQ,UACR,OAAQ,GACR,UAAW,GACX,QAAS,OACT,MAAO,QACP,WAAY,MACZ,WAAY,IACZ,SAAU,KACV,aAAc,EACd,WAAY,OACZ,iBAAkB,OAClB,OAAQ,EACR,QAAS,MAET,mBAAoB,CAClB,QAAS,EACX,EAEA,aAAc,CACZ,QAAS,EACX,EAEA,CAAC,0BAA0BH,MAAyB,CAClD,gBAAiB,QACnB,EAEA,MAAO,CACL,eAAgB,OAChB,MAAO,OACT,EAEA,SAAU,CACR,GAAI,CACF,OAAQ,CAAC,EACT,MAAO,CAAC,CACV,EACA,QAAS,CACP,UAAW,CACT,OAAQ,WACV,EACA,KAAM,CACJ,WAAY,YACd,CACF,EACA,KAAM,CACJ,KAAM,CACJ,QAAS,OACT,MAAO,MACT,CACF,EACA,UAAW,CACT,KAAM,CACJ,MAAO,OACT,CACF,EACA,SAAU,CACR,KAAM,CACJ,gBAAiB,QACnB,EACA,MAAO,CAAC,CACV,CACF,CACF,CAAC,EHjKD,IAAAI,EAAA,6BAuBMC,GAA+BC,GAC5BA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YAAY,OAG/DC,GAAuBD,GACpBA,EAAE,SAAS,YAGdE,GAA4BF,GACzBA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YAAY,KAChEG,GAAOH,EAAE,SAAS,MAAMA,EAAE,SAAS,eAAe,OAAOG,GAAI,WAAa,MAC7E,EAGIC,GAAkBC,GAAaA,EAAE,gBAAgB,EAO1CC,GAAe,CAAC,CAAE,OAAAC,EAAQ,SAAAC,CAAS,IAAwB,CACtE,IAAMC,EAAYC,GAAa,EAE/B,SACE,QAAkB,QAAjB,CAAsB,IAAI,MACzB,oBAAkB,WAAjB,CAAyB,IAAI,MAAO,SAAAF,EAAS,KAC9C,OAAkB,UAAjB,CAAwB,UAAWC,EAAU,QAC5C,mBAAkB,WAAjB,CACC,gBAAiBL,GACjB,SAAU,GACV,OAAQG,EACR,QAAO,GAEP,mBAACI,GAAA,CAAY,GAAG,iBACd,mBAACC,GAAA,EAAU,EACb,EACF,EACF,GACF,CAEJ,EAEMA,GAAkB,QAAK,UAAqB,CAChD,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EACfC,EAAsBH,EAAI,SAASd,EAA2B,EAC9DkB,EAAcJ,EAAI,SAASZ,EAAmB,EAC9CiB,EAAmBL,EAAI,SAASX,EAAwB,EAExDiB,EAA6B,eAAY,IAAM,CACnDN,EAAI,eAAe,CACrB,EAAG,CAACA,CAAG,CAAC,EAEFO,EAA2B,eAAY,IAAM,CACjDP,EAAI,aAAa,CACnB,EAAG,CAACA,CAAG,CAAC,EAEFQ,EAAwB,eAAY,IAAM,CAC9CR,EAAI,UAAU,CAChB,EAAG,CAACA,CAAG,CAAC,EAEFS,EAAmB,eAAY,IAAM,CACzCT,EAAI,aAAa,CACnB,EAAG,CAACA,CAAG,CAAC,EAEFU,EAAoB,eAAY,IAAM,CAC1CV,EAAI,MAAM,CACZ,EAAG,CAACA,CAAG,CAAC,EAEFW,EAAyB,eAAY,IAAM,CAC/CX,EAAI,WAAW,CACjB,EAAG,CAACA,CAAG,CAAC,EAEFY,EAA2B,eAAY,IAAM,CACjDZ,EAAI,aAAa,CACnB,EAAG,CAACA,CAAG,CAAC,EAEFa,EAA0B,eAAY,IAAM,CAChDb,EAAI,YAAY,CAClB,EAAG,CAACA,CAAG,CAAC,EAEFc,EAA0B,eAAY,IAAM,CAChDd,EAAI,YAAY,CAClB,EAAG,CAACA,CAAG,CAAC,EAEFe,EAAqB,eAAY,IAAM,CAC3Cf,EAAI,OAAO,CACb,EAAG,CAACA,CAAG,CAAC,EAEFgB,EAAkB,eAAY,IAAM,CACxChB,EAAI,IAAI,CACV,EAAG,CAACA,CAAG,CAAC,EAEFiB,EAAmB,eAAY,IAAM,CACzCjB,EAAI,KAAK,CACX,EAAG,CAACA,CAAG,CAAC,EAEFkB,EAAoB,eAAY,IAAM,CAC1ClB,EAAI,MAAM,CACZ,EAAG,CAACA,CAAG,CAAC,EAEFmB,EAAsB,eAAY,IAAM,CAC5CnB,EAAI,gBAA4B,CAAE,MAAO,EAAG,QAAS,EAAG,sBAAuB,EAAM,CAAC,CACxF,EAAG,CAACA,CAAG,CAAC,EAEFoB,EAAsB,eAAY,IAAM,CAC5CpB,EAAI,gBAA4B,CAAE,MAAO,EAAG,QAAS,EAAG,sBAAuB,EAAK,CAAC,CACvF,EAAG,CAACA,CAAG,CAAC,EAEFqB,EAAmB,eAAY,IAAM,CACzCrB,EAAI,KAAK,CACX,EAAG,CAACA,CAAG,CAAC,EAEFsB,EAAmB,eAAY,IAAM,CACzCtB,EAAI,KAAK,CACX,EAAG,CAACA,CAAG,CAAC,EAEFuB,EAAwB,eAAY,IAAYC,EAAA,sBACpDxB,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEFyB,EAAwB,eAAY,IAAYD,EAAA,sBACpDxB,EAAI,mBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEF0B,EAAyB,eAAY,IAAYF,EAAA,sBACrDxB,EAAI,mBAA+B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC7D,GAAG,CAACA,CAAG,CAAC,EAEF2B,EAAwB,eAAY,IAAYH,EAAA,sBACpDxB,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEF4B,EAAuB,eAAY,IAAYJ,EAAA,sBACnDxB,EAAI,SAAS,CACf,GAAG,CAACA,CAAG,CAAC,EAEF6B,EAAyB,eAAY,IAAYL,EAAA,sBACrDxB,EAAI,WAAW,CACjB,GAAG,CAACA,CAAG,CAAC,EAEF8B,EAA6B,eAAY,IAAYN,EAAA,sBACzDxB,EAAI,eAAe,CACrB,GAAG,CAACA,CAAG,CAAC,EAEF+B,GAAe5B,EAAsB,EACrC6B,EAAe7B,EAAsB,EACrC8B,GAAiB9B,EAAsB,EAEvC+B,GACJ/B,IAAwB,EAAIH,EAAI,SAASA,EAAI,YAAY,GAAIA,EAAI,aAAa,EAAI,KAC9EmC,IAAmBD,IAAA,YAAAA,GAAe,QAAS,iBAEjD,SACE,mBACG,SAAAH,MACC,oBACE,oBAACK,GAAA,CAAY,QAAS5B,EAAiB,IAAI,KAAK,GAAG,2BACjD,mBAAC,qBAAiB,GAAG,YAAY,EACnC,KACA,OAAC4B,GAAA,CAAY,QAAS9B,EAAsB,IAAI,UAAK,GAAG,iCACtD,mBAAC,qBAAiB,GAAG,kBAAkB,EACzC,KACA,OAAC8B,GAAA,CAAY,QAAS7B,EAAoB,IAAI,UAAK,GAAG,+BACpD,mBAAC,qBAAiB,GAAG,gBAAgB,EACvC,KACA,QAAC6B,GAAA,CAAY,QAAS3B,EAAY,IAAI,WAAM,GAAG,8BAC7C,oBAAC,qBAAiB,GAAG,OAAO,EAAE,SAAG,OAAC,qBAAiB,GAAG,SAAS,GACjE,GACEuB,GAAgB3B,OAAqB,OAACgC,GAAA,EAAQ,EAC/CL,MACC,OAACI,GAAA,CAAY,QAAS1B,EAAa,IAAI,KAAK,GAAG,uBAC7C,mBAAC,qBAAiB,GAAG,QAAQ,EAC/B,EAEDL,MACC,OAAC+B,GAAA,CAAY,QAAS1B,EAAa,IAAI,KAAK,GAAG,yBAC7C,mBAAC,qBAAiB,GAAG,UAAU,EACjC,KAEF,OAAC2B,GAAA,EAAQ,KACT,QAACC,GAAA,CAAmB,MAAOpC,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAAG,GAAG,sBAChE,oBAACkC,GAAA,CAAY,QAAStB,EAAmB,IAAI,UAAK,GAAG,+BACnD,mBAAC,qBAAiB,GAAG,WAAW,EAClC,KACA,OAACsB,GAAA,CAAY,QAASvB,EAAmB,IAAI,IAAI,GAAG,8BAClD,mBAAC,qBAAiB,GAAG,UAAU,EACjC,KACA,OAACuB,GAAA,CAAY,QAASxB,EAAoB,IAAI,IAAI,GAAG,+BACnD,mBAAC,qBAAiB,GAAG,WAAW,EAClC,KACA,OAACwB,GAAA,CAAY,QAASzB,EAAkB,IAAI,UAAK,GAAG,8BAClD,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,GACF,KACA,OAAC4B,GAAA,EAAe,EACfP,MACC,OAACQ,GAAA,CAAuB,aAAcR,EAAc,eAAgBC,GAAgB,KAEtF,OAACI,GAAA,EAAQ,KACT,OAACD,GAAA,CAAY,QAASpB,EAAW,IAAI,KAAK,GAAG,qBAC3C,mBAAC,qBAAiB,GAAG,MAAM,EAC7B,KACA,OAACoB,GAAA,CAAY,QAASnB,EAAY,IAAI,KAAK,GAAG,sBAC5C,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,OAACmB,GAAA,CAAY,QAASlB,EAAa,IAAI,KAAK,GAAG,uBAC7C,mBAAC,qBAAiB,GAAG,QAAQ,EAC/B,KACA,OAACmB,GAAA,EAAQ,KACT,QAACC,GAAA,CACC,MAAO,GAAGpC,EAAK,cAAc,CAAE,GAAI,SAAU,CAAC,OAC9C,KAAK,QACL,GAAG,yBAEH,oBAACkC,GAAA,CAAY,QAASjB,EAAe,GAAG,6BAA6B,eAErE,KACA,OAACiB,GAAA,CAAY,QAAShB,EAAe,GAAG,6BAA6B,eAErE,EACChB,MACC,OAACgC,GAAA,CAAY,QAASR,EAAgB,GAAG,8BAA8B,gBAEvE,GAEJ,KACA,QAACU,GAAA,CACC,MAAO,GAAGpC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,OAChD,KAAK,QACL,GAAG,wBAEH,oBAACkC,GAAA,CAAY,QAAST,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACS,GAAA,CAAY,QAASb,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACa,GAAA,CAAY,QAASX,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACW,GAAA,CAAY,QAASV,EAAkB,GAAG,6BAA6B,gBAExE,EACCtB,MACC,OAACgC,GAAA,CAAY,QAASP,EAAkB,GAAG,6BAA6B,gBAExE,GAEJ,KACA,OAACQ,GAAA,EAAQ,EACRF,OACC,oBACE,oBAACC,GAAA,CAAY,QAASN,EAAsB,GAAG,kCAAkC,4BAEjF,KACA,OAACO,GAAA,EAAQ,GACX,KAEF,OAACD,GAAA,CAAY,QAASrB,EAAc,IAAI,SAAI,GAAG,wBAC7C,mBAAC,qBAAiB,GAAG,SAAS,EAChC,GACF,KAEA,oBACE,oBAACqB,GAAA,CAAY,QAASlB,EAAa,IAAI,KAAK,GAAG,uBAC7C,mBAAC,qBAAiB,GAAG,QAAQ,EAC/B,KACA,OAACkB,GAAA,CAAY,QAASf,EAAY,IAAI,KAAK,GAAG,sBAC5C,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,OAACe,GAAA,CAAY,QAASd,EAAY,IAAI,WAAM,GAAG,sBAC7C,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,QAACgB,GAAA,CACC,MAAO,GAAGpC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,OAChD,KAAK,QACL,GAAG,wBAEH,oBAACkC,GAAA,CAAY,QAAST,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACS,GAAA,CAAY,QAASb,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACa,GAAA,CAAY,QAASX,EAAiB,GAAG,4BAA4B,eAEtE,KACA,OAACW,GAAA,CAAY,QAASV,EAAkB,GAAG,6BAA6B,gBAExE,EACCtB,MACC,OAACgC,GAAA,CAAY,QAASP,EAAkB,GAAG,6BAA6B,gBAExE,GAEJ,GACF,EAEJ,CAEJ,CAAC,EAID,SAASW,GAAuB,CAC9B,eAAAP,CACF,EAGG,CACD,IAAMjC,EAAMC,EAAY,EAElBwC,EAAiB,eAAY,IAAM,CACvCzC,EAAI,WAAmB,CACzB,EAAG,CAACA,CAAG,CAAC,EAEF0C,EAA4B,eAAY,IAAM,CAClD1C,EAAI,sBAA8B,CACpC,EAAG,CAACA,CAAG,CAAC,EAEF2C,EAAoB,eAAY,IAAM,CAC1C3C,EAAI,cAAsB,CAC5B,EAAG,CAACA,CAAG,CAAC,EAEF4C,EAA0B,eAAY,IAAM,CAChD5C,EAAI,kBAA4B,CAClC,EAAG,CAACA,CAAG,CAAC,EAEF6C,EAA6B,eAAY,IAAM,CACnD7C,EAAI,qBAAkC,CACxC,EAAG,CAACA,CAAG,CAAC,EAEF8C,EAAkB,eAAY,IAAM,CACxC9C,EAAI,YAAoB,CAC1B,EAAG,CAACA,CAAG,CAAC,EAEF+C,EAA8B,eAAY,IAAM,CACpD/C,EAAI,wBAAgC,CACtC,EAAG,CAACA,CAAG,CAAC,EAEFgD,EAAmB,eAAY,IAAM,CACzChD,EAAI,aAAqB,CAC3B,EAAG,CAACA,CAAG,CAAC,EAEFiD,EAA4B,eAAY,IAAM,CAClDjD,EAAI,oBAA8B,CACpC,EAAG,CAACA,CAAG,CAAC,EAEFkD,EAA+B,eAAY,IAAM,CACrDlD,EAAI,uBAAoC,CAC1C,EAAG,CAACA,CAAG,CAAC,EAEFJ,EAAYC,GAAa,EAE/B,SACE,QAAkB,OAAjB,CACC,oBAACsD,GAAA,CAAmB,GAAG,0CACrB,mBAAC,qBAAiB,GAAG,mBAAmB,EAC1C,KACA,OAAkB,UAAjB,CAAwB,UAAWvD,EAAU,QAC5C,mBAAkB,cAAjB,CAA4B,QAAO,GAAC,WAAY,EAAG,YAAa,GAC/D,oBAACwD,GAAA,CAAkB,iBAAkBnB,EAAiB,cAAgB,YACpE,oBAACoB,GAAA,CAAa,QAASP,EAAW,GAAG,4CACnC,mBAAC,mBAAc,EACjB,KACA,OAACO,GAAA,CACC,QAASN,EACT,GAAG,wDAEH,mBAAC,iCAA4B,EAC/B,KACA,OAACM,GAAA,CAAa,QAASL,EAAY,GAAG,6CACpC,mBAAC,oBAAe,EAClB,KACA,OAACK,GAAA,CACC,QAASJ,EACT,GAAG,oDAEH,mBAAC,6BAAwB,EAC3B,EACChB,MACC,OAACoB,GAAA,CACC,QAASH,EACT,GAAG,wDAEH,mBAAC,iCAA4B,EAC/B,KAEF,OAACG,GAAA,CAAa,QAASZ,EAAU,GAAG,2CAClC,mBAAC,kBAAa,EAChB,KACA,OAACY,GAAA,CACC,QAASX,EACT,GAAG,sDAEH,mBAAC,+BAA0B,EAC7B,KACA,OAACW,GAAA,CAAa,QAASV,EAAa,GAAG,8CACrC,mBAAC,qBAAgB,EACnB,KACA,OAACU,GAAA,CACC,QAAST,EACT,GAAG,kDAEH,mBAAC,2BAAsB,EACzB,EACCX,MACC,OAACoB,GAAA,CACC,QAASR,EACT,GAAG,sDAEH,mBAAC,+BAA0B,EAC7B,KAEF,OAACS,GAAA,CAAQ,OAAQ,GAAI,GACvB,EACF,EACF,GACF,CAEJ,CAEA,IAAMF,GAAoBG,EAAOzD,GAAa,CAC5C,QAAS,OACT,SAAU,CACR,iBAAkB,CAChB,YAAa,CACX,oBAAqB,iBACvB,EACA,UAAW,CACT,oBAAqB,iBACvB,CACF,CACF,CACF,CAAC,EAIK0D,GAAyBrE,GAAkBA,EAAE,SAAS,cACtDsE,GAAyBtE,GAAkBA,EAAE,SAAS,MAE5D,SAASoD,IAAiB,CACxB,IAAMvC,EAAMC,EAAY,EAClByD,EAAgB1D,EAAI,SAASwD,EAAqB,EAClDG,EAAgB3D,EAAI,SAASyD,EAAqB,EAElDG,EAAS,OAAO,OAAOD,CAAa,EACvC,KAAK,CAACE,EAAGC,KAAOD,EAAE,YAAc,IAAMC,EAAE,YAAc,EAAE,EACxD,OAAQD,GAAMA,EAAE,KAAOH,CAAa,EAEjC9D,EAAYC,GAAa,EAE/B,OAAI+D,EAAO,SAAW,EAAU,QAG9B,QAAkB,OAAjB,CACC,oBAACT,GAAA,CACC,mBAAC,qBAAiB,GAAG,eAAe,EACtC,KACA,OAAkB,UAAjB,CAAwB,UAAWvD,EAAU,QAC5C,mBAAkB,cAAjB,CAA4B,WAAY,EAAG,YAAa,GAAI,QAAO,GAClE,oBAACE,GAAA,CACE,UAAA8D,EAAO,IAAI,CAAC,CAAE,GAAAtE,EAAI,KAAAyE,CAAK,EAAGC,OACzB,OAAC5B,GAAA,CAEC,SAAU9C,IAAOoE,EACjB,QAAS,IAAM1D,EAAI,WAAWV,CAAE,EAE/B,SAAAyE,GAAQ,QAAQC,KAJZ1E,CAKP,CACD,KACD,OAACgE,GAAA,CAAQ,OAAQ,GAAI,GACvB,EACF,EACF,GACF,CAEJ,CAWO,SAAShB,GAAmB,CAAE,SAAA3C,EAAU,MAAAsE,EAAO,KAAAC,EAAM,GAAA5E,CAAG,EAA4B,CACzF,IAAMM,EAAYC,GAAa,EAC/B,SACE,QAAkB,OAAjB,CACC,oBAACsD,GAAA,CAAoB,SAAAc,EAAM,KAC3B,OAAkB,UAAjB,CAAwB,UAAWrE,EAAU,QAC5C,mBAAkB,cAAjB,CAA4B,WAAY,EAAG,YAAa,GAAI,QAAO,GAClE,oBAACE,GAAA,CAAY,KAAMoE,EAChB,UAAAvE,KACD,OAAC2D,GAAA,CAAQ,OAAQ,GAAI,GACvB,EACF,EACF,GACF,CAEJ,CAIA,IAAMA,GAAUC,EAAwB,oBAAkB,CACxD,KAAM,QACR,CAAC,EAID,SAASF,GAAac,EAAwC,CAAxC,IAAAC,EAAAD,EAAE,UAAAE,CA1hBxB,EA0hBsBD,EAAeE,EAAAC,GAAfH,EAAe,CAAb,aACtB,SACE,OAAkB,mBAAjB,CAAiC,IAAI,MAAM,SAAUC,EAAU,QAAO,GACrE,mBAACG,GAAAC,EAAA,GAAeH,EAAM,EACxB,CAEJ,CAIA,IAAMlC,GAAe+B,GAAoC,CAApC,IAAAC,EAAAD,EAAE,IAAA7E,CApiBvB,EAoiBqB8E,EAASE,EAAAC,GAATH,EAAS,CAAP,OACrB,SACE,OAAkB,mBAAjB,CAAiC,QAAO,GAAC,GAAI9E,EAC5C,mBAACoF,GAAAD,EAAA,GAAcH,EAAM,EACvB,CAEJ,EAIanB,GAAsBgB,GAAoC,CAApC,IAAAC,EAAAD,EAAE,IAAA7E,CA9iBrC,EA8iBmC8E,EAASE,EAAAC,GAATH,EAAS,CAAP,OACnC,SACE,OAAkB,cAAjB,CAA4B,QAAO,GAAC,GAAI9E,EACvC,mBAACoF,GAAAD,EAAA,CAAU,SAAQ,IAAKH,EAAM,EAChC,CAEJ,EAEaK,GAAoB,QAAKlF,EAAY,EKtjBlD,IAAAmF,GAAA,6BAOO,SAASC,GAAc,CAAE,MAAAC,EAAO,mBAAAC,CAAmB,EAAuB,CAC/E,IAAMC,EAAMC,EAAY,EAElBC,EAAc,IAAM,CACxB,OAAO,SAAS,OAAO,EACvBH,EAAmB,CACrB,EAEMI,EAAY,IAAM,CACtB,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,MAAQN,EAAM,QACvB,SAAS,KAAK,YAAYM,CAAQ,EAClCA,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAC3BA,EAAS,OAAO,CAClB,EAEMC,EAAiB,IAAM,CAC3BL,EAAI,cAAc,CACpB,EAEMM,EAAgB,IAAM,CAC1BN,EAAI,cAAc,EAClBD,EAAmB,CACrB,EAEA,SACE,QAACQ,GAAA,CACC,qBAACC,GAAA,CACC,qBAAC,OAAI,uCAA2B,KAChC,QAAC,OACC,oBAAC,QAAM,SAAAV,EAAM,QAAQ,EACvB,KACA,SAACW,GAAA,CACC,qBAACC,GAAA,CAAU,QAASP,EAAW,sBAAU,KACzC,QAACO,GAAA,CAAU,QAASR,EAAa,wBAAY,GAC/C,KACA,QAACS,GAAA,EAAQ,KACT,SAAC,KAAE,qCACwB,OACzB,QAAC,KAAE,QAASN,EAAgB,MAAM,wBAAwB,iCAE1D,EAAK,IAAI,uBACY,OACrB,QAAC,KAAE,QAASC,EAAe,MAAM,qBAAqB,8BAEtD,EAAI,KAEN,GACF,EACF,CAEJ,CAEA,IAAMC,GAAYK,EAAO,MAAO,CAC9B,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,gBAAiB,SACnB,CAAC,EAEKJ,GAAiBI,EAAO,MAAO,CACnC,gBAAiB,SACjB,OAAQ,2BACR,QAAS,KACT,aAAc,EACd,UAAW,SACX,SAAU,IACV,MAAO,QACP,WAAY,MACZ,SAAU,KACV,UAAW,SACX,QAAS,OACT,cAAe,SACf,IAAK,KACL,UAAW,CACT,UAAW,KACX,aAAc,KACd,UAAW,OACX,WAAY,WACZ,gBAAiB,SACjB,QAAS,KACT,aAAc,KACd,WAAY,+BACZ,WAAY,GACd,EACA,MAAO,CACL,WAAY,QACZ,WAAY,IACZ,QAAS,KACT,OAAQ,CACV,EACA,MAAO,CACL,MAAO,QACP,OAAQ,UACR,eAAgB,WAClB,EACA,OAAQ,CACN,WAAY,MACZ,YAAa,KACf,CACF,CAAC,EAEKH,GAAUG,EAAO,MAAO,CAC5B,QAAS,OACT,mBAAoB,CAClB,eAAgB,SAChB,UAAW,QACb,CACF,CAAC,ECzHD,IAAAC,GAOO,iCACPC,GAAuB,oBCRvB,IAAAC,GAAuB,oBACvBC,GAAsB,sBCKtB,IAAAC,GAAuB,oBAoBVC,GAA6B,iBAAqC,CAAC,CAAC,EAE1E,SAASC,IAAmB,CACjC,OAAa,cAAWD,EAAoB,CAC9C,CD9BA,IAAAE,GAAA,6BAWaC,GAAsB,QAAK,UAAyB,CAC/D,IAAMC,EAAMC,EAAY,EAClBC,EAAWC,GAAiB,EAC5B,CAACC,EAAWC,CAAY,EAAU,YAAwB,IAAI,EAE9DC,EAAqB,eACxBC,GAA+B,CAC9BF,EAAaE,EAAM,EAAE,EACrB,GAAI,CACF,GAAM,CAACC,EAAGC,CAAC,EAAIF,EAAM,YAGfG,EAAYV,EAAI,aAAa,CACjC,OAAO,WAAa,EAAIQ,EAAI,EAC5B,OAAO,YAAc,EAAIC,EAAI,CAC/B,CAAC,EAEKE,EAAU,SAAM,SAAS,EAG/BX,EAAI,aAAa,CACf,GAAIW,EACJ,sBACA,KAAMJ,EAAM,KACZ,MAAOG,EACP,KAAM,CAACF,EAAGC,CAAC,EACX,YAAaF,EAAM,GACnB,MAAO,CAAE,MAAO,QAAgB,KAAM,QAAgB,KAAM,MAAc,CAC5E,CAAQ,EAERP,EAAI,OAAOW,CAAO,CACpB,OAASC,EAAP,CACA,QAAQ,MAAM,8BAA+BA,CAAG,CAClD,QAAE,CACAP,EAAa,IAAI,CACnB,CACF,EACA,CAACL,CAAG,CACN,EAEA,SACE,SAACa,GAAA,CACE,UAAAX,EAAS,SAAW,KACnB,SAACY,GAAA,CAAY,yCAEX,QAAC,OAAG,EAAE,wBACY,QAAC,QAAK,uCAA2B,GACrD,EAEAZ,EAAS,IAAKK,MACZ,SAACQ,GAAA,CACC,qBAACC,GAAA,CAAc,MAAO,CAAE,WAAYT,EAAM,cAAgB,SAAU,EAClE,oBAAC,QAAM,aAAMA,EAAM,KAAO,MAAM,EAClC,KACA,SAACU,GAAA,CACC,qBAACC,GAAA,CAAgB,SAAAX,EAAM,KAAK,KAC5B,QAACY,GAAA,CAAgB,SAAAZ,EAAM,YAAY,KACnC,QAACa,GAAA,CAAgB,SAAAb,EAAM,WAAW,GACpC,KACA,QAACc,GAAA,CAAgB,QAAS,IAAMf,EAAaC,CAAK,EAAG,SAAUH,IAAcG,EAAM,GAChF,SAAAH,IAAcG,EAAM,GAAK,MAAQ,SACpC,IAXwBA,EAAM,EAYhC,CACD,KAGH,SAACe,GAAA,CAAe,sDAEd,QAAC,OAAG,GACN,GACF,CAEJ,CAAC,EAIKT,GAAuBU,EAAO,MAAO,CACzC,KAAM,EACN,QAAS,MACT,UAAW,OACX,uBAAwB,CAAE,MAAO,KAAM,EACvC,6BAA8B,CAAE,WAAY,aAAc,aAAc,KAAM,CAChF,CAAC,EAEKT,GAAcS,EAAO,MAAO,CAChC,QAAS,WACT,SAAU,OACV,MAAO,iBACP,UAAW,SACX,WAAY,IACZ,SAAU,CAAE,SAAU,MAAO,WAAY,WAAY,QAAS,UAAW,aAAc,IAAK,CAC9F,CAAC,EAEKR,GAAsBQ,EAAO,MAAO,CACxC,QAAS,OACT,WAAY,SACZ,IAAK,MACL,QAAS,MACT,aAAc,KACd,OAAQ,uBACR,aAAc,MACd,WAAY,mBACZ,UAAW,CAAE,WAAY,QAAS,CACpC,CAAC,EAEKP,GAAgBO,EAAO,MAAO,CAClC,MAAO,OACP,OAAQ,OACR,aAAc,KACd,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,EACZ,SAAU,CAAE,SAAU,MAAO,MAAO,wBAAyB,WAAY,OAAQ,CACnF,CAAC,EAEKN,GAAiBM,EAAO,MAAO,CAAE,KAAM,EAAG,SAAU,CAAE,CAAC,EAEvDL,GAAiBK,EAAO,MAAO,CACnC,SAAU,OACV,WAAY,IACZ,MAAO,QACP,WAAY,SACZ,SAAU,SACV,aAAc,UAChB,CAAC,EAEKJ,GAAiBI,EAAO,MAAO,CACnC,SAAU,MACV,MAAO,iBACP,WAAY,SACZ,SAAU,SACV,aAAc,UAChB,CAAC,EAEKH,GAAiBG,EAAO,MAAO,CACnC,SAAU,MACV,MAAO,iBACP,QAAS,GACT,WAAY,QACZ,WAAY,SACZ,SAAU,SACV,aAAc,UAChB,CAAC,EAEKF,GAAkBE,EAAO,SAAU,CACvC,IAAK,QACL,SAAU,MACV,WAAY,IACZ,MAAO,QACP,WAAY,UACZ,QAAS,UACT,aAAc,KACd,OAAQ,UACR,WAAY,EACZ,WAAY,eACZ,UAAW,CAAE,QAAS,GAAK,EAC3B,aAAc,CAAE,QAAS,GAAK,OAAQ,aAAc,CACtD,CAAC,EAEKD,GAAiBC,EAAO,MAAO,CACnC,QAAS,WACT,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,UAAW,uBACX,UAAW,MACX,SAAU,CAAE,SAAU,MAAO,WAAY,WAAY,QAAS,UAAW,aAAc,IAAK,CAC9F,CAAC,EDnLD,IAAAC,EAAA,6BAeMC,GAAkBC,GAAkB,CACxC,IAAMC,EAAOD,EAAE,SAAS,MAAMA,EAAE,SAAS,eACzC,OAAO,OAAO,OAAOC,EAAK,MAAM,EAAE,KAAK,CAACC,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,CAC9E,EAEME,GAAuBJ,GAC3BA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YAG5CK,GAA8C,CAClD,YACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QACC,EAAE,oCACF,OAAO,eACP,YAAY,MACZ,cAAc,QACd,KAAK,OACP,EACF,EAEF,iBACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,KACN,OAAO,IACP,GAAG,IACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,EACF,EAEF,eACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,WACC,GAAG,MACH,GAAG,MACH,GAAG,MACH,GAAG,MACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,EACF,EAEF,gBACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QAAK,EAAE,wBAAwB,OAAO,eAAe,YAAY,MAAM,KAAK,OAAO,EACtF,EAEF,aACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QACC,EAAE,2BACF,OAAO,eACP,YAAY,MACZ,cAAc,QACd,eAAe,QACjB,EACF,EAEF,YACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QAAK,EAAE,mBAAmB,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,EAC3F,EAEF,cACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,KACN,OAAO,KACP,GAAG,IACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,KACA,OAAC,QAAK,EAAE,gBAAgB,OAAO,eAAe,YAAY,MAAM,GAClE,EAEF,YACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,mBAAC,QACC,GAAG,IACH,GAAG,KACH,GAAG,KACH,GAAG,IACH,OAAO,eACP,YAAY,MACZ,cAAc,QAChB,EACF,EAEF,aACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,KACN,OAAO,IACP,GAAG,IACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,KACA,OAAC,UAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,eAAe,GAClD,EAEF,aACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,KACN,OAAO,IACP,GAAG,IACH,OAAO,eACP,YAAY,MACZ,KAAK,OACP,KACA,OAAC,QAAK,EAAE,oBAAoB,KAAK,eAAe,GAClD,EAEF,aACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,OACnD,oBAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,IACP,GAAG,IACH,OAAO,eACP,YAAY,IACZ,KAAK,OACP,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,IACP,GAAG,IACH,OAAO,eACP,YAAY,IACZ,KAAK,OACP,GACF,CAEJ,EAGaC,GAAoB,QAAK,UAAuB,CAC3D,GAAM,CAACC,EAAWC,CAAY,EAAU,YAAkC,QAAQ,EAElF,SACE,QAACC,GAAA,CACC,cAAgBC,GAAMA,EAAE,gBAAgB,EACxC,YAAcA,GAAMA,EAAE,gBAAgB,EACtC,QAAUA,GAAMA,EAAE,gBAAgB,EAElC,qBAACC,GAAA,CACC,oBAACC,GAAA,CAAU,SAAUL,IAAc,SAAU,QAAS,IAAMC,EAAa,QAAQ,EAAG,kBAEpF,KACA,OAACI,GAAA,CAAU,SAAUL,IAAc,aAAc,QAAS,IAAMC,EAAa,YAAY,EAAG,sBAE5F,GACF,EACCD,IAAc,YAAW,OAACM,GAAA,EAAW,KAAK,OAACC,GAAA,EAAc,GAC5D,CAEJ,CAAC,EAGD,SAASD,IAAa,CACpB,IAAME,EAAMC,EAAY,EAClBC,EAAYF,EAAI,SAAShB,EAAc,EACvCmB,EAAcH,EAAI,SAASX,EAAmB,EAC9C,CAACe,EAAcC,CAAe,EAAU,YAGpC,IAAI,EACRC,EAAmB,UAAsB,IAAI,EAE7CC,EAAuB,WAC3B,IAAML,EAAU,OAAQjB,GAAMA,EAAE,WAAae,EAAI,aAAa,EAC9D,CAACE,EAAWF,EAAI,aAAa,CAC/B,EAEMQ,EAAsB,eAC1B,CAACC,EAAgBC,EAAkBC,IAAiC,CAClE,GAAIF,IAAWC,EAAU,OACzB,IAAME,EAAS,CAAC,GAAGL,CAAc,EAC3BM,EAAUD,EAAO,UAAW3B,GAAMA,EAAE,KAAOwB,CAAM,EACvD,GAAII,IAAY,GAAI,OACpB,IAAMC,EAAYF,EAAO,OAAQ3B,GAAMA,EAAE,KAAOwB,CAAM,EAChDM,EAAWD,EAAU,UAAW7B,GAAMA,EAAE,KAAOyB,CAAQ,EAC7D,GAAIK,IAAa,GAAI,OACrB,IAAMC,EAAWL,IAAa,SAAWI,EAAWA,EAAW,EAC/DD,EAAU,OAAOE,EAAU,EAAGJ,EAAOC,EAAQ,EAC7C,IAAMI,EAAQH,EAAU,OAClBI,EAAkD,CAAC,EACzDJ,EAAU,QAAQ,CAAC7B,EAAGkC,IAAM,CAC1BD,EAAQjC,EAAE,IAAM,CAAE,WAAYgC,EAAQE,CAAE,CAC1C,CAAC,EACDnB,EAAI,WACF,CAAE,SAAU,CAAE,MAAO,CAAE,CAACA,EAAI,eAAgB,CAAE,OAAQkB,CAAQ,CAAE,CAAE,CAAE,EACpE,gBACF,CACF,EACA,CAACX,EAAgBP,CAAG,CACtB,EAEA,SACE,OAACoB,GAAA,CACC,WAAazB,GAAMA,EAAE,eAAe,EACpC,OAAQ,IAAM,CACZW,EAAW,QAAU,KACrBD,EAAgB,IAAI,CACtB,EAEC,SAAAE,EAAe,SAAW,KACzB,OAACc,GAAA,CAAY,iCAAqB,EAElCd,EAAe,IAAKe,MAClB,OAACC,GAAA,CAEC,MAAOD,EACP,UAAWpB,EACX,YAAaC,EACb,IAAKH,EACL,MAAO,EACP,aAAcI,EACd,iBAAmBoB,GAAO,CACxBlB,EAAW,QAAUkB,CACvB,EACA,gBAAiB,CAACA,EAAIC,IAAQpB,EAAgB,CAAE,GAAAmB,EAAI,SAAUC,CAAI,CAAC,EACnE,YAAa,CAACf,EAAUe,IAAQ,CAC1BnB,EAAW,SAASE,EAAcF,EAAW,QAASI,EAAUe,CAAG,EACvEnB,EAAW,QAAU,KACrBD,EAAgB,IAAI,CACtB,EACA,eAAgB,IAAM,CACpBC,EAAW,QAAU,KACrBD,EAAgB,IAAI,CACtB,GAnBKiB,EAAM,EAoBb,CACD,EAEL,CAEJ,CAGA,SAASC,GAAU,CACjB,MAAAD,EACA,UAAApB,EACA,YAAAC,EACA,IAAAH,EACA,MAAA0B,EACA,aAAAtB,EACA,iBAAAuB,EACA,gBAAAC,EACA,YAAAC,EACA,eAAAC,CACF,EAWG,CACD,IAAMC,EAAa5B,EAAY,SAASmB,EAAM,EAAE,EAE1CU,EADUV,EAAM,eACMA,EAAqB,UAAY,CAAC,EAAI,CAAC,EAC7DW,EAAcD,EAAS,OAAS,EAChC,CAACE,EAAUC,CAAW,EAAU,YAAS,EAAI,EAE7CC,EAAqB,eACxBzC,GAAwB,CACvBA,EAAE,gBAAgB,EACdA,EAAE,SACAoC,EAAY/B,EAAI,SAASsB,EAAM,EAAE,EAChCtB,EAAI,OAAO,GAAGG,EAAamB,EAAM,EAAE,EAExCtB,EAAI,OAAOsB,EAAM,EAAE,CAEvB,EACA,CAACtB,EAAKsB,EAAM,GAAInB,EAAa4B,CAAU,CACzC,EAEMM,EAA+B,eAClC1C,GAAwB,CACvBA,EAAE,gBAAgB,EAClBK,EAAI,aAAa,CAACsB,EAAM,EAAE,CAAC,CAC7B,EACA,CAACtB,EAAKsB,EAAM,EAAE,CAChB,EAEMgB,EAAyB,eAC5B3C,GAAwB,CACvBA,EAAE,gBAAgB,EAClBK,EAAI,aAAa,CAACsB,EAAM,EAAE,CAAC,CAC7B,EACA,CAACtB,EAAKsB,EAAM,EAAE,CAChB,EAEMiB,EAAOjD,GAAWgC,EAAM,OAAShC,gBACjCkD,EAAOlB,EAAM,MAAQA,EAAM,KAE3BmB,EAAoB,WAAQ,IAC3BR,EACED,EAAS,IAAKR,GAAOtB,EAAU,KAAMjB,GAAMA,EAAE,KAAOuC,CAAE,CAAC,EAAE,OAAO,OAAO,EADrD,CAAC,EAEzB,CAACS,EAAaD,EAAU9B,CAAS,CAAC,EAG/BwC,GADetC,GAAA,YAAAA,EAAc,MAAOkB,EAAM,GAE5ClB,EAAc,WAAa,SACzB,CAAE,UAAW,mBAAoB,EACjC,CAAE,aAAc,mBAAoB,EACtC,CAAC,EAEL,SACE,oBACE,qBAACuC,GAAA,CACC,UAAW,CAAC,CAAChB,EACb,QAASS,EACT,WAAYL,EACZ,MAAOa,EAAA,CACL,YAAa,GAAG,EAAIlB,EAAQ,OAC5B,OAAQC,EAAmB,OAAS,WACjCe,GAEL,YAAc/C,GAAM,CAClBA,EAAE,gBAAgB,EAClBA,EAAE,aAAa,cAAgB,OAC/BgC,GAAA,MAAAA,EAAmBL,EAAM,GAC3B,EACA,WAAa3B,GAAM,CACjBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB,IAAMkD,EAAQlD,EAAE,cAA8B,sBAAsB,EAC9D8B,EAAM9B,EAAE,QAAUkD,EAAK,IAAMA,EAAK,OAAS,EAAI,SAAW,QAChEjB,GAAA,MAAAA,EAAkBN,EAAM,GAAIG,EAC9B,EACA,OAAS9B,GAAM,CACbA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB,IAAMkD,EAAQlD,EAAE,cAA8B,sBAAsB,EAC9D8B,EAAM9B,EAAE,QAAUkD,EAAK,IAAMA,EAAK,OAAS,EAAI,SAAW,QAChEhB,GAAA,MAAAA,EAAcP,EAAM,GAAIG,EAC1B,EACA,UAAY9B,GAAM,CAChBA,EAAE,gBAAgB,EAClBmC,GAAA,MAAAA,GACF,EAEC,UAAAG,KACC,OAACa,GAAA,CACC,QAAUnD,GAAM,CACdA,EAAE,gBAAgB,EAClBwC,EAAY,CAACD,CAAQ,CACvB,EAEC,SAAAA,KAAW,OAAC,qBAAgB,KAAK,OAAC,sBAAiB,EACtD,KAEA,OAACa,GAAA,EAAyB,KAE5B,OAACC,GAAA,CAAY,SAAAT,EAAK,KAClB,OAACU,GAAA,CAAY,SAAAT,EAAK,KAClB,QAACU,GAAA,CACC,oBAACC,GAAA,CAAgB,QAASd,EACvB,SAAAf,EAAM,YAAW,OAAC,mBAAc,KAAK,OAAC,iBAAY,EACrD,KACA,OAAC6B,GAAA,CAAgB,QAASb,EACvB,SAAAhB,EAAM,YAAW,OAAC,oBAAe,KAAK,OAAC,mBAAc,EACxD,GACF,GACF,EACCW,GAAeC,MACd,OAACkB,GAAA,CACE,SAAAX,EAAY,IAAKY,MAChB,OAAC9B,GAAA,CAEC,MAAO8B,EACP,UAAWnD,EACX,YAAaC,EACb,IAAKH,EACL,MAAO0B,EAAQ,GALV2B,EAAM,EAMb,CACD,EACH,GAEJ,CAEJ,CAIA,IAAM3D,GAAc4D,EAAO,MAAO,CAChC,QAAS,OACT,cAAe,SACf,KAAM,EACN,UAAW,EACX,SAAU,QACZ,CAAC,EAEK1D,GAAe0D,EAAO,MAAO,CACjC,QAAS,OACT,aAAc,uBACd,WAAY,CACd,CAAC,EAEKzD,GAAYyD,EAAO,SAAU,CACjC,IAAK,QACL,KAAM,EACN,QAAS,QACT,SAAU,MACV,WAAY,IACZ,UAAW,SACX,MAAO,iBACP,OAAQ,UACR,cAAe,YACf,cAAe,SACf,WAAY,WACZ,aAAc,wBACd,UAAW,CAAE,MAAO,OAAQ,EAC5B,SAAU,CACR,SAAU,CACR,KAAM,CACJ,MAAO,UACP,kBAAmB,SACrB,CACF,CACF,CACF,CAAC,EAEKlC,GAAakC,EAAO,MAAO,CAC/B,KAAM,EACN,UAAW,OACX,UAAW,SACX,uBAAwB,CAAE,MAAO,KAAM,EACvC,6BAA8B,CAAE,WAAY,aAAc,aAAc,KAAM,CAChF,CAAC,EAEKjC,GAAciC,EAAO,MAAO,CAChC,QAAS,YACT,SAAU,OACV,MAAO,iBACP,UAAW,SACX,UAAW,QACb,CAAC,EAEKX,GAAkBW,EAAO,MAAO,CACpC,QAAS,OACT,WAAY,SACZ,IAAK,MACL,OAAQ,OACR,aAAc,MACd,OAAQ,UACR,WAAY,mBACZ,UAAW,CAAE,WAAY,QAAS,EAClC,SAAU,CACR,WAAY,CACV,KAAM,CACJ,WAAY,2BACZ,UAAW,CAAE,WAAY,yBAA0B,CACrD,CACF,CACF,CACF,CAAC,EAEKR,GAAgBQ,EAAO,SAAU,CACrC,IAAK,QACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,OAAQ,OACR,OAAQ,UACR,MAAO,iBACP,WAAY,EACZ,QAAS,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACzC,UAAW,CAAE,MAAO,OAAQ,CAC9B,CAAC,EAEKP,GAA2BO,EAAO,MAAO,CAAE,MAAO,OAAQ,WAAY,CAAE,CAAC,EAEzEN,GAAaM,EAAO,MAAO,CAC/B,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,OAAQ,OACR,MAAO,iBACP,WAAY,CACd,CAAC,EAEKL,GAAaK,EAAO,OAAQ,CAChC,SAAU,OACV,MAAO,QACP,WAAY,SACZ,SAAU,SACV,aAAc,WACd,KAAM,EACN,WAAY,GACd,CAAC,EAEKJ,GAAgBI,EAAO,MAAO,CAClC,QAAS,OACT,IAAK,MACL,QAAS,EACT,WAAY,eACZ,CAAC,GAAGX,cAA4B,CAAE,QAAS,CAAE,CAC/C,CAAC,EAEKQ,GAAkBG,EAAO,SAAU,CACvC,IAAK,QACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,OACP,OAAQ,OACR,aAAc,KACd,MAAO,iBACP,OAAQ,UACR,QAAS,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACzC,UAAW,CAAE,MAAO,QAAS,WAAY,QAAS,CACpD,CAAC,EAEKF,GAAqBE,EAAO,MAAO,CACvC,WAAY,uBACZ,WAAY,MACd,CAAC,EG7iBD,IAAAC,GAAuB,oBAAvB,IAAAC,GAAA,6BAIaC,GAAkB,QAAK,UAAqB,CACvD,SACE,QAACC,GAAA,CACC,oBAACC,GAAA,EAAY,EACf,CAEJ,CAAC,EAEKD,GAAkBE,EAAO,MAAO,CACpC,QAAS,OACT,cAAe,SACf,MAAO,QACP,OAAQ,OACR,WAAY,SACZ,YAAa,uBACb,OAAQ,IACR,cAAe,MACf,SAAU,SACV,WAAY,CACd,CAAC,ECtBD,IAAAC,GAAiC,sBADjC,IAAAC,GAAA,6BAMMC,GAAmBC,GAAkBA,EAAE,SAAS,UAE/C,SAASC,IAAU,CAExB,IAAMC,EADMC,EAAY,EACF,SAASJ,EAAe,EAE9C,SACE,QAACK,GAAA,CAA4B,OAAQ,CAACF,EACpC,oBAAC,qBAAiB,GAAG,UAAU,OAAQ,CAAE,KAAM,KAAM,EAAG,EAC1D,CAEJ,CAEA,IAAME,GAA8BC,EAAO,MAAO,CAChD,SAAU,WACV,IAAK,EACL,KAAM,MACN,UAAW,qBACX,uBAAwB,OACxB,wBAAyB,OACzB,QAAS,WACT,WAAY,kBACZ,SAAU,qBACV,UAAW,uBACX,gBAAiB,QACjB,OAAQ,IACR,cAAe,OACf,cAAe,CACb,cAAe,KACjB,EACA,SAAU,CACR,UAAW,CACT,OAAQ,CACN,UAAW,uBACb,EACA,QAAS,CACP,UAAW,qBACb,CACF,CACF,CACF,CAAC,EC9CD,IAAAC,GAAsC,2CAEtCC,GAA0C,sBAF1C,IAAAC,GAAA,6BAYA,SAASC,GAAQ,CAAE,SAAAC,EAAU,QAAAC,EAAS,UAAAC,CAAU,EAAiB,CAQ/D,SACE,SAAsB,UAArB,CAA4B,UAAWA,EACtC,qBAACC,GAAA,EAAc,KACf,QAACC,GAAA,CAAc,UAVIC,GAA+B,CACpD,OAAQA,EAAM,SACP,SACHJ,GAAA,MAAAA,IACA,MAEN,EAI8C,SAAAD,EAAS,GACrD,CAEJ,CAEA,IAAMM,GAAoBC,EAA4B,eAAa,CACjE,aAAc,GACd,MAAO,QACP,SAAU,KACV,WAAY,IACZ,UAAW,SACX,SAAU,MACV,SAAU,EACV,UAAW,QACb,CAAC,EAEYC,GAAuC,QACvCC,GAAqBV,GACrBW,GAAyBJ,GACzBK,GAAyC,UACzCC,GAAyC,UAEzCC,GAAc,CAAC,CAAE,UAAAX,CAAU,IAA0B,CAChE,GAAM,CAAE,eAAAY,EAAgB,YAAAC,EAAa,SAAAC,EAAU,KAAAC,EAAM,MAAAC,CAAM,EAAIC,GAAU,EACnEC,KAAO,YAAQ,EACfC,EAA4C,CAChD,cAAeD,EAAK,cAAc,CAAE,GAAI,uBAAwB,CAAC,EACjE,UAAWA,EAAK,cAAc,CAAE,GAAI,mBAAoB,CAAC,CAC3D,EAEA,SACE,QAACZ,GAAA,CAAgB,KAAMO,IAAgB,KACrC,qBAACN,GAAA,CAAmB,QAAS,IAAMK,EAAe,IAAI,EAAG,UAAWZ,EACjE,UAAAa,MACC,QAACL,GAAA,CAAwB,SAAAW,EAAaN,GAAa,KAErD,SAAC,OACC,MAAO,CACL,MAAO,OACP,IAAK,KACL,QAAS,OACT,eAAgB,eAClB,EAEC,UAAAC,MACC,QAACJ,GAAA,CAAkB,QAAO,GACxB,oBAACU,GAAA,CACC,IAAK,CAAE,MAAO,OAAQ,EACtB,QAAS,IAAM,CACbN,EAAS,EACTF,EAAe,IAAI,CACrB,EAEA,oBAAC,qBAAiB,GAAG,gBAAgB,EACvC,EACF,KAEF,SAAC,OAAI,MAAO,CAAE,WAAY,CAAE,EACzB,UAAAG,MACC,QAACN,GAAA,CAAkB,QAAO,GACxB,oBAACW,GAAA,CACC,QAAS,IAAM,CACbL,EAAK,EACLH,EAAe,IAAI,CACrB,EAEA,oBAAC,qBAAiB,GAAG,YAAY,EACnC,EACF,EAEDI,MACC,QAACP,GAAA,CAAkB,QAAO,GACxB,oBAACW,GAAA,CACC,IAAK,CAAE,gBAAiB,UAAW,MAAO,OAAQ,EAClD,QAAS,IAAM,CACbJ,EAAM,EACNJ,EAAe,IAAI,CACrB,EAEA,oBAAC,qBAAiB,GAAG,aAAa,EACpC,EACF,GAEJ,GACF,GACF,EACF,CAEJ,EAEMX,GAAgBI,EAA4B,WAAS,CACzD,SAAU,QACV,MAAO,EACP,gBAAiB,qBACjB,cAAe,KACjB,CAAC,EAEYgB,GAAsBhB,EAA4B,WAAS,CACtE,gBAAiB,qBACjB,SAAU,WACV,cAAe,MACf,MAAO,CACT,CAAC,EAEKH,GAAgBG,EAA4B,WAAS,CACzD,SAAU,QACV,KAAM,MACN,IAAK,MACL,KAAM,MACN,UAAW,wBACX,MAAO,cACP,QAAS,KACT,cAAe,MACf,gBAAiB,SACjB,aAAc,KACd,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,MACZ,OAAQ,2BACR,UAAW,QACb,CAAC,EAEYe,GAASf,EAAO,SAAU,CACrC,IAAK,QACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,aAAc,KACd,QAAS,SACT,SAAU,KACV,WAAY,EACZ,WAAY,SACZ,OAAQ,GACR,MAAO,QACP,OAAQ,UACR,SAAU,EACZ,CAAC,EChKD,IAAAiB,GAAwB,2CACxBC,GAA4B,iCAC5BC,GAAuB,oBACvBC,GAA0C,sBCH1C,IAAAC,GAAuB,oBAAvB,IAAAC,GAAA,6BAQaC,GAAkB,cAC7B,CAACC,EAAmBC,IAAQ,CAA3B,IAAAC,EAAAF,EAAE,MAAAG,CATL,EASGD,EAAWE,EAAAC,GAAXH,EAAW,CAAT,SACD,SACE,SAACI,GAAA,CACC,qBAACC,GAAAC,EAAAC,EAAA,GAAgBL,GAAhB,CAAsB,IAAKH,GAAK,EAChCE,KAAO,QAACO,GAAA,CAAiB,SAAAP,EAAK,EAAqB,MACtD,CAEJ,CACF,EAEMG,GAAqBK,EAAO,MAAO,CACvC,SAAU,WACV,MAAO,OACP,OAAQ,aACV,CAAC,EAEKJ,GAAcI,EAAO,QAAS,CAClC,MAAO,QACP,OAAQ,OACR,UAAW,OACX,MAAO,OACP,YAAa,KACb,aAAc,KACd,gBAAiB,cAEjB,OAAQ,OACR,QAAS,OACT,WAAY,MACZ,SAAU,KACV,UAAW,CACT,gBAAiB,QACnB,EACA,aAAc,IAChB,CAAC,EAEKD,GAAkBC,EAAOC,GAAW,CACxC,IAAK,EACL,MAAO,EACP,SAAU,WACV,YAAa,KACb,aAAc,KACd,cAAe,OACf,MAAO,OACT,CAAC,EDpDD,IAAAC,GAAA,6BAcaC,GAAiB,CAAC,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,IAA2B,CAC1E,IAAMC,EAAMC,EAAY,EAClBC,EAAYC,GAAa,EACzBC,KAAO,YAAQ,EACf,CAACC,EAAUC,CAAW,EAAU,YAASN,EAAI,SAAS,IAAI,EAC1D,CAACO,EAAQC,CAAS,EAAU,YAAyB,MAAM,EAE3DC,EAAqB,eAAaC,GAA+C,CACrF,IAAMC,EAAQD,EAAM,OAAO,MAAM,UAAU,EAC3CJ,EAAYK,CAAK,CACnB,EAAG,CAAC,CAAC,EAEL,SAASC,EAAgBC,EAAwC,CAC/DA,EAAE,gBAAgB,CACpB,CAEA,IAAMC,EAA+B,eAClCD,GAA6C,CAC5C,OAAQA,EAAE,SACH,QAAS,CACZ,IAAME,EAAOV,EAAS,KAAK,EAAE,QAAQ,gBAAiB,EAAE,EACxDL,EAAI,cAAce,EAAMR,CAAM,EAC9BR,EAAQ,EACR,KACF,KACK,SAAU,CACbA,EAAQ,EACR,KACF,EAEJ,EACA,CAACM,EAAUE,CAAM,CACnB,EAEA,SACE,QAAQ,QAAP,CAAY,KAAMT,EACjB,qBAAQ,UAAP,CAAc,UAAWI,EAAU,QAClC,qBAACc,GAAA,CAAoB,cAAejB,EAAS,KAC7C,SAACkB,GAAA,CAAoB,IAAI,MAAM,UAAWL,EAAiB,QAASA,EAClE,qBAACM,GAAA,CACC,YAAad,EAAK,cAAc,CAAE,GAAI,iBAAkB,CAAC,EACzD,MAAOC,EACP,SAAUI,EACV,UAAWK,EACX,QAAM,QAAC,iBAAY,EACrB,KAEA,SAACK,GAAA,CACC,qBAACC,GAAA,CAAY,mBAAO,KACpB,QAACC,GAAA,CAAU,OAAQd,IAAW,OAAQ,QAAS,IAAMC,EAAU,MAAM,EAAG,iBAExE,KACA,QAACa,GAAA,CAAU,OAAQd,IAAW,MAAO,QAAS,IAAMC,EAAU,KAAK,EAAG,gBAEtE,GACF,KACA,SAACc,GAAA,CACC,qBAAQ,UAAP,CAAc,QAAO,GACpB,oBAACC,GAAA,CAAO,QAASxB,EACf,oBAAC,qBAAiB,GAAG,SAAS,EAChC,EACF,KACA,QAAQ,UAAP,CAAc,QAAO,GACpB,oBAACwB,GAAA,CACC,IAAK,CAAE,gBAAiB,UAAW,MAAO,OAAQ,EAClD,QAAS,IAAM,CACb,IAAMR,EAAOV,EAAS,KAAK,EAAE,QAAQ,gBAAiB,EAAE,EACxDL,EAAI,cAAce,EAAMR,CAAM,EAC9BR,EAAQ,CACV,EAEA,oBAAC,qBAAiB,GAAG,OAAO,EAC9B,EACF,GACF,GACF,GACF,EACF,CAEJ,EACMkB,GAAsBO,EAAc,WAAS,CACjD,SAAU,WACV,IAAK,MACL,KAAM,MACN,UAAW,wBACX,SAAU,IACV,SAAU,cACV,UAAW,OACX,UAAW,OACX,cAAe,MACf,gBAAiB,SACjB,QAAS,KACT,aAAc,KACd,KAAM,MACN,OAAQ,OACR,UAAW,CACT,QAAS,MACX,CACF,CAAC,EAEKR,GAAsBQ,EAAc,WAAS,CACjD,gBAAiB,qBACjB,SAAU,WACV,cAAe,MACf,MAAO,EACP,OAAQ,MACV,CAAC,EAEKF,GAAgBE,EAAO,MAAO,CAClC,MAAO,OACP,QAAS,OACT,WAAY,SACZ,IAAK,EACL,eAAgB,WAChB,UAAW,EACb,CAAC,EAEKN,GAAQM,EAAOC,GAAW,CAC9B,WAAY,QACd,CAAC,EAEKN,GAAYK,EAAO,MAAO,CAC9B,QAAS,OACT,WAAY,SACZ,IAAK,EACL,UAAW,CACb,CAAC,EAEKJ,GAAcI,EAAO,OAAQ,CACjC,SAAU,GACV,MAAO,iBACP,WAAY,CACd,CAAC,EAEKH,GAAYG,EAAO,SAAU,CACjC,IAAK,QACL,QAAS,WACT,aAAc,EACd,SAAU,GACV,WAAY,YACZ,OAAQ,UACR,OAAQ,uBACR,MAAO,iBACP,WAAY,WACZ,UAAW,CAAE,WAAY,SAAU,MAAO,OAAQ,EAClD,SAAU,CACR,OAAQ,CACN,KAAM,CACJ,WAAY,UACZ,YAAa,UACb,MAAO,QACP,UAAW,CAAE,WAAY,UAAW,MAAO,OAAQ,CACrD,CACF,CACF,CACF,CAAC,EEzKD,IAAAE,GAAuB,oBCAvB,IAAAC,GAAuB,oBACvBC,GAAsB,sBCDtB,IAAAC,GAAyC,sBAOlC,SAASC,GACdC,EACAC,EACA,CACA,IAAMC,EAAS,SAAM,aAAaD,EAAaD,EAAO,IAAM,CAC1D,GAAM,CAACG,EAAOC,CAAM,EAAIJ,EAAM,KAC9B,MAAO,CACL,KAAM,EACN,KAAMG,EACN,KAAM,EACN,KAAMC,EACN,MAAAD,EACA,OAAAC,CACF,CACF,CAAC,EAED,OAAO,SAAM,gBAAgBF,EAAQF,EAAM,KAAK,CAClD,CCtBA,IAAMK,GAAe,CACnB,UAAoB,OACpB,WAAqB,SACrB,QAAkB,QAClB,YAAsB,SACxB,EAEO,SAASC,GAAaC,UAA2C,CACtE,OAAOF,GAAaE,EACtB,CCTO,IAAMC,GAAiB,UAavB,IAAMC,GAAc,CAAC,GAAK,EAAG,EAEvBC,GAAM,KAAK,GAAK,EAEhBC,GAAiB,QAEjBC,GAAiD,CAC5D,OAASC,GAAMA,EACf,WAAaA,GAAMA,EAAIA,EACvB,YAAcA,GAAMA,GAAK,EAAIA,GAC7B,cAAgBA,GAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAI,IAAM,EAAI,EAAIA,GAAKA,EAChE,YAAcA,GAAMA,EAAIA,EAAIA,EAC5B,aAAeA,GAAM,EAAEA,EAAIA,EAAIA,EAAI,EACnC,eAAiBA,GAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,EACxF,YAAcA,GAAMA,EAAIA,EAAIA,EAAIA,EAChC,aAAeA,GAAM,GAAI,EAAEA,EAAIA,EAAIA,EAAIA,EACvC,eAAiBA,GAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,EAAI,EAAEA,EAAIA,EAAIA,EAAIA,EAC5E,YAAcA,GAAMA,EAAIA,EAAIA,EAAIA,EAAIA,EACpC,aAAeA,GAAM,EAAI,EAAEA,EAAIA,EAAIA,EAAIA,EAAIA,EAC3C,eAAiBA,GAAOA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,GAAK,EAAEA,EAAIA,EAAIA,EAAIA,EAAIA,EACtF,WAAaA,GAAM,EAAI,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,EACjD,YAAcA,GAAM,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,EAC9C,cAAgBA,GAAM,EAAE,KAAK,IAAI,KAAK,GAAKA,CAAC,EAAI,GAAK,EACrD,WAAaA,GAAOA,GAAK,EAAI,EAAI,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,EACxD,YAAcA,GAAOA,GAAK,EAAI,EAAI,EAAI,KAAK,IAAI,EAAG,IAAMA,CAAC,EACzD,cAAgBA,GACdA,GAAK,EACD,EACAA,GAAK,EACL,EACAA,EAAI,GACJ,KAAK,IAAI,EAAG,GAAKA,EAAI,EAAE,EAAI,GAC1B,EAAI,KAAK,IAAI,EAAG,IAAMA,EAAI,EAAE,GAAK,CAC1C,EAwBO,IAAMC,GAAc,CACzB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAEaC,GACX,OAAO,QAAW,YAAc,GAAQ,iCAAiC,KAAK,UAAU,SAAS,EAEtFC,GAAU,OAAO,QAAW,YAAc,GAAQ,SAAS,KAAK,UAAU,SAAS,EAEnFC,GAAmB,CAAC,OAAQ,OAAQ,OAAQ,QAAS,MAAM,EAE3DC,GAAmBH,GAAW,CAAC,EAAI,CAAC,OAAQ,OAAO,EC3FhE,IAAII,GAEJ,SAASC,IAAoB,CAL7B,IAAAC,GAOEA,EAAA,SAAS,eAAe,oBAAoB,IAA5C,MAAAA,EAA+C,SAE/C,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,GAAK,qBAET,OAAO,OAAOA,EAAI,MAAO,CACvB,WAAY,MACZ,MAAO,OACP,OAAQ,wBACR,QAAS,MACT,OAAQ,MACR,cAAeC,GACf,QAAS,IACT,SAAU,WACV,IAAK,SACL,KAAM,MACN,OAAQ,OACR,cAAe,OACf,WAAY,OACZ,sBAAuB,OACvB,kBAAmB,eACnB,iBAAkB,cACpB,CAAC,EAEDD,EAAI,SAAW,GAEf,SAAS,KAAK,YAAYA,CAAG,EACtBA,CACT,CAEI,OAAO,QAAW,cACpBH,GAAOC,GAAkB,GAG3B,IAAII,GAAW,GAIR,SAASC,IAAgB,CAC9BC,GAAW,EACb,CAEO,SAASC,GAAiBC,EAAcC,EAAcC,EAAmB,CAC9E,GAAI,CAACF,EACH,MAAO,CAAC,GAAI,EAAE,EAGhB,GAAI,CAACG,GAEH,MAAO,CAAC,GAAI,EAAE,EAGXA,GAAK,QAAQ,SAAS,KAAK,YAAYA,EAAI,EAEhDA,GAAK,YAAcH,EACnBG,GAAK,MAAM,KAAOF,EAEdC,GACFC,GAAK,MAAM,WAAa,WACxBA,GAAK,MAAM,UAAY,aACvBA,GAAK,MAAM,MAAQ,GAAGD,QAEtBC,GAAK,MAAM,WAAa,MACxBA,GAAK,MAAM,UAAY,SACvBA,GAAK,MAAM,MAAQ,QAIrB,IAAMC,EAAQD,GAAK,aAAe,EAC5BE,EAASF,GAAK,cAAgB,EAEpC,MAAO,CAACC,EAAOC,CAAM,CACvB,CC1EA,IAAMC,GAAgB,IAAI,OACxB,GAAG,CAAC,GAAQ,IAAQ,KAAQ,MAAS,MAAS,KAAQ,IAAM,EACzD,IAAKC,GAAM,OAAO,cAAcA,CAAC,CAAC,EAClC,KAAK,GAAG,GACb,EAEO,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAO,GACP,CACA,IAAMC,EAAa,SAEbC,EAAmBC,GAInBC,EAAQC,GAAU,CACtB,KAAAV,EACA,KAAAK,EACA,MAAAD,EACA,SAAAH,EACA,WAAAK,EACA,WAAAJ,EACA,UAAW,SACX,UAAW,OACX,cAAeM,GACf,WAAY,CACd,CAAC,EAEKG,EAAU,SAAS,gBAAgB,6BAA8B,MAAM,EAC7EA,EAAQ,aAAa,YAAaV,EAAW,IAAI,EACjDU,EAAQ,aAAa,cAAeT,CAAU,EAC9CS,EAAQ,aAAa,cAAeL,CAAU,EAC9CK,EAAQ,aAAa,cAAe,EAAaV,EAAW,IAAI,EAChEU,EAAQ,aAAa,iBAAkBJ,CAAgB,EACvDI,EAAQ,aAAa,aAAcR,GAAA,KAAAA,EAAa,MAAM,EACtDQ,EAAQ,aAAa,oBAAqB,cAAc,EACxDA,EAAQ,aAAa,qBAAsB,cAAc,EAEzD,IAAMC,EAAYH,EAAM,IAAI,CAACI,EAAMC,IAAM,CACvC,IAAMC,EAAQ,SAAS,gBAAgB,6BAA8B,OAAO,EAC5E,OAAAA,EAAM,YAAcF,EAAO;AAAA,EAC3BE,EAAM,aAAa,IAAK,EAAad,GAAYa,EAAI,IAAO,IAAI,EAChEH,EAAQ,YAAYI,CAAK,EAClBA,CACT,CAAC,EAED,OAAQZ,gBACkB,CACtBQ,EAAQ,aAAa,aAAc,QAAQ,EAC3CA,EAAQ,aAAa,cAAe,QAAQ,EAC5CC,EAAU,QAASD,GAAYA,EAAQ,aAAa,IAAKP,EAAQ,EAAI,EAAE,CAAC,EACxE,KACF,WACqB,CACnBO,EAAQ,aAAa,aAAc,OAAO,EAC1CA,EAAQ,aAAa,cAAe,KAAK,EACzCC,EAAU,QAASD,GAAYA,EAAQ,aAAa,IAAK,GAAKP,EAAQ,EAAE,CAAC,EACzE,KACF,SAEEO,EAAQ,aAAa,aAAc,MAAM,EACzCA,EAAQ,aAAa,cAAe,OAAO,EAC3CC,EAAU,QAASD,GAAYA,EAAQ,aAAa,IAAK,EAAI,EAAE,CAAC,EAIpE,OAAOA,CACT,CAEA,SAASD,GAAUM,EAWN,CACX,IAAML,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,YAAY,WAAY,UAAU,EAChDA,EAAQ,MAAM,YAAY,MAAO,SAAS,EAC1CA,EAAQ,MAAM,YAAY,OAAQ,SAAS,EAC3CA,EAAQ,MAAM,YAAY,QAASK,EAAK,MAAQ,IAAI,EACpDL,EAAQ,MAAM,YAAY,SAAU,aAAa,EACjDA,EAAQ,MAAM,YAAY,YAAaK,EAAK,SAAW,IAAI,EAC3DL,EAAQ,MAAM,YAAY,cAAeK,EAAK,UAAU,EACxDL,EAAQ,MAAM,YAAY,cAAeK,EAAK,UAAU,EACxDL,EAAQ,MAAM,YAAY,cAAeK,EAAK,WAAaA,EAAK,SAAW,IAAI,EAC/EL,EAAQ,MAAM,YAAY,iBAAkBK,EAAK,aAAa,EAC9DL,EAAQ,MAAM,YAAY,aAAcK,EAAK,SAAS,EACtD,SAAS,KAAK,YAAYL,CAAO,EAKjC,IAAMM,EAAQD,EAAK,KAChB,MAAMnB,EAAa,EACnB,QAASqB,GAASA,EAAK,QAAQ;AAAA,EAAM;AAAA,CAAK,CAAC,EAC3C,KAAK,GAAG,EACR,MAAM,GAAG,EAMZP,EAAQ,UAAYM,EAAM,GAC1B,IAAIE,EAAaR,EAAQ,aAErBS,EAAc,CAACH,EAAM,EAAE,EACrBR,EAAoB,CAACW,CAAW,EAEtC,QAASN,EAAI,EAAGA,EAAIG,EAAM,OAAQH,IAAK,CACrC,IAAMI,EAAOD,EAAMH,GACnBH,EAAQ,WAAa,IAAMO,EAC3B,IAAMG,EAAYV,EAAQ,aACtBU,EAAYF,IACdA,EAAaE,EACbD,EAAc,CAAC,EACfX,EAAM,KAAKW,CAAW,GAIxBA,EAAY,KAAKF,CAAI,CACvB,CAEA,OAAAP,EAAQ,OAAO,EAERF,EAAM,IAAKI,GAASA,EAAK,KAAK,GAAG,CAAC,CAC3C,CC7IA,IAAAS,GAAA,6BAWO,SAASC,GAAU,CAAE,GAAAC,EAAI,OAAAC,EAAQ,UAAAC,EAAW,OAAAC,EAAQ,MAAAC,EAAQ,CAAE,EAAuB,CAC1F,SACE,QAAC,QACC,qBAAC,QAAK,GAAIJ,EAAK,QACb,qBAAC,QACC,EAAG,KACH,EAAG,KACH,MAAOC,EAAO,MAAQ,IACtB,OAAQA,EAAO,OAAS,IACxB,KAAK,QACP,KACA,QAAC,QACC,EAAGA,EAAO,MAAQ,EAAKC,EAAU,GAAK,EAAKE,IAASD,GAAA,YAAAA,EAAS,KAAM,GACnE,EAAGF,EAAO,OAAS,EAAKC,EAAU,GAAK,EAAKE,IAASD,GAAA,YAAAA,EAAS,KAAM,GACpE,MAAOD,EAAU,GAAKE,EACtB,OAAQF,EAAU,GAAKE,EACvB,GAAI,EAAIA,EACR,GAAI,EAAIA,EACR,KAAK,QACL,QAAS,KAAK,IAAIA,EAAO,EAAG,EAC9B,GACF,EACF,CAEJ,CCnCA,IAAAC,GAAkC,2BAClCC,GAAoB,qBAEpB,IAAMC,GAAM,KAAK,GAAK,EAMTC,GAAN,KAAmB,CACxB,OAAO,iBAAiBC,EAAY,CAElC,IAAMC,EAAQ,OAAI,IAAID,EAAK,GAAIA,EAAK,EAAE,EAChCE,EAAM,OAAI,KAAKD,CAAK,EAC1B,MAAO,CAAC,CAACA,EAAM,GAAKC,EAAKD,EAAM,GAAKC,CAAG,CACzC,CAEA,OAAO,kBAAkBF,EAAY,CACnC,OAAO,OAAI,IAAID,GAAa,iBAAiBC,CAAI,CAAC,CACpD,CAOA,OAAO,eAAeG,EAAkBC,EAAe,CACrD,IAAMF,EAAMC,EAAQ,OAEdE,EAAKF,GAASC,EAAQF,EAAM,GAAKA,GACjCI,EAAKH,EAAQC,GACbG,EAAKJ,GAASC,EAAQ,GAAKF,GACjC,OAAIH,GAAa,SAASM,EAAIE,EAAID,CAAE,EAAI,CAE1C,CAEA,OAAO,SAASE,EAAkB,CAChC,OAAOA,EAAS,IAAI,CAACC,EAAMC,IAAM,CAACD,EAAMD,GAAUE,EAAI,GAAKF,EAAS,OAAO,CAAC,CAC9E,CAGA,OAAO,kBAAkB,CAACG,EAAIC,CAAE,EAAe,CAACC,EAAIC,CAAE,EAAe,CACnE,IAAMC,GAAOD,EAAG,GAAKD,EAAG,KAAOD,EAAG,GAAKD,EAAG,KAAOG,EAAG,GAAKD,EAAG,KAAOD,EAAG,GAAKD,EAAG,IAE9E,GAAII,GAAO,EAAG,OAAO,KAErB,IAAMC,IAAOF,EAAG,GAAKD,EAAG,KAAOF,EAAG,GAAKE,EAAG,KAAOC,EAAG,GAAKD,EAAG,KAAOF,EAAG,GAAKE,EAAG,KAAOE,EAE/EE,IAAOL,EAAG,GAAKD,EAAG,KAAOA,EAAG,GAAKE,EAAG,KAAOD,EAAG,GAAKD,EAAG,KAAOA,EAAG,GAAKE,EAAG,KAAOE,EAErF,OAAIC,EAAK,GAAKC,EAAK,GAAKD,EAAK,GAAKC,EAAK,EAAU,KAE1C,CAACN,EAAG,GAAKK,GAAMJ,EAAG,GAAKD,EAAG,IAAKA,EAAG,GAAKK,GAAMJ,EAAG,GAAKD,EAAG,GAAG,CACpE,CAEA,OAAO,UACLR,EACAe,EACAC,EACAC,EACAC,EACAC,EAAoB,GACpB,CACA,IAAMd,EAAW,CAAC,GAAGL,CAAO,EACxBoB,EAAa,KAAK,MAAMH,EAAY,GAAKF,EAAO,GAAIE,EAAY,GAAKF,EAAO,EAAE,EAC9EM,EAAW,KAAK,MAAMH,EAAU,GAAKH,EAAO,GAAIG,EAAU,GAAKH,EAAO,EAAE,EACxEK,EAAa,IAAGA,GAAczB,IAC9B0B,EAAW,IAAGA,GAAY1B,IAC9B,IAAM2B,EAAkB,EAClBC,EAAQH,EAAaC,EAAWD,EAAaC,EAAWD,EAAazB,GAAM0B,EAC3EG,GAAUL,EAAoB,CAACI,EAAQ5B,GAAM4B,GAASD,EAE5DjB,EAAS,KAAKY,CAAW,EACzB,QAASV,EAAI,EAAGA,EAAIe,EAAiB,EAAEf,EAAG,CACxC,IAAMgB,EAAQH,EAAaI,EAASjB,EACpCF,EAAS,KAAK,CAACU,EAAO,GAAK,KAAK,IAAIQ,CAAK,EAAIP,EAAQD,EAAO,GAAK,KAAK,IAAIQ,CAAK,EAAIP,CAAM,CAAC,CAC5F,CACA,OAAAX,EAAS,KAAKa,CAAS,EAEhBb,CACT,CAEA,OAAO,iBAAiBR,EAAY4B,EAAkB,CACpD,OAAO5B,EAAK,IAAKS,GAAS,OAAI,IAAIA,EAAMmB,CAAM,CAAC,CACjD,CAEA,OAAO,iBAAiBzB,EAAkByB,EAAS,EAAG,CACpD,IAAMC,EAAQ9B,GAAa,SAASI,CAAO,EAErC2B,EAAcD,EAAM,IAAK7B,GAC7BD,GAAa,iBAAiBC,EAAM,OAAI,IAAID,GAAa,kBAAkBC,CAAI,EAAG4B,CAAM,CAAC,CAC3F,EAEMpB,EAAW,CAAC,EAElB,QAASE,EAAI,EAAGA,EAAIoB,EAAY,OAAQpB,IAAK,CAC3C,IAAMqB,EAAWD,EAAYpB,GACvBsB,EAAWF,GAAapB,EAAIoB,EAAY,OAAS,GAAKA,EAAY,QAClEG,EAASlC,GAAa,kBAAkBiC,EAAUD,CAAQ,EAC5DE,EAAQzB,EAAS,KAAKyB,CAAM,EAE9BlC,GAAa,UAAUS,EAAUqB,EAAMnB,GAAG,GAAIkB,EAAQI,EAAS,GAAID,EAAS,GAAI,EAAK,CAEzF,CAIA,OAAOvB,CACT,CAEA,OAAO,qBAAqBL,EAAuB+B,EAAe,EAAG,CACnE,IAAMJ,EAAc3B,EAAQ,IAAKH,GAC/BD,GAAa,iBAAiBC,EAAMD,GAAa,iBAAiBC,CAAI,CAAC,CACzE,EAEMQ,EAAW,CAAC,EAClB,QAASE,EAAI,EAAGA,EAAIoB,EAAY,OAAQpB,IAAK,CAC3C,IAAMqB,EAAWD,EAAYpB,GACvBsB,EAAWF,GAAapB,EAAIoB,EAAY,OAAS,GAAKA,EAAY,QAClEG,EAASlC,GAAa,kBAAkBiC,EAAUD,CAAQ,EAC5DE,EAAQzB,EAAS,KAAKyB,CAAM,EAE9BlC,GAAa,UACXS,EACAL,EAAQO,GAAG,GACXwB,EACAF,EAAS,GACTD,EAAS,GACT,EACF,CAEJ,CAEA,OAAOvB,CACT,CACF,EA9Ha2B,GAANpC,GAeLqC,EAfWD,GAeJ,WAAW,OAAI,QAiHjB,SAASE,GAAiBC,EAAoBV,EAAgB,CACnE,GAAIU,EAAO,OAAS,EAAG,MAAM,MAAM,qCAAqC,EACxE,IAAMpC,EAAMoC,EAAO,OACnB,OAAOA,EACJ,IAAI,CAACC,EAAO7B,IAAM,CAAC6B,EAAOD,GAAQ5B,EAAI,GAAKR,EAAI,CAAC,EAChD,IAAI,CAAC,CAACsC,EAAGC,CAAC,IAAM,CACf,IAAMC,EAAe,OAAI,IAAI,OAAI,IAAI,OAAI,IAAI,OAAI,IAAID,EAAGD,CAAC,CAAC,CAAC,EAAGZ,CAAM,EACpE,MAAO,CAAC,OAAI,IAAIY,EAAGE,CAAY,EAAG,OAAI,IAAID,EAAGC,CAAY,CAAC,CAC5D,CAAC,EACA,IAAI,CAAC1C,EAAMU,EAAGmB,IAAU,CACvB,IAAMc,KAAe,sBAAkB3C,EAAM6B,GAAOnB,EAAI,GAAKmB,EAAM,OAAO,EAC1E,GAAIc,IAAiB,OAAW,MAAM,MAAM,0BAA0B,EACtE,OAAOA,CACT,CAAC,CACL,CCvJA,IAAAC,GAAsB,sBAGtB,IAAMC,GAAc,UAEdC,GAAa,UAEbC,GAAS,CACb,UAAoB,UACpB,cAAwB,UACxB,SAAmB,UACnB,UAAoB,UACpB,UAAoB,UACpB,SAAmB,UACnB,SAAmB,UACnB,WAAqB,UACrB,WAAqB,UACrB,QAAkB,UAClB,WAAqB,UACrB,WAAqB,SACvB,EAEaC,GAAyD,CACpE,MAAOC,EAAAC,EAAA,GACD,OAAO,YACT,OAAO,QAAQH,EAAM,EAAE,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,CAACD,EAAG,SAAM,UAAUC,EAAGP,GAAa,GAAI,CAAC,CAAC,CACnF,GAHK,CAIL,UAAoB,UACpB,UAAoB,SACtB,GACA,KAAMI,EAAAC,EAAA,GACA,OAAO,YACT,OAAO,QAAQH,EAAM,EAAE,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,CACrCD,EACA,SAAM,UAAU,SAAM,UAAUC,EAAG,UAAW,EAAG,EAAGN,GAAY,EAAG,CACrE,CAAC,CACH,GANI,CAOJ,UAAoB,UACpB,UAAoB,SACtB,EACF,EAEaO,GAAqD,CAChE,MAAOJ,EAAAC,EAAA,GACFH,IADE,CAEL,UAAoB,SACtB,GACA,KAAME,EAAAC,EAAA,GACA,OAAO,YACT,OAAO,QAAQH,EAAM,EAAE,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,CAACD,EAAG,SAAM,UAAUC,EAAGN,GAAY,EAAG,CAAC,CAAC,CACjF,GAHI,CAIJ,UAAoB,UACpB,UAAoB,SACtB,EACF,EAEaQ,GAAmD,CAC9D,MAAOL,EAAAC,EAAA,GACD,OAAO,YACT,OAAO,QAAQH,EAAM,EAAE,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,CAACD,EAAG,SAAM,UAAUC,EAAGP,GAAa,GAAI,CAAC,CAAC,CACnF,GAHK,CAIL,UAAoB,SACtB,GACA,KAAMI,EAAAC,EAAA,GACA,OAAO,YACT,OAAO,QAAQH,EAAM,EAAE,IAAI,CAAC,CAACI,EAAGC,CAAC,IAAM,CAACD,EAAG,SAAM,UAAUC,EAAGN,GAAY,GAAI,CAAC,CAAC,CAClF,GAHI,CAIJ,UAAoB,gBACpB,UAAoB,SACtB,EACF,EAEMS,GAAe,CACnB,UAAmB,EACnB,WAAoB,IACpB,UAAmB,CACrB,EAEMC,GAAY,CAChB,UAAmB,GACnB,WAAoB,GACpB,UAAmB,GACnB,KAAM,MACR,EAEMC,GAAY,CAChB,WAAoB,iBACpB,SAAkB,oBAClB,UAAmB,gBACnB,SAAkB,mBACpB,EAEMC,GAAoB,CACxB,WAAoB,EACpB,SAAkB,EAClB,UAAmB,EACnB,SAAkB,CACpB,EAEMC,GAAkB,CACtB,UAAmB,GACnB,WAAoB,GACpB,UAAmB,GACnB,KAAM,MACR,EAEO,SAASC,GAAeC,EAAyB,CACtD,OAAON,GAAaM,EACtB,CAEO,SAASC,GAAYD,EAAiBE,WAAiD,CAC5F,OAAOP,GAAUK,GAAQH,GAAkBK,EAC7C,CAEO,SAASC,GAAYC,WAAoCC,EAA6B,CAC3F,OAAIA,EAAmB,IAAIA,KACpBT,GAAUQ,EACnB,CAEO,SAASE,GAAkBN,EAAyB,CACzD,OAAOF,GAAgBE,EACzB,CAEO,SAASO,GAAaC,EAA4B,CACvD,IAAMC,EAAWR,GAAYO,EAAM,KAAMA,EAAM,IAAI,EAC7CE,EAAWP,GAAYK,EAAM,KAAMA,EAAM,UAAU,EACnD,CAAE,MAAAG,EAAQ,CAAE,EAAIH,EAEtB,MAAO,GAAGC,EAAWE,SAAaD,GACpC,CAEO,SAASE,GAAmBJ,EAA4B,CAC7D,IAAMC,EAAWH,GAAkBE,EAAM,IAAI,EACvCE,EAAWP,GAAYK,EAAM,KAAMA,EAAM,UAAU,EACnD,CAAE,MAAAG,EAAQ,CAAE,EAAIH,EAEtB,MAAO,GAAGC,EAAWE,SAAaD,GACpC,CAEO,SAASG,GAAoBL,EAAoBM,EAAa,GAAO,CA3I5E,IAAAC,EAAAC,EA4IE,GAAM,CAAE,MAAAC,CAAM,EAAIT,EAEZU,EAAeJ,EAAa,OAAS,QACrCK,EACJF,aAA8BA,qBAAiDA,EAEjF,MAAO,CACL,MAAMF,EAAAP,EAAM,UAAN,KAAAO,EAAiB5B,GAAY+B,GAAOC,GAC1C,QAAQH,EAAAR,EAAM,YAAN,KAAAQ,EAAmB,KAC3B,MAAOF,EAAa,UAAY,SAClC,CACF,CAEO,SAASM,GACdZ,EACAM,EAMA,CAjKF,IAAAC,EAAAC,EAAAK,EAAAC,EAkKE,GAAM,CAAE,MAAAL,EAAO,KAAAjB,EAAM,SAAAuB,CAAS,EAAIf,EAE5BgB,GAAcT,EAAAP,EAAM,sBAAN,KAAAO,EAA6BhB,GAAeC,CAAI,EAE9DkB,EAAeJ,EAAa,OAAS,QAE3C,MAAO,CACL,QAAQE,EAAAR,EAAM,YAAN,KAAAQ,EAAmBxB,GAAQ0B,GAAOD,GAC1C,KAAMM,GAAWF,EAAAb,EAAM,UAAN,KAAAa,EAAiB5B,GAAMyB,GAAOD,GAAS,OACxD,YAAAO,EACA,SAASF,EAAAd,EAAM,UAAN,KAAAc,EAAiB,CAC5B,CACF,CAEO,IAAMG,GAA4B,CACvC,cACA,aACA,SAAU,GACV,YACA,MAAO,CACT,EAEaC,GAAgCtC,EAAAC,EAAA,GACxCoC,IADwC,CAE3C,cACA,kBACF,GCvLA,IAAME,GAAS,KAEFC,GAAN,KAAoB,CACzB,OAAO,kBAAkBC,EAA+CC,EAAoB,CAE1FD,EAAM,aACJC,EACAD,EAAM,gBAAkB,EACxBA,EAAM,cAAgB,EACtB,KACF,EAEAA,EAAM,cACJ,IAAI,WAAW,QAAS,CACtB,KAAMC,EACN,UAAW,aACX,YAAa,EACf,CAAC,CACH,CACF,CAGA,OAAO,OAAOD,EAA+CC,EAAoB,CAC/E,IAAMC,EAAWF,EAAM,cACjBG,EAAeD,EAAS,cAC1BC,IAAiBH,GACnBA,EAAM,MAAM,EAGTE,EAAS,YAAY,aAAc,GAAOD,CAAI,GACjDF,GAAc,kBAAkBC,EAAOC,CAAI,EAGzCE,IAAiBD,EAAS,KAC5BF,EAAM,KAAK,EACFG,aAAwB,aAAeA,IAAiBH,GACjEG,EAAa,MAAM,CAEvB,CAGA,OAAO,IAAIH,EAA+CC,EAAoB,CAC5ED,EAAM,OAAO,EACbD,GAAc,OAAOC,EAAOC,CAAI,CAClC,CAGA,OAAO,aAAaD,EAAuD,CACzE,GAAM,CAAE,eAAAI,EAAgB,aAAAC,CAAa,EAAIL,EACzC,OAAOA,EAAM,MAAM,MACjBI,GAAkC,OAClCC,GAA8B,MAChC,CACF,CAGA,OAAO,cACLL,EACAM,EACAC,EACM,CACN,GAAM,CAAE,eAAAH,EAAgB,aAAAC,CAAa,EAAIL,EACnCQ,EAAYT,GAAc,aAAaC,CAAK,EAClDD,GAAc,OAAOC,EAAOM,EAAOE,GAAaD,GAAA,KAAAA,EAAWD,EAAK,EAGhEN,EAAM,gBAAkBI,GAAkB,GAAKE,EAAK,OACpDN,EAAM,cAAgBK,GAAgB,GAAKC,EAAK,MAClD,CAGA,OAAO,QACLN,EACAS,EACAC,EACM,CAEN,IAAIC,EAAQ,EAEZX,EAAM,MAAM,QAAQS,EAAa,IAAIG,IAAiB,CAEpD,IAAMC,EAAaF,EAASC,EAAKA,EAAK,OAAS,GACzCE,EAAcF,EAAK,GAAG,OAC5BZ,EAAM,eAAiBa,EACvBb,EAAM,aAAea,EAAaC,EAElC,IAAMC,EAAc,OAAOL,GAAa,SAAWA,EAAWA,EAAS,GAAGE,CAAI,EAC9E,OAAAb,GAAc,OAAOC,EAAOe,CAAW,EAGvCf,EAAM,eAAiBa,EACvBF,GAASI,EAAY,OAASD,EACvBC,CACT,CAAC,CACH,CAEA,OAAO,YAAYC,EAAeC,EAA4B,CAE5D,IAAMC,EAAgBF,EAAM,YAAY;AAAA,EAAMC,EAAa,CAAC,EAAI,EAGhE,OAAID,EAAM,OAAOE,CAAa,IAAM,IAC3BD,EAGFC,EAAgB,CACzB,CAEA,OAAO,OAAOC,EAAoC,CAjHpD,IAAAC,EAkHI,GAAM,CAAE,eAAAhB,EAAgB,aAAAC,EAAc,MAAAW,CAAM,EAAIG,EAC1CE,EAAmBL,EAAM,MAAMZ,EAAgBC,CAAY,EAG3DiB,GAAiBF,EAAA,MAAM,KAAKC,CAAgB,IAA3B,YAAAD,EAA8B,OAErD,GAAIE,GAAkBA,EAAiB,EAAG,CAExC,IAAMC,EAAiBP,EAAM,YAAY;AAAA,EAAMZ,EAAiB,CAAC,EAAI,EAE/DoB,EAAeL,EAAQ,MAAM,MAAMI,EAAgBlB,EAAe,CAAC,EACnEoB,EAAeD,EAAa,QAChC,QACA,KAAK1B,IACP,EACM4B,EAAoBD,EAAa,OAASD,EAAa,OAG7DL,EAAQ,kBAAkBI,EAAgBlB,EAAe,CAAC,EAC1DN,GAAc,OAAOoB,EAASM,CAAY,EAG1CN,EAAQ,kBAAkBf,EAAiB,EAAGC,EAAeqB,CAAiB,CAChF,MACE3B,GAAc,OAAOoB,EAASrB,EAAM,CAExC,CAIA,OAAO,SAASqB,EAAoC,CAClD,GAAM,CAAE,eAAAf,EAAgB,aAAAC,EAAc,MAAAW,CAAM,EAAIG,EAG1CI,EAAiBP,EAAM,YAAY;AAAA,EAAMZ,EAAiB,CAAC,EAAI,EAC/DuB,EAAsB5B,GAAc,YAAYiB,EAAOX,CAAY,EAEnEmB,EAAeL,EAAQ,MAAM,MAAMI,EAAgBI,CAAmB,EACtEF,EAAeD,EAAa,QAAQ,qBAAsB,IAAI,EAC9DE,EAAoBF,EAAa,OAASC,EAAa,OAG7DN,EAAQ,kBAAkBI,EAAgBI,CAAmB,EAC7D5B,GAAc,OAAOoB,EAASM,CAAY,EAG1C,IAAMG,EAAuB,YAAY,KAAKZ,EAAM,MAAMO,EAAgBnB,CAAc,CAAC,EAEnFyB,EAAaD,EAAuBA,EAAqB,GAAG,OAAS,EAErEE,EAAoB1B,EAAiByB,EAC3CV,EAAQ,kBACNf,EAAiByB,EACjB,KAAK,IAAIC,EAAmBzB,EAAeqB,CAAiB,CAC9D,CACF,CACF,EC1KA,IAAAK,GAAuB,oBCEhB,IAAMC,GAAmBC,GAC9BA,EAAE,gBAAgB,ECHpB,IAAAC,GAA8D,sBAC9DC,GAAiF,2BACjFC,EAAoB,qBCKb,SAASC,GAAYC,EAAc,CACxC,GAAIA,IAAW,KACb,OAAOA,EAET,GAAIA,aAAkB,KACpB,OAAO,IAAI,KAAKA,EAAO,QAAQ,CAAC,EAKlC,GAAI,OAAOA,GAAW,SACpB,GAAI,OAAOA,EAAO,OAAO,WAAyB,WAAY,CAC5D,IAAMC,EAAK,CAAC,EACZ,GAAKD,EAAwB,OAAS,EACpC,QAAWE,KAAeF,EACxBC,EAAG,KAAKF,GAASG,CAAW,CAAC,EAGjC,OAAOD,CACT,KAAO,CACL,IAAME,EAAa,OAAO,KAAKH,CAAM,EAC/BC,EAAK,CAAC,EACZ,GAAIE,EAAW,OAAS,EACtB,QAAWC,KAAOD,EAChBF,EAAGG,GAAkBL,GAASC,EAAOI,EAAe,EAGxD,OAAOH,CACT,CAIF,OAAOD,CACT,CCxCA,IAAAK,GAAuB,oBACvBC,GAA8C,sBAC9CC,GAIO,2BACPC,EAAoB,qBCPpB,IAAAC,GAAuB,oBACvBC,GAAmC,sBAEnCC,GAIO,2BACPC,GAAoB,qBAOb,IAAeC,GAAf,cAA+E,cAIpF,CAJK,kCAOLC,EAAA,eAAU,IAEVA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,2BAAsB,IAEtBA,EAAA,yBAAoB,IAEpBA,EAAA,uBAAkB,IAIlBA,EAAA,oBAAe,CAACC,EAAUC,IACjB,SAAM,cAAcA,EAAO,KAAK,iBAAiBD,CAAK,CAAC,GAGhED,EAAA,0BAAqB,CAACC,EAAUE,EAAaC,IAAyB,CACpE,IAAMC,EAAM,SAAM,oBAAoB,CAACF,EAAGC,CAAC,CAAC,EACtCE,EAAS,KAAK,UAAUL,CAAK,EAEnC,OAAO,SAAM,cAAcK,EAAQD,CAAG,GAAKJ,EAAM,YAC7C,iCAA6BE,EAAGC,EAAG,SAAM,kBAAkB,KAAK,UAAUH,CAAK,CAAC,CAAC,EAC9E,gBACH,+BAA2BE,EAAGC,EAAG,KAAK,UAAUH,CAAK,CAAC,EAAE,OAAS,CACvE,GAEAD,EAAA,cAAUO,IACR,KAAK,OAAO,IAAIA,EAAM,GAAU,aAAU,CAAC,EACpC,KAAK,SAASA,CAAK,IAG5BP,EAAA,iBAAaC,GACJ,SAAM,gBAAgB,KAAK,UAAUA,CAAK,CAAC,GAGpDD,EAAA,yBAAqBC,GACZ,SAAM,aAAa,KAAK,UAAUA,CAAK,EAAG,KAAK,eAAe,GAGvED,EAAA,uBAAkB,CAChBC,EACAO,EACAN,EACAO,EACAC,EACAC,IACG,CAGH,IAAML,EAAS,KAAK,UAAUL,CAAK,EAC7BW,EAAiB,KAAK,kBAAkBX,CAAK,EAGnD,GAAI,CAAC,SAAM,cAAcC,EAAOU,CAAc,EAAG,OAEjD,IAAMC,KAAgB,uBAAmBJ,EAAQC,EAAWE,CAAc,EACvE,OAAQE,GAAQA,EAAI,YAAY,EAChC,IAAKA,GAAQA,EAAI,OAAO,EAAE,EAE7B,GAAI,CAACD,EAAc,OAAQ,OAG3B,IAAME,EAAS,KAAK,UAAUd,CAAK,EAG7Be,EAAeH,EAAc,KAAK,CAACI,EAAGC,IAAM,OAAI,KAAKA,EAAGT,CAAM,EAAI,OAAI,KAAKQ,EAAGR,CAAM,CAAC,EAAE,GAGvFU,EAAc,OAAI,IAAIjB,EAAOc,CAAY,EAG3CI,EAGAC,EAEAV,GAEFS,EAAS,OAAI,KAAKlB,EAAOa,CAAM,EAAI,GAAmB,EAAIA,EAASb,EACnEmB,EAAW,IAEP,OAAI,sBAAsBnB,EAAOiB,EAAaJ,CAAM,EAAI,GAAmB,EAE7EK,EAASL,EAGTK,EAASD,EAGP,SAAM,cAAcjB,EAAOI,CAAM,EAGnCe,EAAW,KAAK,gBAGhBA,EAAW,KAAK,IACd,KAAK,gBACL,SAAM,eAAef,CAAM,EACxB,IAAKgB,GAAS,OAAI,sBAAsBA,EAAK,GAAG,GAAIA,EAAK,GAAG,GAAIpB,CAAK,CAAC,EACtE,KAAK,CAACe,EAAGC,IAAMD,EAAIC,CAAC,EAAE,EAC3B,GAQJ,IAAMK,EAAe,OAAI,KAAK,OAAI,IAAIH,EAAQ,CAACR,EAAe,KAAMA,EAAe,IAAI,CAAC,EAAG,CACzFA,EAAe,MACfA,EAAe,MACjB,CAAC,EAED,MAAO,CACL,MAAO,OAAI,OAAOW,EAAc,EAAG,CAAC,EACpC,SAAAF,CACF,CACF,GAEArB,EAAA,cAAS,CAACC,EAAUM,IACXA,GAGTP,EAAA,iBAAY,CAACC,EAAUK,EAAkBkB,IAChCC,EAAAC,EAAA,GAAKzB,GAAL,CAAY,MAAO,CAACK,EAAO,KAAMA,EAAO,IAAI,CAAE,IAGvDN,EAAA,uBAAkB,CAACC,EAAUK,EAAkBkB,IACtC,KAAK,UAAUvB,EAAOK,EAAQkB,CAAI,GAG3CxB,EAAA,uBAEAA,EAAA,yBAEAA,EAAA,uBAEAA,EAAA,2BAMAA,EAAA,4BAMAA,EAAA,kCAEAA,EAAA,0BAEAA,EAAA,qBAAgB,CACdC,EACA0B,IACmD,CApLvD,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAqLI,IAAMC,GAAML,EAAA,SAAS,eAAe3B,EAAM,GAAK,MAAM,IAAzC,YAAA2B,EAA4C,UAAU,IAClE,GAAI,CAACK,EAAK,OAEV,IADiBF,GAAAD,GAAAD,EAAA5B,EAAM,QAAN,YAAA4B,EAAa,SAAb,YAAAC,EAAqB,SAArB,KAAAC,EAA+B,EAAI,EACtC,CACZ,IAAMG,EAAIjC,EACJkC,EAAI,SAAS,gBAAgB,6BAA8B,GAAG,EAE9DC,EAAOC,GAAapC,EAAM,KAAK,EAC/BqC,EAAWC,GAAYtC,EAAM,MAAM,KAAMA,EAAM,MAAM,IAAI,IAAK+B,EAAA/B,EAAM,MAAM,QAAZ,KAAA+B,EAAqB,GACnFQ,EAAaC,GAAYxC,EAAM,MAAM,IAAI,EAAE,MAAM,EAAG,EAAE,EAEtDK,EAAS,KAAK,UAAUL,CAAK,EAC7ByC,EAAY,KAAK,IAAI,EAAGpC,EAAO,MAAQ,EAAE,EAEzCqC,EAAYC,GAAiB3C,EAAM,MAAQmC,EAAMM,CAAS,EAE1DG,EAAWC,GACfZ,EAAE,MACFI,EACAE,WAEAE,EACA,EACF,EAEA,OAAAG,EAAS,aACP,YACA,aAAavC,EAAO,MAAQ,EAAIoC,EAAY,MAAMpC,EAAO,OAAS,EAAIqC,EAAU,GAAK,IACvF,EACAE,EAAS,aAAa,OAAQE,GAAc9C,EAAM,MAAO0B,CAAU,EAAE,MAAM,EAC3EkB,EAAS,aAAa,mBAAoB,eAAe,EACzDV,EAAE,aAAa,aAAc,QAAQ,EACrCA,EAAE,aAAa,cAAe,QAAQ,EACtCA,EAAE,YAAYF,CAAG,EACjBE,EAAE,YAAYU,CAAQ,EACfV,CACT,CACA,OAAOF,CACT,GACF,EC5NA,IAAAe,GAAsB,+BACtBC,GAAsB,sBACtBC,GAAkE,2BAClEC,GAAgB,wBAMT,SAASC,GAAgBC,EAAiBC,EAAeC,EAAkBC,EAAc,CAC9F,MAAO,CACL,IACAH,EAAM,GACNA,EAAM,GACN,IACAE,EAAO,GACPA,EAAO,GACP,EACA,EACAC,EAAO,EAAI,EAAI,EACfF,EAAI,GACJA,EAAI,EACN,EAAE,KAAK,GAAG,CACZ,CAEO,SAASG,GAAaC,EAAgCF,EAAc,CACzE,GAAM,CAAE,MAAAH,EAAO,IAAAC,CAAI,EAAII,EAEjBC,EAAO,GAAAC,QAAI,KAAKP,EAAM,MAAOC,EAAI,KAAK,EAEtCO,EAAW,GAAAD,QAAI,IAAIP,EAAM,MAAOC,EAAI,KAAK,EAEzCQ,EAAYH,EAAO,EAAKH,EAExBO,EAAI,GAAAH,QAAI,IAAI,GAAAA,QAAI,IAAIP,EAAM,MAAOC,EAAI,KAAK,CAAC,EAMjD,OAJc,GAAAM,QAAI,QAChB,KAAK,IAAIE,CAAQ,EAAI,GAAKD,EAAW,GAAAD,QAAI,IAAIC,EAAU,GAAAD,QAAI,IAAI,GAAAA,QAAI,IAAIG,CAAC,EAAGD,CAAQ,CAAC,CACtF,CAGF,CAEO,SAASE,GACdC,EACAC,EACAb,EACAC,EACAa,EACAC,EACA,CACA,IAAMC,EAAY,SAAM,IAAIJ,CAAE,EACxBK,EAAcC,GAAcL,CAAK,EAAE,YACnCM,EAAaL,EAAkB,GAAAP,QAAI,MAAMP,EAAOC,EAAKgB,CAAW,EAAIjB,EACpEoB,EAAWL,EAAgB,GAAAR,QAAI,MAAMN,EAAKD,EAAOiB,CAAW,EAAIhB,EAChEoB,KAAS,GAAAC,SAAU,CAACH,EAAYC,CAAQ,EAAG,CAC/C,KAAMH,EACN,SAAU,KAAQD,EAAU,EAAI,GAChC,OAAQO,GAAQ,YAChB,iBAAkB,GAClB,WAAY,EACZ,KAAM,EACR,CAAC,EACD,OAAO,SAAM,qBAAqBF,CAAM,CAC1C,CAEO,SAASG,GACdZ,EACAC,EACAb,EACAC,EACAa,EACAC,EACAU,EACAC,EACAC,EACAC,EACA,CACA,IAAMZ,EAAY,SAAM,IAAIJ,CAAE,EACxBK,EAAcC,GAAcL,CAAK,EAAE,YACnCM,EAAaL,EAAkB,GAAAP,QAAI,QAAQP,EAAOyB,EAAQR,EAAcU,CAAM,EAAI3B,EAClFoB,EAAWL,EAAgB,GAAAR,QAAI,QAAQN,EAAKwB,EAAQ,EAAER,EAAcU,EAAO,EAAI1B,EAC/E4B,EAAa,GAAAtB,QAAI,MAAMkB,EAAQN,CAAU,EACzCW,EAAW,GAAAvB,QAAI,MAAMkB,EAAQL,CAAQ,EACrCW,EAAqB,CAAC,EACtBC,EAAQ,EAAI,KAAK,MAAO,KAAK,IAAIL,CAAM,EAAI,GAAM,EAAIX,EAAU,EAAI,CAAC,EAC1E,QAASiB,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,IAAMC,EAAIN,EAAOK,EAAID,CAAK,EACpBG,EAAQ,SAAM,WAAWN,EAAYC,EAAUI,CAAC,EACtDH,EAAO,KAAK,GAAAxB,QAAI,QAAQ,GAAAA,QAAI,aAAakB,EAAQU,EAAOT,CAAM,CAAC,CAAC,CAClE,CACA,IAAML,KAAS,GAAAC,SAAU,CAACH,EAAY,GAAGY,EAAQX,CAAQ,EAAG,CAC1D,KAAM,EAAIH,EACV,SAAU,KAAQD,EAAU,EAAI,GAChC,OAAQO,GAAQ,YAChB,iBAAkB,GAClB,WAAY,EACZ,KAAM,EACR,CAAC,EACD,OAAO,SAAM,qBAAqBF,CAAM,CAC1C,CAEO,SAASe,GAAOpC,EAAiBG,EAAgBF,EAAe,CACrE,OAAO,SAAM,sBAAsBD,EAAOC,EAAKE,CAAI,CACrD,CAEO,SAASkC,GACdC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,IAAMC,KAAO,0BAAsBL,EAAGC,EAAK,KAAOC,EAAGC,CAAE,EAAE,OACzD,GAAI,CAACE,EACH,OAAAC,EAAK,KAAK,oDAAoD,EACvD,CAAE,KAAMN,EAAG,MAAOA,CAAE,EAE7B,IAAMO,EAAMH,EAAQC,EAAK,GAAKA,EAAK,GAC7BG,EAAOD,EAAM,GAAAtC,QAAI,MAAM,GAAAA,QAAI,QAAQsC,EAAKP,EAAG,KAAK,GAAK,CAAC,EAAGA,EAAGC,EAAK,KAAM,EAAID,EAC3ES,EAAQF,EAAM,GAAAtC,QAAI,MAAM,GAAAA,QAAI,QAAQsC,EAAKP,EAAG,CAAC,KAAK,GAAK,CAAC,EAAGA,EAAGC,EAAK,KAAM,EAAID,EACnF,MAAO,CAAE,KAAAQ,EAAM,MAAAC,CAAM,CACvB,CAEO,SAASC,GAA2BV,EAAaW,EAAaC,EAAW,CAC9E,IAAMP,KAAO,+BAA2BL,EAAGY,EAAGZ,EAAGW,CAAC,EAAE,OACpD,GAAI,CAACN,EACH,OAAAC,EAAK,KAAK,oDAAoD,EACvD,CAAE,KAAMN,EAAG,MAAOA,CAAE,EAE7B,IAAMO,EAAMF,EAAK,GACXG,EAAOD,EAAM,GAAAtC,QAAI,QAAQsC,EAAKP,EAAG,KAAK,GAAK,CAAC,EAAIA,EAChDS,EAAQF,EAAM,GAAAtC,QAAI,QAAQsC,EAAKP,EAAG,CAAC,KAAK,GAAK,CAAC,EAAIA,EACxD,MAAO,CAAE,KAAAQ,EAAM,MAAAC,CAAM,CACvB,CAEO,SAASI,GACdb,EACAC,EACAC,EACAC,EACAC,EACA,CACA,GAAM,CAAE,KAAAI,EAAM,MAAAC,CAAM,EAAIV,GAAyBC,EAAGC,EAAIC,EAAGC,EAAIC,CAAK,EACpE,MAAO,KAAKI,OAAUR,KAAKS,GAC7B,CAEO,SAASK,GAAyBd,EAAaW,EAAaC,EAAW,CAC5E,GAAM,CAAE,KAAAJ,EAAM,MAAAC,CAAM,EAAIC,GAA2BV,EAAGW,EAAGC,CAAC,EAC1D,MAAO,KAAKJ,OAAUR,KAAKS,GAC7B,CAEO,SAASM,GACdxC,EACAb,EACAG,EACAF,EACAa,EACAC,EACA,CACA,GAAM,CAAE,YAAAE,CAAY,EAAIC,GAAcL,EAAO,EAAK,EAC5CyC,EAAY,GAAA/C,QAAI,KAAKP,EAAOC,CAAG,EAC/BsD,EAAkB,KAAK,IAAID,EAAY,EAAGrC,EAAc,CAAC,EACzDuC,EAA4B,CAAC,EAEnC,GADuB,GAAAjD,QAAI,KAAKJ,EAAM,GAAAI,QAAI,QAAQ,GAAAA,QAAI,IAAIP,EAAOC,CAAG,CAAC,CAAC,EAAI,EAExEuD,EAAK,KAAK,KAAKxD,OAAWC,GAAK,EAC3Ba,GACF0C,EAAK,KAAKJ,GAAyBpD,EAAOC,EAAKsD,CAAe,CAAC,EAE7DxC,GACFyC,EAAK,KAAKJ,GAAyBnD,EAAKD,EAAOuD,CAAe,CAAC,MAE5D,CACL,IAAMrD,EAASkC,GAAOpC,EAAOG,EAAMF,CAAG,EAChCwB,EAAS,CAACvB,EAAO,GAAIA,EAAO,EAAE,EAC9BwB,EAASxB,EAAO,GAChByB,EAAS8B,GAAahC,EAAQC,EAAQ1B,EAAOC,CAAG,EACtDuD,EAAK,KAAK,KAAKxD,OAAW0B,KAAUA,SAAcC,EAAS,EAAI,IAAM,OAAO1B,GAAK,EAC7Ea,GACF0C,EAAK,KAAKL,GAAuBnD,EAAOuD,EAAiB9B,EAAQC,EAAQC,EAAS,CAAC,CAAC,EAClFZ,GACFyC,EAAK,KAAKL,GAAuBlD,EAAKsD,EAAiB9B,EAAQC,EAAQC,GAAU,CAAC,CAAC,CAEvF,CACA,OAAO6B,EAAK,KAAK,GAAG,CACtB,CAEO,SAASE,GAAa1D,EAAiBG,EAAgBF,EAAe,CAC3E,GAAI,GAAAM,QAAI,MAAMJ,EAAM,GAAAI,QAAI,IAAIP,EAAOC,CAAG,CAAC,GAAK,EAAG,MAAO,CAACD,EAAOC,CAAG,EAEjE,IAAM8B,EAAqB,CAAC,EACtB7B,EAASkC,GAAOpC,EAAOG,EAAMF,CAAG,EAChCwB,EAAS,CAACvB,EAAO,GAAIA,EAAO,EAAE,EAC9BwB,EAASxB,EAAO,GAChB2B,EAAa,GAAAtB,QAAI,MAAMkB,EAAQzB,CAAK,EACpC8B,EAAW,GAAAvB,QAAI,MAAMkB,EAAQxB,CAAG,EACtC,QAASgC,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAMC,EAAID,EAAI,GACRE,EAAQ,SAAM,WAAWN,EAAYC,EAAUI,CAAC,EACtDH,EAAO,KAAK,GAAAxB,QAAI,aAAakB,EAAQU,EAAOT,CAAM,CAAC,CACrD,CACA,OAAOK,CACT,CAEO,SAAS4B,GAAeC,EAAWC,EAAWC,EAAoB,CACvE,GAAIA,IAAMF,GAAKE,IAAMD,EAAG,MAAO,GAC/B,IAAME,EAAM,KAAK,GAAK,EAChBC,GAAMH,EAAID,EAAIG,GAAOA,EACrBE,GAAMH,EAAIF,EAAIG,GAAOA,EAC3B,OAAOC,GAAM,KAAK,IAAOC,EAAKD,CAChC,CAEO,SAASP,GAAajB,EAAaU,EAAWZ,EAAaW,EAAqB,CACrF,IAAMP,EAAQ,SAAM,SAASF,EAAGF,EAAGW,CAAC,EACpC,OAAOC,GAAK,EAAI,KAAK,KAAOR,GAAS,EAAI,KAAK,IAChD,CCxNA,IAAAwB,GAAuB,oBACvBC,GAAsB,sBACtBC,GAAgB,wBCFhB,IAAAC,GAAA,6BAUO,SAASC,GAAU,CAAE,KAAAC,EAAM,OAAAC,EAAQ,MAAAC,EAAO,OAAAC,EAAQ,YAAAC,CAAY,EAAmB,CACtF,SACE,SAAC,KACC,qBAAC,QAAK,UAAU,oBAAoB,EAAG,KAAKJ,OAAUC,KAAUC,IAAS,KACzE,QAAC,QACC,EAAG,KAAKF,OAAUC,KAAUC,IAC5B,KAAK,OACL,OAAQC,EACR,YAAaC,EACb,cAAc,QACd,eAAe,QACf,cAAc,OAChB,GACF,CAEJ,CDzBA,IAAAC,GAAA,6BA4BaC,GAAoB,QAAK,SAAqB,CACzD,GAAAC,EACA,MAAAC,EACA,MAAAC,EACA,KAAAC,EACA,IAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,OAAAC,EACA,WAAAC,CACF,EAAkB,CAChB,IAAMC,EAAY,GAAAC,QAAI,KAAKT,EAAOE,CAAG,EACrC,GAAIM,EAAY,EAAG,OAAO,KAC1B,IAAME,EAASC,GAAcZ,EAAOQ,CAAU,EACxC,CAAE,YAAAK,CAAY,EAAIF,EAClBG,EAAK,EAAID,EAAc,MAEvBE,EAASC,GAAOf,EAAOC,EAAMC,CAAG,EAChCc,EAAS,CAACF,EAAO,GAAIA,EAAO,EAAE,EAC9BG,EAASH,EAAO,GAChBI,EAASC,GAAaH,EAAQC,EAAQjB,EAAOE,CAAG,EAChDkB,EAAY,SAAM,IAAItB,CAAE,EACxBuB,EAASC,GAAQF,EAAU,EAAI,EAAI,gBAAkB,kBACrDG,EAAOjB,EACTkB,GACE1B,EACAC,EACAC,EACAE,EACAE,EACAC,EACAW,EACAC,EACAC,EACAG,CACF,EACAI,GAAgBzB,EAAOE,EAAKY,EAAQX,CAAS,EAC3C,CAAE,gBAAAuB,EAAiB,iBAAAC,CAAiB,EAAI,SAAM,oBAClD,KAAK,IAAIT,CAAM,EACfL,EACAd,EAAM,KACN,EACA,EACF,EAEM6B,EAAkB,KAAK,IAAIpB,EAAY,EAAGI,EAAc,CAAC,EACzDiB,EAAiBzB,EACnB0B,GAAyB9B,EAAO4B,EAAiBZ,EAAQC,EAAQC,EAAS,CAAC,EAC3E,KACEa,EAAe1B,EACjByB,GAAyB5B,EAAK0B,EAAiBZ,EAAQC,EAAQC,GAAU,CAAC,EAC1E,KACJ,SACE,sBACE,qBAAC,QAAK,UAAU,oBAAoB,EAAGK,EAAM,KAC7C,QAAC,QACC,EAAGA,EACH,KAAMjB,EAASI,EAAO,OAAS,OAC/B,OAAQA,EAAO,OACf,YAAaJ,EAAS,EAAIO,EAC1B,gBAAiBa,EACjB,iBAAkBC,EAClB,cAAc,QACd,eAAe,QACf,cAAc,OAChB,EACCE,MACC,QAACG,GAAA,CACC,KAAMH,EAAe,KACrB,OAAQ7B,EACR,MAAO6B,EAAe,MACtB,OAAQnB,EAAO,OACf,YAAaG,EACf,EAEDkB,MACC,QAACC,GAAA,CACC,KAAMD,EAAa,KACnB,OAAQ7B,EACR,MAAO6B,EAAa,MACpB,OAAQrB,EAAO,OACf,YAAaG,EACf,GAEJ,CAEJ,CAAC,EEnHD,IAAAoB,GAAuB,oBACvBC,GAAsB,sBACtBC,GAAgB,wBAFhB,IAAAC,GAAA,6BAqBaC,GAAsB,QAAK,SAAuB,CAC7D,GAAAC,EACA,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,OAAAC,EACA,WAAAC,CACF,EAAkB,CAChB,IAAMC,EAAY,GAAAC,QAAI,KAAKP,EAAOC,CAAG,EACrC,GAAIK,EAAY,EAAG,OAAO,KAC1B,IAAME,EAASC,GAAcV,EAAOM,CAAU,EACxC,CAAE,YAAAK,CAAY,EAAIF,EAClBG,EAAK,EAAID,EAAc,MAEvBE,EAAOR,EACTS,GAAyBf,EAAIC,EAAOC,EAAOC,EAAKC,EAAiBC,CAAa,EAC9E,IAAM,GAAAI,QAAI,QAAQP,CAAK,EAAI,IAAM,GAAAO,QAAI,QAAQN,CAAG,EAC9C,CAAE,gBAAAa,EAAiB,iBAAAC,CAAiB,EAAI,SAAM,oBAClDT,EACAI,EAAc,MACdX,EAAM,KACN,EACA,EACF,EAEMiB,EAAkB,KAAK,IAAIV,EAAY,EAAGI,EAAc,CAAC,EACzDO,EAAiBf,EACnBgB,GAA2BlB,EAAOC,EAAKe,CAAe,EACtD,KACEG,EAAehB,EACjBe,GAA2BjB,EAAKD,EAAOgB,CAAe,EACtD,KACJ,SACE,sBACE,qBAAC,QAAK,UAAU,oBAAoB,EAAGJ,EAAM,KAC7C,QAAC,QACC,EAAGA,EACH,KAAMJ,EAAO,OACb,OAAQA,EAAO,OACf,YAAaJ,EAASO,EAAK,EAAIA,EAC/B,gBAAiBG,EACjB,iBAAkBC,EAClB,cAAc,QACd,eAAe,QACf,cAAc,SAChB,EACCE,MACC,QAACG,GAAA,CACC,KAAMH,EAAe,KACrB,OAAQjB,EACR,MAAOiB,EAAe,MACtB,OAAQT,EAAO,OACf,YAAaG,EACf,EAEDQ,MACC,QAACC,GAAA,CACC,KAAMD,EAAa,KACnB,OAAQlB,EACR,MAAOkB,EAAa,MACpB,OAAQX,EAAO,OACf,YAAaG,EACf,GAEJ,CAEJ,CAAC,ELzFD,IAAAU,GAAA,6BA6CaC,GAAN,cAAwBC,EAAkB,CAA1C,kCACLC,EAAA,qBAEAA,EAAA,kBAAa,IAEbA,EAAA,eAAU,IAEVA,EAAA,iBAAY,IAAI,SAEhBA,EAAA,gBAAYC,GAAyB,CAtDvC,IAAAC,EAAAC,EAAAC,EAAAC,EAuDI,OAAOC,EAAA,CACL,GAAI,KACJ,aACA,KAAM,QACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,EACV,KAAM,EACN,QAAS,CACP,MAAOA,EAAA,CACL,GAAI,QACJ,MAAO,EACP,MAAO,CAAC,EAAG,CAAC,EACZ,QAAS,KACNJ,EAAAD,EAAM,UAAN,YAAAC,EAAe,OAEpB,IAAKI,EAAA,CACH,GAAI,MACJ,MAAO,EACP,MAAO,CAAC,EAAG,CAAC,EACZ,QAAS,KACNH,EAAAF,EAAM,UAAN,YAAAE,EAAe,KAEpB,KAAMG,EAAA,CACJ,GAAI,OACJ,MAAO,EACP,MAAO,CAAC,GAAK,EAAG,IACbF,EAAAH,EAAM,UAAN,YAAAG,EAAe,KAEtB,EACA,aAAaC,EAAAJ,EAAM,cAAN,KAAAI,EAAqB,CAChC,WACF,EACA,MAAOC,EAAAC,EAAAD,EAAA,GACFE,IADE,CAEL,SAAU,KACPP,EAAM,OAEX,MAAO,GACP,WAAY,CAAC,GAAK,EAAG,GAClBA,EAEP,GAEAD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAU,EAAO,UAAAC,EAAW,QAAAC,EAAS,KAAAC,EAAM,OAAAC,EAAQ,cAAAC,EAAe,YAAAC,CAAY,EAAGC,IAAQ,CArGtF,IAAAd,EAAAC,EAAAC,GAsGM,GAAM,CACJ,GAAAa,EACA,MAAAC,EAAQ,GACR,QAAS,CAAE,MAAAC,EAAO,KAAAC,EAAM,IAAAC,CAAI,EAC5B,YAAAC,EAAc,CAAC,EACf,MAAAC,CACF,EAAId,EAEEe,GAAWrB,GAAAD,EAAAgB,GAAA,YAAAA,EAAO,SAAP,YAAAhB,EAAe,SAAf,KAAAC,EAAyB,EAAI,EAExCsB,EAAiB,MAAI,KAAKL,EAAK,MAAO,MAAI,QAAQ,MAAI,IAAID,EAAM,MAAOE,EAAI,KAAK,CAAC,CAAC,EAAI,EAEtFK,EAAOC,GAAaJ,CAAK,EAEzBK,EAASC,GAAcN,EAAOX,EAAK,UAAU,EAE7CkB,EAAYN,GAAYd,EAAYqB,GAAiBb,EAAOQ,CAAI,EAAI,CAAC,EAAG,CAAC,EAEzEM,EAAS,KAAK,UAAUvB,CAAK,EAE7BwB,EAAa,WAAQ,IAAM,CAC/B,GAAM,CAAE,MAAAd,EAAO,KAAAC,GAAM,IAAAC,EAAI,EAAIZ,EAAM,QACnC,GAAIgB,EAAgB,OAAO,MAAI,KAAKN,EAAM,MAAOE,GAAI,KAAK,EAC1D,IAAMa,GAASC,GAAOhB,EAAM,MAAOC,GAAK,MAAOC,GAAI,KAAK,EAClDe,GAASF,GAAO,MAAM,EAAG,CAAC,EAC1BG,GAASH,GAAO,GAChBI,GAASC,GAAaH,GAAQC,GAAQlB,EAAM,MAAOE,GAAI,KAAK,EAClE,OAAO,KAAK,IAAIiB,EAAM,CACxB,EAAG,CAAC7B,EAAM,OAAO,CAAC,EAEZ+B,EAAQ,KAAK,IACjB,GACA,KAAK,IAAI,EAAG,KAAK,IAAIP,GAAQH,EAAU,GAAK,KAAMG,GAAQH,EAAU,GAAK,IAAI,CAAC,CAChF,EAEMW,EAAe,WAAQ,IAAM,CACjC,IAAMT,EAAS,KAAK,UAAUvB,CAAK,EAKnC,OAJe,MAAI,IACjBA,EAAM,QAAQ,KAAK,MACnB,MAAI,QAAQ,CAACuB,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,CACnD,CAEF,EAAG,CAACvB,EAAO+B,CAAK,CAAC,EAEXE,EAA0B,eAC7BxB,GAAkB,CACjBJ,GAAA,MAAAA,EAAgB,CAAE,GAAAG,EAAI,MAAAC,CAAM,EAC9B,EACA,CAACJ,CAAa,CAChB,EAEM6B,EAAYlB,EAAiBmB,GAAgBC,GAEnD,SACE,SAACC,GAAAvC,EAAAD,EAAA,CAAY,IAAKU,GAASH,GAA1B,CACC,qBAACkC,GAAA,CACC,KAAMrB,EACN,KAAMR,EACN,OAAOd,GAAAmB,EAAM,aAAN,KAAAnB,GAAoBwB,EAAO,OAClC,WAAYL,EAAM,gBAClB,aAAcA,EAAM,aACpB,QAASkB,EAAO,GAChB,QAASA,EAAO,GAChB,MAAOD,EACP,UAAW9B,EACX,SAAUgC,EACV,OAAQ3B,EACV,KACA,SAAC,iBAAa,GAAIN,EAAM,GAAK,OAC3B,qBAAC,QACC,qBAAC,QAAK,GAAIA,EAAM,GAAK,QACnB,qBAAC,QACC,EAAG,KACH,EAAG,KACH,MAAOuB,EAAO,MAAQ,IACtB,OAAQA,EAAO,OAAS,IACxB,KAAK,QACP,KACA,QAAC,QACC,EAAGA,EAAO,MAAQ,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAC1D,EAAGT,EAAO,OAAS,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAC3D,MAAOX,EAAU,GAAKU,EACtB,OAAQV,EAAU,GAAKU,EACvB,GAAI,EAAIA,EACR,GAAI,EAAIA,EACR,KAAK,QACL,QAAS,EACX,GACF,EACF,KACA,QAAC,KACC,cAAc,OACd,QAAS7B,EAAU,GAAkBiB,EAAO,QAC5C,KAAMJ,GAAYd,EAAY,QAAQD,EAAM,WAAa,GAEzD,oBAACkC,EAAA,CACC,GAAI1B,EACJ,MAAOM,EACP,MAAOJ,EAAM,MACb,IAAKE,EAAI,MACT,KAAMD,EAAK,MACX,UAAWX,EAAM,KACjB,gBAAiBa,GAAA,YAAAA,EAAa,MAC9B,cAAeA,GAAA,YAAAA,EAAa,IAC5B,OAAQC,EAAM,cACd,WAAYX,EAAK,WACnB,EACF,GACF,IACF,CAEJ,CACF,GAEAZ,EAAA,iBAAYD,GAAY,UAAsB,CAAC,CAAE,MAAAU,EAAO,OAAAuB,CAAO,IAAM,CAxNvE,IAAA9B,EAAAC,EAyNI,GAAM,CACJ,MAAAoB,EACA,YAAAD,EACA,MAAAJ,EACA,QAAS,CAAE,MAAAC,EAAO,KAAAC,EAAM,IAAAC,CAAI,CAC9B,EAAIZ,EAEEe,GAAWrB,GAAAD,EAAAgB,GAAA,YAAAA,EAAO,SAAP,YAAAhB,EAAe,SAAf,KAAAC,EAAyB,EAAI,EAExCuB,EAAOC,GAAaJ,CAAK,EACzBO,EAAYN,EAAWO,GAAiBb,EAAQQ,CAAI,EAAI,CAAC,EAAG,CAAC,EAC7DD,EAAiB,MAAI,KAAKL,EAAK,MAAO,MAAI,QAAQ,MAAI,IAAID,EAAM,MAAOE,EAAI,KAAK,CAAC,CAAC,EAAI,EAEtFY,EAAa,WAAQ,IAAM,CAC/B,GAAM,CAAE,MAAAd,EAAO,KAAAC,EAAM,IAAAC,CAAI,EAAIZ,EAAM,QACnC,GAAIgB,EAAgB,OAAO,MAAI,KAAKN,EAAM,MAAOE,EAAI,KAAK,EAC1D,IAAMa,EAASC,GAAOhB,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EAClDe,EAASF,EAAO,MAAM,EAAG,CAAC,EAC1BG,EAASH,EAAO,GAChBI,EAASC,GAAaH,EAAQC,EAAQlB,EAAM,MAAOE,EAAI,KAAK,EAClE,OAAO,KAAK,IAAIiB,CAAM,CACxB,EAAG,CAAC7B,EAAM,OAAO,CAAC,EAEZ+B,EAAQ,KAAK,IACjB,GACA,KAAK,IAAI,EAAG,KAAK,IAAIP,GAAQH,EAAU,GAAK,KAAMG,GAAQH,EAAU,GAAK,IAAI,CAAC,CAChF,EAEMW,EAAe,WAAQ,IAAM,CACjC,IAAMT,EAAS,KAAK,UAAUvB,CAAK,EAEnC,OADe,MAAI,IAAIA,EAAM,QAAQ,KAAK,MAAO,CAACuB,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,CAExF,EAAG,CAACvB,EAAO+B,CAAK,CAAC,EAEjB,SACE,sBACG,UAAAhB,MACC,QAACwB,GAAA,CACC,GAAIvC,EAAM,GACV,MAAO+B,EACP,OAAQC,EACR,OAAQT,EACR,UAAWF,EACb,KAEF,QAAC,QACC,EAAGmB,GACD1B,EACAJ,EAAM,MACNC,EAAK,MACLC,EAAI,MACJC,GAAA,YAAAA,EAAa,MACbA,GAAA,YAAAA,EAAa,GACf,EACA,KAAME,EAAW,QAAQf,EAAM,WAAa,GAC9C,EACCe,MACC,QAAC,QACC,EAAGQ,EAAO,MAAQ,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAC1D,EAAGT,EAAO,OAAS,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAC3D,MAAOX,EAAU,GAAKU,EACtB,OAAQV,EAAU,GAAKU,EACvB,GAAI,EAAIA,EACR,GAAI,EAAIA,EACR,KAAK,cACP,GAEJ,CAEJ,CAAC,GAEDxC,EAAA,iBAAaS,GAAa,CACxB,IAAMuB,EAAS,SAAM,aAAa,KAAK,YAAavB,EAAO,IAAM,CAC/D,GAAM,CACJ,QAAS,CAAE,MAAAU,EAAO,KAAAC,EAAM,IAAAC,CAAI,CAC9B,EAAIZ,EACJ,OAAO,SAAM,oBAAoByC,GAAa/B,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,CAAC,CACnF,CAAC,EACD,OAAO,SAAM,gBAAgBW,EAAQvB,EAAM,KAAK,CAClD,GAEAT,EAAA,wBAAoBS,GAAa,CAC/B,GAAM,CACJ,QAAS,CAAE,MAAAU,EAAO,KAAAC,EAAM,IAAAC,CAAI,CAC9B,EAAIZ,EACA0C,EAASD,GAAa/B,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EACtD,CAAE,KAAA+B,EAAM,KAAAC,EAAM,KAAAC,EAAM,KAAAC,CAAK,EAAI,SAAM,oBAAoBJ,CAAM,EACnE,OAAI1C,EAAM,WAAa,IACrB0C,EAASA,EAAO,IAAKK,GACnB,MAAI,QAAQA,EAAI,EAAEJ,EAAOE,GAAQ,GAAID,EAAOE,GAAQ,CAAC,EAAG9C,EAAM,UAAY,CAAC,CAC7E,GAGK,SAAM,gBAAgB,SAAM,oBAAoB0C,CAAM,EAAG1C,EAAM,KAAK,CAC7E,GAEAT,EAAA,iBAAaS,GAAa,CACxB,GAAM,CAAE,MAAAU,EAAO,IAAAE,CAAI,EAAIZ,EAAM,QAC7B,OAAO,MAAI,IAAIA,EAAM,MAAO,MAAI,IAAIU,EAAM,MAAOE,EAAI,KAAK,CAAC,CAC7D,GAEArB,EAAA,oBAAe,CAACyD,EAASC,IAErBA,EAAK,cAAgBD,EAAK,aAC1BC,EAAK,UAAYD,EAAK,SACtBC,EAAK,QAAUD,EAAK,OACpBC,EAAK,QAAUD,EAAK,OAIxBzD,EAAA,oBAAe,CAACS,EAAUkD,IAA6B,CACrD,GAAM,CACJ,QAAS,CAAE,MAAAxC,EAAO,KAAAC,EAAM,IAAAC,CAAI,CAC9B,EAAIZ,EACE+C,EAAK,MAAI,IAAIG,EAAOlD,EAAM,KAAK,EAC/B0C,EAASD,GAAa/B,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EAC9D,QAASuC,EAAI,EAAGA,EAAIT,EAAO,OAAQS,IACjC,GAAI,MAAI,sBAAsBT,EAAOS,EAAI,GAAIT,EAAOS,GAAIJ,CAAE,EAAI,EAC5D,MAAO,GAGX,MAAO,EACT,GAEAxD,EAAA,0BAAqB,CAACS,EAAUoD,EAAaC,IAAyB,CACpE,GAAM,CACJ,QAAS,CAAE,MAAA3C,EAAO,KAAAC,EAAM,IAAAC,CAAI,CAC9B,EAAIZ,EACEsD,EAAM,MAAI,IAAIF,EAAGpD,EAAM,KAAK,EAC5BuD,EAAM,MAAI,IAAIF,EAAGrD,EAAM,KAAK,EAC5B0C,EAASD,GAAa/B,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EAC9D,QAASuC,EAAI,EAAGA,EAAIT,EAAO,OAAQS,IACjC,MAAI,oCAAgCT,EAAOS,EAAI,GAAIT,EAAOS,GAAIG,EAAKC,CAAG,EAAE,aACtE,MAAO,GAGX,MAAO,EACT,GAEAhE,EAAA,qBAAgB,CAACS,EAAUuB,IAAqB,CAC9C,GAAM,CAAE,MAAAb,EAAO,IAAAE,EAAK,KAAAD,CAAK,EAAIX,EAAM,QAC7BwD,EAAK,MAAI,IAAIxD,EAAM,MAAOU,EAAM,KAAK,EACrC+C,EAAK,MAAI,IAAIzD,EAAM,MAAOY,EAAI,KAAK,EACzC,GAAI,SAAM,cAAc4C,EAAIjC,CAAM,GAAK,SAAM,cAAckC,EAAIlC,CAAM,EACnE,MAAO,GAET,GAAI,MAAI,QAAQ,MAAI,IAAIb,EAAM,MAAOE,EAAI,KAAK,EAAGD,EAAK,KAAK,EACzD,SAAO,+BAA2B6C,EAAIC,EAAIlC,CAAM,EAAE,OAAS,EACtD,CACL,GAAM,CAACmC,EAAIC,EAAIC,CAAC,EAAIlC,GAAOhB,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EACvDiD,EAAK,MAAI,IAAI7D,EAAM,MAAO,CAAC0D,EAAIC,CAAE,CAAC,EACxC,SAAO,uBAAmBE,EAAID,EAAGJ,EAAIC,EAAIlC,CAAM,EAAE,OAAS,CAC5D,CACF,GAEAhC,EAAA,iBAAY,CACVS,EACAuB,EACA,CAAE,aAAAuC,EAAc,OAAAC,EAAQ,OAAAC,CAAO,IAChB,CACf,IAAMC,EAAqB,KAAK,UAAUH,CAAY,EAChDI,EAAkC,CAAC,QAAS,KAAK,EACjDC,EAActE,EAAA,GAAKiE,EAAa,SAEtCI,EAAQ,QAASE,GAAW,CAC1B,GAAIA,IAAW,OAAQ,OAEvB,GAAM,CAACC,EAAGC,CAAC,EAAIH,EAAYC,GAAQ,MAC7BG,EAAKF,EAAIJ,EAAmB,MAC5BO,EAAKF,EAAIL,EAAmB,OAClCE,EAAYC,GAAUtE,EAAAD,EAAA,GACjBsE,EAAYC,IADK,CAEpB,MAAO,CACL7C,EAAO,OAASwC,EAAS,EAAI,EAAIQ,EAAKA,GACtChD,EAAO,QAAUyC,EAAS,EAAI,EAAIQ,EAAKA,EACzC,CACF,EACF,CAAC,EAID,IAAMC,EACHV,EAAS,GAAKC,EAAS,GAAOD,EAAS,GAAKC,EAAS,EAClD,CAACF,EAAa,KACdA,EAAa,KAGbY,EAAYC,GAAaR,EAAaM,CAAQ,EACpD,OAAAN,EAAY,KAAK,MAAQO,EAElB,CACL,MAAO,MAAI,QAAQ,CAACnD,EAAO,KAAMA,EAAO,IAAI,CAAC,EAC7C,QAAS4C,EACT,KAAMM,CACR,CACF,GAEAlF,EAAA,2BAAsB,CAACS,EAAUoE,IAAqD,CA9ZxF,IAAA3E,EAAAC,EA+ZI,OAAQ0E,OACD,OACH,MAAO,CACL,KAAM,EACN,QAAStE,EAAAD,EAAA,GACJG,EAAM,SADF,CAEP,KAAMF,EAAAD,EAAA,GACDG,EAAM,QAAQ,MADb,CAEJ,MAAO2E,GAAa3E,EAAM,QAASA,EAAM,IAAI,CAC/C,EACF,EACF,MAEG,QACH,MAAO,CACL,YAAaF,EAAAD,EAAA,GACRG,EAAM,aADE,CAEX,OAAOP,EAAAO,EAAM,cAAN,MAAAP,EAAmB,MAAQ,cACpC,EACF,MAEG,MACH,MAAO,CACL,YAAaK,EAAAD,EAAA,GACRG,EAAM,aADE,CAEX,KAAKN,EAAAM,EAAM,cAAN,MAAAN,EAAmB,IAAM,cAChC,EACF,EAIJ,OAAO,IACT,GAEAH,EAAA,sBAAiB,CAACS,EAAUkE,IAAsD,CAChF,IAAIC,EAAc,SAAM,UAAiCnE,EAAM,QAASkE,CAAO,EAC3EO,EAAWzE,EAAM,KAYrB,GAVAmE,EAAc,SAAM,UAAUA,EAAa,CACzC,MAAO,CACL,MAAO,MAAI,QAAQA,EAAY,MAAM,KAAK,CAC5C,EACA,IAAK,CACH,MAAO,MAAI,QAAQA,EAAY,IAAI,KAAK,CAC1C,CACF,CAAC,EAGG,MAAI,QAAQA,EAAY,MAAM,MAAOA,EAAY,IAAI,KAAK,EAAG,OAGjE,GAAI,SAAUD,EAAS,CACrB,GAAM,CAAE,MAAAxD,EAAO,IAAAE,EAAK,KAAAD,CAAK,EAAIwD,EAEvBS,EAAW,MAAI,KAAKlE,EAAM,MAAOE,EAAI,KAAK,EAC1CiE,EAAW,MAAI,IAAInE,EAAM,MAAOE,EAAI,KAAK,EACzCkE,EAAQ,MAAI,MAAMpE,EAAM,MAAOE,EAAI,KAAK,EACxCmE,EAAI,MAAI,IAAI,MAAI,IAAIrE,EAAM,MAAOE,EAAI,KAAK,CAAC,EAG3CoE,EAAK,MAAI,IAAIH,EAAU,MAAI,IAAI,MAAI,IAAIE,CAAC,EAAGH,CAAQ,CAAC,EACpDK,EAAK,MAAI,IAAIJ,EAAU,MAAI,IAAI,MAAI,IAAIE,CAAC,EAAGH,CAAQ,CAAC,EAEpDF,EAAY,MAAI,0BAA0BM,EAAIC,EAAItE,EAAK,MAAO,EAAI,EASlEuE,EALW,MAAI,KAAKL,EAAUH,CAAS,GAKhBE,EAAW,GAExCH,EAAW,SAAM,MAAMS,EAAU,KAAO,GAAI,EAI5C,IAAMC,EAAc,MAAI,MAAMzE,EAAM,MAAOgE,CAAS,EAKhD,MAAI,QAAQG,EAAUF,GAAaR,EAAaM,CAAQ,CAAC,EAC3DA,EAAW,EACFW,GAAeN,EAAOA,EAAQ,KAAK,GAAIK,CAAW,IAE3DV,GAAY,GAEhB,CAEA,IAAMY,EAAY,CAChB,MAAOrF,EAAM,MACb,KAAMyE,EACN,QAAS3E,EAAAD,EAAA,GACJsE,GADI,CAEP,KAAMrE,EAAAD,EAAA,GACDsE,EAAY,MADX,CAEJ,MAAOQ,GAAaR,EAAaM,CAAQ,CAC3C,EACF,EACF,EAIMa,EAAUtF,EAAM,MAEhBuF,EAAa,KAAK,UAAU1F,EAAA,GAAKwF,EAAyB,EAE1DrD,EAAS,MAAI,IAAI,CAACuD,EAAW,KAAMA,EAAW,IAAI,EAAGD,CAAO,EAElE,OAAK,MAAI,QAAQtD,EAAQ,CAAC,EAAG,CAAC,CAAC,IAC7B,OAAO,OAAOqD,EAAU,OAAO,EAAE,QAASjB,GAAW,CACnDA,EAAO,MAAQ,MAAI,QAAQ,MAAI,IAAIA,EAAO,MAAOpC,CAAM,CAAC,CAC1D,CAAC,EACDqD,EAAU,MAAQ,MAAI,QAAQ,MAAI,IAAIA,EAAU,MAAOrD,CAAM,CAAC,GAGzDqD,CACT,GAEA9F,EAAA,qBAAgB,CAACS,EAAmBwF,IAA2C,CAxhBjF,IAAA/F,EAAAC,EAAAC,EAAAC,EAAA6F,EAyhBI,IAAMC,GAAMjG,EAAA,SAAS,eAAeO,EAAM,GAAK,MAAM,IAAzC,YAAAP,EAA4C,UAAU,IAClE,GAAI,CAACiG,EAAK,OAEV,IADiB9F,GAAAD,GAAAD,EAAAM,EAAM,QAAN,YAAAN,EAAa,SAAb,YAAAC,EAAqB,SAArB,KAAAC,EAA+B,EAAI,EACtC,CACZ,IAAM+F,EAAI3F,EACJ4F,EAAI,SAAS,gBAAgB,6BAA8B,GAAG,EAE9D3E,EAAOC,GAAalB,EAAM,KAAK,EAC/BqB,EAAYC,GAAiBtB,EAAM,MAAQiB,CAAI,EAC/C4E,EAAWC,GAAY9F,EAAM,MAAM,KAAMA,EAAM,MAAM,IAAI,IAAKyF,EAAAzF,EAAM,MAAM,QAAZ,KAAAyF,EAAqB,GACnFM,EAAaC,GAAYhG,EAAM,MAAM,IAAI,EAAE,MAAM,EAAG,EAAE,EAEtDiG,EAAWC,GACfP,EAAE,MACFE,EACAE,UAEA1E,EAAU,GACV,EACF,EAEIG,EAEE,CAAE,MAAAd,EAAO,KAAAC,EAAM,IAAAC,CAAI,EAAIZ,EAAM,QAEnC,GADuB,MAAI,KAAKW,EAAK,MAAO,MAAI,QAAQ,MAAI,IAAID,EAAM,MAAOE,EAAI,KAAK,CAAC,CAAC,EAAI,EAE1FY,EAAO,MAAI,KAAKd,EAAM,MAAOE,EAAI,KAAK,MACjC,CACL,IAAMa,EAASC,GAAOhB,EAAM,MAAOC,EAAK,MAAOC,EAAI,KAAK,EAClDe,EAASF,EAAO,MAAM,EAAG,CAAC,EAC1BG,GAASH,EAAO,GAChBI,EAASC,GAAaH,EAAQC,GAAQlB,EAAM,MAAOE,EAAI,KAAK,EAClEY,EAAO,KAAK,IAAIK,CAAM,CACxB,CAEA,IAAME,EAAQ,KAAK,IACjB,GACA,KAAK,IAAI,EAAG,KAAK,IAAIP,GAAQH,EAAU,GAAK,KAAMG,GAAQH,EAAU,GAAK,IAAI,CAAC,CAChF,EACME,EAAS,KAAK,UAAUvB,CAAK,EAE7BgC,EAAS,MAAI,IAAIhC,EAAM,QAAQ,KAAK,MAAO,CAACuB,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,EAChF8C,EAAI9C,EAAO,MAAQ,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAC3DsC,EAAI/C,EAAO,OAAS,EAAKF,EAAU,GAAK,EAAKU,EAAQC,EAAO,GAElE,OAAAiE,EAAS,aAAa,YAAa,aAAa5B,MAAMC,IAAI,EAC1D2B,EAAS,aAAa,OAAQ7E,GAAcpB,EAAM,MAAOwF,CAAU,EAAE,MAAM,EAC3ES,EAAS,aAAa,mBAAoB,eAAe,EACzDL,EAAE,aAAa,aAAc,QAAQ,EACrCA,EAAE,aAAa,cAAe,QAAQ,EACtCA,EAAE,YAAYF,CAAG,EACjBE,EAAE,YAAYK,CAAQ,EACfL,CACT,CACA,OAAOF,CACT,GACF,EAEMrD,GAAc8D,EAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAC,EMnlBnE,IAAAC,GAAuB,oBACvBC,GAA8C,sBAC9CC,GAKO,2BACPC,GAAoB,qBCRpB,IAAAC,GAAA,6BAOO,SAASC,GACdC,EACAC,EAC8D,CAVhE,IAAAC,EAAAC,EAAAC,EAWE,IAAMC,EAAIJ,EAAM,SAChB,GAAI,CAACI,GAAK,CAACJ,EAAM,UAAY,CAACI,EAAE,OAASA,EAAE,MAAM,OAAS,EACxD,MAAO,CAAE,KAAM,KAAM,SAAU,IAAK,EAGtC,IAAMC,EAAS,QAAQN,IAEjBO,EAAQF,EAAE,MAAM,IAAI,CAACG,EAAGC,OAC5B,QAAC,QAAa,OAAQ,GAAGD,EAAE,YAAa,UAAWA,EAAE,MAAO,YAAaA,EAAE,SAAhEC,CAAyE,CACrF,EAED,GAAIJ,EAAE,OAAS,SAAU,CAGvB,IAAMK,KAFWR,EAAAG,EAAE,QAAF,KAAAH,EAAW,IAEH,IAAM,KAAK,GAAM,IACpCS,EAAM,KAAK,IAAID,CAAG,EAClBE,EAAM,KAAK,IAAIF,CAAG,EAClBG,EAAK,GAAKF,EAAM,GAChBG,EAAK,GAAKF,EAAM,GAChBG,EAAK,GAAKJ,EAAM,GAChBK,EAAK,GAAKJ,EAAM,GAetB,MAAO,CAAE,QAbP,QAAC,QACC,oBAAC,kBACC,GAAIN,EACJ,GAAI,GAAGO,KACP,GAAI,GAAGC,KACP,GAAI,GAAGC,KACP,GAAI,GAAGC,KACP,cAAc,oBAEb,SAAAT,EACH,EACF,EAEa,SAAU,QAAQD,IAAU,CAC7C,CAEA,GAAID,EAAE,OAAS,SAAU,CACvB,IAAMY,IAAMd,EAAAE,EAAE,UAAF,KAAAF,EAAa,IAAM,IACzBe,IAAMd,EAAAC,EAAE,UAAF,KAAAD,EAAa,IAAM,IAQ/B,MAAO,CAAE,QANP,QAAC,QACC,oBAAC,kBAAe,GAAIE,EAAQ,GAAIW,EAAI,GAAIC,EAAI,EAAE,MAAM,cAAc,oBAC/D,SAAAX,EACH,EACF,EAEa,SAAU,QAAQD,IAAU,CAC7C,CAiBA,MAAO,CAAE,QAbP,QAAC,QACC,oBAAC,kBACC,GAAIA,EACJ,GAAG,KACH,GAAG,KACH,GAAG,OACH,GAAG,OACH,cAAc,oBAEb,SAAAC,EACH,EACF,EAEa,SAAU,QAAQD,IAAU,CAC7C,CC9EA,IAAAa,GAKO,4BACPC,GAAsB,sBACtBC,GAAgB,wBAIhB,IAAMC,GAA0C,CAC9C,OAASC,GAAM,KAAK,IAAKA,EAAI,KAAK,GAAM,CAAC,EACzC,iBAAkB,EACpB,EAEMC,GAAsC,CAC1C,OAASD,GAAMA,EAAIA,EACnB,iBAAkB,EACpB,EAEO,SAASE,GAAmBC,EAAkB,CACnD,IAAMC,EAASC,GAAcF,EAAM,KAAK,EAWxC,OAT+BG,EAAAC,EAAA,CAC7B,KAAM,EAAIH,EAAO,YAAc,IAC/B,SAAU,GACV,WAAY,IACZ,UAAW,IACPD,EAAM,OAAO,GAAG,KAAO,GAAMJ,GAA2BE,IAL/B,CAM7B,KAAME,EAAM,UACd,EAGF,CAEO,SAASK,GAAYL,EAAkB,CAC5C,OAAIA,EAAM,OAAO,OAAS,EAAU,GAE7B,SAAM,wBACX,oBAAgBA,EAAM,OAAQD,GAAmBC,CAAK,CAAC,EAAE,IAAKM,GAAOA,EAAG,KAAK,CAC/E,CACF,CAEO,SAASC,GAAoBP,EAAkBQ,EAAwB,CAC5E,SAAO,oBAAgBR,EAAM,OAAQQ,CAAO,CAC9C,CAKO,SAASC,GAA4BT,EAAkB,CAC5D,GAAIA,EAAM,OAAO,OAAS,EAAG,MAAO,GACpC,IAAMQ,EAAUT,GAAmBC,CAAK,EAClCU,EAAeH,GAAoBP,EAAOQ,CAAO,EAEvD,OADa,SAAM,wBAAqB,2BAAuBE,EAAcF,CAAO,CAAC,CAEvF,CAKO,SAASG,GAA6BX,EAAkB,CAC7D,GAAM,CAAE,OAAAY,CAAO,EAAIZ,EACnB,GAAIY,EAAO,OAAS,EAAG,MAAO,cAC9B,IAAMJ,EAAUT,GAAmBC,CAAK,EAClCU,EAAeH,GAAoBP,EAAOQ,CAAO,EACjDK,EAAOD,EAAOA,EAAO,OAAS,GACpC,OAAK,GAAAE,QAAI,QAAQJ,EAAa,GAAG,MAAOG,CAAI,GAAGH,EAAa,KAAK,CAAE,MAAOG,CAAK,CAAgB,EAClF,SAAM,2BAA2BH,CAAY,CAE5D,CAMO,SAASK,GAAsBf,EAAkB,CACtD,GAAM,CAAE,OAAAY,CAAO,EAAIZ,EACnB,GAAIY,EAAO,OAAS,EAAG,MAAO,cAG9B,IAAMI,EAAaC,GAAeL,EAAQ,CAAC,EAE3C,GAAII,EAAW,OAAS,EACtB,MAAO,KAAKJ,EAAO,GAAG,MAAMA,EAAO,GAAG,QAAQA,EAAOA,EAAO,OAAS,GAAG,MACtEA,EAAOA,EAAO,OAAS,GAAG,KAI9B,IAAIM,EAAO,KAAKF,EAAW,GAAG,GAAG,QAAQ,CAAC,KAAKA,EAAW,GAAG,GAAG,QAAQ,CAAC,IACzE,QAASG,EAAI,EAAGA,EAAIH,EAAW,OAAQG,IACrCD,GAAQ,MAAMF,EAAWG,GAAG,GAAG,QAAQ,CAAC,KAAKH,EAAWG,GAAG,GAAG,QAAQ,CAAC,IAGzE,OAAOD,CACT,CAKO,SAASE,GAAoBpB,EAAkB,CACpD,GAAM,CAAE,OAAAY,CAAO,EAAIZ,EACnB,GAAIY,EAAO,OAAS,EAAG,MAAO,GAE9B,IAAMI,EAAaC,GAAeL,EAAQ,CAAC,EAC3C,GAAII,EAAW,OAAS,EAAG,MAAO,GAElC,IAAIE,EAAO,KAAKF,EAAW,GAAG,GAAG,QAAQ,CAAC,KAAKA,EAAW,GAAG,GAAG,QAAQ,CAAC,IACzE,QAASG,EAAI,EAAGA,EAAIH,EAAW,OAAQG,IACrCD,GAAQ,MAAMF,EAAWG,GAAG,GAAG,QAAQ,CAAC,KAAKH,EAAWG,GAAG,GAAG,QAAQ,CAAC,IAEzE,OAAAD,GAAQ,KAEDA,CACT,CAKO,SAASD,GAAeL,EAAoBS,EAA+B,CAChF,GAAIT,EAAO,QAAU,EAAG,OAAOA,EAE/B,IAAIU,EAAU,EACVC,EAAW,EAETC,EAAQZ,EAAO,GACfC,EAAOD,EAAOA,EAAO,OAAS,GAEpC,QAASO,EAAI,EAAGA,EAAIP,EAAO,OAAS,EAAGO,IAAK,CAC1C,IAAMM,EAAOC,GAAsBd,EAAOO,GAAIK,EAAOX,CAAI,EACrDY,EAAOH,IACTA,EAAUG,EACVF,EAAWJ,EAEf,CAEA,GAAIG,EAAUD,EAAW,CACvB,IAAMM,EAAOV,GAAeL,EAAO,MAAM,EAAGW,EAAW,CAAC,EAAGF,CAAS,EAC9DO,EAAQX,GAAeL,EAAO,MAAMW,CAAQ,EAAGF,CAAS,EAC9D,MAAO,CAAC,GAAGM,EAAK,MAAM,EAAG,EAAE,EAAG,GAAGC,CAAK,CACxC,CAEA,MAAO,CAACJ,EAAOX,CAAI,CACrB,CAEA,SAASa,GAAsBG,EAAiBC,EAAqBC,EAA2B,CAC9F,IAAMC,EAAKD,EAAQ,GAAKD,EAAU,GAC5BG,EAAKF,EAAQ,GAAKD,EAAU,GAC5BI,EAAM,KAAK,KAAKF,EAAKA,EAAKC,EAAKA,CAAE,EACvC,GAAIC,IAAQ,EAAG,OAAO,GAAApB,QAAI,KAAKe,EAAOC,CAAS,EAC/C,IAAMK,IAAMN,EAAM,GAAKC,EAAU,IAAME,GAAMH,EAAM,GAAKC,EAAU,IAAMG,IAAOC,EAAMA,GAC/EE,EAAU,CAACN,EAAU,GAAKK,EAAIH,EAAIF,EAAU,GAAKK,EAAIF,CAAE,EAC7D,OAAO,GAAAnB,QAAI,KAAKe,EAAOO,CAAO,CAChC,CF1JA,IAAAC,GAAA,6BA0BaC,GAAN,cAAuBC,EAAkB,CAAzC,kCACLC,EAAA,oBAEAA,EAAA,yBAAoB,IAAI,QAA+B,CAAC,CAAC,GAEzDA,EAAA,wBAAmB,IAAI,KAEvBA,EAAA,oBAAe,IAAI,QAAuB,CAAC,CAAC,GAE5CA,EAAA,kBAAuC,CAAC,GAExCA,EAAA,gBAAW,IAEXA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,YACA,KAAM,OACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,EACV,MAAOC,GACP,OAAQ,CAAC,EACT,WAAY,EACd,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAI,EAAO,KAAAC,EAAM,WAAAC,EAAY,QAAAC,EAAS,OAAAC,CAAO,EAAGC,IAAQ,CA1D3D,IAAAC,GA2DM,GAAM,CAAE,OAAAC,EAAQ,MAAAC,EAAO,WAAAC,CAAW,EAAIT,EAChCU,EAAaT,EAAK,aAAe,WACjCU,EAAgBV,EAAK,gBAAkBD,EAAM,GAG7CY,EAAMC,EAAY,EAClBC,EAAgB,UAAmC,IAAI,EACvD,CAACC,EAAaC,CAAc,EAAU,YAAwB,IAAI,EAElEC,EAAsB,eAC1B,CAACC,GAAiBC,IACT,OAAI,IAAIP,EAAI,aAAa,CAACM,GAASC,CAAO,CAAC,EAAGnB,EAAM,KAAK,EAElE,CAACY,EAAKZ,EAAM,KAAK,CACnB,EAEMoB,EAAuB,eAC1BC,IAAuB,CACtB,GAAIA,GAAO,SAAW,EAAG,OACzB,IAAMC,EAAO,KAAK,IAAI,GAAGD,GAAO,IAAKE,GAAMA,EAAE,EAAE,CAAC,EAC1CC,GAAO,KAAK,IAAI,GAAGH,GAAO,IAAKE,GAAMA,EAAE,EAAE,CAAC,EAC1CE,GAAaJ,GAAO,IAAI,CAAC,CAACK,EAAGC,EAAGC,EAAE,IAAM,CAC5C,EAAGF,EAAIJ,GAAiB,QAAQ,CAAC,EACjC,EAAGK,EAAIH,IAAiB,QAAQ,CAAC,EACjCI,IAAA,KAAAA,GAAM,EACR,CAAC,EACKC,EAAgB,OAAI,IAAI7B,EAAM,MAAO,CAACsB,EAAME,EAAI,CAAC,EACvDZ,EAAI,aAAa,CAAE,GAAIZ,EAAM,GAAI,MAAO6B,EAAe,OAAQJ,EAAW,CAAC,CAC7E,EACA,CAACb,EAAKZ,EAAM,GAAIA,EAAM,KAAK,CAC7B,EAEM8B,EAA8B,WAAQ,IACtCpB,EAAmBqB,GAAoB/B,CAAK,EACzCgC,GAAYhC,CAAK,EACvB,CAACO,EAAQC,EAAM,KAAME,EAAaF,EAAc,mBAAmB,CAAC,EAEjEyB,EAAuB,WAAQ,IAC/BvB,EACKwB,GAAsBlC,CAAK,EAE7BQ,EAAM,cACT2B,GAA4BnC,CAAK,EACjCoC,GAA6BpC,CAAK,EACrC,CACDO,EACAC,EAAM,KACNA,EAAM,KACNC,EACAC,EACCF,EAAc,mBACjB,CAAC,EAEK6B,EAASC,GAAc9B,EAAOP,EAAK,UAAU,EAC7C,CAAE,OAAAsC,EAAQ,KAAAC,EAAM,YAAAC,EAAa,QAASC,CAAa,EAAIL,EACvD,CAAE,KAAAM,EAAM,SAAAC,CAAS,EAAIC,GAAgB7C,EAAM,GAAIQ,CAAK,EACpDsC,EAAaF,GAAA,KAAAA,EAAYJ,EAGzBO,GAAOzC,GAAAM,EAAI,OAAJ,KAAAN,GAAY,EACnB0C,GAAoB,WAAQ,IAAM,CACtC,GAAI,CAACrC,GAAiBJ,EAAO,OAAS,EAAG,OAAO,KAEhD,IAAM0C,GAAI,EAAIF,EACRG,EAAO,IAAMH,EAEbI,GAAc5C,EAAO,IAAI,CAAC6C,EAAcC,OAC5C,QAAC,UAEC,GAAID,EAAG,GACP,GAAIA,EAAG,GACP,EAAGrC,IAAgBsC,EAAIJ,GAAI,IAAMA,GACjC,KAAMlC,IAAgBsC,EAAI,UAAY,QACtC,OAAO,UACP,YAAa,IAAMN,EACnB,MAAO,CAAE,OAAQ,OAAQ,cAAe,KAAM,EAC9C,eAAgB,IAAM/B,EAAeqC,CAAC,EACtC,eAAgB,IAAMrC,EAAe,IAAI,EACzC,cAAgBsC,GAAM,CACpBA,EAAE,gBAAgB,EAChBA,EAAE,cAAmC,kBAAkBA,EAAE,SAAS,EACpExC,EAAQ,QAAU,CAAE,QAASuC,CAAE,CACjC,EACA,cAAgBC,GAAM,CA9IlC,IAAAhD,GA+Ic,GAAI,CAACQ,EAAQ,SAAWA,EAAQ,QAAQ,UAAYuC,EAAG,OACvDC,EAAE,gBAAgB,EAClB,IAAMC,GAAQtC,EAAcqC,EAAE,QAASA,EAAE,OAAO,EAC1CE,EAAK,CAAC,GAAGjD,CAAM,EACrBiD,EAAGH,GAAK,CAACE,GAAM,GAAIA,GAAM,IAAIjD,GAAAC,EAAO8C,GAAG,KAAV,KAAA/C,GAAgB,EAAG,EAChDM,EAAI,WAAW,CACb,SAAU,CACR,MAAO,CACL,CAACA,EAAI,eAAgB,CACnB,OAAQ,CAAE,CAACZ,EAAM,IAAK,CAAE,OAAQwD,CAAG,CAAE,CACvC,CACF,CACF,CACF,CAAC,CACH,EACA,YAAcF,GAAM,CA9JhC,IAAAhD,GA+Jc,GAAI,CAACQ,EAAQ,QAAS,OACtBwC,EAAE,gBAAgB,EAClB,IAAMC,GAAQtC,EAAcqC,EAAE,QAASA,EAAE,OAAO,EAC1CE,EAAK,CAAC,GAAGjD,CAAM,EACrBiD,EAAGH,GAAK,CAACE,GAAM,GAAIA,GAAM,IAAIjD,GAAAC,EAAO8C,GAAG,KAAV,KAAA/C,GAAgB,EAAG,EAChDQ,EAAQ,QAAU,KAClBM,EAAeoC,CAAE,CACnB,GAvCK,KAAKH,GAwCZ,CACD,EAEKI,GAAalD,EAAO,MAAM,EAAG,EAAE,EAAE,IAAI,CAAC6C,EAAcC,IAAc,CACtE,IAAMK,EAAOnD,EAAO8C,EAAI,GAClBM,IAAMP,EAAG,GAAKM,EAAK,IAAM,EACzBE,GAAMR,EAAG,GAAKM,EAAK,IAAM,EAC/B,SACE,QAAC,UAEC,GAAIC,GACJ,GAAIC,EACJ,EAAGV,EACH,KAAK,QACL,OAAO,UACP,YAAa,EAAIH,EACjB,gBAAiB,GAAG,EAAIA,KAAQ,EAAIA,IACpC,MAAO,CAAE,OAAQ,YAAa,cAAe,KAAM,EACnD,cAAgBO,IAAM,CACpBA,GAAE,gBAAgB,EAClB,IAAMO,GAAkB,CAACF,GAAIC,EAAI,EAAG,EAC9BJ,GAAK,CAAC,GAAGjD,EAAO,MAAM,EAAG8C,EAAI,CAAC,EAAGQ,GAAO,GAAGtD,EAAO,MAAM8C,EAAI,CAAC,CAAC,EACpEzC,EAAI,aAAa,CAAE,GAAIZ,EAAM,GAAI,OAAQwD,EAAG,CAAC,CAC/C,GAdK,KAAKH,GAeZ,CAEJ,CAAC,EAED,SACE,SAAC,KAAE,MAAO,CAAE,cAAe,MAAO,EAE/B,UAAA9C,EAAO,MAAM,EAAG,EAAE,EAAE,IAAI,CAAC6C,EAAcC,OACtC,QAAC,QAEC,GAAID,EAAG,GACP,GAAIA,EAAG,GACP,GAAI7C,EAAO8C,EAAI,GAAG,GAClB,GAAI9C,EAAO8C,EAAI,GAAG,GAClB,OAAO,UACP,YAAa,EAAIN,EACjB,cAAe,GACf,cAAc,QART,KAAKM,GASZ,CACD,EACAI,GACAN,IACH,CAEJ,EAAG,CAACxC,EAAeJ,EAAQwC,EAAMhC,EAAaf,EAAM,GAAIY,EAAI,aAAa,CAAC,EAGpEkD,EAAS,KAAK,UAAU9D,CAAK,EAGnC,GAFkB8D,EAAO,OAASrB,EAAc,GAAKqB,EAAO,QAAUrB,EAAc,EAErE,CACb,IAAMsB,GAAK,EAAItB,EACf,SACE,SAAC,gBAAAuB,EAAAC,EAAA,CAAa,IAAK5D,EAAK,GAAIL,EAAM,GAAK,QAAYI,GAAlD,CACE,UAAAuC,KACD,QAAC,UACC,EAAGoB,GACH,KAAMxB,EACN,OAAQA,EACR,cAAc,MACd,QAASpC,EAAU,GAAkBuC,EACvC,IACF,CAEJ,CAEA,IAAMwB,GACJ1D,EAAM,UACND,EAAO,OAAS,GAChB,OAAI,KAAKA,EAAO,GAAIA,EAAOA,EAAO,OAAS,EAAE,EAAIkC,EAAc,EAE3D0B,GAAmBxD,EAAgB,CAAE,SAAU,SAAmB,EAAI,OAE5E,GAAI,CAACD,GAAcV,EAAM,MAAM,cAC7B,SACE,SAAC,gBAAAgE,EAAAC,EAAA,CAAa,IAAK5D,EAAK,GAAIL,EAAM,GAAK,QAAYI,GAAlD,CAA0D,MAAO+D,GAC/D,UAAAxB,KACD,SAAC,KAAE,QAASxC,EAAU,GAAkBuC,EACtC,qBAAC,QACC,UAAWwB,IAAchE,EAAa,kBAAoB,oBAC1D,EAAG+B,EACL,EACCiC,OACC,QAAC,QACC,EAAGpC,EACH,OAAO,OACP,KAAMgB,EACN,eAAe,QACf,cAAc,QACd,cAAc,OAChB,KAEF,QAAC,QACC,EAAGb,EACH,KAAMM,EACN,OAAQA,EACR,YAAaE,EAAc,EAC3B,eAAe,QACf,cAAc,QACd,cAAc,OAChB,GACF,EACCO,KACH,EAIJ,IAAMoB,GAAkB1D,EACpB,OACA,CACE,SAAkB,OAClB,UAAmB,OACnB,WAAoB,OAAO+B,EAAc,IACzC,WAAoB,GAAGA,EAAc,KAAKA,EAAc,GAC1D,EAAEjC,EAAM,MAEN6D,GAAmB3D,EACrB,OACA,CACE,SAAkB,OAClB,UAAmB,OACnB,WAAoB,IACpB,WAAoB,GACtB,EAAEF,EAAM,MAENuD,GAAK,EAAItB,EAAc,IAE7B,SACE,SAAC,gBAAAuB,EAAAC,EAAA,CAAa,IAAK5D,EAAK,GAAIL,EAAM,GAAK,QAAYI,GAAlD,CAA0D,MAAO+D,GAC/D,UAAAxB,KACD,SAAC,KAAE,QAASxC,EAAU,GAAkBuC,EACtC,qBAAC,QACC,UAAWwB,IAAchE,EAAa,kBAAoB,oBAC1D,EAAG+B,EACL,KACA,QAAC,QACC,EAAGA,EACH,KAAMiC,GAAapB,EAAa,OAChC,OAAO,OACP,YAAa,KAAK,IAAI,EAAGL,EAAc,CAAC,EACxC,eAAgB/B,EAAa,QAAU,QACvC,cAAeA,EAAa,SAAW,QACvC,cAAc,OAChB,KACA,QAAC,QACC,EAAGuB,EACH,KAAK,OACL,OAAQM,EACR,YAAawB,GACb,gBAAiBK,GACjB,iBAAkBC,GAClB,eAAgB3D,EAAa,QAAU,QACvC,cAAeA,EAAa,SAAW,QACvC,cAAc,OAChB,GACF,EACCsC,KACH,CAEJ,CACF,GAEAnD,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CAAE,OAAAO,CAAO,EAAIP,EAEbiC,EAAuB,WAAQ,IAC5BG,GAA6BpC,CAAK,EACxC,CAACO,EAAQP,EAAM,MAAM,KAAMA,EAAM,MAAM,mBAAmB,CAAC,EAExD8D,EAAS,KAAK,UAAU9D,CAAK,EAInC,OAFkB8D,EAAO,MAAQ,GAAKA,EAAO,OAAS,KAG7C,QAAC,UAAO,EAAGA,EAAO,MAAQ,EAAG,EAAGA,EAAO,OAAS,EAAG,EAAG,EAAG,KAG3D,QAAC,QAAK,EAAG7B,EAAgB,CAClC,CAAC,GAEDpC,EAAA,iBAAY,CACVG,EACA8D,EACA,CAAE,aAAAQ,EAAc,OAAAC,EAAQ,OAAAC,CAAO,IAChB,CACf,IAAMC,EAAqB,SAAM,aAAa,KAAK,YAAaH,EAAc,IAC5E,SAAM,oBAAoBA,EAAa,MAAM,CAC/C,EAEM/D,EAAS+D,EAAa,OAAO,IAAI,CAAC,CAAC5C,EAAGC,EAAGsB,CAAC,IACvC,CACLa,EAAO,OACJS,EAAS,EACN,EAAI7C,EAAI+C,EAAmB,MAC3B/C,EAAI+C,EAAmB,OAC7BX,EAAO,QACJU,EAAS,EACN,EAAI7C,EAAI8C,EAAmB,OAC3B9C,EAAI8C,EAAmB,QAC7BxB,CACF,CACD,EAEKyB,EAAY,SAAM,oBAAoB1E,EAAM,MAAM,EAElD2E,EAAQ,OAAI,IAAI,CAACb,EAAO,KAAMA,EAAO,IAAI,EAAG,CAACY,EAAU,KAAMA,EAAU,IAAI,CAAC,EAElF,MAAO,CACL,OAAAnE,EACA,MAAAoE,CACF,CACF,GAEA9E,EAAA,iBAAaG,GAAa,CAMxB,IAAM4E,EAAoB,CAAC,KAAK,kBAAkB,IAAI5E,EAAM,MAAM,EAC5D6E,EAAoB,KAAK,WAAW7E,EAAM,MAAQA,EAAM,MAE9D,GAAI4E,EAAmB,CAErB,IAAMd,EAAS,SAAM,oBAAoB9D,EAAM,MAAM,EACrD,KAAK,kBAAkB,IAAIA,EAAM,OAAQ8D,CAAM,EAC/C,KAAK,iBAAiB,IAAI9D,EAAM,GAAI,SAAM,gBAAgB8D,EAAQ9D,EAAM,KAAK,CAAC,EAC9E,KAAK,WAAWA,EAAM,IAAMA,EAAM,KACpC,MAAW6E,GAAmB,CAACD,IAE7B,KAAK,WAAW5E,EAAM,IAAMA,EAAM,MAClC,KAAK,iBAAiB,IACpBA,EAAM,GACN,SAAM,gBAAgB,KAAK,kBAAkB,IAAIA,EAAM,MAAM,EAAIA,EAAM,KAAK,CAC9E,GAGF,OAAO,KAAK,iBAAiB,IAAIA,EAAM,EAAE,CAC3C,GAEAH,EAAA,oBAAe,CAACiF,EAASpB,IAErBA,EAAK,SAAWoB,EAAK,QACrBpB,EAAK,QAAUoB,EAAK,OACpBpB,EAAK,aAAeoB,EAAK,YAI7BjF,EAAA,oBAAe,CAACG,EAAU2E,IAAoB,CAC5C,IAAMI,EAAM,OAAI,IAAIJ,EAAO3E,EAAM,KAAK,EACtC,OAAO,SAAM,gBAAgB+E,EAAK/E,EAAM,MAAM,CAChD,GAEAH,EAAA,0BAAqB,CAACG,EAAUgF,EAAaC,IAAyB,CACpE,GAAM,CAAE,OAAA1E,EAAQ,MAAAoE,CAAM,EAAI3E,EACpB+E,EAAM,OAAI,IAAIC,EAAGL,CAAK,EACtBO,EAAM,OAAI,IAAID,EAAGN,CAAK,EACtBb,EAAS,KAAK,UAAU9D,CAAK,EAEnC,GAAI8D,EAAO,MAAQ,GAAKA,EAAO,OAAS,EACtC,OAAO,OAAI,sBAAsBkB,EAAGC,EAAG,SAAM,gBAAgBnB,CAAM,CAAC,EAAI,EAG1E,MAAI,+BAA2BiB,EAAKG,EAAKpB,CAAM,GAC7C,QAAST,EAAI,EAAGA,EAAI9C,EAAO,OAAQ8C,IACjC,MAAI,oCAAgC9C,EAAO8C,EAAI,GAAI9C,EAAO8C,GAAI0B,EAAKG,CAAG,EAAE,aACtE,MAAO,GAKb,MAAO,EACT,GAEArF,EAAA,qBAAgB,CAACG,EAAU8D,IAAqB,CAE9C,GAAI,CAAC9D,EAAM,SAAU,CACnB,IAAMmF,EAAc,KAAK,UAAUnF,CAAK,EAExC,OACE,SAAM,cAAc8D,EAAQqB,CAAW,IACrC,SAAM,cAAcA,EAAarB,CAAM,MACvC,0BAAsBqB,EAAarB,CAAM,EAAE,OAAS,OACpD,4BAAwB,SAAM,gBAAgBA,EAAQ,OAAI,IAAI9D,EAAM,KAAK,CAAC,EAAGA,EAAM,MAAM,EACtF,OAAS,CAElB,CAGA,IAAMoF,EAAU,KAAK,iBAAiBpF,CAAK,EAErCqF,EAAgB,SAAM,aAAa,KAAK,aAAcrF,EAAO,IAAM,CACvE,IAAMsF,EAAI,SAAM,gBAAgB,SAAM,oBAAoBtF,EAAM,MAAM,CAAC,EACvE,OAAOA,EAAM,OAAO,IAAKoD,GAAO,OAAI,QAAQA,EAAIkC,EAAGtF,EAAM,UAAY,CAAC,CAAC,CACzE,CAAC,EAED,OACE,SAAM,cAAc8D,EAAQsB,CAAO,MACnC,4BAAwB,SAAM,gBAAgBtB,EAAQ,OAAI,IAAI9D,EAAM,KAAK,CAAC,EAAGqF,CAAa,EACvF,OAAS,CAEhB,GACF,EGzdA,IAAAE,GAAuB,oBACvBC,GAA8C,sBAC9CC,GAIO,2BACPC,GAAoB,qBCPpB,IAAAC,GAAuB,oBACvBC,GAAsB,sBADtB,IAAAC,GAAA,6BAaaC,GAAsB,QAAK,SAAuB,CAC7D,GAAAC,EACA,OAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAoB,CAClB,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcN,EAAOE,CAAU,EAC/D,CAAE,KAAAK,EAAM,SAAAC,CAAS,EAAIC,GAAgBX,EAAIE,CAAK,EAC9CU,EAAaF,GAAA,KAAAA,EAAYH,EACzBM,EAAK,EAAIP,EAAc,MACvBQ,EAAK,KAAK,IAAI,EAAGb,EAAO,GAAKY,EAAK,CAAC,EACnCE,EAAK,KAAK,IAAI,EAAGd,EAAO,GAAKY,EAAK,CAAC,EACnCG,EAAY,SAAM,mBAAmBF,EAAIC,CAAE,EAC3C,CAAE,gBAAAE,EAAiB,iBAAAC,CAAiB,EAAI,SAAM,oBAClDF,EAAY,GAAKA,EAAY,EAAIA,EACjCV,EAAc,MACdJ,EAAM,KACN,CACF,EAEA,SACE,sBACG,UAAAO,KACD,QAAC,WACC,UAAWP,EAAM,UAAYC,EAAa,kBAAoB,oBAC9D,GAAIF,EAAO,GACX,GAAIA,EAAO,GACX,GAAIA,EAAO,GACX,GAAIA,EAAO,GACb,KACA,QAAC,WACC,GAAIA,EAAO,GACX,GAAIA,EAAO,GACX,GAAIa,EACJ,GAAIC,EACJ,KAAMH,EACN,OAAQP,EACR,YAAaQ,EACb,gBAAiBI,EACjB,iBAAkBC,EAClB,cAAc,OACd,cAAc,QACd,eAAe,QACjB,GACF,CAEJ,CAAC,EC5DD,IAAAC,GAAuB,oBCAvB,IAAAC,GAAwD,4BACxDC,GAAsB,sBAKf,SAASC,GAAuBC,EAAYC,EAAkBC,EAAoB,CACvF,GAAM,CAAE,YAAAC,CAAY,EAAIC,GAAcF,CAAK,EACrCG,EAAY,SAAM,IAAIL,CAAE,EACxBM,EAAKL,EAAO,GAAKI,EAAU,EAAIF,EAAc,EAC7CI,EAAKN,EAAO,GAAKI,EAAU,EAAIF,EAAc,EAC7CK,EAAY,SAAM,mBAAmBF,EAAIC,CAAE,EAC3CE,EAAqB,CAAC,EACtBC,EAAQ,KAAK,GAAK,KAAK,GAAKL,EAAU,EACtCM,EAAQ,KAAK,IAAIN,EAAU,CAAC,EAC5BO,EAAQ,KAAK,IAAI,GAAIJ,EAAY,EAAE,EACzC,QAASK,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,IAAMC,EAAIC,GAAQ,cAAcF,GAAKD,EAAQ,EAAE,EACzCI,EAAON,EAAQ,EAAI,KAAK,IAAM,EAAIC,GAASG,EAC3CG,EAAI,KAAK,IAAID,CAAI,EACjBE,EAAI,KAAK,IAAIF,CAAI,EACvBP,EAAO,KAAK,CAACH,EAAKW,EAAIhB,EAAO,GAAIM,EAAKW,EAAIjB,EAAO,GAAIa,EAAI,GAAMT,EAAU,EAAI,CAAC,CAAC,CACjF,CACA,SAAO,oBAAgBI,EAAQ,CAC7B,KAAM,EAAIN,EAAc,EACxB,SAAU,KACV,IAAK,CAAE,MAAOK,EAAY,CAAE,EAC5B,MAAO,CAAE,MAAOA,EAAY,EAAG,EAC/B,WAAY,EACZ,iBAAkB,EACpB,CAAC,CACH,CAEO,SAASW,GAAenB,EAAYC,EAAkBC,EAAoB,CAC/E,GAAM,CAAE,YAAAC,CAAY,EAAIC,GAAcF,CAAK,EACrCG,EAAY,SAAM,IAAIL,CAAE,EACxBM,EAAKL,EAAO,GAAKI,EAAU,EAAIF,EAAc,EAC7CI,EAAKN,EAAO,GAAKI,EAAU,EAAIF,EAAc,EAC7CK,EAAY,SAAM,mBAAmBF,EAAIC,CAAE,EACjD,OAAO,SAAM,wBACX,2BAAuBR,GAAuBC,EAAIC,EAAQC,CAAK,EAAG,CAChE,KAAM,EAAIC,EAAc,EACxB,SAAU,KACV,IAAK,CAAE,MAAOK,EAAY,CAAE,EAC5B,MAAO,CAAE,MAAOA,EAAY,EAAG,EAC/B,WAAY,EACZ,iBAAkB,EACpB,CAAC,CACH,CACF,CAEO,SAASY,GAAwBpB,EAAYC,EAAkBC,EAAoB,CACxF,OAAO,SAAM,2BAA2BH,GAAuBC,EAAIC,EAAQC,CAAK,CAAC,CACnF,CDrDA,IAAAmB,GAAA,6BAaaC,GAAoB,QAAK,SAAqB,CACzD,GAAAC,EACA,OAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAoB,CAClB,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcN,EAAOE,CAAU,EAC/D,CAAE,KAAAK,EAAM,SAAAC,CAAS,EAAIC,GAAgBX,EAAIE,CAAK,EAC9CU,EAAaF,GAAA,KAAAA,EAAYH,EACzBM,EAAYC,GAAed,EAAIC,EAAQC,CAAK,EAElD,SACE,sBACG,UAAAO,KACD,QAAC,WACC,UAAWP,EAAM,UAAYC,EAAa,kBAAoB,oBAC9D,GAAIF,EAAO,GACX,GAAIA,EAAO,GACX,GAAIA,EAAO,GACX,GAAIA,EAAO,GACb,EACCC,EAAM,aACL,QAAC,QACC,EAAGa,GAAwBf,EAAIC,EAAQC,CAAK,EAC5C,OAAO,OACP,KAAMU,EACN,cAAc,OAChB,KAEF,QAAC,QACC,EAAGC,EACH,KAAMR,EACN,OAAQA,EACR,YAAaC,EACb,cAAc,OACd,cAAc,QACd,eAAe,QACjB,GACF,CAEJ,CAAC,EFtDD,IAAAU,GAAA,6BAsBaC,GAAN,cAA0BC,EAAkB,CAA5C,kCACLC,EAAA,uBAEAA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,eAAU,IAEVA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,eACA,KAAM,UACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,OAAQ,CAAC,EAAG,CAAC,EACb,SAAU,EACV,MAAOC,GACP,MAAO,GACP,WAAY,CAAC,GAAK,EAAG,CACvB,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CACE,CACE,MAAAI,EACA,QAAAC,EACA,WAAAC,EACA,UAAAC,EACA,UAAAC,EACA,KAAAC,EACA,OAAAC,EACA,OAAAC,EACA,cAAAC,EACA,YAAAC,CACF,EACAC,IACG,CAjET,IAAAC,EAkEM,GAAM,CAAE,GAAAC,EAAI,OAAAC,EAAQ,MAAAC,EAAO,MAAAC,EAAQ,GAAI,WAAAC,EAAaC,EAAY,EAAIjB,EAC9DkB,EAAOC,GAAanB,EAAM,KAAK,EAC/BoB,EAASC,GAAcP,EAAOT,EAAK,UAAU,EAC7CiB,EAAcF,EAAO,YACrBG,EAAK,EAAID,EAAc,MACvBE,EAAK,KAAK,IAAI,EAAGX,EAAO,GAAKU,EAAK,CAAC,EACnCE,EAAK,KAAK,IAAI,EAAGZ,EAAO,GAAKU,EAAK,CAAC,EAEnCG,EAAY,EADCrB,EAAK,aAAe,aACNS,EAAM,cAA0Ba,GAAcC,GACzEC,EAA0B,eAC7Bd,GAAkBP,GAAA,YAAAA,EAAgB,CAAE,GAAAI,EAAI,MAAAG,CAAM,GAC/C,CAACP,CAAa,CAChB,EAEA,SACE,SAACsB,GAAAC,EAAAC,EAAA,CAAY,IAAKtB,GAASH,GAA1B,CACC,qBAAC0B,GAAA,CACC,UAAW7B,EACX,SAAUyB,EACV,OAAQpB,EACR,KAAMS,EACN,KAAMH,EACN,OAAOJ,EAAAG,EAAM,aAAN,KAAAH,EAAoBS,EAAO,OAClC,WAAYN,EAAM,gBAClB,aAAcA,EAAM,aACpB,SAAUE,EAAW,GAAK,IAAOV,EAAO,MACxC,SAAUU,EAAW,GAAK,IAAOV,EAAO,OACxC,MAAO,KAAK,IAAI,EAAGA,EAAO,MAAQ,KAAQ,EAAE,EAC9C,KACA,SAAC,iBAAa,GAAIN,EAAM,GAAK,OAAQ,QAASC,EAAU,GAAkBmB,EAAO,QAC9E,UAAAjB,MACC,QAAC,WACC,UAAU,uBACV,GAAIG,EAAO,MAAQ,EACnB,GAAIA,EAAO,OAAS,EACpB,GAAI,KAAK,IAAI,EAAGA,EAAO,MAAQ,CAAC,EAChC,GAAI,KAAK,IAAI,EAAGA,EAAO,OAAS,CAAC,EACjC,YAAac,EAAO,YACtB,KAEF,QAACM,EAAA,CACC,GAAId,EACJ,MAAOE,EACP,OAAQD,EACR,WAAYX,EACZ,WAAYG,EAAK,WACnB,GACF,IACF,CAEJ,CACF,GAEAR,EAAA,iBAAYD,GAAY,UAAgB,CAAC,CAAE,MAAAI,EAAO,KAAAK,CAAK,IAAM,CAC3D,GAAM,CAAE,GAAAO,EAAI,OAAAC,EAAQ,MAAAC,CAAM,EAAId,EAExBsB,EADSD,GAAcP,CAAK,EACP,YACrBS,EAAK,EAAID,EAAc,MACvBE,EAAK,KAAK,IAAI,EAAGX,EAAO,GAAKU,EAAK,CAAC,EACnCE,EAAK,KAAK,IAAI,EAAGZ,EAAO,GAAKU,EAAK,CAAC,EAEzC,MAAO,GADalB,GAAA,YAAAA,EAAiB,cAAe,aAC9BS,EAAM,iBAC1B,QAAC,QAAK,EAAGoB,GAAwBtB,EAAIC,EAAQC,CAAK,EAAG,KAErD,QAAC,WAAQ,GAAID,EAAO,GAAI,GAAIA,EAAO,GAAI,GAAIW,EAAI,GAAIC,EAAI,CAE3D,CAAC,GAED5B,EAAA,oBAAe,CAACG,EAAUmC,IAEtB,SAAM,cAAcA,EAAO,KAAK,iBAAiBnC,CAAK,CAAC,GACvD,SAAM,eACJmC,EACA,KAAK,UAAUnC,CAAK,EACpBA,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,CACpB,GAIJH,EAAA,0BAAqB,CAACG,EAAUoC,EAAaC,OACpC,gCACLD,EACAC,EACA,KAAK,UAAUrC,CAAK,EACpBA,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,CACpB,EAAE,cAGJH,EAAA,iBAAaG,GACJ,SAAM,aAAa,KAAK,YAAaA,EAAO,IAC1C,SAAM,wBACXA,EAAM,MAAM,GACZA,EAAM,MAAM,GACZA,EAAM,OAAO,GACbA,EAAM,OAAO,GACb,CACF,CACD,GAGHH,EAAA,wBAAoBG,GACX,SAAM,wBACXA,EAAM,MAAM,GACZA,EAAM,MAAM,GACZA,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,QACR,GAGFH,EAAA,qBAAgB,CAACG,EAAUM,IAA8B,CACvD,IAAMgC,EAAc,KAAK,UAAUtC,CAAK,EAExC,OACE,SAAM,gBAAgBsC,EAAahC,CAAM,MACzC,2BACE,KAAK,UAAUN,CAAK,EACpBA,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,EAClBM,CACF,EAAE,OAAS,CAEf,GAEAT,EAAA,oBAAe,CAAC0C,EAASC,IAChBA,EAAK,SAAWD,EAAK,QAAUC,EAAK,QAAUD,EAAK,OAASC,EAAK,QAAUD,EAAK,OAGzF1C,EAAA,iBAAaG,GACJ,OAAI,IAAIA,EAAM,MAAOA,EAAM,MAAM,GAG1CH,EAAA,uBAAkB,CAChBG,EACAyC,EACAN,EACAO,EACAC,EACAC,IACG,CACH,CACE,IAAMC,EAAiB,KAAK,kBAAkB7C,CAAK,EAC7C8C,EAAS,KAAK,UAAU9C,CAAK,EAC/B+C,EACAC,EACJ,GACE,CAAC,SAAM,eACLb,EACAW,EACA9C,EAAM,OAAO,GAAK,KAAK,gBACvBA,EAAM,OAAO,GAAK,KAAK,eACzB,EAEA,OAEF,GAAI4C,EACE,OAAI,KAAKT,EAAO,KAAK,UAAUnC,CAAK,CAAC,EAAI,GAC3C+C,EAAe,CAAC,GAAK,EAAG,EAExBA,EAAe,OAAI,KAAK,OAAI,IAAIZ,EAAO,CAACU,EAAe,KAAMA,EAAe,IAAI,CAAC,EAAG,CAClFA,EAAe,MACfA,EAAe,MACjB,CAAC,EAEHG,EAAW,MACN,CACL,IAAIC,KAAe,wBACjBP,EACAC,EACAG,EACA9C,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,CACpB,EAAE,OAAO,KAAK,CAACkD,EAAGC,IAAM,OAAI,KAAKD,EAAGR,CAAM,EAAI,OAAI,KAAKS,EAAGT,CAAM,CAAC,EAAE,GAWnE,GAVKO,IACHA,KAAe,gCACbd,EACAW,EACAA,EACA9C,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,CACpB,EAAE,OAAO,KAAK,CAACkD,EAAGC,IAAM,OAAI,KAAKD,EAAGf,CAAK,EAAI,OAAI,KAAKgB,EAAGhB,CAAK,CAAC,EAAE,IAE/D,CAACc,EACH,OAGF,IAAMG,EAAS,OAAI,IAAIjB,EAAOc,CAAY,EAW1C,GAVI,OAAI,sBAAsBd,EAAOiB,EAAQ,KAAK,UAAUpD,CAAK,CAAC,EAAI,GAEpE+C,EAAe,CAAC,GAAK,EAAG,EAGxBA,EAAe,OAAI,KAAK,OAAI,IAAIK,EAAQ,CAACP,EAAe,KAAMA,EAAe,IAAI,CAAC,EAAG,CACnFA,EAAe,MACfA,EAAe,MACjB,CAAC,EAGD,SAAM,eAAeV,EAAOW,EAAQ9C,EAAM,OAAO,GAAIA,EAAM,OAAO,GAAIA,EAAM,UAAY,CAAC,EAGzFgD,EAAW,KAAK,gBAAkB,MAC7B,CAEL,IAAMK,KAAoB,gCACxBlB,EACAW,EACAA,EACA9C,EAAM,OAAO,GACbA,EAAM,OAAO,GACbA,EAAM,UAAY,CACpB,EAAE,OAAO,GACT,GAAI,CAACqD,EAAmB,OACxBL,EAAW,KAAK,IAAI,KAAK,gBAAkB,EAAG,OAAI,KAAKb,EAAOkB,CAAiB,CAAC,CAClF,CACF,CACA,MAAO,CACL,MAAON,EACP,SAAAC,CACF,CACF,CACF,GAEAnD,EAAA,iBAAY,CACVG,EACAM,EACA,CAAE,OAAAgD,EAAQ,OAAAC,EAAQ,aAAAC,CAAa,IAChB,CACf,GAAM,CAAE,SAAAC,EAAW,CAAE,EAAID,EACzB,MAAO,CACL,MAAO,CAAClD,EAAO,KAAMA,EAAO,IAAI,EAChC,OAAQ,CAACA,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,EAC5C,SACGgD,EAAS,GAAKC,GAAU,GAAOA,EAAS,GAAKD,GAAU,EACpD,EAAEG,GAAY,GACdA,GAAY,CACpB,CACF,GAEA5D,EAAA,uBAAkB,CAACG,EAAUM,KACpB,CACL,MAAO,OAAI,QAAQ,CAACA,EAAO,KAAMA,EAAO,IAAI,CAAC,EAC7C,OAAQ,OAAI,IAAI,CAACA,EAAO,MAAOA,EAAO,MAAM,EAAG,CAAC,CAClD,IAEJ,EAEMwB,GAAc4B,EAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAC,EI/TnE,IAAAC,GAAoC,sBADpC,IAAAC,GAAA,6BAWaC,GAAN,cAAwBC,EAAkB,CAA1C,kCACLC,EAAA,qBAEAA,EAAA,eAAU,IAEVA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,aACA,KAAM,QACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,IAAK,GAAG,EACf,SAAU,EACV,SAAU,CAAC,EACX,MAAOC,EACT,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAI,EAAO,UAAAC,EAAW,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,OAAAC,CAAO,EAAGC,IAAQ,CACrE,GAAM,CAAE,GAAAC,EAAI,KAAAC,CAAK,EAAIR,EAEfS,EAAK,EACLC,EAAI,KAAK,IAAI,EAAGF,EAAK,GAAKC,EAAK,CAAC,EAChCE,EAAI,KAAK,IAAI,EAAGH,EAAK,GAAKC,EAAK,CAAC,EAShCG,EAP0C,CAC9C,CAAC,CAACH,EAAK,EAAGA,EAAK,CAAC,EAAG,CAACC,EAAGD,EAAK,CAAC,EAAGC,EAAID,EAAK,CAAC,EAC1C,CAAC,CAACC,EAAGD,EAAK,CAAC,EAAG,CAACC,EAAGC,CAAC,EAAGA,EAAIF,EAAK,CAAC,EAChC,CAAC,CAACC,EAAGC,CAAC,EAAG,CAACF,EAAK,EAAGE,CAAC,EAAGD,EAAID,EAAK,CAAC,EAChC,CAAC,CAACA,EAAK,EAAGE,CAAC,EAAG,CAACF,EAAK,EAAGA,EAAK,CAAC,EAAGE,EAAIF,EAAK,CAAC,CAC5C,EAEsB,IAAI,CAAC,CAACI,EAAOC,CAAG,EAAGC,OAChC,QAAC,QAAwB,GAAIF,EAAM,GAAI,GAAIA,EAAM,GAAI,GAAIC,EAAI,GAAI,GAAIA,EAAI,IAA9DP,EAAK,IAAMQ,CAAuD,CACrF,EAED,SACE,SAAC,gBAAAC,EAAAC,EAAA,CAAa,IAAKX,GAASD,GAA3B,CACE,UAAAJ,MACC,QAAC,QAAK,UAAU,uBAAuB,YAAa,KAAK,gBAAiB,KAE5E,SAAC,KAAE,QAASC,EAAU,GAAkB,EACtC,qBAAC,QACC,EAAG,EACH,EAAG,EACH,MAAOM,EAAK,GACZ,OAAQA,EAAK,GACb,KAAK,cACL,cAAc,MAChB,KACA,QAACU,GAAA,CACC,eACA,QAASf,GAAaC,EAAa,EAAI,EACvC,cAAc,QACd,cAAc,SAEb,SAAAQ,EACH,GACF,IACF,CAEJ,CACF,GAEAf,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CAAE,GAAAO,EAAI,KAAAC,CAAK,EAAIR,EAEfS,EAAK,EACLC,EAAI,KAAK,IAAI,EAAGF,EAAK,GAAKC,EAAK,CAAC,EAChCE,EAAI,KAAK,IAAI,EAAGH,EAAK,GAAKC,EAAK,CAAC,EAShCG,EAP0C,CAC9C,CAAC,CAACH,EAAK,EAAGA,EAAK,CAAC,EAAG,CAACC,EAAGD,EAAK,CAAC,EAAGC,EAAID,EAAK,CAAC,EAC1C,CAAC,CAACC,EAAGD,EAAK,CAAC,EAAG,CAACC,EAAGC,CAAC,EAAGA,EAAIF,EAAK,CAAC,EAChC,CAAC,CAACC,EAAGC,CAAC,EAAG,CAACF,EAAK,EAAGE,CAAC,EAAGD,EAAID,EAAK,CAAC,EAChC,CAAC,CAACA,EAAK,EAAGE,CAAC,EAAG,CAACF,EAAK,EAAGA,EAAK,CAAC,EAAGE,EAAIF,EAAK,CAAC,CAC5C,EAEsB,IAAI,CAAC,CAACI,EAAOC,CAAG,EAAGC,OAChC,QAAC,QAAwB,GAAIF,EAAM,GAAI,GAAIA,EAAM,GAAI,GAAIC,EAAI,GAAI,GAAIA,EAAI,IAA9DP,EAAK,IAAMQ,CAAuD,CACrF,EAED,SACE,QAACG,GAAA,CAAY,cAAc,QAAQ,cAAc,SAC9C,SAAAN,EACH,CAEJ,CAAC,GAEDf,EAAA,iBAAaG,GACJmB,GAAmBnB,EAAO,KAAK,WAAW,GAGnDH,EAAA,oBAAe,CAACuB,EAASC,IAChBA,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,OAE1D,EAEMF,GAAcI,EAAO,IAAK,CAC9B,YAAa,gCACb,gBAAiB,0DACnB,CAAC,ECtHD,IAAAC,GAAuB,2BACvBC,GAAuB,oBACvBC,GAAqC,sBAFrC,IAAAC,GAAA,6BAgBaC,GAAN,cAAwBC,EAAkB,CAA1C,kCACLC,EAAA,qBAEAA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,2BAAsB,IAEtBA,EAAA,wBAAmB,IAEnBA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,QACJ,aACA,KAAM,QACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,EAAG,CAAC,EACX,SAAU,EACV,MAAOC,EAAAC,EAAA,GAAKC,IAAL,CAAmB,SAAU,EAAK,GACzC,QAAS,SACX,EACAH,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAM,EAAO,MAAAC,EAAQ,CAAE,IAAK,EAAG,EAAG,UAAAC,EAAW,QAAAC,EAAS,KAAAC,EAAM,OAAAC,EAAQ,cAAAC,CAAc,EAAGC,IAAQ,CACxF,GAAM,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAIT,EAClB,CAAE,gBAAAU,CAAgB,EAAI,KAEtBC,EAAe,UAAyB,IAAI,EAC5CC,EAAiB,UAAuB,IAAI,EAElD,OAAM,mBAAgB,IAAM,CAC1B,IAAMC,EAAUD,EAAS,QACzB,GAAI,CAACC,EAAS,OACd,GAAM,CAACC,EAAOC,CAAM,EAAIP,EACxBK,EAAQ,MAAM,MAAQ,GAAGC,MACzBD,EAAQ,MAAM,OAAS,GAAGE,KAC5B,EAAG,CAACP,CAAI,CAAC,KAGP,SAAC,iBAAAX,EAAAC,EAAA,CAAc,IAAKS,GAASF,GAA5B,CACE,UAAAH,MACC,QAAC,OACC,UAAU,uBACV,MAAO,CACL,SAAU,WACV,IAAK,QAAQ,CAACQ,wBACd,KAAM,QAAQ,CAACA,wBACf,MAAO,eAAeA,EAAkB,wBACxC,OAAQ,eAAeA,EAAkB,wBACzC,gBAAiB,sBACnB,EACF,KAEF,QAACM,GAAA,CACC,IAAKJ,EACL,WAAYR,EAAK,WACjB,SAAUK,EAAM,SAChB,QAASN,EAET,oBAACc,GAAA,CACC,GAAIjB,EAAM,GAAK,SACf,IAAKW,EACL,IAAMV,EAAuB,IAC7B,IAAI,iBACJ,UAAW,GACb,EACF,IACF,CAEJ,CACF,GAEAN,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAM,CAAM,IAAM,CAClD,GAAM,CACJ,KAAM,CAACc,EAAOC,CAAM,CACtB,EAAIf,EAEJ,SACE,QAAC,QAAK,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,KAAK,IAAI,EAAGc,CAAK,EAAG,OAAQ,KAAK,IAAI,EAAGC,CAAM,EAAG,CAE5F,CAAC,GAEDpB,EAAA,iBAAaK,GACJkB,GAAmBlB,EAAO,KAAK,WAAW,GAGnDL,EAAA,oBAAe,CAACwB,EAASC,IAChBA,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,OAGxDxB,EAAA,iBAAY0B,IAEZ1B,EAAA,uBAAkB2B,IAElB3B,EAAA,qBAAiBK,GAAsB,CACrC,IAAMuB,EAAS,KAAK,UAAUvB,CAAK,EAC7BwB,EAAM,SAAS,gBAAgB,6BAA8B,OAAO,EAC1E,OAAAA,EAAI,aAAa,QAAS,GAAGD,EAAO,OAAO,EAC3CC,EAAI,aAAa,SAAU,GAAGD,EAAO,QAAQ,EAC7CC,EAAI,aAAa,cAAe,8BAA8B,EACvDA,CACT,GACF,EAEMR,MAAU,WAAO,MAAO,CAC5B,cAAe,MACf,SAAU,WACV,WAAY,aACZ,SAAU,MACV,OAAQ,OACR,MAAO,OACP,aAAc,MACd,YAAa,QACb,SAAU,SACV,EAAG,CACD,WAAY,MACd,EACA,IAAK,CACH,WAAY,MACd,EACA,SAAU,CACR,QAAS,CACP,MAAO,CAAE,QAAS,CAAE,EACpB,KAAM,CAAE,WAAY,cAAe,QAAS,EAAgB,CAC9D,EACA,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CAAC,CACV,EACA,WAAY,CACV,KAAM,CAAC,EACP,MAAO,CAAC,CACV,CACF,EACA,iBAAkB,CAChB,CACE,SAAU,GACV,WAAY,GACZ,IAAK,CACH,UACE,0FACJ,CACF,EACA,CACE,SAAU,GACV,WAAY,GACZ,IAAK,CACH,UACE,6FACJ,CACF,CACF,CACF,CAAC,EAEKC,MAAe,WAAO,MAAO,CACjC,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,SAAU,OACV,SAAU,OACV,cAAe,OACf,UAAW,QACX,WAAY,OACZ,aAAc,CAChB,CAAC,EC7LD,IAAAQ,GAAuB,oBACvBC,GAA8C,sBAC9CC,GAAoB,qBCFpB,IAAAC,GAAsB,sBAOf,SAASC,GAAeC,EAAwBC,EAA2B,CAPlF,IAAAC,EAAAC,EAAAC,EAAAC,EAQE,GAAIL,EAAS,SAAW,EAAG,MAAO,GAClC,GAAIA,EAAS,SAAW,EAAG,CACzB,GAAM,CAAE,MAAAM,CAAM,EAAIN,EAAS,GAC3B,MAAO,KAAKM,EAAM,MAAMA,EAAM,IAChC,CAEA,IAAIC,EAAI,KAAKP,EAAS,GAAG,MAAM,GAAG,QAAQ,CAAC,KAAKA,EAAS,GAAG,MAAM,GAAG,QAAQ,CAAC,IAE9E,QAASQ,EAAI,EAAGA,EAAIR,EAAS,OAAQQ,IAAK,CACxC,IAAMC,EAAOT,EAASQ,EAAI,GACpBE,EAAOV,EAASQ,GAChBG,GAAKT,EAAAO,EAAK,MAAL,KAAAP,EAAYO,EAAK,MACtBG,GAAKT,EAAAO,EAAK,MAAL,KAAAP,EAAYO,EAAK,MACTD,EAAK,KAAO,MAAQC,EAAK,KAAO,KAEjDH,GAAK,MAAMI,EAAG,GAAG,QAAQ,CAAC,KAAKA,EAAG,GAAG,QAAQ,CAAC,KAAKC,EAAG,GAAG,QAAQ,CAAC,KAAKA,EAAG,GAAG,QAC3E,CACF,KAAKF,EAAK,MAAM,GAAG,QAAQ,CAAC,KAAKA,EAAK,MAAM,GAAG,QAAQ,CAAC,IAExDH,GAAK,MAAMG,EAAK,MAAM,GAAG,QAAQ,CAAC,KAAKA,EAAK,MAAM,GAAG,QAAQ,CAAC,GAElE,CAEA,GAAIT,GAAYD,EAAS,OAAS,EAAG,CACnC,IAAMS,EAAOT,EAASA,EAAS,OAAS,GAClCU,EAAOV,EAAS,GAChBW,GAAKP,EAAAK,EAAK,MAAL,KAAAL,EAAYK,EAAK,MACtBG,GAAKP,EAAAK,EAAK,MAAL,KAAAL,EAAYK,EAAK,OACTD,EAAK,KAAO,MAAQC,EAAK,KAAO,QAEjDH,GAAK,MAAMI,EAAG,GAAG,QAAQ,CAAC,KAAKA,EAAG,GAAG,QAAQ,CAAC,KAAKC,EAAG,GAAG,QAAQ,CAAC,KAAKA,EAAG,GAAG,QAC3E,CACF,KAAKF,EAAK,MAAM,GAAG,QAAQ,CAAC,KAAKA,EAAK,MAAM,GAAG,QAAQ,CAAC,KAE1DH,GAAK,IACP,CAEA,OAAOA,CACT,CAOO,SAASM,GAAkBb,EAAwB,CACxD,GAAIA,EAAS,SAAW,EAAG,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,EAAG,KAAM,EAAG,MAAO,EAAG,OAAQ,CAAE,EAE5F,IAAMc,EAAMd,EAAS,IAAKe,GAAMA,EAAE,KAAK,EACvC,OAAO,SAAM,oBAAoBD,CAAG,CACtC,CAMO,SAASE,GAAkBhB,EAGhC,CACA,GAAIA,EAAS,SAAW,EAAG,MAAO,CAAE,SAAAA,EAAU,OAAQ,CAAC,EAAG,CAAC,CAAE,EAC7D,IAAMiB,EAASJ,GAAkBb,CAAQ,EACnCkB,EAAS,CAACD,EAAO,KAAMA,EAAO,IAAI,EAMxC,MAAO,CAAE,SALUjB,EAAS,IAAKe,IAAO,CACtC,MAAO,CAACA,EAAE,MAAM,GAAKG,EAAO,GAAIH,EAAE,MAAM,GAAKG,EAAO,EAAE,EACtD,IAAKH,EAAE,IAAM,CAACA,EAAE,IAAI,GAAKG,EAAO,GAAIH,EAAE,IAAI,GAAKG,EAAO,EAAE,EAAI,OAC5D,IAAKH,EAAE,IAAM,CAACA,EAAE,IAAI,GAAKG,EAAO,GAAIH,EAAE,IAAI,GAAKG,EAAO,EAAE,EAAI,MAC9D,EAAE,EAC6B,OAAAA,CAAO,CACxC,CAKO,SAASC,GAAaC,EAAkBC,EAA4B,CACzE,MAAO,CAAC,EAAID,EAAO,GAAKC,EAAO,GAAI,EAAID,EAAO,GAAKC,EAAO,EAAE,CAC9D,CDpFA,IAAAC,GAAA,6BAsBaC,GAAN,cAAsBC,EAAkB,CAAxC,kCACLC,EAAA,mBAEAA,EAAA,gBAAW,IAEXA,EAAA,yBAAoB,IAAI,SACxBA,EAAA,wBAAmB,IAAI,KACvBA,EAAA,kBAAuC,CAAC,GAExCA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,WACA,KAAM,MACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,EACV,MAAOC,GACP,SAAU,CAAC,EACX,SAAU,GACV,WAAY,GACZ,aAAc,OACd,gBAAiB,EACnB,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAI,EAAO,KAAAC,EAAM,WAAAC,EAAY,QAAAC,EAAS,OAAAC,CAAO,EAAGC,IAAQ,CArD3D,IAAAC,GAAAC,GAAAC,GAsDM,GAAM,CAAE,SAAAC,EAAU,MAAAC,EAAO,SAAAC,EAAU,WAAAC,EAAY,aAAAC,EAAc,gBAAAC,CAAgB,EAAId,EAC3Ee,EAAgBd,EAAK,gBAAkBD,EAAM,GAG7CgB,EAAMC,EAAY,EAClBC,EAAgB,UAA0B,IAAI,EAC9C,CAACC,EAAeC,CAAgB,EAAU,YAAwB,IAAI,EAEtEC,EAAsB,eAC1B,CAACC,EAAiBC,KAChB,OAAI,IAAIP,EAAI,aAAa,CAACM,EAASC,EAAO,CAAC,EAAGvB,EAAM,KAAK,EAC3D,CAACgB,EAAKhB,EAAM,KAAK,CACnB,EAEMwB,EAAsB,eACzBC,GAA0B,CACzBT,EAAI,WAAW,CACb,SAAU,CACR,MAAO,CACL,CAACA,EAAI,eAAgB,CAAE,OAAQ,CAAE,CAAChB,EAAM,IAAK,CAAE,SAAUyB,CAAQ,CAAE,CAAE,CACvE,CACF,CACF,CAAC,CACH,EACA,CAACT,EAAKhB,EAAM,EAAE,CAChB,EAEM0B,EAAuB,eAC1BD,GAA0B,CAGzBT,EAAI,aAAa,CAAE,GAAIhB,EAAM,GAAI,SAAUyB,CAAQ,CAAC,CACtD,EACA,CAACT,EAAKhB,EAAM,EAAE,CAChB,EAEM2B,EAASC,GAAclB,EAAOT,EAAK,UAAU,EAC7C,CAAE,OAAA4B,EAAQ,KAAAC,EAAM,YAAAC,EAAa,QAASC,CAAa,EAAIL,EACvD,CAAE,KAAAM,EAAM,SAAAC,CAAS,EAAIC,GAAgBnC,EAAM,GAAIU,CAAK,EACpD0B,EAAaF,GAAA,KAAAA,EAAYJ,EAEzBO,GAAiB,WAAQ,IAAMC,GAAe7B,EAAUE,CAAQ,EAAG,CAACF,EAAUE,CAAQ,CAAC,EAEvF4B,GAAOjC,GAAAU,EAAI,OAAJ,KAAAV,GAAY,EAGnBkC,GAAK,EAAIT,EAAc,IACvBU,IACJlC,GAAA,CACE,SAAkB,OAClB,UAAmB,OACnB,WAAoB,OAAOwB,EAAc,IACzC,WAAoB,GAAGA,EAAc,KAAKA,EAAc,GAC1D,EAAErB,EAAM,QALR,KAAAH,GAK8B,OAE1BmC,IACJlC,GAAA,CACE,SAAkB,IAClB,UAAmB,IACnB,WAAoB,IACpB,WAAoB,GACtB,EAAEE,EAAM,QALR,KAAAF,GAK8B,IAG1BmC,GAAoB,WAAQ,IAAM,CACtC,GAAI,CAAC5B,GAAiBN,EAAS,SAAW,EAAG,OAAO,KAEpD,IAAMmC,EAAQ,EAAIL,EACZM,GAAU,IAAMN,EAChBO,GAAQ,EAAIP,EAEZQ,EAAgC,CAAC,EACjCC,EAAkC,CAAC,EACnCC,EAAgC,CAAC,EAEvC,OAAAxC,EAAS,QAAQ,CAACyC,GAAiBC,IAAc,CAC/C,GAAM,CAACC,GAAIC,EAAE,EAAIH,GAAI,MAGrB,GAAIA,GAAI,IAAK,CACX,GAAM,CAACI,GAAIC,EAAE,EAAIL,GAAI,IACfM,GAAO,OAAOL,IACpBF,EAAQ,QACN,QAAC,QAEC,GAAIG,GACJ,GAAIC,GACJ,GAAIC,GACJ,GAAIC,GACJ,OAAO,UACP,YAAaT,GACb,cAAe,GACf,cAAc,QART,QAAQK,GASf,CACF,EACAH,EAAU,QACR,QAAC,UAEC,GAAIM,GACJ,GAAIC,GACJ,EAAGpC,IAAkBqC,GAAOX,GAAU,IAAMA,GAC5C,KAAM1B,IAAkBqC,GAAO,UAAY,QAC3C,OAAO,UACP,YAAaV,GACb,MAAO,CAAE,OAAQ,MAAO,EACxB,eAAgB,IAAM1B,EAAiBoC,EAAI,EAC3C,eAAgB,IAAMpC,EAAiB,IAAI,EAC3C,cAAgBqC,IAAM,CACpBA,GAAE,gBAAgB,EAChBA,GAAE,cAAmC,kBAAkBA,GAAE,SAAS,EACpEvC,EAAQ,QAAU,CAAE,KAAM,MAAO,IAAKiC,CAAE,CAC1C,EACA,cAAgBM,IAAM,CACpB,GACE,CAACvC,EAAQ,SACTA,EAAQ,QAAQ,OAAS,OACzBA,EAAQ,QAAQ,MAAQiC,EAExB,OACFM,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CE,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,IAAR,CAAY,IAAKO,EAAM,GAC/BlC,EAAcmC,EAAE,CAClB,EACA,YAAcF,IAAM,CAClB,GAAI,CAACvC,EAAQ,QAAS,OACtBuC,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CE,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,IAAR,CAAY,IAAKO,EAAM,GAC/BxC,EAAQ,QAAU,KAClBQ,EAAeiC,EAAE,CACnB,GApCKH,EAqCP,CACF,CACF,CAGA,GAAIN,GAAI,IAAK,CACX,GAAM,CAACI,GAAIC,EAAE,EAAIL,GAAI,IACfM,GAAO,OAAOL,IACpBF,EAAQ,QACN,QAAC,QAEC,GAAIG,GACJ,GAAIC,GACJ,GAAIC,GACJ,GAAIC,GACJ,OAAO,UACP,YAAaT,GACb,cAAe,GACf,cAAc,QART,QAAQK,GASf,CACF,EACAH,EAAU,QACR,QAAC,UAEC,GAAIM,GACJ,GAAIC,GACJ,EAAGpC,IAAkBqC,GAAOX,GAAU,IAAMA,GAC5C,KAAM1B,IAAkBqC,GAAO,UAAY,QAC3C,OAAO,UACP,YAAaV,GACb,MAAO,CAAE,OAAQ,MAAO,EACxB,eAAgB,IAAM1B,EAAiBoC,EAAI,EAC3C,eAAgB,IAAMpC,EAAiB,IAAI,EAC3C,cAAgBqC,IAAM,CACpBA,GAAE,gBAAgB,EAChBA,GAAE,cAAmC,kBAAkBA,GAAE,SAAS,EACpEvC,EAAQ,QAAU,CAAE,KAAM,MAAO,IAAKiC,CAAE,CAC1C,EACA,cAAgBM,IAAM,CACpB,GACE,CAACvC,EAAQ,SACTA,EAAQ,QAAQ,OAAS,OACzBA,EAAQ,QAAQ,MAAQiC,EAExB,OACFM,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CE,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,IAAR,CAAY,IAAKO,EAAM,GAE3BP,EAAI,EAAIQ,GAAG,SACbA,GAAGR,EAAI,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,EAAI,IAAZ,CAAgB,IAAKW,GAAaH,GAAGR,GAAG,MAAOO,EAAK,CAAE,IAEpElC,EAAcmC,EAAE,CAClB,EACA,YAAcF,IAAM,CAClB,GAAI,CAACvC,EAAQ,QAAS,OACtBuC,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CE,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,IAAR,CAAY,IAAKO,EAAM,GAC3BP,EAAI,EAAIQ,GAAG,SACbA,GAAGR,EAAI,GAAKS,EAAAC,EAAA,GAAKF,GAAGR,EAAI,IAAZ,CAAgB,IAAKW,GAAaH,GAAGR,GAAG,MAAOO,EAAK,CAAE,IAEpExC,EAAQ,QAAU,KAClBQ,EAAeiC,EAAE,CACnB,GA3CKH,EA4CP,CACF,CACF,CAGA,IAAMO,GAAO,QAAQZ,IA0DrB,GAzDAJ,EAAQ,QACN,QAAC,UAEC,GAAIK,GACJ,GAAIC,GACJ,EAAGlC,IAAkB4C,GAAOnB,EAAQ,IAAMA,EAC1C,KAAMzB,IAAkB4C,GAAO,UAAY,QAC3C,OAAO,UACP,YAAa,IAAMxB,EACnB,MAAO,CAAE,OAAQ,MAAO,EACxB,eAAgB,IAAMnB,EAAiB2C,EAAI,EAC3C,eAAgB,IAAM3C,EAAiB,IAAI,EAC3C,cAAgBqC,IAAM,CACpBA,GAAE,gBAAgB,EAChBA,GAAE,cAAmC,kBAAkBA,GAAE,SAAS,EACpEvC,EAAQ,QAAU,CAAE,KAAM,OAAQ,IAAKiC,CAAE,CAC3C,EACA,cAAgBM,IAAM,CACpB,GACE,CAACvC,EAAQ,SACTA,EAAQ,QAAQ,OAAS,QACzBA,EAAQ,QAAQ,MAAQiC,EAExB,OACFM,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CO,GAAOvD,EAAS0C,GAAG,MACnBc,GAAQ,OAAI,IAAIP,GAAOM,EAAI,EAC3BL,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GACHF,GAAGR,IADA,CAEN,MAAOO,GACP,IAAKC,GAAGR,GAAG,IAAM,OAAI,IAAIQ,GAAGR,GAAG,IAAMc,EAAK,EAAI,OAC9C,IAAKN,GAAGR,GAAG,IAAM,OAAI,IAAIQ,GAAGR,GAAG,IAAMc,EAAK,EAAI,MAChD,GACAzC,EAAcmC,EAAE,CAClB,EACA,YAAcF,IAAM,CAClB,GAAI,CAACvC,EAAQ,QAAS,OACtBuC,GAAE,gBAAgB,EAClB,IAAMC,GAAQrC,EAAcoC,GAAE,QAASA,GAAE,OAAO,EAC1CO,GAAOvD,EAAS0C,GAAG,MACnBc,GAAQ,OAAI,IAAIP,GAAOM,EAAI,EAC3BL,GAAK,CAAC,GAAGlD,CAAQ,EACvBkD,GAAGR,GAAKS,EAAAC,EAAA,GACHF,GAAGR,IADA,CAEN,MAAOO,GACP,IAAKC,GAAGR,GAAG,IAAM,OAAI,IAAIQ,GAAGR,GAAG,IAAMc,EAAK,EAAI,OAC9C,IAAKN,GAAGR,GAAG,IAAM,OAAI,IAAIQ,GAAGR,GAAG,IAAMc,EAAK,EAAI,MAChD,GACA/C,EAAQ,QAAU,KAClBQ,EAAeiC,EAAE,CACnB,GAlDKI,EAmDP,CACF,EAGIZ,EAAI1C,EAAS,OAAS,EAAG,CAC3B,IAAMyD,GAAOzD,EAAS0C,EAAI,GACpBgB,IAAMf,GAAKc,GAAK,MAAM,IAAM,EAC5BE,IAAMf,GAAKa,GAAK,MAAM,IAAM,EAClCnB,EAAQ,QACN,QAAC,UAEC,GAAIoB,GACJ,GAAIC,GACJ,EAAGvB,GACH,KAAK,QACL,OAAO,UACP,YAAaC,GACb,gBAAiB,GAAG,EAAIP,KAAQ,EAAIA,IACpC,MAAO,CAAE,OAAQ,WAAY,EAC7B,cAAgBkB,IAAM,CACpBA,GAAE,gBAAgB,EAClB,IAAMY,GAAqB,CAAE,MAAO,CAACF,GAAIC,EAAE,CAAE,EACvCT,GAAK,CAAC,GAAGlD,EAAS,MAAM,EAAG0C,EAAI,CAAC,EAAGkB,GAAQ,GAAG5D,EAAS,MAAM0C,EAAI,CAAC,CAAC,EACzEnC,EAAI,aAAa,CAAE,GAAIhB,EAAM,GAAI,SAAU2D,EAAG,CAAC,CACjD,GAdK,OAAOR,GAed,CACF,CACF,CACF,CAAC,KAKC,SAAC,KACE,UAAAF,EACAD,EACAD,GACH,CAEJ,EAAG,CACDhC,EACAN,EACA8B,EACApB,EACAnB,EAAM,GACNqB,EACAG,EACAE,EACAV,CACF,CAAC,EAGD,GAAIP,EAAS,SAAW,EACtB,SACE,QAAC,gBAAAmD,EAAAC,EAAA,CAAa,IAAKxD,EAAK,GAAIL,EAAM,GAAK,QAAYI,GAAlD,CACC,oBAAC,UAAO,EAAG,EAAG,KAAMyB,EAAQ,OAAQA,EAAQ,cAAc,MAAM,GAClE,EAIJ,IAAMyC,GACJvD,GAAiB,CAACH,EAAa,CAAE,SAAU,SAAmB,EAAI,OAEpE,SACE,SAAC,gBAAAgD,EAAAC,EAAA,CAAa,IAAKxD,EAAK,GAAIL,EAAM,GAAK,QAAYI,GAAlD,CAA0D,MAAOkE,GAC/D,UAAArC,KACD,SAAC,KAAE,QAAS9B,EAAU,GAAkB6B,EACtC,qBAAC,QACC,UAAWtB,EAAM,UAAYR,EAAa,kBAAoB,oBAC9D,EAAGmC,GACL,EACC3B,EAAM,UAAYC,MACjB,QAAC,QAAK,EAAG0B,GAAU,KAAMD,EAAY,OAAO,OAAO,cAAc,OAAO,KAE1E,QAAC,QACC,EAAGC,GACH,KAAK,OACL,OAAQR,EACR,YAAaW,GACb,gBAAiBC,GACjB,iBAAkBC,GAClB,eAAe,QACf,cAAc,QACd,cAAc,OAChB,EAEC,CAAC9B,GACAC,GACAJ,EAAS,OAAS,IACjB,IAAM,CACL,IAAM8D,EAAO9D,EAASA,EAAS,OAAS,GACpC+D,GACJ,GAAI1D,GAAmByD,EAAK,IAAK,CAE/B,GAAM,CAACE,GAAIC,CAAE,EAAIH,EAAK,MAChB,CAACI,EAAKC,CAAG,EAAIL,EAAK,IAClB,CAACnB,GAAIC,CAAE,EAAIxC,EACjB2D,GAAW,KAAKC,MAAMC,OAAQC,KAAOC,KAAOxB,MAAMC,KAAMD,MAAMC,GAChE,KAAO,CACL,GAAM,CAACoB,GAAIC,CAAE,EAAIH,EAAK,MAChB,CAACnB,EAAIC,CAAE,EAAIxC,EACjB2D,GAAW,KAAKC,MAAMC,OAAQtB,KAAMC,GACtC,CACA,SACE,QAAC,QACC,EAAGmB,GACH,KAAK,OACL,OAAQ3C,EACR,YAAaW,GAAK,GAClB,gBAAiB,GAAGA,GAAK,KAAKA,GAAK,IACnC,cAAc,QACd,QAAS,IACT,cAAc,OAChB,CAEJ,GAAG,EAEJ,CAAC5B,GACAC,GACAJ,EAAS,QAAU,IAClB,IAAM,CACL,IAAMoE,EAAQpE,EAAS,GACjBqE,GAAO,KAAK,MAChBjE,EAAa,GAAKgE,EAAM,MAAM,GAC9BhE,EAAa,GAAKgE,EAAM,MAAM,EAChC,EACME,GAAgB,GAAKxC,EAC3B,OAAOuC,IAAQC,MACb,QAAC,UACC,GAAIF,EAAM,MAAM,GAChB,GAAIA,EAAM,MAAM,GAChB,EAAG,EAAItC,EACP,KAAK,OACL,OAAO,UACP,YAAa,IAAMA,EACnB,QAAS,GACT,cAAc,OAChB,EACE,IACN,GAAG,EAEJ,CAAC3B,GAAcH,EAAS,OAAS,MAChC,QAAC,UACC,GAAIA,EAASA,EAAS,OAAS,GAAG,MAAM,GACxC,GAAIA,EAASA,EAAS,OAAS,GAAG,MAAM,GACxC,EAAG,EAAI8B,EACP,KAAMV,EACN,OAAO,OACP,cAAc,OAChB,GAEJ,EACCc,KACH,CAEJ,CACF,GAEA9C,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CAAE,SAAAS,EAAU,SAAAE,CAAS,EAAIX,EACzBqC,EAAWC,GAAe7B,EAAUE,CAAQ,EAClD,OAAK0B,KACE,QAAC,QAAK,EAAGA,EAAU,KADJ,QAAC,UAAO,EAAG,EAAG,CAEtC,CAAC,GAEDxC,EAAA,iBAAaG,GAAa,CACxB,IAAMgF,EAAoB,CAAC,KAAK,kBAAkB,IAAIhF,EAAM,QAAQ,EAC9DiF,EAAoB,KAAK,WAAWjF,EAAM,MAAQA,EAAM,MAE9D,GAAIgF,EAAmB,CACrB,IAAME,EACJlF,EAAM,SAAS,OAAS,EACpBmF,GAAkBnF,EAAM,QAAQ,EAChC,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,EAAG,KAAM,EAAG,MAAO,EAAG,OAAQ,CAAE,EAG1DoF,EAAaxB,EAAAC,EAAA,GACdqB,GADc,CAEjB,MAAO,KAAK,IAAIA,EAAO,MAAO,CAAC,EAC/B,OAAQ,KAAK,IAAIA,EAAO,OAAQ,CAAC,CACnC,GACA,KAAK,kBAAkB,IAAIlF,EAAM,SAAUoF,CAAsB,EACjE,KAAK,iBAAiB,IACpBpF,EAAM,GACN,SAAM,gBAAgBoF,EAAwBpF,EAAM,KAAK,CAC3D,EACA,KAAK,WAAWA,EAAM,IAAMA,EAAM,KACpC,MAAWiF,IACT,KAAK,WAAWjF,EAAM,IAAMA,EAAM,MAClC,KAAK,iBAAiB,IACpBA,EAAM,GACN,SAAM,gBAAgB,KAAK,kBAAkB,IAAIA,EAAM,QAAQ,EAAIA,EAAM,KAAK,CAChF,GAGF,OAAO,KAAK,iBAAiB,IAAIA,EAAM,EAAE,CAC3C,GAEAH,EAAA,oBAAe,CAACmE,EAASE,IAErBA,EAAK,WAAaF,EAAK,UACvBE,EAAK,QAAUF,EAAK,OACpBE,EAAK,WAAaF,EAAK,UACvBE,EAAK,aAAeF,EAAK,YACzBE,EAAK,eAAiBF,EAAK,cAC3BE,EAAK,kBAAoBF,EAAK,iBAIlCnE,EAAA,iBAAY,CACVG,EACAkF,EACA,CAAE,aAAAG,EAAc,OAAAC,EAAQ,OAAAC,CAAO,IAChB,CACf,IAAMC,EAAgB,KAAK,UAAUH,CAAY,EAC3CI,EAAK,KAAK,IAAID,EAAc,MAAO,CAAC,EACpCE,EAAK,KAAK,IAAIF,EAAc,OAAQ,CAAC,EAErCG,EAAgBzC,IAAiC,CACrD,MAAO,CACLgC,EAAO,OACJI,EAAS,EACN,GAAKpC,EAAI,MAAM,GAAKsC,EAAc,MAAQC,GACzCvC,EAAI,MAAM,GAAKsC,EAAc,MAAQC,GAC5CP,EAAO,QACJK,EAAS,EACN,GAAKrC,EAAI,MAAM,GAAKsC,EAAc,MAAQE,GACzCxC,EAAI,MAAM,GAAKsC,EAAc,MAAQE,EAC9C,EACA,IAAKxC,EAAI,IACL,CACEgC,EAAO,OACJI,EAAS,EACN,GAAKpC,EAAI,IAAI,GAAKsC,EAAc,MAAQC,GACvCvC,EAAI,IAAI,GAAKsC,EAAc,MAAQC,GAC1CP,EAAO,QACJK,EAAS,EACN,GAAKrC,EAAI,IAAI,GAAKsC,EAAc,MAAQE,GACvCxC,EAAI,IAAI,GAAKsC,EAAc,MAAQE,EAC5C,EACA,OACJ,IAAKxC,EAAI,IACL,CACEgC,EAAO,OACJI,EAAS,EACN,GAAKpC,EAAI,IAAI,GAAKsC,EAAc,MAAQC,GACvCvC,EAAI,IAAI,GAAKsC,EAAc,MAAQC,GAC1CP,EAAO,QACJK,EAAS,EACN,GAAKrC,EAAI,IAAI,GAAKsC,EAAc,MAAQE,GACvCxC,EAAI,IAAI,GAAKsC,EAAc,MAAQE,EAC5C,EACA,MACN,GAEMjE,EAAU4D,EAAa,SAAS,IAAIM,CAAY,EAChDC,EAAYT,GAAkB1D,CAAO,EACrCoE,EAAQ,OAAI,IAAI,CAACX,EAAO,KAAMA,EAAO,IAAI,EAAG,CAACU,EAAU,KAAMA,EAAU,IAAI,CAAC,EAElF,MAAO,CAAE,SAAUnE,EAAS,MAAAoE,CAAM,CACpC,GAEAhG,EAAA,oBAAe,CAACG,EAAU6F,IAAoB,CAC5C,IAAMC,EAAM,OAAI,IAAID,EAAO7F,EAAM,KAAK,EAEtC,QAAWkD,KAAOlD,EAAM,SACtB,GAAI,OAAI,KAAK8F,EAAK5C,EAAI,KAAK,EAAI,EAAG,MAAO,GAE3C,MAAO,EACT,GAEArD,EAAA,0BAAqB,CAACG,EAAU+F,EAAaC,IAAgB,CAC3D,IAAMd,EAAS,KAAK,UAAUlF,CAAK,EACnC,OAAO,SAAM,cAAckF,EAAQ,CACjC,KAAM,KAAK,IAAIa,EAAE,GAAIC,EAAE,EAAE,EACzB,KAAM,KAAK,IAAID,EAAE,GAAIC,EAAE,EAAE,EACzB,KAAM,KAAK,IAAID,EAAE,GAAIC,EAAE,EAAE,EACzB,KAAM,KAAK,IAAID,EAAE,GAAIC,EAAE,EAAE,EACzB,MAAO,KAAK,IAAIA,EAAE,GAAKD,EAAE,EAAE,EAC3B,OAAQ,KAAK,IAAIC,EAAE,GAAKD,EAAE,EAAE,CAC9B,CAAC,CACH,GAEAlG,EAAA,qBAAgB,CAACG,EAAUkF,IAAqB,CAC9C,IAAMe,EAAc,KAAK,UAAUjG,CAAK,EACxC,OAAO,SAAM,cAAckF,EAAQe,CAAW,GAAK,SAAM,cAAcA,EAAaf,CAAM,CAC5F,GACF,EEzlBA,IAAAgB,GAAuB,oBACvBC,GAAqC,sBADrC,IAAAC,GAAA,6BAgBaC,GAAN,cAAiCC,EAAkB,CAAnD,kCACLC,EAAA,8BAEAA,EAAA,eAAU,IACVA,EAAA,gBAAW,IACXA,EAAA,2BAAsB,IACtBA,EAAA,wBAAmB,IAEnBA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,iBACJ,sBACA,KAAM,kBACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,IAAK,GAAG,EACf,SAAU,EACV,MAAOC,EAAAC,EAAA,GAAKC,IAAL,CAAmB,SAAU,EAAK,GACzC,YAAa,EACf,EACAH,CACF,GAGFD,EAAA,iBAAYD,GAAY,UAAwB,CAAC,CAAE,MAAAM,EAAO,QAAAC,EAAS,OAAAC,CAAO,EAAGC,IAAQ,CACnF,GAAM,CAAE,KAAAC,EAAM,YAAAC,CAAY,EAAIL,EACxBM,EAAiB,UAAuB,IAAI,EAGlD,OAAM,mBAAgB,IAAM,CAC1B,IAAMC,EAAUD,EAAS,QACrB,CAACC,IACLA,EAAQ,MAAM,MAAQ,GAAGH,EAAK,OAC9BG,EAAQ,MAAM,OAAS,GAAGH,EAAK,OACjC,EAAG,CAACA,CAAI,CAAC,KAGP,QAAC,iBAAAP,EAAAC,EAAA,CAAc,IAAKK,GAASD,GAA5B,CACC,oBAAC,OACC,GAAI,GAAGF,EAAM,qBACb,IAAKM,EACL,MAAO,CACL,MAAO,GAAGF,EAAK,OACf,OAAQ,GAAGA,EAAK,OAChB,SAAU,WACV,SAAU,SACV,aAAc,MACd,QAASH,EAAU,GAAkB,EACrC,cAAe,KACjB,EAEA,oBAACO,GAAA,CAAmB,YAAaH,EAAa,MAAOD,EAAK,GAAI,OAAQA,EAAK,GAAI,EACjF,GACF,CAEJ,CAAC,GAEDT,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAM,CAAM,IAAM,CAClD,GAAM,CACJ,KAAM,CAACS,EAAOC,CAAM,CACtB,EAAIV,EACJ,SACE,QAAC,QACC,EAAG,EACH,EAAG,EACH,GAAI,EACJ,GAAI,EACJ,MAAO,KAAK,IAAI,EAAGS,CAAK,EACxB,OAAQ,KAAK,IAAI,EAAGC,CAAM,EAC1B,KAAK,OACL,OAAO,qBACT,CAEJ,CAAC,GAEDf,EAAA,iBAAaK,GACJW,GAAmBX,EAAO,KAAK,WAAW,GAGnDL,EAAA,oBAAe,CAACiB,EAASC,IAErBA,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,OAASC,EAAK,cAAgBD,EAAK,aAItFjB,EAAA,iBAAYmB,IACZnB,EAAA,uBAAkBoB,IAElBpB,EAAA,qBAAgB,CAAOK,EAAUgB,IAAoDC,EAAA,sBAEnF,IAAMV,EAAU,SAAS,eAAe,GAAGP,EAAM,oBAAoB,EACrE,GAAI,CAACO,EAAS,OAEd,GAAM,CAACE,EAAOC,CAAM,EAAIV,EAAM,KAE9B,GAAI,CAEF,IAAMkB,EAAWX,EAAQ,cAAc,QAAQ,EAC3CY,EAAU,GAQd,GANID,IAEFC,EAAUD,EAAS,UAAU,WAAW,GAItC,CAACC,GAAWA,IAAY,SAAU,CAGpC,IAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,MAAM,QAAU,CACpB,iBACA,QACA,SACA,SAASX,MACT,UAAUC,MACV,kBACA,oBACA,qBACA,gBACA,qBACF,EAAE,KAAK,GAAG,EAEVU,EAAM,UAAYb,EAAQ,UAC1B,SAAS,KAAK,YAAYa,CAAK,EAE/B,GAAI,CACF,IAAMC,GAAe,KAAM,QAAO,gBAAgB,QAQlDF,GAPiB,MAAME,EAAYD,EAAO,CACxC,MAAAX,EACA,OAAAC,EACA,QAAS,GACT,gBAAiB,UACjB,QAAS,EACX,CAAC,GACkB,UAAU,WAAW,CAC1C,QAAE,CACA,SAAS,KAAK,YAAYU,CAAK,CACjC,CACF,CAEA,GAAI,CAACD,GAAWA,IAAY,SAAU,OAEtC,IAAMG,EAAM,SAAS,gBAAgB,6BAA8B,OAAO,EAC1E,OAAAA,EAAI,aAAa,QAAS,GAAGb,GAAO,EACpCa,EAAI,aAAa,SAAU,GAAGZ,GAAQ,EACtCY,EAAI,aAAa,OAAQH,CAAO,EACzBG,CACT,OAASC,EAAP,CACA,QAAQ,KAAK,oDAAqDA,CAAG,CACvE,CACF,IACF,EAOA,SAASf,GAAmB,CAC1B,YAAAH,EACA,MAAAI,EACA,OAAAC,CACF,EAIG,CACD,IAAMc,EAAWC,GAAiB,EAC5BC,EAAc,WAClB,IAAMF,EAAS,KAAMG,GAAMA,EAAE,KAAOtB,CAAW,EAC/C,CAACmB,EAAUnB,CAAW,CACxB,EAEA,GAAI,CAACqB,EACH,SACE,SAAC,OACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,oDACZ,MAAO,QACP,SAAU,GACV,WAAY,sBACZ,aAAc,CAChB,EACD,wBACarB,EAAY,eAC1B,EAIJ,IAAMuB,EAAOF,EAAM,UAGnB,SAAO,QAACE,EAAA,EAAK,CACf,CCzNA,IAAAC,GAAuB,oBACvBC,GAAoC,sBACpCC,GAAgB,wBCFhB,IAAAC,GAAA,6BAOO,SAASC,GAAiB,CAAE,YAAAC,EAAa,KAAAC,CAAK,EAA0B,CAC7E,SACE,QAAC,QACC,UAAU,uBACV,EAAGD,EACH,EAAGA,EACH,MAAO,KAAK,IAAI,EAAGC,EAAK,GAAKD,EAAc,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAGC,EAAK,GAAKD,EAAc,CAAC,EAC7C,YAAa,GAAmB,EAClC,CAEJ,CClBA,IAAAE,GAAuB,oBACvBC,GAAsB,sBADtB,IAAAC,GAAA,6BAcaC,GAAwB,QAAK,SAAyB,CACjE,GAAAC,EACA,MAAAC,EACA,KAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAsB,CApBtB,IAAAC,EAqBE,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcR,EAAOG,CAAU,EAC/D,CAAE,KAAAM,EAAM,SAAAC,CAAS,EAAIC,GAAgBZ,EAAIC,CAAK,EAC9CY,EAAaF,GAAA,KAAAA,EAAYH,EAEzBM,EAAK,EAAIP,EAAc,MACvBQ,EAAI,KAAK,IAAI,EAAGb,EAAK,GAAKY,EAAK,CAAC,EAChCE,EAAI,KAAK,IAAI,EAAGd,EAAK,GAAKY,EAAK,CAAC,EAChCG,GAAIZ,EAAAJ,EAAM,eAAN,KAAAI,EAAsB,EAG1Ba,EAAUD,EAAI,GAAKhB,EAAM,OAAS,QAElC,CAAE,gBAAAkB,EAAiB,iBAAAC,CAAiB,EAAI,SAAM,oBAClD,GAAKL,EAAIC,GACTT,EAAc,MACdN,EAAM,IACR,EAEA,SACE,sBACG,UAAAS,KACD,QAAC,QACC,UAAWP,GAAcF,EAAM,SAAW,kBAAoB,oBAC9D,EAAGa,EAAK,EACR,EAAGA,EAAK,EACR,MAAOC,EACP,OAAQC,EACR,GAAIC,EACJ,GAAIA,EACJ,YAAa,GACf,EACChB,EAAM,aACL,QAAC,QACC,EAAGa,EAAK,EACR,EAAGA,EAAK,EACR,MAAOC,EACP,OAAQC,EACR,GAAIC,EACJ,GAAIA,EACJ,KAAMJ,EACN,cAAc,OAChB,EAEDK,KACC,QAAC,QACC,EAAGJ,EAAK,EACR,EAAGA,EAAK,EACR,MAAOC,EACP,OAAQC,EACR,GAAIC,EACJ,GAAIA,EACJ,KAAK,OACL,OAAQX,EACR,YAAaQ,EACb,gBAAiBK,EACjB,iBAAkBC,EAClB,cAAc,OACd,cAAc,QAChB,KAEA,QAAC,KAAE,cAAc,OAAO,OAAQd,EAAQ,YAAaQ,EAAI,cAAc,QACpE,UACC,CAAC,CAACA,EAAK,EAAGA,EAAK,CAAC,EAAG,CAACC,EAAGD,EAAK,CAAC,EAAGC,EAAID,EAAK,CAAC,EAC1C,CAAC,CAACC,EAAGD,EAAK,CAAC,EAAG,CAACC,EAAGC,CAAC,EAAGA,EAAIF,EAAK,CAAC,EAChC,CAAC,CAACC,EAAGC,CAAC,EAAG,CAACF,EAAK,EAAGE,CAAC,EAAGD,EAAID,EAAK,CAAC,EAChC,CAAC,CAACA,EAAK,EAAGE,CAAC,EAAG,CAACF,EAAK,EAAGA,EAAK,CAAC,EAAGE,EAAIF,EAAK,CAAC,CAC5C,EAAE,IAAI,CAAC,CAACO,EAAOC,EAAKC,CAAM,EAAGC,IAAM,CACjC,IAAMC,EAAO,SAAM,oBACjBF,EACAhB,EAAc,MACdN,EAAM,IACR,EACA,SACE,QAAC,QAEC,GAAKoB,EAAmB,GACxB,GAAKA,EAAmB,GACxB,GAAKC,EAAiB,GACtB,GAAKA,EAAiB,GACtB,gBAAiBG,EAAK,gBACtB,iBAAkBA,EAAK,kBANlBzB,EAAK,IAAMwB,CAOlB,CAEJ,CAAC,EACH,GAEJ,CAEJ,CAAC,EC7GD,IAAAE,GAAuB,oBCAvB,IAAAC,GAA2C,+BAC3CC,GAAsB,sBACtBC,GAAgB,wBAIhB,SAASC,GAAuBC,EAAYC,EAAoBC,EAAgB,CAC9E,IAAMC,EAASC,GAAcH,CAAK,EAE5BI,EAAY,SAAM,IAAIL,CAAE,EAExBM,EAAKH,EAAO,YAGZI,EAAI,KAAK,IAAI,EAAGL,EAAK,EAAE,EACvBM,EAAI,KAAK,IAAI,EAAGN,EAAK,EAAE,EAGvBO,EAAU,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,IAChC,CAACJ,EAAU,EAAIC,EAAK,IAAMD,EAAU,EAAIC,EAAK,GAAI,CACzD,EAGKI,EAAK,GAAAC,QAAI,IAAI,CAACL,EAAK,EAAGA,EAAK,CAAC,EAAGG,EAAQ,EAAE,EACzCG,EAAK,GAAAD,QAAI,IAAI,CAACJ,EAAID,EAAK,EAAGA,EAAK,CAAC,EAAGG,EAAQ,EAAE,EAC7CI,EAAK,GAAAF,QAAI,IAAI,CAACJ,EAAID,EAAK,EAAGE,EAAIF,EAAK,CAAC,EAAGG,EAAQ,EAAE,EACjDK,EAAK,GAAAH,QAAI,IAAI,CAACL,EAAK,EAAGE,EAAIF,EAAK,CAAC,EAAGG,EAAQ,EAAE,EAG7CM,EAAK,KAAK,MAAM,KAAK,IAAIV,EAAU,EAAI,EAAI,CAAC,CAAC,EAG7CW,EAAK,KAAK,IAAIT,EAAI,EAAGD,EAAK,CAAC,EAC3BW,EAAK,KAAK,IAAIT,EAAI,EAAGF,EAAK,CAAC,EAG3BY,EAAK,KAAK,IAAI,EAAG,KAAK,MAAMX,EAAI,EAAE,CAAC,EACnCY,EAAK,KAAK,IAAI,EAAG,KAAK,MAAMX,EAAI,EAAE,CAAC,EAInCY,EAAQ,SAAM,YAClB,CACE,GAAAT,QAAI,cAAc,GAAAA,QAAI,IAAID,EAAI,CAACM,EAAI,CAAC,CAAC,EAAG,GAAAL,QAAI,IAAIC,EAAI,CAACI,EAAI,CAAC,CAAC,EAAGE,CAAE,EAChE,GAAAP,QAAI,cAAc,GAAAA,QAAI,IAAIC,EAAI,CAAC,EAAGK,CAAE,CAAC,EAAG,GAAAN,QAAI,IAAIE,EAAI,CAAC,EAAGI,CAAE,CAAC,EAAGE,CAAE,EAChE,GAAAR,QAAI,cAAc,GAAAA,QAAI,IAAIE,EAAI,CAACG,EAAI,CAAC,CAAC,EAAG,GAAAL,QAAI,IAAIG,EAAI,CAACE,EAAI,CAAC,CAAC,EAAGE,CAAE,EAChE,GAAAP,QAAI,cAAc,GAAAA,QAAI,IAAIG,EAAI,CAAC,EAAGG,CAAE,CAAC,EAAG,GAAAN,QAAI,IAAID,EAAI,CAAC,EAAGO,CAAE,CAAC,EAAGE,CAAE,CAClE,EACAJ,CACF,EAYA,MAAO,CACL,OANa,CAAC,GAAGK,EAAM,KAAK,EAAG,GAAGA,EAAM,EAAE,EAAE,MAC5C,EACA,KAAK,OAAOL,EAAK,IAAM,EAAIG,EAAKC,GAAM,EAAE,EAAI,CAC9C,CAIA,CACF,CAEA,SAASE,GAAkBrB,EAAYC,EAAoBC,EAAgB,CACzE,GAAM,CAAE,OAAAoB,CAAO,EAAIvB,GAAuBC,EAAIC,EAAOC,CAAI,EACnD,CAAE,YAAAqB,CAAY,EAAInB,GAAcH,CAAK,EAS3C,MAAO,CAAE,OAAAqB,EAAQ,QARD,CACd,KAAMC,EACN,SAAU,IACV,WAAY,GACZ,UAAW,EACX,iBAAkB,GAClB,KAAM,EACR,CACyB,CAC3B,CAEO,SAASC,GAAiBxB,EAAYC,EAAoBC,EAAgB,CAC/E,GAAM,CAAE,OAAAoB,EAAQ,QAAAG,CAAQ,EAAIJ,GAAkBrB,EAAIC,EAAOC,CAAI,EACvDwB,KAAS,GAAAC,SAAUL,EAAQG,CAAO,EACxC,OAAO,SAAM,qBAAqBC,CAAM,CAC1C,CAEO,SAASE,GACd5B,EACAC,EACAC,EACA,CACA,GAAM,CAAE,OAAAoB,EAAQ,QAAAG,CAAQ,EAAIJ,GAAkBrB,EAAIC,EAAOC,CAAI,EAC7D,OAAO,SAAM,8BAA2B,oBAAgBoB,EAAQG,CAAO,CAAC,CAC1E,CD7FA,IAAAI,GAAA,6BAaaC,GAAsB,QAAK,SAAuB,CAC7D,GAAAC,EACA,MAAAC,EACA,KAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAsB,CACpB,GAAM,CAAE,SAAAC,CAAS,EAAIJ,EACf,CAAE,OAAAK,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcR,EAAOG,CAAU,EAC/D,CAAE,KAAAM,EAAM,SAAAC,CAAS,EAAIC,GAAgBZ,EAAIC,CAAK,EAC9CY,EAAaF,GAAA,KAAAA,EAAYH,EACzBM,EAAiBC,GAAiBf,EAAIC,EAAOC,CAAI,EACjDc,EAAYC,GAAoCjB,EAAIC,EAAOC,CAAI,EAErE,SACE,sBACG,UAAAQ,KACD,QAAC,QACC,UAAWT,EAAM,UAAYE,EAAa,kBAAoB,oBAC9D,EAAGa,EACL,EACCX,MAAY,QAAC,QAAK,EAAGW,EAAW,KAAMH,EAAY,cAAc,OAAO,KACxE,QAAC,QACC,EAAGC,EACH,KAAMR,EACN,OAAQA,EACR,YAAaC,EACb,cAAc,OAChB,GACF,CAEJ,CAAC,EH5CD,IAAAW,GAAA,6BAyBaC,GAAN,cAA4BC,EAAkB,CAA9C,kCACLC,EAAA,yBAEAA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,eAAU,IAEVA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,iBACA,KAAM,YACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,EAAG,CAAC,EACX,SAAU,EACV,MAAOC,GACP,MAAO,GACP,WAAY,CAAC,GAAK,EAAG,CACvB,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CACE,CACE,MAAAI,EACA,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,QAAAC,EACA,KAAAC,EACA,OAAAC,EACA,OAAAC,EACA,YAAAC,EACA,cAAAC,CACF,EACAC,IACG,CApET,IAAAC,EAAAC,GAqEM,GAAM,CAAE,GAAAC,EAAI,KAAAC,EAAM,MAAAC,EAAO,MAAAC,EAAQ,GAAI,WAAAC,EAAaC,EAAY,EAAIlB,EAC5DmB,EAAOC,GAAaL,CAAK,EACzBM,EAASC,GAAcP,EAAOV,EAAK,UAAU,EAE7CkB,EACJ,EAFiBlB,EAAK,aAAe,aAEtBU,EAAM,cAA0BS,GAAgBC,GAC3DC,EAA0B,eAC7BV,IAAkBP,GAAA,YAAAA,EAAgB,CAAE,GAAAI,EAAI,MAAAG,EAAM,GAC/C,CAACP,CAAa,CAChB,EAGMkB,EAAgBtB,EAAK,gBAAkBL,EAAM,GAC7C4B,EAAMC,EAAY,EAClBC,EAAgB,UAAwD,IAAI,EAC5E,CAACC,EAAaC,CAAc,EAAU,YAAwB,IAAI,EAClEC,GAAOtB,EAAAiB,EAAI,OAAJ,KAAAjB,EAAY,EAEnBuB,EAAoB,WAAQ,IAAM,CACtC,GAAI,CAACP,EAAe,OAAO,KAC3B,GAAM,CAACQ,GAAGC,EAAC,EAAItB,EACTuB,GAAsB,CAC1B,CAAC,EAAG,CAAC,EACL,CAACF,GAAG,CAAC,EACL,CAACA,GAAGC,EAAC,EACL,CAAC,EAAGA,EAAC,CACP,EACME,GAAY,CAAC,EAAG,EAAG,EAAG,CAAC,EACvBC,GAAI,EAAIN,EACRO,GAAK,EAAIP,EAEf,SACE,SAAC,KACE,UAAAI,GAAQ,IAAI,CAACI,GAAGC,IAAO,CACtB,IAAMC,GAAON,IAASK,EAAK,GAAK,GAChC,SACE,QAAC,QAEC,GAAID,GAAE,GACN,GAAIA,GAAE,GACN,GAAIE,GAAK,GACT,GAAIA,GAAK,GACT,OAAO,UACP,YAAaH,GACb,cAAe,GACf,cAAc,QART,MAAME,GASb,CAEJ,CAAC,EACAL,GAAQ,IAAI,CAAC,CAACO,GAAIC,CAAE,EAAGH,QACtB,QAAC,UAEC,GAAIE,GACJ,GAAIC,EACJ,EAAGd,IAAgBW,GAAKH,GAAI,IAAMA,GAClC,KAAMR,IAAgBW,GAAK,UAAY,QACvC,OAAO,UACP,YAAa,IAAMT,EACnB,MAAO,CAAE,OAAQ,aAAc,EAC/B,eAAgB,IAAMD,EAAeU,EAAE,EACvC,eAAgB,IAAMV,EAAe,IAAI,EACzC,cAAgBc,IAAM,CACpBA,GAAE,gBAAgB,EAChBA,GAAE,cAAmC,kBAAkBA,GAAE,SAAS,EACpE,IAAMC,EAAaV,GAAQC,GAAUI,KACrCZ,EAAQ,QAAU,CAChB,QAASY,GACT,UAAW,GAAAM,QAAI,IAAIhD,EAAM,MAAO+C,CAAU,CAC5C,CACF,EACA,cAAgBD,IAAM,CACpB,GAAI,CAAChB,EAAQ,SAAWA,EAAQ,QAAQ,UAAYY,GAAI,OACxDI,GAAE,gBAAgB,EAClB,IAAMG,EAAKrB,EAAI,aAAa,CAACkB,GAAE,QAASA,GAAE,OAAO,CAAC,EAC5CI,EAAKpB,EAAQ,QAAQ,UACrBqB,EAAK,KAAK,IAAIF,EAAG,GAAIC,EAAG,EAAE,EAC9BE,GAAK,KAAK,IAAIH,EAAG,GAAIC,EAAG,EAAE,EACtBG,EAAK,KAAK,IAAIJ,EAAG,GAAIC,EAAG,EAAE,EAC9BI,GAAK,KAAK,IAAIL,EAAG,GAAIC,EAAG,EAAE,EAC5BtB,EAAI,WAAW,CACb,SAAU,CACR,MAAO,CACL,CAACA,EAAI,eAAgB,CACnB,OAAQ,CACN,CAAC5B,EAAM,IAAK,CACV,MAAO,CAACmD,EAAIC,EAAE,EACd,KAAM,CAAC,KAAK,IAAI,EAAGC,EAAKF,CAAE,EAAG,KAAK,IAAI,EAAGG,GAAKF,EAAE,CAAC,CACnD,CACF,CACF,CACF,CACF,CACF,CAAC,CACH,EACA,YAAcN,IAAM,CAClB,GAAI,CAAChB,EAAQ,QAAS,OACtBgB,GAAE,gBAAgB,EAClB,IAAMG,EAAKrB,EAAI,aAAa,CAACkB,GAAE,QAASA,GAAE,OAAO,CAAC,EAC5CI,EAAKpB,EAAQ,QAAQ,UACrBqB,EAAK,KAAK,IAAIF,EAAG,GAAIC,EAAG,EAAE,EAC9BE,GAAK,KAAK,IAAIH,EAAG,GAAIC,EAAG,EAAE,EACtBG,EAAK,KAAK,IAAIJ,EAAG,GAAIC,EAAG,EAAE,EAC9BI,GAAK,KAAK,IAAIL,EAAG,GAAIC,EAAG,EAAE,EAC5BpB,EAAQ,QAAU,KAClBF,EAAI,aAAa,CACf,GAAI5B,EAAM,GACV,MAAO,CAACmD,EAAIC,EAAE,EACd,KAAM,CAAC,KAAK,IAAI,EAAGC,EAAKF,CAAE,EAAG,KAAK,IAAI,EAAGG,GAAKF,EAAE,CAAC,CACnD,CAAC,CACH,GA1DK,MAAMV,IA2Db,CACD,EAEAL,GAAQ,IAAI,CAACI,GAAGC,IAAO,CACtB,IAAMC,GAAON,IAASK,EAAK,GAAK,GAC1Ba,IAAMd,GAAE,GAAKE,GAAK,IAAM,EACxBa,GAAMf,GAAE,GAAKE,GAAK,IAAM,EAC9B,SACE,QAAC,UAEC,GAAIY,GACJ,GAAIC,EACJ,EAAG,IAAMvB,EACT,KAAK,QACL,OAAO,UACP,YAAaO,GACb,gBAAiB,GAAG,EAAIP,KAAQ,EAAIA,IACpC,MAAO,CAAE,OAAQ,WAAY,EAC7B,cAAc,QATT,OAAOS,GAUd,CAEJ,CAAC,GACH,CAEJ,EAAG,CAACf,EAAeb,EAAMmB,EAAMF,EAAa/B,EAAM,GAAIA,EAAM,MAAO4B,CAAG,CAAC,EAEjE6B,GAAc9B,EAAgB,CAAE,SAAU,SAAmB,EAAI,OAEvE,SACE,SAAC+B,GAAAC,EAAAC,EAAA,CAAY,IAAKlD,GAASH,GAA1B,CACC,qBAACsD,GAAA,CACC,UAAW5D,EACX,SAAUyB,EACV,OAAQlB,EACR,KAAMW,EACN,KAAMH,EACN,OAAOJ,GAAAG,EAAM,aAAN,KAAAH,GAAoBS,EAAO,OAClC,WAAYN,EAAM,gBAClB,aAAcA,EAAM,aACpB,SAAUE,EAAW,GAAK,IAAOX,EAAO,MACxC,SAAUW,EAAW,GAAK,IAAOX,EAAO,OACxC,MAAO,KAAK,IAAI,EAAGA,EAAO,MAAQ,EAAE,EACtC,KACA,SAAC,iBACC,GAAIN,EAAM,GAAK,OACf,QAASI,EAAU,GAAkBiB,EAAO,QAC5C,MAAOoC,GAEN,UAAAvD,MAAa,QAAC4D,GAAA,CAAiB,YAAazC,EAAO,YAAa,KAAMP,EAAM,KAC7E,QAACS,EAAA,CACC,GAAIV,EACJ,MAAOE,EACP,KAAMD,EACN,WAAYX,EACZ,WAAYE,EAAK,WACnB,EACC6B,GACH,IACF,CAEJ,CACF,GAEArC,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,EAAO,KAAAK,CAAK,IAAM,CAlP5D,IAAAM,EAAAC,EAmPI,GAAM,CAAE,GAAAC,EAAI,MAAAE,EAAO,KAAAD,CAAK,EAAId,EAG5B,MAAI,GAFgBK,GAAA,YAAAA,EAAc,cAAe,aAE9BU,EAAM,iBAChB,QAAC,QAAK,EAAGgD,GAAoClD,EAAIE,EAAOD,CAAI,EAAG,KAItE,QAAC,QACC,EAAG,EACH,EAAG,EACH,IAAIH,EAAAI,EAAM,eAAN,KAAAJ,EAAsB,EAC1B,IAAIC,EAAAG,EAAM,eAAN,KAAAH,EAAsB,EAC1B,MAAO,KAAK,IAAI,EAAGE,EAAK,EAAE,EAC1B,OAAQ,KAAK,IAAI,EAAGA,EAAK,EAAE,EAC7B,CAEJ,CAAC,GAEDjB,EAAA,iBAAaG,GACJgE,GAAmBhE,EAAO,KAAK,WAAW,GAGnDH,EAAA,oBAAe,CAACoE,EAAStB,IAChBA,EAAK,OAASsB,EAAK,MAAQtB,EAAK,QAAUsB,EAAK,OAAStB,EAAK,QAAUsB,EAAK,OAGrFpE,EAAA,iBAAYqE,IAEZrE,EAAA,uBAAkBsE,IACpB,EAEMT,GAAcU,EAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAC,EKnRnE,IAAAC,GAAuB,oBACvBC,GAA+C,sBAC/CC,GAAoB,qBAFpB,IAAAC,GAAA,6BAuBaC,GAAN,cAAyBC,EAAkB,CAA3C,kCACLC,EAAA,sBAEAA,EAAA,eAAU,IAEVA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,yBAAoB,IAEpBA,EAAA,wBAAmB,IAEnBA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,cACA,KAAM,SACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,IAAK,GAAG,EACf,KAAM,GACN,SAAU,EACV,MAAOC,EACT,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAI,EAAO,KAAAC,EAAM,OAAAC,EAAQ,QAAAC,EAAS,UAAAC,EAAW,UAAAC,EAAW,YAAAC,EAAa,cAAAC,CAAc,EAAGC,IAAQ,CAC3F,IAAMC,EAAOC,GAAmBV,EAAM,KAAK,EAErC,CAAE,MAAAW,EAAO,KAAAC,EAAM,OAAAC,CAAO,EAAIC,GAAoBd,EAAM,MAAOC,EAAK,UAAU,EAE1Ec,EAAmB,UAAuB,IAAI,EAE9CC,EAAkB,UAA4B,IAAI,EAElDC,EAAc,UAAuB,IAAI,EAEzCC,EAAmB,UAAO,EAAK,EAE/BC,EAA0B,eAAaC,GAA0B,CACrEA,EAAE,gBAAgB,CACpB,EAAG,CAAC,CAAC,EAECC,EAAiB,eACpBC,GAAiB,CAChBf,GAAA,MAAAA,EAAgB,CACd,GAAIP,EAAM,GACV,KAAMA,EAAM,KACZ,KAAMuB,EAAK,cAAcD,CAAI,CAC/B,EACF,EACA,CAACtB,EAAM,EAAE,CACX,EAEMwB,EAAyB,eAC5BJ,GAA8C,CAC7CC,EAASD,EAAE,cAAc,KAAK,CAChC,EACA,CAACb,EAAec,CAAQ,CAC1B,EAEMI,EAAsB,eACzBL,GAAgD,CAC/C,GAAIA,EAAE,MAAQ,SAAU,CACtBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBd,GAAA,MAAAA,IACA,MACF,CAEA,GAAIc,EAAE,MAAQ,OAASpB,EAAM,KAAK,SAAW,EAAG,CAC9CoB,EAAE,eAAe,EACjB,MACF,CAEA,GAAI,EAAEA,EAAE,MAAQ,QAAUA,EAAE,SAC1BA,EAAE,gBAAgB,UACTA,EAAE,MAAQ,KAAOA,EAAE,QAAS,CACjCA,EAAE,SACJ,SAAS,YAAY,OAAQ,EAAK,EAElC,SAAS,YAAY,OAAQ,EAAK,EAEpCA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjB,MACF,EACKA,EAAE,SAAWA,EAAE,UAAYA,EAAE,MAAQ,KACxCA,EAAE,eAAe,EAEfA,EAAE,MAAQ,QACZA,EAAE,eAAe,EACbA,EAAE,SACJM,GAAc,SAASN,EAAE,aAAa,EAEtCM,GAAc,OAAON,EAAE,aAAa,EAGtCb,GAAA,MAAAA,EAAgBoB,EAAAC,EAAA,GAAK5B,GAAL,CAAY,KAAMuB,EAAK,cAAcH,EAAE,cAAc,KAAK,CAAE,IAEhF,EACA,CAACpB,EAAOO,CAAa,CACvB,EAEMsB,EAAmB,eAAaT,GAA6C,CACjFA,EAAE,cAAc,kBAAkB,EAAG,CAAC,EACtCd,GAAA,MAAAA,GACF,EAAG,CAAC,CAAC,EAECwB,EAAoB,eACvBV,GAA6C,CACxC,CAACf,GACD,CAACa,EAAW,SAChBE,EAAE,cAAc,OAAO,CACzB,EACA,CAACf,CAAS,CACZ,EAGM,aAAU,IAAM,CACpB,GAAIA,EAAW,CACba,EAAW,QAAU,GACrB,IAAMa,EAAMf,EAAU,QACtBe,EAAI,MAAM,EACVA,EAAI,OAAO,CACb,CACF,EAAG,CAAC1B,CAAS,CAAC,EAGR,aAAU,IAAM,CACpB,IAAMiB,EAAOL,EAAM,QAEb,CAAE,KAAAe,CAAK,EAAIhC,EACX,CAAE,aAAciC,CAAe,EAAIX,EACnCY,GAAgBC,GAAuBC,GAAU,EACjDC,EAAiBL,EAAK,GAAKI,GAAU,EAG3C,GAAIH,IAAmBI,EAAgB,OAEvC,GAAIJ,EAAiBC,GAAe,CAGlC3B,GAAA,MAAAA,EAAgB,CAAE,GAAIP,EAAM,GAAI,KAAM,CAACgC,EAAK,GAAIC,EAAiBG,GAAU,CAAC,CAAE,GAC9E,MACF,CAEA,GAAIH,EAAiBC,IAAiBF,EAAK,GAAKG,GAAsB,CAGpE5B,GAAA,MAAAA,EAAgB,CAAE,GAAIP,EAAM,GAAI,KAAM,CAACgC,EAAK,GAAIG,EAAoB,CAAE,GACtE,MACF,CAEA,IAAMG,GAAWtB,EAAU,QAC3BsB,IAAA,MAAAA,GAAU,OACZ,EAAG,CAACtC,EAAM,KAAMA,EAAM,KAAK,GAAIA,EAAM,KAAK,CAAC,EAE3C,IAAMuC,EAAevC,EAAM,MAAM,aAC3BwC,EAAQZ,EAAA,CACZ,KAAAnB,EACA,MAAO8B,EAAe,cAAgB5B,EACtC,WAAYV,EAAK,WACb,0CACA,0CACAsC,EAAe,CACjB,WAAYE,GAAiBF,CAAY,EACzC,qBAAsB,OACtB,eAAgB,MAClB,EAAI,CAAC,GAGP,SACE,QAAC,iBAAAZ,EAAAC,EAAA,CAAc,IAAKpB,GAASN,GAA5B,CACC,qBAACwC,GAAA,CACC,IAAK3B,EACL,WAAYd,EAAK,WACjB,QAASE,EACT,MAAOyB,EAAA,CACL,gBAAiBhB,EACjB,OAAQC,EAAS,aAAaA,IAAW,QACtC2B,GAGJ,UAAApC,MACC,QAAC,OACC,UAAU,uBACV,MAAO,CACL,SAAU,WACV,IAAK,CAAC,KAAK,gBACX,KAAM,CAAC,KAAK,gBACZ,MAAO,eAAe,KAAK,gBAAkB,OAC7C,OAAQ,eAAe,KAAK,gBAAkB,OAC9C,gBAAiB,sBACnB,EACF,KAEF,SAACuC,GAAA,CAAW,IAAK1B,EAAO,UAAWZ,EAAW,UAAWL,EAAM,MAAM,UAClE,UAAAA,EAAM,KAAK,UACd,EACCK,MACC,QAACuC,GAAA,CACC,IAAK5B,EACL,cAAeG,EACf,MAAOnB,EAAM,KACb,SAAUwB,EACV,UAAWC,EACX,QAASK,EACT,OAAQD,EACR,SAAU,GACV,aAAa,QACb,eAAe,QACf,YAAY,QACZ,SAAS,QACT,UAAS,GACT,WAAY,GACZ,UAAW7B,EAAM,MAAM,UACvB,cAAe6C,GACf,OAAQA,GACR,QAASA,GACT,MAAOA,GACT,GAEJ,GACF,CAEJ,CACF,GAEAhD,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CACJ,KAAM,CAAC8C,EAAOC,CAAM,CACtB,EAAI/C,EAEJ,SACE,QAAC,QAAK,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,KAAK,IAAI,EAAG8C,CAAK,EAAG,OAAQ,KAAK,IAAI,EAAGC,CAAM,EAAG,CAE5F,CAAC,GAEDlD,EAAA,iBAAaG,GACJgD,GAAmBhD,EAAO,KAAK,WAAW,GAGnDH,EAAA,oBAAe,CAACoD,EAASC,IAChBA,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,OAASC,EAAK,OAASD,EAAK,MAGpFpD,EAAA,iBAAY,CACVG,EACAmD,EACA,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,gBAAAC,CAAgB,KAU3B,CACL,MATY,OAAI,QAAQ,CACxBH,EAAO,MACJA,EAAO,MAAQnD,EAAM,KAAK,KAAOoD,EAAS,EAAI,EAAIE,EAAgB,GAAKA,EAAgB,IAC1FH,EAAO,MACJA,EAAO,OAASnD,EAAM,KAAK,KACzBqD,EAAS,EAAI,EAAIC,EAAgB,GAAKA,EAAgB,GAC7D,CAAC,CAID,IAGFzD,EAAA,uBAAmBG,GACVA,GAGTH,EAAA,qBAAgB,CAACG,EAAUuD,IAA2C,CA1SxE,IAAAC,EAAAC,EA2SI,IAAMN,EAAS,KAAK,UAAUnD,CAAK,EAE7BwC,EAAQ1B,GAAoBd,EAAM,MAAOuD,CAAU,EAEnDG,EAAWC,GAAkB3D,EAAM,MAAM,IAAI,IAAKwD,EAAAxD,EAAM,MAAM,QAAZ,KAAAwD,EAAqB,GACvEI,EAAaC,GAAY7D,EAAM,MAAM,KAAMA,EAAM,MAAM,UAAU,EAAE,MAAM,EAAG,EAAE,EAC9E8D,GAAYL,EAAAzD,EAAM,MAAM,YAAZ,KAAAyD,UAEZM,EAAUC,GACdhE,EAAM,KACN0D,EACAE,EACAE,EACAX,EAAO,MAAQf,GAAU,EACzB,EACF,EAEA2B,EAAQ,aAAa,OAAQvB,EAAM,KAAK,EACxCuB,EAAQ,aAAa,YAAa,aAAa3B,OAAYA,KAAU,EAErE,IAAM6B,EAAI,SAAS,gBAAgB,6BAA8B,GAAG,EAC9DC,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EAC1E,OAAAA,EAAK,aAAa,QAASf,EAAO,MAAQ,EAAE,EAC5Ce,EAAK,aAAa,SAAUf,EAAO,OAAS,EAAE,EAC9Ce,EAAK,aAAa,OAAQ1B,EAAM,IAAI,EAChCA,EAAM,SACR0B,EAAK,aAAa,SAAU1B,EAAM,MAAM,EACxC0B,EAAK,aAAa,eAAgB,GAAG,GAEvCA,EAAK,aAAa,KAAM,GAAG,EAC3BA,EAAK,aAAa,KAAM,GAAG,EAE3BD,EAAE,YAAYC,CAAI,EAClBD,EAAE,YAAYF,CAAO,EAEdE,CACT,GACF,EAMM7B,GAAU,GACVD,GAAuB,IAEvBO,GAAwByB,EAAO,MAAO,CAC1C,cAAe,MACf,SAAU,WACV,gBAAiB,sBACjB,WAAY,aACZ,OAAQ,OACR,MAAO,OACP,QAAS/B,GAAU,KACnB,aAAc,MACd,YAAa,QACb,SAAU,CACR,QAAS,CACP,MAAO,CAAE,QAAS,CAAE,EACpB,KAAM,CAAE,WAAY,cAAe,QAAS,EAAgB,CAC9D,EACA,WAAY,CACV,KAAM,CACJ,UACE,0FACJ,EACA,MAAO,CACL,UACE,6FACJ,CACF,CACF,CACF,CAAC,EAEKgC,GAAqB,CACzB,WAAY,WACZ,aAAc,aACd,cAAeC,EACjB,EAEM1B,GAAawB,EAAO,MAAOvC,EAAA,CAC/B,SAAU,WACV,IAAKQ,GACL,KAAMA,GACN,MAAO,eAAeA,GAAU,OAChC,OAAQ,cACR,KAAM,UACN,cAAe,OACf,WAAY,OACZ,SAAU,CACR,UAAW,CACT,KAAM,CACJ,QAAS,CACX,EACA,MAAO,CACL,QAAS,CACX,CACF,EACA,UAAW,CACT,UAAoB,CAClB,UAAW,MACb,EACA,WAAqB,CACnB,UAAW,QACb,EACA,QAAkB,CAChB,UAAW,OACb,EACA,YAAsB,CACpB,UAAW,SACb,CACF,CACF,GACGgC,GACJ,EAEKxB,GAAiBuB,EAAO,WAAYxC,EAAAC,EAAA,CACxC,MAAO,OACP,OAAQ,OACR,OAAQ,OACR,SAAU,SACV,WAAY,OACZ,QAAS,OACT,UAAW,OACX,KAAM,UACN,QAAS,EACT,MAAO,cACP,cAAe,MACf,OAAQ,OACR,WAAY,SACTwC,IAdqC,CAexC,SAAU,CACR,UAAW,CACT,UAAoB,CAClB,UAAW,MACb,EACA,WAAqB,CACnB,UAAW,QACb,EACA,QAAkB,CAChB,UAAW,OACb,EACA,YAAsB,CACpB,UAAW,SACb,CACF,CACF,EACA,UAAW,CACT,QAAS,OACT,OAAQ,MACV,CACF,EAAC,EClcD,IAAAE,GAAuB,oBACvBC,GAA+C,sBAC/CC,GAAoB,qBAFpB,IAAAC,GAAA,6BAuBaC,GAAN,cAAuBC,EAAkB,CAAzC,kCACLC,EAAA,oBAEAA,EAAA,2BAAsB,IAEtBA,EAAA,eAAU,IAEVA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,uBAAkB,GAAmB,GAErCA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,YACA,KAAM,OACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,EACV,KAAM,IACN,MAAOC,EACT,EACAD,CACF,GAGFD,EAAA,aAAQ,IAAI,KAEZA,EAAA,iBAAYD,GAAY,UACtB,CAAC,CAAE,MAAAI,EAAO,UAAAC,EAAW,QAAAC,EAAS,UAAAC,EAAW,YAAAC,EAAa,cAAAC,EAAe,KAAAC,EAAM,OAAAC,CAAO,EAAGC,IAAQ,CAC3F,GAAM,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAIV,EAClBW,EAASC,GAAcF,EAAOJ,EAAK,UAAU,EAC7CO,EAAOC,GAAad,EAAM,KAAK,EAC/Be,EAAe,UAA4B,IAAI,EAC/CC,EAAmB,UAAO,EAAK,EAE/BC,EAAoB,UAAOR,CAAI,EAE/B,mBAAgB,IAAM,CAC1B,GAAIA,IAASQ,EAAY,QAAS,CAChC,IAAIC,EAAQ,CAAC,EAAG,CAAC,EACjB,KAAK,MAAM,IAAIlB,EAAM,GAAIS,CAAI,EAC7B,IAAMU,EAAgB,KAAK,UAAUnB,CAAK,EACpCoB,EAAa,KAAK,UAAUpB,CAAK,EACvC,OAAQA,EAAM,MAAM,uBAEhB,mBAEsB,CACtBkB,EAAQ,OAAI,IAAI,CAACE,EAAW,MAAQD,EAAc,MAAO,CAAC,EAAG,CAAC,EAC9D,KACF,WACqB,CACnBD,EAAQ,CAACE,EAAW,MAAQD,EAAc,MAAO,CAAC,EAClD,KACF,EAGFF,EAAY,QAAUR,EAEtBJ,GAAA,MAAAA,EAAgBgB,EAAAC,EAAA,GACXtB,GADW,CAEd,GAAIA,EAAM,GACV,MAAO,OAAI,IAAIA,EAAM,MAAOkB,CAAK,EACjC,KAAAT,CACF,GACF,CACF,EAAG,CAACA,CAAI,CAAC,EAET,IAAMc,EAAqB,eACxBC,GAA8C,CAC7C,IAAIN,EAAQ,CAAC,EAAG,CAAC,EACXO,EAAUC,EAAK,cAAcF,EAAE,cAAc,KAAK,EAClDL,EAAgB,KAAK,UAAUnB,CAAK,EAC1C,KAAK,MAAM,IAAIA,EAAM,GAAIyB,CAAO,EAChC,IAAML,EAAa,KAAK,UAAUC,EAAAC,EAAA,GAC7BtB,GAD6B,CAEhC,KAAMyB,CACR,EAAC,EAED,OAAQzB,EAAM,MAAM,uBAEhB,mBAEsB,CACtBkB,EAAQ,OAAI,IAAI,CAACE,EAAW,MAAQD,EAAc,MAAO,CAAC,EAAG,CAAC,EAC9D,KACF,WACqB,CACnBD,EAAQ,CAACE,EAAW,MAAQD,EAAc,MAAO,CAAC,EAClD,KACF,EAGFF,EAAY,QAAUQ,EAEtBpB,GAAA,MAAAA,EAAgBgB,EAAAC,EAAA,GACXtB,GADW,CAEd,GAAIA,EAAM,GACV,MAAO,OAAI,IAAIA,EAAM,MAAOkB,CAAK,EACjC,KAAMO,CACR,GACF,EACA,CAACzB,EAAM,GAAIA,EAAM,KAAK,CACxB,EAEM2B,EAAsB,eACzBH,GAAgD,CAC/C,GAAIA,EAAE,MAAQ,SAAU,CACtBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBpB,GAAA,MAAAA,IACA,MACF,CAEA,GAAIoB,EAAE,MAAQ,OAASxB,EAAM,KAAK,SAAW,EAAG,CAC9CwB,EAAE,eAAe,EACjB,MACF,CAEA,GAAIA,EAAE,MAAQ,UAAYA,EAAE,SAAWA,EAAE,SAAU,CACjDA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBT,EAAO,QAAS,KAAK,EACrB,MACF,CAEA,GAAI,EAAES,EAAE,MAAQ,QAAUA,EAAE,SAC1BA,EAAE,gBAAgB,UACTA,EAAE,MAAQ,KAAOA,EAAE,QAAS,CACjCA,EAAE,SACJ,SAAS,YAAY,OAAQ,EAAK,EAElC,SAAS,YAAY,OAAQ,EAAK,EAEpCA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjB,MACF,EACKA,EAAE,SAAWA,EAAE,UAAYA,EAAE,MAAQ,KACxCA,EAAE,eAAe,EAEfA,EAAE,MAAQ,QACZA,EAAE,eAAe,EACbA,EAAE,SACJI,GAAc,SAASJ,EAAE,aAAa,EAEtCI,GAAc,OAAOJ,EAAE,aAAa,EAGtCnB,GAAA,MAAAA,EAAgBgB,EAAAC,EAAA,GAAKtB,GAAL,CAAY,KAAM0B,EAAK,cAAcF,EAAE,cAAc,KAAK,CAAE,IAEhF,EACA,CAACxB,EAAOK,CAAa,CACvB,EAEMwB,EAAmB,eAAaL,GAA6C,CACjFA,EAAE,cAAc,kBAAkB,EAAG,CAAC,EACtCpB,GAAA,MAAAA,GACF,EAAG,CAAC,CAAC,EAEC0B,EAAoB,eACvBN,GAA6C,CACxC,CAACrB,GACD,CAACa,EAAW,SACZ,SAAS,gBAAkBQ,EAAE,eAC/BA,EAAE,cAAc,OAAO,CAE3B,EACA,CAACrB,CAAS,CACZ,EAEM4B,EAA0B,eAC7BP,GAAgE,CAC3DrB,GACFqB,EAAE,gBAAgB,CAEtB,EACA,CAACrB,CAAS,CACZ,EAEM6B,EAAoB,UAAO7B,CAAS,EAE1C,OAAM,aAAU,IAAM,CAChBA,GACF6B,EAAY,QAAU,GACtB,KAAK,MAAM,IAAIhC,EAAM,GAAIS,CAAI,EAC7B,sBAAsB,IAAM,CAC1BO,EAAW,QAAU,GACrB,IAAMiB,EAAMlB,EAAO,QACfkB,IACFA,EAAI,MAAM,EACVA,EAAI,OAAO,EAEf,CAAC,GACQD,EAAY,UACrBA,EAAY,QAAU,GACtB5B,GAAA,MAAAA,IAEJ,EAAG,CAACD,CAAS,CAAC,KAGZ,QAAC,iBAAAkB,EAAAC,EAAA,CAAc,IAAKd,GAASD,GAA5B,CACC,oBAAC2B,GAAA,CACC,QAAShC,EACT,UAAWC,EACX,cAAe4B,EACf,MAAO,CAAE,QAAS7B,EAAU,OAAYS,EAAO,OAAQ,EAEvD,qBAACwB,GAAA,CACC,MAAOb,EAAA,CACL,KAAAT,EACA,MAAQH,EAAM,cAAgB,CAACP,EAAa,cAAgBQ,EAAO,OACnE,UAAWyB,GAAa1B,EAAM,SAAS,EACvC,MAAOV,EAAM,KAAO,GAAGA,EAAM,KAAK,OAAS,OAC3C,WAAYA,EAAM,KAAO,WAAa,MACtC,UAAWA,EAAM,KAAO,aAAe,SACvC,aAAcA,EAAM,KAAO,aAAe,UACtCU,EAAM,cAAgB,CAACP,EAAY,CACrC,WAAYkC,GAAiB3B,EAAM,YAAY,EAC/C,qBAAsB,OACtB,eAAgB,MAClB,EAAI,CAAC,GAGN,UAAAT,MACC,QAAC,OACC,UAAU,uBACV,MAAO,CACL,SAAU,WACV,IAAK,CAAC,KAAK,gBACX,KAAM,CAAC,KAAK,gBACZ,MAAO,eAAe,KAAK,gBAAkB,OAC7C,OAAQ,eAAe,KAAK,gBAAkB,OAC9C,gBAAiB,sBACnB,EACF,EAEDE,KACC,QAACmC,GAAA,CACC,IAAKvB,EACL,MAAO,CACL,KAAAF,EACA,MAAOF,EAAO,MAChB,EACA,KAAK,OACL,SAAU,GACV,aAAa,QACb,eAAe,QACf,YAAY,QACZ,SAAS,QACT,UAAS,GACT,YAAY,GACZ,WAAW,OACX,KAAK,MACL,IAAI,OACJ,SAAS,UACT,aAAcF,EACd,MAAOE,EAAO,OACd,QAASmB,EACT,SAAUP,EACV,UAAWI,EACX,OAAQE,EACR,cAAeE,EACf,cAAeQ,GACf,OAAQA,GACR,QAASA,GACT,MAAOA,GACT,EAEA9B,EACA,UAEJ,EACF,GACF,CAEJ,CACF,GAEAZ,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CAAE,MAAAwC,EAAO,OAAAC,CAAO,EAAI,KAAK,UAAUzC,CAAK,EAC9C,SAAO,QAAC,QAAK,EAAG,EAAG,EAAG,EAAG,MAAOwC,EAAO,OAAQC,EAAQ,CACzD,CAAC,GAED5C,EAAA,iBAAaG,GAAa,CACxB,IAAM0C,EAAS,SAAM,aAAa,KAAK,YAAa1C,EAAO,IAAM,CAzTrE,IAAA2C,EA0TM,GAAI,CAACC,GAEH,MAAO,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,GAAI,KAAM,GAAI,MAAO,GAAI,OAAQ,EAAG,EAGlEA,GAAK,YAAY,SAAS,KAAK,YAAYA,EAAI,EAEpDA,GAAK,MAAM,KAAO9B,GAAad,EAAM,KAAK,EAC1C4C,GAAK,aAAcD,EAAA,KAAK,MAAM,IAAI3C,EAAM,EAAE,IAAvB,KAAA2C,EAA4B3C,EAAM,KAEjDA,EAAM,MACR4C,GAAK,MAAM,WAAa,WACxBA,GAAK,MAAM,UAAY,aACvBA,GAAK,MAAM,aAAe,aAC1BA,GAAK,MAAM,MAAQ,GAAG5C,EAAM,KAAK,SAEjC4C,GAAK,MAAM,WAAa,MACxBA,GAAK,MAAM,UAAY,SACvBA,GAAK,MAAM,aAAe,SAC1BA,GAAK,MAAM,MAAQ,QAIrB,IAAMJ,EAAQxC,EAAM,KAAOA,EAAM,KAAK,GAAK4C,GAAK,aAAe,EACzDH,EAASG,GAAK,cAAgB,EAEpC,MAAO,CACL,KAAM,EACN,KAAMJ,EACN,KAAM,EACN,KAAMC,EACN,MAAAD,EACA,OAAAC,CACF,CACF,CAAC,EAED,OAAO,SAAM,gBAAgBC,EAAQ1C,EAAM,KAAK,CAClD,GAEAH,EAAA,oBAAe,CAACgD,EAASC,IAErBA,EAAK,OAASD,EAAK,MACnBC,EAAK,MAAM,QAAUD,EAAK,MAAM,OAChCC,EAAK,QAAUD,EAAK,OACpBC,EAAK,OAASD,EAAK,MAIvBhD,EAAA,iBAAY,CACVG,EACA0C,EACA,CAAE,aAAAK,EAAc,OAAAC,EAAQ,OAAAC,CAAO,IAChB,CACf,GAAM,CACJ,SAAAC,EAAW,EACX,MAAO,CAAE,MAAAC,EAAQ,CAAE,CACrB,EAAIJ,EAEEK,EAAYD,EAAQ,KAAK,IAAI,KAAK,IAAIH,EAAQC,CAAM,CAAC,EAE3D,MAAO,CACL,MAAO,CAACP,EAAO,KAAMA,EAAO,IAAI,EAChC,KAAM,CAACA,EAAO,MAAOA,EAAO,MAAM,EAClC,SACGM,EAAS,GAAKC,GAAU,GAAOA,EAAS,GAAKD,GAAU,EAAK,EAAEE,GAAY,GAAKA,EAClF,MAAO7B,EAAAC,EAAA,GAAKyB,EAAa,OAAlB,CAAyB,MAAOK,CAAU,EACnD,CACF,GAEAvD,EAAA,uBAAkB,CAChBG,EACA0C,EACA,CAAE,aAAAK,EAAc,OAAAC,EAAQ,OAAAC,CAAO,KAExB,CACL,MAAO,OAAI,QAAQ,CAACP,EAAO,KAAMA,EAAO,IAAI,CAAC,EAC7C,KAAM,CAACA,EAAO,MAAOA,EAAO,MAAM,CACpC,IAGF7C,EAAA,iCAA6BG,GAAa,CACxC,IAAMqD,EAAS,KAAK,UAAUrD,CAAK,EAE7BsD,EAAY,KAAK,UAAUjC,EAAAC,EAAA,GAC5BtB,GAD4B,CAE/B,MAAOqB,EAAAC,EAAA,GACFtB,EAAM,OADJ,CAEL,MAAO,CACT,EACF,EAAC,EAED,MAAO,CACL,MAAOqB,EAAAC,EAAA,GACFtB,EAAM,OADJ,CAEL,MAAO,CACT,GACA,MAAO,OAAI,QAAQ,OAAI,IAAIA,EAAM,MAAO,OAAI,IAAIqD,EAAQC,CAAS,CAAC,CAAC,CACrE,CACF,GAEAzD,EAAA,qBAAgB,CAACG,EAAUuD,IAA2C,CA9ZxE,IAAAZ,EAAAa,EA+ZI,IAAMd,EAAS,KAAK,UAAU1C,CAAK,EAC7BU,EAAQE,GAAcZ,EAAM,MAAOuD,CAAU,EAE7CE,EAAWC,GAAY1D,EAAM,MAAM,KAAMA,EAAM,MAAM,IAAI,IAAK2C,EAAA3C,EAAM,MAAM,QAAZ,KAAA2C,EAAqB,GACnFgB,EAAaC,GAAY5D,EAAM,MAAM,IAAI,EAAE,MAAM,EAAG,EAAE,EACtD6D,GAAYL,EAAAxD,EAAM,MAAM,YAAZ,KAAAwD,WAEZM,EAAUC,GACd/D,EAAM,KACNyD,EACAE,EACAE,EACA7D,EAAM,KAAOA,EAAM,KAAK,GAAK0C,EAAO,MACpC,CAAC,CAAC1C,EAAM,IACV,EAEA,OAAA8D,EAAQ,aAAa,OAAQpD,EAAM,MAAM,EAElCoD,CACT,GACF,EAMIlB,GAEJ,SAASoB,IAAoB,CA3b7B,IAAArB,GA6bEA,EAAA,SAAS,eAAe,eAAe,IAAvC,MAAAA,EAA0C,SAE1C,IAAMsB,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,GAAK,gBAET,OAAO,OAAOA,EAAI,MAAO,CACvB,WAAY,MACZ,MAAO,OACP,OAAQ,wBACR,QAAS,MACT,OAAQ,MACR,cAAeC,GACf,QAAS,IACT,SAAU,WACV,IAAK,SACL,KAAM,MACN,OAAQ,OACR,cAAe,OACf,WAAY,OACZ,kBAAmB,eACnB,iBAAkB,cACpB,CAAC,EAEDD,EAAI,SAAW,GAEf,SAAS,KAAK,YAAYA,CAAG,EACtBA,CACT,CAEI,OAAO,QAAW,cACpBrB,GAAOoB,GAAkB,GAG3B,IAAM9B,GAAUiC,EAAO,MAAO,CAC5B,MAAO,OACP,OAAQ,OACR,SAAU,CACR,QAAS,CACP,MAAO,CAAE,QAAS,CAAE,EACpB,KAAM,CAAE,WAAY,cAAe,QAAS,EAAgB,CAC9D,EACA,UAAW,CACT,MAAO,CACL,cAAe,MACf,WAAY,KACd,EACA,KAAM,CACJ,cAAe,OACf,WAAY,MACd,CACF,CACF,CACF,CAAC,EAEKC,GAAqB,CACzB,WAAY,WACZ,aAAc,YAChB,EAEMjC,GAAegC,EAAO,MAAO7C,EAAA,CACjC,SAAU,WACV,MAAO,OACP,OAAQ,OACR,QAAS,MACT,OAAQ,EACR,UAAW,EACX,SAAU,EACV,WAAY,EACZ,cAAe4C,GACf,QAAS,EACT,WAAY,MACZ,mBAAoB,SACpB,WAAY,OACZ,cAAe,OACf,iBAAkB,OAClB,mBAAoB,OACpB,UAAW,CACT,MAAO,CAAC,EACR,KAAM,CACJ,cAAe,MACf,WAAY,YACZ,WAAY,OACZ,iBAAkB,MACpB,CACF,GACGE,GACJ,EAEK9B,GAAW6B,EAAO,WAAY9C,EAAAC,EAAA,CAClC,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,OACP,OAAQ,OACR,OAAQ,OACR,QAAS,MACT,OAAQ,OACR,UAAW,UACX,UAAW,UACX,SAAU,UACV,WAAY,UACZ,cAAe,UACf,QAAS,EACT,WAAY,UACZ,SAAU,SACV,mBAAoB,SACpB,QAAS,eACT,cAAe,MACf,WAAY,YACZ,WAAY,OACZ,iBAAkB,QACf8C,IAxB+B,CAyBlC,UAAW,CACT,QAAS,OACT,OAAQ,MACV,CACF,EAAC,ECljBD,IAAAC,GAAuB,oBACvBC,GAA8C,sBAC9CC,GAIO,2BACPC,GAAgB,wBCPhB,IAAAC,GAAuB,oBACvBC,GAAsB,sBACtBC,GAAgB,wBCFhB,IAAAC,GAA2C,+BAC3CC,GAAsB,sBACtBC,GAAgB,wBAIT,SAASC,GAAkBC,EAAgBC,EAAS,EAAGC,EAAW,EAAG,CAC1E,GAAM,CAACC,EAAGC,CAAC,EAAIJ,EACXK,EAAS,CACX,CAACF,EAAI,EAAG,CAAC,EACT,CAACA,EAAGC,CAAC,EACL,CAAC,EAAGA,CAAC,CACP,EACA,OAAIH,IAAQI,EAASC,GAAiBD,EAAQJ,CAAM,GAChDC,IAAUG,EAASA,EAAO,IAAKE,GAAO,GAAAC,QAAI,QAAQD,EAAI,CAACJ,EAAI,EAAGC,EAAI,CAAC,EAAGF,CAAQ,CAAC,GAE5EG,CACT,CAEO,SAASI,GAAoBT,EAAgB,CAClD,GAAM,CAACG,EAAGC,CAAC,EAAIJ,EACTK,EAAS,CACb,CAACF,EAAI,EAAG,CAAC,EACT,CAACA,EAAGC,CAAC,EACL,CAAC,EAAGA,CAAC,CACP,EACA,MAAO,EACJC,EAAO,GAAG,GAAKA,EAAO,GAAG,GAAKA,EAAO,GAAG,IAAM,GAC9CA,EAAO,GAAG,GAAKA,EAAO,GAAG,GAAKA,EAAO,GAAG,IAAM,CACjD,CACF,CAEA,SAASK,GAAsBC,EAAYX,EAAgBY,EAAqB,CAC9E,GAAM,CAACT,EAAGC,CAAC,EAAIJ,EACTa,EAAY,SAAM,IAAIF,CAAE,EAExBG,EAAU,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,IAChC,CAACD,EAAU,EAAID,EAAc,IAAMC,EAAU,EAAID,EAAc,GAAI,CAC3E,EAEKG,EAAU,CACd,GAAAP,QAAI,IAAI,CAACL,EAAI,EAAG,CAAC,EAAGW,EAAQ,EAAE,EAC9B,GAAAN,QAAI,IAAI,CAACL,EAAGC,CAAC,EAAGU,EAAQ,EAAE,EAC1B,GAAAN,QAAI,IAAI,CAAC,EAAGJ,CAAC,EAAGU,EAAQ,EAAE,CAC5B,EAEME,EAAK,KAAK,MAAM,KAAK,IAAIH,EAAU,EAAI,EAAI,CAAC,CAAC,EAI7CI,EAAQ,SAAM,YAClB,CACE,GAAAT,QAAI,cAAcO,EAAQ,GAAIA,EAAQ,GAAI,EAAE,EAC5C,GAAAP,QAAI,cAAcO,EAAQ,GAAIA,EAAQ,GAAI,EAAE,EAC5C,GAAAP,QAAI,cAAcO,EAAQ,GAAIA,EAAQ,GAAI,EAAE,CAC9C,EACAC,CACF,EAMA,MAAO,CACL,OAFa,CAAC,GAAGC,EAAM,KAAK,EAAG,GAAGA,EAAM,EAAE,CAG5C,CACF,CAEA,SAASC,GAAkBP,EAAYX,EAAgBmB,EAAoB,CACzE,GAAM,CAAE,YAAAP,CAAY,EAAIQ,GAAcD,CAAK,EACrC,CAAE,OAAAd,CAAO,EAAIK,GAAsBC,EAAIX,EAAMY,CAAW,EAS9D,MAAO,CAAE,OAAAP,EAAQ,QARD,CACd,KAAMO,EACN,SAAU,IACV,WAAY,GACZ,UAAW,EACX,iBAAkB,GAClB,KAAM,EACR,CACyB,CAC3B,CAEO,SAASS,GAAgBV,EAAYX,EAAgBmB,EAAoB,CAC9E,GAAM,CAAE,OAAAd,EAAQ,QAAAiB,CAAQ,EAAIJ,GAAkBP,EAAIX,EAAMmB,CAAK,EACvDI,KAAS,GAAAC,SAAUnB,EAAQiB,CAAO,EACxC,OAAO,SAAM,qBAAqBC,CAAM,CAC1C,CAEO,SAASE,GAAmCd,EAAYX,EAAgBmB,EAAoB,CACjG,GAAM,CAAE,OAAAd,EAAQ,QAAAiB,CAAQ,EAAIJ,GAAkBP,EAAIX,EAAMmB,CAAK,EAC7D,OAAO,SAAM,8BAA2B,oBAAgBd,EAAQiB,CAAO,CAAC,CAC1E,CD3FA,IAAAI,GAAA,6BAeaC,GAAuB,QAAK,SAAwB,CAC/D,GAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAqB,CACnB,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcN,EAAOE,CAAU,EAC/D,CAAE,KAAAK,EAAM,SAAAC,CAAS,EAAIC,GAAgBX,EAAIE,CAAK,EAC9CU,EAAaF,GAAA,KAAAA,EAAYH,EACzBM,EAAK,EAAIP,EAAc,MACvBQ,EAASC,GAAkBd,CAAI,EAE/Be,EADQ,SAAM,qBAAqBF,EAAQ,EAAI,EACjC,IAAI,CAAC,CAACG,EAAOC,CAAG,EAAGC,IAAM,CAC3C,GAAM,CAAE,gBAAAC,EAAiB,iBAAAC,CAAiB,EAAI,SAAM,oBAClD,GAAAC,QAAI,KAAKL,EAAOC,CAAG,EACnBZ,EAAc,MACdJ,EAAM,IACR,EAEA,SACE,QAAC,QAEC,GAAIe,EAAM,GACV,GAAIA,EAAM,GACV,GAAIC,EAAI,GACR,GAAIA,EAAI,GACR,OAAQb,EACR,YAAaQ,EACb,cAAc,QACd,gBAAiBO,EACjB,iBAAkBC,GATbrB,EAAK,IAAMmB,CAUlB,CAEJ,CAAC,EAEKI,EAAST,EAAO,KAAK,EAE3B,SACE,sBACG,UAAAL,KACD,QAAC,WACC,UAAWP,EAAM,UAAYC,EAAa,kBAAoB,oBAC9D,OAAQoB,EACV,EACCrB,EAAM,aAAY,QAAC,WAAQ,KAAMU,EAAY,OAAQW,EAAQ,cAAc,OAAO,KACnF,QAAC,KAAE,cAAc,SAAU,SAAAP,EAAM,GACnC,CAEJ,CAAC,EEhED,IAAAQ,GAAuB,oBAAvB,IAAAC,GAAA,6BAaaC,GAAqB,QAAK,SAAsB,CAC3D,GAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,CACF,EAAqB,CACnB,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,KAAAC,CAAK,EAAIC,GAAcN,EAAOE,CAAU,EAC/D,CAAE,KAAAK,EAAM,SAAAC,CAAS,EAAIC,GAAgBX,EAAIE,CAAK,EAC9CU,EAAaF,GAAA,KAAAA,EAAYH,EACzBM,EAAiBC,GAAgBd,EAAIC,EAAMC,CAAK,EAChDa,EAAgBC,GAAmChB,EAAIC,EAAMC,CAAK,EACxE,SACE,sBACG,UAAAO,KACD,QAAC,QACC,UAAWP,EAAM,UAAYC,EAAa,kBAAoB,oBAC9D,EAAGY,EACL,EACCb,EAAM,aAAY,QAAC,QAAK,EAAGa,EAAe,KAAMH,EAAY,cAAc,OAAO,KAClF,QAAC,QACC,EAAGC,EACH,KAAMR,EACN,OAAQA,EACR,YAAaC,EACb,cAAc,OAChB,GACF,CAEJ,CAAC,EC1CD,IAAAW,GAAA,6BAQO,SAASC,GAAyB,CAAE,KAAAC,CAAK,EAAkC,CAChF,IAAMC,EAAiBC,GAAkBF,CAAI,EAAE,KAAK,EACpD,SACE,QAAC,WACC,UAAU,uBACV,OAAQC,EACR,YAAa,GAAmB,EAClC,CAEJ,CJjBA,IAAAE,GAAA,6BA8BaC,GAAN,cAA2BC,EAAkB,CAA7C,kCACLC,EAAA,wBAEAA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,eAAU,IAEVA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,KACJ,gBACA,KAAM,WACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,EAAG,CAAC,EACX,SAAU,EACV,MAAOC,GACP,MAAO,GACP,WAAY,CAAC,GAAK,EAAG,CACvB,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CACE,CACE,MAAAI,EACA,OAAAC,EACA,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,QAAAC,EACA,KAAAC,EACA,OAAAC,EACA,cAAAC,EACA,YAAAC,CACF,EACAC,IACG,CAzET,IAAAC,GAAAC,GA0EM,GAAM,CAAE,GAAAC,EAAI,MAAAC,EAAQ,GAAI,KAAAC,EAAM,MAAAC,EAAO,WAAAC,EAAaC,EAAY,EAAIlB,EAC5DmB,EAAOC,GAAaJ,CAAK,EACzBK,EAASC,GAAcN,EAAOV,EAAK,UAAU,EAE7CiB,EAAY,EADCjB,EAAK,aAAe,aACNU,EAAM,cAA0BQ,GAAeC,GAC1EC,EAA0B,eAC7BZ,IAAkBN,GAAA,YAAAA,EAAgB,CAAE,GAAAK,EAAI,MAAAC,EAAM,GAC/C,CAACN,CAAa,CAChB,EACMmB,EAAgB,WAAQ,IAAM,CAClC,IAAMC,GAAS,GAAAC,QAAI,IAAId,EAAM,CAAC,EAE9B,OADiBe,GAAoBf,CAAI,EACxB,GAAKa,GAAO,IAAM,GACrC,EAAG,CAACb,CAAI,CAAC,EAGHgB,EAAgBzB,EAAK,gBAAkBN,EAAM,GAC7CgC,EAAMC,EAAY,EAClBC,EAAgB,UAAwD,IAAI,EAC5E,CAACC,EAAaC,CAAc,EAAU,YAAwB,IAAI,EAClEC,GAAO1B,GAAAqB,EAAI,OAAJ,KAAArB,GAAY,EAEnB2B,GAAoB,WAAQ,IAAM,CACtC,GAAI,CAACP,EAAe,OAAO,KAC3B,GAAM,CAACQ,GAAGC,EAAC,EAAIzB,EACT0B,GAAsB,CAC1B,CAAC,EAAG,CAAC,EACL,CAACF,GAAG,CAAC,EACL,CAACA,GAAGC,EAAC,EACL,CAAC,EAAGA,EAAC,CACP,EACME,GAAY,CAAC,EAAG,EAAG,EAAG,CAAC,EACvBC,GAAI,EAAIN,EACRO,GAAK,EAAIP,EAGTQ,EAAQC,GAAkB/B,CAAI,EAEpC,SACE,SAAC,KAEE,UAAA8B,EAAM,IAAI,CAACE,GAAaC,KAAe,CACtC,IAAMC,EAAOJ,GAAOG,GAAK,GAAKH,EAAM,QACpC,SACE,QAAC,QAEC,GAAIE,GAAE,GACN,GAAIA,GAAE,GACN,GAAIE,EAAK,GACT,GAAIA,EAAK,GACT,OAAO,UACP,YAAaL,GACb,cAAe,GACf,cAAc,QART,MAAMI,IASb,CAEJ,CAAC,EAEAP,GAAQ,IAAI,CAAC,CAACS,GAAIC,EAAE,EAAGC,OACtB,QAAC,UAEC,GAAIF,GACJ,GAAIC,GACJ,EAAGhB,IAAgBiB,EAAKT,GAAI,IAAMA,GAClC,KAAMR,IAAgBiB,EAAK,UAAY,QACvC,OAAO,UACP,YAAa,IAAMf,EACnB,MAAO,CAAE,OAAQ,aAAc,EAC/B,eAAgB,IAAMD,EAAegB,CAAE,EACvC,eAAgB,IAAMhB,EAAe,IAAI,EACzC,cAAgBiB,GAAM,CACpBA,EAAE,gBAAgB,EAChBA,EAAE,cAAmC,kBAAkBA,EAAE,SAAS,EACpE,IAAMC,EAAab,GAAQC,GAAUU,IACrClB,EAAQ,QAAU,CAChB,QAASkB,EACT,UAAW,GAAAvB,QAAI,IAAI7B,EAAM,MAAOsD,CAAU,CAC5C,CACF,EACA,cAAgBD,GAAM,CACpB,GAAI,CAACnB,EAAQ,SAAWA,EAAQ,QAAQ,UAAYkB,EAAI,OACxDC,EAAE,gBAAgB,EAClB,IAAME,EAAKvB,EAAI,aAAa,CAACqB,EAAE,QAASA,EAAE,OAAO,CAAC,EAC5CG,GAAKtB,EAAQ,QAAQ,UACrBuB,EAAK,KAAK,IAAIF,EAAG,GAAIC,GAAG,EAAE,EAC9BE,GAAK,KAAK,IAAIH,EAAG,GAAIC,GAAG,EAAE,EACtBG,GAAK,KAAK,IAAIJ,EAAG,GAAIC,GAAG,EAAE,EAC9BI,GAAK,KAAK,IAAIL,EAAG,GAAIC,GAAG,EAAE,EAC5BxB,EAAI,WAAW,CACb,SAAU,CACR,MAAO,CACL,CAACA,EAAI,eAAgB,CACnB,OAAQ,CACN,CAAChC,EAAM,IAAK,CACV,MAAO,CAACyD,EAAIC,EAAE,EACd,KAAM,CAAC,KAAK,IAAI,EAAGC,GAAKF,CAAE,EAAG,KAAK,IAAI,EAAGG,GAAKF,EAAE,CAAC,CACnD,CACF,CACF,CACF,CACF,CACF,CAAC,CACH,EACA,YAAcL,GAAM,CAClB,GAAI,CAACnB,EAAQ,QAAS,OACtBmB,EAAE,gBAAgB,EAClB,IAAME,EAAKvB,EAAI,aAAa,CAACqB,EAAE,QAASA,EAAE,OAAO,CAAC,EAC5CG,GAAKtB,EAAQ,QAAQ,UACrBuB,EAAK,KAAK,IAAIF,EAAG,GAAIC,GAAG,EAAE,EAC9BE,GAAK,KAAK,IAAIH,EAAG,GAAIC,GAAG,EAAE,EACtBG,GAAK,KAAK,IAAIJ,EAAG,GAAIC,GAAG,EAAE,EAC9BI,GAAK,KAAK,IAAIL,EAAG,GAAIC,GAAG,EAAE,EAC5BtB,EAAQ,QAAU,KAClBF,EAAI,aAAa,CACf,GAAIhC,EAAM,GACV,MAAO,CAACyD,EAAIC,EAAE,EACd,KAAM,CAAC,KAAK,IAAI,EAAGC,GAAKF,CAAE,EAAG,KAAK,IAAI,EAAGG,GAAKF,EAAE,CAAC,CACnD,CAAC,CACH,GA1DK,MAAMN,GA2Db,CACD,GACH,CAEJ,EAAG,CAACrB,EAAehB,EAAMsB,EAAMF,EAAanC,EAAM,GAAIA,EAAM,MAAOgC,CAAG,CAAC,EAEjE6B,EAAc9B,EAAgB,CAAE,SAAU,SAAmB,EAAI,OAEvE,SACE,SAAC+B,GAAAC,EAAAC,EAAA,CAAY,IAAKtD,GAASH,GAA1B,CACC,qBAAC0D,GAAA,CACC,KAAM9C,EACN,KAAML,EACN,OAAOF,GAAAI,EAAM,aAAN,KAAAJ,GAAoBS,EAAO,OAClC,WAAYL,EAAM,gBAClB,aAAcA,EAAM,aACpB,SAAUC,EAAW,GAAK,IAAOhB,EAAO,MACxC,QAAS0B,GAAWV,EAAW,GAAK,IAAOhB,EAAO,OAClD,MAAO,KAAK,IAAI,EAAGA,EAAO,MAAQ,GAAM,EAAE,EAC1C,UAAWE,EACX,SAAUuB,EACV,OAAQjB,EACV,KACA,SAAC,iBACC,GAAIT,EAAM,GAAK,OACf,QAASK,EAAU,GAAkBgB,EAAO,QAC5C,MAAOwC,EAEN,UAAA3D,MAAa,QAACgE,GAAA,CAAyB,KAAMnD,EAAM,KACpD,QAACQ,EAAA,CACC,GAAIV,EACJ,MAAOG,EACP,KAAMD,EACN,WAAYX,EACZ,WAAYE,EAAK,WACnB,EACCgC,IACH,IACF,CAEJ,CACF,GAEAzC,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CAAE,KAAAe,CAAK,EAAIf,EACjB,SAAO,QAAC,WAAQ,OAAQ8C,GAAkB/B,CAAI,EAAE,KAAK,EAAG,CAC1D,CAAC,GAeDlB,EAAA,oBAAe,CAACsE,EAASlB,IAChBA,EAAK,OAASkB,EAAK,MAAQlB,EAAK,QAAUkB,EAAK,OAASlB,EAAK,QAAUkB,EAAK,OAGrFtE,EAAA,iBAAaG,GACJoE,GAAmBpE,EAAO,KAAK,WAAW,GAGnDH,EAAA,yBAAqBG,GACZ,SAAM,oBACX8C,GAAkB9C,EAAM,KAAM,KAAK,eAAe,EAAE,IAAKqE,GAAO,GAAAxC,QAAI,IAAIwC,EAAIrE,EAAM,KAAK,CAAC,CAC1F,GAGFH,EAAA,0BAAqB,CAACG,EAAUsE,EAAaC,OACpC,iCAA6BD,EAAGC,EAAG,KAAK,UAAUvE,CAAK,CAAC,EAAE,cAGnEH,EAAA,qBAAgB,CAACG,EAAUC,IAEvB,SAAM,gBAAgB,KAAK,UAAUD,CAAK,EAAGC,CAAM,MACnD,2BAAuBA,EAAQ,KAAK,UAAUD,CAAK,CAAC,EAAE,OAAS,GAInEH,EAAA,uBAAkB,CAChBG,EACAwE,EACAC,EACAC,EACAC,EACAC,IACG,CAGH,IAAMC,EAAiB,KAAK,kBAAkB7E,CAAK,EAEnD,GAAI,CAAC,SAAM,cAAcyE,EAAOI,CAAc,EAAG,OAEjD,IAAMC,EAAShC,GAAkB9C,EAAM,IAAI,EAAE,IAAKqE,GAAO,GAAAxC,QAAI,IAAIwC,EAAIrE,EAAM,KAAK,CAAC,EAE3E+E,EAAiBjC,GAAkB9C,EAAM,KAAM,KAAK,eAAe,EAAE,IAAKqE,GAC9E,GAAAxC,QAAI,IAAIwC,EAAIrE,EAAM,KAAK,CACzB,EAEMgF,EAAwB,SAAM,qBAAqBF,EAAQ,EAAI,EAClE,IAAI,CAAC,CAACG,EAAGC,CAAC,IAAM,GAAArD,QAAI,sBAAsBoD,EAAGC,EAAGT,CAAK,CAAC,EACtD,KAAK,CAACQ,EAAGC,IAAMD,EAAIC,CAAC,EAAE,GAEzB,GACE,EAAE,SAAM,eAAeT,EAAOM,CAAc,GAAKC,EAAwB,KAAK,iBAE9E,OAEF,IAAMG,EAAgB,SAAM,qBAAqBJ,EAAe,OAAO,CAACA,EAAe,EAAE,CAAC,CAAC,EACxF,IAAKK,MAAY,4BAAwBV,EAAQC,EAAWS,EAAQ,GAAIA,EAAQ,EAAE,CAAC,EACnF,OAAQC,GAAiBA,EAAa,YAAY,EAClD,QAASA,GAAiBA,EAAa,MAAM,EAEhD,GAAI,CAACF,EAAc,OAAQ,OAG3B,IAAMvD,EAAS,GAAAC,QAAI,IAAIC,GAAoB9B,EAAM,IAAI,EAAGA,EAAM,KAAK,EAG7DqF,EAAeF,EAAc,KAAK,CAACF,EAAGC,IAAM,GAAArD,QAAI,KAAKqD,EAAGR,CAAM,EAAI,GAAA7C,QAAI,KAAKoD,EAAGP,CAAM,CAAC,EAAE,GAGvFY,EAAc,GAAAzD,QAAI,IAAI4C,EAAOY,CAAY,EAE3CE,EACAC,EAEAZ,GACFW,EAAS,GAAA1D,QAAI,KAAK4C,EAAO7C,CAAM,EAAI,GAAmB,EAAIA,EAAS6C,EACnEe,EAAW,IAEP,GAAA3D,QAAI,sBAAsB4C,EAAOa,EAAa1D,CAAM,EAAI,GAAmB,EAC7E2D,EAAS3D,EAET2D,EAASD,EAGP,SAAM,eAAeb,EAAOK,CAAM,EACpCU,EAAW,KAAK,gBAEhBA,EAAW,KAAK,IAAI,KAAK,gBAAiBR,CAAqB,GAInE,IAAMS,EAAe,GAAA5D,QAAI,KAAK,GAAAA,QAAI,IAAI0D,EAAQ,CAACV,EAAe,KAAMA,EAAe,IAAI,CAAC,EAAG,CACzFA,EAAe,MACfA,EAAe,MACjB,CAAC,EAED,MAAO,CACL,MAAO,GAAAhD,QAAI,OAAO4D,EAAc,EAAG,CAAC,EACpC,SAAAD,CACF,CACF,GAEA3F,EAAA,iBAAY6F,IAEZ7F,EAAA,uBAAkB8F,IApHV,UAAU3F,EAAU,CAC1B,GAAM,CACJ,SAAA4F,EAAW,EACX,MAAO,CAACC,EAAGC,CAAC,EACZ,KAAM,CAACvD,EAAGC,CAAC,CACb,EAAIxC,EACJ,MAAO,CACL,CAAC6F,EAAItD,EAAI,EAAGuD,CAAC,EACb,CAACD,EAAGC,EAAItD,CAAC,EACT,CAACqD,EAAItD,EAAGuD,EAAItD,CAAC,CACf,EAAE,IAAK6B,GAAO,GAAAxC,QAAI,QAAQwC,EAAI,KAAK,UAAUrE,CAAK,EAAG4F,CAAQ,CAAC,CAChE,CA0GF,EAEM9B,GAAciC,EAAO,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAC,EKxWnE,IAAAC,GAAuB,2BACvBC,GAAuB,oBACvBC,GAAqC,sBAFrC,IAAAC,GAAA,6BAgBaC,GAAN,cAAwBC,EAAkB,CAA1C,kCACLC,EAAA,qBACAA,EAAA,eAAU,IACVA,EAAA,eAAU,IACVA,EAAA,gBAAW,IACXA,EAAA,2BAAsB,IACtBA,EAAA,wBAAmB,IACnBA,EAAA,kBAAa,IAEbA,EAAA,gBAAYC,GACH,SAAM,UACX,CACE,GAAI,QACJ,aACA,KAAM,QACN,SAAU,OACV,WAAY,EACZ,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CAAC,EAAG,CAAC,EACX,SAAU,EACV,MAAOC,GACP,QAAS,UACT,UAAW,GACX,YAAa,CACf,EACAD,CACF,GAGFD,EAAA,iBAAYD,GAAY,UACtB,CACE,CAAE,MAAAI,EAAO,MAAAC,EAAQ,CAAE,IAAK,EAAG,EAAG,UAAAC,EAAW,UAAAC,EAAW,QAAAC,EAAS,KAAAC,EAAM,OAAAC,EAAQ,cAAAC,CAAc,EACzFC,IACG,CACH,IAAMC,EAAe,UAAyB,IAAI,EAC5CC,EAAiB,UAAuB,IAAI,EAE5C,CAAE,YAAAC,EAAc,EAAG,KAAAC,EAAM,UAAAC,EAAW,MAAAC,CAAM,EAAId,EAE9C,mBAAgB,IAAM,CAC1B,IAAMe,EAAUL,EAAS,QACzB,GAAI,CAACK,EAAS,OACd,GAAM,CAACC,EAAOC,CAAM,EAAIL,EACxBG,EAAQ,MAAM,MAAQ,GAAGC,MACzBD,EAAQ,MAAM,OAAS,GAAGE,KAC5B,EAAG,CAACL,CAAI,CAAC,EAEH,mBAAgB,IAAM,CAC1B,IAAMM,EAAQT,EAAO,QACjB,CAACS,IACDL,EAAWK,EAAM,KAAK,EAErBA,EAAM,MAAM,EACnB,EAAG,CAACL,CAAS,CAAC,EAER,mBAAgB,IAAM,CAC1B,IAAMK,EAAQT,EAAO,QACjB,CAACS,GACDP,IAAgBO,EAAM,cACxBA,EAAM,YAAcP,EAExB,EAAG,CAACA,CAAW,CAAC,EAEhB,IAAMQ,EAAmB,eAAY,IAAM,CACzCZ,GAAA,MAAAA,EAAgB,CAAE,GAAIP,EAAM,GAAI,UAAW,EAAK,EAClD,EAAG,CAAC,CAAC,EAECoB,EAAoB,eAAY,IAAM,CAC1Cb,GAAA,MAAAA,EAAgB,CAAE,GAAIP,EAAM,GAAI,UAAW,EAAM,EACnD,EAAG,CAAC,CAAC,EAECqB,EAA6B,eAAY,IAAM,CACnD,IAAMH,EAAQT,EAAO,QACjB,CAACS,GACD,CAACf,GACLI,GAAA,MAAAA,EAAgB,CAAE,GAAIP,EAAM,GAAI,YAAakB,EAAM,WAAY,EACjE,EAAG,CAACf,CAAS,CAAC,EAEd,SACE,SAAC,iBAAAmB,EAAAC,EAAA,CAAc,IAAKf,GAASF,GAA5B,CACE,UAAAJ,MACC,QAAC,OACC,UAAU,uBACV,MAAO,CACL,SAAU,WACV,IAAK,CAAC,KAAK,gBACX,KAAM,CAAC,KAAK,gBACZ,MAAO,eAAe,KAAK,gBAAkB,OAC7C,OAAQ,eAAe,KAAK,gBAAkB,OAC9C,gBAAiB,sBACnB,EACF,KAEF,QAACsB,GAAA,CACC,IAAKd,EACL,WAAYL,EAAK,WACjB,QAASD,EACT,SAAUU,EAAM,SAEhB,oBAACW,GAAA,CACC,IAAKhB,EACL,GAAIT,EAAM,GAAK,SACf,MAAK,GACL,KAAI,GACJ,YAAW,GACX,sBAAqB,GACrB,wBAAuB,GACvB,SAAUG,EACV,SAAUU,EACV,OAAQM,EACR,QAASC,EACT,aAAcC,EAEd,oBAAC,UAAO,IAAMpB,EAAuB,IAAK,EAC5C,EACF,IACF,CAEJ,CACF,GAEAJ,EAAA,iBAAYD,GAAY,UAAa,CAAC,CAAE,MAAAI,CAAM,IAAM,CAClD,GAAM,CACJ,KAAM,CAACgB,EAAOC,CAAM,CACtB,EAAIjB,EAEJ,SACE,QAAC,QAAK,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,KAAK,IAAI,EAAGgB,CAAK,EAAG,OAAQ,KAAK,IAAI,EAAGC,CAAM,EAAG,CAE5F,CAAC,GAEDpB,EAAA,iBAAaG,GACJ0B,GAAmB1B,EAAO,KAAK,WAAW,GAGnDH,EAAA,oBAAe,CAAC8B,EAASC,IAChBA,EAAK,OAASD,EAAK,MAAQC,EAAK,QAAUD,EAAK,OAASC,EAAK,YAAcD,EAAK,WAGzF9B,EAAA,qBAAiBG,GAAsB,CACrC,IAAM6B,EAAS,KAAK,UAAU7B,CAAK,EAC7B8B,EAAM,SAAS,gBAAgB,6BAA8B,OAAO,EAC1E,OAAAA,EAAI,aAAa,QAAS,GAAGD,EAAO,OAAO,EAC3CC,EAAI,aAAa,SAAU,GAAGD,EAAO,QAAQ,EAC7CC,EAAI,aAAa,cAAe,8BAA8B,EACvDA,CACT,GAEAjC,EAAA,iBAAYkC,IAEZlC,EAAA,uBAAkBmC,IACpB,EAEMR,MAAU,WAAO,MAAO,CAC5B,cAAe,MACf,SAAU,WACV,WAAY,aACZ,SAAU,MACV,OAAQ,OACR,MAAO,OACP,aAAc,MACd,YAAa,QACb,SAAU,SACV,EAAG,CACD,WAAY,MACd,EACA,IAAK,CACH,WAAY,MACd,EACA,SAAU,CACR,QAAS,CACP,MAAO,CAAE,QAAS,CAAE,EACpB,KAAM,CAAE,WAAY,cAAe,QAAS,EAAgB,CAC9D,EACA,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CAAC,CACV,EACA,WAAY,CACV,KAAM,CAAC,EACP,MAAO,CAAC,CACV,CACF,EACA,iBAAkB,CAChB,CACE,SAAU,GACV,WAAY,GACZ,IAAK,CACH,UACE,0FACJ,CACF,EACA,CACE,SAAU,GACV,WAAY,GACZ,IAAK,CACH,UACE,6FACJ,CACF,CACF,CACF,CAAC,EAEKC,MAAe,WAAO,QAAS,CACnC,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,SAAU,OACV,SAAU,OACV,cAAe,OACf,UAAW,QACX,WAAY,OACZ,aAAc,CAChB,CAAC,ECxNM,IAAMQ,GAAY,IAAIC,GAChBC,GAAW,IAAIC,GACfC,GAAU,IAAIC,GACdC,GAAO,IAAIC,GACXC,GAAQ,IAAIC,GACZC,GAAO,IAAIC,GACXC,GAAQ,IAAIC,GACZC,GAAS,IAAIC,GACbC,GAAQ,IAAIC,GACZC,GAAQ,IAAIC,GACZC,GAAiB,IAAIC,GACrBC,GAAM,IAAIC,GAEVC,GAAa,CACxB,cAAyBxB,GACzB,aAAwBE,GACxB,YAAuBE,GACvB,SAAoBE,GACpB,UAAqBE,GACrB,SAAoBE,GACpB,UAAqBE,GACrB,WAAsBE,GACtB,UAAqBE,GACrB,UAAqBE,GACrB,mBAA8BE,GAC9B,QAAmBE,EACrB,EAEaG,GAAmCC,GAC1C,OAAOA,GAAU,SAAiBF,GAAWE,GAC1CF,GAAWE,EAAM,MjCvB1B,IAAMC,GAAQ,GACDC,EAAN,KAAW,CAGhB,OAAO,aAAgCC,EAAsB,CAC3D,OAAOC,GAAgBD,CAAK,CAC9B,CAEA,OAAO,kBAAkBE,EAAkBC,EAAgB,CACzD,IAAMC,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEtC,OADoBJ,EAAK,eAAeG,EAAMC,CAAM,EACjC,IAAKE,GAAOD,EAAK,OAAOC,EAAG,CAChD,CAEA,OAAO,cAAcH,EAAkBI,EAAiB,CACtD,IAAMC,EAASR,EAAK,aAAaG,EAAMA,EAAK,SAAS,aAAa,EAAE,OACpE,OAAO,MAAI,IAAI,MAAI,IAAII,EAAOC,EAAO,IAAI,EAAGA,EAAO,KAAK,CAC1D,CAEA,OAAO,cAAcC,EAAc,CACjC,OAAO,SAAM,MAAMA,EAAM,GAAK,CAAC,CACjC,CAEA,OAAO,QAAQN,EAAkBC,EAAwB,CACvD,OAAOD,EAAK,SAAS,MAAMC,EAC7B,CAEA,OAAO,aAAaD,EAAkBC,EAA6B,CACjE,OAAOD,EAAK,SAAS,WAAWC,EAClC,CAEA,OAAO,eAAeD,EAAkBC,EAA0B,CAChE,OAAOJ,EAAK,aAAaG,EAAMC,CAAM,EAAE,WACzC,CAEA,OAAO,UAAUD,EAAkBC,EAA2B,CAC5D,OAAO,OAAO,OAAOJ,EAAK,QAAQG,EAAMC,CAAM,EAAE,MAAM,CACxD,CAEA,OAAO,UAAUD,EAAkBC,EAAuC,CACxE,OAAOJ,EAAK,aAAaG,EAAMC,CAAM,EAAE,MACzC,CAEA,OAAO,SACLD,EACAO,EACAN,EACG,CACH,OAAOJ,EAAK,QAAQG,EAAMC,CAAM,EAAE,OAAOM,EAC3C,CAEA,OAAO,UAA6BT,EAAU,CAC5C,OAAOD,EAAK,aAAaC,CAAK,EAAE,UAAUA,CAAK,CACjD,CAEA,OAAO,UAA6BA,EAAU,CAC5C,OAAOD,EAAK,aAAaC,CAAK,EAAE,UAAUA,CAAK,CACjD,CAEA,OAAO,iBAAoCA,EAAU,CACnD,OAAOD,EAAK,aAAaC,CAAK,EAAE,iBAAiBA,CAAK,CACxD,CAEA,OAAO,kBAAkBE,EAA4B,CACnD,OAAO,SAAM,gBACXH,EAAK,kBAAkBG,EAAMA,EAAK,SAAS,aAAa,EAAE,IAAKF,GAC7DD,EAAK,aAAaC,CAAK,EAAE,UAAUA,CAAK,CAC1C,CACF,CACF,CAEA,OAAO,YAAYE,EAAkBG,EAAYF,EAAgB,CAC/D,OAAOJ,EAAK,SAASG,EAAMG,EAAIF,CAAM,EAAE,QACzC,CAwCA,OAAO,kBAAkBD,EAAkBG,EAAYF,EAA0B,CAC/E,IAAMH,EAAQD,EAAK,SAASG,EAAMG,EAAIF,CAAM,EAE5C,OAAIH,EAAM,WAAa,OAAkB,CAACK,CAAE,EAErC,CACLA,EACA,GAAGL,EAAM,SAAS,QAASU,GAAYX,EAAK,kBAAkBG,EAAMQ,EAASP,CAAM,CAAC,CACtF,CACF,CASA,OAAO,0BACLD,EACAC,EACAQ,EACiB,CACjB,IAAMP,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEhCS,EAASb,EAAK,eAAeG,EAAMC,CAAM,EAC5C,QAASE,GAAON,EAAK,kBAAkBG,EAAMG,EAAIF,CAAM,EAAE,IAAKE,GAAOD,EAAK,OAAOC,EAAG,CAAC,EACrF,OAAQL,GAAU,CAACA,EAAM,QAAQ,EACjC,IAAI,SAAM,SAAS,EAEtB,OAAIW,IAAO,OACFC,EAAO,IAAKZ,GAAWa,EAAA,CAAE,GAAIb,EAAM,IAAOW,EAAGX,CAAK,EAAI,EAGxDY,CACT,CASA,OAAO,yBACLV,EACAC,EACAQ,EACiB,CACjB,IAAMC,EAASb,EAAK,kBAAkBG,EAAMC,CAAM,EAC/C,OAAQH,GAAU,CAACA,EAAM,QAAQ,EACjC,IAAI,SAAM,SAAS,EAEtB,OAAIW,IAAO,OACFC,EAAO,IAAKZ,GAAWa,EAAA,CAAE,GAAIb,EAAM,IAAOW,EAAGX,CAAK,EAAI,EAGxDY,CACT,CAIA,OAAO,uBAAuBV,EAAkBY,EAAeX,EAA0B,CACvF,IAAMC,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEhCY,EAAU,IAAI,IAAID,CAAG,EAE3B,OAAAA,EAAI,QAAST,GAAO,CAClB,IAAML,EAAQI,EAAK,OAAOC,GAG1B,SAASW,EAAmBhB,EAAsB,CAC5CA,EAAM,WAAa,QACvBA,EAAM,SACH,OAAQU,GAAY,CAACK,EAAQ,IAAIL,CAAO,CAAC,EACzC,QAASA,GAAY,CACpBK,EAAQ,IAAIL,CAAO,EACnBM,EAAmBZ,EAAK,OAAOM,EAAQ,CACzC,CAAC,CACL,CAEAM,EAAmBhB,CAAK,EAGxB,SAASiB,EAAkBjB,EAAsB,CAC/C,IAAMkB,EAAWlB,EAAM,SACnBkB,IAAad,EAAK,KAClBW,EAAQ,IAAIG,CAAQ,IACxBH,EAAQ,IAAIG,CAAQ,EACpBD,EAAkBb,EAAK,OAAOc,EAAS,GACzC,CAEAD,EAAkBjB,CAAK,EAGvBe,EAAQ,QAASV,GAAO,CACtB,OAAO,OAAOD,EAAK,QAAQ,EACxB,OAAQe,GAAYA,EAAQ,SAAWd,GAAMc,EAAQ,OAASd,CAAE,EAChE,QAASc,GAAYJ,EAAQ,IAAII,EAAQ,SAAWd,EAAKc,EAAQ,KAAOA,EAAQ,MAAM,CAAC,CAC5F,CAAC,CACH,CAAC,EAGM,MAAM,KAAKJ,EAAQ,OAAO,CAAC,CACpC,CAEA,OAAO,kBACLb,EACAC,EACAiB,EACAC,EAAgB,GAChB,CACA,IAAMC,EAAcvB,EAAK,eAAeG,EAAMC,CAAM,EAE9CC,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEhCoB,EAAY,IAAI,IAAYD,CAAW,EAEvCE,EAAa,IAAI,IAEjBC,EAAa,CAAC,GAAGH,CAAW,EAE5BI,EAAS,IAAI,IACjB,OAAO,OAAOtB,EAAK,MAAM,EAAE,OAAQJ,GAAU,CAlQnD,IAAA2B,EAmQQ,OACE3B,EAAM,iBACLA,EAAM,QAAQ,MAAM,aAAa2B,EAAA3B,EAAM,UAAN,YAAA2B,EAAe,IAAI,WAEzD,CAAC,CACH,EAEA,KAAOF,EAAW,QAAQ,CACxB,IAAMpB,EAAKoB,EAAW,IAAI,EAE1B,GAAI,EAAEpB,GAAMqB,EAAO,MAAO,MAEtBF,EAAW,IAAInB,CAAE,IAErBmB,EAAW,IAAInB,CAAE,EAEjBqB,EAAO,QAASE,GAAU,CAnRhC,IAAAD,EAAAE,EAoRQ,GAAM,CACJ,QAAS,CACP,MAAO,CAAE,UAAWC,CAAe,EACnC,IAAK,CAAE,UAAWC,CAAa,CACjC,CACF,EAAIH,EAEEI,EAAeF,EAAiB1B,EAAK,SAAS0B,GAAkB,KAChEG,EAAaF,EAAe3B,EAAK,SAAS2B,GAAgB,KAE5DG,EAAM,GAENF,GAAgBA,EAAa,OAAS3B,GACpCe,IAAc,SAChBc,EAAM,KACGP,EAAAC,EAAM,cAAN,YAAAD,EAAmB,QAASM,EAErCC,EAAMd,IAAc,OAGpBc,EAAMd,IAAc,QAGlBc,IAEEb,GAAeE,EAAU,IAAIK,EAAM,EAAE,EACzCL,EAAU,IAAIlB,CAAE,EAEZ4B,IACFV,EAAU,IAAIU,EAAW,IAAI,EAC7BR,EAAW,KAAKQ,EAAW,IAAI,KAG1BA,GAAcA,EAAW,OAAS5B,IAEvCe,IAAc,SAChBc,EAAM,KACGL,EAAAD,EAAM,cAAN,YAAAC,EAAmB,MAAOG,EAEnCE,EAAMd,IAAc,OAGpBc,EAAMd,IAAc,QAGlBc,IACEb,GAAeE,EAAU,IAAIK,EAAM,EAAE,EACzCL,EAAU,IAAIlB,CAAE,EAEZ2B,IACFT,EAAU,IAAIS,EAAa,IAAI,EAC/BP,EAAW,KAAKO,EAAa,IAAI,MAMpC,CAACA,GAAgBT,EAAU,IAAIS,EAAa,IAAI,KAChD,CAACC,GAAcV,EAAU,IAAIU,EAAW,IAAI,IAE7CP,EAAO,OAAOE,CAAK,CAEvB,CAAC,EACH,CAEA,OAAO,MAAM,KAAKL,EAAU,OAAO,CAAC,CACtC,CAEA,OAAO,mBAAmBrB,EAAkBG,EAAYF,EAAwB,CAC9E,IAAMC,EAAOF,EAAK,SAAS,MAAMC,GAC3BH,EAAQI,EAAK,OAAOC,GAEtB8B,EAEJ,GAAInC,EAAM,WAAaI,EAAK,GAC1B+B,EAAW,OAAO,OAAO/B,EAAK,MAAM,EACjC,OAAQJ,GAAUA,EAAM,WAAaI,EAAK,EAAE,EAC5C,KAAK,CAACgC,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,MACxC,CACL,IAAMC,EAASlC,EAAK,OAAOJ,EAAM,UACjC,GAAI,CAACsC,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAC1DH,EAAWG,EAAO,SACf,IAAK5B,GAAYN,EAAK,OAAOM,EAAQ,EACrC,KAAK,CAAC0B,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,CAC/C,CAEA,IAAME,EAAQJ,EAAS,QAAQnC,CAAK,EAE9BwC,EAAcL,EAASI,EAAQ,GAErC,OAAKC,EAEEA,EAAY,WAFMxC,EAAM,WAAa,CAG9C,CAMA,OAAO,eAAkCA,EAAUyC,EAAgC,CACjF,OAAO,OAAO,YACZ,OAAO,KAAKA,CAAM,EAAE,IAAKC,GAAM,CAACA,EAAG1C,EAAM0C,EAAa,CAAC,CACzD,CACF,CAEA,OAAO,aACLxC,EACAY,EACAH,EACAR,EACAwC,EAAyB,GAKzB,CACA,IAAMC,EAA2C,CAAC,EAC5CC,EAA0C,CAAC,EAEjD/B,EAAI,QAAQ,CAACT,EAAIyC,IAAM,CACrB,IAAM9C,EAAQD,EAAK,SAAYG,EAAMG,EAAIF,CAAM,EAC/C,GAAIH,EAAM,SAAU,QAChBA,GAAA,YAAAA,EAAO,QAAS,UAAYc,EAAI,SAAW,GAAK6B,IAClD3C,EAAM,SAAS,QAAQ,CAACK,EAAIyC,IAAM,CAChC,IAAM9C,EAAQD,EAAK,SAAYG,EAAMG,EAAIF,CAAM,EAC/C,GAAIH,EAAM,SAAU,OACpB,IAAMyC,EAAS9B,EAAGX,EAAO8C,CAAC,EACtBL,IACFG,EAAavC,GAAMN,EAAK,eAAeC,EAAOyC,CAAM,EACpDI,EAAYxC,GAAMoC,EAEtB,CAAC,EAEH,IAAMA,EAAS9B,EAAGX,EAAO8C,CAAC,EACtBL,IACFG,EAAavC,GAAMN,EAAK,eAAeC,EAAOyC,CAAM,EACpDI,EAAYxC,GAAMoC,EAEtB,CAAC,EAED,IAAMM,EAAoB,SAAM,UAAU7C,EAAM,CAC9C,SAAU,CACR,MAAO,CACL,CAACA,EAAK,SAAS,eAAgB,CAC7B,OAAQ2C,CACV,CACF,CACF,CACF,CAAC,EAED,MAAO,CACL,OAAQD,EACR,MAAOC,EACP,KAAME,CACR,CACF,CAEA,OAAO,aAAa7C,EAAkB8C,EAAmB7C,EAA8B,CACrF,IAAM8C,EAAqB,CACzB,SAAU,CACR,MAAO,CACL,CAAC9C,GAAS,CACR,OAAQU,EAAA,GACH,OAAO,YACRmC,EAAO,QAAShD,GAAU,CACxB,IAAMkD,EAAoD,CAAC,CAAClD,EAAM,GAAI,MAAS,CAAC,EAGhF,GAAIA,EAAM,WAAaG,EAAQ,CAC7B,IAAMmC,EAASvC,EAAK,SAASG,EAAMF,EAAM,SAAUG,CAAM,EACzD,GAAI,CAACmC,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAC1DY,EAAQ,KAAK,CAACZ,EAAO,GAAI,CAAE,SAAUA,EAAO,QAAS,CAAC,CAAC,CACzD,CAEA,OAAOY,CACT,CAAC,CACH,EAEJ,CACF,CACF,CACF,EAEMC,EAAoB,CACxB,SAAU,CACR,MAAO,CACL,CAAChD,GAAS,CACR,OAAQ,CACN,OAAQU,EAAA,GACH,OAAO,YACRmC,EAAO,QAAShD,GAAU,CACxB,IAAMkD,EAAoD,CAAC,CAAClD,EAAM,GAAIA,CAAK,CAAC,EAG5E,GAAIA,EAAM,WAAaG,EAAQ,CAC7B,IAAMmC,EAASvC,EAAK,SAASG,EAAMF,EAAM,SAAUG,CAAM,EACzD,GAAI,CAACmC,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAC1DY,EAAQ,KAAK,CAACZ,EAAO,GAAI,CAAE,SAAU,CAAC,GAAGA,EAAO,SAAUtC,EAAM,EAAE,CAAE,CAAC,CAAC,CACxE,CAEA,OAAOkD,CACT,CAAC,CACH,EAEJ,CACF,CACF,CACF,CACF,EAEA,MAAO,CACL,OAAAD,EACA,MAAAE,CACF,CACF,CAEA,OAAO,aACLjD,EACA8C,EACA7C,EACc,CACdA,EAASA,GAAkBD,EAAK,SAAS,cAEzC,IAAME,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEhCiD,EACJ,OAAOJ,EAAO,IAAO,SAChBA,EACAA,EAAqB,IAAKhD,GAAUA,EAAM,EAAE,EAE7CiD,EAAqB,CACzB,SAAU,CACR,MAAO,CACL,CAAC9C,GAAS,CACR,OAAQU,EAAA,GAEH,OAAO,YACRuC,EAAS,QAAS/C,GAAO,CACvB,IAAML,EAAQI,EAAK,OAAOC,GACpB6C,EAAoD,CAAC,CAAClD,EAAM,GAAIA,CAAK,CAAC,EAG5E,GAAIA,EAAM,WAAaG,EAAQ,CAC7B,IAAMmC,EAASlC,EAAK,OAAOJ,EAAM,UACjC,GAAI,CAACsC,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAC1DY,EAAQ,KAAK,CAACZ,EAAO,GAAI,CAAE,SAAUA,EAAO,QAAS,CAAC,CAAC,CACzD,CAEA,OAAOY,CACT,CAAC,CACH,GAEF,SAAUrC,EAAA,GAEL,OAAO,YACR,OAAO,OAAOT,EAAK,QAAQ,EACxB,OAAQe,GACAiC,EAAS,SAASjC,EAAQ,MAAM,GAAKiC,EAAS,SAASjC,EAAQ,IAAI,CAC3E,EACA,IAAKA,GACG,CAACA,EAAQ,GAAIA,CAAO,CAC5B,CACL,EAEJ,CACF,CACF,CACF,EAEMgC,EAAoB,CACxB,SAAU,CACR,MAAO,CACL,CAAChD,GAAS,CACR,OAAQU,EAAA,GACH,OAAO,YACRuC,EAAS,QAAS/C,GAAO,CACvB,IAAML,EAAQI,EAAK,OAAOC,GACpB6C,EAAoD,CAAC,CAAClD,EAAM,GAAI,MAAS,CAAC,EAGhF,GAAIA,EAAM,WAAaI,EAAK,GAAI,CAC9B,IAAMkC,EAASlC,EAAK,OAAOJ,EAAM,UAEjC,GAAI,CAACsC,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAE1DY,EAAQ,KAAK,CACXZ,EAAO,GACP,CAAE,SAAUA,EAAO,SAAS,OAAQjC,GAAOA,IAAOL,EAAM,EAAE,CAAE,CAC9D,CAAC,CACH,CAEA,OAAOkD,CACT,CAAC,CACH,EAEJ,CACF,CACF,CACF,EAEA,MAAO,CACL,OAAAD,EACA,MAAAE,CACF,CACF,CAEA,OAAO,kBAAqCnD,EAAU,CAtkBxD,IAAA2B,EAAAE,EAukBI,IAAMwB,GAAQxB,GAAAF,EAAA5B,EAAK,aAAaC,CAAK,GAAE,oBAAzB,YAAA6B,EAAA,KAAAF,EAA6C3B,GAC3D,OAAKqD,EACExC,IAAA,GAAKb,GAAUqD,GADHrD,CAErB,CAEA,OAAO,iBAAoCE,EAAkBF,EAAUG,EAAgB,CA5kBzF,IAAAwB,EAAAE,EA6kBI,GAAI,CAAC7B,EAAM,SAAU,OAErB,IAAMqD,GAAQxB,GAAAF,EAAA5B,EAAK,aAAaC,CAAK,GAAE,mBAAzB,YAAA6B,EAAA,KAAAF,EACZ3B,EACAA,EAAM,SAAS,IAAKK,GAAON,EAAK,SAASG,EAAMG,EAAIF,CAAM,CAAC,GAG5D,OAAKkD,EAEExC,IAAA,GAAKb,GAAUqD,GAFHrD,CAGrB,CAEA,OAAO,oBAAoBI,EAAckD,EAAwB,CAzlBnE,IAAA3B,EAAAE,EAAA0B,EAAAC,EAAAC,EAAAC,EA0lBI,IAAMC,EAAS,CACb,MAAOC,GAASN,EAAW,QAAQ,KAAK,EACxC,IAAKM,GAASN,EAAW,QAAQ,GAAG,CACtC,EAoBIO,EAAoB,CACtB,QAAS,GACT,OAAQP,EAAW,QAAQ,MAC3B,MAAO,MAAI,IAAIA,EAAW,QAAQ,MAAM,MAAOA,EAAW,KAAK,CACjE,EACIQ,EAAkB,CACpB,QAAS,GACT,OAAQR,EAAW,QAAQ,IAC3B,MAAO,MAAI,IAAIA,EAAW,QAAQ,IAAI,MAAOA,EAAW,KAAK,CAC/D,EACA,GAAIA,EAAW,QAAQ,MAAM,UAAW,CACtC,IAAMS,IAAgBpC,EAAA2B,EAAW,cAAX,YAAA3B,EAAwB,SAAU,OAClDqC,EAASV,EAAW,QAAQ,MAC5BnC,EAAUf,EAAK,SAASkD,EAAW,QAAQ,MAAM,WACvD,GAAI,CAACnC,EACH,MAAM,MACJ,mEACEmC,EAAW,QAAQ,MAAM,SAC7B,EACF,IAAMW,EAAS7D,EAAK,OAAOe,EAAQ,MAC7B+C,EAAOnE,EAAK,aAAakE,CAAM,EAC/BE,EAASD,EAAK,UAAUD,CAAM,EAC9BG,EAAiBF,EAAK,kBAAkBD,CAAM,EAC9CI,EAAkBN,EAAgB,SAAM,aAAaI,EAAQhD,EAAQ,QAAQ,EAAIgD,EACjF,CAAE,KAAAG,EAAM,KAAAC,EAAM,MAAAC,EAAO,OAAAC,CAAO,EAAIL,EAChCM,EAAc,MAAI,IACtB,CAACJ,EAAMC,CAAI,EACX,MAAI,KAAK,CAACC,EAAOC,CAAM,EAAG,MAAI,QAAQtD,EAAQ,MAAO,CAAC,GAAK,EAAG,EAAG8C,EAAO,UAAY,CAAC,CAAC,CACxF,EACAJ,EAAQ,CACN,QAAS,GACT,cAAAE,EACA,QAAA5C,EACA,OAAA6C,EACA,MAAOU,EACP,KAAAR,EACA,OAAAD,EACA,OAAAE,EACA,eAAAC,EACA,gBAAAC,EACA,OAAQH,EAAK,UAAUD,CAAM,CAC/B,CACF,CACA,GAAIX,EAAW,QAAQ,IAAI,UAAW,CACpC,IAAMS,IAAgBlC,EAAAyB,EAAW,cAAX,YAAAzB,EAAwB,OAAQ,OAChDmC,EAASV,EAAW,QAAQ,IAC5BnC,EAAUf,EAAK,SAASkD,EAAW,QAAQ,IAAI,WACrD,GAAI,CAACnC,EAAS,MAAM,MAAM,8DAA8D,EACxF,IAAM8C,EAAS7D,EAAK,OAAOe,EAAQ,MAC7B+C,EAAOnE,EAAK,aAAakE,CAAM,EAC/BE,EAASD,EAAK,UAAUD,CAAM,EAC9BG,EAAiBF,EAAK,kBAAkBD,CAAM,EAC9CI,EAAkBN,EAAgB,SAAM,aAAaI,EAAQhD,EAAQ,QAAQ,EAAIgD,EACjF,CAAE,KAAAG,EAAM,KAAAC,EAAM,MAAAC,EAAO,OAAAC,CAAO,EAAIL,EAChCM,EAAc,MAAI,IACtB,CAACJ,EAAMC,CAAI,EACX,MAAI,KAAK,CAACC,EAAOC,CAAM,EAAG,MAAI,QAAQtD,EAAQ,MAAO,CAAC,GAAK,EAAG,EAAG8C,EAAO,UAAY,CAAC,CAAC,CACxF,EACAH,EAAM,CACJ,QAAS,GACT,cAAAC,EACA,QAAA5C,EACA,OAAA6C,EACA,MAAOU,EACP,KAAAR,EACA,OAAAD,EACA,OAAAE,EACA,eAAAC,EACA,gBAAAC,EACA,OAAQH,EAAK,UAAUD,CAAM,CAC/B,CACF,CAEA,QAAWU,IAAM,CAAC,MAAO,OAAO,EAAY,CAC1C,IAAMC,EAAID,IAAO,QAAUd,EAAQC,EAC7Be,EAAIF,IAAO,QAAUb,EAAMD,EACjC,GAAIe,EAAE,QACJ,GAAI,CAACA,EAAE,QAAQ,SAGbjB,EAAOgB,GAAI,MAAQ,MAAI,IAAIC,EAAE,MAAOtB,EAAW,KAAK,MAC/C,CAIL,IAAMlC,EAAY,MAAI,IAAI,MAAI,IAAIwD,EAAE,MAAOC,EAAE,KAAK,CAAC,EACnD,OAAQD,EAAE,OAAO,oBACW,CACxB,IAAME,KAAO,wBACXD,EAAE,MACFzD,EACAwD,EAAE,OACFA,EAAE,OAAO,OAAO,IAAMA,EAAE,cAAgBA,EAAE,QAAQ,SAAW,GAC7DA,EAAE,OAAO,OAAO,IAAMA,EAAE,cAAgBA,EAAE,QAAQ,SAAW,GAC7DA,EAAE,OAAO,UAAY,CACvB,EAAE,OAAO,KAAK,CAACxC,EAAGC,IAAM,MAAI,KAAKD,EAAGyC,EAAE,KAAK,EAAI,MAAI,KAAKxC,EAAGwC,EAAE,KAAK,CAAC,EAC/DC,EAAK,KAAO,SACdnB,EAAOgB,GAAI,MAAQ,MAAI,QAAQ,MAAI,IAAIG,EAAK,GAAIxB,EAAW,KAAK,CAAC,GAEnE,KACF,gBAC2B,CACzB,IAAMyB,EAAcH,EAAE,OAAO,MACvBI,EAASC,GACbL,EAAE,OAAO,KACTA,EAAE,cAAgB,GAAmB,EACrCA,EAAE,OAAO,QACX,EAAE,IAAKM,GAAO,MAAI,IAAIA,EAAIH,CAAW,CAAC,EAChCD,EAAO,SAAM,qBAAqBE,EAAQ,EAAI,EACjD,IAAI,CAAC,CAACG,EAAIC,CAAE,OAAM,4BAAwBP,EAAE,MAAOzD,EAAW+D,EAAIC,CAAE,CAAC,EACrE,OAAQC,GAAiBA,EAAa,YAAY,EAClD,QAASA,GAAiBA,EAAa,MAAM,EAC7C,KAAK,CAACjD,EAAGC,IAAM,MAAI,KAAKD,EAAGyC,EAAE,KAAK,EAAI,MAAI,KAAKxC,EAAGwC,EAAE,KAAK,CAAC,EACzDC,EAAK,KAAO,SACdnB,EAAOgB,GAAI,MAAQ,MAAI,QAAQ,MAAI,IAAIG,EAAK,GAAIxB,EAAW,KAAK,CAAC,GAEnE,KACF,SACS,CACP,IAAMwB,KAAO,uBACXD,EAAE,MACFzD,EACAwD,EAAE,gBACFA,EAAE,OAAO,QACX,EACG,OAAQU,GAAQA,EAAI,YAAY,EAChC,IAAKA,GAAQA,EAAI,OAAO,EAAE,EAC1B,KAAK,CAAClD,EAAGC,IAAM,MAAI,KAAKD,EAAGyC,EAAE,KAAK,EAAI,MAAI,KAAKxC,EAAGwC,EAAE,KAAK,CAAC,EAC7D,GAAI,CAACC,EAAK,GAAI,SACd,IAAIS,EAaJ,GAZIV,EAAE,UAUJU,KATc,uBACZV,EAAE,MACFzD,EACAyD,EAAE,gBACFA,EAAE,OAAO,QACX,EACG,OAAQS,GAAQA,EAAI,YAAY,EAChC,IAAKA,GAAQA,EAAI,OAAO,EAAE,EAC1B,KAAK,CAAClD,EAAGC,IAAM,MAAI,KAAKD,EAAGyC,EAAE,KAAK,EAAI,MAAI,KAAKxC,EAAGwC,EAAE,KAAK,CAAC,EAChD,IAGbA,EAAE,UACDC,EAAK,OAAS,GACZS,GACCT,EAAK,IACL,KAAK,KAAK,MAAI,KAAKA,EAAK,GAAIS,CAAI,CAAC,EAAI,GAAmB,KAC1D,SAAM,cAAcX,EAAE,eAAgBC,EAAE,cAAc,GACtD,SAAM,cAAcD,EAAE,eAAgBC,EAAE,cAAc,GACxD,CAEA,IAAMW,EAAsB,MAAI,IAAI,MAAI,IAAIX,EAAE,MAAOD,EAAE,KAAK,CAAC,EACvDa,KAAiB,uBACrBb,EAAE,MACFY,EACAZ,EAAE,OACFA,EAAE,OAAO,QACX,EACG,OAAQU,GAAQA,EAAI,YAAY,EAChC,IAAKA,GAAQA,EAAI,OAAO,EAAE,EAC7B,GAAI,CAACG,EAAe,GAAI,SACxB9B,EAAOgB,GAAI,MAAQ,MAAI,QAAQ,MAAI,IAAIc,EAAe,GAAInC,EAAW,KAAK,CAAC,EAC3EK,EAAOgB,IAAO,QAAU,MAAQ,SAAS,MAAQ,MAAI,QACnD,MAAI,IACF,MAAI,IAAIc,EAAe,GAAInC,EAAW,KAAK,EAC3C,MAAI,IACFkC,EACA,KAAK,IACH,MAAI,KAAKC,EAAe,GAAIZ,EAAE,KAAK,EACnC,GACE,KACC,SAAM,cAAcA,EAAE,OAAQD,EAAE,eAAe,EAAI,GAAK,EAC7D,CACF,CACF,CACF,CACF,SACE,CAACC,EAAE,UACDC,EAAK,IAAM,MAAI,KAAKA,EAAK,GAAID,EAAE,KAAK,EAAI,GAAmB,KAC3D,SAAM,cAAcA,EAAE,MAAOD,EAAE,eAAe,GAChD,CAEA,IAAMY,EAAsB,MAAI,IAAI,MAAI,IAAIZ,EAAE,OAAQC,EAAE,KAAK,CAAC,EAC9D,OAAOrB,GAAAD,EAAAxD,EAAK,aAAyBuD,CAAU,GAAE,iBAA1C,YAAAE,EAAA,KAAAD,EAA2DD,EAAY,CAC5E,CAACqB,GAAKe,EAAA7E,EAAA,GACDyC,EAAW,QAAQqB,IADlB,CAEJ,MAAO,MAAI,QACT,MAAI,IACF,MAAI,IAAIE,EAAE,MAAOvB,EAAW,KAAK,EACjC,MAAI,IAAIkC,EAAqB,GAAmB,GAAG,CACrD,CACF,CACF,EACF,EACF,MAAWV,EAAK,KACdnB,EAAOgB,GAAI,MAAQ,MAAI,QAAQ,MAAI,IAAIG,EAAK,GAAIxB,EAAW,KAAK,CAAC,EAErE,EAEJ,CAEJ,CAEA,OAAOI,GAAAD,EAAA1D,EAAK,aAAyBuD,CAAU,GAAE,iBAA1C,YAAAI,EAAA,KAAAD,EAA2DH,EAAYK,EAChF,CAEA,OAAO,UAA6B3D,EAAUmE,EAAkBwB,EAA0B,CACxF,IAAMtC,EAAQtD,EAAK,aAAaC,CAAK,EAAE,UAAUA,EAAOmE,EAAQwB,CAAI,EACpE,OAAKtC,EACExC,IAAA,GAAKb,GAAUqD,GADHrD,CAErB,CAEA,OAAO,gBAAmCA,EAAUmE,EAAkBwB,EAA0B,CAC9F,IAAMtC,EAAQtD,EAAK,aAAaC,CAAK,EAAE,gBAAgBA,EAAOmE,EAAQwB,CAAI,EAC1E,OAAKtC,EACExC,IAAA,GAAKb,GAAUqD,GADHrD,CAErB,CASA,OAAO,wBACLA,EACA4F,EACAC,EACAxC,EACmB,CAx1BvB,IAAA1B,EAAAE,EA01BI,IAAMiE,EAAiB,MAAI,IAAIF,EAAQ5F,EAAM,KAAK,EAG5C+F,EAAgB,MAAI,QAAQH,EAAQC,EAAQxC,CAAK,EAGjD2C,EAAY,MAAI,QAAQ,MAAI,IAAID,EAAeD,CAAc,CAAC,EAKpE,GAAI9F,EAAM,UAAY,OAcpB,OAbe6B,GAAAF,EAAA,KAAK,aAAa3B,CAAK,GAAE,iBAAzB,YAAA6B,EAAA,KAAAF,EAEb+D,EAAA7E,EAAA,GAAKb,GAAL,CAAY,MAAOgG,CAAU,GAC7B,OAAO,YACL,OAAO,QAAQhG,EAAM,OAAO,EAAE,IAAI,CAAC,CAACiG,EAAUjC,CAAM,IAAM,CAGxD,IAAM1D,EAAQ,MAAI,QAAQ,MAAI,QAAQ0D,EAAO,MAAO8B,EAAgBzC,CAAK,CAAC,EAC1E,MAAO,CAAC4C,EAAUP,EAAA7E,EAAA,GAAKmD,GAAL,CAAa,MAAA1D,CAAM,EAAC,CACxC,CAAC,CACH,GAUJ,IAAM4F,EAAe,SAAM,cAAclG,EAAM,UAAY,GAAKqD,CAAK,EAErE,MAAO,CACL,MAAO2C,EACP,SAAUE,CACZ,CACF,CAMA,OAAO,cAAchG,EAAkBC,EAAgBgG,EAAiC,CACtF,IAAM/F,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAEtC,GAAIgG,EAAgB,SAAW,EAAG,OAElC,GAAM,CAAE,OAAAnD,CAAO,EAAIjD,EAAK,QAAQG,EAAMC,CAAM,EAEtCiG,EAAoB,MAAM,KAC9B,IAAI,IAAID,EAAgB,IAAK9F,GAAO2C,EAAO3C,GAAI,QAAQ,EAAE,OAAO,CAAC,CACnE,EAAE,OAAQA,GAAOA,IAAOD,EAAK,EAAE,EAE/B,QAAWc,KAAYkF,EAAmB,CACxC,IAAM9D,EAASU,EAAO9B,GAEtB,GAAI,CAACoB,EAAO,SACV,MAAM,MAAM,0DAA0D,EAGxEvC,EAAK,iBAAiBG,EAAMoC,EAAQnC,CAAM,CAC5C,CAEAJ,EAAK,cAAcG,EAAMC,EAAQiG,CAAiB,CACpD,CAMA,OAAO,WAAWlG,EAAkBG,EAAYF,EAA2B,CACzE,OAAOJ,EAAK,QAAQG,EAAMC,CAAM,EAAE,SAASE,EAC7C,CAEA,OAAO,YAAYH,EAAkBC,EAA6B,CAChE,IAAMC,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EACtC,OAAO,OAAO,OAAOC,EAAK,QAAQ,CACpC,CAEA,OAAO,oBAAoBF,EAAkB,CAC3C,OAAOH,EAAK,UAAUG,EAAMA,EAAK,SAAS,aAAa,EACpD,OAAQF,GAAUD,EAAK,aAAaC,CAAK,EAAE,OAAO,EAClD,KAAK,CAACoC,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,EAC1C,IAAKpC,GAAUA,EAAM,EAAE,CAC5B,CAEA,OAAO,wBAAwBE,EAAkBY,EAAeX,EAA6B,CAC3F,OAAO,MAAM,KACX,IAAI,IACFJ,EAAK,YAAYG,EAAMC,CAAM,EAAE,OAAQgB,GAC9BL,EAAI,SAASK,EAAQ,IAAI,GAAKL,EAAI,SAASK,EAAQ,MAAM,CACjE,CACH,EAAE,OAAO,CACX,CACF,CAEA,OAAO,mBAAmBjB,EAAkBY,EAAeX,EAA6B,CACtF,IAAMgG,EAAkB,IAAI,IAAIrF,CAAG,EAE7BV,EAAOL,EAAK,QAAQG,EAAMC,CAAM,EAGhCkG,EAAc,OAAO,OAAOjG,EAAK,QAAQ,EAGzCkG,EAAmB,IAAI,IAC3BD,EAAY,OACTlF,GAAYgF,EAAgB,IAAIhF,EAAQ,IAAI,GAAKgF,EAAgB,IAAIhF,EAAQ,MAAM,CACtF,CACF,EAGIoF,EAAWD,EAAiB,KAC5BjD,EAAQ,GAEZ,KAAOA,IAAU,GACfiD,EAAiB,QAASnF,GAAY,CACpC,IAAMqF,EAASrF,EAAQ,OAEvB,QAAWsF,KAAgBJ,EACrBI,EAAa,SAAWD,GAC1BF,EAAiB,IAAIG,CAAY,EAG/BA,EAAa,OAASD,GACxBF,EAAiB,IAAIG,CAAY,CAGvC,CAAC,EAGDpD,EAAQiD,EAAiB,KAAOC,EAEhCA,EAAWD,EAAiB,KAG9B,OAAO,MAAM,KAAKA,EAAiB,OAAO,CAAC,CAC7C,CA4EA,OAAO,cAAcI,EAAc,CACjC,OAAOA,EACJ,QAAQ3G,EAAK,YAAa;AAAA,CAAI,EAC9B,MAAM;AAAA,CAAI,EACV,IAAK4G,GAAMA,GAAK,GAAG,EACnB,KAAK;AAAA,CAAI,CACd,CAMA,OAAO,uBACL3G,EACA4G,EACoC,CACpC,GAAI5G,EAAM4G,KAAU,OAClB,MAAM,IAAI,KAEd,CAEA,OAAO,KAAKC,EAAQ,CACd/G,IACF,QAAQ,KAAK+G,CAAC,CAElB,CACA,OAAO,MAAMA,EAAQ,CACf/G,IACF,QAAQ,MAAM+G,CAAC,CAEnB,CAMA,OAAO,aAAaC,EAAiBC,EAAQ,EAAG,CAC9C,IAAMC,EAAQF,EAAI,UAAU,EAAI,EAEhC,OAAAA,EAAI,aAAa,QAAS,CAACA,EAAI,aAAa,OAAO,EAAKC,EAAQ,EAAE,EAClED,EAAI,aAAa,SAAU,CAACA,EAAI,aAAa,QAAQ,EAAKC,EAAQ,EAAE,EAE7D,IAAI,cAAc,EACtB,kBAAkBC,CAAK,EACvB,WAAW,cAAe,EAAE,EAC5B,WAAW,6CAA8C,IAAI,CAClE,CAEA,OAAO,gBAAgBF,EAAiBC,EAAQ,EAAG,CACjD,IAAME,EAAYlH,EAAK,aAAa+G,EAAKC,CAAK,EAI9C,MAAO,6BAFW,OAAO,KAAK,SAASE,CAAS,CAAC,GAGnD,CAEA,OAAa,eACXC,EAMA,QAAAC,EAAA,yBANAL,EACAM,QACAC,EAAO,CAAC,EAIR,CACA,GAAM,CAAE,MAAAN,EAAQ,EAAG,QAAAO,EAAU,CAAE,EAAID,EAE7BJ,EAAYlH,EAAK,aAAa+G,EAAKC,CAAK,EAE9C,GAAI,CAACE,EAAW,OAEhB,IAAMM,EAAS,MAAM,IAAI,QAA4BC,GAAY,CAC/D,IAAMC,EAAQ,IAAI,MAElBA,EAAM,YAAc,YAIpB,IAAMC,EAAU,6BAFE,OAAO,KAAK,SAAS,mBAAmBT,CAAS,CAAC,CAAC,IAIrEQ,EAAM,OAAS,IAAM,CACnB,IAAMF,EAAS,SAAS,cAAc,QAAQ,EACxCI,EAAUJ,EAAO,WAAW,IAAI,EAEhCK,EAAaH,EAAM,MACnBI,EAAcJ,EAAM,OAE1BF,EAAO,MAAQK,EACfL,EAAO,OAASM,EAChBF,EAAQ,UAAUF,EAAO,EAAG,EAAGG,EAAYC,CAAW,EAEtD,IAAI,gBAAgBH,CAAO,EAE3BF,EAAQD,CAAM,CAChB,EAEAE,EAAM,QAAU,IAAM,CACpB,QAAQ,KAAK,yCAAyC,CACxD,EAEAA,EAAM,IAAMC,CACd,CAAC,EAMD,OAJa,MAAM,IAAI,QAAeF,GACpCD,EAAO,OAAQO,GAASN,EAAQM,CAAK,EAAG,SAAWV,EAAME,CAAO,CAClE,CAGF,GACF,EAtoCaS,EAANhI,EAg9BLiI,EAh9BWD,EAg9BJ,wBAAyBE,GAAmB,CACjD,GAAI,CACE,UAAU,WACZ,UAAU,UAAU,MAAM,CACxB,IAAI,cAAc,CAChB,aAAc,IAAI,KAAK,CAACA,CAAM,EAAG,CAAE,KAAM,YAAa,CAAC,CACzD,CAAC,CACH,CAAC,CAEL,OAAS,EAAP,CACA,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClDA,EAAS,aAAa,WAAY,OAAO,EACzCA,EAAS,aAAa,MAAO,GAAG,EAChCA,EAAS,aAAa,WAAY,MAAM,EACxCA,EAAS,aAAa,kBAAmB,MAAM,EAC/CA,EAAS,MAAM,SAAW,QAC1BA,EAAS,MAAQD,EACjB,SAAS,KAAK,YAAYC,CAAQ,EAClCA,EAAS,MAAM,EACfA,EAAS,OAAO,EAEhB,GAAI,CACF,IAAMC,EAAQ,SAAS,YAAY,EACnCA,EAAM,mBAAmBD,CAAQ,EACjC,IAAME,EAAM,OAAO,aAAa,EAC5BA,IACFA,EAAI,gBAAgB,EACpBA,EAAI,SAASD,CAAK,EAClBD,EAAS,kBAAkB,EAAGA,EAAS,MAAM,MAAM,GAErD,SAAS,YAAY,MAAM,CAC7B,OAASG,EAAP,CAEF,QAAE,CACA,SAAS,KAAK,YAAYH,CAAQ,CACpC,CACF,CACF,GAMAF,EA3/BWD,EA2/BJ,eAAe,CAAC7H,EAAkBF,IAA8B,CAlhCzE,IAAA2B,EAmhCI,MAAO,CACL3B,EACA,KAAI2B,EAAA3B,EAAM,WAAN,KAAA2B,EAAkB,CAAC,GACpB,IAAKjB,GAAYX,EAAK,SAASG,EAAMQ,EAASR,EAAK,SAAS,aAAa,CAAC,EAC1E,KAAK,CAACkC,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAC1C,QAASrC,GAAUD,EAAK,aAAaG,EAAMF,CAAK,CAAC,CACtD,CACF,GAEAgI,EArgCWD,EAqgCJ,cAAc,CAAC7H,EAAkBC,IAC/B,OAAO,OAAOD,EAAK,SAAS,MAAMC,GAAQ,MAAM,EACpD,KAAK,CAACiC,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAC1C,OAAkB,CAACiG,EAAKtI,IAAU,CAAC,GAAGsI,EAAK,GAAGvI,EAAK,aAAaG,EAAMF,CAAK,CAAC,EAAG,CAAC,CAAC,GAGtFgI,EA3gCWD,EA2gCJ,mBAAmB,CAAC7H,EAAkBC,IAA2B,CACtE,IAAM6C,EAASjD,EAAK,UAAUG,EAAMC,CAAM,EAC1C,OAAO6C,EAAO,SAAW,EACrB,EACAA,EACG,OAAQhD,GAAUA,EAAM,WAAaG,CAAM,EAC3C,KAAK,CAACiC,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,EAAE,GAAG,WAAa,CACrE,GAMA4F,EAxhCWD,EAwhCJ,cAAc,aF/iCvB,IAAAQ,GAAA,6BAwBaC,GAAkB,QAAK,SAAmB,CACrD,KAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,QAAAC,EAAU,EACV,QAAAC,EAAU,EACV,MAAAC,EAAQ,EACR,UAAAC,EAAY,GACZ,MAAAC,EACA,OAAAC,EACA,SAAAC,CACF,EAAmB,CACjB,IAAMC,EAAe,UAA4B,IAAI,EAC/CC,EAAmB,UAAO,EAAK,EAE/BC,EAAqB,eACxBC,GAA8C,CAC7CJ,EAASK,EAAK,cAAcD,EAAE,cAAc,KAAK,CAAC,CACpD,EACA,CAACJ,CAAQ,CACX,EACMM,EAAsB,eACzBF,GAAgD,CAC/C,GAAIA,EAAE,MAAQ,SAAU,CACtBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBL,GAAA,MAAAA,IACA,MACF,CAEA,GAAIK,EAAE,MAAQ,OAASd,EAAK,SAAW,EAAG,CACxCc,EAAE,eAAe,EACjB,MACF,CAEA,GAAI,EAAEA,EAAE,MAAQ,QAAUA,EAAE,SAC1BA,EAAE,gBAAgB,UACTA,EAAE,MAAQ,KAAOA,EAAE,QAAS,CACjCA,EAAE,SACJ,SAAS,YAAY,OAAQ,EAAK,EAElC,SAAS,YAAY,OAAQ,EAAK,EAEpCA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjB,MACF,EAEKA,EAAE,SAAWA,EAAE,UAAYA,EAAE,MAAQ,KACxCA,EAAE,eAAe,EAGfA,EAAE,MAAQ,QACZA,EAAE,eAAe,EACbA,EAAE,SACJG,GAAc,SAASH,EAAE,aAAa,EAEtCG,GAAc,OAAOH,EAAE,aAAa,EAGtCJ,GAAA,MAAAA,EAAWK,EAAK,cAAcD,EAAE,cAAc,KAAK,GAEvD,EACA,CAACJ,CAAQ,CACX,EAEMQ,EAAmB,eACtBJ,GAA6C,CAC5CA,EAAE,cAAc,kBAAkB,EAAG,CAAC,EACtCL,GAAA,MAAAA,GACF,EACA,CAACA,CAAM,CACT,EAEMU,EAAoB,eACvBL,GAA6C,CACxC,CAACP,GACD,CAACK,EAAW,SAEZ,SAAS,gBAAkBE,EAAE,eAC/BA,EAAE,cAAc,OAAO,CAE3B,EACA,CAACP,CAAS,CACZ,EAEMa,EAA0B,eAC7BN,GAAgE,CAC3DP,GACFO,EAAE,gBAAgB,CAEtB,EACA,CAACP,CAAS,CACZ,EAEMc,EAAoB,UAAOd,CAAS,EAEpC,aAAU,IAAM,CAChBA,GACFc,EAAY,QAAU,GACtB,sBAAsB,IAAM,CAC1BT,EAAW,QAAU,GACrB,IAAMU,EAAMX,EAAO,QACfW,IACFA,EAAI,MAAM,EACVA,EAAI,OAAO,EAEf,CAAC,GACQD,EAAY,UACrBZ,GAAA,MAAAA,IACAY,EAAY,QAAU,GAE1B,EAAG,CAACd,EAAWE,CAAM,CAAC,EAEtB,IAAMc,EAAsB,UAAuB,IAAI,EAEvD,OAAM,mBAAgB,IAAM,CAC1B,IAAMD,EAAMC,EAAc,QAC1B,GAAI,CAACD,EAAK,OACV,IAAME,EAAOC,GAAiBzB,EAAMD,EAAMS,CAAK,EAC/Cc,EAAI,MAAM,UAAY,SAAShB,MAAUA,gBAAoBF,QAAcC,OAC3EiB,EAAI,MAAM,MAAQd,EAAQ,GAAGA,MAAYgB,EAAK,GAAK,EAAI,KACvDF,EAAI,MAAM,OAASE,EAAK,GAAK,EAAI,IACnC,EAAG,CAACxB,EAAMD,EAAMM,EAASD,EAASE,EAAOE,CAAK,CAAC,KAG7C,QAACkB,GAAA,CACC,qBAACC,GAAA,CACC,IAAKJ,EACL,QAAS,CAAC,CAACvB,EACX,UAAWO,EACX,MAAOqB,EAAA,CACL,KAAA7B,EACA,MAAQI,GAAgB,CAACI,EAAa,cAAgBN,EACtD,gBAAiBC,GAAcA,IAAe,cAAgBA,EAAa,OAC3E,aAAcA,GAAcA,IAAe,cAAgB,EAAI,OAC/D,QAASA,GAAcA,IAAe,cAAgB,UAAY,QAC9DC,GAAgB,CAACI,EAAY,CAC/B,WAAYsB,GAAiB1B,CAAY,EACzC,qBAAsB,OACtB,eAAgB,MAClB,EAAI,CAAC,GAGN,UAAAI,KACC,QAACuB,GAAA,CACC,IAAKnB,EACL,MAAO,CACL,KAAAZ,EACA,MAAAE,CACF,EACA,KAAK,OACL,SAAU,GACV,aAAa,QACb,eAAe,QACf,YAAY,QACZ,SAAS,QACT,UAAS,GACT,YAAY,GACZ,WAAW,OACX,KAAK,MACL,IAAI,OACJ,SAAS,UACT,aAAcD,EACd,MAAOC,EACP,QAASkB,EACT,SAAUN,EACV,UAAWG,EACX,OAAQE,EACR,cAAeE,EACf,cAAeW,GACf,OAAQA,GACR,QAASA,GACT,MAAOA,GACT,EAEA/B,EACA,UAEJ,EACF,CAEJ,CAAC,EAEK0B,GAAcM,EAAO,MAAO,CAChC,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,cAAe,OACf,WAAY,OACZ,SAAU,CACR,QAAS,CACP,MAAO,CAAE,QAAS,CAAE,EACpB,KAAM,CAAE,WAAY,cAAe,QAAS,EAAgB,CAC9D,CACF,CACF,CAAC,EAEKC,GAAqB,CACzB,WAAY,WACZ,aAAc,aACd,cAAeC,EACjB,EAEMP,GAAeK,EAAO,MAAOJ,EAAA,CACjC,SAAU,WACV,QAAS,MACT,OAAQ,EACR,UAAW,EACX,SAAU,EACV,WAAY,EACZ,QAAS,EACT,WAAY,MACZ,UAAW,SACX,mBAAoB,SACpB,WAAY,OACZ,iBAAkB,OAClB,mBAAoB,OACpB,SAAU,CACR,QAAS,CACP,MAAO,CACL,cAAe,MACjB,EACA,KAAM,CACJ,cAAe,KACjB,CACF,EACA,UAAW,CACT,MAAO,CACL,WAAY,MACd,EACA,KAAM,CACJ,WAAY,YACZ,WAAY,OACZ,iBAAkB,MACpB,CACF,CACF,GACGK,GACJ,EAEKH,GAAWE,EAAO,WAAYG,EAAAP,EAAA,CAClC,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,OACP,OAAQ,OACR,OAAQ,OACR,QAAS,MACT,OAAQ,OACR,UAAW,UACX,UAAW,UACX,SAAU,UACV,WAAY,UACZ,QAAS,EACT,WAAY,UACZ,SAAU,SACV,mBAAoB,SACpB,QAAS,eACT,cAAe,MACf,WAAY,YACZ,WAAY,OACZ,iBAAkB,OAClB,WAAY,SACZ,oBAAqB,uBACrB,oBAAqB,QAClBK,IA1B+B,CA2BlC,UAAW,CACT,QAAS,OACT,OAAQ,MACV,CACF,EAAC,EoC9SD,IAAAG,GAAgB,wBAQT,SAASC,GACdC,EACAC,EACA,CAAE,aAAAC,EAAc,gBAAAC,EAAiB,OAAAC,EAAQ,OAAAC,CAAO,EAChD,CACA,GAAIL,EAAM,UAAYE,EAAa,oBAAqB,CACtD,IAAMI,EAAO,GAAAC,QAAI,QACf,GAAAA,QAAI,IAAIL,EAAa,KAAM,KAAK,IAAI,KAAK,IAAIE,CAAM,EAAG,KAAK,IAAIC,CAAM,CAAC,CAAC,CACzE,EACMG,EAAQ,GAAAD,QAAI,QAAQ,CACxBN,EAAO,MACJA,EAAO,MAAQD,EAAM,KAAK,KAAOI,EAAS,EAAI,EAAID,EAAgB,GAAKA,EAAgB,IAC1FF,EAAO,MACJA,EAAO,OAASD,EAAM,KAAK,KACzBK,EAAS,EAAI,EAAIF,EAAgB,GAAKA,EAAgB,GAC7D,CAAC,EACKM,EACHL,EAAS,GAAKC,GAAU,GAAOA,EAAS,GAAKD,GAAU,EACpDF,EAAa,SACX,CAACA,EAAa,SACd,EACFA,EAAa,SACnB,MAAO,CACL,KAAAI,EACA,MAAAE,EACA,SAAAC,CACF,CACF,KACE,OAAO,CACL,MAAO,GAAAF,QAAI,QAAQ,CAACN,EAAO,KAAMA,EAAO,IAAI,CAAC,EAC7C,KAAM,GAAAM,QAAI,QAAQ,CAACN,EAAO,MAAOA,EAAO,MAAM,CAAC,CACjD,CAEJ,CCzCA,IAAAS,GAAgB,wBAOT,SAASC,GACdC,EACAC,EACA,CACA,MAAO,CACL,KAAM,GAAAC,QAAI,QAAQ,CAACD,EAAO,MAAOA,EAAO,MAAM,CAAC,EAC/C,MAAO,GAAAC,QAAI,QAAQ,CAACD,EAAO,KAAMA,EAAO,IAAI,CAAC,CAC/C,CACF,CChBA,IAAAE,GAAuB,oBAAvB,IAAAC,GAAA,6BAIO,SAASC,GAASC,EAAWC,EAAWC,EAAqC,CAClFF,EAAIA,EAAI,IACRC,EAAIA,EAAI,IACRC,EAAIA,EAAI,IACR,IAAIC,EAAI,EACNC,EAAI,EACJC,EAAI,EACAC,EAAI,KAAK,MAAMN,EAAI,CAAC,EACxBO,EAAIP,EAAI,EAAIM,EACZE,EAAIN,GAAK,EAAID,GACbQ,EAAIP,GAAK,EAAIK,EAAIN,GACjBS,EAAIR,GAAK,GAAK,EAAIK,GAAKN,GACzB,OAAQK,EAAI,OACL,GACHH,EAAID,EACJE,EAAIM,EACJL,EAAIG,EACJ,UACG,GACHL,EAAIM,EACJL,EAAIF,EACJG,EAAIG,EACJ,UACG,GACHL,EAAIK,EACJJ,EAAIF,EACJG,EAAIK,EACJ,UACG,GACHP,EAAIK,EACJJ,EAAIK,EACJJ,EAAIH,EACJ,UACG,GACHC,EAAIO,EACJN,EAAII,EACJH,EAAIH,EACJ,UACG,GACHC,EAAID,EACJE,EAAII,EACJH,EAAII,EACJ,MAEJ,MAAO,CAAC,KAAK,MAAMN,EAAI,GAAG,EAAG,KAAK,MAAMC,EAAI,GAAG,EAAG,KAAK,MAAMC,EAAI,GAAG,CAAC,CACvE,CAEO,SAASM,GAASR,EAAWC,EAAWC,EAAqC,CAClFF,GAAK,IACLC,GAAK,IACLC,GAAK,IACL,IAAMO,EAAK,KAAK,IAAIT,EAAGC,EAAGC,CAAC,EACzBQ,EAAK,KAAK,IAAIV,EAAGC,EAAGC,CAAC,EACrBS,EAAIF,EAAKC,EACPb,EAAI,EACJc,IAAM,IACJF,IAAOT,EAAGH,GAAMI,EAAIC,GAAKS,EAAK,EACzBF,IAAOR,EAAGJ,GAAKK,EAAIF,GAAKW,EAAI,EAChCd,GAAKG,EAAIC,GAAKU,EAAI,EACvBd,EAAI,KAAK,MAAMA,EAAI,EAAE,EACjBA,EAAI,IAAGA,GAAK,MAElB,IAAMC,EAAIW,IAAO,EAAI,EAAI,KAAK,MAAOE,EAAIF,EAAM,GAAG,EAC5CV,EAAI,KAAK,MAAMU,EAAK,GAAG,EAC7B,MAAO,CAACZ,EAAGC,EAAGC,CAAC,CACjB,CAEO,SAASa,GAASC,EAAuC,CAC9D,IAAMC,EAAID,EAAI,QAAQ,IAAK,EAAE,EAAE,MAAM,OAAO,EAC5C,OAAKC,EACE,CAAC,SAASA,EAAE,GAAI,EAAE,EAAG,SAASA,EAAE,GAAI,EAAE,EAAG,SAASA,EAAE,GAAI,EAAE,CAAC,EADnD,CAAC,EAAG,EAAG,CAAC,CAEzB,CAEO,SAASC,GAASf,EAAWC,EAAWC,EAAmB,CAChE,MAAO,IAAM,CAACF,EAAGC,EAAGC,CAAC,EAAE,IAAKc,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAC5E,CAGA,IAAMC,GAAc,sBACb,SAASC,IAA4B,CAC1C,GAAI,CACF,OAAO,KAAK,MAAM,aAAa,QAAQD,EAAW,GAAK,IAAI,EAAE,MAAM,EAAG,EAAE,CAC1E,OAAQE,EAAN,CACA,MAAO,CAAC,CACV,CACF,CACO,SAASC,GAAiBP,EAAa,CAC5C,GAAIA,IAAQ,cAAe,OAC3B,IAAMhB,EAAIqB,GAAgB,EAAE,OAAQF,GAAMA,IAAMH,CAAG,EACnDhB,EAAE,QAAQgB,CAAG,EACb,aAAa,QAAQI,GAAa,KAAK,UAAUpB,EAAE,MAAM,EAAG,EAAE,CAAC,CAAC,CAClE,CAGA,IAAMwB,GACJ,wJAWK,IAAMC,GAAoB,QAAK,SAAqB,CACzD,MAAAC,EACA,QAAAC,EAAU,EACV,SAAAC,EACA,gBAAAC,EAAkB,GAClB,YAAAC,EAAc,EAChB,EAAqB,CACnB,IAAMC,EAAgBL,IAAU,cAC1BM,EAAMD,EAAiB,CAAC,IAAK,IAAK,GAAG,EAAiCE,GAASP,CAAK,EACpF,CAACQ,EAAKC,CAAM,EAAU,YAAmC,IAAMC,GAAS,GAAGJ,CAAG,CAAC,EAE/E,aAAU,IAAM,CACpB,GAAI,CAACD,EAAe,CAClB,IAAMM,EAASJ,GAASP,CAAK,EACvBY,EAASF,GAAS,GAAGC,CAAM,EACjCF,EAAOG,CAAM,CACf,CACF,EAAG,CAACZ,CAAK,CAAC,EAEV,IAAMa,EAAqB,UAA0B,IAAI,EACnDC,EAAqB,UAA0B,IAAI,EAEnD,aAAU,IAAM,CACpB,IAAMC,EAASF,EAAa,QAC5B,GAAI,CAACE,EAAQ,OACb,IAAMC,EAAMD,EAAO,WAAW,IAAI,EAC5BE,EAAIF,EAAO,MACfG,EAAIH,EAAO,OACP,CAACI,EAAGC,EAAGC,CAAC,EAAIC,GAASd,EAAI,GAAI,IAAK,GAAG,EAC3CQ,EAAI,UAAY,OAAOG,KAAKC,KAAKC,KACjCL,EAAI,SAAS,EAAG,EAAGC,EAAGC,CAAC,EACvB,IAAMK,EAAKP,EAAI,qBAAqB,EAAG,EAAGC,EAAG,CAAC,EAC9CM,EAAG,aAAa,EAAG,qBAAqB,EACxCA,EAAG,aAAa,EAAG,qBAAqB,EACxCP,EAAI,UAAYO,EAChBP,EAAI,SAAS,EAAG,EAAGC,EAAGC,CAAC,EACvB,IAAMM,EAAKR,EAAI,qBAAqB,EAAG,EAAG,EAAGE,CAAC,EAC9CM,EAAG,aAAa,EAAG,eAAe,EAClCA,EAAG,aAAa,EAAG,eAAe,EAClCR,EAAI,UAAYQ,EAChBR,EAAI,SAAS,EAAG,EAAGC,EAAGC,CAAC,CACzB,EAAG,CAACV,EAAI,EAAE,CAAC,EAEL,aAAU,IAAM,CACpB,IAAMO,EAASD,EAAa,QAC5B,GAAI,CAACC,EAAQ,OACb,IAAMC,EAAMD,EAAO,WAAW,IAAI,EAC5BE,EAAIF,EAAO,MACXK,EAAIJ,EAAI,qBAAqB,EAAG,EAAGC,EAAG,CAAC,EAC7C,QAASQ,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,GAAM,CAACN,EAAGO,EAAKL,CAAC,EAAIC,GAAUG,EAAI,EAAK,IAAK,IAAK,GAAG,EACpDL,EAAE,aAAaK,EAAI,EAAG,OAAON,KAAKO,KAAOL,IAAI,CAC/C,CACAL,EAAI,UAAYI,EAChBJ,EAAI,SAAS,EAAG,EAAGC,EAAGF,EAAO,MAAM,CACrC,EAAG,CAAC,CAAC,EAEL,IAAMY,EAAa,eACjB,CAACT,EAAWU,EAAWC,EAAWC,IAAc,CAC9C,GAAM,CAACX,EAAGC,EAAGC,CAAC,EAAIC,GAASJ,EAAGU,EAAGC,CAAC,EAC5BE,EAAMC,GAASb,EAAGC,EAAGC,CAAC,EAC5BY,GAAiBF,CAAG,EACpB7B,EAAS6B,EAAKD,CAAC,CACjB,EACA,CAAC5B,CAAQ,CACX,EAEMgC,EAAkB,eACrBC,GAA6C,CAC5CA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,IAAMC,EADSvB,EAAa,QACR,sBAAsB,EACpCwB,EAAUC,GAA6C,CAC3D,IAAMV,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAOU,EAAG,QAAUF,EAAK,MAAQA,EAAK,MAAS,GAAG,CAAC,EAC5EP,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAM,GAAKS,EAAG,QAAUF,EAAK,KAAOA,EAAK,QAAU,GAAG,CAAC,EACtF3B,EAAO,CAACD,EAAI,GAAIoB,EAAGC,CAAC,CAAC,EACrBF,EAAKnB,EAAI,GAAIoB,EAAGC,EAAG5B,CAAO,CAC5B,EACAoC,EAAOF,CAAC,EACR,IAAMI,EAAUD,GAAqBD,EAAOC,CAAE,EACxCE,EAAO,IAAM,CACjB,SAAS,oBAAoB,cAAeD,CAAM,EAClD,SAAS,oBAAoB,YAAaC,CAAI,CAChD,EACA,SAAS,iBAAiB,cAAeD,CAAM,EAC/C,SAAS,iBAAiB,YAAaC,CAAI,CAC7C,EACA,CAAChC,EAAKP,EAAS0B,CAAI,CACrB,EAEMc,EAAkB,eACrBN,GAA6C,CAC5CA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,IAAMC,EADStB,EAAa,QACR,sBAAsB,EACpCuB,EAAUC,GAA4B,CAC1C,IAAMpB,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAOoB,EAAG,QAAUF,EAAK,MAAQA,EAAK,MAAS,GAAG,CAAC,EAClF3B,EAAO,CAACS,EAAGV,EAAI,GAAIA,EAAI,EAAE,CAAC,EAC1BmB,EAAKT,EAAGV,EAAI,GAAIA,EAAI,GAAIP,CAAO,CACjC,EACAoC,EAAOF,CAAC,EACR,IAAMI,EAAUD,GAAqBD,EAAOC,CAAE,EACxCE,EAAO,IAAM,CACjB,SAAS,oBAAoB,cAAeD,CAAM,EAClD,SAAS,oBAAoB,YAAaC,CAAI,CAChD,EACA,SAAS,iBAAiB,cAAeD,CAAM,EAC/C,SAAS,iBAAiB,YAAaC,CAAI,CAC7C,EACA,CAAChC,EAAKP,EAAS0B,CAAI,CACrB,EAEMe,EAAsB,UAAuB,IAAI,EACjDC,EAAsB,eACzBR,GAA0C,CACzCA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,IAAMC,EADMM,EAAc,QACT,sBAAsB,EACjCL,EAAUC,GAA4B,CAC1C,IAAMR,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,GAAIQ,EAAG,QAAUF,EAAK,MAAQA,EAAK,KAAK,CAAC,EACnE/B,EACAH,EAAS,cAAe4B,CAAC,EADVH,EAAKnB,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIsB,CAAC,CAEpD,EACAO,EAAOF,CAAC,EACR,IAAMI,EAAUD,GAAqBD,EAAOC,CAAE,EACxCE,EAAO,IAAM,CACjB,SAAS,oBAAoB,cAAeD,CAAM,EAClD,SAAS,oBAAoB,YAAaC,CAAI,CAChD,EACA,SAAS,iBAAiB,cAAeD,CAAM,EAC/C,SAAS,iBAAiB,YAAaC,CAAI,CAC7C,EACA,CAAChC,EAAKH,EAAesB,EAAMzB,CAAQ,CACrC,EAEM0C,EAAavC,EAAgB,cAAgB2B,GAAS,GAAGV,GAASd,EAAI,GAAIA,EAAI,GAAIA,EAAI,EAAE,CAAC,EACzFqC,EAAaxC,EAAgB,CAAC,IAAK,IAAK,GAAG,EAAIiB,GAASd,EAAI,GAAIA,EAAI,GAAIA,EAAI,EAAE,EAEpF,SACE,SAACsC,GAAA,CAAQ,QAAUX,GAAMA,EAAE,gBAAgB,EAAG,cAAgBA,GAAMA,EAAE,gBAAgB,EACpF,sBAACY,GAAA,CACC,qBAAC,UACC,IAAKlC,EACL,MAAO,IACP,OAAQ,IACR,cAAeqB,EACf,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,YAAa,aAAc,CAAE,EAC/E,EACC,CAAC7B,MACA,QAAC2C,GAAA,CACC,MAAO,CACL,KAAM,GAAGxC,EAAI,MACb,IAAK,GAAG,IAAMA,EAAI,MAClB,YAAaA,EAAI,GAAK,GAAK,OAAS,MACtC,EACF,GAEJ,KAEA,SAACyC,GAAA,CACC,qBAAC,UACC,IAAKnC,EACL,MAAO,IACP,OAAQ,GACR,cAAe2B,EACf,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,UAAW,aAAc,CAAE,EAC7E,EACC,CAACpC,MAAiB,QAAC6C,GAAA,CAAS,MAAO,CAAE,KAAM,GAAI1C,EAAI,GAAK,IAAO,MAAO,EAAG,GAC5E,EAECJ,MACC,SAAC6C,GAAA,CACC,qBAACE,GAAA,CACC,IAAKT,EACL,cAAeC,EACf,MAAO,CACL,WAAY,0CACVC,IAAe,cAAgB,OAASA,KAE1C,OAAQ,SACV,EACF,KACA,QAACM,GAAA,CAAS,MAAO,CAAE,KAAM,GAAGjD,EAAU,MAAO,EAAG,GAClD,KAGF,SAACmD,GAAA,CACC,qBAACC,GAAA,CACC,MAAOhD,EAAgB,GAAKuC,EAAW,QAAQ,IAAK,EAAE,EACtD,YAAY,MACZ,UAAW,EACX,SAAWT,GAAM,CACf,IAAMN,EAAIM,EAAE,OAAO,MAAM,QAAQ,gBAAiB,EAAE,EAAE,MAAM,EAAG,CAAC,EAChE,GAAIN,EAAE,SAAW,EAAG,CAClB,IAAMyB,EAAK/C,GAAS,IAAMsB,CAAC,EAC3BpB,EAAOC,GAAS,GAAG4C,CAAE,CAAC,EACtBpD,EAAS,IAAM2B,EAAG5B,CAAO,EACzBgC,GAAiB,IAAMJ,CAAC,CAC1B,CACF,EACA,UAAYM,GAAMA,EAAE,gBAAgB,EACtC,EACC,CAAC,EAAG,EAAG,CAAC,EAAE,IAAKV,MACd,QAAC8B,GAAA,CAEC,MAAOV,EAAWpB,GAClB,KAAK,SACL,IAAK,EACL,IAAK,IACL,SAAWU,GAAM,CACf,IAAMN,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,OAAOM,EAAE,OAAO,KAAK,CAAC,CAAC,EACrDxB,EAAS,CAAC,GAAGkC,CAAU,EAC7BlC,EAAOc,GAAKI,EACZpB,EAAOC,GAAS,GAAGC,CAAM,CAAC,EAC1B,IAAMoB,EAAMC,GAAS,GAAGrB,CAAM,EAC9BT,EAAS6B,EAAK9B,CAAO,EACrBgC,GAAiBF,CAAG,CACtB,EACA,UAAYI,GAAMA,EAAE,gBAAgB,GAd/BV,CAeP,CACD,EACArB,MACC,QAACmD,GAAA,CACC,MAAO,KAAK,MAAMtD,EAAU,GAAG,EAC/B,KAAK,SACL,IAAK,EACL,IAAK,IACL,SAAWkC,GAAM,CACf,IAAML,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,OAAOK,EAAE,OAAO,KAAK,CAAC,CAAC,EAAI,IAC1D9B,EACAH,EAAS,cAAe4B,CAAC,EADVH,EAAKnB,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIsB,CAAC,CAEpD,EACA,UAAYK,GAAMA,EAAE,gBAAgB,EACpC,MAAO,CAAE,MAAO,EAAG,EACrB,GAEJ,KACA,SAACqB,GAAA,CACC,qBAAC,QAAK,MAAO,CAAE,KAAM,CAAE,EAAG,eAAG,KAC7B,QAAC,QAAK,aAAC,KACP,QAAC,QAAK,aAAC,KACP,QAAC,QAAK,aAAC,EACNpD,MAAe,QAAC,QAAK,aAAC,GACzB,KAEA,SAACqD,GAAA,CACE,UAAAtD,MACC,QAACuD,GAAA,CACC,MAAM,cACN,QAASrD,EACT,MAAO,CAAE,gBAAiBsD,GAAS,eAAgB,SAAU,EAC7D,QAAS,IAAMzD,EAAS,cAAeD,CAAO,EAChD,EAED2D,GAAgB,EAAE,IAAKC,MACtB,QAACH,GAAA,CAEC,MAAO,CAAE,gBAAiBG,CAAE,EAC5B,QAASjB,IAAeiB,EACxB,QAAS,IAAM,CACb,IAAMP,EAAK/C,GAASsD,CAAC,EACrBpD,EAAOC,GAAS,GAAG4C,CAAE,CAAC,EACtBpD,EAAS2D,EAAG5D,CAAO,CACrB,GAPK4D,CAQP,CACD,GACH,GACF,CAEJ,CAAC,EAYYC,GAAyB,QAAK,SAA0B,CACnE,MAAA9D,EACA,QAAAC,EAAU,EACV,SAAAC,EACA,gBAAAC,EAAkB,GAClB,YAAAC,EAAc,GACd,MAAA2D,CACF,EAA0B,CACxB,GAAM,CAACC,EAAMC,CAAO,EAAU,YAAS,EAAK,EACtCC,EAAY,UAAuB,IAAI,EACvC7D,EAAgBL,IAAU,cAEhC,OAAM,aAAU,IAAM,CACpB,IAAM,EAAKmC,GAAkB,CACvB+B,EAAI,SAAW,CAACA,EAAI,QAAQ,SAAS/B,EAAE,MAAc,GAAG8B,EAAQ,EAAK,CAC3E,EACA,gBAAS,iBAAiB,YAAa,CAAC,EACjC,IAAM,SAAS,oBAAoB,YAAa,CAAC,CAC1D,EAAG,CAAC,CAAC,KAKH,SAACE,GAAA,CAAgB,IAAKD,EACpB,sBAACE,GAAA,CACE,UAAAL,MAAS,QAACM,GAAA,CAAa,SAAAN,EAAM,KAC9B,QAACO,GAAA,CACC,QAAS,IAAML,EAAQ,CAACD,CAAI,EAC5B,MAAO,CACL,gBAAiB3D,EAAgB,cAAgBL,EACjD,gBAAiBK,EAAgBsD,GAAU,OAC3C,eAAgB,SAClB,EACF,KACA,QAACY,GAAA,CACC,MAAOlE,EAAgB,IAfZA,EAAgB,cAAgBL,GAeJ,QAAQ,IAAK,EAAE,EAAE,YAAY,EACpE,YAAY,SACZ,UAAW,EACX,SAAWmC,GAAM,CACf,IAAMN,EAAIM,EAAE,OAAO,MACnB,GAAIN,EAAE,YAAY,IAAM,cAAe,CACrC3B,EAAS,cAAeD,CAAO,EAC/B,MACF,CACA,IAAMuE,EAAQ3C,EAAE,QAAQ,iBAAkB,EAAE,EAAE,MAAM,EAAG,CAAC,EACxD,GAAI,qBAAqB,KAAK2C,CAAK,GAAK,oBAAoB,KAAKA,CAAK,EAAG,CACvE,IAAMzC,EAAMyC,EAAM,WAAW,GAAG,EAAIA,EAAQ,IAAMA,EAClDtE,EAAS6B,EAAK9B,CAAO,EACrBgC,GAAiBF,CAAG,CACtB,CACF,EACA,UAAYI,GAAMA,EAAE,gBAAgB,EACtC,KACA,SAACsC,GAAA,CAAmB,eAAK,MAAMxE,EAAU,GAAG,EAAE,KAAC,GACjD,EACC+D,MACC,QAACU,GAAA,CACC,oBAAC3E,GAAA,CACC,MAAOC,EACP,QAASC,EACT,SAAU,CAAC4D,EAAG/B,IAAM5B,EAAS2D,EAAG/B,CAAC,EACjC,gBAAiB3B,EACjB,YAAaC,EACf,EACF,GAEJ,CAEJ,CAAC,EAGK0C,GAAU6B,EAAO,MAAO,CAC5B,WAAY,SACZ,OAAQ,uBACR,aAAc,MACd,QAAS,MACT,QAAS,OACT,cAAe,SACf,IAAK,MACL,UAAW,8BACX,SAAU,GACZ,CAAC,EAEK5B,GAAW4B,EAAO,MAAO,CAC7B,SAAU,WACV,MAAO,OACP,OAAQ,IACR,aAAc,EACd,SAAU,QACZ,CAAC,EAEK3B,GAAY2B,EAAO,MAAO,CAC9B,SAAU,WACV,MAAO,GACP,OAAQ,GACR,aAAc,MACd,OAAQ,kBACR,UAAW,wBACX,cAAe,OACf,UAAW,yBACb,CAAC,EAEK1B,GAAU0B,EAAO,MAAO,CAC5B,SAAU,WACV,MAAO,OACP,OAAQ,GACR,aAAc,EACd,SAAU,SACZ,CAAC,EAEKzB,GAAWyB,EAAO,MAAO,CAC7B,SAAU,WACV,IAAK,MACL,MAAO,GACP,OAAQ,GACR,aAAc,MACd,WAAY,OACZ,OAAQ,4BACR,UAAW,4BACX,UAAW,wBACX,cAAe,MACjB,CAAC,EAEKxB,GAAawB,EAAO,MAAO,CAC/B,MAAO,OACP,OAAQ,OACR,aAAc,EACd,gBAAiBhB,GACjB,eAAgB,UAChB,SAAU,UACZ,CAAC,EAEKP,GAAWuB,EAAO,MAAO,CAC7B,QAAS,OACT,IAAK,EACL,WAAY,QACd,CAAC,EAEKnB,GAAcmB,EAAO,MAAO,CAChC,QAAS,OACT,IAAK,EACL,SAAU,MACV,MAAO,yBACP,QAAS,QACT,WAAY,CAAE,KAAM,EAAG,UAAW,QAAS,CAC7C,CAAC,EAEKtB,GAAWsB,EAAO,QAAS,CAC/B,KAAM,EACN,WAAY,WACZ,OAAQ,yBACR,aAAc,EACd,MAAO,QACP,SAAU,MACV,QAAS,UACT,WAAY,QACZ,QAAS,OACT,cAAe,YACf,UAAW,CAAE,YAAa,SAAU,EACpC,6DAA8D,CAAE,QAAS,MAAO,CAClF,CAAC,EAEKpB,GAAWoB,EAAO,QAAS,CAC/B,KAAM,EACN,MAAO,GACP,WAAY,WACZ,OAAQ,yBACR,aAAc,EACd,MAAO,QACP,SAAU,MACV,QAAS,UACT,WAAY,QACZ,QAAS,OACT,UAAW,SACX,UAAW,CAAE,YAAa,SAAU,EACpC,6DAA8D,CAAE,QAAS,MAAO,CAClF,CAAC,EAEKlB,GAAYkB,EAAO,MAAO,CAC9B,QAAS,OACT,SAAU,OACV,IAAK,EACL,WAAY,CACd,CAAC,EAEKjB,GAASiB,EAAO,MAAO,CAC3B,MAAO,GACP,OAAQ,GACR,aAAc,EACd,OAAQ,UACR,OAAQ,uBACR,WAAY,oCACZ,UAAW,CAAE,UAAW,aAAc,EACtC,SAAU,CACR,QAAS,CACP,KAAM,CACJ,UAAW,2BACX,UAAW,YACb,CACF,CACF,CACF,CAAC,EAEKR,GAAkBQ,EAAO,MAAO,CACpC,SAAU,WACV,MAAO,MACT,CAAC,EAEKP,GAAiBO,EAAO,MAAO,CACnC,QAAS,OACT,WAAY,SACZ,IAAK,CACP,CAAC,EAEKN,GAAcM,EAAO,QAAS,CAClC,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,MAAO,GACP,WAAY,EACZ,UAAW,OACb,CAAC,EAEKL,GAAgBK,EAAO,MAAO,CAClC,MAAO,GACP,OAAQ,GACR,aAAc,KACd,OAAQ,uBACR,WAAY,EACZ,OAAQ,UACR,WAAY,mBACZ,UAAW,CAAE,UAAW,0BAA2B,CACrD,CAAC,EAEKJ,GAAgBI,EAAO,QAAS,CACpC,KAAM,EACN,WAAY,WACZ,OAAQ,yBACR,aAAc,KACd,MAAO,QACP,SAAU,MACV,QAAS,UACT,WAAY,QACZ,QAAS,OACT,cAAe,YACf,UAAW,CAAE,YAAa,SAAU,CACtC,CAAC,EAEKF,GAAoBE,EAAO,OAAQ,CACvC,SAAU,MACV,MAAO,iBACP,WAAY,QACZ,MAAO,GACP,UAAW,UACX,WAAY,CACd,CAAC,EAEKD,GAAgBC,EAAO,MAAO,CAClC,SAAU,WACV,IAAK,OACL,KAAM,EACN,MAAO,EACP,OAAQ,IACR,UAAW,EACX,UAAW,6BACX,aAAc,KACd,SAAU,SACZ,CAAC,ECrpBD,IAAAC,GAAuB,oBAAvB,IAAAC,GAAA,6BAeaC,GAAuB,QAAK,SAAwB,CAC/D,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,IAAAC,EAAM,KACN,IAAAC,EAAM,IACN,KAAAC,EAAO,EACP,OAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,EACf,EAAwB,CACtB,GAAM,CAACC,EAASC,CAAU,EAAU,YAAS,EAAK,EAC5C,CAACC,EAAWC,CAAY,EAAU,YAAS,OAAOZ,CAAK,CAAC,EACxDa,EAAiB,UAAyB,IAAI,EAC9CC,EAAgB,UAAO,CAAE,OAAQ,GAAO,OAAQ,EAAG,SAAU,CAAE,CAAC,EAEhE,aAAU,IAAM,CACfL,GAASG,EAAa,OAAO,KAAK,MAAMZ,EAAQ,GAAG,EAAI,GAAG,CAAC,CAClE,EAAG,CAACA,EAAOS,CAAO,CAAC,EAEnB,IAAMM,EAASC,GAAc,KAAK,IAAIZ,EAAK,KAAK,IAAID,EAAKa,CAAC,CAAC,EAGrDC,EAA2B,eAC9BC,GAA4C,CAC3CA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBJ,EAAQ,QAAU,CAAE,OAAQ,GAAM,OAAQI,EAAE,QAAS,SAAUlB,CAAM,EACrE,IAAMmB,EAAKD,EAAE,cACbC,EAAG,kBAAkBD,EAAE,SAAS,EAEhC,IAAME,EAAUC,GAAqB,CACnC,GAAI,CAACP,EAAQ,QAAQ,OAAQ,OAC7B,IAAMQ,EAAKD,EAAG,QAAUP,EAAQ,QAAQ,OAClCS,EAAQF,EAAG,SAAW,GAAKA,EAAG,OAAS,GAAM,EAC7CG,EAAQ,KAAK,MAAMF,EAAKC,EAAQlB,CAAI,EAC1CJ,EAASc,EAAMD,EAAQ,QAAQ,SAAWU,CAAK,CAAC,CAClD,EAEMC,EAAO,IAAM,CACjBX,EAAQ,QAAQ,OAAS,GACzBK,EAAG,sBAAsBD,EAAE,SAAS,EACpC,SAAS,oBAAoB,cAAeE,CAAM,EAClD,SAAS,oBAAoB,YAAaK,CAAI,CAChD,EAEA,SAAS,iBAAiB,cAAeL,CAAM,EAC/C,SAAS,iBAAiB,YAAaK,CAAI,CAC7C,EACA,CAACzB,EAAOC,EAAUE,EAAKC,EAAKC,CAAI,CAClC,EAGMqB,EAA2B,eAC9BR,GAA0C,CACzCA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB,IAAMS,EAAST,EAAE,QACXU,EAAW5B,EACb6B,EAAU,GACdf,EAAQ,QAAU,CAAE,OAAQ,GAAM,OAAAa,EAAQ,SAAAC,CAAS,EAEnD,IAAMR,EAAUC,GAAqB,CACnC,IAAMC,EAAKD,EAAG,QAAUM,EAExB,GADI,KAAK,IAAIL,CAAE,EAAI,IAAGO,EAAU,IAC5B,CAACA,EAAS,OACd,IAAMN,EAAQF,EAAG,SAAW,GAAKA,EAAG,OAAS,GAAM,EAC7CG,EAAQ,KAAK,MAAMF,EAAKC,EAAQlB,CAAI,EAC1CJ,EAASc,EAAMa,EAAWJ,CAAK,CAAC,CAClC,EAEMC,EAAO,IAAM,CACjBX,EAAQ,QAAQ,OAAS,GACzB,SAAS,oBAAoB,cAAeM,CAAM,EAClD,SAAS,oBAAoB,YAAaK,CAAI,EACzCI,IACHnB,EAAW,EAAI,EACf,WAAW,IAAG,CA5FxB,IAAAoB,EA4F2B,OAAAA,EAAAjB,EAAS,UAAT,YAAAiB,EAAkB,UAAU,CAAC,EAElD,EAEA,SAAS,iBAAiB,cAAeV,CAAM,EAC/C,SAAS,iBAAiB,YAAaK,CAAI,CAC7C,EACA,CAACzB,EAAOC,EAAUE,EAAKC,EAAKC,CAAI,CAClC,EAEM0B,EAAmB,eAAY,IAAM,CACzCrB,EAAW,EAAK,EAChB,IAAMsB,EAAI,WAAWrB,CAAS,EACzB,MAAMqB,CAAC,GAAG/B,EAASc,EAAMiB,CAAC,CAAC,CAClC,EAAG,CAACrB,EAAWV,EAAUE,EAAKC,CAAG,CAAC,EAElC,SACE,SAAC6B,GAAA,CAAK,MAAO1B,EACV,UAAAL,MACC,QAACgC,GAAA,CACC,MAAO,CAAE,MAAO1B,EAAY,OAAQ,WAAY,EAChD,cAAeS,EAEd,SAAAf,EACH,EAEDO,KACC,QAAC0B,GAAA,CACC,IAAKtB,EACL,MAAOF,EACP,SAAWO,GAAMN,EAAaM,EAAE,OAAO,KAAK,EAC5C,OAAQa,EACR,UAAYb,GAAM,CACZA,EAAE,MAAQ,SAASa,EAAW,EAC9Bb,EAAE,MAAQ,UAAUR,EAAW,EAAK,EACxCQ,EAAE,gBAAgB,CACpB,EACA,UAAS,GACX,KAEA,SAACkB,GAAA,CAAa,cAAeV,EAC1B,eAAK,MAAM1B,EAAQ,GAAG,EAAI,IAC1BM,MAAU,QAAC+B,GAAA,CAAQ,SAAA/B,EAAO,GAC7B,GAEJ,CAEJ,CAAC,EAEK2B,GAAOK,EAAO,MAAO,CACzB,QAAS,OACT,WAAY,SACZ,IAAK,MACL,SAAU,CACZ,CAAC,EAEKJ,GAAYI,EAAO,QAAS,CAChC,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,WAAY,EACZ,UAAW,QACX,WAAY,OACZ,OAAQ,YACR,WAAY,CAAE,OAAQ,WAAY,CACpC,CAAC,EAEKH,GAAcG,EAAO,QAAS,CAClC,MAAO,OACP,WAAY,WACZ,OAAQ,oBACR,aAAc,KACd,MAAO,QACP,SAAU,OACV,QAAS,UACT,WAAY,QACZ,QAAS,OACT,6DAA8D,CAAE,QAAS,MAAO,CAClF,CAAC,EAEKF,GAAeE,EAAO,MAAO,CACjC,KAAM,EACN,WAAY,WACZ,OAAQ,yBACR,aAAc,KACd,MAAO,QACP,SAAU,OACV,QAAS,UACT,WAAY,QACZ,OAAQ,YACR,SAAU,EACV,SAAU,SACV,aAAc,WACd,WAAY,SACZ,WAAY,OACZ,WAAY,oBACZ,UAAW,CAAE,YAAa,SAAU,CACtC,CAAC,EAEKD,GAASC,EAAO,OAAQ,CAC5B,SAAU,MACV,MAAO,iBACP,WAAY,KACd,CAAC,ECnMD,IAAAC,GAAuB,oBAAvB,IAAAC,EAAA,6BAsBO,SAASC,GAAiBC,EAA4B,CAE3D,IAAMC,EADS,CAAC,GAAGD,EAAK,KAAK,EAAE,KAAK,CAACE,EAAGC,IAAMD,EAAE,SAAWC,EAAE,QAAQ,EAElE,IAAKC,GAAM,CACV,IAAMC,EAAMD,EAAE,MACRE,EAAQ,KAAK,MAAMF,EAAE,QAAU,GAAG,EACrC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EAClB,MAAO,GAAGC,IAAMC,KAASF,EAAE,WAC7B,CAAC,EACA,KAAK,IAAI,EAEZ,OAAQJ,EAAK,UACN,SACH,MAAO,mBAAmBA,EAAK,aAAaC,SACzC,SACH,MAAO,6BAA6BD,EAAK,YAAYA,EAAK,aAAaC,SACpE,QACH,MAAO,uBAAuBD,EAAK,eAAeA,EAAK,YAAYA,EAAK,aAAaC,SAClF,UACH,MAAO,uBAAuBD,EAAK,aAAaC,KAEtD,CAEA,IAAMM,GAA6B,CACjC,KAAM,SACN,MAAO,CACL,CAAE,MAAO,UAAW,SAAU,EAAG,QAAS,CAAE,EAC5C,CAAE,MAAO,UAAW,SAAU,IAAK,QAAS,CAAE,CAChD,EACA,MAAO,GACP,QAAS,GACT,QAAS,EACX,EAGMC,GAAc,yBACpB,SAASC,IAA6B,CACpC,GAAI,CACF,OAAO,KAAK,MAAM,aAAa,QAAQD,EAAW,GAAK,IAAI,CAC7D,OAAQE,EAAN,CACA,MAAO,CAAC,CACV,CACF,CACA,SAASC,GAAWX,EAAoB,CACtC,IAAMY,EAAUH,GAAW,EAC3BG,EAAQ,QAAQZ,CAAI,EACpB,aAAa,QAAQQ,GAAa,KAAK,UAAUI,EAAQ,MAAM,EAAG,EAAE,CAAC,CAAC,CACxE,CACA,SAASC,GAAaC,EAAa,CACjC,IAAMF,EAAUH,GAAW,EAC3BG,EAAQ,OAAOE,EAAK,CAAC,EACrB,aAAa,QAAQN,GAAa,KAAK,UAAUI,CAAO,CAAC,CAC3D,CAGA,SAASG,IAAa,CACpB,SACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QACC,oBAAC,kBAAe,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAC9C,oBAAC,QAAK,OAAO,KAAK,UAAU,UAAU,KACtC,OAAC,QAAK,OAAO,OAAO,UAAU,UAAU,GAC1C,EACF,KACA,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,IAAI,KAAK,WAAW,GAClE,CAEJ,CACA,SAASC,IAAa,CACpB,SACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QACC,oBAAC,kBAAe,GAAG,KACjB,oBAAC,QAAK,OAAO,KAAK,UAAU,UAAU,KACtC,OAAC,QAAK,OAAO,OAAO,UAAU,UAAU,GAC1C,EACF,KACA,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,IAAI,KAAK,WAAW,GAClE,CAEJ,CACA,SAASC,IAAY,CACnB,SACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,UAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,OAAO,UAAU,YAAY,MAAM,KAC3E,OAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,UAAU,YAAY,MAAM,GACvE,CAEJ,CACA,SAASC,IAAc,CACrB,SACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,WAAQ,OAAO,oBAAoB,KAAK,OAAO,OAAO,UAAU,YAAY,MAAM,KACnF,OAAC,UAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,UAAU,GAC7C,CAEJ,CAEA,IAAMC,GAAoD,CACxD,UAAQ,OAACJ,GAAA,EAAW,EACpB,UAAQ,OAACC,GAAA,EAAW,EACpB,SAAO,OAACC,GAAA,EAAU,EAClB,WAAS,OAACC,GAAA,EAAY,CACxB,EAOaE,GAAuB,QAAK,SAAwB,CAC/D,MAAAC,EACA,SAAAC,CACF,EAAwB,CACtB,GAAM,CAACtB,EAAMuB,CAAO,EAAU,YAAuBF,GAASd,EAAY,EACpE,CAACiB,EAAaC,CAAc,EAAU,YAAS,CAAC,EAChD,CAACC,EAAaC,CAAc,EAAU,YAAS,EAAK,EACpDC,EAAe,UAAuB,IAAI,EAC1CC,EAAmB,UAAuB,IAAI,EAE9C,aAAU,IAAM,CAChBR,GAAOE,EAAQF,CAAK,CAC1B,EAAG,CAACA,CAAK,CAAC,EAGJ,aAAU,IAAM,CACpB,IAAMS,EAASpB,GAAqB,EAC9BA,EAAE,MAAQ,UAAYA,EAAE,MAAQ,cAC9BV,EAAK,MAAM,OAAS,IACtBU,EAAE,eAAe,EACjBqB,EAAgBP,CAAW,EAGjC,EACMQ,EAAKH,EAAW,QACtB,GAAIG,EACF,OAAAA,EAAG,iBAAiB,UAAWF,CAAK,EAC7B,IAAME,EAAG,oBAAoB,UAAWF,CAAK,CAGxD,EAAG,CAAC9B,EAAK,MAAM,OAAQwB,CAAW,CAAC,EAEnC,IAAMS,EAAe,eAClBC,GAAiC,CAChCX,EAASY,GAAM,CACb,IAAMC,EAAOC,IAAA,GAAKF,GAAMD,GACxB,OAAAZ,EAASc,EAAMrC,GAAiBqC,CAAI,CAAC,EAC9BA,CACT,CAAC,CACH,EACA,CAACd,CAAQ,CACX,EAEMgB,EAAmB,eACvB,CAACxB,EAAaoB,IAAiC,CAC7CX,EAASY,GAAM,CACb,IAAMlC,EAAQkC,EAAE,MAAM,IAAI,CAAC/B,EAAGmC,IAAOA,IAAMzB,EAAMuB,IAAA,GAAKjC,GAAM8B,GAAU9B,CAAE,EAClEgC,EAAOI,EAAAH,EAAA,GAAKF,GAAL,CAAQ,MAAAlC,CAAM,GAC3B,OAAAqB,EAASc,EAAMrC,GAAiBqC,CAAI,CAAC,EAC9BA,CACT,CAAC,CACH,EACA,CAACd,CAAQ,CACX,EAEMmB,EAAgB,eACnB/B,GAAwC,CACvC,GAAI,CAACkB,EAAO,SAAYlB,EAAE,OAAuB,QAAQ,MAAO,OAChE,IAAMgC,EAAOd,EAAO,QAAQ,sBAAsB,EAC5Ce,EAAM,KAAK,OAAQjC,EAAE,QAAUgC,EAAK,MAAQA,EAAK,MAAS,GAAG,EAC7DE,EAAwB,CAAE,MAAO,UAAW,SAAUD,EAAK,QAAS,CAAE,EAC5EpB,EAASY,GAAM,CACb,IAAMlC,EAAQ,CAAC,GAAGkC,EAAE,MAAOS,CAAO,EAC5BR,EAAOI,EAAAH,EAAA,GAAKF,GAAL,CAAQ,MAAAlC,CAAM,GAC3B,OAAAqB,EAASc,EAAMrC,GAAiBqC,CAAI,CAAC,EACrCX,EAAexB,EAAM,OAAS,CAAC,EACxBmC,CACT,CAAC,CACH,EACA,CAACd,CAAQ,CACX,EAEMS,EAAwB,eAC3BjB,GAAgB,CACXd,EAAK,MAAM,QAAU,GACzBuB,EAASY,GAAM,CACb,IAAMlC,EAAQkC,EAAE,MAAM,OAAO,CAACU,EAAGN,IAAMA,IAAMzB,CAAG,EAC1CsB,EAAOI,EAAAH,EAAA,GAAKF,GAAL,CAAQ,MAAAlC,CAAM,GAC3B,OAAAqB,EAASc,EAAMrC,GAAiBqC,CAAI,CAAC,EACrCX,EAAe,KAAK,IAAIX,EAAKb,EAAM,OAAS,CAAC,CAAC,EACvCmC,CACT,CAAC,CACH,EACA,CAACpC,EAAK,MAAM,OAAQsB,CAAQ,CAC9B,EAEMwB,EAAoB,eACxB,CAACpC,EAAuBI,IAAgB,CACtCJ,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBe,EAAeX,CAAG,EAClB,IAAM4B,EAAOd,EAAO,QAAS,sBAAsB,EAC7CmB,EAAUC,GAAqB,CACnC,IAAML,EAAM,KAAK,IACf,EACA,KAAK,IAAI,IAAK,KAAK,OAAQK,EAAG,QAAUN,EAAK,MAAQA,EAAK,MAAS,GAAG,CAAC,CACzE,EACAJ,EAAWxB,EAAK,CAAE,SAAU6B,CAAI,CAAC,CACnC,EACMM,EAAO,IAAM,CACjB,SAAS,oBAAoB,cAAeF,CAAM,EAClD,SAAS,oBAAoB,YAAaE,CAAI,CAChD,EACA,SAAS,iBAAiB,cAAeF,CAAM,EAC/C,SAAS,iBAAiB,YAAaE,CAAI,CAC7C,EACA,CAACX,CAAU,CACb,EAEMY,EAAUnD,GAAiBC,CAAI,EAC/BmD,EAAenD,EAAK,MAAMwB,GAC1BZ,EAAUH,GAAW,EAE3B,SACE,QAAC2C,GAAA,CACC,IAAKvB,EACL,SAAU,GACV,QAAUnB,GAAMA,EAAE,gBAAgB,EAClC,cAAgBA,GAAMA,EAAE,gBAAgB,EAGxC,oBAAC2C,GAAA,CACG,UAAC,SAAU,SAAU,QAAS,SAAS,EAAY,IAAKC,MACxD,QAACC,GAAA,CAEC,QAASvD,EAAK,OAASsD,EACvB,QAAS,IAAMrB,EAAO,CAAE,KAAMqB,CAAE,CAAC,EACjC,MAAOA,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC,EAE3C,UAAAnC,GAAWmC,MACZ,OAACE,GAAA,CAAW,SAAAF,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC,EAAE,IAN9CA,CAOP,CACD,EACH,KAGA,OAACG,GAAA,CAAW,MAAO,CAAE,WAAYP,CAAQ,EAAG,KAG5C,QAACQ,GAAA,CACC,qBAACC,GAAA,CAAS,oBAAQ3D,EAAK,MAAM,OAAO,KAAC,KACrC,QAAC4D,GAAA,CAAa,IAAKhC,EAAQ,QAASa,EAClC,oBAACoB,GAAA,CAAY,MAAO,CAAE,WAAYX,CAAQ,EAAG,EAC5ClD,EAAK,MAAM,IAAI,CAAC8D,EAAMvB,OACrB,OAACwB,GAAA,CAEC,aAAW,OACX,UAAWxB,IAAMf,EACjB,MAAO,CAAE,KAAM,GAAGsC,EAAK,YAAa,gBAAiBA,EAAK,KAAM,EAChE,cAAgBpD,GAAMoC,EAAYpC,EAAG6B,CAAC,EACtC,cAAe,IAAMR,EAAgBQ,CAAC,GALjCA,CAMP,CACD,GACH,KACA,OAACyB,GAAA,CAAQ,sEAAoD,GAC/D,EAGCb,MACC,QAACc,GAAA,CACC,qBAACC,GAAA,CAAa,kBAAM1C,EAAc,GAAE,KACpC,OAAC2C,GAAA,CACC,KAAK,SACL,IAAK,EACL,IAAK,IACL,MAAOhB,EAAa,SACpB,SAAWzC,GACT4B,EAAWd,EAAa,CACtB,SAAU,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,OAAOd,EAAE,OAAO,KAAK,CAAC,CAAC,CAC7D,CAAC,EAEH,UAAYA,GAAMA,EAAE,gBAAgB,EACtC,KACA,OAAC0D,GAAA,CAAU,aAAC,GACd,EAIDjB,MACC,OAACkB,GAAA,CACC,MAAOlB,EAAa,MACpB,QAASA,EAAa,QACtB,SAAU,CAACmB,EAAGpE,IAAM,CAClBoC,EAAWd,EAAa,CAAE,MAAO8C,EAAG,QAASpE,CAAE,CAAC,EAC5CoE,IAAM,eAAeC,GAAiBD,CAAC,CAC7C,EACA,gBAAiB,GACnB,KAIF,QAACE,GAAA,CACC,oBAACC,GAAA,CAAiB,oBAAQ,GACxBzE,EAAK,OAAS,UAAYA,EAAK,OAAS,aACxC,QAAC0E,GAAA,CACC,oBAACN,GAAA,CAAU,iBAAK,KAChB,OAACO,GAAA,CACC,MAAO,CAAE,UAAW,UAAU3E,EAAK,WAAY,EAC/C,cAAgBU,GAAM,CACpBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB,IAAMgC,EAAOhC,EAAE,cAAc,sBAAsB,EAC7CkE,EAAKlC,EAAK,KAAOA,EAAK,MAAQ,EAClCmC,EAAKnC,EAAK,IAAMA,EAAK,OAAS,EAC1BK,EAAUC,GAAqB,CACnC,IAAM8B,EAAM,KAAK,MACf,KAAK,MAAM9B,EAAG,QAAU6B,EAAI7B,EAAG,QAAU4B,CAAE,GAAK,IAAM,KAAK,IAAM,EACnE,EACA3C,EAAO,CAAE,OAAS6C,EAAM,IAAO,KAAO,GAAI,CAAC,CAC7C,EACM7B,EAAO,IAAM,CACjB,SAAS,oBAAoB,cAAeF,CAAM,EAClD,SAAS,oBAAoB,YAAaE,CAAI,CAChD,EACA,SAAS,iBAAiB,cAAeF,CAAM,EAC/C,SAAS,iBAAiB,YAAaE,CAAI,CAC7C,EAEA,mBAAC8B,GAAA,EAAS,EACZ,KACA,OAACZ,GAAA,CACC,KAAK,SACL,MAAOnE,EAAK,MACZ,SAAWU,GAAMuB,EAAO,CAAE,OAAS,OAAOvB,EAAE,OAAO,KAAK,EAAI,IAAO,KAAO,GAAI,CAAC,EAC/E,UAAYA,GAAMA,EAAE,gBAAgB,EACtC,KACA,OAAC0D,GAAA,CAAU,gBAAC,GACd,GAEApE,EAAK,OAAS,UAAYA,EAAK,OAAS,SAAWA,EAAK,OAAS,eACjE,QAAC0E,GAAA,CACC,oBAACN,GAAA,CAAU,kBAAM,KACjB,OAACA,GAAA,CAAU,aAAC,KACZ,OAACD,GAAA,CACC,KAAK,SACL,IAAK,EACL,IAAK,IACL,MAAOnE,EAAK,QACZ,SAAWU,GAAMuB,EAAO,CAAE,QAAS,OAAOvB,EAAE,OAAO,KAAK,CAAE,CAAC,EAC3D,UAAYA,GAAMA,EAAE,gBAAgB,EACtC,KACA,OAAC0D,GAAA,CAAU,aAAC,KACZ,OAACA,GAAA,CAAU,MAAO,CAAE,WAAY,CAAE,EAAG,aAAC,KACtC,OAACD,GAAA,CACC,KAAK,SACL,IAAK,EACL,IAAK,IACL,MAAOnE,EAAK,QACZ,SAAWU,GAAMuB,EAAO,CAAE,QAAS,OAAOvB,EAAE,OAAO,KAAK,CAAE,CAAC,EAC3D,UAAYA,GAAMA,EAAE,gBAAgB,EACtC,KACA,OAAC0D,GAAA,CAAU,aAAC,GACd,GAEJ,KAGA,QAACY,GAAA,CACC,qBAACC,GAAA,CACC,QAAS,IAAM,CACb,IAAMC,EAAW,CAAC,GAAGlF,EAAK,KAAK,EAAE,IAAKI,GAAOoC,EAAAH,EAAA,GAAKjC,GAAL,CAAQ,SAAU,IAAMA,EAAE,QAAS,EAAE,EAClF6B,EAAO,CAAE,MAAOiD,CAAS,CAAC,CAC5B,EACA,MAAM,mBAEN,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,mCACF,OAAO,eACP,YAAY,MACZ,KAAK,OACP,EACF,EAAM,WAER,KACA,QAACD,GAAA,CACC,QAAS,IAAMlD,EAAgBP,CAAW,EAC1C,SAAUxB,EAAK,MAAM,QAAU,EAC/B,MAAM,uBAEN,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QAAK,EAAE,oBAAoB,OAAO,eAAe,YAAY,MAAM,EACtE,EAAM,UAER,KACA,QAACiF,GAAA,CACC,QAAS,IAAM,CACbtE,GAAWX,CAAI,EACf2B,EAAe,EAAI,CACrB,EACA,MAAM,iBAEN,qBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,EAAE,cAAc,KAAK,OAAO,OAAO,eAAe,YAAY,IAAI,KACxE,OAAC,QAAK,EAAE,aAAa,KAAK,OAAO,OAAO,eAAe,YAAY,MAAM,KACzE,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,KAAK,eAAe,QAAQ,MAAM,GAC3E,EAAM,QAER,GACF,GAGED,GAAed,EAAQ,OAAS,OAChC,QAACuE,GAAA,CACC,qBAACC,GAAA,CAAa,QAAS,IAAMzD,EAAe,CAACD,CAAW,EAAG,sBAC/Cd,EAAQ,OAAO,OAAC,OAACyE,GAAA,CAAe,SAAA3D,EAAc,SAAM,IAAI,GACpE,EACCA,MACC,QAAC4D,GAAA,CACE,UAAA1E,EAAQ,IAAI,CAAC2E,EAAGhD,OACf,OAACiD,GAAA,CAEC,MAAO,CAAE,WAAYzF,GAAiBwF,CAAC,CAAE,EACzC,QAAS,IAAM,CACbhE,EAAQgE,CAAC,EACTjE,EAASiE,EAAGxF,GAAiBwF,CAAC,CAAC,EAC/B9D,EAAe,CAAC,CAClB,EACA,cAAgBf,GAAM,CACpBA,EAAE,eAAe,EACjBG,GAAa0B,CAAC,EACdZ,EAAe,EAAI,CACrB,EACA,MAAM,6CAZDY,CAaP,CACD,EACA3B,EAAQ,SAAW,MAAK,OAACoD,GAAA,CAAQ,gCAAoB,GACxD,GAEJ,GAEJ,CAEJ,CAAC,EAGKZ,GAAUqC,EAAO,MAAO,CAC5B,WAAY,SACZ,OAAQ,uBACR,aAAc,MACd,QAAS,MACT,QAAS,OACT,cAAe,SACf,IAAK,MACL,UAAW,8BACX,QAAS,MACX,CAAC,EAEKpC,GAAUoC,EAAO,MAAO,CAC5B,QAAS,OACT,IAAK,EACL,WAAY,WACZ,aAAc,EACd,QAAS,CACX,CAAC,EAEKlC,GAAUkC,EAAO,SAAU,CAC/B,IAAK,QACL,KAAM,EACN,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,IAAK,EACL,SAAU,MACV,WAAY,IACZ,UAAW,SACX,QAAS,QACT,aAAc,EACd,MAAO,iBACP,OAAQ,UACR,WAAY,YACZ,UAAW,CAAE,MAAO,OAAQ,EAC5B,SAAU,CACR,QAAS,CACP,KAAM,CACJ,WAAY,UACZ,MAAO,MACT,CACF,CACF,CACF,CAAC,EAEKjC,GAAYiC,EAAO,OAAQ,CAC/B,SAAU,MACV,WAAY,IACZ,cAAe,QACjB,CAAC,EAEKhC,GAAagC,EAAO,MAAO,CAC/B,MAAO,OACP,OAAQ,GACR,aAAc,EACd,OAAQ,sBACV,CAAC,EAEK/B,GAAa+B,EAAO,MAAO,CAC/B,QAAS,OACT,cAAe,SACf,IAAK,CACP,CAAC,EAEK9B,GAAW8B,EAAO,OAAQ,CAC9B,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,cAAe,YACf,cAAe,QACjB,CAAC,EAEK7B,GAAe6B,EAAO,MAAO,CACjC,SAAU,WACV,OAAQ,GACR,aAAc,EACd,OAAQ,YACR,SAAU,SACZ,CAAC,EAEK5B,GAAc4B,EAAO,MAAO,CAChC,MAAO,OACP,OAAQ,OACR,aAAc,EACd,OAAQ,sBACV,CAAC,EAEK1B,GAAY0B,EAAO,MAAO,CAC9B,SAAU,WACV,IAAK,MACL,MAAO,GACP,OAAQ,GACR,aAAc,MACd,OAAQ,iBACR,UAAW,wBACX,OAAQ,YACR,UAAW,4BACX,WAAY,mBACZ,OAAQ,EACR,SAAU,CACR,UAAW,CACT,KAAM,CACJ,UAAW,sDACX,OAAQ,EACR,MAAO,GACP,OAAQ,EACV,CACF,CACF,CACF,CAAC,EAEKzB,GAAUyB,EAAO,OAAQ,CAC7B,SAAU,MACV,MAAO,iBACP,UAAW,SACX,QAAS,EACX,CAAC,EAEKxB,GAAawB,EAAO,MAAO,CAC/B,QAAS,OACT,WAAY,SACZ,IAAK,CACP,CAAC,EAEKvB,GAAeuB,EAAO,OAAQ,CAClC,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,KAAM,CACR,CAAC,EAEKjB,GAAciB,EAAO,MAAO,CAChC,QAAS,OACT,cAAe,SACf,IAAK,EACL,UAAW,uBACX,WAAY,CACd,CAAC,EAEKhB,GAAmBgB,EAAO,OAAQ,CACtC,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,cAAe,YACf,cAAe,QACjB,CAAC,EAEKf,GAAUe,EAAO,MAAO,CAC5B,QAAS,OACT,WAAY,SACZ,IAAK,CACP,CAAC,EAEKrB,GAAYqB,EAAO,OAAQ,CAC/B,SAAU,MACV,MAAO,iBACP,WAAY,GACd,CAAC,EAEKtB,GAAYsB,EAAO,QAAS,CAChC,MAAO,GACP,WAAY,WACZ,OAAQ,yBACR,aAAc,EACd,MAAO,QACP,SAAU,MACV,QAAS,UACT,WAAY,QACZ,UAAW,SACX,QAAS,OACT,UAAW,CAAE,YAAa,SAAU,EACpC,6DAA8D,CAAE,QAAS,MAAO,CAClF,CAAC,EAEKd,GAAYc,EAAO,MAAO,CAC9B,MAAO,GACP,OAAQ,GACR,aAAc,MACd,OAAQ,yBACR,WAAY,WACZ,OAAQ,UACR,SAAU,WACV,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,CACd,CAAC,EAEKV,GAAWU,EAAO,MAAO,CAC7B,MAAO,EACP,OAAQ,MACR,WAAY,UACZ,aAAc,EACd,SAAU,WACV,IAAK,EACL,KAAM,MACN,UAAW,kBACb,CAAC,EAEKT,GAAYS,EAAO,MAAO,CAC9B,QAAS,OACT,IAAK,EACL,UAAW,uBACX,WAAY,CACd,CAAC,EAEKR,GAAYQ,EAAO,SAAU,CACjC,IAAK,QACL,KAAM,EACN,SAAU,MACV,WAAY,IACZ,UAAW,SACX,QAAS,QACT,aAAc,EACd,MAAO,iBACP,OAAQ,uBACR,OAAQ,UACR,WAAY,WACZ,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,IAAK,EACL,UAAW,CAAE,WAAY,SAAU,MAAO,OAAQ,EAClD,aAAc,CAAE,QAAS,GAAK,OAAQ,SAAU,CAClD,CAAC,EAEKN,GAAiBM,EAAO,MAAO,CACnC,UAAW,uBACX,WAAY,CACd,CAAC,EAEKL,GAAeK,EAAO,MAAO,CACjC,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,cAAe,YACf,cAAe,SACf,OAAQ,UACR,UAAW,CAAE,MAAO,OAAQ,CAC9B,CAAC,EAEKJ,GAAgBI,EAAO,OAAQ,CACnC,SAAU,OACV,MAAO,gBACT,CAAC,EAEKH,GAAcG,EAAO,MAAO,CAChC,QAAS,OACT,oBAAqB,iBACrB,IAAK,EACL,UAAW,CACb,CAAC,EAEKD,GAAeC,EAAO,MAAO,CACjC,OAAQ,GACR,aAAc,EACd,OAAQ,uBACR,OAAQ,UACR,WAAY,oCACZ,UAAW,CAAE,UAAW,cAAe,UAAW,0BAA2B,CAC/E,CAAC,ElD7tBD,IAAAC,EAAA,6BA0BA,SAASC,GAAUC,EAAaC,EAAyB,CACvD,GAAM,CAACC,EAAGC,EAAGC,CAAC,EAAIC,GAASL,CAAG,EAC9B,MAAO,QAAQE,KAAKC,KAAKC,KAAKH,EAAQ,QAAQ,CAAC,IACjD,CACA,SAASK,GACPC,EACAC,EACkC,CAClC,GAAI,CAACD,GAAOA,IAAQ,cAAe,MAAO,CAAE,IAAK,cAAe,QAAS,CAAE,EAC3E,IAAME,EAAIF,EAAI,MAAM,mDAAmD,EACvE,OAAIE,EAEK,CAAE,IADGC,GAAS,SAASD,EAAE,EAAE,EAAG,SAASA,EAAE,EAAE,EAAG,SAASA,EAAE,EAAE,CAAC,EACrD,QAASA,EAAE,KAAO,OAAY,WAAWA,EAAE,EAAE,EAAI,CAAE,EAE/DF,EAAI,WAAW,GAAG,EAAU,CAAE,IAAKA,EAAI,MAAM,EAAG,CAAC,EAAG,QAAS,CAAE,EAC5D,CAAE,IAAKC,EAAU,QAAS,CAAE,CACrC,CAGA,IAAMG,GAAwBC,GAAkB,CAC9C,IAAMC,EAAOD,EAAE,SAAS,MAAMA,EAAE,SAAS,eAEnCE,EADMF,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YACzC,IAAKG,GAAOF,EAAK,OAAOE,EAAG,EAAE,OAAO,OAAO,EAC9D,MAAO,CAAE,OAAAD,EAAQ,IAAK,KAAK,UAAUA,CAAM,CAAE,CAC/C,EACME,GAAiBJ,GAAmBA,EAAE,SAAS,WAAa,OAAS,QAG9DK,GAAwB,QAAK,UAA2B,CACnE,IAAMC,EAAMC,EAAY,EAClB,CAAE,OAAQC,CAAe,EAAIF,EAAI,SAASP,EAAoB,EAC9DU,EAAQH,EAAI,SAASF,EAAa,EAExC,GAAII,EAAe,SAAW,EAC5B,SACE,OAACE,GAAA,CACC,oBAACC,GAAA,CACC,oBAACC,GAAA,CAAa,kBAAM,KACpB,OAACC,GAAA,CAAK,qCAAyB,GACjC,EACF,EAIJ,IAAMC,EAAQN,EAAe,GACvBO,EAAQP,EAAe,OAAS,EAChCQ,EACJF,EAAM,eAA6BA,EAAM,iBAA+B,UAAWA,EAC/EG,EAAUH,EAAM,eAChBI,EAASJ,EAAM,mBACfK,EACJL,EAAM,oBACNA,EAAM,mBACNA,EAAM,kBACNA,EAAM,eACNA,EAAM,aAER,SACE,QAACJ,GAAA,CACC,oBAACU,GAAA,CAAc,MAAON,EAAO,MAAOC,EAAO,MAAOP,EAAe,OAAQ,KACzE,OAACa,GAAA,EAAQ,EASR,CAACN,MAAS,OAACO,GAAA,CAAgB,MAAOR,EAAO,IAAKR,EAAK,EACnDS,MAAS,OAACQ,GAAA,CAAiB,IAAKjB,EAAK,KACtC,OAACe,GAAA,EAAQ,EAER,CAACN,MAAS,OAACS,GAAA,CAAc,MAAOV,EAAO,IAAKR,EAAK,EACjD,CAACS,MAAS,OAACM,GAAA,EAAQ,KAEpB,OAACI,GAAA,CAAkB,MAAOX,EAAO,IAAKR,EAAK,OAAQY,EAAQ,KAC3D,OAACG,GAAA,EAAQ,KAET,OAACK,GAAA,CAAY,MAAOZ,EAAM,MAAO,MAAOL,EAAO,IAAKH,EAAK,KACzD,OAACe,GAAA,EAAQ,KAET,OAACM,GAAA,CAAe,MAAM,SACpB,mBAACC,GAAA,CAAc,MAAOd,EAAM,MAAO,MAAOL,EAAO,IAAKH,EAAK,EAC7D,KACA,OAACe,GAAA,EAAQ,KAGT,OAACM,GAAA,CAAe,MAAM,WACpB,mBAACE,GAAA,CAAgB,MAAOf,EAAO,IAAKR,EAAK,EAC3C,KACA,OAACe,GAAA,EAAQ,EAGRL,MACC,oBACE,oBAACW,GAAA,CAAe,MAAM,aAAa,YAAW,GAC5C,mBAACG,GAAA,CAAiB,MAAOhB,EAAM,MAAO,IAAKR,EAAK,MAAOG,EAAO,EAChE,KACA,OAACY,GAAA,EAAQ,GACX,KAGF,OAACM,GAAA,CAAe,MAAM,UACpB,mBAACI,GAAA,CAAe,MAAOjB,EAAO,IAAKR,EAAK,EAC1C,KACA,OAACe,GAAA,EAAQ,EAERJ,GAAW,CAACF,MACX,oBACE,oBAACY,GAAA,CAAe,MAAM,QAAQ,YAAW,GACvC,mBAACK,GAAA,CAAa,MAAOlB,EAAO,IAAKR,EAAK,EACxC,KACA,OAACe,GAAA,EAAQ,GACX,EAGDL,MACC,oBACE,oBAACW,GAAA,CAAe,MAAM,aAAa,YAAW,GAC5C,mBAACM,GAAA,CAAkB,MAAOnB,EAAM,MAAO,IAAKR,EAAK,EACnD,KACA,OAACe,GAAA,EAAQ,GACX,KAGF,OAACM,GAAA,CAAe,MAAM,SACpB,mBAACO,GAAA,CAAc,MAAOpB,EAAO,IAAKR,EAAK,EACzC,KAEA,OAAC,OAAI,MAAO,CAAE,OAAQ,EAAG,EAAG,GAC9B,CAEJ,CAAC,EAKD,SAASc,GAAc,CAAE,MAAAN,EAAO,MAAAC,EAAO,MAAAoB,CAAM,EAAsD,CACjG,IAAMC,EAAOrB,EACToB,EAAQ,YACRrB,EAAM,KAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,KAAK,MAAM,CAAC,EAC3D,SACE,OAACH,GAAA,CAAY,MAAO,CAAE,QAAS,eAAgB,EAC7C,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,eAAgB,eAAgB,EACnF,oBAACC,GAAA,CAAa,MAAO,CAAE,aAAc,EAAG,SAAU,MAAO,EAAI,SAAAwB,EAAK,KAClE,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,CAAE,EACnC,UAAC,SAAU,SAAU,SAAU,QAAQ,EAAE,IAAI,CAACC,EAAMC,OACnD,OAACC,GAAA,CAAgB,MAAO,CAAC,YAAa,YAAa,UAAW,SAAS,EAAED,GACtE,SAAAD,GADWC,CAEd,CACD,EACH,GACF,EACF,CAEJ,CAGA,SAAShB,GAAgB,CAAE,MAAAR,EAAO,IAAAR,CAAI,EAAiC,CACrE,IAAMkC,EAAQ1B,EAAM,OAAS,CAAC,EAAG,CAAC,EAC5B2B,EAAW,KAAK,OAAO3B,EAAM,UAAY,IAAM,IAAM,KAAK,GAAG,EAE7D4B,EAAe,eACnB,CAACC,EAAeC,IAAkB,CAChC,IAAMC,EAAS,CAAE,GAAI/B,EAAM,EAAG,EAC9B,OAAQ6B,OACD,IACHE,EAAE,MAAQ,CAACD,EAAOJ,EAAM,EAAE,EAC1B,UACG,IACHK,EAAE,MAAQ,CAACL,EAAM,GAAII,CAAK,EAC1B,UACG,IACHC,EAAE,SAAYD,EAAQ,KAAK,GAAM,IACjC,MAEJtC,EAAI,aAAauC,CAAC,CACpB,EACA,CAAC/B,EAAM,GAAI0B,EAAOlC,CAAG,CACvB,EAEA,SACE,QAACK,GAAA,CACC,oBAACC,GAAA,CAAa,oBAAQ,KACtB,OAACkC,GAAA,CACE,UACC,CACE,GAAI,IAAMxC,EAAI,YAAoB,EAClC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,MACL,EACA,CACE,GAAI,IAAMA,EAAI,wBAAgC,EAC9C,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QACC,GAAG,IACH,GAAG,IACH,GAAG,IACH,GAAG,KACH,OAAO,eACP,YAAY,IACZ,gBAAgB,MAClB,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,UACL,EACA,CACE,GAAI,IAAMA,EAAI,aAAqB,EACnC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,IACN,OAAO,MACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,OACL,EACA,CACE,GAAI,IAAMA,EAAI,WAAmB,EACjC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,IACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,IACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,KACL,EACA,CACE,GAAI,IAAMA,EAAI,sBAA8B,EAC5C,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QACC,GAAG,IACH,GAAG,IACH,GAAG,KACH,GAAG,IACH,OAAO,eACP,YAAY,IACZ,gBAAgB,MAClB,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,KACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,IACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,UACL,EACA,CACE,GAAI,IAAMA,EAAI,cAAsB,EACpC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,IACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,KACA,OAAC,QACC,EAAE,IACF,EAAE,IACF,MAAM,MACN,OAAO,IACP,GAAG,MACH,KAAK,eACL,QAAQ,MACV,GACF,EAEF,EAAG,QACL,CACF,EAAE,IAAI,CAAC,CAAE,GAAAyC,EAAI,KAAAV,EAAM,EAAAW,CAAE,EAAGV,OACtB,OAACW,GAAA,CAAiB,QAASF,EAAI,MAAOC,EACnC,SAAAX,GADYC,CAEf,CACD,EACH,KAEA,QAACY,GAAA,CAAU,MAAO,CAAE,UAAW,CAAE,EAC/B,oBAACC,GAAA,CAAe,MAAM,IAAI,MAAO,KAAK,MAAMX,EAAM,EAAE,EAAG,SAAWY,GAAMV,EAAO,IAAKU,CAAC,EAAG,KACxF,OAACD,GAAA,CAAe,MAAM,IAAI,MAAO,KAAK,MAAMX,EAAM,EAAE,EAAG,SAAWY,GAAMV,EAAO,IAAKU,CAAC,EAAG,GAC1F,KAEA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,UAAW,CAAE,EACxE,oBAACD,GAAA,CACC,MAAM,IACN,MAAOV,EACP,SAAWW,GAAMV,EAAO,IAAKU,CAAC,EAC9B,OAAQ,OACR,MAAO,CAAE,KAAM,CAAE,EACnB,KACA,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,CAAE,EACpC,oBAACH,GAAA,CAAS,QAAS,IAAM3C,EAAI,eAAe,EAAG,MAAM,kBACnD,mBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,mCACF,OAAO,eACP,YAAY,IACZ,KAAK,OACP,EACF,EACF,KACA,OAAC2C,GAAA,CAAS,QAAS,IAAM3C,EAAI,aAAa,EAAG,MAAM,gBACjD,mBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,kCACF,OAAO,eACP,YAAY,IACZ,KAAK,OACP,EACF,EACF,GACF,GACF,GACF,CAEJ,CAGA,SAASkB,GAAc,CAAE,MAAAV,EAAO,IAAAR,CAAI,EAAiC,CACnE,IAAM+C,EACJ,SAAUvC,EACLA,EAAc,KACf,WAAYA,EACZ,CAAEA,EAAc,OAAO,GAAK,EAAIA,EAAc,OAAO,GAAK,CAAC,EAC3D,CAAC,EAAG,CAAC,EACL,CAACwC,EAAQC,CAAS,EAAU,YAAS,EAAK,EAE1CC,EAAmB,eACvB,CAACC,EAAgBb,IAAkB,CACjC,IAAMC,EAAS,CAAE,GAAI/B,EAAM,EAAG,EAC9B,GAAI,SAAUA,EACZ,GAAI2C,IAAQ,IAAK,CACf,IAAMC,EAAOJ,EAAUV,EAAQS,EAAK,GAAMA,EAAK,GAAKA,EAAK,GACzDR,EAAE,KAAO,CAACD,EAAOc,CAAI,CACvB,KAAO,CACL,IAAMC,EAAOL,EAAUV,EAAQS,EAAK,GAAMA,EAAK,GAAKA,EAAK,GACzDR,EAAE,KAAO,CAACc,EAAMf,CAAK,CACvB,KACS,WAAY9B,IACjB2C,IAAQ,IACVZ,EAAE,OAAS,CACTD,EAAQ,EACRU,EAAWV,EAAQ,EAAIS,EAAK,GAAMA,EAAK,GAAM,EAAKvC,EAAc,OAAO,EACzE,EAEA+B,EAAE,OAAS,CACTS,EAAWV,EAAQ,EAAIS,EAAK,GAAMA,EAAK,GAAM,EAAKvC,EAAc,OAAO,GACvE8B,EAAQ,CACV,GAEJtC,EAAI,aAAauC,CAAC,CACpB,EACA,CAAC/B,EAAOuC,EAAMC,EAAQhD,CAAG,CAC3B,EAEA,SACE,QAACK,GAAA,CACC,oBAACC,GAAA,CAAa,kBAAM,KACpB,QAACgD,GAAA,CACC,oBAACT,GAAA,CACC,MAAM,IACN,MAAO,KAAK,MAAME,EAAK,EAAE,EACzB,SAAWD,GAAMI,EAAW,IAAKJ,CAAC,EAClC,IAAK,EACP,KAoCA,OAACD,GAAA,CACC,MAAM,IACN,MAAO,KAAK,MAAME,EAAK,EAAE,EACzB,SAAWD,GAAMI,EAAW,IAAKJ,CAAC,EAClC,IAAK,EACP,GACF,GACF,CAEJ,CAGA,SAAS3B,GAAkB,CAAE,MAAAX,EAAO,IAAAR,EAAK,OAAAY,CAAO,EAAkD,CArhBlG,IAAA2C,EAAAC,EAshBE,IAAMC,EAAa,KAAK,QAAOF,EAAA/C,EAAM,MAAM,UAAZ,KAAA+C,EAAuB,GAAK,GAAG,EACxDG,GAAeF,EAAAhD,EAAM,MAAM,eAAZ,KAAAgD,EAA4B,EAEjD,SACE,QAACnD,GAAA,CACC,oBAACC,GAAA,CAAa,sBAAU,KACxB,OAACuC,GAAA,CACC,MAAM,UACN,MAAOY,EACP,SAAWX,GAAM9C,EAAI,MAAM,CAAE,QAAS8C,EAAI,GAAI,CAAC,EAC/C,IAAK,EACL,IAAK,IACL,OAAO,IACP,WAAY,GACd,EACClC,MACC,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAACiC,GAAA,CACC,MAAM,SACN,MAAOa,EACP,SAAWZ,GAAM9C,EAAI,MAAM,CAAE,aAAc8C,CAAE,CAAC,EAC9C,IAAK,EACL,OAAO,KACP,WAAY,GACd,EACF,KAEF,QAACa,GAAA,CAAS,MAAO,CAAE,UAAW,CAAE,EAC9B,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,gBAAI,KACtC,OAACC,GAAA,CACE,UACC,CAAE,WAAqB,MAAO,GAAI,EAClC,CAAE,YAAsB,MAAO,QAAS,EACxC,CAAE,aAAuB,MAAO,KAAM,EACtC,CAAE,aAAuB,MAAO,cAAqB,CACvD,EAAE,IAAI,CAAC,CAAE,IAAAC,EAAK,MAAAC,CAAM,OAClB,OAACpB,GAAA,CAEC,SAAUnC,EAAM,MAAM,OAASsD,EAC/B,QAAS,IAAM9D,EAAI,MAAM,CAAE,KAAM8D,CAAI,CAAC,EAErC,SAAAC,GAJID,CAKP,CACD,EACH,GACF,GACF,CAEJ,CAGA,SAAS1C,GAAY,CAAE,MAAA4C,EAAO,MAAA7D,EAAO,IAAAH,CAAI,EAAoD,CAzkB7F,IAAAuD,EAAAC,EA0kBE,IAAMS,EAAUD,EAAM,SAClBA,EAAM,WAAWT,EAAAW,GAAM/D,KAAN,YAAAoD,EAAmCS,EAAM,SAAUE,GAAM,MAAMF,EAAM,OACtF,cAEEG,EAAe,eACnB,CAACrF,EAAaC,IAAoB,CAC5BD,IAAQ,cACVkB,EAAI,MAAM,CAAE,SAAU,EAAM,CAAC,EAE7BA,EAAI,MAAM,CAAE,QAASlB,EAAK,SAAU,GAAM,QAAAC,CAAQ,CAAC,CAEvD,EACA,CAACiB,CAAG,CACN,EAEA,SACE,QAACK,GAAA,CACC,oBAACC,GAAA,CAAa,gBAAI,KAClB,OAAC8D,GAAA,CACC,MAAOH,EACP,SAAST,EAAAQ,EAAM,UAAN,KAAAR,EAAiB,EAC1B,SAAUW,EACV,gBAAiB,GACjB,YAAa,GACb,MAAM,QACR,GAQF,CAEJ,CAGA,SAAS7C,GAAc,CAAE,MAAA0C,EAAO,MAAA7D,EAAO,IAAAH,CAAI,EAAoD,CAhnB/F,IAAAuD,EAAAC,EAinBE,IAAMa,EACJL,EAAM,aACNT,EAAAe,GAAQnE,KAAR,YAAAoD,EAAqCS,EAAM,SAC3CM,GAAQ,MAAMN,EAAM,OAChBO,GACJf,EAAAQ,EAAM,sBAAN,KAAAR,EAA8B,CAAE,MAAO,EAAG,OAAQ,IAAK,MAAO,CAAE,EAAEQ,EAAM,OAAS,EAEnF,SACE,QAAC,OACC,oBAACI,GAAA,CACC,MAAOC,EACP,QAAS,EACT,SAAWvF,GAAQkB,EAAI,MAAM,CAAE,UAAWlB,CAAI,CAAC,EAC/C,gBAAiB,GACjB,YAAa,GACf,KACA,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAAC+D,GAAA,CACC,MAAM,QACN,MAAO0B,EACP,SAAWzB,GAAM9C,EAAI,MAAM,CAAE,oBAAqB8C,CAAE,CAAC,EACrD,IAAK,EACL,KAAM,IACN,OAAO,KACP,IAAK,GACL,WAAY,GACd,EACF,GACF,CAEJ,CAGA,SAASvB,GAAgB,CAAE,MAAAf,EAAO,IAAAR,CAAI,EAAiC,CACrE,GAAM,CAACwE,EAASC,CAAU,EAAU,YAAS,CAAC,CAACjE,EAAM,MAAM,QAAQ,EAC7DkE,EAAelE,EAAM,MAAM,SAE3BmE,EAAqB,eAAY,IAAM,CAC3C,GAAIH,EACFxE,EAAI,MAAM,CAAE,SAAU,MAAU,CAAC,EACjCyE,EAAW,EAAK,MACX,CACL,IAAMG,EAA4B,CAChC,KAAM,SACN,MAAO,CACL,CAAE,MAAO,UAAW,SAAU,EAAG,QAAS,CAAE,EAC5C,CAAE,MAAO,UAAW,SAAU,IAAK,QAAS,CAAE,CAChD,EACA,MAAO,GACP,QAAS,GACT,QAAS,EACX,EACA5E,EAAI,MAAM,CAAE,SAAU4E,EAAa,SAAU,EAAK,CAAC,EACnDH,EAAW,EAAI,CACjB,CACF,EAAG,CAACD,EAASxE,CAAG,CAAC,EAEjB,SACE,QAAC,OACC,qBAAC2D,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,kBAAM,KACxC,OAACiB,GAAA,CAAO,QAASL,EAAS,QAASG,EACjC,mBAACG,GAAA,CAAY,QAASN,EAAS,EACjC,GACF,EACCA,MACC,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAACO,GAAA,CACC,MAAOL,EACP,SAAU,CAACM,EAAMC,IAAS,CACxBjF,EAAI,MAAM,CAAE,SAAUgF,CAAK,CAAC,CAC9B,EACF,EACF,GAEJ,CAEJ,CAGA,SAASxD,GAAiB,CAAE,MAAAwC,EAAO,IAAAhE,EAAK,MAAAG,CAAM,EAAoD,CAjsBlG,IAAAoD,EAksBE,IAAM2B,IAAe3B,EAAAe,GAAQnE,KAAR,YAAAoD,EAAqCS,EAAM,SAAU,UACpE,CAAE,IAAKmB,EAAe,QAASC,CAAa,EAAIhG,GACpD4E,EAAM,WACNkB,CACF,EACM,CAAE,IAAKG,EAAY,QAASC,CAAU,EAAIlG,GAC9C4E,EAAM,gBACN,aACF,EACMuB,EAAevB,EAAM,aACrB,CAACwB,EAAiBC,CAAkB,EAAU,YAAS,CAAC,CAACF,CAAY,EAErEG,EAA6B,eAAY,IAAM,CACnD,GAAIF,EACFxF,EAAI,MAAM,CAAE,aAAc,MAAU,CAAC,EACrCyF,EAAmB,EAAK,MACnB,CACL,IAAMb,EAA4B,CAChC,KAAM,SACN,MAAO,CACL,CAAE,MAAO,UAAW,SAAU,EAAG,QAAS,CAAE,EAC5C,CAAE,MAAO,UAAW,SAAU,IAAK,QAAS,CAAE,CAChD,EACA,MAAO,GACP,QAAS,GACT,QAAS,EACX,EACA5E,EAAI,MAAM,CAAE,aAAc4E,CAAY,CAAC,EACvCa,EAAmB,EAAI,CACzB,CACF,EAAG,CAACD,EAAiBxF,CAAG,CAAC,EAEzB,SACE,QAAC,OACC,oBAACoE,GAAA,CACC,MAAOe,EACP,QAASC,EACT,SAAU,CAACtG,EAAKC,IAAY,CAC1B,IAAM+E,EAAMhF,IAAQ,cAAgB,cAAgBD,GAAUC,EAAKC,CAAO,EAC1EiB,EAAI,MAAM,CAAE,WAAY8D,CAAI,CAAC,CAC/B,EACA,gBAAiB,GACjB,YAAa,GACb,MAAM,OACR,KACA,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAACM,GAAA,CACC,MAAOiB,EACP,QAASC,EACT,SAAU,CAACxG,EAAKC,IAAY,CAC1B,IAAM+E,EAAMhF,IAAQ,cAAgB,cAAgBD,GAAUC,EAAKC,CAAO,EAC1EiB,EAAI,MAAM,CAAE,gBAAiB8D,CAAI,CAAC,CACpC,EACA,gBAAiB,GACjB,YAAa,GACb,MAAM,UACR,EACF,KACA,QAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,qBAACH,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,qBAAS,KAC3C,OAACiB,GAAA,CAAO,QAASW,EAAiB,QAASE,EACzC,mBAACZ,GAAA,CAAY,QAASU,EAAiB,EACzC,GACF,EACCA,MACC,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAACT,GAAA,CACC,MAAOQ,EACP,SAAWP,GAAShF,EAAI,MAAM,CAAE,aAAcgF,CAAK,CAAC,EACtD,EACF,GAEJ,GACF,CAEJ,CAEA,SAASW,GAAiBC,EAAsB,CAC9C,GAAI,CAACA,EAAK,MAAO,CAAC,EAClB,GAAI,MAAM,QAAQA,CAAG,EAAG,OAAOA,EAC/B,IAAMC,EAAkB,CAAC,EACrBD,EAAI,YACNC,EAAI,KAAK,CACP,GAAI,SAAM,SAAS,EACnB,KAAM,aACN,QAASD,EAAI,WAAW,QACxB,EAAGA,EAAI,WAAW,EAClB,EAAGA,EAAI,WAAW,EAClB,KAAMA,EAAI,WAAW,KACrB,OAAQA,EAAI,WAAW,OACvB,MAAOA,EAAI,WAAW,KACxB,CAAC,EAEH,IAAME,EAAmC,CACvC,UAAW,EACX,KAAM,EACN,WAAY,IACZ,SAAU,IACV,SAAU,IACV,UAAW,EACX,UAAW,EACX,MAAO,CACT,EACA,QAAWC,KAAK,OAAO,KAAKD,CAAQ,EAC9BF,EAAIG,KAAO,QAAaH,EAAIG,KAAOD,EAASC,IAC9CF,EAAI,KAAK,CAAE,GAAI,SAAM,SAAS,EAAG,KAAME,EAAiB,QAAS,GAAM,MAAOH,EAAIG,EAAG,CAAC,EAG1F,OAAIH,EAAI,QAAQC,EAAI,KAAK,CAAE,GAAI,SAAM,SAAS,EAAG,KAAM,SAAU,QAAS,EAAK,CAAC,EACzEA,CACT,CAEA,IAAMG,GAA2C,CAC/C,WAAY,cACZ,KAAM,OACN,UAAW,aACX,WAAY,aACZ,SAAU,WACV,SAAU,aACV,UAAW,aACX,UAAW,YACX,MAAO,QACP,OAAQ,QACV,EAEA,SAASvE,GAAe,CAAE,MAAAjB,EAAO,IAAAR,CAAI,EAAiC,CACpE,IAAMiG,EAAUN,GAAkBnF,EAAc,OAAO,EAEjD0F,EAAsB,eACzBC,GAA2BnG,EAAI,aAAa,CAAE,GAAIQ,EAAM,GAAI,QAAS2F,CAAW,CAAC,EAClF,CAACnG,EAAKQ,EAAM,EAAE,CAChB,EAEM4F,EAAe,CAACvG,EAAYwG,IAA6B,CAC7DH,EAAcD,EAAQ,IAAKK,GAAOA,EAAE,KAAOzG,EAAK0G,IAAA,GAAKD,GAAMD,GAAUC,CAAE,CAAC,CAC1E,EAEME,EAAgB3G,GAAe,CACnCqG,EAAcD,EAAQ,OAAQK,GAAMA,EAAE,KAAOzG,CAAE,CAAC,CAClD,EAEM4G,EAAaC,GAAqB,CACtC,IAAMC,EAAmB,CAAE,GAAI,SAAM,SAAS,EAAG,KAAAD,EAAM,QAAS,EAAK,EACjEA,IAAS,aACX,OAAO,OAAOC,EAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,KAAM,EAAG,OAAQ,EAAG,MAAO,WAAY,CAAC,EACnE,CAAC,YAAa,MAAM,EAAE,SAASD,CAAI,EAC5CC,EAAO,MAAQ,EACN,CAAC,aAAc,WAAY,UAAU,EAAE,SAASD,CAAI,EAC7DC,EAAO,MAAQ,IAEfA,EAAO,MAAQ,EAEjBT,EAAc,CAAC,GAAGD,EAASU,CAAM,CAAC,CACpC,EAEA,SACE,QAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAAE,EAC5D,UAAAV,EAAQ,IAAKW,GAAK,CAh2BzB,IAAArD,EAAAC,EAAAqD,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAi2BQ,iBAAC,OAEC,MAAO,CAAE,aAAc,oCAAqC,cAAe,CAAE,EAE7E,qBAAC,OACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,aAAc,CAChB,EAEA,qBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,CAAE,EAC1D,oBAACtC,GAAA,CACC,QAAS+B,EAAI,QACb,QAAS,IAAMR,EAAaQ,EAAI,GAAI,CAAE,QAAS,CAACA,EAAI,OAAQ,CAAC,EAE7D,mBAAC9B,GAAA,CAAY,QAAS8B,EAAI,QAAS,EACrC,KACA,OAAC,QAAK,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAO,oBAAqB,EACvE,SAAAZ,GAAaY,EAAI,MACpB,GACF,KACA,OAAC,UACC,QAAS,IAAMJ,EAAaI,EAAI,EAAE,EAClC,MAAO,CAAE,IAAK,QAAS,OAAQ,UAAW,QAAS,GAAK,SAAU,GAAI,WAAY,CAAE,EACpF,MAAM,gBACP,kBAED,GACF,EAGCA,EAAI,YACH,QAAC,OAAI,MAAO,CAAE,YAAa,EAAG,EAC3B,UAAAA,EAAI,OAAS,iBACZ,oBACE,qBAAChE,GAAA,CAAU,MAAO,CAAE,aAAc,CAAE,EAClC,oBAACC,GAAA,CACC,MAAM,IACN,OAAOU,EAAAqD,EAAI,IAAJ,KAAArD,EAAS,EAChB,SAAWT,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,EAAG9D,CAAE,CAAC,EAChD,KACA,OAACD,GAAA,CACC,MAAM,IACN,OAAOW,EAAAoD,EAAI,IAAJ,KAAApD,EAAS,EAChB,SAAWV,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,EAAG9D,CAAE,CAAC,EAChD,KACA,OAACD,GAAA,CACC,MAAM,OACN,OAAOgE,EAAAD,EAAI,OAAJ,KAAAC,EAAY,EACnB,SAAW/D,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,KAAM,KAAK,IAAI,EAAG9D,CAAC,CAAE,CAAC,EAC9D,WAAY,GACd,KACA,OAACD,GAAA,CACC,MAAM,OACN,OAAOiE,EAAAF,EAAI,SAAJ,KAAAE,EAAc,EACrB,SAAWhE,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,OAAQ9D,CAAE,CAAC,EACnD,WAAY,GACd,GACF,KACA,QAACa,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,GAAI,UAAW,MAAO,EAAG,iBAAK,KAC1D,OAAC,SACC,KAAK,QACL,QAAQmD,EAAAH,EAAI,QAAJ,KAAAG,EAAa,WAAW,MAAM,EAAG,CAAC,EAC1C,SAAWT,GAAMF,EAAaQ,EAAI,GAAI,CAAE,MAAON,EAAE,OAAO,MAAQ,IAAK,CAAC,EACtE,MAAO,CACL,MAAO,GACP,OAAQ,GACR,OAAQ,OACR,QAAS,EACT,OAAQ,SACV,EACF,GACF,GACF,EAED,CAAC,YAAa,MAAM,EAAE,SAASM,EAAI,IAAI,MACtC,OAAC/D,GAAA,CACC,MAAM,SACN,OAAOmE,EAAAJ,EAAI,QAAJ,KAAAI,EAAa,EACpB,SAAWlE,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,MAAO,KAAK,IAAI,EAAG9D,CAAC,CAAE,CAAC,EAC/D,OAAO,KACP,WAAY,GACd,EAED,CAAC,aAAc,WAAY,UAAU,EAAE,SAAS8D,EAAI,IAAI,MACvD,OAAC/D,GAAA,CACC,MAAM,SACN,OAAOoE,EAAAL,EAAI,QAAJ,KAAAK,EAAa,IACpB,SAAWnE,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,MAAO,KAAK,IAAI,EAAG9D,CAAC,CAAE,CAAC,EAC/D,OAAO,IACP,WAAY,GACd,EAED,CAAC,WAAW,EAAE,SAAS8D,EAAI,IAAI,MAC9B,OAAC/D,GAAA,CACC,MAAM,QACN,OAAOqE,EAAAN,EAAI,QAAJ,KAAAM,EAAa,EACpB,SAAWpE,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,MAAO9D,CAAE,CAAC,EAClD,OAAO,OACP,WAAY,GACd,EAED,CAAC,YAAa,OAAO,EAAE,SAAS8D,EAAI,IAAI,MACvC,OAAC/D,GAAA,CACC,MAAM,SACN,OAAOsE,EAAAP,EAAI,QAAJ,KAAAO,EAAa,EACpB,SAAWrE,GAAMsD,EAAaQ,EAAI,GAAI,CAAE,MAAO,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK9D,CAAC,CAAC,CAAE,CAAC,EAC9E,OAAO,IACP,WAAY,GACd,GAEJ,IAjHG8D,EAAI,EAmHX,EACD,KAED,OAAC,OAAI,MAAO,CAAE,SAAU,UAAW,EACjC,oBAAC,UACC,MAAM,GACN,SAAWN,GAAMG,EAAUH,EAAE,OAAO,KAAmB,EACvD,MAAO,CACL,MAAO,OACP,QAAS,UACT,SAAU,GACV,aAAc,EACd,WAAY,wBACZ,MAAO,8BACP,OAAQ,qCACR,OAAQ,SACV,EAEA,oBAAC,UAAO,MAAM,GAAG,SAAQ,GAAC,wBAE1B,EACC,OAAO,QAAQN,EAAY,EAAE,IAAI,CAAC,CAAClC,EAAKhC,CAAI,OAC3C,OAAC,UAAiB,MAAOgC,EACtB,SAAAhC,GADUgC,CAEb,CACD,GACH,EACF,GACF,CAEJ,CAGA,SAASpC,GAAa,CAAE,MAAAlB,EAAO,IAAAR,CAAI,EAAiC,CAt/BpE,IAAAuD,EAAAC,EAu/BE,IAAM4D,EAAQ5G,EACR6G,EAAc,CAAC,GAAC9D,EAAA6D,EAAM,cAAN,MAAA7D,EAAmB,OACnC+D,IAAY9D,EAAA4D,EAAM,cAAN,YAAA5D,EAAmB,OAAQ,OAE7C,SACE,QAAC,OACC,qBAACG,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,iBAAK,KACvC,QAACC,GAAA,CACC,oBAAClB,GAAA,CACC,SAAU,CAAC0E,EACX,QAAS,IACPrH,EAAI,aAAa,CACf,GAAIQ,EAAM,GACV,YAAa+G,EAAAhB,EAAA,GAAKa,EAAM,aAAX,CAAwB,MAAO,MAAU,EACxD,CAAC,EAEJ,gBAED,KACA,OAACzE,GAAA,CACC,SAAU0E,EACV,QAAS,IACPrH,EAAI,aAAa,CACf,GAAIQ,EAAM,GACV,YAAa+G,EAAAhB,EAAA,GAAKa,EAAM,aAAX,CAAwB,aAAwB,EAC/D,CAAC,EAGF,kBACH,GACF,GACF,KACA,QAACzD,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,eAAG,KACrC,QAACC,GAAA,CACC,oBAAClB,GAAA,CACC,SAAU,CAAC2E,EACX,QAAS,IACPtH,EAAI,aAAa,CACf,GAAIQ,EAAM,GACV,YAAa+G,EAAAhB,EAAA,GAAKa,EAAM,aAAX,CAAwB,IAAK,MAAU,EACtD,CAAC,EAEJ,gBAED,KACA,OAACzE,GAAA,CACC,SAAU2E,EACV,QAAS,IACPtH,EAAI,aAAa,CACf,GAAIQ,EAAM,GACV,YAAa+G,EAAAhB,EAAA,GAAKa,EAAM,aAAX,CAAwB,WAAsB,EAC7D,CAAC,EAGF,kBACH,GACF,GACF,KACA,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAACvE,GAAA,CACC,MAAM,OACN,MAAO,KAAK,OAAOuE,EAAM,MAAQ,GAAK,GAAG,EACzC,SAAWtE,GAAM9C,EAAI,aAAa,CAAE,GAAIQ,EAAM,GAAI,KAAMsC,EAAI,GAAI,CAAC,EACjE,IAAK,IACL,IAAK,GACL,OAAO,IACP,WAAY,GACd,EACF,GACF,CAEJ,CAGA,SAASnB,GAAkB,CAAE,MAAAqC,EAAO,IAAAhE,CAAI,EAAqC,CAnkC7E,IAAAuD,EAokCE,GAAM,CAACiE,EAAYC,CAAa,EAAU,YAAS,EAAE,EAC/C,CAACC,EAAUC,CAAW,EAAU,YAAS,EAAK,EAC9C,CAACC,EAAUC,CAAW,EAAU,YAEpC,CAAC,CAAC,EACEC,EAAY,UAAuB,IAAI,EAEvC,aAAU,IAAM,CACpB,sCAAwB,KAAMC,GAAQ,CACpCF,EAAYE,EAAI,kBAAkBP,CAAU,CAAC,CAC/C,CAAC,CACH,EAAG,CAACA,CAAU,CAAC,EAEf,IAAMQ,EAAmB,eACtBC,GAAmE,CAClE,sCAAwB,KAAMF,GAAQ,CACpCA,EAAI,eAAeE,EAAK,OAAQA,EAAK,QAAQ,EAE7C,IAAMC,EACJD,EAAK,WAAa,mBAEdA,EAAK,WAAa,gBAElBA,EAAK,WAAa,8BAIxBjI,EAAI,MAAM,CAAE,KAAMkI,EAAU,WAAYD,EAAK,MAAO,CAAQ,EAC5DR,EAAc,EAAE,EAChBE,EAAY,EAAK,CACnB,CAAC,CACH,EACA,CAAC3H,CAAG,CACN,EAEM,aAAU,IAAM,CACpB,IAAMmI,EAAK7B,GAAkB,CACvBwB,EAAI,SAAW,CAACA,EAAI,QAAQ,SAASxB,EAAE,MAAc,IACvDqB,EAAY,EAAK,EACjBF,EAAc,EAAE,EAEpB,EACA,gBAAS,iBAAiB,YAAaU,CAAC,EACjC,IAAM,SAAS,oBAAoB,YAAaA,CAAC,CAC1D,EAAG,CAAC,CAAC,EAEL,IAAMC,EACJpE,EAAM,cACF,YACAA,EAAM,eACN,QACAA,EAAM,gBACN,SACA,aACAqE,EAAerE,EAAc,YAAcoE,EAC3CE,EAAW,KAAK,QAAO/E,EAAAS,EAAM,QAAN,KAAAT,EAAe,GAAK,GAAG,EAEpD,SACE,QAAC,OACC,qBAACI,GAAA,CACC,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,gBAAI,KACtC,QAAC,OAAI,IAAKkE,EAAK,MAAO,CAAE,SAAU,WAAY,KAAM,CAAE,EACpD,oBAACS,GAAA,CACC,MAAOf,GAAca,EACrB,SAAW/B,GAAM,CACfmB,EAAcnB,EAAE,OAAO,KAAK,EAC5BqB,EAAY,EAAI,CAClB,EACA,QAAS,IAAM,CACbA,EAAY,EAAI,EAChB,sCAAwB,KAAM,GAAM,EAAE,iBAAiB,CAAC,CAC1D,EACA,YAAY,kBACZ,MAAO,CAAE,SAAU,CAAE,EACvB,EACCD,GAAYE,EAAS,OAAS,MAC7B,OAACY,GAAA,CACE,SAAAZ,EAAS,IAAKa,MACb,OAACC,GAAA,CAEC,YAAcpC,GAAwB,CACpCA,EAAE,eAAe,EACjB0B,EAAWS,CAAC,CACd,EACA,MAAO,CAAE,WAAYA,EAAE,MAAO,EAE7B,SAAAA,EAAE,QAPEA,EAAE,MAQT,CACD,EACH,GAEJ,GACF,KACA,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EACzB,mBAAC5F,GAAA,CACC,MAAM,OACN,MAAOyF,EACP,SAAWxF,GAAM9C,EAAI,MAAM,CAAE,MAAO8C,EAAI,GAAI,CAAC,EAC7C,IAAK,GACL,IAAK,IACL,OAAO,IACP,WAAY,GACd,EACF,KACA,QAACa,GAAA,CAAS,MAAO,CAAE,UAAW,CAAE,EAC9B,oBAACC,GAAA,CAAW,MAAO,CAAE,MAAO,EAAG,EAAG,iBAAK,KACvC,OAACC,GAAA,CACE,UACC,CACE,YACA,OACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,6BACF,OAAO,eACP,YAAY,IACZ,cAAc,QAChB,EACF,CAEJ,EACA,CACE,aACA,OACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,8BACF,OAAO,eACP,YAAY,IACZ,cAAc,QAChB,EACF,CAEJ,EACA,CACE,UACA,OACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,gCACF,OAAO,eACP,YAAY,IACZ,cAAc,QAChB,EACF,CAEJ,EACA,CACE,cACA,OACE,OAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,mBAAC,QACC,EAAE,gCACF,OAAO,eACP,YAAY,IACZ,cAAc,QAChB,EACF,CAEJ,CACF,EAAE,IAAI,CAAC,CAAE,IAAAC,EAAK,IAAA6E,CAAI,OAChB,OAAChG,GAAA,CAEC,SAAUqB,EAAM,YAAcF,EAC9B,QAAS,IAAM9D,EAAI,MAAM,CAAE,UAAW8D,CAAI,CAAC,EAE1C,SAAA6E,GAJI7E,CAKP,CACD,EACH,GACF,GACF,CAEJ,CAGA,SAAS7C,GAAiB,CAAE,IAAAjB,CAAI,EAAiB,CAC/C,SACE,QAACK,GAAA,CACC,oBAACC,GAAA,CAAa,qBAAS,KACvB,OAACkC,GAAA,CACE,UACC,CACE,GAAI,IAAMxC,EAAI,YAAoB,EAClC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACpF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,MACL,EACA,CACE,GAAI,IAAMA,EAAI,wBAAgC,EAC9C,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,IAAI,gBAAgB,MAAM,KAC/F,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACpF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,UACL,EACA,CACE,GAAI,IAAMA,EAAI,aAAqB,EACnC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACpF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,OACL,EACA,CACE,GAAI,IAAMA,EAAI,WAAmB,EACjC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACpF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,KACL,EACA,CACE,GAAI,IAAMA,EAAI,sBAA8B,EAC5C,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,IAAI,gBAAgB,MAAM,KAC/F,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACrF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,UACL,EACA,CACE,GAAI,IAAMA,EAAI,cAAsB,EACpC,QACE,QAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,KACpF,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACtF,EAEF,EAAG,QACL,CACF,EAAE,IAAI,CAAC,CAAE,GAAAyC,EAAI,KAAAV,EAAM,CAAE,EAAGC,OACtB,OAACW,GAAA,CAAiB,QAASF,EAAI,MAAO,EACnC,SAAAV,GADYC,CAEf,CACD,EACH,KACA,OAAC4G,GAAA,CAAU,MAAO,CAAE,QAAS,QAAS,UAAW,EAAG,aAAc,CAAE,EAAG,sBAAU,KACjF,QAACpG,GAAA,CAAU,MAAO,CAAE,oBAAqB,gBAAiB,EACxD,oBAACG,GAAA,CAAS,QAAS,IAAM3C,EAAI,uBAAoC,EAAG,MAAM,wBACxE,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACpF,EACF,KACA,OAAC2C,GAAA,CAAS,QAAS,IAAM3C,EAAI,qBAAkC,EAAG,MAAM,sBACtE,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,MAAM,KAAK,eAAe,QAAQ,MAAM,GACpF,EACF,GACF,KACA,OAAC4I,GAAA,CAAU,MAAO,CAAE,QAAS,QAAS,UAAW,EAAG,aAAc,CAAE,EAAG,mBAAO,KAC9E,QAACpG,GAAA,CAAU,MAAO,CAAE,oBAAqB,gBAAiB,EACxD,oBAACG,GAAA,CAAS,QAAS,IAAM3C,EAAI,oBAA8B,EAAG,MAAM,gBAClE,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,IAAI,gBAAgB,MAAM,KAC/F,OAAC,QAAK,EAAE,WAAW,OAAO,eAAe,YAAY,IAAI,QAAQ,MAAM,KACvE,OAAC,QAAK,EAAE,WAAW,OAAO,eAAe,YAAY,IAAI,QAAQ,MAAM,GACzE,EACF,KACA,OAAC2C,GAAA,CAAS,QAAS,IAAM3C,EAAI,kBAA4B,EAAG,MAAM,iBAChE,oBAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAClC,oBAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,OAAO,eAAe,YAAY,MAAM,KAC3E,OAAC,QAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,eAAe,YAAY,MAAM,KAC7E,OAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO,eAAe,YAAY,IAAI,gBAAgB,MAAM,KAC/F,OAAC,QAAK,EAAE,WAAW,OAAO,eAAe,YAAY,IAAI,QAAQ,MAAM,KACvE,OAAC,QAAK,EAAE,WAAW,OAAO,eAAe,YAAY,IAAI,QAAQ,MAAM,GACzE,EACF,GACF,GACF,CAEJ,CAGA,SAAS6I,GAAcC,EAAYC,EAAkB,CACnD,IAAMC,EAAM,IAAI,gBAAgBF,CAAI,EAC9BG,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAOD,EACTC,EAAE,SAAWF,EACbE,EAAE,MAAM,EACR,WAAW,IAAM,IAAI,gBAAgBD,CAAG,EAAG,GAAI,CACjD,CAsBA,SAASE,GAAc,CAAE,MAAAC,EAAO,IAAAC,CAAI,EAAiC,CACnE,GAAM,CAACC,EAASC,CAAU,EAAU,YAAwB,IAAI,EAC1DC,EAAOJ,EAAM,KAAO,IAAMA,EAAM,GAAG,MAAM,EAAG,CAAC,EAgCnD,SACE,OAAC,OACC,oBAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,CAAE,EACpC,oBAACK,GAAA,CAAS,MAAO,CAAE,KAAM,CAAE,EAAG,QAjClB,IAAYC,EAAA,sBAC5BH,EAAW,KAAK,EAChB,GAAI,CACF,IAAMI,EAAO,MAAMN,EAAI,kBAA8B,CAAE,IAAK,CAACD,EAAM,EAAE,CAAE,CAAC,EACpEO,GAAMC,GAAcD,EAAMH,EAAO,MAAM,CAC7C,OAASK,EAAP,CACA,QAAQ,MAAM,oBAAqBA,CAAC,CACtC,CACAN,EAAW,IAAI,CACjB,GAwBwD,MAAM,gBACrD,SAAAD,IAAY,MAAQ,MAAQ,MAC/B,KACA,OAACG,GAAA,CAAS,MAAO,CAAE,KAAM,CAAE,EAAG,QAzBlB,IAAYC,EAAA,sBAC5BH,EAAW,KAAK,EAChB,GAAI,CACF,IAAMI,EAAO,MAAMN,EAAI,kBAA8B,CAAE,IAAK,CAACD,EAAM,EAAE,CAAE,CAAC,EACpEO,GAAMC,GAAcD,EAAMH,EAAO,MAAM,CAC7C,OAASK,EAAP,CACA,QAAQ,MAAM,oBAAqBA,CAAC,CACtC,CACAN,EAAW,IAAI,CACjB,GAgBwD,MAAM,gBACrD,SAAAD,IAAY,MAAQ,MAAQ,MAC/B,KACA,OAACG,GAAA,CAAS,MAAO,CAAE,KAAM,CAAE,EAAG,QAjBjB,IAAM,CACvB,IAAMK,EAAO,KAAK,UAAUV,EAAO,KAAM,CAAC,EAC1C,UAAU,UAAU,UAAUU,CAAI,EAAE,MAAOC,GAAO,CAElD,CAAC,EACDH,GAAc,IAAI,KAAK,CAACE,CAAI,EAAG,CAAE,KAAM,kBAAmB,CAAC,EAAGN,EAAO,OAAO,CAC9E,EAWyD,MAAM,uBAAuB,gBAEhF,GACF,EACF,CAEJ,CAGA,SAASQ,GAAe,CACtB,MAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,EAChB,EAIG,CACD,GAAM,CAACC,EAAMC,CAAO,EAAU,YAASF,CAAW,EAClD,SACE,QAACG,GAAA,CACC,qBAAC,OACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,OAAQ,SACV,EACA,QAAS,IAAMD,EAAQ,CAACD,CAAI,EAE5B,oBAACG,GAAA,CAAa,MAAO,CAAE,aAAc,CAAE,EAAI,SAAAN,EAAM,KACjD,OAACO,GAAA,CACC,QAAUX,GAAM,CACdA,EAAE,gBAAgB,EAClBQ,EAAQ,CAACD,CAAI,CACf,EAEC,SAAAA,EAAO,SAAW,IACrB,GACF,EACCA,MAAQ,OAAC,OAAI,MAAO,CAAE,UAAW,CAAE,EAAI,SAAAF,EAAS,GACnD,CAEJ,CAGA,IAAMO,GAAQC,EAAO,MAAO,CAC1B,QAAS,OACT,cAAe,SACf,MAAO,OACP,OAAQ,OACR,UAAW,OACX,UAAW,SACX,uBAAwB,CAAE,MAAO,KAAM,EACvC,6BAA8B,CAAE,WAAY,aAAc,aAAc,KAAM,CAChF,CAAC,EAEKJ,GAAcI,EAAO,MAAO,CAAE,QAAS,UAAW,CAAC,EACnDH,GAAeG,EAAO,MAAO,CACjC,SAAU,OACV,WAAY,IACZ,MAAO,iBACP,cAAe,YACf,cAAe,SACf,aAAc,KAChB,CAAC,EACKC,GAAUD,EAAO,MAAO,CAAE,OAAQ,MAAO,WAAY,YAAa,CAAC,EACnEE,GAAOF,EAAO,MAAO,CAAE,SAAU,OAAQ,MAAO,iBAAkB,UAAW,QAAS,CAAC,EAEvFG,GAAYH,EAAO,MAAO,CAAE,QAAS,OAAQ,oBAAqB,UAAW,IAAK,KAAM,CAAC,EACzFI,GAAWJ,EAAO,MAAO,CAC7B,QAAS,OACT,WAAY,SACZ,IAAK,MACL,aAAc,KAChB,CAAC,EACKK,GAAaL,EAAO,QAAS,CACjC,SAAU,MACV,MAAO,iBACP,WAAY,IACZ,MAAO,OACP,WAAY,EACZ,UAAW,QACX,OAAQ,YACR,WAAY,MACd,CAAC,EACKM,GAAQN,EAAO,OAAQ,CAAE,SAAU,MAAO,MAAO,gBAAiB,CAAC,EAEnEO,GAAQP,EAAO,QAAS,CAC5B,MAAO,OACP,WAAY,WACZ,OAAQ,yBACR,aAAc,KACd,MAAO,QACP,SAAU,OACV,QAAS,UACT,WAAY,MACZ,QAAS,OACT,WAAY,oBACZ,UAAW,CAAE,YAAa,SAAU,EACpC,6DAA8D,CAAE,QAAS,MAAO,CAClF,CAAC,EAEKQ,GAAYR,EAAO,OAAQ,CAAE,SAAU,MAAO,MAAO,iBAAkB,WAAY,OAAQ,CAAC,EAE5FS,GAAYT,EAAO,MAAO,CAC9B,QAAS,OACT,oBAAqB,iBACrB,IAAK,KACP,CAAC,EAEKU,GAAWV,EAAO,MAAO,CAAE,QAAS,OAAQ,IAAK,MAAO,KAAM,CAAE,CAAC,EACjEjB,GAAWiB,EAAO,SAAU,CAChC,IAAK,QACL,KAAM,EACN,OAAQ,OACR,OAAQ,uBACR,aAAc,KACd,MAAO,iBACP,OAAQ,UACR,SAAU,MACV,WAAY,MACZ,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,YACZ,UAAW,CAAE,WAAY,SAAU,MAAO,OAAQ,EAClD,SAAU,CACR,SAAU,CACR,KAAM,CACJ,WAAY,UACZ,YAAa,UACb,MAAO,QACP,UAAW,CAAE,WAAY,UAAW,MAAO,OAAQ,CACrD,CACF,CACF,CACF,CAAC,EAEKF,GAAUE,EAAO,SAAU,CAC/B,IAAK,QACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,KACd,OAAQ,UACR,MAAO,iBACP,SAAU,OACV,UAAW,CAAE,WAAY,SAAU,MAAO,OAAQ,CACpD,CAAC,EAEKW,GAASX,EAAO,SAAU,CAC9B,IAAK,QACL,MAAO,OACP,OAAQ,OACR,aAAc,QACd,OAAQ,UACR,QAAS,MACT,WAAY,mBACZ,WAAY,WACZ,SAAU,CAAE,QAAS,CAAE,KAAM,CAAE,WAAY,SAAU,CAAE,CAAE,CAC3D,CAAC,EAEKY,GAAcZ,EAAO,MAAO,CAChC,MAAO,OACP,OAAQ,OACR,aAAc,MACd,WAAY,QACZ,WAAY,kBACZ,SAAU,CAAE,QAAS,CAAE,KAAM,CAAE,UAAW,kBAAmB,CAAE,CAAE,CACnE,CAAC,EAEKa,GAAab,EAAO,MAAO,CAC/B,QAAS,OACT,oBAAqB,eACrB,IAAK,MACL,WAAY,QACd,CAAC,EAEKc,GAAUd,EAAO,SAAU,CAC/B,IAAK,QACL,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,aAAc,KACd,OAAQ,uBACR,OAAQ,UACR,MAAO,iBACP,WAAY,YACZ,WAAY,EACZ,UAAW,CAAE,WAAY,SAAU,MAAO,OAAQ,EAClD,SAAU,CACR,OAAQ,CACN,KAAM,CACJ,WAAY,wBACZ,YAAa,UACb,MAAO,SACT,CACF,CACF,CACF,CAAC,EAEKe,GAAWf,EAAO,MAAO,CAC7B,SAAU,WACV,IAAK,OACL,KAAM,EACN,MAAO,EACP,UAAW,QACX,UAAW,OACX,WAAY,SACZ,OAAQ,uBACR,aAAc,KACd,OAAQ,IACR,UAAW,6BACX,UAAW,MACX,uBAAwB,CAAE,MAAO,KAAM,EACvC,6BAA8B,CAAE,WAAY,aAAc,aAAc,KAAM,CAChF,CAAC,EAEKgB,GAAWhB,EAAO,MAAO,CAC7B,QAAS,UACT,SAAU,OACV,MAAO,QACP,OAAQ,UACR,UAAW,CAAE,WAAY,QAAS,CACpC,CAAC,ED1pDD,IAAAiB,GAAA,6BAIaC,GAAmB,QAAK,UAAsB,CACzD,SACE,QAACC,GAAA,CACC,oBAACC,GAAA,EAAgB,EACnB,CAEJ,CAAC,EAEKD,GAAmBE,EAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,MAAO,QACP,OAAQ,OACR,WAAY,SACZ,WAAY,uBACZ,OAAQ,IACR,cAAe,MACf,SAAU,SACV,WAAY,CACd,CAAC,E7CNDC,KiGjBA,IAAAC,GAAuB,oBACvBC,GAAwB,sBCDxB,IAAAC,GAA8B,4CAC9BC,GAAkC,iCAElCC,GAAuB,oBACvBC,GAA0C,sBCJ1C,IAAAC,GAAqB,yCAArB,IAAAC,GAAA,6BAIO,SAASC,GAAOC,EAIiD,CAJjD,IAAAC,EAAAD,EACrB,UAAAE,EACA,GAAAC,CANF,EAIuBF,EAGlBG,EAAAC,GAHkBJ,EAGlB,CAFH,WACA,OAGA,SACE,QAAC,SAAK,IAAI,MAAM,QAAO,GAAC,SAAUC,EAAU,GAAIC,EAC9C,oBAACG,GAAAC,EAAA,GAAcH,EAAM,EACvB,CAEJ,CCdA,IAAAI,GAA6B,yCCAtB,IAAMC,GAAgBC,GAAaA,EAAE,eAAe,EDA3D,IAAAC,GAAA,6BAgBO,SAASC,GAAe,CAC7B,QAAAC,EACA,SAAAC,EAAW,GACX,QAAAC,EACA,gBAAAC,EACA,IAAAC,EACA,GAAAC,EACA,UAAAC,EACA,SAAAC,CACF,EAAwB,CACtB,SACE,QAAC,iBACC,IAAI,MACJ,SAAUC,GACV,gBAAiBL,EACjB,QAASH,EACT,SAAUC,EACV,QAAO,GACP,GAAII,EACJ,aAAYC,EAEZ,oBAACG,GAAA,CAAU,IAAKL,EAAK,QAASF,EAAS,aAAY,GAChD,SAAAK,EACH,EACF,CAEJ,CE1CA,IAAAG,GAA8B,4CAA9B,IAAAC,GAAA,6BAkBO,SAASC,GAAU,CACxB,WAAAC,EAAa,EACb,YAAAC,EAAc,EACd,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,GAAAC,EACA,SAAAC,EAAW,GACX,KAAAC,EAAO,QACT,EAAmB,CACjB,IAAMC,EAAYC,GAAa,EAE/B,SACE,QAAc,UAAb,CAAoB,UAAWD,EAAU,QAAS,IAAI,MACrD,oBAAc,WAAb,CACC,MAAOL,EACP,YAAaF,EACb,WAAYD,EACZ,gBAAiBU,GACjB,QAAO,GACP,GAAIL,EACJ,KAAME,EAEN,oBAACI,GAAA,CAAc,QAASP,EAAS,SAAUE,EACxC,SAAAJ,EACH,EACF,EACF,CAEJ,CAEO,IAAMS,GAAgBC,EAAOC,GAAa,CAC/C,MAAO,cACP,OAAQ,cACR,SAAU,EACV,UAAW,QACX,UAAW,OACX,UAAW,SACX,sBAAuB,CACrB,QAAS,MACX,EACA,qBAAsB,OACtB,eAAgB,OAChB,SAAU,CACR,QAAS,CACP,WAAY,CACV,cAAe,KACjB,EACA,KAAM,CACJ,SAAU,GACZ,CACF,EACA,SAAU,CACR,KAAM,CACJ,UAAW,MACb,CACF,CACF,CACF,CAAC,EC5ED,IAAAC,GAA0B,yCAGnB,IAAMC,GAAYC,EAAO,aAAW,CACzC,gBAAiB,SACjB,OAAQ,EACR,UAAW,KACX,YAAa,MACb,aAAc,KACd,WAAY,KACd,CAAC,ECVD,IAAAC,GAA0B,yCAGnB,IAAMC,GAAcC,EAAO,aAAW,CAC3C,OAAQ,OACR,MAAO,OACP,gBAAiB,SACjB,aAAc,MACd,QAAS,IACT,OAAQ,IACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,OACT,OAAQ,OACR,cAAe,MACf,OAAQ,UAER,SAAU,CACR,SAAU,CACR,KAAM,CACJ,gBAAiB,YACjB,MAAO,OACT,EACA,MAAO,CAAC,CACV,EACA,GAAI,CACF,OAAQ,CAAC,EACT,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,GAAI,QACJ,IAAK,CACH,UAAW,CACT,gBAAiB,QACnB,EACA,yBAA0B,CACxB,gBAAiB,QACnB,CACF,CACF,CACF,CACF,CAAC,EC9CD,IAAAC,GAAmD,yCAAnD,IAAAC,GAAA,6BAcO,SAASC,GAAU,CACxB,SAAAC,EACA,KAAAC,EACA,SAAAC,EAAW,GACX,SAAAC,EAAW,GACX,MAAAC,EACA,GAAAC,CACF,EAAmB,CACjB,SACE,SAAC,QACC,qBAAC,eAAW,IAAI,MAAM,QAAO,GAC3B,oBAACC,GAAA,CAAU,SAAUH,EAAU,SAAQ,GACpC,SAAAC,EACH,EACF,KACA,QAAC,eAAW,QAAO,GAAC,WAAY,EAAG,YAAa,GAC9C,qBAACG,GAAA,CAAY,KAAMN,EAAM,SAAUC,EAChC,UAAAF,KACD,QAAC,UAAM,OAAQ,GAAI,GACrB,EACF,IAXQK,CAYV,CAEJ,CCrCA,IAAAG,GAAwB,yCAAxB,IAAAC,GAAA,6BASO,SAASC,GAAcC,EAA+C,CAA/C,IAAAC,EAAAD,EAAE,IAAAE,EAAI,SAAAC,CATpC,EAS8BF,EAAmBG,EAAAC,GAAnBJ,EAAmB,CAAjB,KAAI,aAClC,SACE,QAAC,YAAQ,QAAO,GAAC,GAAIC,EACnB,oBAACI,GAAAC,EAAAC,EAAA,GAAeJ,GAAf,CAAsB,SAAAD,GAAS,EAClC,CAEJ,CCfA,IAAAM,GAAuB,oBACvBC,GAA0C,sBAD1C,IAAAC,GAAA,6BAQMC,GAAoBC,GAAkBA,EAAE,SAExCC,GAAe,CAAC,SAAU,OAAQ,QAAS,KAAK,EAE/C,SAASC,IAAkB,CAChC,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EAEfC,EAAWH,EAAI,SAASJ,EAAgB,EAExCQ,EAAwB,eAAY,IAAM,CAC9CJ,EAAI,WAAW,cAAgBK,GAAM,CAACA,CAAC,CACzC,EAAG,CAACL,CAAG,CAAC,EAEFM,EAAuB,eAAY,IAAM,CAC7CN,EAAI,WAAW,aAAeK,GAAM,CAACA,CAAC,CACxC,EAAG,CAACL,CAAG,CAAC,EAEFO,EAAwB,eAAY,IAAM,CAC9CP,EAAI,WAAW,cAAgBK,GAAM,CAACA,CAAC,CACzC,EAAG,CAACL,CAAG,CAAC,EAEFQ,EAAmB,eAAY,IAAM,CACzCR,EAAI,WAAW,WAAaK,GAAM,CAACA,CAAC,CACtC,EAAG,CAACL,CAAG,CAAC,EAEFS,EAAgC,eAAY,IAAM,CACtDT,EAAI,WAAW,oBAAsBK,GAAM,CAACA,CAAC,CAC/C,EAAG,CAACL,CAAG,CAAC,EAEFU,EAA4B,eAAY,IAAM,CAClDV,EAAI,WAAW,kBAAoBK,GAAM,CAACA,CAAC,CAC7C,EAAG,CAACL,CAAG,CAAC,EAEFW,EAAiC,eACpCC,GAA6B,CAC5BZ,EAAI,WAAW,eAAgBY,CAAQ,CACzC,EACA,CAACZ,CAAG,CACN,EAEMa,EAA+B,eAClCC,GAAmC,CAClCd,EAAI,WAAW,mBAAoBc,CAAU,CAC/C,EACA,CAACd,CAAG,CACN,EAEA,SACE,SAACe,GAAA,CAAU,MAAOb,EAAK,cAAc,CAAE,GAAI,kBAAmB,CAAC,EAAG,GAAG,0BACnE,qBAACc,GAAA,CACC,QAASb,EAAS,WAClB,gBAAiBG,EACjB,IAAI,WACJ,GAAG,oCACH,UAAWJ,EAAK,cAAc,CAAE,GAAI,uBAAwB,CAAC,EAE7D,oBAAC,qBAAiB,GAAG,wBAAwB,EAC/C,KACA,QAACc,GAAA,CACC,QAASb,EAAS,YAClB,gBAAiBI,EACjB,IAAI,KACJ,GAAG,qCACH,UAAWL,EAAK,cAAc,CAAE,GAAI,wBAAyB,CAAC,EAE9D,oBAAC,qBAAiB,GAAG,yBAAyB,EAChD,KACA,QAACc,GAAA,CACC,QAASb,EAAS,YAClB,gBAAiBC,EACjB,GAAG,qCACH,UAAWF,EAAK,cAAc,CAAE,GAAI,wBAAyB,CAAC,EAE9D,oBAAC,qBAAiB,GAAG,yBAAyB,EAChD,KACA,QAACe,GAAA,EAAQ,KACT,QAACD,GAAA,CACC,QAASb,EAAS,SAClB,gBAAiBK,EACjB,IAAI,WACJ,GAAG,+BACH,UAAWN,EAAK,cAAc,CAAE,GAAI,uBAAwB,CAAC,EAE7D,oBAAC,qBAAiB,GAAG,wBAAwB,EAC/C,KACA,QAACc,GAAA,CACC,QAASb,EAAS,gBAClB,gBAAiBO,EACjB,GAAG,wCACH,UAAWR,EAAK,cAAc,CAAE,GAAI,+BAAgC,CAAC,EAErE,oBAAC,qBAAiB,GAAG,gCAAgC,EACvD,KACA,QAACc,GAAA,CACC,QAASb,EAAS,kBAClB,gBAAiBM,EACjB,GAAG,qCACH,UAAWP,EAAK,cAAc,CAAE,GAAI,iCAAkC,CAAC,EAEvE,oBAAC,qBAAiB,GAAG,kCAAkC,EACzD,KACA,QAACa,GAAA,CAAU,MAAOb,EAAK,cAAc,CAAE,GAAI,eAAgB,CAAC,EACzD,SAAAJ,GAAa,IAAKc,MACjB,QAACI,GAAA,CAEC,QAASb,EAAS,eAAiBS,EACnC,gBAAiB,IAAMD,EAAyBC,CAA0B,EAC1E,GAAI,4BAA4BA,IAChC,UAAW,gBAAgBA,IAE3B,oBAACM,GAAA,CACC,oBAAC,qBAAiB,GAAIN,EAAU,EAClC,GARKA,CASP,CACD,EACH,KACA,QAACG,GAAA,CAAU,MAAOb,EAAK,cAAc,CAAE,GAAI,mBAAoB,CAAC,EAC7D,gBAAO,OAAOiB,EAAkB,EAAE,IAAKC,MACtC,QAACJ,GAAA,CAEC,QAASb,EAAS,mBAAqBiB,EACvC,gBAAiB,IAAMP,EAAuBO,CAAsC,EACpF,GAAI,gCAAgCA,IACpC,UAAW,oBAAoBA,IAE/B,oBAACF,GAAA,CACC,oBAAC,qBAAiB,GAAIE,EAA4B,EACpD,GARKA,CASP,CACD,EACH,GACF,CAEJ,CAEA,IAAMF,GAAaG,EAAO,OAAQ,CAChC,cAAe,YACjB,CAAC,ETlJD,IAAAC,EAAA,6BAkBMC,GAA+BC,GAC5BA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YAAY,OAG/DC,GAAyBD,GACtBA,EAAE,SAAS,cAGPE,GAAa,QAAK,SAAc,CAAE,SAAAC,CAAS,EAAc,CACpE,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EACf,CAACC,EAAYC,CAAa,EAAU,YAAS,EAAK,EAElDC,EAAsBL,EAAI,SAASL,EAA2B,EAE9DW,EAAgBN,EAAI,SAASH,EAAqB,EAElD,CAACU,EAAGC,CAAQ,EAAU,YAAS,CAAC,EAEhC,aAAU,IAAMA,EAAS,CAAC,EAAG,CAAC,CAAC,EAErC,GAAM,CAAE,aAAAC,EAAc,cAAAC,EAAe,cAAAC,EAAe,gBAAAC,CAAgB,EAAIC,GAAsB,EAExFC,EAA4B,eAAY,IAAM,CAElDV,EAAc,EAAI,CACpB,EAAG,CAAC,CAAC,EAECW,EAAqB,eAAY,IAAM,CAC3Cf,EAAI,OAAO,CACb,EAAG,CAACA,CAAG,CAAC,EAEFgB,EAAsB,eAAY,IAAM,CAC5ChB,EAAI,gBAA4B,CAAE,MAAO,EAAG,QAAS,EAAG,sBAAuB,EAAM,CAAC,CACxF,EAAG,CAACA,CAAG,CAAC,EAEFiB,EAAsB,eAAY,IAAM,CAC5CjB,EAAI,gBAA4B,CAAE,MAAO,EAAG,QAAS,EAAG,sBAAuB,EAAK,CAAC,CACvF,EAAG,CAACA,CAAG,CAAC,EAEFkB,EAAwB,eAAY,IAAYC,EAAA,sBACpDnB,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEFoB,EAAwB,eAAY,IAAYD,EAAA,sBACpDnB,EAAI,mBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEFqB,EAAyB,eAAY,IAAYF,EAAA,sBACrDnB,EAAI,mBAA+B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC7D,GAAG,CAACA,CAAG,CAAC,EAEFsB,EAAwB,eAAY,IAAYH,EAAA,sBACpDnB,EAAI,kBAA8B,CAAE,MAAO,EAAG,QAAS,CAAE,CAAC,CAC5D,GAAG,CAACA,CAAG,CAAC,EAEFuB,EAAuB,eAAY,IAAYJ,EAAA,sBACnDnB,EAAI,SAAS,CACf,GAAG,CAACA,CAAG,CAAC,EAEFwB,EAAyB,eAAY,IAAYL,EAAA,sBACrDnB,EAAI,WAAW,CACjB,GAAG,CAACA,CAAG,CAAC,EAEFyB,EAAkB,eAAY,IAAM,CACxCzB,EAAI,IAAI,CACV,EAAG,CAACA,CAAG,CAAC,EAEF0B,EAAmB,eAAY,IAAM,CACzC1B,EAAI,KAAK,CACX,EAAG,CAACA,CAAG,CAAC,EAEF2B,EAAoB,eAAY,IAAM,CAC1C3B,EAAI,MAAM,CACZ,EAAG,CAACA,CAAG,CAAC,EAEF4B,EAAwB,eAAY,IAAM,CAC9C5B,EAAI,UAAU,CAChB,EAAG,CAACA,CAAG,CAAC,EAEF6B,EAAyB,eAAY,IAAM,CAC/C7B,EAAI,WAAW,CACjB,EAAG,CAACA,CAAG,CAAC,EAEF8B,EAA0B,eAAY,IAAM,CAChD9B,EAAI,UAAU,CAChB,EAAG,CAACA,CAAG,CAAC,EAEF+B,GAAwB,eAAY,IAAM,CAC9C/B,EAAI,OAAO,CAAC,CACd,EAAG,CAACA,CAAG,CAAC,EAEFgC,EACJhC,EAAI,UAAU,cACdA,EAAI,UAAU,eACdA,EAAI,UAAU,eACdA,EAAI,UAAU,iBACdA,EAAI,UAAU,SAEViC,GAAe5B,EAAsB,EAE3C,SACE,oBACE,qBAAc,QAAb,CAAkB,IAAI,MACrB,oBAAC6B,GAAA,CAAc,GAAG,cAChB,mBAAC,uBAAkB,EACrB,KACA,QAACC,GAAA,CACC,QAAQ,OACR,GAAG,UACH,KAAK,SACL,MAAM,QACN,WAAY,EACZ,YAAa,EAEZ,UAAAH,MACC,QAACI,GAAA,CACC,MAAO,GAAGlC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,OAChD,GAAG,mBAEF,UAAAF,EAAI,UAAU,iBACb,OAACqC,GAAA,CAAO,QAAS5B,EAAc,IAAI,KAAK,GAAG,+BACzC,mBAAC,qBAAiB,GAAG,cAAc,EACrC,EAEDT,EAAI,UAAU,kBACb,QAACqC,GAAA,CAAO,QAAS3B,EAAe,IAAI,KAAK,GAAG,wBAC1C,oBAAC,qBAAiB,GAAG,OAAO,EAAE,OAEhC,EAEDV,EAAI,UAAU,kBACb,OAACqC,GAAA,CAAO,QAAS1B,EAAe,IAAI,KAAK,GAAG,wBAC1C,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,EAEDX,EAAI,UAAU,oBACb,QAACqC,GAAA,CACC,QAASvB,EACT,IAAI,WACJ,GAAG,2BAEH,oBAAC,qBAAiB,GAAG,UAAU,EAAE,OAEnC,KAEF,QAACsB,GAAA,CACC,MAAO,GAAGlC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,OAChD,KAAK,QACL,GAAG,qBAEH,oBAACmC,GAAA,CAAO,QAASf,EAAiB,GAAG,yBAAyB,eAE9D,KACA,OAACe,GAAA,CAAO,QAASnB,EAAiB,GAAG,yBAAyB,eAE9D,KACA,OAACmB,GAAA,CAAO,QAASjB,EAAiB,GAAG,yBAAyB,eAE9D,KACA,OAACiB,GAAA,CAAO,QAAShB,EAAkB,GAAG,0BAA0B,gBAEhE,KACA,OAACgB,GAAA,CAAO,QAASb,EAAkB,GAAG,0BAA0B,gBAEhE,GACF,EACC,CAAClB,MACA,oBACE,oBAACgC,GAAA,EAAQ,KACT,OAACD,GAAA,CAAO,QAASP,EAAmB,IAAI,KAAK,GAAG,gCAC9C,mBAAC,qBAAiB,GAAG,eAAe,EACtC,GACF,GAEJ,KAEF,QAACM,GAAA,CAAU,MAAO,GAAGlC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,OAAQ,GAAG,mBACpE,oBAACmC,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,KACb,SAAUD,EACV,IAAI,KACJ,GAAG,wBAEH,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,OAACsC,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,KACb,SAAUD,EACV,IAAI,WACJ,GAAG,wBAEH,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,OAACuC,GAAA,EAAQ,KACT,OAACD,GAAA,CACC,SAAUE,GACV,SAAU,CAACN,IAAgBlC,EAC3B,QAAS0B,EACT,IAAI,KACJ,GAAG,uBAEH,mBAAC,qBAAiB,GAAG,MAAM,EAC7B,KACA,OAACY,GAAA,CACC,SAAUE,GACV,SAAU,CAACN,GACX,QAASP,EACT,IAAI,KACJ,GAAG,wBAEH,mBAAC,qBAAiB,GAAG,OAAO,EAC9B,KACA,OAACW,GAAA,CACC,SAAUE,GACV,QAASZ,EACT,IAAI,KACJ,GAAG,yBAEH,mBAAC,qBAAiB,GAAG,QAAQ,EAC/B,KACA,OAACW,GAAA,EAAQ,KACT,QAACF,GAAA,CACC,MAAO,GAAGlC,EAAK,cAAc,CAAE,GAAI,SAAU,CAAC,OAC9C,KAAK,QACL,GAAG,sBAEH,oBAACmC,GAAA,CAAO,QAASrB,EAAe,GAAG,0BAA0B,eAE7D,KACA,OAACqB,GAAA,CAAO,QAASpB,EAAe,GAAG,0BAA0B,eAE7D,KACA,OAACoB,GAAA,CAAO,QAASd,EAAgB,GAAG,2BAA2B,gBAE/D,GACF,KAEA,OAACe,GAAA,EAAQ,KACT,OAACD,GAAA,CACC,SAAUE,GACV,QAASX,EACT,IAAI,KACJ,GAAG,yBAEH,mBAAC,qBAAiB,GAAG,aAAa,EACpC,KACA,OAACS,GAAA,CACC,SAAUE,GACV,SAAU,CAACN,GACX,QAASJ,EACT,GAAG,0BAEH,mBAAC,qBAAiB,GAAG,cAAc,EACrC,KACA,OAACS,GAAA,EAAQ,KACT,OAACD,GAAA,CACC,SAAUtB,EACV,SAAU,CAACkB,GACX,IAAI,SACJ,GAAG,qBAEH,mBAAC,qBAAiB,GAAG,SAAS,EAChC,GACF,KACA,QAACG,GAAA,CAAU,MAAOlC,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,EAAG,GAAG,mBAC5D,oBAACmC,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,OACb,IAAI,KACJ,GAAG,0BAEH,mBAAC,qBAAiB,GAAG,UAAU,EACjC,KACA,OAACqC,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,QACb,IAAI,KACJ,GAAG,2BAEH,mBAAC,qBAAiB,GAAG,WAAW,EAClC,KACA,QAACqC,GAAA,CACC,SAAUE,GACV,QAASR,GACT,IAAI,WACJ,GAAG,6BAEH,oBAAC,qBAAiB,GAAG,UAAU,EAAE,SACnC,KACA,OAACM,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,UACb,IAAI,WACJ,GAAG,6BAEH,mBAAC,qBAAiB,GAAG,cAAc,EACrC,KACA,OAACqC,GAAA,CACC,SAAUE,GACV,QAASvC,EAAI,gBACb,IAAI,WACJ,GAAG,mCAEH,mBAAC,qBAAiB,GAAG,oBAAoB,EAC3C,GACF,KACA,OAACsC,GAAA,EAAQ,KACT,OAACE,GAAA,EAAgB,GACnB,GACF,KACA,OAACC,GAAA,CAAe,OAAQtC,EAAY,QAAS,IAAMC,EAAc,EAAK,EAAG,GAC3E,CAEJ,CAAC,EU9UD,IAAAsC,GAA8B,4CAC9BC,GAAyC,iCACzCC,GAAuB,oBACvBC,GAAiC,sBACjCC,GAAsB,sBCJtB,IAAAC,GAAA,6BAEO,SAASC,IAAmB,CACjC,SACE,QAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,MAAM,6BACN,KAAK,eACL,SAAS,UACT,SAAS,UAET,oBAAC,QAAK,EAAE,k5DAAk5D,EAC55D,CAEJ,CDhBA,IAAAC,GAAA,6BAaMC,GAAgBC,GAAsBA,EAAM,KAErCC,GAAkB,UAA2B,CACxD,IAAMC,EAAMC,EAAY,EAElBC,EAAOF,EAAI,SAASH,EAAY,EAEhC,CAACM,EAAQC,CAAS,EAAU,YAAS,EAAK,EAE1CC,EAAiB,UAAY,CAAC,EAE9BC,EAAyB,eAAY,IAAM,CAC/CF,EAAU,EAAI,EACdG,EAAK,sBAAsB,OAAO,SAAS,IAAI,EAC/C,aAAaF,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMD,EAAU,EAAK,EAAG,IAAI,CAC5D,EAAG,CAAC,CAAC,EAECI,EAAiC,eAAY,IAAM,CACvDJ,EAAU,EAAI,EACd,IAAMK,EAAO,OAAO,SAAS,KAAK,MAAM,GAAG,EAC3CA,EAAKA,EAAK,OAAS,GAAK,IACxBA,EAAKA,EAAK,OAAS,GAAK,SAAM,IAAIA,EAAKA,EAAK,OAAS,EAAE,EACvDF,EAAK,sBAAsBE,EAAK,KAAK,GAAG,CAAC,EACzC,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMD,EAAU,EAAK,EAAG,IAAI,CAC5D,EAAG,CAAC,CAAC,EAECM,EAAuC,eAAY,IAAYC,EAAA,sBAC/DX,EAAI,QACFA,EAAI,iBACF,OAAO,QAAQ,sDAAsD,IACvE,MAAMA,EAAI,YAAY,GAGpB,OAAO,QAAQ,2CAA2C,IAC5D,MAAMA,EAAI,YAAY,GAGhBA,EAAI,kBACV,OAAO,QAAQ,2CAA2C,IAC5D,MAAMA,EAAI,YAAY,EAG5B,GAAG,CAAC,CAAC,EAECY,EAAuC,eAAY,IAAYD,EAAA,sBA3DvE,IAAAE,EA4DI,IAAMC,EAAe,SAAM,UAAUd,EAAI,QAAQ,EAEjDA,EAAI,aAAa,EAAI,EAErB,GAAI,CACF,GAAIA,EAAI,UAAU,cAChB,QAAWe,KAAMD,EAAa,OAAQ,CACpC,IAAME,EAAQF,EAAa,OAAOC,GAClC,GAAIC,EAAM,IAAI,SAAS,QAAQ,EAAG,CAChC,IAAMC,EAAOC,GACXF,EAAM,MACNH,EAAAG,EAAM,WAAN,KAAAH,EAAkBG,EAAM,gBAA6B,YAAc,WACrE,EACMG,EAAS,MAAMnB,EAAI,UAAU,cAAcA,EAAKiB,EAAMF,CAAE,EAC1DI,EACFH,EAAM,IAAMG,EAEZH,EAAM,IAAM,EAEhB,CACF,CAGF,IAAMI,EAAS,MAAM,MAAM,cAAe,CACxC,OAAQ,OACR,KAAM,UACN,QAAS,CACP,8BAA+B,IAC/B,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CACnB,OAAQ,SAAM,SAAS,EACvB,OAAQpB,EAAI,cACZ,SAAUc,CACZ,CAAC,CACH,CAAC,EAAE,KAAMO,GAAMA,EAAE,KAAK,CAAC,EAEnBD,GAAA,MAAAA,EAAQ,IACV,OAAO,SAAS,KAAOA,EAAO,IAE9Bb,EAAK,KAAKa,GAAA,YAAAA,EAAQ,OAAO,CAE7B,OAASE,EAAP,CACAf,EAAK,KAAMe,EAAU,OAAO,CAC9B,CAEAtB,EAAI,aAAa,EAAK,CACxB,GAAG,CAAC,CAAC,EAEL,SACE,SAAc,QAAb,CAAkB,IAAI,MACrB,qBAACuB,GAAA,CAAc,GAAG,yBAAyB,SAAU,CAAC,CAACrB,EACrD,oBAACsB,GAAA,EAAiB,EACpB,KACA,SAACC,GAAA,CAAU,QAAQ,OAAO,GAAG,qBAAqB,KAAK,SAAS,MAAM,QAAQ,WAAY,EACxF,sBAACC,GAAA,CAAO,GAAG,gCAAgC,QAASpB,EAAkB,SAAU,CAACJ,EAC/E,qBAAC,qBAAiB,GAAG,mBAAmB,KACxC,QAACyB,GAAA,CAAW,SAAAxB,KAAS,QAAC,eAAU,KAAK,QAAC,mBAAc,EAAG,GACzD,KACA,SAACuB,GAAA,CACC,GAAG,kCACH,QAASlB,EACT,SAAU,CAACN,EAEX,qBAAC,qBAAiB,GAAG,qBAAqB,KAC1C,QAACyB,GAAA,CAAW,SAAAxB,KAAS,QAAC,eAAU,KAAK,QAAC,mBAAc,EAAG,GACzD,KACA,QAACyB,GAAA,EAAQ,KACT,QAACF,GAAA,CACC,GAAG,0CACH,QAAShB,EAET,oBAAC,KAAE,KAAM,GAAG,OAAO,SAAS,WAC1B,oBAAC,qBAAiB,GAAG,6BAA6B,EACpD,EACF,KACA,QAACgB,GAAA,CACC,GAAG,0CACH,QAASd,EAET,oBAAC,qBAAiB,GAAG,2BAA2B,EAClD,GACF,GACF,CAEJ,EAEA,SAASM,GAAcW,EAAiBC,EAAkB,CAnJ1D,IAAAjB,EAAAkB,EAoJE,IAAMC,EAAMH,EAAQ,MAAM,GAAG,EACvBI,GAAOF,GAAAlB,EAAAmB,EAAI,KAAJ,YAAAnB,EAAQ,MAAM,aAAd,YAAAkB,EAA2B,GAClCG,EAAO,OAAO,KAAKF,EAAI,EAAE,EAC3BG,EAAID,EAAK,OACPE,EAAQ,IAAI,WAAWD,CAAC,EAE9B,KAAOA,KACLC,EAAMD,GAAKD,EAAK,WAAWC,CAAC,EAG9B,OAAO,IAAI,KAAK,CAACC,CAAK,EAAGN,EAAU,CAAE,KAAMG,CAAK,CAAC,CACnD,CE/JA,IAAAI,GAA8B,4CAC9BC,GAAoC,iCACpCC,GAAuB,oBACvBC,GAA0C,sBCH1C,IAAAC,GAAwB,2CACxBC,GAA+C,iCAC/CC,GAAuB,oBACvBC,GAA0C,sBCDnC,IAAMC,GAAaC,EAAO,SAAU,CACzC,SAAU,WACV,OAAQ,OACR,MAAO,OACP,gBAAiB,SACjB,aAAc,MACd,QAAS,IACT,OAAQ,IACR,QAAS,OACT,OAAQ,OACR,cAAe,MACf,SAAU,KACV,MAAO,QACP,OAAQ,UACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAEhB,QAAS,CACP,QAAS,EACT,WAAY,CACd,EAEA,aAAc,CACZ,QAAS,KACX,EAEA,WAAY,CACV,MAAO,OACP,OAAQ,OACR,QAAS,OACT,WAAY,QACd,EAEA,SAAU,CACR,GAAI,CACF,OAAQ,CACN,gBAAiB,aACnB,EACA,MAAO,CACL,yBAA0B,CACxB,gBAAiB,QACnB,CACF,CACF,EACA,KAAM,CACJ,MAAO,CACL,OAAQ,GACR,MAAO,GACP,uBAAwB,CACtB,OAAQ,OACR,MAAO,MACT,CACF,EACA,OAAQ,CACN,OAAQ,GACR,MAAO,GACP,uBAAwB,CACtB,OAAQ,OACR,MAAO,MACT,CACF,EACA,MAAO,CACL,OAAQ,GACR,MAAO,GACP,uBAAwB,CACtB,OAAQ,OACR,MAAO,MACT,CACF,CACF,EACA,SAAU,CACR,KAAM,CACJ,MAAO,WACT,CACF,CACF,CACF,CAAC,ED/ED,IAAAC,GAAA,6BAcMC,GAAqBC,GAClB,OAAO,KAAKA,EAAE,SAAS,KAAK,EAAE,OAAS,EASzC,SAASC,GAAkB,CAAE,KAAAC,EAAM,OAAAC,EAAQ,QAAAC,CAAQ,EAA2B,CACnF,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EAEf,CAACC,EAAQC,CAAS,EAAU,YAAS,EAAK,EAC1C,CAACC,EAAUC,CAAW,EAAU,YAAST,EAAK,MAAQ,MAAM,EAE5DU,EAAYP,EAAI,SAASN,EAAiB,EAE1Cc,EAAe,UAAyB,IAAI,EAE5CC,EAAoB,eAAY,IAAM,CAC1CL,EAAU,EAAK,CACjB,EAAG,CAAC,CAAC,EAECM,EAAwB,eAAY,IAAM,CAC9CV,EAAI,cAAcH,EAAK,EAAE,CAC3B,EAAG,CAACG,CAAG,CAAC,EAEFW,EAAqB,eAAY,IAAM,CACvC,OAAO,QAAQ,4CAA4C,GAC7DX,EAAI,WAAWH,EAAK,EAAE,CAE1B,EAAG,CAACG,CAAG,CAAC,EAEFY,EAAyB,eAC5BT,GAAoB,CAGnB,GAFAC,EAAUD,CAAM,EAEZA,EAAQ,CACVL,GAAA,MAAAA,IACA,MACF,CACF,EACA,CAACE,CAAG,CACN,EAEA,SAASa,EAAgBC,EAAwC,CAC/DA,EAAE,gBAAgB,CACpB,CAEA,IAAMC,EAAqB,UAAOlB,EAAK,MAAQ,MAAM,EAC/CmB,EAAqB,UAAOD,EAAa,OAAO,EAEhDE,EAA8B,eAAaC,GAA+C,CAC9F,IAAMC,EAAQD,EAAM,OAAO,MAAM,UAAU,EAC3CF,EAAa,QAAUG,EACvBb,EAAYa,CAAK,CACnB,EAAG,CAAC,CAAC,EAECC,EAA+B,eAAaN,GAA6C,CAC7F,OAAQA,EAAE,SACH,QAAS,CACRE,EAAa,UAAYD,EAAa,UAGxCA,EAAa,QAAUC,EAAa,QACpChB,EAAI,WAAWH,EAAK,GAAImB,EAAa,QAAQ,KAAK,CAAC,GACnDZ,EAAU,EAAK,EAGjB,KACF,KACK,SAAU,CAEb,GAAIY,EAAa,UAAYD,EAAa,QAAS,CACjDX,EAAU,EAAK,EACf,MACF,CAGAY,EAAa,QAAUD,EAAa,QACpCT,EAAYS,EAAa,OAAO,EAGhC,sBAAsB,IAAM,CAC1B,IAAMM,EAAMb,EAAO,QACfa,IACFA,EAAI,MAAM,EACVA,EAAI,kBAAkB,EAAGA,EAAI,MAAM,MAAM,EAE7C,CAAC,EACD,KACF,EAEJ,EAAG,CAAC,CAAC,EAECC,EAAiB,UAAO,EAAK,EAE7B,aAAU,KACVnB,GACFmB,EAAS,QAAU,GACnBP,EAAa,QAAUlB,EAAK,MAAQ,OACpCmB,EAAa,QAAUD,EAAa,QAEpC,sBAAsB,IAAM,CAC1B,IAAMM,EAAMb,EAAO,QACfa,IACFA,EAAI,MAAM,EACVA,EAAI,kBAAkB,EAAGA,EAAI,MAAM,MAAM,EAE7C,CAAC,GACQC,EAAS,UAClBvB,GAAA,MAAAA,KAGK,IAAM,CACPiB,EAAa,UAAYD,EAAa,UACxCA,EAAa,QAAUC,EAAa,QACpChB,EAAI,WAAWH,EAAK,GAAImB,EAAa,OAAO,EAEhD,GACC,CAACb,CAAM,CAAC,EAEX,IAAMoB,EAAYC,GAAa,EAE/B,SACE,SAAQ,QAAP,CAAY,KAAMrB,EAAQ,aAAcS,EACvC,qBAAQ,WAAP,CAAe,QAAO,GAAC,WAAS,OAC/B,oBAACa,GAAA,CAAW,GAAIC,GACd,oBAACC,GAAA,CACC,oBAAC,uBAAkB,EACrB,EACF,EACF,KACA,SAAQ,UAAP,CAAc,UAAWJ,EAAU,QAClC,qBAACK,GAAA,CAAoB,cAAenB,EAAa,KACjD,SAACoB,GAAA,CAAoB,IAAI,MAAM,UAAWhB,EAAiB,QAASA,EAClE,qBAACiB,GAAA,CACC,IAAKtB,EACL,YAAaN,EAAK,cAAc,CAAE,GAAI,WAAY,CAAC,EACnD,MAAOG,EACP,SAAUY,EACV,UAAWG,EACX,QAAM,QAAC,iBAAY,EACrB,KACA,QAACW,GAAA,EAAQ,KACT,QAACC,GAAA,CAAa,SAAUtB,EACtB,oBAAC,qBAAiB,GAAG,YAAY,EACnC,KACA,QAACsB,GAAA,CAAa,SAAU,CAACzB,EAAW,SAAUI,EAC5C,oBAAC,qBAAiB,GAAG,SAAS,EAChC,KACA,QAACoB,GAAA,EAAQ,KACT,QAAQ,UAAP,CAAc,QAAO,GACpB,oBAACE,GAAA,CACC,oBAAC,qBAAiB,GAAG,SAAS,EAChC,EACF,GACF,GACF,GACF,CAEJ,CAMO,IAAMJ,GAAsBK,EAAc,WAAS,CACxD,SAAU,WACV,IAAK,MACL,KAAM,MACN,UAAW,wBACX,SAAU,IACV,SAAU,cACV,UAAW,OACX,UAAW,OACX,cAAe,MACf,gBAAiB,SACjB,QAAS,KACT,aAAc,KACd,KAAM,MACN,OAAQ,OACR,UAAW,CACT,QAAS,MACX,CACF,CAAC,EAEYN,GAAsBM,EAAc,WAAS,CACxD,gBAAiB,qBACjB,SAAU,WACV,cAAe,MACf,MAAO,EACP,OAAQ,MACV,CAAC,EAED,SAASF,GAAaG,EAGyE,CAHzE,IAAAC,EAAAD,EACpB,UAAAE,CApNF,EAmNsBD,EAEjBE,EAAAC,GAFiBH,EAEjB,CADH,aAGA,SACE,QAAQ,UAAP,CAAc,QAAO,GAAC,QAASC,EAAU,SAAUA,EAClD,oBAACJ,GAAAO,EAAA,GAAcF,EAAM,EACvB,CAEJ,CD5NA,IAAAG,GAAA,6BAcMC,GAAkBC,GACtB,OAAO,OAAOA,EAAE,SAAS,KAAK,EAAE,KAAK,CAACC,EAAGC,KAAOD,EAAE,YAAc,IAAMC,EAAE,YAAc,EAAE,EAEpFC,GAA2BH,GAAkBA,EAAE,SAAS,MAAMA,EAAE,SAAS,eAAe,KAExFI,GAAyBJ,GAAkBA,EAAE,SAAS,MAAMA,EAAE,SAAS,eAAe,GAErF,SAASK,IAAW,CACzB,IAAMC,EAAMC,EAAY,EAElBC,KAAO,YAAQ,EAEfC,EAAgB,UAAO,EAAK,EAE5B,CAACC,EAAQC,CAAS,EAAU,YAAS,EAAK,EAE1C,aAAU,IAAM,CAChBF,EAAQ,UAAYC,IACtBD,EAAQ,QAAUC,EAEtB,EAAG,CAACA,CAAM,CAAC,EAEX,IAAME,EAAoB,eAAY,IAAM,CAC1CD,EAAU,EAAK,CACjB,EAAG,CAACA,CAAS,CAAC,EAERE,EAAyB,eAC5BH,GAAoB,CACfD,EAAQ,UAAYC,GACtBC,EAAUD,CAAM,CAEpB,EACA,CAACC,CAAS,CACZ,EACMG,EAAkBR,EAAI,SAASH,EAAuB,EAE5D,SACE,SAAc,QAAb,CAAkB,IAAI,MAAM,KAAMO,EAAQ,aAAcG,EACvD,qBAAc,WAAb,CAAqB,IAAI,MAAM,QAAO,GAAC,GAAG,UACzC,oBAACE,GAAA,CAAW,QAAQ,OACjB,SAAAD,GAAmBN,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EACvD,EACF,KACA,QAACQ,GAAA,CAAU,QAAQ,OAAO,MAAM,QAAQ,WAAY,EACjD,SAAAN,MAAU,QAACO,GAAA,CAAgB,QAASL,EAAa,EACpD,GACF,CAEJ,CAEA,SAASK,GAAgB,CAAE,QAAAC,CAAQ,EAA4B,CAC7D,IAAMZ,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EAEfW,EAAcb,EAAI,SAASP,EAAc,EAEzCqB,EAAgBd,EAAI,SAASF,EAAqB,EAElDiB,EAAkBb,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAEnDc,EAAyB,eAAY,IAAM,CAC/C,IAAMC,EAAWF,EAAkB,KAAO,OAAO,KAAKf,EAAI,SAAS,KAAK,EAAE,OAAS,GACnFA,EAAI,WAAW,OAAWiB,CAAQ,CACpC,EAAG,CAACjB,CAAG,CAAC,EAEFkB,EAAyB,eAC5BC,GAAe,CACdP,EAAQ,EACRZ,EAAI,WAAWmB,CAAE,CACnB,EACA,CAACnB,CAAG,CACN,EAEM,CAACoB,EAAQC,CAAS,EAAU,YAAwB,IAAI,EAExD,CAACC,EAAWC,CAAY,EAAU,YAAwB,IAAI,EAE9DC,EAAwB,eAAaC,GAAwC,CACjFJ,EAAUI,EAAG,cAAc,EAAE,EAC7BF,EAAaV,EAAY,UAAWa,GAAMA,EAAE,KAAOD,EAAG,cAAc,EAAE,CAAC,EACvEA,EAAG,aAAa,cAAgB,MAClC,EAAG,CAAC,CAAC,EAECE,EAAmB,eACtBF,GAAwC,CACvCA,EAAG,eAAe,EAElB,IAAIH,EAAYT,EAAY,UAAWa,GAAMA,EAAE,KAAOD,EAAG,cAAc,EAAE,EAEnEG,EAAOH,EAAG,cAAc,sBAAsB,EAGpDH,GAFYG,EAAG,QAAUG,EAAK,KAAOA,EAAK,OAEzB,GAAMN,EAAYA,EAAY,EAE/CC,EAAaD,CAAS,CACxB,EACA,CAACF,EAAQP,CAAW,CACtB,EAEMgB,EAAmB,eAAY,IAAM,CACrCT,IAAW,MAAQE,IAAc,MACnCtB,EAAI,SAASoB,EAAQE,CAAS,EAGhCD,EAAU,IAAI,EACdE,EAAa,IAAI,CACnB,EAAG,CAACH,EAAQE,CAAS,CAAC,EAEtB,SACE,sBACE,qBAAc,cAAb,CAAwB,IAAI,MAAM,MAAOR,EAAe,cAAeI,EACrE,SAAAL,EAAY,IAAI,CAACiB,EAAMC,OACtB,SAACC,GAAA,CAEC,YAAaD,IAAMT,GAAaS,IAAM,EACtC,YAAaT,IAAc,MAAQS,IAAMT,EAAY,EAErD,qBAAc,aAAb,CACC,MAAOQ,EAAK,MAAQf,EACpB,MAAOe,EAAK,GAEZ,GAAIA,EAAK,GACT,QAAO,GACP,WAAYH,EACZ,YAAaH,EAEb,OAAQK,EACR,UAAW,GAEX,qBAACI,GAAA,CACC,qBAAC,QAAK,GAAIH,EAAK,GAAK,SAAAA,EAAK,MAAQf,EAAgB,KACjD,QAAc,iBAAb,CACC,oBAACmB,GAAA,CACC,oBAAC,eAAU,EACb,EACF,GACF,GAhBKJ,EAAK,EAiBZ,KACA,QAACK,GAAA,CAAkB,KAAML,EAAM,QAASlB,EAAS,IAzB5CkB,EAAK,EA0BZ,CACD,EACH,KACA,QAACM,GAAA,EAAQ,KACT,QAAc,QAAb,CAAkB,SAAUpB,EAAkB,QAAO,GACpD,qBAACqB,GAAA,CACC,qBAAC,QACC,oBAAC,qBAAiB,GAAG,cAAc,EACrC,KACA,QAACH,GAAA,CACC,oBAAC,cAAS,EACZ,GACF,EACF,GACF,CAEJ,CAEA,IAAMF,GAAoBM,EAAO,MAAO,CACtC,SAAU,WACV,QAAS,OACT,oBAAqB,WACrB,aAAc,SACd,OAAQ,EAER,yBAA0B,CACxB,QAAS,CACX,EAEA,+BAAgC,CAC9B,QAAS,CACX,EAEA,SAAU,CACR,YAAa,CACX,KAAM,CACJ,WAAY,CACV,QAAS,GACT,QAAS,QACT,SAAU,WACV,IAAK,EACL,MAAO,OACP,OAAQ,MACR,gBAAiB,YACjB,OAAQ,IACR,cAAe,MACjB,CACF,CACF,EACA,YAAa,CACX,KAAM,CACJ,WAAY,CACV,QAAS,GACT,QAAS,QACT,SAAU,WACV,MAAO,OACP,OAAQ,MACR,IAAK,OACL,gBAAiB,YACjB,OAAQ,IACR,cAAe,MACjB,CACF,CACF,CACF,CACF,CAAC,EAEYL,GAAaK,EAAOD,GAAW,CAC1C,SAAU,GACZ,CAAC,EG9ND,IAAAE,GAA8B,4CAC9BC,GAKO,iCACPC,GAAuB,oBACvBC,GAA0C,sBAR1C,IAAAC,EAAA,6BAsCMC,GAAwBC,GAAkBA,EAAE,SAAS,aACrDC,GAAuBD,GAC3BA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,YAE5CE,GAAa,OAAO,KAAKC,EAAgB,EAEzCC,GAAa,CACjB,YAAkB,OAACC,GAAA,EAAa,EAChC,aAAmB,OAACC,GAAA,EAAc,EAClC,cAAoB,OAACC,GAAA,EAAe,EACpC,cAAoB,OAACC,GAAA,EAAe,CACtC,EAEMC,GAAa,CACjB,aAAmB,OAACC,GAAA,EAAc,EAClC,cAAoB,OAACC,GAAA,EAAe,EACpC,aAAmB,OAACC,GAAA,EAAc,CACpC,EAEMC,GAAc,CAClB,aAAoB,OAAC,uBAAkB,EACvC,cAAqB,OAAC,yBAAoB,EAC1C,WAAkB,OAAC,wBAAmB,EACtC,eAAsB,OAAC,0BAAqB,CAC9C,EAEMC,GAAiBd,GAAmBA,EAAE,SAAS,WAAa,OAAS,QAErEe,GAAoBf,GAAkBA,EAAE,SAAS,kBAEjDgB,GAAmBhB,GAAkB,CACzC,GAAM,CAAE,WAAAiB,EAAY,cAAeC,CAAO,EAAIlB,EAAE,SAChD,OAAQiB,OACD,SAAU,CACb,IAAME,EAAOnB,EAAE,SAAS,MAAMkB,GAC1BE,EAAU,GACVC,EAAW,GACf,QAAWC,KAAMtB,EAAE,SAAS,WAAWkB,GAAQ,YACzC,SAAUC,EAAK,OAAOG,KAAKF,EAAU,IACrC,UAAWD,EAAK,OAAOG,KAAKD,EAAW,IAE7C,OAAOD,EAAU,OAASC,EAAW,QAAU,EACjD,YAEE,MAAO,uBAGP,MAAO,sBAGP,MAAO,uBAGP,MAAO,oBAGP,MAAO,mBAGP,MAAO,QAIX,MAAO,EACT,EAEaE,GAAkB,QAAK,UAAqB,CACvD,IAAMC,EAAMC,EAAY,EAElBC,KAAO,YAAQ,EAEfC,EAAQH,EAAI,SAASV,EAAa,EAElCc,EAAWJ,EAAI,SAAST,EAAgB,EAExCc,EAAUL,EAAI,SAASR,EAAe,EAEtCc,EAAeN,EAAI,SAASzB,EAAoB,EAEhDgC,EAAcP,EAAI,SAASvB,EAAmB,EAE9C,CAAC+B,EAAgBC,CAAiB,EAAU,YAASH,CAAY,EAEjEI,EAAwB,UAAOJ,CAAY,EAE3C,aAAU,IAAM,CACpB,GAAM,CACJ,SAAU,CAAE,aAAAA,CAAa,EACzB,KAAAX,EACA,YAAAY,CACF,EAAIP,EACAW,EAAc,CAAC,EACnB,GAAIJ,EAAY,QAAU,EACxBI,EAAcL,MACT,CACL,IAAMM,EAAY,IAAI,IAAY,CAAC,CAAC,EACpCZ,EAAI,YACD,IAAKF,GAAOH,EAAK,OAAOG,EAAG,EAC3B,QAASe,GAAU,CAClBnC,GAAW,QAASoC,GAAQ,CAC1B,GAAI,CAAAF,EAAU,IAAIE,CAAG,EACrB,GAAIH,EAAYG,KAAS,OAEvBH,EAAYG,GAAOD,EAAM,MAAMC,OAC1B,CACL,GAAIH,EAAYG,KAASD,EAAM,MAAMC,GAAM,OAE3CH,EAAYG,GAAOD,EAAM,MAAMC,GAC/BF,EAAU,IAAIE,CAAG,CACnB,CACF,CAAC,CACH,CAAC,CACL,CAGI,KAAK,UAAUH,CAAW,IAAM,KAAK,UAAUD,EAAgB,OAAO,IACxEA,EAAgB,QAAUC,EAC1BF,EAAkBE,CAAW,EAEjC,EAAG,CAACL,EAAcC,CAAW,CAAC,EAE9B,IAAMQ,EAA6B,eAAaC,GAAqB,CACnEhB,EAAI,WAAW,oBAAqBgB,CAAO,CAC7C,EAAG,CAAC,CAAC,EAECC,EAA2B,eAAaD,GAAqB,CACjEhB,EAAI,MAAM,CAAE,SAAUgB,CAAQ,CAAC,CACjC,EAAG,CAAC,CAAC,EAECE,EAAyB,eAAaC,GAAkB,CAC5DnB,EAAI,MAAM,CAAE,KAAMmB,CAAmB,CAAC,CACxC,EAAG,CAAC,CAAC,EAECC,EAAyB,eAAaD,GAAkB,CAC5DnB,EAAI,MAAM,CAAE,KAAMmB,CAAmB,CAAC,CACxC,EAAG,CAAC,CAAC,EAECE,EAAyB,eAAaF,GAAkB,CAC5DnB,EAAI,MAAM,CAAE,KAAMmB,CAAmB,CAAC,CACxC,EAAG,CAAC,CAAC,EAECG,EAA8B,eAAaH,GAAkB,CACjEnB,EAAI,MAAM,CAAE,UAAWmB,CAAoB,CAAC,CAC9C,EAAG,CAAC,CAAC,EAECI,EAA6B,eAChCC,GAAkB,CACjBxB,EAAI,YAAYwB,CAAI,CACtB,EACA,CAACxB,CAAG,CACN,EAEA,SACE,QAAc,QAAb,CACC,IAAI,MACJ,aAAcuB,EACd,KAAMnB,EAAW,GAAO,OACxB,MAAO,GAEP,oBAAc,WAAb,CAAqB,QAAO,GAAC,GAAG,YAC/B,oBAACqB,GAAA,CAAW,aAAYvB,EAAK,cAAc,CAAE,GAAI,QAAS,CAAC,EAAG,QAAQ,OACpE,oBAAC,qBAAiB,GAAG,SAAS,KAC9B,QAACwB,GAAA,CACC,MAAO,CACL,MAAOC,GAAQxB,GAAOK,EAAe,MACvC,EAEC,UAAAA,EAAe,aACd,OAACoB,GAAA,CACC,KAAM,GACN,OAAO,OACP,KAAMC,GAAM1B,GAAOK,EAAe,OACpC,EAED5B,GAAW4B,EAAe,OAC7B,GACF,EACF,KACA,QAACsB,GAAA,CAAU,GAAG,gBAAgB,KAAK,SAAS,MAAM,MAAM,WAAY,EAAG,YAAa,EAClF,qBAACC,GAAA,CAAU,QAAQ,OAAO,GAAG,4BAC3B,oBAAC,QACC,mBAAC,qBAAiB,GAAG,mBAAmB,EAC1C,KACA,OAACC,GAAA,CACE,gBAAO,KAAKL,GAAQ,KAAK,EAAE,IAAKM,MAC/B,OAAc,QAAb,CAEC,SAAUC,GACV,QAAO,GACP,GAAI,0BAA0BD,IAE9B,mBAACR,GAAA,CACC,QAAQ,OACR,SAAUjB,EAAe,QAAUyB,EACnC,QAAS,IAAMjC,EAAI,MAAM,CAAE,MAAOiC,CAAoB,CAAC,EACvD,aAAY/B,EAAK,cAAc,CAAE,GAAI+B,CAAM,CAAC,EAE5C,mBAACL,GAAA,CACC,KAAM,GACN,YAAa,IACb,KACEpB,EAAe,SAAWqB,GAAM1B,GAAO8B,GAAuB,cAEhE,OAAQN,GAAQ,MAAMM,GACxB,EACF,GAnBKA,CAoBP,CACD,EACH,GACF,KACA,OAACE,GAAA,CACC,QAAQ,YACR,QAAS,CAAC,CAAC3B,EAAe,SAC1B,gBAAiBS,EACjB,GAAG,iBAEH,mBAAC,qBAAiB,GAAG,kBAAkB,EACzC,KACA,QAACc,GAAA,CAAU,GAAG,2BACZ,oBAAC,qBAAiB,GAAG,kBAAkB,KACvC,OAACK,GAAA,CAAY,IAAI,MAAM,MAAO5B,EAAe,KAAM,cAAeU,EAC/D,gBAAO,OAAOmB,EAAS,EAAE,IAAKJ,MAC7B,OAACK,GAAA,CAEC,SAAUL,IAAUzB,EAAe,KACnC,MAAOyB,EACP,SAAUC,GACV,GAAIK,GACJ,GAAI,kBAAkBN,IACtB,aAAY/B,EAAK,cAAc,CAAE,GAAI+B,CAAM,CAAC,EAE3C,SAAArD,GAAWqD,IARPA,CASP,CACD,EACH,GACF,KACA,QAACF,GAAA,CAAU,GAAG,2BACZ,oBAAC,qBAAiB,GAAG,kBAAkB,KACvC,OAACK,GAAA,CAAY,IAAI,MAAM,MAAO5B,EAAe,KAAM,cAAeY,EAC/D,gBAAO,OAAOoB,EAAS,EAAE,IAAKC,MAC7B,OAACH,GAAA,CAEC,SAAUG,IAAcjC,EAAe,KACvC,MAAOiC,EACP,SAAUP,GACV,GAAIK,GACJ,GAAI,kBAAkBE,IACtB,aAAYvC,EAAK,cAAc,CAAE,GAAIuC,CAAU,CAAC,EAE/C,SAAAxD,GAAWwD,IARPA,CASP,CACD,EACH,GACF,GACEpC,IAAY,QAAUA,IAAY,aAClC,oBACE,oBAACqC,GAAA,EAAQ,KACT,QAACX,GAAA,CAAU,GAAG,2BACZ,oBAAC,qBAAiB,GAAG,kBAAkB,KACvC,OAACK,GAAA,CAAY,IAAI,MAAM,MAAO5B,EAAe,KAAM,cAAea,EAC/D,gBAAO,OAAOsB,EAAS,EAAE,IAAKC,MAC7B,OAACN,GAAA,CAEC,SAAUM,IAAcpC,EAAe,KACvC,MAAOoC,EACP,SAAUV,GACV,GAAIK,GACJ,GAAI,kBAAkBK,IAEtB,mBAACC,GAAA,CAAS,UAAWD,EAAW,cAAE,GAP7BA,CAQP,CACD,EACH,GACF,EACCvC,IAAY,WACX,QAAC0B,GAAA,CAAU,GAAG,4BACZ,oBAAC,qBAAiB,GAAG,mBAAmB,KACxC,OAACK,GAAA,CACC,IAAI,MACJ,MAAO5B,EAAe,UACtB,cAAec,EAEd,gBAAO,OAAOwB,EAAU,EAAE,IAAKb,MAC9B,OAACK,GAAA,CAEC,SAAUL,IAAUzB,EAAe,UACnC,MAAOyB,EACP,SAAUC,GACV,GAAIK,GACJ,GAAI,mBAAmBN,IAEtB,SAAA5C,GAAY4C,IAPRA,CAQP,CACD,EACH,GACF,GAEJ,KAEF,OAACS,GAAA,EAAQ,KACT,OAACP,GAAA,CACC,QAAQ,YACR,QAAS/B,EACT,gBAAiBW,EACjB,GAAG,sBAEH,mBAAC,qBAAiB,GAAG,uBAAuB,EAC9C,GACF,GACF,CAEJ,CAAC,EAEKiB,GAAYe,EAAO,MAAO,CAC9B,QAAS,OACT,oBAAqB,kBACrB,IAAK,CACP,CAAC,EAEYhB,GAAYgB,EAAO,MAAO,CACrC,SAAU,WACV,MAAO,OACP,WAAY,OACZ,OAAQ,OACR,OAAQ,UACR,UAAW,OACX,QAAS,OACT,MAAO,QACP,WAAY,MACZ,WAAY,IACZ,SAAU,KACV,QAAS,aACT,aAAc,EACd,WAAY,OACZ,iBAAkB,OAClB,OAAQ,EACR,QAAS,OACT,IAAK,KACL,cAAe,MACf,WAAY,SACZ,eAAgB,gBAChB,SAAU,CACR,QAAS,CACP,KAAM,CACJ,WAAY,aACZ,QAAS,WACT,WAAY,CACV,WAAY,IACd,CACF,CACF,CACF,CACF,CAAC,EAEKX,GAAcW,EAAoB,0BAAwB,CAC9D,QAAS,OACT,cAAe,MACf,IAAK,IACP,CAAC,EAEKrB,GAAeqB,EAAO,MAAO,CACjC,QAAS,OACT,QAAS,CACP,WAAY,EACZ,QAAS,CACX,CACF,CAAC,EAEKF,GAAWE,EAAO,MAAO,CAC7B,MAAO,GACP,OAAQ,GACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,SAAU,KACV,SAAU,CACR,UAAW,CACT,WAAoB,CAClB,WAAY,cACd,EACA,SAAkB,CAChB,WAAY,WACd,EACA,UAAmB,CACjB,WAAY,SACd,EACA,SAAkB,CAChB,WAAY,gBACd,CACF,CACF,CACF,CAAC,EC7aD,IAAAC,GAA8B,4CAE9BC,GAAiC,sBAFjC,IAAAC,GAAA,6BAUMC,GAAgBC,GAAkBA,EAAE,SAAS,WAAWA,EAAE,SAAS,eAAe,OAAO,KAElFC,GAAW,UAAoB,CAC1C,IAAMC,EAAMC,EAAY,EAElBC,EAAOF,EAAI,SAASH,EAAY,EAEtC,SACE,SAAc,QAAb,CAAkB,IAAI,MACrB,qBAAc,WAAb,CAAqB,IAAI,MAAM,QAAO,GAAC,GAAG,UACzC,qBAACM,GAAA,CAAqB,cAAeH,EAAI,UAAW,QAAQ,OACzD,eAAK,MAAME,EAAO,GAAG,EAAE,KAC1B,EACF,KACA,SAACE,GAAA,CAAU,MAAM,MACf,qBAACC,GAAA,CAAO,SAAUC,GAAc,QAASN,EAAI,OAAQ,IAAI,KAAK,GAAG,kBAC/D,oBAAC,qBAAiB,GAAG,UAAU,EACjC,KACA,QAACK,GAAA,CAAO,SAAUC,GAAc,QAASN,EAAI,QAAS,IAAI,UAAK,GAAG,mBAChE,oBAAC,qBAAiB,GAAG,WAAW,EAClC,KACA,SAACK,GAAA,CAAO,SAAUC,GAAc,QAASN,EAAI,UAAW,IAAI,UAAK,GAAG,uBAClE,qBAAC,qBAAiB,GAAG,UAAU,EAAE,SACnC,KACA,QAACK,GAAA,CAAO,SAAUC,GAAc,QAASN,EAAI,UAAW,IAAI,UAAK,GAAG,iBAClE,oBAAC,qBAAiB,GAAG,cAAc,EACrC,KACA,QAACK,GAAA,CACC,SAAUC,GACV,QAASN,EAAI,gBACb,IAAI,UACJ,GAAG,uBAEH,oBAAC,qBAAiB,GAAG,oBAAoB,EAC3C,GACF,GACF,CAEJ,EAEMG,GAAuBI,EAAOC,GAAY,CAC9C,SAAU,EACZ,CAAC,EjBpDD,IAAAC,GAAA,6BAsBO,SAASC,GAAU,CACxB,SAAAC,EACA,UAAAC,EACA,SAAAC,EACA,WAAAC,EACA,SAAAC,EACA,oBAAAC,CACF,EAAkB,CAChB,IAAMC,EAAMC,EAAY,EAClBC,KAAO,YAAQ,EAErB,SACE,SAACC,GAAA,CACG,WAAAP,GAAYD,OACZ,SAACS,GAAA,CAAM,KAAK,OAAO,GAAG,eACnB,UAAAR,MAAY,QAACS,GAAA,CAAK,SAAUX,EAAU,EACtCK,MAAuB,QAACO,GAAA,EAAgB,EACxCX,MAAa,QAACY,GAAA,EAAS,GAC1B,KAEF,QAACC,GAAA,EAAa,GACZX,GAAcC,OACd,SAACM,GAAA,CAAM,KAAK,QACT,UAAAJ,EAAI,YACH,QAACS,GAAA,CAAc,qBAAS,KAExB,sBACE,qBAACC,GAAA,CACC,IAAK,KACL,MAAOR,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EACxC,QAASF,EAAI,KACb,GAAG,mBACH,aAAYE,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAE7C,oBAACS,GAAA,EAAS,EACZ,KACA,QAACD,GAAA,CACC,IAAK,WACL,MAAOR,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EACxC,QAASF,EAAI,KACb,GAAG,mBACH,aAAYE,EAAK,cAAc,CAAE,GAAI,MAAO,CAAC,EAE7C,oBAACS,GAAA,CAAS,eAAc,GAAC,EAC3B,GACF,EAEDb,MAAY,QAACc,GAAA,EAAS,EACtBf,GAAc,CAACH,MAAY,QAACmB,GAAA,EAAU,GACzC,GAEJ,CAEJ,CAEA,IAAMV,GAAiBW,EAAO,MAAO,CACnC,MAAO,OACP,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,EACP,QAAS,OACT,cAAe,MACf,cAAe,OACf,QAAS,CACP,cAAe,KACjB,CACF,CAAC,EAEKN,GAAeM,EAAO,MAAO,CACjC,SAAU,EACV,cAAe,MACjB,CAAC,EAEKL,GAAgBK,EAAO,MAAO,CAClC,MAAO,OACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,MACZ,SAAU,KACV,YAAa,KACb,aAAc,KACd,WAAY,OACZ,iBAAkB,MACpB,CAAC,EAEYC,GAAiB,QAAKtB,EAAS,EkB7G5C,IAAAuB,GAAiC,oBAE1B,SAASC,GAAUC,EAAgC,CACxD,GAAAC,QAAM,UAAU,IAAM,CACpB,IAAIC,EAAa,GACbC,EAAiB,GAEfC,EAAMJ,EAAI,QAChB,GAAI,CAACI,EAAK,OAEV,IAAMC,EAAaC,GAAqB,CAClCA,EAAE,MAAQ,KAAO,CAACH,IACpBA,EAAiB,GAEbD,EACFE,EAAI,aAAa,QAAS,6BAA6B,EAEvDA,EAAI,aAAa,QAAS,yBAAyB,EAGzD,EAEMG,EAAWD,GAAqB,CAChCA,EAAE,MAAQ,MACZH,EAAiB,GACjBC,EAAI,aAAa,QAAS,iBAAiB,EAE/C,EAEMI,EAAiBF,GAAoB,CACzCJ,EAAa,GAGTI,EAAE,SAAW,GACfF,EAAI,aAAa,QAAS,6BAA6B,EAIrDE,EAAE,SAAW,GACXH,GACFC,EAAI,aAAa,QAAS,6BAA6B,CAG7D,EAEMK,EAAc,IAAM,CACxBP,EAAa,GAETC,EACFC,EAAI,aAAa,QAAS,yBAAyB,EAEnDA,EAAI,aAAa,QAAS,iBAAiB,CAE/C,EAEA,OAAAA,EAAI,iBAAiB,UAAWC,CAAS,EACzCD,EAAI,iBAAiB,QAASG,CAAO,EACrCH,EAAI,iBAAiB,cAAeI,CAAa,EACjDJ,EAAI,iBAAiB,YAAaK,CAAW,EAEtC,IAAM,CACXL,EAAI,oBAAoB,UAAWC,CAAS,EAC5CD,EAAI,oBAAoB,QAASG,CAAO,EACxCH,EAAI,oBAAoB,cAAeI,CAAa,EACpDJ,EAAI,oBAAoB,YAAaK,CAAW,CAClD,CACF,EAAG,CAACT,EAAI,OAAO,CAAC,CAClB,CCnEA,IAAAU,GAcO,sBACPC,GAAoB,qBCfpB,IAAAC,GAA8B,sBAI9B,IAAMC,GAAK,kBAEX,SAAsBC,IAA4C,QAAAC,EAAA,sBAChE,SAAO,QAAIF,EAAE,CACf,GAEA,SAAsBG,GAAaC,EAA6B,QAAAF,EAAA,sBAC9D,SAAO,QAAIF,GAAII,CAAI,CACrB,GCZA,IAAAC,GAAqB,yBACrBC,GAAsB,sBACtBC,GAAsC,sBACtCC,GAAwC,8BAIjC,IAAMC,GAAN,KAAkD,CAqDvD,YACEC,EACAC,EACAC,EACAC,EACA,CAtDFC,EAAA,KAAU,UAKVA,EAAA,KAAQ,gBAKRA,EAAA,KAAQ,SAKRA,EAAA,KAAU,UAAU,IAKpBA,EAAA,KAAQ,UAKRA,EAAA,KAAQ,UAA+B,WAKvCA,EAAA,KAAU,QAAsB,CAAC,GAKjCA,EAAA,KAAU,aAKVA,EAAA,KAAgB,YAKhBA,EAAA,KAAO,SAEPA,EAAA,KAAO,WAAW,IAsElBA,EAAA,KAAU,UAAU,CAACC,EAAiBJ,IAAsC,CAC1E,GAAI,KAAK,UAAY,UAEjB,KAAK,WACP,KAAK,UAAU,KAAK,OAAQI,EAAOJ,CAAE,EAGnC,KAAK,QACP,OAAW,OAAI,KAAK,OAAQ,KAAK,MAAM,EAAE,MAAOK,GAAM,QAAQ,MAAMA,CAAC,CAAC,CAE1E,GASAF,EAAA,KAAQ,aAAa,CAACC,EAAiBJ,IAAgB,CACrD,IAAMM,EAAO,KAAK,OACZC,EAAO,SAAM,UAAU,KAAK,OAAQH,CAAY,EAChDI,EAAQ,KAAK,QAAQD,EAAMD,EAAMF,EAAOJ,CAAE,EAChD,OAAI,KAAK,mBACP,KAAK,kBAAkBQ,EAAOR,CAAE,EAElC,KAAK,OAASQ,EACd,KAAK,MAAM,SAAS,KAAK,OAAQ,EAAI,EACjC,KAAK,kBACP,KAAK,iBAAiB,KAAK,OAAQR,CAAE,EAEhC,IACT,GAIAG,EAAA,KAAU,UAAWI,GACZA,GAYTJ,EAAA,KAAU,UAAU,CAACM,EAAcC,EAAeC,EAAkBC,IAAoBH,GAOxFN,EAAA,KAAU,qBAOVA,EAAA,KAAU,oBASVA,EAAA,kBAAa,CAACC,EAAiBJ,KAC7B,KAAK,WAAWI,EAAOJ,CAAE,EACrB,KAAK,SACP,KAAK,QAAQ,KAAK,OAAQI,EAAOJ,CAAE,EAE9B,OAUTG,EAAA,KAAU,eAAe,CAACU,EAAUb,IAAsB,CACxD,IAAMQ,EAAQ,KAAK,QAAQK,EAAO,KAAK,OAAQA,EAAOb,CAAE,EACxD,OAAI,KAAK,mBACP,KAAK,kBAAkBQ,EAAO,SAAS,EAEzC,KAAK,OAASA,EACd,KAAK,MAAM,SAAS,KAAK,OAAQ,EAAI,EACjC,KAAK,kBACP,KAAK,iBAAiB,KAAK,OAAQ,SAAS,EAEvC,IACT,GASAL,EAAA,KAAU,WAAW,CAACW,EAAqBd,EAAKc,EAAQ,MAClD,KAAK,QAAU,KAAK,MAAM,OAAS,IACrC,KAAK,MAAQ,KAAK,MAAM,MAAM,EAAG,KAAK,QAAU,CAAC,GAEnD,KAAK,MAAM,KAAKC,EAAAC,EAAA,GAAKF,GAAL,CAAc,GAAAd,CAAG,EAAC,EAClC,KAAK,QAAU,KAAK,MAAM,OAAS,EACnC,KAAK,WAAWc,EAAQ,MAAOd,CAAE,EAC7B,KAAK,WAAW,KAAK,UAAU,KAAK,OAAQc,EAASd,CAAE,EAC3D,KAAK,QAAQc,EAAQ,MAAOd,CAAE,EACvB,OAiBTG,EAAA,KAAU,WAKVA,EAAA,KAAO,WAKPA,EAAA,KAAO,aAKPA,EAAA,KAAO,aAKPA,EAAA,KAAO,aAKPA,EAAA,KAAO,WAKPA,EAAA,KAAO,kBAKPA,EAAA,KAAO,UAKPA,EAAA,KAAO,UAKPA,EAAA,KAAO,QAAQ,KACT,KAAK,mBACP,KAAK,kBAAkB,KAAK,aAAc,OAAO,EAEnD,KAAK,OAAS,KAAK,aACnB,KAAK,MAAM,SAAS,KAAK,OAAQ,EAAI,EACrC,KAAK,aAAa,EAClB,KAAK,QAAQ,CAAC,EAAG,OAAO,EACpB,KAAK,kBACP,KAAK,iBAAiB,KAAK,OAAQ,OAAO,EAExC,KAAK,SACP,KAAK,QAAQ,KAAK,MAAM,EAEnB,OASTA,EAAA,KAAO,iBAAiB,CAACc,EAAuBC,EAAUD,EAAQ,OAAS,KACzE,KAAK,MAAQA,EACb,KAAK,QAAUC,EACX,KAAK,WACP,KAAK,UAAU,KAAK,MAAM,EAErB,OAMTf,EAAA,KAAO,eAAe,KACpB,KAAK,MAAQ,CAAC,EACd,KAAK,QAAU,GACX,KAAK,gBACP,KAAK,eAAe,KAAK,MAAM,EAE1B,OAMTA,EAAA,KAAO,OAAO,IAAY,CACxB,GAAI,CAAC,KAAK,SAAU,CAClB,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,IAAMW,EAAU,KAAK,MAAM,KAAK,SAChC,KAAK,UACL,KAAK,WAAWA,EAAQ,OAAQ,MAAM,EACtC,KAAK,QAAQA,EAAQ,OAAQ,MAAM,CACrC,CACA,OAAI,KAAK,QAAQ,KAAK,OAAO,KAAK,MAAM,EACjC,IACT,GAKAX,EAAA,KAAO,OAAO,IAAY,CACxB,GAAI,CAAC,KAAK,SAAU,CAClB,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,KAAK,UACL,IAAMW,EAAU,KAAK,MAAM,KAAK,SAChC,KAAK,WAAWA,EAAQ,MAAO,MAAM,EACrC,KAAK,QAAQA,EAAQ,MAAO,MAAM,CACpC,CACA,OAAI,KAAK,QAAQ,KAAK,OAAO,KAAK,MAAM,EACjC,IACT,GAKAX,EAAA,KAAO,cAAc,KACnB,KAAK,UAAYa,EAAA,GAAK,KAAK,QACpB,OAMTb,EAAA,KAAO,cAAc,IAAM,CACzB,KAAK,MAAM,SAAS,KAAK,OAAQ,EAAI,CACvC,GAvUE,KAAK,OAASH,EACd,KAAK,OAASmB,GAASpB,CAAY,EACnC,KAAK,UAAYoB,GAASpB,CAAY,EACtC,KAAK,aAAeoB,GAASpB,CAAY,EACzC,KAAK,SAAQ,GAAAqB,SAAc,IAAM,KAAK,MAAM,EAC5C,KAAK,YAAW,GAAAC,SAAO,KAAK,KAAK,EAEjC,KAAK,MAAQ,IAAI,QAA2CC,GAAY,CACtE,IAAIC,EAA4C,OAE5C,KAAK,QACPA,EAAU,WAGP,OAAI,KAAK,MAAM,EACf,KAAYC,GAAUC,EAAA,sBACrB,GAAID,EAAO,CACT,IAAIjB,EAAOiB,EAEX,GAAIvB,EAAS,CACX,IAAMyB,EAAe,MAAU,OAAY1B,EAAK,UAAU,EAEtD0B,GAAgBA,EAAezB,IACjCM,EAAOL,EAASA,EAAOsB,EAAOzB,EAAc2B,CAAY,EAAI3B,EAE5DwB,EAAU,WAEd,CAEA,MAAU,OAAIvB,EAAK,WAAYC,GAAW,EAAE,EAG5C,IAAM0B,EAAY,KAAK,OAAO,SAAS,cAEvCpB,EAAO,KAAK,QAAQA,CAAI,EAExB,KAAK,OAASY,GAASZ,CAAI,EAC3B,KAAK,UAAYY,GAASZ,CAAI,EAE9B,KAAK,OAAO,SAAS,cAAgBoB,EACrC,KAAK,MAAM,SAAS,KAAK,OAAQ,EAAI,CACvC,MACE,MAAU,OAAI3B,EAAK,WAAYC,GAAW,EAAE,EAE9C,KAAK,QAAU,QACfqB,EAAQC,CAAO,CACjB,EAAC,EACA,MAAOlB,GAAM,QAAQ,MAAMA,CAAC,CAAC,IAGhC,KAAK,QAAU,QACfiB,EAAQC,CAAO,EAEnB,CAAC,EAAE,KAAMA,IACH,KAAK,SAAS,KAAK,QAAQA,CAAO,EAC/BA,EACR,CACH,CA8HO,OAAQ,CACb,KAAK,SAAW,EAClB,CAEO,QAAS,CACd,KAAK,SAAW,EAClB,CA+IA,IAAW,SAAmB,CAC5B,OAAO,KAAK,QAAU,EACxB,CAKA,IAAW,SAAmB,CAC5B,OAAO,KAAK,QAAU,KAAK,MAAM,OAAS,CAC5C,CAKA,IAAW,OAAW,CACpB,OAAO,KAAK,MACd,CAKA,IAAW,QAAiB,CAC1B,OAAO,KAAK,OACd,CAKA,IAAc,UAAc,CAC1B,OAAO,KAAK,SACd,CACF,EC7aA,IAAAK,GAAsB,sBACtBC,GAAoB,qBAKb,SAASC,GAAYC,EAAeC,EAAeC,EAA+B,CACvF,GAAM,CAAE,cAAAC,CAAc,EAAIH,EAEpBI,EAAgBH,EAAI,IAAKI,GAAOL,EAAI,SAASK,CAAE,CAAC,EAEhDC,EAAkBF,EAAc,IAAKG,IAClC,CACL,GAAIA,EAAM,GACV,MAAO,CAAC,GAAGA,EAAM,KAAK,EACtB,OAAQC,EAAK,UAAUD,CAAK,CAC9B,EACD,EAEKE,EAAe,SAAM,gBAAgBH,EAAgB,IAAI,CAAC,CAAE,OAAAI,CAAO,IAAMA,CAAM,CAAC,EAEhFC,EAAOF,EAAa,KAAOA,EAAa,MAAQ,EAChDG,EAAOH,EAAa,KAAOA,EAAa,OAAS,EAEjDI,EAAW,OAAO,YACtBP,EAAgB,IAAI,CAAC,CAAE,GAAAD,EAAI,MAAAS,EAAO,OAAAJ,CAAO,IAChC,CACLL,EACA,CACE,KAAMS,EACN,KAAM,CACJ,QAAiB,CAACA,EAAM,GAAIL,EAAa,IAAI,EAC7C,mBAA4B,CAACK,EAAM,GAAIF,EAAOF,EAAO,OAAS,CAAC,EAC/D,WAAoB,CAACI,EAAM,GAAIL,EAAa,KAAOC,EAAO,MAAM,EAChE,SAAkB,CAACD,EAAa,KAAMK,EAAM,EAAE,EAC9C,qBAA8B,CAACH,EAAOD,EAAO,MAAQ,EAAGI,EAAM,EAAE,EAChE,UAAmB,CAACL,EAAa,KAAOC,EAAO,MAAOI,EAAM,EAAE,CAChE,EAAEZ,EACJ,CACF,CACD,CACH,EAEM,CAAE,OAAAa,EAAQ,MAAAC,CAAM,EAAIR,EAAK,aAC7BR,EAAI,MACJC,EACCM,GACMM,EAASN,EAAM,IACb,CAAE,MAAOM,EAASN,EAAM,IAAI,IAAK,EADRA,EAGlCJ,EACA,EACF,EAEA,OAAAC,EAAc,QAASG,GAAU,CAC/B,GAAIA,EAAM,eAA4B,CACpC,IAAMU,EAAQ,OAAI,IAAID,EAAMT,EAAM,IAAI,MAAQQ,EAAOR,EAAM,IAAI,KAAM,EAErEA,EAAM,SAAS,QAASF,GAAO,CAC7B,IAAMa,EAAQlB,EAAI,SAASK,CAAE,EAC7BU,EAAOG,EAAM,IAAM,CAAE,MAAOA,EAAM,KAAM,EACxCF,EAAME,EAAM,IAAM,CAAE,MAAO,OAAI,IAAIA,EAAM,MAAOD,CAAK,CAAE,CACzD,CAAC,EAED,OAAOF,EAAOR,EAAM,IACpB,OAAOS,EAAMT,EAAM,GACrB,CACF,CAAC,EAEM,CACL,GAAI,QACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACJ,GAAgB,CACf,OAAQY,CACV,CACF,EACA,WAAY,CACV,CAACZ,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CACf,OAAQa,CACV,CACF,EACA,WAAY,CACV,CAACb,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCjGO,SAASkB,GAAWC,EAAeC,EAA8B,CACtE,MAAO,CACL,GAAI,cACJ,OAAQ,CACN,SAAU,CACR,cAAeD,EAAI,aACrB,CACF,EACA,MAAO,CACL,SAAU,CACR,cAAeC,CACjB,CACF,CACF,CACF,CCjBA,IAAAC,GAAmC,sBCM5B,SAASC,GAAmBC,EAAcC,EAAkB,CANnE,IAAAC,EAOE,IAAIC,EAASH,EACPI,EAAM,IAAI,IAAIH,CAAM,EAE1B,KAAOG,EAAI,IAAID,CAAM,GACnBA,GAASD,EAAA,YAAY,KAAKC,CAAM,IAAvB,MAAAD,EAA2B,GAChCC,EAAO,QAAQ,gBAAkBE,IAAO,CAACA,EAAI,GAAG,SAAS,CAAC,EAC1D,GAAGF,MAGT,OAAOA,CACT,CCdO,SAASG,GAAqBC,EAAkBC,EAAeC,EAAgB,CACpF,IAAMC,EAAsB,CAC1B,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAqB,CACzB,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAgC,CAAC,EACjCC,EAAa,IAAI,IACjBC,EAAiB,IAAI,IAI3BN,EACG,OAAQO,GAAO,CAACC,EAAK,SAAST,EAAMQ,EAAIN,CAAM,EAAE,QAAQ,EACxD,QAASM,GAAO,CACfF,EAAW,IAAIE,CAAE,EACjB,IAAME,EAAQD,EAAK,SAAST,EAAMQ,EAAIN,CAAM,EAC5CC,EAAO,OAAOK,GAAME,EACpBN,EAAM,OAAOI,GAAM,OAIfE,EAAM,WAAa,QACrBA,EAAM,SAAS,QAASC,GAAY,CAClCL,EAAW,IAAIK,CAAO,EACtB,IAAMC,EAAQH,EAAK,SAAST,EAAMW,EAAST,CAAM,EACjDC,EAAO,OAAOQ,GAAWC,EACzBR,EAAM,OAAOO,GAAW,MAC1B,CAAC,EAGCD,EAAM,WAAaR,GACrBG,EAAgB,KAAKI,EAAK,SAAST,EAAMU,EAAM,SAAUR,CAAM,CAAC,EAG9DQ,EAAM,SACRH,EAAe,IAAIG,EAAM,OAAO,CAEpC,CAAC,EAEHL,EAAgB,QAASQ,GAAW,CAhDtC,IAAAC,EAiDQb,EAAI,SAASY,EAAO,EAAE,IAC1BP,EAAW,IAAIO,EAAO,EAAE,EACxBV,EAAO,OAAOU,EAAO,IAAM,CAAE,SAAUA,EAAO,QAAS,EACvDT,EAAM,OAAOS,EAAO,IAAM,CAAE,SAAUA,EAAO,SAAS,OAAQL,GAAO,CAACP,EAAI,SAASO,CAAE,CAAC,CAAE,IACpFM,EAAAV,EAAM,OAAOS,EAAO,MAApB,YAAAC,EAAyB,SAAU,UAAW,IAChDV,EAAM,OAAOS,EAAO,IAAM,OAC1BV,EAAO,OAAOU,EAAO,IAAMJ,EAAK,SAAST,EAAMa,EAAO,GAAIX,CAAM,GAEpE,CAAC,EAID,IAAMa,EAAON,EAAK,QAAQT,EAAME,CAAM,EAGtC,cAAO,OAAOa,EAAK,QAAQ,EACxB,OAAQC,GAAYV,EAAW,IAAIU,EAAQ,MAAM,GAAKV,EAAW,IAAIU,EAAQ,IAAI,CAAC,EAClF,QAASA,GAAY,CACpB,QAAWR,IAAM,CAACQ,EAAQ,KAAMA,EAAQ,MAAM,EAE5C,GAAIZ,EAAM,OAAOI,KAAQ,OAAW,CAElCL,EAAO,SAASa,EAAQ,IAAMA,EAC9BZ,EAAM,SAASY,EAAQ,IAAM,OAG7B,IAAMN,EAAQK,EAAK,OAAOP,GAGtBE,GAASA,EAAM,SACjB,OAAO,OAAOA,EAAM,OAAO,EACxB,OAAQO,GAAWA,EAAO,YAAcD,EAAQ,EAAE,EAClD,QAASC,GAAW,CAjFnC,IAAAH,EAAAI,EAAAC,EAAAC,EAAAC,EAAAC,EAmFgBnB,EAAO,OAAOK,GAAMe,EAAAC,EAAA,GACfrB,EAAO,OAAOK,IADC,CAElB,QAASe,EAAAC,EAAA,IACJV,EAAAX,EAAO,OAAOK,KAAd,YAAAM,EAAmB,SADf,CAEP,CAACG,EAAO,IAAKM,EAAAC,EAAA,IACRL,GAAAD,EAAAf,EAAO,OAAOK,KAAd,YAAAU,EAAmB,UAAnB,YAAAC,EAA6BF,EAAO,KAD5B,CAEX,UAAWD,EAAQ,EACrB,EACF,EACF,GAIKV,EAAW,IAAIE,CAAE,IACpBJ,EAAM,OAAOI,GAAMe,EAAAC,EAAA,GACdpB,EAAM,OAAOI,IADC,CAEjB,QAASe,EAAAC,EAAA,IACJJ,EAAAhB,EAAM,OAAOI,KAAb,YAAAY,EAAkB,SADd,CAEP,CAACH,EAAO,IAAKM,EAAAC,EAAA,IACRF,GAAAD,EAAAjB,EAAM,OAAOI,KAAb,YAAAa,EAAkB,UAAlB,YAAAC,EAA4BL,EAAO,KAD3B,CAEX,UAAW,MACb,EACF,EACF,GAEJ,CAAC,CAEP,CAEJ,CAAC,EAGH,OAAO,OAAOjB,EAAK,SAAS,KAAK,EAC9B,QAASe,GAAS,OAAO,OAAOA,EAAK,MAAM,CAAC,EAC5C,QAASL,GAAU,CACd,YAAaA,GAASA,EAAM,SAAW,CAACJ,EAAW,IAAII,EAAM,EAAE,GACjEH,EAAe,OAAOG,EAAM,OAAO,CAEvC,CAAC,EAEI,CAAE,OAAAP,EAAQ,MAAAC,EAAO,eAAgB,MAAM,KAAKG,CAAc,CAAE,CACrE,CFvHO,SAASkB,GACdC,EACAC,EACAC,EAAS,SAAM,SAAS,EACxBC,EAAW,OACG,CACd,GAAM,CAAE,cAAAC,CAAc,EAAIJ,EAEpBK,EAAQ,OAAO,OAAOL,EAAI,MAAM,SAAS,KAAK,EAAE,KACpD,CAACM,EAAGC,IAAG,CAdX,IAAAC,EAAAC,EAce,QAAAD,EAAAF,EAAE,aAAF,KAAAE,EAAgB,KAAMC,EAAAF,EAAE,aAAF,KAAAE,EAAgB,GACnD,EAEMC,EAAUL,EAAMA,EAAM,OAAS,GAE/BM,EAAiBD,GAAA,MAAAA,EAAS,YAAaA,GAAA,YAAAA,EAAS,YAAa,EAAI,EAEjEE,EAAe,CACnB,GAAIV,EACJ,KAAMW,GACJV,EACAE,EAAM,IAAK,GAAG,CAzBpB,IAAAG,EAyBuB,OAAAA,EAAA,EAAE,OAAF,KAAAA,EAAU,GAAE,CAC/B,EACA,WAAYG,EACZ,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMG,EAAyB,CAC7B,GAAIZ,EACJ,YAAa,CAAC,EACd,OAAQ,CAAE,MAAOD,EAAQ,KAAM,CAAE,EACjC,UAAW,OACX,UAAW,OACX,UAAW,OACX,UAAW,MACb,EAEA,MAAO,CACL,GAAI,cACJ,OAAQ,CACN,SAAU,CACR,cAAAG,CACF,EACA,SAAU,CACR,MAAO,CACL,CAACF,GAAS,MACZ,EACA,WAAY,CACV,CAACA,GAAS,MACZ,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,cAAeU,EAAK,EACtB,EACA,SAAU,CACR,MAAO,CACL,CAACV,GAASU,CACZ,EACA,WAAY,CACV,CAACV,GAASY,CACZ,CACF,CACF,CACF,CACF,CGpEO,SAASC,GACdC,EACAC,EACAC,EAAwB,CAAC,EACX,CACd,GAAM,CAAE,cAAAC,CAAc,EAAIH,EAEpBI,EAA2D,CAAC,EAC5DC,EAA0D,CAAC,EAEjEJ,EAAO,QAASK,GAAU,CACxBF,EAAaE,EAAM,IAAM,OACzBD,EAAYC,EAAM,IAAMA,CAC1B,CAAC,EAED,IAAMC,EAA+D,CAAC,EAChEC,EAA8D,CAAC,EAErE,OAAAN,EAAS,QAASO,GAAY,CAC5BF,EAAeE,EAAQ,IAAM,OAC7BD,EAAcC,EAAQ,IAAMA,CAC9B,CAAC,EAEM,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACN,GAAgB,CACf,OAAQC,EACR,SAAUG,CACZ,CACF,EACA,WAAY,CACV,CAACJ,GAAgB,CACf,YAAa,CAAC,GAAGH,EAAI,WAAW,CAClC,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACG,GAAgB,CACf,OAAQE,EACR,SAAUG,CACZ,CACF,EACA,WAAY,CACV,CAACL,GAAgB,CACf,YAAaF,EAAO,IAAKK,GAAUA,EAAM,EAAE,CAC7C,CACF,CACF,CACF,CACF,CACF,CCxDO,SAASI,GAAWC,EAAeC,EAA8B,CACtE,GAAM,CACJ,cAAAC,EACA,SAAU,CAAE,MAAAC,EAAO,WAAAC,CAAW,CAChC,EAAIJ,EAEEK,EAAW,OAAO,OAAOF,CAAK,EAAE,KAAK,CAAC,EAAGG,KAAO,EAAE,YAAc,IAAMA,EAAE,YAAc,EAAE,EAExFC,EAAeF,EAAS,UAAWG,GAASA,EAAK,KAAOP,CAAM,EAEhEQ,EAEJ,OAAIR,IAAWC,EACTK,IAAiBF,EAAS,OAAS,EACrCI,EAAoBJ,EAASA,EAAS,OAAS,GAAG,GAElDI,EAAoBJ,EAASE,EAAe,GAAG,GAGjDE,EAAoBP,EAGf,CACL,GAAI,cACJ,OAAQ,CACN,SAAU,CACR,cAAeD,CACjB,EACA,SAAU,CACR,MAAO,CACL,CAACA,GAASS,EAAA,GAAKP,EAAMF,GACvB,EACA,WAAY,CACV,CAACA,GAASS,EAAA,GAAKN,EAAWH,GAC5B,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,cAAeQ,CACjB,EACA,SAAU,CACR,MAAO,CACL,CAACR,GAAS,MACZ,EACA,WAAY,CACV,CAACA,GAAS,MACZ,CACF,CACF,CACF,CACF,CClDA,IAAMU,GAA2B,CAACC,EAAkBC,IAA0B,CAC5E,IAAMC,EAAmDC,EAAA,GAAKH,GAC9D,OAAAC,EAAY,QAASG,GAAQF,EAAYE,GAAM,MAAU,EAClDF,CACT,EAEO,SAASG,GACdC,EACAC,EACAC,EAASF,EAAI,cACC,CACd,GAAM,CACJ,UAAAG,EACA,YAAAC,EACA,SAAU,CAAE,OAAQC,CAAa,CACnC,EAAIL,EACE,CAAE,OAAAM,EAAQ,MAAAC,EAAO,eAAAC,CAAe,EAAIC,GAAqBT,EAAI,MAAOC,EAAKC,CAAM,EAC/EN,EAAcH,GAAyBY,EAAcG,CAAc,EAEzE,MAAO,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,OAAQH,EACR,MAAO,CACL,CAACH,GAASI,CACZ,EACA,WAAY,CACV,CAACJ,GAAS,CAAE,YAAa,CAAC,GAAGF,EAAI,WAAW,CAAE,CAChD,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,OAAQJ,EACR,MAAO,CACL,CAACM,GAASK,CACZ,EACA,WAAY,CACV,CAACL,GAAS,CACR,YAAaE,EAAY,OAAQN,GAAO,CAACG,EAAI,SAASH,CAAE,CAAC,EACzD,UACEK,EAAU,WAAaF,EAAI,SAASE,EAAU,SAAS,EACnD,OACAA,EAAU,SAClB,CACF,CACF,CACF,CACF,CACF,CCtDA,IAAAO,GAAsB,sBACtBC,GAAgB,wBAKT,SAASC,GAAiBC,EAAeC,EAAeC,EAAoC,CACjG,GAAM,CAAE,cAAAC,CAAc,EAAIH,EAEpBI,EAAgBH,EAAI,IAAKI,GAAOL,EAAI,SAASK,CAAE,CAAC,EAEhDC,EAAW,OAAO,YAAYC,GAAiBH,EAAeF,CAAI,EAAE,IAAKM,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EAEzF,CAAE,OAAAC,EAAQ,MAAAC,CAAM,EAAIC,EAAK,aAC7BX,EAAI,MACJC,EAAI,OAAQI,GAAOC,EAASD,KAAQ,MAAS,EAC5CO,GAAO,CAhBZ,IAAAC,EAgBgB,OAAE,OAAOA,EAAAP,EAASM,EAAM,MAAf,YAAAC,EAAoB,IAAK,GAC9CV,CACF,EAEA,OAAAC,EAAc,QAASQ,GAAU,CAC/B,GAAIA,EAAM,eAA4B,CACpC,IAAME,EAAQ,GAAAC,QAAI,IAAIL,EAAME,EAAM,IAAI,MAAQH,EAAOG,EAAM,IAAI,KAAM,EAErEA,EAAM,SAAS,QAASP,GAAO,CAC7B,IAAMW,EAAQhB,EAAI,SAASK,CAAE,EAC7BI,EAAOO,EAAM,IAAM,CAAE,MAAOA,EAAM,KAAM,EACxCN,EAAMM,EAAM,IAAM,CAAE,MAAO,GAAAD,QAAI,IAAIC,EAAM,MAAOF,CAAK,CAAE,CACzD,CAAC,EAED,OAAOL,EAAOG,EAAM,IACpB,OAAOF,EAAME,EAAM,GACrB,CACF,CAAC,EAEM,CACL,GAAI,aACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACT,GAAgB,CAAE,OAAQM,CAAO,CACpC,EACA,WAAY,CACV,CAACN,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CAAE,OAAQO,CAAM,CACnC,EACA,WAAY,CACV,CAACP,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CAEA,SAASM,GAAiBH,EAA0BF,EAAsB,CACxE,IAAMe,EAAUb,EAAc,IAAKQ,GAAU,CAC3C,IAAMM,EAAQP,EAAK,aAAaC,CAAK,EACrC,MAAO,CACL,GAAIA,EAAM,GACV,MAAO,CAAC,GAAGA,EAAM,KAAK,EACtB,OAAQM,EAAM,UAAUN,CAAK,EAC7B,OAAQM,EAAM,UAAUN,CAAK,CAC/B,CACF,CAAC,EAEKO,EAAMF,EAAQ,OACdG,EAAe,SAAM,gBAAgBH,EAAQ,IAAI,CAAC,CAAE,OAAAI,CAAO,IAAMA,CAAM,CAAC,EAExEC,EAA4D,CAAC,EAEnE,OAAQpB,oBAC0B,CAC9B,IAAMqB,EAAON,EAAQ,OAAO,CAACO,EAAGC,IAAMD,EAAIC,EAAE,OAAO,MAAO,CAAC,EAE3D,GAAIF,EAAOH,EAAa,MAAO,CAC7B,IAAMM,EAAOT,EAAQ,KAAK,CAACO,EAAGG,IAAMH,EAAE,OAAO,KAAOG,EAAE,OAAO,IAAI,EAAE,GAE7DC,EAAQX,EAAQ,KAAK,CAACO,EAAGG,IAAMA,EAAE,OAAO,KAAOH,EAAE,OAAO,IAAI,EAAE,GAE9DK,EAAgBZ,EACnB,OAAQO,GAAMA,IAAME,GAAQF,IAAMI,CAAK,EACvC,KAAK,CAACJ,EAAGG,IAAMH,EAAE,OAAO,GAAKG,EAAE,OAAO,EAAE,EAErCG,GAAQF,EAAM,OAAO,GAAKF,EAAK,OAAO,KAAOP,EAAM,GAEnDY,EAAIL,EAAK,OAAO,GAAKI,EAE3BD,EAAc,QAAQ,CAAC,CAAE,GAAAxB,EAAI,MAAA2B,EAAO,OAAAX,CAAO,EAAGY,IAAM,CAClDX,EAAQ,KAAK,CACX,GAAAjB,EACA,KAAM2B,EACN,KAAM,CAACD,EAAID,EAAOG,EAAIZ,EAAO,MAAQ,EAAGA,EAAO,IAAI,CACrD,CAAC,CACH,CAAC,CACH,KAAO,CACL,IAAMQ,EAAgBZ,EAAQ,KAAK,CAACO,EAAGG,IAAMH,EAAE,OAAO,GAAKG,EAAE,OAAO,EAAE,EAElEI,EAAIX,EAAa,KACfU,GAAQV,EAAa,MAAQG,IAASJ,EAAM,GAElDU,EAAc,QAAQ,CAAC,CAAE,GAAAxB,EAAI,MAAA2B,EAAO,OAAAX,CAAO,IAAM,CAC/CC,EAAQ,KAAK,CAAE,GAAAjB,EAAI,KAAM2B,EAAO,KAAM,CAACD,EAAGV,EAAO,IAAI,CAAE,CAAC,EACxDU,GAAKV,EAAO,MAAQS,CACtB,CAAC,CACH,CACA,KACF,gBAC8B,CAC5B,IAAMP,EAAON,EAAQ,OAAO,CAACO,EAAGC,IAAMD,EAAIC,EAAE,OAAO,OAAQ,CAAC,EAE5D,GAAIF,EAAOH,EAAa,OAAQ,CAC9B,IAAMc,EAAMjB,EAAQ,KAAK,CAACO,EAAGG,IAAMH,EAAE,OAAO,KAAOG,EAAE,OAAO,IAAI,EAAE,GAE5DQ,EAASlB,EAAQ,KAAK,CAACO,EAAGG,IAAMA,EAAE,OAAO,KAAOH,EAAE,OAAO,IAAI,EAAE,GAE/DK,EAAgBZ,EACnB,OAAQO,GAAMA,IAAMU,GAAOV,IAAMW,CAAM,EACvC,KAAK,CAACX,EAAGG,IAAMH,EAAE,OAAO,GAAKG,EAAE,OAAO,EAAE,EAErCG,GAAQK,EAAO,OAAO,GAAKD,EAAI,OAAO,KAAOf,EAAM,GAEnDiB,EAAIF,EAAI,OAAO,GAAKJ,EAE1BD,EAAc,QAAQ,CAAC,CAAE,GAAAxB,EAAI,MAAA2B,EAAO,OAAAX,CAAO,EAAGY,IAAM,CAClDX,EAAQ,KAAK,CACX,GAAAjB,EACA,KAAM2B,EACN,KAAM,CAACX,EAAO,KAAMe,EAAIN,EAAOG,EAAIZ,EAAO,OAAS,CAAC,CACtD,CAAC,CACH,CAAC,CACH,KAAO,CACL,IAAMQ,EAAgBZ,EAAQ,KAAK,CAACO,EAAGG,IAAMH,EAAE,OAAO,GAAKG,EAAE,OAAO,EAAE,EAElES,EAAIhB,EAAa,KACfU,GAAQV,EAAa,OAASG,IAASJ,EAAM,GAEnDU,EAAc,QAAQ,CAAC,CAAE,GAAAxB,EAAI,MAAA2B,EAAO,OAAAX,CAAO,IAAM,CAC/CC,EAAQ,KAAK,CAAE,GAAAjB,EAAI,KAAM2B,EAAO,KAAM,CAACX,EAAO,KAAMe,CAAC,CAAE,CAAC,EACxDA,GAAKf,EAAO,OAASS,CACvB,CAAC,CACH,CAEA,KACF,EAGF,OAAOR,CACT,CC7JA,IAAAe,GAAsB,sBAIf,SAASC,GAAcC,EAAeC,EAA8B,CACzE,GAAM,CACJ,cAAAC,EACA,UAAW,CAAE,OAAAC,CAAO,CACtB,EAAIH,EAEEI,EAAOJ,EAAI,SAAS,MAAMC,GAE1BI,EAAQ,SAAM,SAAS,EAGvBC,EAAsC,OAAO,YAAY,CAC7D,CAACF,EAAK,GAAIC,CAAK,EACf,GAAG,OAAO,KAAKD,EAAK,MAAM,EAAE,IAAKG,GAAO,CAACA,EAAI,SAAM,SAAS,CAAC,CAAC,EAC9D,GAAG,OAAO,KAAKH,EAAK,QAAQ,EAAE,IAAKG,GAAO,CAACA,EAAI,SAAM,SAAS,CAAC,CAAC,CAClE,CAAC,EAEKC,EAAS,OAAO,YACpB,OAAO,QAAQJ,EAAK,MAAM,EAAE,IAAI,CAAC,CAACG,EAAIE,CAAK,IAAM,CAC/CH,EAAYC,GACZG,EAAAC,EAAA,GACK,SAAM,UAAUF,CAAK,GAD1B,CAEE,GAAIH,EAAYC,GAChB,SAAUD,EAAYG,EAAM,SAC9B,EACF,CAAC,CACH,EAEMG,EAAW,OAAO,YACtB,OAAO,QAAQR,EAAK,QAAQ,EAAE,IAAI,CAAC,CAACG,EAAIM,CAAO,IAAM,CACnDP,EAAYC,GACZG,EAAAC,EAAA,GACK,SAAM,UAAUE,CAAO,GAD5B,CAEE,GAAIP,EAAYO,EAAQ,IACxB,OAAQP,EAAYO,EAAQ,QAC5B,KAAMP,EAAYO,EAAQ,KAC5B,EACF,CAAC,CACH,EAGA,OAAO,OAAOT,EAAK,QAAQ,EAAE,QAASS,GAAY,CAChD,IAAMC,EAASR,EAAYO,EAAQ,QAC7BE,EAAcP,EAAOM,GAAS,QAEhCC,GACF,OAAO,OAAOA,CAAW,EAAE,QAASC,GAAW,CACzCA,EAAQ,YAAcH,EAAQ,KAChCG,EAAQ,UAAYV,EAAYO,EAAQ,IAE5C,CAAC,EAGH,IAAMI,EAAOX,EAAYO,EAAQ,MAC3BK,EAAYV,EAAOS,GAAO,QAE5BC,GACF,OAAO,OAAOA,CAAS,EAAE,QAASF,GAAW,CACvCA,EAAQ,YAAcH,EAAQ,KAChCG,EAAQ,UAAYV,EAAYO,EAAQ,IAE5C,CAAC,CAEL,CAAC,EAED,IAAMM,EAAWT,EAAAC,EAAA,GACZP,GADY,CAEf,GAAIE,EAAYF,EAAK,IACrB,KAAMA,EAAK,KAAO,QAClB,OAAAI,EACA,SAAAI,CACF,GAEA,MAAO,CACL,GAAI,iBACJ,OAAQ,CACN,SAAU,CACR,cAAAV,CACF,EACA,SAAU,CACR,MAAO,CACL,CAACG,GAAQ,MACX,EACA,WAAY,CACV,CAACA,GAAQ,MACX,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,cAAeA,CACjB,EACA,SAAU,CACR,MAAO,CACL,CAACA,GAAQc,CACX,EACA,WAAY,CACV,CAACd,GAAQK,EAAAC,EAAA,GACJP,GADI,CAEP,GAAIC,EACJ,YAAa,CAAC,EACd,OAAQM,EAAA,GAAKR,GACb,UAAW,OACX,UAAW,OACX,UAAW,OACX,UAAW,MACb,EACF,CACF,CACF,CACF,CACF,CCnHA,IAAAiB,GAAsB,sBACtBC,GAAoB,qBAKb,SAASC,GAAgBC,EAAeC,EAAeC,EAAgC,CAC5F,GAAM,CAAE,YAAAC,EAAa,cAAAC,EAAe,KAAAC,EAAM,OAAAC,CAAO,EAAIN,EAE/CO,EAAsB,CAC1B,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAqB,CACzB,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAuC,CAAC,EAExCC,EAAoBT,EACvB,IAAKU,GAAOX,EAAI,SAASW,CAAE,CAAC,EAC5B,OAAQC,GAAU,CAACX,EAAI,SAASW,EAAM,QAAQ,CAAC,EAGlDF,EAAkB,QAASE,GAAU,CACnC,IAAMC,EAAe,SAAM,SAAS,EAapC,GAZAN,EAAO,OAAOM,GAAgB,OAE9BL,EAAM,OAAOK,GAAgBC,EAAAC,EAAA,GACxB,SAAM,UAAUH,CAAK,GADG,CAE3B,GAAIC,EACJ,WAAYG,EAAK,mBAAmBhB,EAAI,MAAOY,EAAM,GAAIR,CAAa,CACxE,GAEIQ,EAAM,WACRJ,EAAM,OAAOK,GAAe,SAAW,CAAC,GAGtCD,EAAM,WAAaR,EAAe,CACpC,IAAMa,EAASjB,EAAI,SAASY,EAAM,QAAQ,EAE1CL,EAAO,OAAOU,EAAO,IAAMH,EAAAC,EAAA,GACtBR,EAAO,OAAOU,EAAO,KADC,CAEzB,SAAUA,EAAO,QACnB,GAEAT,EAAM,OAAOS,EAAO,IAAMH,EAAAC,EAAA,GACrBP,EAAM,OAAOS,EAAO,KADC,CAExB,SAAU,CAAC,IAAIT,EAAM,OAAOS,EAAO,KAAOA,GAAQ,SAAWJ,CAAY,CAC3E,EACF,CAEAJ,EAAaG,EAAM,IAAMC,CAC3B,CAAC,EAGDH,EAAkB,QAASE,GAAU,CAC/BA,EAAM,UACRA,EAAM,SAAS,QAASM,GAAY,CA5D1C,IAAAC,EAAAC,EA6DQ,IAAMC,EAAQrB,EAAI,SAASkB,CAAO,EAC5BL,EAAe,SAAM,SAAS,EAC9BS,EAAqBb,EAAaG,EAAM,IAC9CL,EAAO,OAAOM,GAAgB,OAC9BL,EAAM,OAAOK,GAAgBC,EAAAC,EAAA,GACxB,SAAM,UAAUM,CAAK,GADG,CAE3B,GAAIR,EACJ,SAAUS,EACV,WAAYN,EAAK,mBAAmBhB,EAAI,MAAOqB,EAAM,GAAIjB,CAAa,CACxE,GACAK,EAAaS,GAAWL,GACxBO,GAAAD,EAAAX,EAAM,OAAOC,EAAaG,EAAM,OAAhC,YAAAO,EAAsC,WAAtC,MAAAC,EAAgD,KAAKP,EACvD,CAAC,CAEL,CAAC,EAGD,IAAMU,EAAgB,IAAI,IAAI,OAAO,KAAKd,CAAY,CAAC,EAGvD,OAAO,OAAOJ,EAAK,QAAQ,EACxB,OAAQmB,GAAYD,EAAc,IAAIC,EAAQ,MAAM,GAAKD,EAAc,IAAIC,EAAQ,IAAI,CAAC,EACxF,QAASA,GAAY,CACpB,GAAID,EAAc,IAAIC,EAAQ,MAAM,EAClC,GAAID,EAAc,IAAIC,EAAQ,IAAI,EAAG,CAGnC,IAAMC,EAAsB,SAAM,SAAS,EAErCC,EAAoBZ,EAAAC,EAAA,GACrB,SAAM,UAAUS,CAAO,GADF,CAExB,GAAIC,EACJ,OAAQhB,EAAae,EAAQ,QAC7B,KAAMf,EAAae,EAAQ,KAC7B,GAEAjB,EAAO,SAASkB,GAAuB,OACvCjB,EAAM,SAASiB,GAAuBC,EAItC,IAAMC,EAAanB,EAAM,OAAOkB,EAAkB,QAClD,OAAO,OAAOC,EAAY,OAAQ,EAAE,QAASC,GAAW,CAClDA,EAAQ,YAAcJ,EAAQ,KAChCI,EAAQ,UAAYH,EAExB,CAAC,CACH,KAAO,CAGL,IAAME,EAAanB,EAAM,OAAOC,EAAae,EAAQ,SACrD,OAAO,OAAOG,EAAY,OAAQ,EAAE,QAASC,GAAW,CAClDA,EAAQ,YAAcJ,EAAQ,KAChCI,EAAQ,UAAY,OAExB,CAAC,CACH,CAEJ,CAAC,EAIH,IAAMC,EAAe,OAAO,OAAOrB,EAAM,MAAM,EAE/C,GAAIN,EAAO,CACT,IAAM4B,EAAe,SAAM,gBAAgBD,EAAa,IAAKjB,GAAUI,EAAK,UAAUJ,CAAK,CAAC,CAAC,EACvFmB,EAAS,SAAM,gBAAgBD,CAAY,EACjDD,EAAa,QAASjB,GAAU,CAE1B,CAACA,EAAM,QACXA,EAAM,MAAQ,OAAI,IAAIV,EAAO,OAAI,IAAI6B,EAAQnB,EAAM,KAAK,CAAC,EAC3D,CAAC,CACH,KAAO,CACL,IAAMoB,EAAS,CAAC,GAAI,EAAE,EACtBH,EAAa,QAASjB,GAAU,CAE1B,CAACA,EAAM,QACXA,EAAM,MAAQ,OAAI,IAAIA,EAAM,MAAOoB,CAAM,EAC3C,CAAC,CACH,CAGA,OAAAH,EAAa,QAASjB,GAAU,CAC1BA,EAAM,WACRA,EAAM,SAAW,GAErB,CAAC,EAEM,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACR,GAAgBG,CACnB,EACA,WAAY,CACV,CAACH,GAAgB,CAAE,YAAAD,CAAY,CACjC,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACC,GAAgBI,CACnB,EACA,WAAY,CACV,CAACJ,GAAgB,CACf,YAAa,MAAM,KAAKmB,EAAc,OAAO,CAAC,EAAE,IAAKZ,GAAOF,EAAaE,EAAG,CAC9E,CACF,CACF,CACF,CACF,CACF,CC9KA,IAAAsB,GAAsC,sBAM/B,SAASC,GAAWC,EAAeC,EAAeC,EAA8B,CACrF,GAAM,CACJ,YAAAC,EACA,cAAAC,EACA,KAAM,CAAE,OAAAC,CAAO,CACjB,EAAIL,EAEEM,EAAkBL,EAAI,IAAKM,GAAOC,EAAK,UAAUH,EAAOE,EAAG,CAAC,EAE5DE,EAAwBR,EAAI,SAAW,GAAKI,EAAOJ,EAAI,IAAI,OAAS,QAEpES,EAAe,SAAM,gBAAgBJ,CAAe,EAEpD,CAAE,OAAAK,EAAQ,MAAAC,CAAM,EAAIJ,EAAK,aAC7BR,EAAI,MACJC,EACCY,GAAU,CACT,IAAMC,EAAcN,EAAK,UAAUK,CAAK,EAClCE,EAAiBF,EAAM,WAAaT,EAC1C,OAAQF,oBACoB,CACxB,GAAIa,GAAkB,CAACN,EAAuB,CAE5C,IAAMO,EAAcR,EAAK,UAAUH,EAAOQ,EAAM,SAAS,EAQnDI,EAPiB,SAAM,kCAC3BP,EACAA,EACAM,EACA,GACA,EACF,EAC0B,KAAOA,EAAY,KAC7C,OAAOR,EAAK,aAAaK,CAAK,EAAE,UAC9BA,EACAK,EAAAC,EAAA,GAAKL,GAAL,CAAkB,KAAMA,EAAY,KAAOG,EAAI,KAAMH,EAAY,KAAOG,CAAG,GAC3E,CACE,KAAM,kBAAe,QACrB,OAAQ,EACR,OAAQ,EACR,aAAcJ,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CACF,CACF,CAEA,IAAMO,EAAiB,SAAM,kCAC3BV,EACAA,EACAI,EACA,GACA,EACF,EAEA,OAAON,EAAK,aAAaK,CAAK,EAAE,UAAUA,EAAOO,EAAgB,CAC/D,KAAM,kBAAe,QACrB,OAAQ,GACR,OAAQ,EACR,aAAcP,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CAAC,CACH,gBACwB,CACtB,GAAIE,GAAkB,CAACN,EAAuB,CAE5C,IAAMO,EAAcR,EAAK,UAAUH,EAAOQ,EAAM,SAAS,EAQnDQ,EAPiB,SAAM,kCAC3BX,EACAA,EACAM,EACA,GACA,EACF,EAC0B,KAAOA,EAAY,KAC7C,OAAOR,EAAK,aAAaK,CAAK,EAAE,UAC9BA,EACAK,EAAAC,EAAA,GAAKL,GAAL,CAAkB,KAAMA,EAAY,KAAOO,EAAI,KAAMP,EAAY,KAAOO,CAAG,GAC3E,CACE,KAAM,kBAAe,QACrB,OAAQ,EACR,OAAQ,EACR,aAAcR,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CACF,CACF,CACA,IAAMO,EAAiB,SAAM,kCAC3BV,EACAA,EACAI,EACA,GACA,EACF,EAEA,OAAON,EAAK,aAAaK,CAAK,EAAE,UAAUA,EAAOO,EAAgB,CAC/D,KAAM,kBAAe,QACrB,OAAQ,EACR,OAAQ,GACR,aAAcP,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CAAC,CACH,EAEJ,EACAT,EACA,EACF,EAEA,MAAO,CACL,GAAI,OACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CAAE,OAAQO,CAAO,CACpC,EACA,WAAY,CACV,CAACP,GAAgB,CACf,YAAAD,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CAAE,OAAQQ,CAAM,CACnC,EACA,WAAY,CACV,CAACR,GAAgB,CACf,YAAaH,CACf,CACF,CACF,CACF,CACF,CACF,CC5IA,IAAAqB,GAAsB,sBAMf,SAASC,GACdC,EACAC,EACAC,EACAC,EAC0B,CAX5B,IAAAC,EAAAC,EAYE,GAAIJ,EAAI,OAAS,EAAG,OAEpB,IAAMK,EAA2D,CAAC,EAC5DC,EAA0D,CAAC,EAE3DC,EAA+D,CAAC,EAChEC,EAA8D,CAAC,EAE/DC,EAAa,CAAC,GAAGT,CAAG,EACpBU,EAA2B,CAAC,EAC5BC,EAA4B,CAAC,EAC7BC,EAAiC,CAAC,EAGxC,QAAWC,KAAMb,EAAK,CACpB,IAAMc,EAAQf,EAAI,SAASc,CAAE,EAC7B,GAAI,CAAAC,EAAM,SAEV,GAAIA,EAAM,WAAa,OACrBJ,EAAc,KAAKI,CAAK,MACnB,CACL,IAAMC,EAAWD,EAAM,SAAS,OAAQD,GAAO,CAACd,EAAI,SAASc,CAAE,EAAE,QAAQ,EACzED,EAAoB,KAAKE,CAAK,EAC9BL,EAAW,KAAK,GAAGM,CAAQ,EAC3BL,EAAc,KAAK,GAAGK,EAAS,IAAKF,GAAOd,EAAI,SAASc,CAAE,CAAC,EAAE,OAAO,OAAO,CAAC,CAC9E,CACF,CAKA,GAAIH,EAAc,MAAOI,GAAUA,EAAM,WAAaJ,EAAc,GAAG,QAAQ,GAEzEA,EAAc,GAAG,WAAaR,KAG5BC,EAFiBJ,EAAI,SAASW,EAAc,GAAG,QAAQ,EAE1C,WAAb,YAAAP,EAAuB,UAAWM,EAAW,OAG/C,OAMN,IAAMO,EAAkBC,EAAK,YAAYlB,EAAI,MAAOG,CAAM,EAGpDgB,EAAgB,OAAO,YAC3BR,EAAc,IAAKI,GAAU,CAACA,EAAM,GAAIE,EAAgB,QAAQF,CAAK,CAAC,CAAC,CACzE,EAGMK,EAAeT,EAAc,KAAK,CAACU,EAAGC,IAAMH,EAAcE,EAAE,IAAMF,EAAcG,EAAE,GAAG,EAGrFC,EAAgBpB,EAKhBqB,GACJJ,EAAa,OAAQL,GAAUA,EAAM,WAAaZ,CAAM,EAAE,IAAMiB,EAAa,IAC7E,WAGIK,EAAc,SAAM,gBAAgBd,EAAc,IAAKI,GAAUG,EAAK,UAAUH,CAAK,CAAC,CAAC,EAoC7F,IAjCAT,EAAaJ,GAAW,OAExBK,EAAYL,GAAWgB,EAAK,oBAA8B,EAAE,OAAO,CACjE,GAAIhB,EACJ,WAAYsB,EACZ,SAAUD,EACV,MAAO,CAACE,EAAY,KAAMA,EAAY,IAAI,EAC1C,KAAM,CAACA,EAAY,MAAOA,EAAY,MAAM,EAC5C,SAAUL,EAAa,IAAKL,GAAUA,EAAM,EAAE,CAChD,CAAC,EAGDK,EAAa,QAAQ,CAACL,EAAOW,IAAU,CAErC,GAAIX,EAAM,WAAaZ,EAAQ,CAC7B,IAAMwB,EAAc3B,EAAI,SAASe,EAAM,QAAQ,EAC/CF,EAAoB,KAAKc,CAAW,CACtC,CAEArB,EAAaS,EAAM,IAAMa,EAAAC,EAAA,GACpBvB,EAAaS,EAAM,KADC,CAEvB,SAAUA,EAAM,SAChB,WAAYA,EAAM,UACpB,GAEAR,EAAYQ,EAAM,IAAMa,EAAAC,EAAA,GACnBtB,EAAYQ,EAAM,KADC,CAEtB,SAAUb,EACV,WAAYwB,EAAQ,CACtB,EACF,CAAC,EAGMb,EAAoB,OAAS,GAAG,CACrC,IAAME,EAAQF,EAAoB,IAAI,EACtC,GAAI,CAACE,EAAO,MAEZ,IAAMe,KAAgBzB,EAAAC,EAAaS,EAAM,MAAnB,YAAAV,EAAwB,WAAYU,EAAM,UAAW,OACxEgB,GAAYA,GAAW,EAAErB,EAAW,SAASqB,CAAO,GAAKnB,EAAgB,SAASmB,CAAO,EAC5F,EAGID,EAAa,SAAW,GAC1BxB,EAAaS,EAAM,IAAMA,EACzBR,EAAYQ,EAAM,IAAM,OAIpBA,EAAM,WAAaZ,IACrBS,EAAgB,KAAKG,EAAM,EAAE,EAC7BF,EAAoB,KAAKb,EAAI,SAASe,EAAM,QAAQ,CAAC,KAGvDT,EAAaS,EAAM,IAAMa,EAAAC,EAAA,GACpBvB,EAAaS,EAAM,KADC,CAEvB,SAAUA,EAAM,QAClB,GAEAR,EAAYQ,EAAM,IAAMa,EAAAC,EAAA,GACnBtB,EAAYQ,EAAM,KADC,CAEtB,SAAUe,CACZ,GAEJ,CAIA,GAAM,CAAE,SAAAE,CAAS,EAAIhC,EAEfiC,EAAqB,IAAI,IAAIrB,CAAe,EAGlD,OAAAoB,EAAS,QAASE,GAAY,CAC5B,QAAWpB,IAAM,CAACoB,EAAQ,KAAMA,EAAQ,MAAM,EAE5C,GAAID,EAAmB,IAAInB,CAAE,EAAG,CAE9BN,EAAe0B,EAAQ,IAAMA,EAC7BzB,EAAcyB,EAAQ,IAAM,OAG5B,IAAMnB,EAAQf,EAAI,SAASc,CAAE,EAGzBC,EAAM,SACR,OAAO,OAAOA,EAAM,OAAO,EACxB,OAAQoB,GAAWA,EAAO,YAAcD,EAAQ,EAAE,EAClD,QAASC,GAAW,CAxKjC,IAAA/B,EAAAC,EA0KcC,EAAaQ,GAAMc,EAAAC,EAAA,GACdvB,EAAaQ,IADC,CAEjB,QAASc,EAAAC,EAAA,IACJzB,EAAAE,EAAaQ,KAAb,YAAAV,EAAkB,SADd,CAEP,CAAC+B,EAAO,IAAK,CAAE,UAAWD,EAAQ,EAAG,CACvC,EACF,GAIKtB,EAAgB,SAASE,CAAE,IAC9BP,EAAYO,GAAMc,EAAAC,EAAA,GACbtB,EAAYO,IADC,CAEhB,QAASc,EAAAC,EAAA,IACJxB,EAAAE,EAAYO,KAAZ,YAAAT,EAAiB,SADb,CAEP,CAAC8B,EAAO,IAAK,CAAE,UAAW,MAAU,CACtC,EACF,GAEJ,CAAC,CAEP,CAEJ,CAAC,EAEM,CACL,GAAI,QACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAAChC,GAAS,CACR,OAAQG,EACR,SAAUE,CACZ,CACF,EACA,WAAY,CACV,CAACL,GAAS,CACR,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAS,CACR,OAAQI,EACR,SAAUC,CACZ,CACF,EACA,WAAY,CACV,CAACL,GAAS,CACR,YAAa,CAACD,CAAO,CACvB,CACF,CACF,CACF,CACF,CACF,CCpOA,IAAAkC,GAAgC,sBAChCC,GAAoB,qBAKb,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACc,CACd,GAAM,CAAE,KAAAC,CAAK,EAAIL,EAEXM,EAAwC,CAC5C,OAAQ,CACN,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EACA,MAAO,CACL,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,CACF,EAEMC,EAAsC,CAC1C,OAAQ,CACN,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EACA,MAAO,CACL,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,CACF,EAGMC,EAAiB,IAAI,IACrBC,EAAe,IAAI,IAEzBR,EACG,IAAKS,GAAOV,EAAI,SAASU,EAAIP,CAAU,CAAC,EACxC,OAAQQ,GAAU,CAACA,EAAM,QAAQ,EACjC,QAASA,GAAU,CAClBH,EAAe,IAAIG,EAAM,EAAE,EAC3BF,EAAa,IAAIE,CAAK,EAClBA,EAAM,WAAa,QACrBA,EAAM,SAAS,QAASC,GAAY,CAClCJ,EAAe,IAAII,CAAO,EAC1BH,EAAa,IAAIT,EAAI,SAASY,EAAST,CAAU,CAAC,CACpD,CAAC,CAEL,CAAC,EAGH,IAAMU,EAAqBC,EAAK,iBAAiBd,EAAI,MAAOI,CAAQ,EAG9DW,EAAe,MAAM,KAAKN,EAAa,OAAO,CAAC,EAErDM,EAAa,QAAQ,CAACJ,EAAOK,IAAM,CAWjC,GATAV,EAAS,OAAO,OAAOK,EAAM,IAAMA,EACnCL,EAAS,MAAM,OAAOK,EAAM,IAAM,OAGlCJ,EAAO,OAAO,OAAOI,EAAM,IAAM,OACjCJ,EAAO,MAAM,OAAOI,EAAM,IAAMA,EAI5B,CAACH,EAAe,IAAIG,EAAM,QAAQ,IACpCJ,EAAO,MAAM,OAAOI,EAAM,IAAMM,EAAAC,EAAA,GAC3BP,GAD2B,CAE9B,SAAUP,EACV,WAAYS,EAAqBG,CACnC,GAIIL,EAAM,WAAaR,GAAY,CACjC,IAAMgB,EAASnB,EAAI,SAASW,EAAM,SAAUR,CAAU,EACtDG,EAAS,OAAO,OAAOa,EAAO,IAAM,CAClC,SAAUA,EAAO,QACnB,EAEAb,EAAS,MAAM,OAAOa,EAAO,IAAM,CACjC,SAAUA,EAAO,SAAU,OAAQP,GAAYA,IAAYD,EAAM,EAAE,CACrE,CACF,CAEJ,CAAC,EAGD,OAAO,OAAON,EAAK,QAAQ,EACxB,OAAQe,GAAYZ,EAAe,IAAIY,EAAQ,MAAM,GAAKZ,EAAe,IAAIY,EAAQ,IAAI,CAAC,EAC1F,QAASA,GAAY,CAGpBd,EAAS,OAAO,SAASc,EAAQ,IAAMA,EACvCd,EAAS,MAAM,SAASc,EAAQ,IAAM,OAItC,IAAMC,EAAiBrB,EAAI,SAASoB,EAAQ,OAAQjB,CAAU,EAM9D,GAFmBK,EAAe,IAAIY,EAAQ,MAAM,GAAKZ,EAAe,IAAIY,EAAQ,IAAI,EAItFb,EAAO,OAAO,SAASa,EAAQ,IAAM,OACrCb,EAAO,MAAM,SAASa,EAAQ,IAAMA,UAEhCZ,EAAe,IAAIY,EAAQ,MAAM,EAAG,CAGtC,IAAME,EAAYtB,EAAI,SAASoB,EAAQ,OAAQjB,CAAU,EAOnDoB,EANS,OAAO,OAAOF,EAAe,OAAQ,EAAE,KACnDG,GAAWA,EAAO,YAAcJ,EAAQ,EAC3C,EAIwB,GAElBK,EAAclB,EAAO,MAAM,OAAOe,EAAU,IAElDG,EAAY,QAAUR,EAAAC,EAAA,GACjBO,EAAY,SADK,CAEpB,CAACF,GAAWN,EAAAC,EAAA,GACPO,EAAY,QAASF,IADd,CAEV,UAAW,MACb,EACF,EACF,KAAO,CAGL,IAAMD,EAAYtB,EAAI,SAASoB,EAAQ,OAAQjB,CAAU,EACnDqB,EAAS,OAAO,OAAOH,EAAe,OAAQ,EAAE,KACnDG,GAAWA,EAAO,YAAcJ,EAAQ,EAC3C,EAEAd,EAAS,OAAO,OAAOgB,EAAU,IAAM,CACrC,QAAS,CAAE,CAACE,EAAO,IAAK,CAAE,UAAWJ,EAAQ,EAAG,CAAE,CACpD,EAEAd,EAAS,MAAM,OAAOgB,EAAU,IAAM,CACpC,QAAS,CAAE,CAACE,EAAO,IAAK,CAAE,UAAW,MAAU,CAAE,CACnD,CACF,CAEJ,CAAC,EAIH,IAAME,EAAc1B,EAAI,MAAM,SAAS,WAAWI,GAE5CuB,EAAS,SAAM,gBAAgBZ,EAAa,IAAKJ,GAAUG,EAAK,UAAUH,CAAK,CAAC,CAAC,EAEjFiB,EAAOd,EAAK,cAChBZ,EAAe,MAAQA,EAAe,QACjCA,EAAe,MAAQ,KAAOyB,EAAO,OACrCzB,EAAe,OAAS,KAAOyB,EAAO,MAC7C,EAEME,GAAM3B,EAAe,MAAQyB,EAAO,MAAQC,GAAQ,EAAIA,EACxDE,GAAM5B,EAAe,OAASyB,EAAO,OAASC,GAAQ,EAAIA,EAE1DG,EAAQ,OAAI,QAAQ,OAAI,IAAI,CAAC,CAACJ,EAAO,KAAM,CAACA,EAAO,IAAI,EAAG,CAACE,EAAIC,CAAE,CAAC,CAAC,EAEzE,MAAO,CACL,GAAI,eACJ,OAAQ,CACN,SAAU,CACR,cAAe3B,CACjB,EACA,SAAU,CACR,MAAO,CACL,CAACA,GAAaG,EAAS,OACvB,CAACF,GAAWG,EAAO,MACrB,EACA,WAAY,CACV,CAACJ,GAAa,CAAE,YAAaF,CAAI,EACjC,CAACG,GAAW,CACV,YAAasB,EAAY,YACzB,OAAQA,EAAY,MACtB,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,cAAetB,CACjB,EACA,SAAU,CACR,MAAO,CACL,CAACD,GAAaG,EAAS,MACvB,CAACF,GAAWG,EAAO,KACrB,EACA,WAAY,CACV,CAACJ,GAAa,CAAE,YAAa,CAAC,CAAE,EAChC,CAACC,GAAW,CACV,YAAaH,EACb,OAAQ,CACN,KAAA2B,EACA,MAAAG,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CCpNO,SAASC,GAASC,EAAeC,EAAgBC,EAA6B,CACnF,GAAM,CAAE,MAAAC,CAAM,EAAIH,EAAI,SAEhBI,EAAaD,EAAMF,GAEnBI,EAAc,OAAO,OAAOF,CAAK,EAAE,KAAK,CAAC,EAAGG,IAAG,CARvD,IAAAC,EAAAC,EAQ2D,QAAAD,EAAA,EAAE,aAAF,KAAAA,EAAgB,KAAMC,EAAAF,EAAE,aAAF,KAAAE,EAAgB,GAAE,EAE3FC,EAAYJ,EAAY,QAAQD,CAAU,EAE1CM,EAAa,CAAC,GAAGL,CAAW,EAClC,OAAAK,EAAW,OAAOD,EAAW,CAAC,EAC9BC,EAAW,OAAOR,EAAQO,EAAYP,EAAQ,EAAIA,EAAO,EAAGE,CAAU,EAE/D,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,MAAO,OAAO,YACZC,EAAY,IAAKM,GAAc,CAACA,EAAE,GAAI,CAAE,WAAYA,EAAE,UAAW,CAAC,CAAC,CACrE,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,OAAO,YACZD,EAAW,IAAI,CAACC,EAAWC,IAAe,CAACD,EAAE,GAAI,CAAE,WAAAC,CAAW,CAAC,CAAC,CAClE,CACF,CACF,CACF,CACF,CC7BO,SAASC,GAAcC,EAAeC,EAAeC,EAA8B,CACxF,GAAM,CAAE,cAAAC,EAAe,KAAAC,CAAK,EAAIJ,EAG1BK,EAAY,IAAI,IAAIJ,EAAI,IAAKK,GAAON,EAAI,SAASM,CAAE,EAAE,QAAQ,CAAC,EAEhEC,EAGA,CAAE,OAAQ,CAAC,EAAG,MAAO,CAAC,CAAE,EAExBC,EACAC,EACAC,EAGJ,aAAM,KAAKL,EAAU,OAAO,CAAC,EAAE,QAASM,GAAa,CACnD,IAAIC,EAA4B,CAAC,EACjC,GAAID,IAAaP,EAAK,GACpBQ,EAAiB,OAAO,OAAOR,EAAK,MAAM,EAAE,KAAK,CAACS,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,MACjF,CACL,IAAMC,EAASf,EAAI,SAASW,CAAQ,EACpC,GAAI,CAACI,EAAO,SAAU,MAAM,MAAM,wBAAwB,EAE1DH,EAAiBG,EAAO,SACrB,IAAKC,GAAYhB,EAAI,SAASgB,CAAO,CAAC,EACtC,KAAK,CAACH,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,CAC/C,CAEA,IAAMG,EAAiBL,EAAe,IAAKM,GAAUA,EAAM,EAAE,EAEvDC,EAAsBlB,EACzB,OAAQK,GAAOW,EAAe,SAASX,CAAE,CAAC,EAC1C,IAAKA,GAAOW,EAAe,QAAQX,CAAE,CAAC,EACtC,KAAK,CAACO,EAAGC,IAAMD,EAAIC,CAAC,EAEvB,GAAIK,EAAoB,SAAWF,EAAe,OAElD,OAAQf,gBACgB,CAOpB,QAASkB,EAAI,EAAGA,EAAIH,EAAe,OAAQG,IACzC,GAAI,CAAAD,EAAoB,SAASC,CAAC,EAClC,CAAAZ,EAAaY,EACb,MAIFX,EAAkBG,EAAeJ,GAAY,WAG7CE,EAAOD,GAAmBU,EAAoB,OAAS,GAGvDZ,EAASc,EAAK,aACZrB,EAAI,MACJmB,EAAoB,IAAKC,GAAMR,EAAeQ,GAAG,EAAE,EAAE,QAAQ,EAC7D,CAACE,EAAQF,KAAO,CACd,WAAYX,GAAmBW,EAAI,GAAKV,CAC1C,GACAP,CACF,EAEA,KACF,eACuB,CAOrB,QAASiB,EAAIH,EAAe,OAAS,EAAGG,GAAK,EAAGA,IAC9C,GAAI,CAAAD,EAAoB,SAASC,CAAC,EAClC,CAAAZ,EAAaY,EACb,MAIFX,EAAkBG,EAAeJ,GAAY,WAG7CE,EAAO,EAGPH,EAASc,EAAK,aACZrB,EAAI,MACJmB,EAAoB,IAAKC,GAAMR,EAAeQ,GAAG,EAAE,EACnD,CAACE,EAAQF,KAAO,CACd,WAAYX,GAAmBW,EAAI,EACrC,GACAjB,CACF,EAEA,KACF,gBACwB,CAMtB,IAAMoB,EAAmC,CAAC,EAG1C,QAASH,EAAIH,EAAe,OAAS,EAAGG,GAAK,EAAGA,IAE9C,GAAID,EAAoB,SAASC,CAAC,GAChC,QAASI,EAAIJ,EAAGI,GAAK,EAAGA,IAEtB,GAAI,CAACL,EAAoB,SAASK,CAAC,EAAG,CAIpC,IAAMC,EAAgBb,EAAeY,GAAG,WACpCf,EACAC,EAEAc,IAAM,GAIRf,EAAkBgB,EAAgB,EAClCf,EAAOe,EAAgB,GAAKL,EAAII,EAAI,KAIpCf,EAAkBG,EAAeY,EAAI,GAAG,WACxCd,GAAQe,EAAgBhB,IAAoBW,EAAII,EAAI,GACpDf,GAAmBC,GAGrB,QAASgB,EAAI,EAAGA,EAAIN,EAAII,EAAGE,IACzBH,EAASX,EAAeY,EAAIE,EAAI,GAAG,IAAMjB,EAAkBC,EAAOgB,EAGpE,KACF,EAKF,OAAO,OAAOH,CAAQ,EAAE,OAAS,IAEnChB,EAASc,EAAK,aACZrB,EAAI,MACJmB,EAAoB,IAAKC,GAAMR,EAAeQ,GAAG,EAAE,EAClDF,IAAW,CACV,WAAYK,EAASL,EAAM,GAC7B,GACAf,CACF,GAGF,KACF,eACuB,CAMrB,IAAMoB,EAAmC,CAAC,EAG1C,QAASH,EAAI,EAAGA,EAAIH,EAAe,OAAQG,IAEzC,GAAID,EAAoB,SAASC,CAAC,GAEhC,QAASI,EAAIJ,EAAGI,EAAIP,EAAe,OAAQO,IACzC,GAAI,CAACL,EAAoB,SAASK,CAAC,EAAG,CAIpCf,EAAkBG,EAAeY,GAAG,WAEpC,IAAMd,EACJc,IAAMP,EAAe,OAAS,EAC1B,GACCL,EAAeY,EAAI,GAAG,WAAaf,IAAoBe,EAAIJ,EAAI,GAEtE,QAASM,EAAI,EAAGA,EAAIF,EAAIJ,EAAGM,IACzBH,EAASX,EAAeQ,EAAIM,GAAG,IAAMjB,EAAkBC,GAAQgB,EAAI,GAGrE,KACF,EAKF,OAAO,OAAOH,CAAQ,EAAE,OAAS,IAEnChB,EAASc,EAAK,aACZrB,EAAI,MACJmB,EAAoB,IAAKC,GAAMR,EAAeQ,GAAG,EAAE,EAClDF,IAAW,CACV,WAAYK,EAASL,EAAM,GAC7B,GACAf,CACF,GAGF,KACF,EAEJ,CAAC,EAEM,CACL,GAAI,OACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CAAE,OAAQI,EAAO,MAAO,CAC3C,EACA,WAAY,CACV,CAACJ,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CAAE,OAAQI,EAAO,KAAM,CAC1C,EACA,WAAY,CACV,CAACJ,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCjPO,SAAS0B,GAAWC,EAAeC,EAAgBC,EAA4B,CACpF,GAAM,CAAE,KAAAC,CAAK,EAAIH,EAEjB,MAAO,CACL,GAAI,cACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACC,GAAS,CAAE,KAAME,EAAK,IAAK,CAC9B,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACF,GAAS,CAAE,KAAMC,CAAK,CACzB,CACF,CACF,CACF,CACF,CCnBO,SAASE,GAAYC,EAAeC,EAAeC,EAA8B,CACtF,GAAM,CAAE,cAAAC,CAAc,EAAIH,EAEpB,CAAE,OAAAI,EAAQ,MAAAC,CAAM,EAAIC,EAAK,aAC7BN,EAAI,MACJC,EACCM,GAAO,CAVZ,IAAAC,EAAAC,EAUe,OAAAA,GAAAD,EAAAR,EAAI,aAAaO,CAAK,GAAE,4BAAxB,YAAAE,EAAA,KAAAD,EAAoDD,IAC/DL,CACF,EAEA,MAAO,CACL,GAAI,eACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CAAE,OAAQC,CAAO,CACpC,EACA,WAAY,CACV,CAACD,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CAAE,OAAQE,CAAM,CACnC,EACA,WAAY,CACV,CAACF,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCzCA,IAAAS,GAAsB,sBAKtB,IAAMC,GAAM,KAAK,GAAK,EAEf,SAASC,GAAaC,EAAeC,EAAeC,EAAQ,CAACJ,GAAM,EAAwB,CAChG,GAAM,CAAE,cAAAK,CAAc,EAAIH,EAGpBI,EAA2C,CAAC,EAG5CC,EAA0C,CAAC,EAI3CC,EAAiBL,EACpB,QAASM,GAAO,CACf,IAAMC,EAAQR,EAAI,SAASO,CAAE,EAC7B,OAAOC,EAAM,SAAWA,EAAM,SAAS,IAAKC,GAAYT,EAAI,SAASS,CAAO,CAAC,EAAID,CACnF,CAAC,EACA,OAAQA,GAAU,CAACA,EAAM,QAAQ,EAI9BE,EAAS,SAAM,gBACnB,SAAM,gBAAgBJ,EAAe,IAAKE,GAAUG,EAAK,UAAUH,CAAK,CAAC,CAAC,CAC5E,EAGA,OAAAF,EAAe,QAASE,GAAU,CAChC,IAAMI,EAASD,EAAK,wBAAwBH,EAAOG,EAAK,UAAUH,CAAK,EAAGE,EAAQR,CAAK,EACnF,CAACU,IACLR,EAAOI,EAAM,IAAMG,EAAK,eAAeH,EAAOI,CAAM,EACpDP,EAAMG,EAAM,IAAMI,EACpB,CAAC,EAEM,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACT,GAAgB,CAAE,OAAQC,CAAO,CACpC,EACA,WAAY,CACV,CAACD,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CAAE,OAAQE,CAAM,CACnC,EACA,WAAY,CACV,CAACF,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CClEA,IAAAY,GAAsC,sBAM/B,SAASC,GAAcC,EAAeC,EAAeC,EAAiC,CAC3F,GAAM,CAAE,cAAAC,EAAe,YAAAC,CAAY,EAAIJ,EAEjCK,EAAgBJ,EAAI,IAAKK,GAAON,EAAI,SAASM,CAAE,CAAC,EAEhDC,EAAkBF,EAAc,IAAKG,GAAUC,EAAK,UAAUD,CAAK,CAAC,EAEpEE,EAAe,SAAM,gBAAgBH,CAAe,EAEpDI,EAAcV,EACjB,QAASK,GAAO,CACf,IAAME,EAAQR,EAAI,SAASM,CAAE,EAC7B,OAAOE,EAAM,SAAWA,EAAM,SAAWA,EAAM,EACjD,CAAC,EACA,OAAQF,GAAO,CAACN,EAAI,SAASM,CAAE,EAAE,QAAQ,EAEtC,CAAE,OAAAM,EAAQ,MAAAC,CAAM,EAAIJ,EAAK,aAC7BT,EAAI,MACJW,EACCH,GAAU,CACT,IAAMM,EAASL,EAAK,UAAUD,CAAK,EAEnC,OAAQN,oBACuB,CAC3B,IAAMa,EAAYC,EAAAC,EAAA,GACbH,GADa,CAEhB,KAAMJ,EAAa,KACnB,KAAMA,EAAa,KACnB,MAAOA,EAAa,KACtB,GAEA,OAAOD,EAAK,aAAaD,CAAK,EAAE,gBAAgBA,EAAOO,EAAW,CAChE,KAAM,kBAAe,QACrB,OAAQA,EAAU,MAAQD,EAAO,MACjC,OAAQ,EACR,aAAcN,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CAAC,CACH,gBAC2B,CACzB,IAAMO,EAAYC,EAAAC,EAAA,GACbH,GADa,CAEhB,KAAMJ,EAAa,KACnB,KAAMA,EAAa,KACnB,OAAQA,EAAa,MACvB,GAEA,OAAOD,EAAK,aAAaD,CAAK,EAAE,gBAAgBA,EAAOO,EAAW,CAChE,KAAM,kBAAe,QACrB,OAAQ,EACR,OAAQA,EAAU,OAASD,EAAO,OAClC,aAAcN,EACd,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CAAC,CACH,EAEJ,EACAL,CACF,EAEA,OAAAE,EAAc,QAASG,GAAU,CAC3BA,EAAM,iBACR,OAAOI,EAAOJ,EAAM,IACpB,OAAOK,EAAML,EAAM,IAEvB,CAAC,EAEM,CACL,GAAI,UACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACL,GAAgB,CAAE,OAAQS,CAAO,CACpC,EACA,WAAY,CACV,CAACT,GAAgB,CACf,YAAAC,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACD,GAAgB,CAAE,OAAQU,CAAM,CACnC,EACA,WAAY,CACV,CAACV,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCpGA,IAAAiB,GAAoB,qBAKb,SAASC,GACdC,EACAC,EACAC,EACc,CACd,GAAM,CAAE,cAAAC,EAAe,YAAAC,CAAY,EAAIJ,EAEjCK,EAAmBJ,EACtB,QAASK,GAAOC,EAAK,kBAAkBP,EAAI,MAAOM,EAAIH,CAAa,CAAC,EACpE,OAAQG,GAAO,CAACN,EAAI,SAASM,CAAE,EAAE,QAAQ,EAEtCE,EAA+C,CAAC,EAChDC,EAA8C,CAAC,EAErD,OAAAJ,EACG,IAAKC,GAAON,EAAI,SAASM,CAAE,CAAC,EAC5B,OAAQI,GAAU,CAACA,EAAM,QAAQ,EACjC,QAASA,GAAU,CAClBF,EAAaE,EAAM,IAAM,CACvB,MAAOC,EAAA,GACF,OAAO,YACR,OAAO,KAAKT,CAAO,EAAE,IAAKU,GAAQ,CAACA,EAAKF,EAAM,MAAME,EAAgC,CAAC,CACvF,EAEJ,EAEAH,EAAYC,EAAM,IAAM,CACtB,MAAOR,CACT,EAEIQ,EAAM,gBACRF,EAAaE,EAAM,IAAI,MAAQA,EAAM,MACrCD,EAAYC,EAAM,IAAI,MAAQ,OAAI,QAChC,OAAI,IACFA,EAAM,MACN,OAAI,IACFV,EAAI,aAAaU,CAAK,EAAE,UAAUA,CAAK,EACvCV,EAAI,aAAaU,CAAK,EAAE,UAAUG,EAAAF,EAAA,GAC7BD,GAD6B,CAEhC,MAAOC,IAAA,GAAKD,EAAM,OAAUR,EAC9B,EAAc,CAChB,CACF,CACF,EAEJ,CAAC,EAEI,CACL,GAAI,QACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CACf,OAAQK,CACV,CACF,EACA,WAAY,CACV,CAACL,GAAgB,CACf,YAAaC,CACf,CACF,CACF,EACA,SAAU,CACR,aAAcO,EAAA,GAAKX,EAAI,SAAS,aAClC,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACG,GAAgB,CACf,OAAQM,CACV,CACF,EACA,WAAY,CACV,CAACN,GAAgB,CACf,YAAaF,CACf,CACF,CACF,EACA,SAAU,CACR,aAAcC,CAChB,CACF,CACF,CACF,CCrFO,SAASY,GACdC,EACAC,EACAC,EACc,CACd,GAAM,CAAE,cAAAC,EAAe,YAAAC,CAAY,EAAIJ,EAEjCK,EAAkD,OAAO,YAC7DJ,EAAI,IAAKK,GAAI,CAZjB,IAAAC,EAYoB,OACdD,EACA,CACE,YAAa,CACX,CAACJ,IAAeK,EAAAP,EAAI,SAAqBM,CAAE,EAAE,cAA7B,YAAAC,EAA2CL,EAC7D,CACF,CACF,EAAC,CACH,EAEMM,EAAiD,OAAO,YAC5DP,EACG,OAAQK,GAAO,CAACN,EAAI,SAASM,CAAE,EAAE,QAAQ,EACzC,IAAKA,GAAI,CAzBhB,IAAAC,EAyBmB,OACXD,EACA,CACE,YAAa,CACX,CAACJ,IAAeK,EAAAP,EAAI,SAAqBM,CAAE,EAAE,cAA7B,MAAAC,EAA2CL,GACvD,cAEN,CACF,CACF,EAAC,CACL,EAEA,MAAO,CACL,GAAI,qBACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CAAE,OAAQE,CAAa,CAC1C,EACA,WAAY,CACV,CAACF,GAAgB,CACf,YAAAC,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACD,GAAgB,CAAE,OAAQK,CAAY,CACzC,EACA,WAAY,CACV,CAACL,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CC7DO,SAASQ,GAAgBC,EAAeC,EAAeC,EAAmC,CAC/F,GAAM,CAAE,cAAAC,CAAc,EAAIH,EAEpBI,EAAgBH,EACnB,IAAKI,GAAOL,EAAI,SAASK,CAAE,CAAC,EAC5B,OAAQC,GAAWJ,IAAS,WAAa,GAAO,CAACI,EAAM,QAAS,EAE7DC,EAAeH,EAAc,MAAOE,GAAUA,EAAMJ,EAAK,EAEzDM,EAA2C,CAAC,EAC5CC,EAA0C,CAAC,EAEjD,OAAAL,EAAc,QAASE,GAAU,CAC/BE,EAAOF,EAAM,IAAM,CAAE,CAACJ,GAAOI,EAAMJ,EAAM,EACzCO,EAAMH,EAAM,IAAM,CAAE,CAACJ,GAAO,CAACK,CAAa,CAC5C,CAAC,EAEM,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACJ,GAAgB,CACf,OAAQK,CACV,CACF,EACA,WAAY,CACV,CAACL,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgB,CACf,OAAQM,CACV,CACF,EACA,WAAY,CACV,CAACN,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCnDA,IAAAS,GAAoB,qBAKb,SAASC,GAAgBC,EAAeC,EAAeC,EAA+B,CAC3F,GAAM,CAAE,cAAAC,EAAe,YAAAC,CAAY,EAAIJ,EAGvCA,EAAI,aAAa,YAAc,CAAC,GAAGI,CAAW,EAE9C,IAAMC,EAAsB,CAC1B,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAqB,CACzB,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAcN,EACjB,QAASO,GAAO,CACf,IAAMC,EAAQT,EAAI,SAASQ,CAAE,EAC7B,OAAOC,EAAM,SAAWA,EAAM,SAAWA,EAAM,EACjD,CAAC,EACA,OAAQD,GAAO,CAACR,EAAI,SAASQ,CAAE,EAAE,QAAQ,EAEtCE,EAASC,EAAK,aAClBX,EAAI,MACJO,EACCE,IAAW,CACV,MAAO,OAAI,QAAQ,OAAI,IAAIA,EAAM,MAAOP,CAAK,CAAC,CAChD,GACAC,CACF,EAEA,OAAAE,EAAO,OAASK,EAAO,OACvBJ,EAAM,OAASI,EAAO,MAGGC,EAAK,YAAYX,EAAI,MAAOG,CAAa,EAAE,OACjES,GAAYX,EAAI,SAASW,EAAQ,MAAM,GAAK,CAACX,EAAI,SAASW,EAAQ,IAAI,CACzE,EAEiB,QAASA,GAAY,CACpCP,EAAO,SAASO,EAAQ,IAAMA,EAC9BN,EAAM,SAASM,EAAQ,IAAM,OAE7B,QAAWJ,IAAM,CAACI,EAAQ,KAAMA,EAAQ,MAAM,EAAG,CAE/C,IAAMH,EAAQT,EAAI,SAASQ,CAAE,EAEzB,CAACC,EAAM,SAIX,OAAO,OAAOA,EAAM,OAAO,EACxB,OAAQI,GAAWA,EAAO,YAAcD,EAAQ,EAAE,EAClD,QAASC,GAAW,CA3D7B,IAAAC,EAAAC,EA4DUV,EAAO,OAAOG,GAAMQ,EAAAC,EAAA,GACfZ,EAAO,OAAOG,IADC,CAElB,QAASQ,EAAAC,EAAA,IACJH,EAAAT,EAAO,OAAOG,KAAd,YAAAM,EAAmB,SADf,CAEP,CAACD,EAAO,IAAK,CAAE,UAAWD,EAAQ,EAAG,CACvC,EACF,GACAN,EAAM,OAAOE,GAAMQ,EAAAC,EAAA,GACdX,EAAM,OAAOE,IADC,CAEjB,QAASQ,EAAAC,EAAA,IAAKF,EAAAT,EAAM,OAAOE,KAAb,YAAAO,EAAkB,SAAvB,CAAgC,CAACF,EAAO,IAAK,CAAE,UAAW,MAAU,CAAE,EACjF,EACF,CAAC,CACL,CACF,CAAC,EAEM,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACV,GAAgBE,CACnB,EACA,WAAY,CACV,CAACF,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACE,GAAgBG,CACnB,EACA,WAAY,CACV,CAACH,GAAgB,CACf,YAAaF,CACf,CACF,CACF,CACF,CACF,CACF,CCjGO,SAASiB,GACdC,EACAC,EACAC,EACAC,EAC0B,CAC1B,GAAM,CAAE,SAAAC,CAAS,EAAIJ,EAEfK,EAA2D,CAAC,EAC5DC,EAA0D,CAAC,EAE3DC,EAA+D,CAAC,EAChEC,EAA8D,CAAC,EAE/DC,EAAoBR,EACpBS,EAAmBT,EAAY,OAAQU,GAAO,CAACT,EAAY,KAAMU,GAAUA,EAAM,KAAOD,CAAE,CAAC,EAGjG,OAAAT,EACG,OAAQU,GAAU,CAACA,EAAM,QAAQ,EACjC,QAASC,GAAe,CACvB,IAAMC,EAA8B,CAAC,EAC/BC,EAA4B,CAAC,EAGnCV,EAAaQ,EAAW,IAAMA,EAC9BP,EAAYO,EAAW,IAAM,OAG7BA,EAAW,SAAS,QAASF,GAAO,CAClCD,EAAiB,KAAKC,CAAE,EACxB,IAAMC,EAAQZ,EAAI,SAASW,EAAIR,CAAM,EACrCW,EAAiB,KAAKF,CAAK,CAC7B,CAAC,EAGD,IAAMI,EAAqBH,EAAW,WAKhCI,GAFmBC,EAAK,mBAAmBlB,EAAI,MAAOa,EAAW,GAAIV,CAAM,EAEhDa,GAAsBF,EAAiB,OAGnDA,EAAiB,KAAK,CAACK,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAGnE,QAAQ,CAACR,EAAOS,IAAU,CACrChB,EAAaO,EAAM,IAAM,CACvB,SAAUA,EAAM,SAChB,WAAYA,EAAM,UACpB,EAEAN,EAAYM,EAAM,IAAM,CACtB,SAAUT,EACV,WAAYa,EAAqBC,EAAOI,CAC1C,CACF,CAAC,EAGDjB,EACG,OAAQkB,GAAYA,EAAQ,OAAST,EAAW,IAAMS,EAAQ,SAAWT,EAAW,EAAE,EACtF,QAASS,GAAY,CACpB,QAAWX,IAAM,CAACW,EAAQ,KAAMA,EAAQ,MAAM,EAE5C,GAAIhB,EAAYK,KAAQ,OAAW,CAEjCJ,EAAee,EAAQ,IAAMA,EAC7Bd,EAAcc,EAAQ,IAAM,OAG5B,IAAMV,EAAQZ,EAAI,SAASW,EAAIR,CAAM,EAGjCS,EAAM,SACR,OAAO,OAAOA,EAAM,OAAO,EACxB,OAAQW,GAAWA,EAAO,YAAcD,EAAQ,EAAE,EAClD,QAASC,GAAW,CAlFvC,IAAAC,EAAAC,EAoFoBpB,EAAaM,GAAMe,EAAAC,EAAA,GACdtB,EAAaM,IADC,CAEjB,QAASe,EAAAC,EAAA,IACJH,EAAAnB,EAAaM,KAAb,YAAAa,EAAkB,SADd,CAEP,CAACD,EAAO,IAAK,CAAE,UAAWD,EAAQ,EAAG,CACvC,EACF,GAIKP,EAAgB,SAASJ,CAAE,IAC9BL,EAAYK,GAAMe,EAAAC,EAAA,GACbrB,EAAYK,IADC,CAEhB,QAASe,EAAAC,EAAA,IACJF,EAAAnB,EAAYK,KAAZ,YAAAc,EAAiB,SADb,CAEP,CAACF,EAAO,IAAK,CAAE,UAAW,MAAU,CACtC,EACF,GAEJ,CAAC,CAEP,CAEJ,CAAC,CACL,CAAC,EAEI,CACL,GAAI,UACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACpB,GAAS,CACR,OAAQE,EACR,SAAUE,CACZ,CACF,EACA,WAAY,CACV,CAACJ,GAAS,CACR,YAAaM,CACf,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACN,GAAS,CACR,OAAQG,EACR,SAAUC,CACZ,CACF,EACA,WAAY,CACV,CAACJ,GAAS,CACR,YAAaO,CACf,CACF,CACF,CACF,CACF,CACF,CC3IO,SAASkB,GACdC,EACAC,EACAC,EACc,CACd,IAAMC,EAAMF,EAAQ,IAAKG,GAAWA,EAAO,EAAE,EAEvCC,EAASC,EAAK,aAClBN,EAAI,MACJG,EAAI,OAAQI,GAAO,CAACP,EAAI,SAASO,EAAIL,CAAM,EAAE,QAAQ,EACrD,CAACM,EAAQC,IAAMR,EAAQQ,GACvBP,CACF,EAEA,MAAO,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACA,GAAS,CACR,OAAQG,EAAO,MACjB,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACH,GAAS,CACR,OAAQG,EAAO,KACjB,CACF,CACF,CACF,CACF,CACF,CCpCO,SAASK,GACdC,EACAC,EACAC,EACc,CACd,GAAM,CAAE,cAAAC,EAAe,YAAAC,CAAY,EAAIJ,EAEjCK,EAAgBJ,EACnB,IAAKK,GAAON,EAAI,SAAYM,CAAE,CAAC,EAC/B,OAAQC,GAAWL,EAAQ,SAAc,GAAO,CAACK,EAAM,QAAS,EAE7DC,EAA2C,CAAC,EAC5CC,EAA0C,CAAC,EAE3CC,EAAO,OAAO,KAAKR,CAAO,EAEhC,OAAAG,EAAc,QAASE,GAAU,CAC/BC,EAAOD,EAAM,IAAM,OAAO,YAAYG,EAAK,IAAKC,GAAQ,CAACA,EAAKJ,EAAMI,EAAI,CAAC,CAAC,EAC1EF,EAAMF,EAAM,IAAML,CACpB,CAAC,EAEM,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CACf,OAAQK,CACV,CACF,EACA,WAAY,CACV,CAACL,GAAgB,CACf,YAAAC,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACD,GAAgB,CACf,OAAQM,CACV,CACF,EACA,WAAY,CACV,CAACN,GAAgB,CACf,YAAAC,CACF,CACF,CACF,CACF,CACF,CACF,CCvDA,IAAAQ,GAAsB,sBACtBC,GAAoB,qBAKb,SAASC,GACdC,EACAC,EACAC,EAAO,CAAC,EACM,CACd,GAAM,CAAE,cAAAC,CAAc,EAAIH,EACpB,CAAE,MAAAI,EAAO,OAAAC,EAAQ,UAAAC,CAAU,EAAIJ,EAE/BK,EAAOP,EAAI,SAAS,MAAMG,GAE1BK,EAAsB,CAC1B,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEMC,EAAuC,CAAC,EAExCC,EAAqB,CACzB,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAEA,GAAIJ,EAAW,CAEb,QAAWK,KAASV,EAAQ,OAC1BO,EAAO,OAAOG,EAAM,IAAMJ,EAAK,OAAOI,EAAM,IAC5CD,EAAM,OAAOC,EAAM,IAAMA,EAE3B,GAAIV,EAAQ,SACV,QAAWW,KAAWX,EAAQ,SAC5BO,EAAO,SAASI,EAAQ,IAAML,EAAK,SAASK,EAAQ,IACpDF,EAAM,SAASE,EAAQ,IAAMA,EAGjC,GAAIX,EAAQ,OACV,QAAWY,KAASZ,EAAQ,OAC1BQ,EAAYI,EAAM,IAAMA,CAG9B,KAAO,CAGL,IAAMC,EAAsC,CAAC,EAGzCC,EAAYC,EAAK,iBAAiBhB,EAAI,MAAOG,CAAa,EAExDc,EAA4BhB,EAAQ,OACvC,KAAK,CAACiB,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAC1C,IAAKR,GAAU,CACd,IAAMS,EAAa,SAAM,SAAS,EAClC,OAAAN,EAAYH,EAAM,IAAMS,EAGjBC,EAAAC,EAAA,GACF,SAAM,UAAUX,CAAK,GADnB,CAEL,GAAIS,CACN,EACF,CAAC,EAEGG,EAAU,IAAI,IAGpB,KAAON,EAAe,OAAS,GAAG,CAChC,IAAMN,EAAQM,EAAe,MAAM,EAEnC,GAAI,CAACN,EAAO,MAIZ,GAFAY,EAAQ,IAAIZ,EAAM,EAAE,EAEhBA,EAAM,WAAa,gBACrBA,EAAM,SAAWR,EACjBQ,EAAM,WAAaI,QACd,CAILJ,EAAM,SAAWG,EAAYH,EAAM,UAGnC,IAAMa,EAASd,EAAM,OAAOC,EAAM,UAElC,GAAI,CAACa,EAAQ,CACPD,EAAQ,IAAIZ,EAAM,EAAE,IAItBA,EAAM,SAAW,iBAKnBM,EAAe,KAAKN,CAAK,EACzB,QACF,CAGAa,EAAO,SAAU,KAAKb,EAAM,EAAE,CAChC,CAIIA,EAAM,WACRA,EAAM,SAAW,CAAC,GAIpBH,EAAO,OAAOG,EAAM,IAAM,OAG1BD,EAAM,OAAOC,EAAM,IAAMA,CAC3B,CAEA,OAAO,OAAOD,EAAM,MAAM,EAAE,QAASC,GAAU,CAGzCA,EAAO,UAAYA,EAAO,SAAS,SAAW,IAChD,OAAOH,EAAO,OAAOG,EAAO,IAC5B,OAAOD,EAAM,OAAOC,EAAO,IAE/B,CAAC,EAGGV,EAAQ,UACVA,EAAQ,SAAS,QAASW,GAAY,CACpC,IAAMa,EAAe,SAAM,SAAS,EACpCX,EAAYF,EAAQ,IAAMa,EAE1B,IAAMC,EAAOZ,EAAYF,EAAQ,MAC3Be,EAASb,EAAYF,EAAQ,QAKnC,GAAI,CAACc,GAAQ,CAACC,EAAQ,CACpB,GAAIA,EAAQ,CACV,IAAMC,EAAUlB,EAAM,OAAOiB,GAAS,QAClCC,GACF,OAAO,OAAOA,CAAO,EAAE,QAASC,GAAW,CACrCA,EAAQ,YAAcjB,EAAQ,KAChCiB,EAAQ,UAAY,OAExB,CAAC,CAEL,CAEA,GAAIH,EAAM,CACR,IAAME,EAAUlB,EAAM,OAAOgB,GAAO,QAChCE,GACF,OAAO,OAAOA,CAAO,EAAE,QAASC,GAAW,CACrCA,EAAQ,YAAcjB,EAAQ,KAChCiB,EAAQ,UAAY,OAExB,CAAC,CAEL,CAEA,MACF,CAIA,IAAMC,EAAcpB,EAAM,OAAOiB,GAAS,QACtCG,GACF,OAAO,OAAOA,CAAW,EAAE,QAASD,GAAW,CACzCA,EAAQ,YAAcjB,EAAQ,KAChCiB,EAAQ,UAAYJ,EAExB,CAAC,EAGef,EAAM,OAAOgB,GAAO,SAEpC,OAAO,OAAOhB,EAAM,OAAOgB,GAAO,OAAQ,EAAE,QAASG,GAAW,CAC1DA,EAAQ,YAAcjB,EAAQ,KAChCiB,EAAQ,UAAYJ,EAExB,CAAC,EAGH,IAAMM,EAAaV,EAAAC,EAAA,GACd,SAAM,UAAUV,CAAO,GADT,CAEjB,GAAIa,EACJ,KAAAC,EACA,OAAAC,CACF,GAGAnB,EAAO,SAASuB,EAAW,IAAM,OAGjCrB,EAAM,SAASqB,EAAW,IAAMA,CAClC,CAAC,EAKH,IAAMC,EAAe,OAAO,OAAOtB,EAAM,MAAM,EAE/C,GAAIsB,EAAa,OAAS,EACxB,GAAI5B,EAAO,CAET,IAAM6B,EAAe,SAAM,gBACzBD,EAAa,IAAKrB,GAAUK,EAAK,UAAUL,CAAK,CAAC,CACnD,EACMuB,EAAS,SAAM,gBAAgBD,CAAY,EACjDD,EAAa,QAASrB,GAAU,CAC1B,CAACA,EAAM,QACXA,EAAM,MAAQ,OAAI,IAAIP,EAAO,OAAI,IAAI8B,EAAQvB,EAAM,KAAK,CAAC,EAC3D,CAAC,CACH,KAAO,CACL,IAAMsB,EAAe,SAAM,gBAAgBD,EAAa,IAAIhB,EAAK,SAAS,CAAC,EAE3E,GACE,EACE,SAAM,cAAchB,EAAI,SAAUiC,CAAY,GAC9C,SAAM,cAAcjC,EAAI,SAAUiC,CAAY,GAEhD,CACA,IAAMC,EAAS,OAAI,QAAQlC,EAAI,aAAaA,EAAI,WAAW,CAAC,EAEtDmC,EAAiB,SAAM,aAAaF,EAAcC,CAAM,EAExDE,EAAQ,OAAI,IAChB,SAAM,gBAAgBD,CAAc,EACpC,SAAM,gBAAgBF,CAAY,CACpC,EAEAD,EAAa,QAASrB,GAAU,CAC9BA,EAAM,MAAQ,OAAI,QAAQ,OAAI,IAAIA,EAAM,MAAOyB,CAAK,CAAC,CACvD,CAAC,CACH,CACF,CAEF,GAAInC,EAAQ,OACV,QAAWY,KAASZ,EAAQ,OAC1BQ,EAAYI,EAAM,IAAMA,CAG9B,CAEA,IAAMwB,EAAM,SAAS,cAAc,UAAU,EAE7C,cAAO,OAAO3B,EAAM,MAAiC,EAAE,QAASC,GAAU,CACpE,SAAUA,IACZ0B,EAAI,UAAY1B,EAAM,KACtBA,EAAM,KAAO0B,EAAI,OAGf,UAAW1B,IACb0B,EAAI,UAAY1B,EAAM,MACtBA,EAAM,MAAQ0B,EAAI,MAEtB,CAAC,EAEDA,EAAI,OAAO,EAEJ,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAAClC,GAAgBK,CACnB,EACA,WAAY,CACV,CAACL,GAAgB,CAAE,YAAa,CAAC,GAAGH,EAAI,WAAW,CAAE,CACvD,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACG,GAAgBO,CACnB,EACA,OAAQD,EACR,WAAY,CACV,CAACN,GAAgB,CACf,YAAaE,EAAS,OAAO,KAAKK,EAAM,MAAM,EAAI,CAAC,GAAGV,EAAI,WAAW,CACvE,CACF,CACF,CACF,CACF,CACF,CCjSA,IAAAsC,GAAA,GAAAC,GAAAD,GAAA,kBAAAE,GAAA,eAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,mBAAAC,GAAA,YAAAC,GAAA,6BAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,2BAAAC,GAAA,2BAAAC,KCSO,SAASC,GAAQC,EAAmBC,EAAgC,CACzE,GAAM,CAAE,SAAAC,EAAU,SAAAC,CAAS,EAAIH,EACzB,CAAE,QAAAI,EAAU,CAAE,EAAIF,EAElB,WAAYA,IAChBA,EAAS,OAAS,CAAC,GAIrB,IAAMG,EAAgB,IAAI,IAE1B,cAAO,OAAOH,EAAS,KAAK,EAAE,QAASI,GACrC,OAAO,OAAOA,EAAK,MAAM,EAAE,QAASC,GAAU,CAC5C,GAAM,CAAE,SAAAC,EAAU,SAAAC,EAAU,QAAAC,CAAQ,EAAIH,EAEpCG,GACFL,EAAc,IAAIK,CAAO,EAIvBF,IAAaF,EAAK,IAAM,CAACA,EAAK,OAAOE,KACvC,QAAQ,KAAK,4CAA4C,EACzDD,EAAM,SAAWD,EAAK,IAGpBC,EAAM,gBAA8BE,GACtCA,EAAS,QAASE,GAAY,CACvBL,EAAK,OAAOK,KACf,QAAQ,KAAK,6CAA8CJ,EAAM,GAAII,CAAO,EAC5EF,GAAA,MAAAA,EAAU,OAAOA,EAAS,QAAQE,CAAO,EAAG,GAEhD,CAAC,CAIL,CAAC,CACH,EAEA,OAAO,KAAKT,EAAS,MAAM,EAAE,QAASQ,GAAY,CAC3CL,EAAc,IAAIK,CAAO,GAC5B,OAAOR,EAAS,OAAOQ,EAE3B,CAAC,EAEGN,IAAYH,IACVG,EAAU,IACZ,OAAO,OAAOF,EAAS,KAAK,EAAE,QAASI,GAAS,CAC9C,OAAO,OAAOA,EAAK,MAAM,EACtB,OAAQC,GAAUA,EAAM,aAAyB,EACjD,QAASA,GAAWA,EAAoB,MAAM,eAAyB,CAC5E,CAAC,EAICH,GAAW,IACb,OAAO,OAAOF,EAAS,KAAK,EAAE,QAASI,GAAS,CAC9C,OAAO,OAAOA,EAAK,QAAQ,EAAE,QAASM,GAAY,CAChD,OAAO,OAAOA,EAAUA,EAAgB,IAAI,CAC9C,CAAC,EAED,OAAO,OAAON,EAAK,MAAM,EAAE,QAASC,GAAU,CAC5C,OAAO,QAAQA,EAAM,KAAK,EAAE,QAAQ,CAAC,CAACM,EAAIC,CAAK,IAAM,CAC/C,OAAOA,GAAU,WAEnBP,EAAM,MAAMM,GAAMC,EAAM,YAAY,EAExC,CAAC,EAEGP,EAAM,gBACJA,EAAM,aACR,OAAO,QAAQA,EAAM,WAAW,EAAE,QAAQ,CAAC,CAACM,EAAIE,CAAU,IAAM,CACzDA,IAA2B,UAC9BR,EAAM,YAAcS,EAAAC,EAAA,GACfV,EAAM,aADS,CAElB,CAACM,UACH,GAEJ,CAAC,CAGP,CAAC,CACH,CAAC,EAICT,GAAW,OACbF,EAAS,KAAO,gBAGdE,EAAU,KACZF,EAAS,OAAS,CAAC,GAGrB,OAAO,OAAOA,EAAS,KAAK,EAAE,QAASI,GAAS,CAC9C,OAAO,OAAOA,EAAK,MAAM,EAAE,QAASC,GAAU,CACxCH,EAAU,OACRG,EAAM,gBAA8BA,EAAM,kBAC5CA,EAAM,MAAM,SAAW,IAIvBH,EAAU,OAEVG,EAAM,oBACNA,EAAM,mBACNA,EAAM,kBACNA,EAAM,kBAENA,EAAM,MAASA,EAAc,MAAQ,GACrCA,EAAM,WAAa,CAAC,GAAK,EAAG,EAGlC,CAAC,CACH,CAAC,EAEGH,EAAU,OACZD,EAAS,aAAe,UAGtBC,EAAU,OACZD,EAAS,iCAKb,OAAO,OAAOD,EAAS,UAAU,EAAE,QAASgB,GAAc,CACxDA,EAAU,YAAcA,EAAU,YAAY,OAAQL,GAC7CX,EAAS,MAAMgB,EAAU,IAAI,OAAOL,KAAQ,MACpD,EACDK,EAAU,UAAY,OACtBA,EAAU,UAAY,OACtBA,EAAU,UAAY,OACtBA,EAAU,UAAY,MACxB,CAAC,EAGD,OAAO,OAAOhB,EAAS,KAAK,EAAE,QAASI,GAAS,CAC9C,OAAO,OAAOA,EAAK,MAAM,EAAE,QAASC,GAAU,CAlJlD,IAAAY,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAmJM,GAAIvB,EAAM,eAA4B,CACpC,IAAMwB,EAAQxB,EACd,GAAI,CAACwB,EAAM,SAAW,CAACA,EAAM,QAAQ,OAAS,CAACA,EAAM,QAAQ,KAAO,CAACA,EAAM,QAAQ,KAAM,CACvF,IAAMC,GAAoBX,GAAAD,GAAAD,EAAAY,EAAM,UAAN,YAAAZ,EAAe,QAAf,YAAAC,EAAsB,QAAtB,KAAAC,EAA+B,CAAC,EAAG,CAAC,EACxDY,GAAkBT,GAAAD,GAAAD,EAAAS,EAAM,UAAN,YAAAT,EAAe,MAAf,YAAAC,EAAoB,QAApB,KAAAC,EAA6B,CAAC,IAAK,CAAC,EACtDU,GAAmBP,GAAAD,GAAAD,EAAAM,EAAM,UAAN,YAAAN,EAAe,OAAf,YAAAC,EAAqB,QAArB,KAAAC,EAA8B,EACpDK,EAAQ,GAAKC,EAAM,IAAM,GACzBD,EAAQ,GAAKC,EAAM,IAAM,CAC5B,EACAF,EAAM,QAAU,CACd,MAAOd,EAAA,CAAE,GAAI,QAAS,MAAO,EAAG,MAAOe,EAAS,QAAS,KAASJ,EAAAG,EAAM,UAAN,YAAAH,EAAe,OACjF,KAAOX,EAAA,CAAE,GAAI,OAAS,MAAO,EAAG,MAAOiB,IAAYL,EAAAE,EAAM,UAAN,YAAAF,EAAe,MAClE,IAAOZ,EAAA,CAAE,GAAI,MAAS,MAAO,EAAG,MAAOgB,EAAS,QAAS,KAASH,EAAAC,EAAM,UAAN,YAAAD,EAAe,IACnF,CACF,CAEI,OAAOC,EAAM,MAAS,WACxBA,EAAM,KAAO,EAEjB,CACF,CAAC,CACH,CAAC,EAED7B,EAAS,QAAUD,EAEZD,CACT,CC7KA,IAAAmC,GAA8C,6BAE9CC,GAAmD,sBAInD,IAAMC,GAAU,CAAE,KAAM,WAAqB,EAEvCC,GAA0BC,GAAiCC,EAAA,wBAC/D,OACG,MAAOD,EAAuC,gBAAgBF,EAAO,KAAO,YAC5E,MAAOE,EAAuC,kBAAkBF,EAAO,KAAO,SAEnF,GAEA,SAAsBI,IAAiB,QAAAD,EAAA,sBACrC,GAAI,OAAO,QAAW,aAAe,EAAE,cAAe,QAAS,OAC/D,IAAME,EAAa,QAAM,GAAAC,KAAW,qBAAqB,OAAO,SAAS,QAAQ,EACjF,OAAKD,GAAmB,IAE1B,GAEA,SAAsBE,GAAeF,EAAyC,QAAAF,EAAA,sBAC5E,SAAO,GAAAK,KAAS,qBAAqB,OAAO,SAAS,SAAUH,CAAU,CAC3E,GAKA,IAAMI,GAAa,CACjB,cAAe,EACf,aAAc,EACd,eAAgB,CACd,MAAO,CAAE,QAAS,EAAG,WAAY,OAAQ,gBAAiB,CAAE,MAAO,EAAG,MAAO,EAAG,SAAU,CAAE,CAAE,EAC9F,OAAQ,CAAE,QAAS,CAAE,EACrB,SAAU,CAAE,QAAS,CAAE,EACvB,SAAU,CAAE,QAAS,EAAG,EACxB,oBAAqB,CAAE,QAAS,CAAE,EAClC,KAAM,CAAE,QAAS,CAAE,EACnB,MAAO,CAAE,QAAS,EAAG,WAAY,OAAQ,gBAAiB,CAAC,CAAE,EAC7D,kBAAmB,CAAE,QAAS,CAAE,EAChC,QAAS,CAAE,QAAS,CAAE,CACxB,CACF,EAOO,SAASC,GAAuBC,EAA8B,CAlDrE,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAmDE,IAAMC,EAAoB,CAAC,EAG3BA,EAAQ,KAAK,CACX,SAAU,GACV,KAAMP,EAAS,MAAQ,GACvB,KAAM,CAAC,EACP,GAAI,oBACJ,SAAU,WAEV,cAAeA,CACjB,CAAC,EAED,IAAIQ,EAAY,EAChB,QAAWC,KAAU,OAAO,KAAKT,EAAS,KAAK,EAAG,CAChD,IAAMU,EAAOV,EAAS,MAAMS,GACtBE,EAAYX,EAAS,WAAWS,GAChCG,EAAW,IAAIJ,EAAY,IAGjCD,EAAQ,KAAK,CACX,KAAM,CAAC,EACP,GAAI,QAAQE,IACZ,KAAOC,EAAa,MAAQ,QAAQF,EAAY,IAChD,MAAOI,EACP,SAAU,MACZ,CAAC,EAGDL,EAAQ,KAAK,CACX,eAAgB,KAChB,gBAAiB,KACjB,kBAAkBN,EAAAU,GAAA,YAAAA,EAAW,cAAX,KAAAV,EAA0B,CAAC,EAC7C,eAAgB,KAChB,gBAAiB,CAAC,EAClB,gBAAiB,CAAC,EAClB,eAAgB,KAChB,KAAM,CAAC,EACP,GAAI,4BAA4BQ,IAChC,OAAQ,QAAQA,IAChB,SAAU,qBACZ,CAAC,EAGD,IAAMI,GAASX,EAAAQ,EAAK,SAAL,KAAAR,EAAe,CAAC,EAC3BY,EAAW,EACf,QAAWC,KAAW,OAAO,KAAKF,CAAM,EAAG,CACzC,IAAMG,EAASH,EAAeE,GACoBE,EAAAD,EAA1C,OAAAE,EAAO,SAAAC,EAAU,MAAAC,EAAO,KAAAC,CAnGtC,EAmGwDJ,EAATK,EAAAC,GAASN,EAAT,CAAjC,QAAO,WAAU,QAAO,SAChCV,EAAQ,KAAK,CACX,GAAGJ,EAAAe,GAAA,YAAAA,EAAQ,KAAR,KAAAf,EAAc,EACjB,GAAGC,EAAAc,GAAA,YAAAA,EAAQ,KAAR,KAAAd,EAAc,EACjB,SAAUe,GAAA,KAAAA,EAAY,EACtB,UAAWd,EAAAW,EAAc,WAAd,KAAAX,EAA0B,GACrC,SAASC,EAAAc,GAAA,YAAAA,EAAO,UAAP,KAAAd,EAAkB,EAC3B,KAAM,CAAC,EACP,GAAI,SAASS,IACb,SAAU,QAAQN,IAClB,KAAAY,EACA,MAAOG,IAAA,GAAKF,GAASF,GACrB,MAAO,IAAIN,EAAW,IACtB,SAAU,OACZ,CAAC,EACDA,GACF,CAEAN,GACF,CAEA,MAAO,CACL,wBAAyB,EACzB,OAAQV,GACR,QAAAS,CACF,CACF,CAOO,SAASkB,GAAuBC,EAA0B,CApIjE,IAAAzB,EAAAgB,EAqIE,IAAMV,GAAiBN,EAAAyB,EAAQ,UAAR,KAAAzB,EAAmB,CAAC,EAGrC0B,EAAYpB,EAAQ,KAAMqB,GAAWA,EAAE,WAAa,UAAU,EACpE,GAAID,GAAA,MAAAA,EAAW,cACb,OAAOA,EAAU,cAInB,IAAME,EAActB,EAAQ,OAAQqB,GAAWA,EAAE,WAAa,MAAM,EAC9DE,EAAevB,EAAQ,OAAQqB,GAAWA,EAAE,WAAa,OAAO,EAChEG,EAAmBxB,EAAQ,OAAQqB,GAAWA,EAAE,WAAa,qBAAqB,EAElFI,EAA6B,CAAC,EAC9BC,EAAuC,CAAC,EAE9C,QAAWC,KAAML,EAAa,CAE5B,IAAMM,EAAQD,EAAG,GAAG,WAAW,OAAO,EAAIA,EAAG,GAAG,MAAM,CAAC,EAAIA,EAAG,GAGxDE,EAAqC,CAAC,EAC5C,QAAWC,KAAMP,EAAc,CAC7B,IAAMQ,EAAiB,QAAQH,IAC/B,GAAIE,EAAG,WAAaC,GAAkBD,EAAG,WAAaF,EAAO,SAE7D,IAAMI,EAAaF,EAAG,GAAG,WAAW,QAAQ,EAAIA,EAAG,GAAG,MAAM,CAAC,EAAIA,EAAG,GAC9D,CAAE,MAAAG,EAAQ,CAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,SAAAvB,EAAU,KAAAE,CAAK,EAAIgB,EACqCnC,EAAAsC,EAA1E,SAAAG,EAAS,MAAAC,EAAO,IAAAC,EAAK,KAAAC,EAAM,eAAAC,EAAgB,aAAAC,CAjKzD,EAiKwF9C,EAAd+C,EAAA1B,GAAcrB,EAAd,CAA5D,UAAS,QAAO,MAAK,OAAM,iBAAgB,iBAE7CgD,GAA4B1B,EAAA,CAChC,GAAIe,EACJ,KAAAlB,EACA,MAAO,CAACoB,GAAA,KAAAA,EAAK,EAAGC,GAAA,KAAAA,EAAK,CAAC,EACtB,SAAUvB,GAAA,KAAAA,EAAY,EACtB,MAAOK,EAAA,CAAE,QAASmB,GAAA,KAAAA,EAAW,GAAMM,IAChCA,GAIL,GAAI5B,IAAS,QAAS,CACpB,IAAM8B,GAAUP,GAAA,YAAAA,EAAO,KAAM,OAAY,CAACA,EAAM,EAAGA,EAAM,CAAC,EAAI,CAAC,EAAG,CAAC,EAC7DQ,IAAQP,GAAA,YAAAA,EAAK,KAAM,OAAY,CAACA,EAAI,EAAGA,EAAI,CAAC,EAAI,CAAC,EAAG,CAAC,EACrDQ,GAAU,OAAOP,GAAS,SAAWA,EAAO,EAE5CQ,GAAS,EACZH,EAAQ,GAAKC,GAAM,IAAM,GACzBD,EAAQ,GAAKC,GAAM,IAAM,CAC5B,EACAF,GAAK,QAAU,CACb,MAAO,CACL,GAAI,QACJ,MAAO,EACP,MAAOC,EACP,QAAS,GACT,UAAWP,GAAA,MAAAA,EAAO,aACd,OAAO,KAAKR,CAAa,EAAE,KAAK,IAAM,EAAI,EAC1C,MACN,EACA,KAAM,CAAE,GAAI,OAAQ,MAAO,EAAG,MAAOkB,EAAO,EAC5C,IAAK,CACH,GAAI,MACJ,MAAO,EACP,MAAOF,GACP,QAAS,GACT,UAAWP,GAAA,MAAAA,EAAK,aAAeA,EAAI,aAAe,MACpD,CACF,EACAK,GAAK,KAAOG,IACRN,GAAkBC,KACpBE,GAAK,YAAc,CACjB,MAAOH,GAAkBA,IAAmB,OAASA,EAAiB,OACtE,IAAKC,GAAgBA,IAAiB,OAASA,EAAe,MAChE,EAEJ,CAEAZ,EAAcG,GAAcW,EAC9B,CAEAlB,EAAMG,GAAS,CACb,GAAIA,EACJ,KAAMD,EAAG,MAAQ,OACjB,OAAQE,EACR,SAAU,CAAC,CACb,EAGA,IAAMmB,EAAKxB,EAAiB,KACzBH,GAAWA,EAAE,SAAW,QAAQO,KAAWP,EAAE,SAAWO,CAC3D,EACAF,EAAWE,GAAS,CAClB,GAAIA,EACJ,aAAalB,EAAAsC,GAAA,YAAAA,EAAI,mBAAJ,KAAAtC,EAAwB,CAAC,EACtC,OAAQ,CAAE,MAAO,CAAC,EAAG,CAAC,EAAG,KAAM,CAAE,CACnC,CACF,CAGA,GAAI,OAAO,KAAKe,CAAK,EAAE,SAAW,EAAG,CACnC,IAAMwB,EAAM,OACZxB,EAAMwB,GAAO,CAAE,GAAIA,EAAK,KAAM,SAAU,OAAQ,CAAC,EAAG,SAAU,CAAC,CAAE,EACjEvB,EAAWuB,GAAO,CAAE,GAAIA,EAAK,YAAa,CAAC,EAAG,OAAQ,CAAE,MAAO,CAAC,EAAG,CAAC,EAAG,KAAM,CAAE,CAAE,CACnF,CAEA,MAAO,CACL,GAAI,WACJ,MAAM7B,GAAA,YAAAA,EAAW,OAAQ,oBACzB,QAAS,GACT,MAAAK,EACA,WAAAC,EACA,OAAQ,CAAC,CACX,CACF,CAIA,SAAsBwB,GACpBzD,EACAN,EACAgE,EACAC,EACA,QAAAnE,EAAA,sBACA,IAAMoE,EAAMD,IAAW,MAAQ,OAASE,GAEpCC,EACAC,EAEJ,GAAIJ,IAAW,MAAO,CAEpB,IAAMjC,EAAU3B,GAAuBC,CAAQ,EAC/C8D,EAGM,KAAK,UAAUpC,EAAS,KAAM,CAAC,EACrCqC,EAAW,6BACb,KAAO,CAEL,IAAMC,EAAe,CACnB,KAAMhE,EAAS,MAAQ,eACvB,WAAYN,GAAA,KAAAA,EAAc,KAC1B,SAAAM,CACF,EACA8D,EACiE,KAAK,UAAUE,EAAM,KAAM,CAAC,EAC7FD,EAAW,4BACb,CAEA,IAAME,EAAO,IAAI,KAAK,CAACH,CAAI,EAAG,CAAE,KAAMC,CAAS,CAAC,EAEhD,GAAIrE,GAEE,EADmB,MAAMJ,GAAiBI,CAAU,GACnC,OAAO,KAG9B,IAAMwE,EAAUlE,EAAS,MAAQ,eAC3BmE,EAAW,CAAC,eAAaT,GAAA,YAAAA,EAAM,QAASA,EAAOQ,EAE/CE,EAAgB,QAAM,aAC1BH,EACA,CACE,SAAU,GAAGE,IAAWP,IACxB,YAAaD,IAAW,MAAQ,cAAgB,aAChD,WAAY,CAACC,CAAG,CAClB,EACAlE,CACF,EAEA,aAAME,GAAewE,CAAa,EAC3BA,CACT,GAEA,SAAsBC,IAGnB,QAAA7E,EAAA,sBApTH,IAAAS,EAAAC,EAsTE,IAAM+D,EAAO,QAAM,aAAS,CAC1B,YAAa,sBACb,WAAY,CAACJ,GAAgB,MAAM,EACnC,SAAU,EACZ,CAAC,EAED,GAAI,CAACI,EAAM,OAAO,KAGlB,IAAMH,EAAe,MAAM,IAAI,QAASQ,GAAY,CAClD,IAAMC,EAAS,IAAI,WACnBA,EAAO,UAAY,IAAM,CACnBA,EAAO,aAAe,WAAW,MACnCD,EAAQC,EAAO,MAAgB,CAEnC,EACAA,EAAO,WAAWN,EAAM,MAAM,CAChC,CAAC,EAEKO,EAAS,KAAK,MAAMV,CAAI,EAG9B,GAAI,4BAA6BU,EAAQ,CACvC,IAAM9E,GAAaO,EAAAgE,EAAK,SAAL,KAAAhE,EAAe,KAClC,aAAML,GAAeF,CAAU,EACxB,CACL,WAAAA,EACA,SAAU+B,GAAuB+C,CAAM,CACzC,CACF,CAGA,GAAI,2BAA4BA,EAC9B,aAAM,4FAA4F,EAC3F,KAIT,IAAMR,EAAeQ,EACf9E,GAAaQ,EAAA+D,EAAK,SAAL,KAAA/D,EAAe,KAClC,aAAMN,GAAeF,CAAU,EACxB,CACL,WAAAA,EACA,SAAUsE,EAAK,QACjB,CACF,GAEA,SAAsBS,IAA2B,QAAAjF,EAAA,sBAC/C,SAAO,aAAS,CACd,YAAa,iBACb,WAAY,CAAC,GAAGkF,GAAkB,GAAGC,EAAgB,EACrD,SAAU,EACZ,CAAC,CACH,GAEO,SAASC,GAAaZ,EAAkD,CAC7E,OAAO,IAAI,QAAQ,CAACM,EAASO,IAAW,CACtC,GAAIb,EAAM,CACR,IAAMO,EAAS,IAAI,WACnBA,EAAO,cAAcP,CAAI,EACzBO,EAAO,OAAS,IAAMD,EAAQC,EAAO,MAAM,EAC3CA,EAAO,QAAWO,GAAUD,EAAOC,CAAK,EACxCP,EAAO,QAAWO,GAAUD,EAAOC,CAAK,CAC1C,CACF,CAAC,CACH,CAEO,SAASC,GAAWf,EAAkD,CAC3E,OAAO,IAAI,QAAQ,CAACM,EAASO,IAAW,CACtC,GAAIb,EAAM,CACR,IAAMO,EAAS,IAAI,WACnBA,EAAO,WAAWP,CAAI,EACtBO,EAAO,OAAS,IAAMD,EAAQC,EAAO,MAAM,EAC3CA,EAAO,QAAWO,GAAUD,EAAOC,CAAK,EACxCP,EAAO,QAAWO,GAAUD,EAAOC,CAAK,CAC1C,CACF,CAAC,CACH,CAEO,SAASE,GAAoBC,EAAgC,CAClE,OAAO,IAAI,QAAQ,CAACX,EAASO,IAAW,CACtC,IAAMK,EAAM,IAAI,MAChBA,EAAI,OAAS,IAAMZ,EAAQ,CAACY,EAAI,MAAOA,EAAI,MAAM,CAAC,EAClDA,EAAI,QAAU,IAAML,EAAO,IAAI,MAAM,0BAA0B,CAAC,EAChEK,EAAI,IAAMD,CACZ,CAAC,CACH,CAEO,SAASE,GAAoBF,EAAgC,CAClE,OAAO,IAAI,QAAQ,CAACX,EAASO,IAAW,CACtC,IAAMO,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,iBAAmB,IAAMd,EAAQ,CAACc,EAAM,WAAYA,EAAM,WAAW,CAAC,EAC5EA,EAAM,QAAU,IAAMP,EAAO,IAAI,MAAM,0BAA0B,CAAC,EAClEO,EAAM,IAAMH,CACd,CAAC,CACH,CFnZAI,GAAAC,GAAc,8BGFd,IAAAC,GAAsB,sBACtBC,GAAoB,qBCGb,IAAeC,GAAf,KAA2B,CAGhC,YAAmBC,EAAe,CAAf,SAAAA,CAAgB,CAKrC,EDOO,IAAMC,GAAN,cAA2BC,EAAY,CAc5C,YAAYC,EAAeC,EAAiBC,EAA2BC,EAAW,GAAO,CAjC3F,IAAAC,EAAAC,EAAAC,EAkCI,MAAMN,CAAG,EAdXO,EAAA,qBACAA,EAAA,wBACAA,EAAA,mCACAA,EAAA,yBAAoB,SAAM,SAAS,GACnCA,EAAA,wBAAmB,SAAM,SAAS,GAClCA,EAAA,eAAU,IACVA,EAAA,qBACAA,EAAA,iBACAA,EAAA,yBACAA,EAAA,uBACAA,EAAA,4BACAA,EAAA,iBAiEAA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CAlGzC,IAAAH,EAAAC,EAAAC,EAmGI,GAAM,CAAE,aAAAE,CAAa,EAAI,KACnB,CACJ,aAAAC,EACA,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,CACvB,EAAI,KAAK,IAEHC,EAAQ,KAAK,IAAI,SAAqBP,EAAa,EAAE,EAE3D,GAAIO,EAAM,SAAU,OAEpB,GAAM,CAAE,QAAAC,CAAQ,EAAIR,EAEdN,EAAW,KAAK,SAGtB,GAAI,CAACc,EAAQd,GAAU,QAAS,OAGhC,IAAIe,EAAQ,OAAI,IAAIR,EAAc,OAAI,IAAIO,EAAQd,GAAU,MAAOM,EAAa,KAAK,CAAC,EAEtF,GAAIE,EAAU,CACZ,IAAMQ,EAAIP,EACN,OAAI,IAAIK,EAAQ,MAAM,MAAOA,EAAQ,IAAI,KAAK,EAC9CA,EAAQd,IAAa,QAAU,MAAQ,SAAS,MAC9CiB,EAAIH,EAAQd,GAAU,MACtBkB,EAAI,OAAI,IAAID,EAAGF,CAAK,EAEpBI,EAAQ,OAAI,MAAMH,EAAGE,CAAC,EAEtBE,EAAW,OAAI,QAAQF,EAAGF,EAAG,SAAM,oBAAoBG,EAAO,EAAE,EAAIA,CAAK,EAE/EJ,EAAQ,OAAI,IAAIA,EAAO,OAAI,IAAIK,EAAUF,CAAC,CAAC,CAC7C,CAEA,IAAMG,EAAY,OAAI,IAAIP,EAAQd,GAAU,MAAOe,CAAK,EAElDO,EAAgB,CACpB,CAACtB,GAAWuB,EAAAC,EAAA,GACPV,EAAQd,IADD,CAEV,MAAOY,EAAW,OAAI,KAAKS,EAAWV,CAAW,EAAI,OAAI,QAAQU,CAAS,EAC1E,UAAW,MACb,EACF,EAgBMI,EAAQC,YACRC,GAAezB,EAAAuB,EAAM,iBAAN,YAAAvB,EAAA,KAAAuB,EAAuBnB,EAAcgB,GAG1D,GAAI,CAACK,EAAc,OAMnB,IAAMC,EAA+E,CACnF,MAAO,SAAM,UAAUf,EAAOc,CAAY,EAC1C,SAAU,CAAC,CACb,EAEIE,EAEEC,EAAiBF,EAAK,MAAM,QAAQ,KAAK,UAEzCG,EAAiBH,EAAK,MAAM,QAAQ,KAAK,WAAa,QAAU,MAAQ,SAK9E,GAAI,KAAK,oBAAqB,CAC5B,IAAII,EAEEC,EAAc,KAAK,IAAI,KAAK,OAAO,KAAK,qBAExCC,EAAmBC,EAAK,aAAaF,CAAW,EAEhDG,EAASF,EAAiB,UAAUD,CAAW,EAE/CI,EAAcT,EAAK,MAAM,QAAQ,MAEjCU,GAAYV,EAAK,MAAM,QAAQ,IAE/BW,EAAW,OAAI,IAAIF,EAAY,MAAOT,EAAK,MAAM,KAAK,EAExD,OAAI,QAAQW,EAAUH,CAAM,GAAGG,EAAS,KAE5C,IAAMC,GAAYJ,EAEZK,GAAgBP,EAAiB,aAAaD,EAAa1B,CAAY,EAEvEmC,GAAe,OAAI,IAAI,OAAI,IAAIH,EAAUC,EAAS,CAAC,EAEnDG,GAAkB,KAAK,IAAI,WAAW,KAAK,iBAAiB,IAAM,OAItE,CAACjC,GACD,CAACwB,EAAiB,aAAaD,EAAa,OAAI,IAAIL,EAAK,MAAM,MAAOU,GAAU,KAAK,CAAC,IAEtFN,EAAmB,KAAK,iBACtBnB,EACAoB,EACA,QACA,KAAK,kBACLG,EACAI,GACAE,GACAD,EACF,GAGET,GAAoB,CAACW,IAEvB,KAAK,QAAU,GAEff,EAAK,SAAS,KAAK,mBAAqBI,EAExCJ,EAAK,MAAQ,SAAM,UAAUA,EAAK,MAAO,CACvC,QAAS,CACP,MAAO,CACL,UAAWI,EAAiB,EAC9B,CACF,CACF,CAAC,GACQ,CAACA,GAAoBW,KAE9B,KAAK,QAAU,GAEff,EAAK,SAAS,KAAK,mBAAqB,OAExCA,EAAK,MAAQ,SAAM,UAAUtB,EAAc,CACzC,QAAS,CACP,MAAO,CACL,UAAW,MACb,CACF,CACF,CAAC,EAEL,CAGA,GAAI,CAACI,EAAS,CACZ,IAAM8B,EAAY,OAAI,IAAIT,EAAe,MAAOH,EAAK,MAAM,KAAK,EAE1DW,EAAW,OAAI,IAAIT,EAAe,MAAOF,EAAK,MAAM,KAAK,EAEzDc,EAAe,OAAI,IAAI,OAAI,IAAIH,EAAUC,CAAS,CAAC,EAEnDI,EAAa,OAAI,IAAIhB,EAAK,MAAM,MAAQA,EAAK,MAAM,QAAS,MAAM,KAAM,EAExEiB,EAAW,OAAI,IAAIjB,EAAK,MAAM,MAAQA,EAAK,MAAM,QAAS,IAAI,KAAM,EAEpEkB,GAAU,KAAK,iBAClB,IAAKC,GAAO,KAAK,IAAI,KAAK,OAAOA,EAAG,EACpC,KAAK,CAACC,EAAGC,KAAMA,GAAE,WAAaD,EAAE,UAAU,EAC1C,OAAQnC,GAAU,CACjB,GAAIA,EAAM,SAAU,MAAO,GAC3B,IAAMY,GAAQU,EAAK,aAAatB,CAAK,EACrC,MAAO,CAAC,CAAC+B,EAAYC,CAAQ,EAAE,MAAOK,IAAUzB,GAAM,aAAaZ,EAAOqC,EAAK,CAAC,CAClF,CAAC,EAEH,QAAWC,KAAUL,GAYnB,GAXAjB,EAAiB,KAAK,iBACpBhB,EACAsC,EACA,KAAK,SACL,KAAK,iBACLZ,EACAC,EACAE,EACAjC,CACF,EAEIoB,EAAgB,KAExB,CAEA,GAAIA,EAEF,KAAK,QAAU,GAEfD,EAAK,SAAS,KAAK,kBAAoBC,EAEvCD,EAAK,MAAQ,SAAM,UAAUA,EAAK,MAAO,CACvC,QAAS,CACP,CAAC,KAAK,UAAW,CACf,UAAW,KAAK,gBAClB,CACF,CACF,CAAC,MACI,CAEL,KAAK,QAAU,KAAK,SAAW,GAE/B,IAAMwB,EAAmBvC,EAAM,QAAQ,KAAK,UAAU,UAElDuC,IAAqB,SACvBxB,EAAK,SAASwB,GAAoB,OAElCxB,EAAK,MAAQ,SAAM,UAAUA,EAAK,MAAO,CACvC,QAAS,CACP,CAAC,KAAK,UAAW,CACf,UAAW,MACb,CACF,CACF,CAAC,EAEL,CAEA,IAAMyB,GAASjD,GAAAD,EAAAgC,EAAK,aAAyBP,EAAK,KAAK,GAAE,iBAA1C,YAAAxB,EAAA,KAAAD,EACbyB,EAAK,MACLA,EAAK,MAAM,SAGb,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAACf,EAAM,IAAKW,IAAA,GAAKI,EAAK,OAAWyB,GAAA,KAAAA,EAAU,CAAC,EAC9C,EACA,SAAUzB,EAAK,QACjB,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,UAAWA,EAAK,MAAM,QAAQ5B,GAAU,SAC1C,CACF,CACF,CACF,CACF,GAEAK,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,aAAAC,EAAc,eAAAgD,EAAgB,kBAAAC,EAAmB,iBAAAC,CAAiB,EAAI,KAExEC,EAAetB,EAAK,kBAAkB,KAAK,IAAI,KAAK,OAAO7B,EAAa,GAAG,EAE3EoD,EACJ,KAAK,UACL,OAAI,KAAKD,EAAa,QAAQ,MAAM,MAAOA,EAAa,QAAQ,IAAI,KAAK,EAAI,EAEzEE,EAAuD,CAAC,EAE9D,OAAAA,EAAcH,GAAoB,OAE9BF,IACFK,EAAcL,EAAe,IAAMI,EAAa,OAAYJ,GAG1DC,IACFI,EAAcJ,GAAqB,QAG9B,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAACjD,EAAa,IAAKoD,EAAa,OAAYpD,CAC9C,EACA,SAAUqD,CACZ,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAaD,EAAa,CAAC,EAAI,CAACpD,EAAa,EAAE,EAC/C,UAAW,OACX,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,CACF,GAEAD,EAAA,gBAAW,IAA6C,CACtD,GAAM,CAAE,aAAAC,EAAc,eAAAgD,EAAgB,kBAAAC,EAAmB,oBAAAK,EAAqB,SAAA5D,CAAS,EAAI,KAErFyD,EAAetB,EAAK,kBAAkB,KAAK,IAAI,KAAK,OAAO7B,EAAa,GAAG,EAE3E8C,EAAmBK,EAAa,QAAQzD,GAAU,UAElD6D,EAAS,OAAI,KAAKJ,EAAa,QAAQ,MAAM,MAAOA,EAAa,QAAQ,IAAI,KAAK,EAExF,GAAI,EAAEL,GAAoBE,IAAmBO,EAAS,EAAG,OAAO,KAAK,OAAO,EAE5E,IAAMC,EAAqD,CAAC,EAEtDH,EAAoD,CAAC,EAE3D,OAAIL,IACFQ,EAAeR,EAAe,IAAM,KAAK,SAAW,OAAYA,EAChEK,EAAcL,EAAe,IAAM,QAGjCF,IACFU,EAAeV,GAAoB,OACnCO,EAAcP,GAAoB,KAAK,IAAI,KAAK,SAASA,IAGvDQ,IACFE,EAAeP,GAAqB,OACpCI,EAAcJ,GAAqB,KAAK,IAAI,KAAK,SAASA,IAGrD,CACL,GAAI,QACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAACjD,EAAa,IAAK,KAAK,SAAW,OAAYA,CACjD,EACA,SAAUwD,CACZ,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAa,KAAK,SAAW,CAAC,EAAI,CAACxD,EAAa,EAAE,EAClD,UAAW,OACX,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAACA,EAAa,IAAKmD,CACrB,EACA,SAAUE,CACZ,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAa,CAACrD,EAAa,EAAE,EAC7B,UAAW,OACX,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,CACF,CACF,GAEAD,EAAA,KAAQ,mBAAmB,CACzBQ,EACAsC,EACAnD,EACA+D,EACAb,EACAc,EACAC,EACAC,IACG,CAGH,IAAMC,EAFOhC,EAAK,aAAsBgB,EAAO,IAAI,EAEzB,gBACxBA,EACAtC,EACAqC,EACAc,EACAC,EACAC,CACF,EAGA,GAAI,EAACC,EAEL,MAAO,CACL,GAAIJ,EACJ,KAAM,QACN,OAAQlD,EAAM,GACd,KAAMsC,EAAO,GACb,SAAUnD,EACV,MAAO,OAAI,QAAQmE,EAAa,KAAK,EACrC,SAAUA,EAAa,QACzB,CACF,GAhdE,KAAK,SAAWlE,EAEhB,GAAM,CAAE,cAAAmE,CAAc,EAAItE,EAAI,MAAM,SAE9BuE,EAAOvE,EAAI,MAAM,SAAS,MAAMsE,GAEtC,KAAK,SAAWpE,EAEhB,KAAK,aAAesE,GAASD,EAAK,OAAOtE,EAAsB,EAE/D,KAAK,iBAAmBoC,EAAK,oBAAoBrC,EAAI,KAAK,EAAE,OACzDiD,GAAO,EAAEA,IAAO,KAAK,aAAa,IAAMA,IAAO,KAAK,aAAa,SACpE,EAGA,IAAMwB,GACJrE,EAAA,KAAK,aAAa,QAAQF,IAAa,QAAU,MAAQ,WAAzD,YAAAE,EAAmE,UAErE,GAAIqE,EAAyB,CAC3B,IAAMC,GAAerE,EAAAkE,EAAK,SAASE,KAAd,YAAApE,EAAwC,KACzDqE,IACF,KAAK,iBAAmB,KAAK,iBAAiB,OAAQzB,GAAOA,IAAOyB,CAAY,EAEpF,CAEA,GAAM,CAAE,YAAAC,CAAY,EAAI,KAAK,IAE7B,GAAI,KAAK,SAIP,KAAK,qBAAsBrE,EAAA,KAAK,iBAC7B,IAAK2C,GAAOsB,EAAK,OAAOtB,EAAG,EAC3B,OACElC,GACC,CAACA,EAAM,UACP,SAAM,cAAc4D,EAAatC,EAAK,aAAatB,CAAK,EAAE,UAAUA,CAAK,CAAC,CAC9E,EACC,KAAK,CAACmC,EAAGC,IAEDA,EAAE,WAAaD,EAAE,UACzB,EAAE,KAVsB,YAAA5C,EAUlB,GAEL,KAAK,qBACP,KAAK,iBAAiB,OAAO,KAAK,iBAAiB,QAAQ,KAAK,mBAAmB,EAAG,CAAC,MAEpF,CAGL,IAAMsE,EAAmB,KAAK,aAAa,QAAQ,KAAK,UAAU,UAE9DA,EACF,KAAK,eAAiBL,EAAK,SAASK,GAGpC,KAAK,aAAa,QAAQ,KAAK,UAAU,UAAY,MAEzD,CACF,CAuZF,EErfA,IAAAC,GAAgC,sBAKzB,IAAMC,GAAN,cAA2BC,EAAY,CAW5C,YAAYC,EAAe,CACzB,MAAMA,CAAG,EAXXC,EAAA,qBACAA,EAAA,wBACAA,EAAA,0BACAA,EAAA,2BACAA,EAAA,qBA8BAA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,mBAAAC,EACA,aAAAC,EACA,IAAK,CAAE,QAAAC,EAAS,SAAAC,EAAU,YAAAC,EAAa,aAAAC,CAAa,CACtD,EAAI,KAGEC,EAAQ,SAAM,oBAAoB,CAACF,EAAaC,CAAY,CAAC,EAK7DE,EAAkBJ,EAAS,gBAC7B,CAACD,GAAWE,EAAY,GAAKC,EAAa,GAC1CH,EAGEM,EAAO,IAAI,IAEXC,EAAc,IAAI,IAAIT,CAAkB,EAE9CC,EAAa,QAAQ,CAAC,CAAE,GAAAS,EAAI,SAAAC,CAAS,IAAM,CACzC,IAAMC,EAAQ,KAAK,IAAI,SAASF,CAAE,EAElC,GAAI,CAACF,EAAK,IAAIG,CAAQ,EAAG,CACvB,IAAME,EAAO,KAAK,IAAI,aAAaD,CAAK,GAEtCL,EACI,SAAM,cAAcD,EAAOO,EAAK,UAAUD,CAAK,CAAC,EAChDC,EAAK,cAAcD,EAAON,CAAK,IAEnCE,EAAK,IAAIG,CAAQ,EAGZF,EAAY,IAAIE,CAAQ,GAC3BF,EAAY,IAAIE,CAAQ,GAEjBF,EAAY,IAAIE,CAAQ,GACjCF,EAAY,OAAOE,CAAQ,CAE/B,CACF,CAAC,EAED,IAAMG,EAAqB,KAAK,IAAI,YAE9BC,EACJN,EAAY,OAASK,EAAmB,QACxCA,EAAmB,KAAMJ,GAAO,CAACD,EAAY,IAAIC,CAAE,CAAC,EAEhDM,EAAmBD,EAAY,MAAM,KAAKN,EAAY,OAAO,CAAC,EAAIK,EAExE,OAAKC,EAcE,CACL,SAAU,CACR,gBAAAR,CACF,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,MAAAD,EACA,YAAaU,CACf,CACF,CACF,CACF,EAzBS,CACL,SAAU,CACR,gBAAAT,CACF,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,MAAAD,CACF,CACF,CACF,CACF,CAeJ,GAEAP,EAAA,cAAS,KACA,CACL,SAAU,CACR,gBAAiB,EACnB,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,MAAO,KACP,YAAa,MAAM,KAAK,KAAK,mBAAmB,OAAO,CAAC,CAC1D,CACF,CACF,CACF,IAGFA,EAAA,gBAAW,KACF,CACL,SAAU,CACR,gBAAiB,EACnB,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,MAAO,KACP,YAAa,CAAC,GAAG,KAAK,IAAI,WAAW,CACvC,CACF,CACF,CACF,IAtIA,GAAM,CAAE,cAAAkB,CAAc,EAAInB,EAC1B,KAAK,mBAAqB,IAAI,IAAI,KAAK,IAAI,WAAW,EACtD,KAAK,aAAe,KAAK,IAAI,OAC1B,OACEc,GACC,EACEA,EAAM,UACNA,EAAM,UACNA,EAAM,WAAaK,GACnB,KAAK,mBAAmB,IAAIL,EAAM,EAAE,GACpC,KAAK,mBAAmB,IAAIA,EAAM,QAAQ,EAEhD,EACC,IAAKA,IAAW,CACf,GAAIA,EAAM,GACV,OAAQ,KAAK,IAAI,aAAaA,CAAK,EAAE,UAAUA,CAAK,EACpD,SAAUA,EAAM,EAClB,EAAE,EAEJ,KAAK,OAAO,CACd,CAoHF,ECzJA,IAAAM,GAAoB,qBAKb,IAAMC,GAAN,cAA0BC,EAAY,CAc3C,YAAYC,EAAeC,EAAY,CApBzC,IAAAC,EAqBI,MAAMF,CAAG,EAdXG,EAAA,oBACAA,EAAA,wBACAA,EAAA,0BACAA,EAAA,gBACAA,EAAA,eACAA,EAAA,qBACAA,EAAA,0BACAA,EAAA,qBAA4B,CAAC,GAC7BA,EAAA,gBACAA,EAAA,iBACAA,EAAA,oBACAA,EAAA,wBAwCAA,EAAA,aAAQ,IAAM,CA1DhB,IAAAD,EA2DI,IAAME,EAAe,KAAK,IAAI,YACxBC,EAAmB,CAAC,EAAG,GAAGH,EAAAE,EAAa,KAAb,KAAAF,EAAmB,EAAG,EAEtD,KAAK,OAAO,KAAKG,CAAgB,EACjC,IAAMC,EAAU,CACd,KAAK,IAAI,KAAK,QAAQ,GAAIF,EAAa,EAAE,EACzC,KAAK,IAAI,KAAK,QAAQ,GAAIA,EAAa,EAAE,CAC3C,EACMG,EAAQ,OAAI,IAAID,EAASF,CAAY,EAC3C,YAAK,QAAUE,EACf,KAAK,cAAgB,KAAK,OAAO,IAAKE,GAAO,OAAI,QAAQ,OAAI,IAAIA,EAAID,CAAK,CAAC,EAAE,OAAOC,EAAG,EAAE,CAAC,EAEnF,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAAC,KAAK,SAAU,CACd,MAAO,KAAK,QACZ,OAAQ,KAAK,aACf,CACF,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAa,CAAC,KAAK,OAAO,CAC5B,CACF,CACF,CACF,CACF,GAEAL,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,QAAAM,CAAQ,EAAI,KACd,CAAE,aAAAL,EAAc,YAAAM,EAAa,SAAAC,EAAU,KAAAC,CAAK,EAAI,KAAK,IAK3D,GAAI,CAAC,KAAK,iBAAmB,KAAK,OAAO,OAAS,EAAG,CACnD,IAAML,EAAQ,OAAI,IAAIH,EAAcM,CAAW,EAC3C,OAAI,IAAIH,CAAK,EAAI,EAAIK,IACvB,KAAK,gBAAkB,KAAK,IAAIL,EAAM,EAAE,EAAI,KAAK,IAAIA,EAAM,EAAE,EAAI,aAAe,WAEpF,CAIA,GAAII,GACF,GAAI,CAAC,KAAK,UAAY,KAAK,OAAO,OAAS,EAAG,CAG5C,GAAI,CAAC,KAAK,gBAAiB,CACzB,IAAMJ,EAAQ,OAAI,IAAIH,EAAcM,CAAW,EAC3C,OAAI,IAAIH,CAAK,EAAI,EAAIK,IACvB,KAAK,gBACH,KAAK,IAAIL,EAAM,EAAE,EAAI,KAAK,IAAIA,EAAM,EAAE,EAAI,aAAe,WAE/D,CAEA,KAAK,SAAW,GAEhB,IAAMM,EAAY,CAAC,GAAG,KAAK,iBAAiB,EAExC,KAAK,kBAAoB,WAC3BA,EAAU,GAAK,EAEfA,EAAU,GAAK,EAGjB,KAAK,OAAO,KAAKA,EAAU,OAAOT,EAAa,EAAE,CAAC,CACpD,OACS,KAAK,WACd,KAAK,SAAW,IAGd,KAAK,WACH,KAAK,kBAAoB,WAC3BA,EAAa,GAAKM,EAAY,GAE9BN,EAAa,GAAKM,EAAY,IAIlC,IAAMI,EAAS,KAAK,SAASV,CAAY,EAEzC,GAAI,EAACU,EAEL,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CACN,CAACL,GAAUK,CACb,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAa,CAACL,CAAO,CACvB,CACF,CACF,CACF,CACF,GAEAN,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,QAAAM,CAAQ,EAAI,KACdM,EAAS,KAAK,IAAI,cAExB,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACA,GAAS,CACR,OAAQ,CACN,CAACN,GAAU,KAAK,YAAc,KAAK,aAAe,MACpD,CACF,CACF,EACA,WAAY,CACV,CAACM,GAAS,CACR,YAAa,CAAC,CAChB,CACF,CACF,CACF,CACF,GAEAZ,EAAA,gBAAW,IAA6C,CACtD,GAAM,CAAE,QAAAM,CAAQ,EAAI,KACdM,EAAS,KAAK,IAAI,cAClBC,EAAQ,KAAK,IAAI,SAAoBP,CAAO,EAClD,MAAO,CACL,GAAI,cACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACM,GAAS,CACR,OAAQ,CACN,CAACN,GAAU,KAAK,YAAc,KAAK,aAAe,MACpD,CACF,CACF,EACA,WAAY,CACV,CAACM,GAAS,CACR,YAAa,CAAC,CAChB,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACA,GAAS,CACR,OAAQ,CACN,CAACN,GAAUQ,EAAAC,EAAA,GACNF,GADM,CAET,MAAO,OAAI,QAAQA,EAAM,KAAK,EAC9B,OAAQA,EAAM,OAAO,IAAKR,GAAO,OAAI,QAAQA,CAAE,CAAC,EAChD,WAAY,EACd,EACF,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,IAAI,eAAgB,CACxB,YAAa,CAAC,CAChB,CACF,CACF,CACF,CACF,CACF,GAEAL,EAAA,gBAAYC,GAA2B,CACrC,GAAM,CAAE,YAAAM,CAAY,EAAI,KAAK,IAEvBL,EAAmB,OAAI,QAAQ,OAAI,IAAID,EAAcM,CAAW,CAAC,EAAE,OAAON,EAAa,EAAE,EAG/F,GAAI,OAAI,QAAQ,KAAK,kBAAmBC,CAAgB,EAAG,OAG3D,KAAK,OAAO,KAAKA,CAAgB,EAGjC,KAAK,kBAAoBA,EAGzB,IAAMc,EAAc,CAAC,GAAG,KAAK,OAAO,EAE9Bb,EAAU,CACd,KAAK,IAAI,KAAK,QAAQ,GAAIF,EAAa,EAAE,EACzC,KAAK,IAAI,KAAK,QAAQ,GAAIA,EAAa,EAAE,CAC3C,EAEMG,EAAQ,OAAI,IAAID,EAASI,CAAW,EAGtCU,EAEJ,OAAID,EAAY,KAAOb,EAAQ,IAAMa,EAAY,KAAOb,EAAQ,IAC9D,KAAK,QAAUA,EAIfc,EAAS,KAAK,OAAO,IAAKZ,GAAO,OAAI,QAAQ,OAAI,IAAIA,EAAID,CAAK,CAAC,EAAE,OAAOC,EAAG,EAAE,CAAC,GAK9EY,EAAS,CAAC,GAAG,KAAK,cAAe,OAAI,IAAIf,EAAkBE,CAAK,EAAE,OAAOF,EAAiB,EAAE,CAAC,EAG/F,KAAK,cAAgBe,EAEd,CACL,MAAO,KAAK,QACZ,OAAAA,CACF,CACF,GAlQE,GAAM,CAAE,YAAAV,CAAY,EAAI,KAAK,IAC7B,KAAK,QAAUT,EACf,KAAK,aAAe,KAAK,IAAI,SAAoBA,CAAE,EACnD,KAAK,QAAU,CAAC,GAAG,KAAK,aAAa,KAAK,EAC1C,IAAMG,EAAe,CAAC,EAAG,GAAGF,EAAAQ,EAAY,KAAZ,KAAAR,EAAkB,EAAG,EAC3CK,EAAQ,OAAI,IAAIG,EAAa,KAAK,OAAO,EACzCW,EAAgB,KAAK,aAAa,OAAO,IAAKb,GAAO,OAAI,IAAIA,EAAID,CAAK,EAAE,OAAOC,EAAG,EAAE,CAAC,EAC3F,KAAK,YAAca,EAAc,OAAS,EAC1C,IAAMC,EAAwB,CAAC,EAC/B,GAAI,KAAK,YAAa,CAEpB,IAAMC,EAAYF,EAAcA,EAAc,OAAS,GACvD,GAAIE,EAAW,CACbD,EAAU,KAAKC,EAAWA,CAAS,EACnC,IAAMC,EAAM,KAAK,MAAM,OAAI,KAAKD,EAAWnB,CAAY,EAAI,EAAE,EAE7D,GAAIoB,EAAM,EACR,QAASC,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAC5B,IAAMC,EAAID,GAAKD,EAAM,GACrBF,EAAU,KAAK,OAAI,IAAIC,EAAWnB,EAAcsB,CAAC,EAAE,OAAOH,EAAU,EAAE,CAAC,CACzE,MAEAD,EAAU,KAAKlB,EAAcA,CAAY,CAE7C,CACF,MACEkB,EAAU,KAAKlB,CAAY,EAK7B,KAAK,OAAS,CAAC,GAAGiB,EAAe,GAAGC,CAAS,EAC7C,KAAK,cAAgB,KAAK,OAAO,IAAKd,GAAO,OAAI,IAAIA,EAAID,CAAK,EAAE,OAAOC,EAAG,EAAE,CAAC,EAC7E,KAAK,kBAAoB,KAAK,OAAO,KAAK,OAAO,OAAS,EAC5D,CAiOF,ECrRO,IAAMmB,GAAN,cAA0BC,EAAY,CAS3C,YAAYC,EAAeC,EAAYC,EAAqB,CAC1D,MAAMF,CAAG,EATXG,EAAA,oBACAA,EAAA,wBAEAA,EAAA,qBACAA,EAAA,2BACAA,EAAA,sBACAA,EAAA,mBAUAA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA2B,IAEpCA,EAAA,cAAS,KACA,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,CACN,CAAC,KAAK,aAAa,IAAK,KAAK,WAAa,OAAY,KAAK,YAC7D,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,YAAa,KAAK,WAAa,CAAC,EAAI,KAAK,mBACzC,UAAW,MACb,CACF,CACF,CACF,IAGFA,EAAA,gBAAW,IAA6C,CACtD,IAAMC,EAAQ,KAAK,IAAI,SAAS,KAAK,aAAa,EAAE,EAEpD,MAAO,CACL,GAAI,OACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,CACN,CAAC,KAAK,aAAa,IAAK,KAAK,WAAa,OAAY,KAAK,YAC7D,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,YAAa,KAAK,WAAa,CAAC,EAAI,KAAK,mBACzC,UAAW,MACb,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,CACN,CAAC,KAAK,aAAa,IAAKA,CAC1B,CACF,CACF,EACA,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,YAAa,CAACA,EAAM,EAAE,EACtB,UAAW,MACb,CACF,CACF,CACF,CACF,CACF,GAtEE,KAAK,aAAeJ,EAAI,SAASC,EAAID,EAAI,aAAa,EACtD,KAAK,cAAgBA,EAAI,cACzB,KAAK,WAAaE,EAClB,KAAK,mBAAqB,CAAC,GAAGF,EAAI,WAAW,CAC/C,CAmEF,ECtFA,IAAAK,GAAoB,qBAab,IAAMC,GAAN,cAA2BC,EAAY,CAa5C,YAAYC,EAAe,CACzB,MAAMA,CAAG,EAbXC,EAAA,oBACAA,EAAA,wBACAA,EAAA,0BACAA,EAAA,iBACAA,EAAA,wBACAA,EAAA,oBAAe,IAAI,KACnBA,EAAA,sBAAiB,IAAI,KACrBA,EAAA,8BACAA,EAAA,uBACAA,EAAA,kBACAA,EAAA,2BAAsB,GAUtBA,EAAA,iBACAA,EAAA,kBAAa,GACbA,EAAA,kBAAa,GACbA,EAAA,sBAA2B,CAAC,GAE5BA,EAAA,YAAO,IAAM,CACX,IAAMC,EAAM,KAAK,IAAI,EACfC,EAAWD,EAAM,KAAK,WACtBE,EAAWF,EAAM,KAAK,WACtB,CAAE,UAAAG,CAAU,EAAI,KAAK,IAAI,SAE3BC,EAAO,CAAC,GAAGD,CAAS,EACpBE,EAAY,GAEZJ,EAAW,IAAM,KAAK,iBAAmB,KAAK,YAChDI,EAAY,GACZD,EAAO,CAAC,GAAGD,EAAW,KAAK,SAAS,EACpC,KAAK,eAAiB,KAAK,WAGzBD,EAAW,IACTE,EAAK,OAAS,IAChBC,EAAY,GACZD,EAAK,OAAO,EAAG,KAAK,KAAKA,EAAK,OAAS,EAAG,CAAC,EAC3C,KAAK,WAAaJ,GAIlBK,GACF,KAAK,IAAI,WACP,CACE,SAAU,CACR,UAAWD,CACb,CACF,EACA,WACF,EAGF,KAAK,SAAW,sBAAsB,KAAK,IAAI,CACjD,GAEAL,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,KAAAO,EAAM,SAAAC,EAAU,YAAAC,EAAa,aAAAC,EAAc,KAAAC,CAAK,EAAI,KAAK,IAEjE,GAAIH,EAAU,CACZ,IAAMI,EAAQ,OAAI,IAAIF,EAAcD,CAAW,EAC/C,GAAI,CAAC,KAAK,UAAY,OAAI,IAAIG,CAAK,EAAI,EAAID,EAAM,CAG/C,GAAI,CAAC,KAAK,gBAAiB,CACzB,IAAMC,EAAQ,OAAI,IAAIF,EAAcD,CAAW,EAC/C,KAAK,gBAAkB,KAAK,IAAIG,EAAM,EAAE,EAAI,KAAK,IAAIA,EAAM,EAAE,EAAI,aAAe,UAClF,CAEA,KAAK,SAAW,EAClB,CACF,MAAW,KAAK,WACd,KAAK,SAAW,IAGd,KAAK,WACH,KAAK,kBAAoB,WAC3BF,EAAa,GAAKD,EAAY,GAE9BC,EAAa,GAAKD,EAAY,IAIlC,IAAMI,EAAW,OAAI,QAAQ,OAAI,IAAIJ,EAAa,OAAI,IAAIC,EAAcD,CAAW,CAAC,CAAC,EAE/EK,EAAkB,IAAI,IAAY,CAAC,CAAC,EAE1C,KAAK,eAAe,QAASC,GAAU,CACrC,GAAI,MAAK,aAAa,IAAIA,CAAK,GAC3B,KAAK,IAAI,aAAaA,CAAK,EAAE,mBAAmBA,EAAO,KAAK,UAAWF,CAAQ,IACjF,KAAK,aAAa,IAAIE,CAAK,EAC3BD,EAAgB,IAAIC,EAAM,EAAE,EAExBA,EAAM,WAAa,QACrB,QAAWC,KAAWD,EAAM,SAC1B,KAAK,aAAa,IAAI,KAAK,IAAI,SAASC,CAAO,CAAC,EAChDF,EAAgB,IAAIE,CAAO,CAInC,CAAC,EAID,OAAO,OAAOT,EAAK,QAAQ,EAAE,QAASU,GAAY,CAChD,QAAWC,IAAM,CAACD,EAAQ,KAAMA,EAAQ,MAAM,EACxCH,EAAgB,IAAII,CAAE,GACxB,KAAK,eAAe,IAAID,CAAO,CAGrC,CAAC,EAED,KAAK,aAAa,QAASF,GAAU,CAE9B,KAAK,IAAI,SAASA,EAAM,EAAE,IAC7B,KAAK,aAAa,OAAOA,CAAK,EAC9B,KAAK,eAAe,OAAOA,CAAK,EAChCD,EAAgB,OAAOC,EAAM,EAAE,EAEnC,CAAC,EAED,IAAMI,EAAe,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAI1D,GAFA,KAAK,UAAYN,EAEbM,EAAa,SAAW,KAAK,oBAIjC,YAAK,oBAAsBA,EAAa,OAEjC,CACL,SAAU,CACR,MAAO,CACL,CAACZ,EAAK,IAAK,CACT,OAAQ,OAAO,YAAYY,EAAa,IAAKJ,GAAU,CAACA,EAAM,GAAI,CAAE,QAAS,EAAK,CAAC,CAAC,CAAC,CACvF,CACF,CACF,CACF,CACF,GAEAf,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,KAAAO,CAAK,EAAI,KAAK,IAEtB,qBAAqB,KAAK,QAAQ,EAElC,KAAK,aAAa,QAASQ,GAAU,CAC9B,KAAK,IAAI,SAASA,EAAM,EAAE,IAC7B,KAAK,aAAa,OAAOA,CAAK,EAC9B,KAAK,eAAe,OAAOA,CAAK,EAEpC,CAAC,EAED,IAAMI,EAAe,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAE1D,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACZ,EAAK,IAAK,CACT,OAAQ,OAAO,YAAYY,EAAa,IAAKJ,GAAU,CAACA,EAAM,GAAI,CAAE,QAAS,EAAM,CAAC,CAAC,CAAC,CACxF,CACF,EACA,WAAY,CACV,CAACR,EAAK,IAAK,CACT,YAAa,KAAK,sBAAsB,IAAKQ,GAAUA,EAAM,EAAE,CACjE,CACF,CACF,EACA,SAAU,CACR,UAAW,CAAC,CACd,CACF,CACF,GAEAf,EAAA,gBAAW,IAA6C,CACtD,GAAM,CAAE,KAAAO,CAAK,EAAI,KAAK,IAEtB,qBAAqB,KAAK,QAAQ,EAElC,KAAK,aAAa,QAASQ,GAAU,CAC9B,KAAK,IAAI,SAASA,EAAM,EAAE,IAC7B,KAAK,aAAa,OAAOA,CAAK,EAC9B,KAAK,eAAe,OAAOA,CAAK,EAEpC,CAAC,EAED,KAAK,eAAe,QAASE,GAAY,CAClC,KAAK,IAAI,WAAWA,EAAQ,EAAE,GACjC,KAAK,eAAe,OAAOA,CAAO,CAEtC,CAAC,EAED,IAAME,EAAe,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EACpDC,EAAiB,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EACxDC,EAAiBF,EAAa,IAAKJ,GAAUA,EAAM,EAAE,EACrDO,EAAmBF,EAAe,IAAKH,GAAYA,EAAQ,EAAE,EAE7DM,EAAsB,CAC1B,OAAQ,OAAO,YAAYJ,EAAa,IAAKJ,GAAU,CAACA,EAAM,GAAIA,CAAK,CAAC,CAAC,EACzE,SAAU,OAAO,YAAYK,EAAe,IAAKH,GAAY,CAACA,EAAQ,GAAIA,CAAO,CAAC,CAAC,CACrF,EAEMO,EAAqB,CACzB,OAAQ,OAAO,YAAYL,EAAa,IAAKJ,GAAU,CAACA,EAAM,GAAI,MAAS,CAAC,CAAC,EAC7E,SAAU,OAAO,YAAYK,EAAe,IAAKH,GAAY,CAACA,EAAQ,GAAI,MAAS,CAAC,CAAC,CACvF,EAGA,YAAK,IAAI,OAAO,QAASF,GAAU,CAC7BA,EAAM,SAAW,CAACS,EAAM,OAAOT,EAAM,KACvC,OAAO,OAAOA,EAAM,OAAO,EAAE,QAASU,GAAW,CAzOzD,IAAAC,EAAAC,EA0OcF,EAAO,WAAaH,EAAiB,SAASG,EAAO,SAAS,IAEhEF,EAAO,OAAOR,EAAM,IAAMa,EAAAC,EAAA,GACrBN,EAAO,OAAOR,EAAM,KADC,CAExB,QAASa,EAAAC,EAAA,IACJH,EAAAH,EAAO,OAAOR,EAAM,MAApB,YAAAW,EAAyB,SADrB,CAEP,CAACD,EAAO,IAAKA,CACf,EACF,GAGKJ,EAAe,SAASN,EAAM,EAAE,IACnCS,EAAM,OAAOT,EAAM,IAAMa,EAAAC,EAAA,GACpBL,EAAM,OAAOT,EAAM,KADC,CAEvB,QAASa,EAAAC,EAAA,IACJF,EAAAH,EAAM,OAAOT,EAAM,MAAnB,YAAAY,EAAwB,SADpB,CAEP,CAACF,EAAO,IAAKG,EAAAC,EAAA,GACRJ,GADQ,CAEX,UAAW,MACb,EACF,EACF,IAGN,CAAC,CAEL,CAAC,EAEM,CACL,GAAI,QACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAAClB,EAAK,IAAKgB,CACb,EACA,WAAY,CACV,CAAChB,EAAK,IAAK,CACT,YAAa,KAAK,sBACf,OAAQQ,GAAU,CAAC,CAAC,KAAK,IAAI,SAASA,EAAM,EAAE,CAAC,EAC/C,IAAKA,GAAUA,EAAM,EAAE,CAC5B,CACF,CACF,EACA,SAAU,CACR,UAAW,CAAC,CACd,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACR,EAAK,IAAKiB,CACb,EACA,WAAY,CACV,CAACjB,EAAK,IAAK,CACT,YAAa,KAAK,sBACf,OAAQQ,GAAU,CAAC,CAAC,KAAK,IAAI,SAASA,EAAM,EAAE,CAAC,EAC/C,OAAQA,GAAU,CAACM,EAAe,SAASN,EAAM,EAAE,CAAC,EACpD,IAAKA,GAAUA,EAAM,EAAE,CAC5B,CACF,CACF,EACA,SAAU,CACR,UAAW,CAAC,CACd,CACF,CACF,CACF,GAhRE,KAAK,UAAY,CAAC,GAAGhB,EAAI,WAAW,EACpC,KAAK,sBAAwB,KAAK,IAAI,YAAY,IAAKmB,GAAO,KAAK,IAAI,SAASA,CAAE,CAAC,EACnF,KAAK,eAAiB,IAAI,IAAI,KAAK,IAAI,OAAO,OAAQH,GAAU,CAACA,EAAM,QAAQ,CAAC,EAChF,KAAK,SAAW,KAAK,KAAK,CAC5B,CA6QF,EC7SA,IAAAe,GAA6C,sBAC7CC,GAAoB,qBAab,IAAMC,GAAN,cAA0BC,EAAY,CAa3C,YAAYC,EAAeC,EAAY,CA3BzC,IAAAC,EA4BI,MAAMF,CAAG,EAbXG,EAAA,oBACAA,EAAA,wBACAA,EAAA,6BACAA,EAAA,cACAA,EAAA,eACAA,EAAA,2BACAA,EAAA,wBACAA,EAAA,YAA+B,CAAC,GAChCA,EAAA,eAAU,GACVA,EAAA,YAAO,GACPA,EAAA,iBAAY,IAeZA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,cAAAC,EAAe,OAAAC,EAAQ,SAAAC,EAAU,aAAAC,CAAa,EAAI,KAAK,IAEzDC,EAA6C,CAAC,EAE9CC,EAAoC,CAAC,EAErCC,EAAS,SAAM,gBAAgB,KAAK,MAAM,EAE1CC,EAAS,OAAI,IAAIJ,EAAcG,CAAM,EAEvCJ,IACE,KAAK,IAAIK,EAAO,EAAE,EAAI,KAAK,IAAIA,EAAO,EAAE,EAC1CA,EAAO,GAAK,EAEZA,EAAO,GAAK,GAKhB,IAAMC,EAAO,KAAK,OAAO,MAAQ,GAC3BC,EAAO,KAAK,OAAO,OAAS,GAE5BC,EAAU,KAAK,KAAKH,EAAO,GAAKC,CAAI,EACpCG,EAAO,KAAK,KAAKJ,EAAO,GAAKE,CAAI,EAEjCG,EAAO,KAAK,IAAIF,EAAS,CAAC,EAC1BG,EAAO,KAAK,IAAIF,EAAM,CAAC,EACvBG,EAAO,KAAK,IAAIJ,EAAS,CAAC,EAC1BK,EAAO,KAAK,IAAIJ,EAAM,CAAC,EAEvBK,EAAS,IAAI,IAEbC,EAAYhB,EAEdgB,IAAc,KAAK,YAErB,OAAO,OAAO,KAAK,IAAI,EACpB,OAAQpB,GAAOA,IAAO,KAAK,MAAM,EAAE,EACnC,QAASA,GAAQO,EAAWP,GAAM,MAAU,EAE/C,KAAK,KAAO,CAAE,MAAO,KAAK,MAAM,EAAG,EAEnC,KAAK,UAAYoB,GAKnB,QAAS,EAAIL,EAAM,EAAIE,EAAM,IAC3B,QAASI,EAAIL,EAAMK,EAAIH,EAAMG,IAAK,CAChC,IAAMC,EAAW,GAAG,KAAKD,IAMzB,GAJAF,EAAO,IAAIG,CAAQ,EAEf,KAAK,KAAKA,IAEV,IAAM,GAAKD,IAAM,EAAG,SAExB,IAAME,EAAQ,KAAK,SAAS,OAAI,IAAI,KAAK,MAAM,MAAO,CAAC,EAAIZ,EAAMU,EAAIT,CAAI,CAAC,EAAGQ,CAAS,EAEtFb,EAAWgB,EAAM,IAAMA,EAEvB,KAAK,KAAKD,GAAYC,EAAM,EAC9B,CAWF,GAPA,OAAO,QAAQ,KAAK,IAAI,EAAE,QAAQ,CAAC,CAACD,EAAUtB,CAAE,IAAM,CAC/CmB,EAAO,IAAIG,CAAQ,IACtBf,EAAWP,GAAM,OACjB,OAAO,KAAK,KAAKsB,GAErB,CAAC,EAEG,OAAO,OAAOf,CAAU,EAAE,SAAW,EAGzC,OAAI,KAAK,kBACPA,EAAW,KAAK,MAAM,UAAY,CAChC,SAAU,CAAC,GAAG,KAAK,gBAAiB,GAAG,OAAO,OAAO,KAAK,IAAI,CAAC,CACjE,GAGK,CACL,SAAU,CACR,MAAO,CACL,CAACJ,GAAgB,CACf,OAAQI,CACV,CACF,EACA,WAAY,CACV,CAACJ,GAAgBK,CACnB,CACF,CACF,CACF,GAEAN,EAAA,cAAS,IAA8B,CACrC,GAAM,CAAE,cAAAC,CAAc,EAAI,KAAK,IACzBI,EAA2D,CAAC,EAGlE,cAAO,OAAO,KAAK,IAAI,EAAE,QAASP,GAAO,CACvCO,EAAWP,GAAM,MAEnB,CAAC,EAGDO,EAAW,KAAK,MAAM,IAAMiB,EAAAC,EAAA,GAAKlB,EAAW,KAAK,MAAM,KAA3B,CAAgC,MAAO,KAAK,MAAM,KAAM,GAEhF,KAAK,kBACPA,EAAW,KAAK,MAAM,UAAY,CAChC,SAAU,CAAC,GAAG,KAAK,gBAAiB,KAAK,MAAM,EAAE,CACnD,GAGK,CACL,SAAU,CACR,MAAO,CACL,CAACJ,GAAgB,CACf,OAAQI,CACV,CACF,EACA,WAAY,CACV,CAACJ,GAAgB,CACf,YAAa,CAAC,KAAK,MAAM,EAAE,CAC7B,CACF,CACF,CACF,CACF,GAEAD,EAAA,gBAAW,IAA6C,CACtD,GAAM,CAAE,cAAAC,CAAc,EAAI,KAAK,IAEzBuB,EAA+C,CAAC,EAEhDC,EAA8C,CAAC,EAE/CC,EAA6B,CAAC,EAuBpC,GArBA,OAAO,OAAO,KAAK,IAAI,EAAE,QAAS5B,GAAO,CACvC0B,EAAa1B,GAAM,OACnB2B,EAAY3B,GAAM,KAAK,IAAI,SAASA,CAAE,EACtC4B,EAAiB,KAAK5B,CAAE,CAE1B,CAAC,EAED0B,EAAa,KAAK,MAAM,IAAM,KAAK,MAG/B,KAAK,kBACPA,EAAa,KAAK,MAAM,UAAY,CAClC,SAAU,CAAC,GAAG,KAAK,gBAAiB,KAAK,MAAM,EAAE,CACnD,EAEAC,EAAY,KAAK,MAAM,UAAY,CACjC,SAAU,CAAC,GAAG,KAAK,gBAAiB,GAAG,OAAO,OAAO,KAAK,IAAI,CAAC,CACjE,GAIEC,EAAiB,SAAW,EAEhC,MAAO,CACL,GAAI,OACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACzB,GAAgB,CACf,OAAQuB,CACV,CACF,EACA,WAAY,CACV,CAACvB,GAAgB,CACf,YAAa,CAAC,EACd,UAAW,MACb,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CACf,OAAQwB,CACV,CACF,EACA,WAAY,CACV,CAACxB,GAAgB,CACf,YAAayB,EACb,UAAW,MACb,CACF,CACF,CACF,CACF,CACF,GAEA1B,EAAA,KAAQ,WAAW,CAAC2B,EAAiBC,IAAkB,CACrD,IAAMP,EAAQC,EAAAC,EAAA,GACT,KAAK,OADI,CAEZ,GAAI,SAAM,SAAS,EACnB,MAAAI,CACF,GAEA,OAAKC,GACCP,EAAM,kBACRA,EAAM,KAAO,IAIVA,CACT,GAlOE,KAAK,MAAQ,KAAK,IAAI,SAASvB,CAAE,EACjC,KAAK,KAAK,OAAS,KAAK,MAAM,GAC9B,KAAK,OAAS,KAAK,IAAI,eAAeA,CAAE,EACxC,KAAK,mBAAqB,CAAC,GAAG,KAAK,IAAI,WAAW,EAC9C,KAAK,MAAM,WAAa,KAAK,IAAI,gBACnC,KAAK,iBAAkBC,EAAA,KAAK,IACzB,SAAS,KAAK,MAAM,QAAQ,EAC5B,WAFoB,YAAAA,EAEV,OAAQD,GAAOA,IAAO,KAAK,MAAM,IAElD,CA0NF,EChQA,IAAA+B,GAAoB,qBAMb,IAAMC,GAAN,cAA4BC,EAAY,CAU7C,YAAYC,EAAeC,EAAiBC,EAAkBC,EAAY,cAAe,CACvF,MAAMH,CAAG,EAVXI,EAAA,sBACAA,EAAA,wBACAA,EAAA,mCACAA,EAAA,kBACAA,EAAA,gBACAA,EAAA,gBAAW,IACXA,EAAA,qBACAA,EAAA,iBAWAA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CA3BzC,IAAAC,EAAAC,EA4BI,GAAM,CACJ,aAAAC,EACA,IAAK,CAAE,cAAAC,EAAe,aAAAC,CAAa,CACrC,EAAI,KAEEC,EAAQ,KAAK,IAAI,SAAoCH,EAAa,EAAE,EAE1E,GAAIG,EAAM,SAAU,OAEpB,IAAMC,EAAUD,EAAM,QAEhBR,EAAW,KAAK,SAEhBU,EAAQ,OAAI,IAAIH,EAAcE,EAAQT,GAAU,KAAK,EAErDW,EAAgB,CACpB,CAACX,GAAWY,EAAAC,EAAA,GACPJ,EAAQT,IADD,CAEV,MAAO,OAAI,IAAI,OAAI,IAAIS,EAAQT,GAAU,MAAOU,CAAK,EAAGF,EAAM,KAAK,CACrE,EACF,EAGMM,GAASV,GAAAD,EAAAY,EAAK,aAAaP,CAAK,GAAE,iBAAzB,YAAAJ,EAAA,KAAAD,EAA0CK,EAAOG,GAEhE,GAAI,EAACG,EAEL,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACR,GAAgB,CACf,OAAQ,CACN,CAACE,EAAM,IAAKM,CACd,CACF,CACF,CACF,CACF,CACF,GAEAZ,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,aAAAG,EACA,IAAK,CAAE,cAAAC,CAAc,CACvB,EAAI,KAEJ,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CACf,OAAQ,CACN,CAACD,EAAa,IAAKA,CACrB,CACF,CACF,CACF,CACF,CACF,GAEAH,EAAA,gBAAW,IAA6C,CACtD,GAAM,CACJ,aAAAG,EACA,IAAK,CAAE,cAAAC,CAAc,CACvB,EAAI,KAEJ,MAAO,CACL,GAAI,KAAK,UACT,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CACf,OAAQ,CACN,CAACD,EAAa,IAAKA,CACrB,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACC,GAAgB,CACf,OAAQ,CACN,CAACD,EAAa,IAAKU,EAAK,kBAAkB,KAAK,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC,CACnF,CACF,CACF,CACF,CACF,CACF,CACF,GApGE,GAAM,CAAE,YAAAC,CAAY,EAAIlB,EACxB,KAAK,QAAU,CAAC,GAAGkB,CAAW,EAC9B,KAAK,SAAWhB,EAChB,KAAK,aAAe,KAAK,IAAI,SAASD,CAAO,EAC7C,KAAK,UAAYE,CACnB,CAgGF,ECvHA,IAAAgB,GAAsB,sBACtBC,GAAoB,qBAMb,IAAMC,GAAN,cAA4BC,EAAY,CAa7C,YAAYC,EAAe,CACzB,MAAMA,CAAG,EAbXC,EAAA,sBACAA,EAAA,8BACAA,EAAA,wBACAA,EAAA,aAAQ,CAAC,EAAG,CAAC,GACbA,EAAA,2BACAA,EAAA,qBACAA,EAAA,sBAIAA,EAAA,eAA4C,CAAC,GA2C7CA,EAAA,aAAQ,IAA2B,IAEnCA,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,mBAAAC,EACA,cAAAC,EACA,IAAK,CAAE,cAAAC,EAAe,aAAAC,EAAc,SAAAC,CAAS,CAC/C,EAAI,KAEEC,EAA2C,CAAC,EAE9CC,EAAiB,OAAI,MAAMN,EAAoBG,CAAY,EAAI,KAAK,aAExE,OAAIC,IACFE,EAAiB,SAAM,oBAAoBA,EAAgB,EAAE,GAI/DL,EAAc,QAAQ,CAAC,CAAE,OAAAM,EAAQ,MAAAC,CAAM,IAAM,CAC3C,GAAM,CAAE,SAAAC,EAAW,CAAE,EAAID,EACrBE,EAAa,EAEbN,IAEFM,EADwB,SAAM,oBAAoBD,EAAU,EAAE,EAC/BA,GAGjC,IAAME,EAASC,EAAK,wBAClBJ,EACAD,EACAP,EACAI,EAAWE,EAAiBI,EAAaJ,CAC3C,EAEIK,IACFN,EAAOG,EAAM,IAAMG,EAEvB,CAAC,EAED,KAAK,QAAUN,EAER,CACL,SAAU,CACR,MAAO,CACL,CAACH,GAAgB,CACf,OAAAG,CACF,CACF,CACF,CACF,CACF,GAEAN,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,cAAAE,EACA,IAAK,CAAE,cAAAC,CAAc,CACvB,EAAI,KAEEG,EAAkC,CAAC,EACzC,OAAAJ,EAAc,QAAQ,CAAC,CAAE,MAAAO,CAAM,IAAOH,EAAOG,EAAM,IAAMA,CAAM,EAExD,CACL,SAAU,CACR,MAAO,CACL,CAACN,GAAgB,CACf,OAAAG,CACF,CACF,CACF,CACF,CACF,GAEAN,EAAA,gBAAW,IAA6C,CACtD,GAAM,CACJ,cAAAE,EACA,IAAK,CAAE,cAAAC,CAAc,CACvB,EAAI,KAEEW,EAAe,CAAC,EAChBC,EAAc,KAAK,QAEzB,OAAAb,EAAc,QAAQ,CAAC,CAAE,MAAO,CAAE,GAAAc,EAAI,MAAAC,EAAO,SAAAP,EAAU,QAAAQ,CAAQ,CAAE,IAAM,CACrEJ,EAAaE,GAAM,CAAE,MAAAC,EAAO,SAAAP,EAAU,QAAAQ,CAAQ,CAChD,CAAC,EAEM,CACL,GAAI,SACJ,OAAQ,CACN,SAAU,CACR,MAAO,CACL,CAACf,GAAgB,CACf,OAAQW,CACV,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,MAAO,CACL,CAACX,GAAgB,CACf,OAAQY,CACV,CACF,CACF,CACF,CACF,CACF,GAhJE,GAAM,CACJ,IAAK,CAAE,cAAAZ,EAAe,UAAAgB,EAAW,YAAAC,CAAY,CAC/C,EAAI,KAEElB,EAAgBW,EAAK,0BAA0Bd,EAAI,MAAOI,CAAa,EAAE,OAC5EM,GAAU,CAACA,EAAM,QACpB,EAEA,GAAIP,EAAc,SAAW,EAC3B,MAAM,MAAM,qBAAqB,EAGnC,GAAIH,EAAI,aAAa,cAAgBoB,EAAU,YAAa,CAC1D,GAAIpB,EAAI,aAAa,SAAW,OAC9B,MAAM,MAAM,uCAAuC,EAGrD,KAAK,mBAAqBA,EAAI,aAAa,MAC7C,MACE,KAAK,mBAAqB,SAAM,gBAC9B,SAAM,gBAAgBG,EAAc,IAAIW,EAAK,SAAS,CAAC,CACzD,EACAd,EAAI,aAAa,YAAcoB,EAAU,YACzCpB,EAAI,aAAa,OAAS,KAAK,mBAGjC,KAAK,cAAgBG,EAClB,OAAQO,GAAUA,EAAM,WAAa,MAAS,EAC9C,IAAKA,IACG,CACL,MAAAA,EACA,OAAQ,KAAK,IAAI,aAAaA,CAAK,EAAE,UAAUA,CAAK,CACtD,EACD,EAEH,KAAK,aAAe,OAAI,MAAM,KAAK,mBAAoBW,CAAW,CACpE,CA6GF,ECxKA,IAAAC,GAA8D,sBAE9DC,GAAoB,qBAgBb,IAAMC,GAAN,cAA+BC,EAAY,CAqBhD,YACEC,EACOC,EAA+C,kBAAe,YAC9DC,EAAW,GAClB,CACA,MAAMF,CAAG,EAHF,mBAAAC,EACA,cAAAC,EAvBTC,EAAA,yBACAA,EAAA,wBACAA,EAAA,8BACAA,EAAA,cAAS,GACTA,EAAA,cAAS,GACTA,EAAA,sBACAA,EAAA,wBACAA,EAAA,2BACAA,EAAA,oBAKAA,EAAA,0BACAA,EAAA,+BACAA,EAAA,4BACAA,EAAA,gBAAqB,CAAE,MAAO,OAAQ,GACtCA,EAAA,iBAAY,CAAC,EAAG,CAAC,GACjBA,EAAA,aAAQ,GAmDRA,EAAA,aAAQ,IAA8B,CACpC,KAAK,SAAW,CACd,MAAO,QACP,OAAQ,KAAK,IAAI,OACd,OAAQC,GAAU,CAAC,KAAK,gBAAgB,SAASA,EAAM,EAAE,CAAC,EAC1D,IAAKA,GAAU,SAAM,oBAAoBC,EAAK,iBAAiBD,CAAK,CAAC,CAAC,CAC3E,CAGF,GAEAD,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,cAAAF,EACA,YAAAK,EACA,oBAAAC,EACA,uBAAAC,EACA,IAAK,CACH,cAAAC,EACA,UAAW,CAAE,OAAAC,CAAO,EACpB,SAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,EACA,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAU,CAAE,WAAAC,EAAY,SAAAC,CAAS,CACnC,CACF,EAAI,KAEEC,EAAS,CAAC,EAEVC,EAAQN,EACV,OAAI,IAAI,OAAI,IAAIJ,EAAcE,CAAW,EAAG,CAAC,EAC7C,OAAI,IAAIF,EAAcE,CAAW,EAEjCS,EAAY,SAAM,0BACpBhB,EACAN,EACAqB,EACA,EACAP,GAAYP,CACd,EAEIQ,IACFO,EAAYC,IAAA,GACPD,GACA,SAAM,aAAaA,EAAW,SAAM,gBAAgBhB,CAAmB,CAAC,IAI3Ea,IACFG,EAAYC,IAAA,GACPD,GACA,SAAM,iBAAiBA,EAAWL,CAAW,IAQpD,IAAMO,EAFQ,OAAI,KAAKb,EAAcC,CAAa,EAEtB,KAAK,MAEjC,KAAK,MAAQ,KAAK,MAAQY,GAAeA,EAAc,EAAI,GAAM,KAEjE,IAAIC,EAA0B,CAAC,EAE/B,IACIP,GAAc,CAACF,GAAa,CAACE,GAAcF,IAC7C,KAAK,MAAQP,EAAO,KAAO,IAC3B,KAAK,SAAS,QAAU,QACxB,CACA,IAAMiB,EAAa,SAAM,cACvB,SAAM,oBAAoBJ,CAAS,EACnC,KAAK,SAAS,OAAO,OAClBK,GAAW,SAAM,cAAcjB,EAAUiB,CAAM,GAAK,SAAM,cAAcjB,EAAUiB,CAAM,CAC3F,EACA,EAAgBlB,EAAO,IACzB,EAEIiB,IACFD,EAAYC,EAAW,UAEvBJ,EAAY,SAAM,0BAChBhB,EACAN,EACA,OAAI,IAAIqB,EAAOK,EAAW,MAAM,EAChC,EACAZ,GAAYP,CACd,EAEJ,CAIA,YAAK,OAASe,EAAU,OACxB,KAAK,OAASA,EAAU,OAExBjB,EAAY,QAAQ,CAAC,CAAE,aAAAuB,EAAc,mBAAAC,EAAoB,gBAAAC,CAAgB,IAAM,CAC7E,IAAIC,EAAiB,SAAM,kCACzBT,EACAhB,EACAuB,EACA,KAAK,OAAS,EACd,KAAK,OAAS,CAChB,EAEIV,IACFY,EAAiB,SAAM,iBAAiBA,EAAgBd,CAAW,GAGrE,IAAMe,EAAa5B,EAAK,UAAU,KAAK,IAAI,SAASwB,EAAa,EAAE,EAAGG,EAAgB,CACpF,KAAM,KAAK,cACX,aAAAH,EACA,OAAQ,KAAK,OACb,OAAQ,KAAK,OACb,gBAAAE,CACF,CAAC,EAEDV,EAAOQ,EAAa,IAAMI,CAC5B,CAAC,EAEM,CACL,SAAU,CACR,UAAAP,CACF,EACA,SAAU,CACR,MAAO,CACL,CAACjB,GAAgB,CACf,OAAAY,CACF,CACF,CACF,CACF,CACF,GAEAlB,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,YAAAG,EACA,IAAK,CAAE,cAAAG,CAAc,CACvB,EAAI,KAEEY,EAAS,CAAC,EAEhB,OAAI,KAAK,SACPf,EAAY,QAASF,GAAWiB,EAAOjB,EAAM,aAAa,IAAM,MAAU,EAE1EE,EAAY,QAASF,GAAWiB,EAAOjB,EAAM,aAAa,IAAMA,EAAM,YAAa,EAG9E,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACK,GAAgB,CACf,OAAAY,CACF,CACF,EACA,WAAY,CACV,CAACZ,GAAgB,CACf,YAAa,KAAK,SAAW,CAAC,EAAIH,EAAY,IAAKF,GAAUA,EAAM,aAAa,EAAE,CACpF,CACF,CACF,CACF,CACF,GAEAD,EAAA,gBAAW,IAA6C,CACtD,GAAM,CACJ,SAAAD,EACA,YAAAI,EACA,kBAAA4B,EACA,IAAK,CAAE,cAAAzB,CAAc,CACvB,EAAI,KAEJ,GAAI,CAACyB,EAAmB,OAExB,GAAI,KAAK,UAAY,OAAI,KAAK,KAAK,IAAI,YAAa,KAAK,IAAI,YAAY,EAAI,EAC3E,OAAO,KAAK,OAAO,EAGrB,IAAMC,EAAoD,CAAC,EACrDC,EAAuC,CAAC,EAE1CC,EACAC,EAEJ,OAAIpC,GACFmC,EAAoB,CAAC,EACrBC,EAAmB,CAAC,EACpBhC,EAAY,QAAQ,CAAC,CAAE,aAAAuB,CAAa,IAAM,CACxCM,EAAaN,EAAa,IAAM,OAChCO,EAAYP,EAAa,IAAM,KAAK,IAAI,SAASA,EAAa,EAAE,CAClE,CAAC,IAEDQ,EAAoB,KAAK,mBACzBC,EAAmB,KAAK,mBACxBhC,EAAY,QAAQ,CAAC,CAAE,aAAAuB,CAAa,IAAM,CACxCM,EAAaN,EAAa,IAAMA,EAChCO,EAAYP,EAAa,IAAM,KAAK,IAAI,SAASA,EAAa,EAAE,CAClE,CAAC,GAGI,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACpB,GAAgB,CACf,OAAQ0B,CACV,CACF,EACA,WAAY,CACV,CAAC1B,GAAgB,CACf,YAAa4B,EACb,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAAC5B,GAAgB,CACf,OAAQ2B,CACV,CACF,EACA,WAAY,CACV,CAAC3B,GAAgB,CACf,YAAa6B,EACb,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,CACF,CACF,GApSE,KAAK,mBAAqB,CAAC,GAAG,KAAK,IAAI,WAAW,EAClD,KAAK,IAAI,aAAa,YAAc,CAAC,GAAG,KAAK,kBAAkB,EAE/D,KAAK,cAAgBjC,EAAK,0BACxB,KAAK,IAAI,MACT,KAAK,IAAI,aACX,EAAE,OAAQD,GAAU,CAACA,EAAM,QAAQ,EAEnC,KAAK,gBAAkB,KAAK,cAAc,IAAKA,GAAUA,EAAM,EAAE,EAEjE,KAAK,kBAAoB,KAAK,cAAc,OAAS,EAErD,KAAK,uBAAyB,KAAK,cAAc,MAC9CA,GAAUA,EAAM,qBAAuBC,EAAK,aAAaD,CAAK,EAAE,mBACnE,EAEA,IAAMmC,EAAe,OAAO,YAC1B,KAAK,cAAc,IAAKnC,GAAU,CAACA,EAAM,GAAIC,EAAK,UAAUD,CAAK,CAAC,CAAC,CACrE,EAEMoC,EAAY,OAAO,OAAOD,CAAY,EAE5C,KAAK,oBAAsB,SAAM,gBAAgBC,CAAS,EAE1D,IAAMC,EAAqB,SAAM,oBAAoBD,EAAU,IAAI,SAAM,eAAe,CAAC,EAIzF,KAAK,YAAc,KAAK,cAAc,IAAKpC,GAAU,CACnD,IAAM0B,EAAqBS,EAAanC,EAAM,IACxCsC,EAAK,SAAM,gBAAgBZ,CAAkB,EAE7Ca,GAAMD,EAAG,GAAKD,EAAmB,MAAQA,EAAmB,MAC5DG,GAAMF,EAAG,GAAKD,EAAmB,MAAQA,EAAmB,OAElE,MAAO,CACL,aAAcrC,EACd,mBAAA0B,EACA,gBAAiB,CAACa,EAAIC,CAAE,CAC1B,CACF,CAAC,CACH,CA4PF,EClVA,IAAAC,GAOO,sBACPC,GAAoB,qBAgBb,IAAMC,GAAN,cAAqCC,EAAY,CAetD,YACEC,EACAC,EACAC,EACAC,EAAW,GACX,CACA,MAAMH,CAAG,EApBXI,EAAA,+BACAA,EAAA,8BACAA,EAAA,wBACAA,EAAA,sBACAA,EAAA,cAAS,GACTA,EAAA,cAAS,GACTA,EAAA,iBACAA,EAAA,qBACAA,EAAA,2BACAA,EAAA,4BACAA,EAAA,gBAAqB,CAAE,MAAO,OAAQ,GACtCA,EAAA,iBAAY,CAAC,EAAG,CAAC,GACjBA,EAAA,aAAQ,GAmBRA,EAAA,aAAQ,IAA8B,CACpC,KAAK,SAAW,CACd,MAAO,QACP,OAAQ,KAAK,IAAI,OACd,OAAQC,GAAUA,EAAM,KAAO,KAAK,aAAa,EAAE,EACnD,IAAKA,GAAU,SAAM,oBAAoBC,EAAK,iBAAiBD,CAAK,CAAC,CAAC,CAC3E,CAGF,GAEAD,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,cAAAF,EACA,aAAAK,EACA,mBAAAC,EACA,IAAK,CACH,SAAU,CAAE,WAAAC,EAAY,SAAAC,CAAS,EACjC,cAAAC,EACA,UAAW,CAAE,OAAAC,CAAO,EACpB,SAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,EACA,YAAAC,EACA,SAAAC,EACA,OAAAC,EACA,QAAAC,CACF,CACF,EAAI,KAEJ,GAAIb,EAAa,SAAU,OAE3B,IAAMc,EAAS,CAAC,EAEVC,EAAQH,EACV,OAAI,IAAI,OAAI,IAAIL,EAAcE,CAAW,EAAG,CAAC,EAC7C,OAAI,IAAIF,EAAcE,CAAW,EAE/BX,EAAQ,KAAK,IAAI,SAASE,EAAa,EAAE,EAEzCgB,EAAQjB,EAAK,aAAaD,CAAK,EAEjCmB,EAAY,SAAM,0BACpBhB,EACAN,EACAoB,EACAjB,EAAM,SACNa,GAAYb,EAAM,qBAAuBkB,EAAM,mBACjD,EAEIJ,IACFK,EAAYC,IAAA,GACPD,GACA,SAAM,aAAaA,EAAW,SAAM,gBAAgBhB,CAAkB,CAAC,IAI1EE,IACFc,EAAYC,IAAA,GACPD,GACA,SAAM,iBAAiBA,EAAWP,CAAW,IAQpD,IAAMS,EAFQ,OAAI,KAAKZ,EAAcC,CAAa,EAEtB,KAAK,MAEjC,KAAK,MAAQ,KAAK,MAAQW,GAAeA,EAAc,EAAI,GAAM,KAEjE,IAAIC,EAA0B,CAAC,EAE/B,IACIlB,GAAc,CAACW,GAAa,CAACX,GAAcW,IAC7C,CAACb,EAAa,UACd,KAAK,MAAQK,EAAO,KAAO,IAC3B,KAAK,SAAS,QAAU,QACxB,CACA,IAAMgB,EAAa,SAAM,cACvB,SAAM,oBAAoBJ,CAAS,EACnC,KAAK,SAAS,OAAO,OAClBK,GAAW,SAAM,cAAchB,EAAUgB,CAAM,GAAK,SAAM,cAAchB,EAAUgB,CAAM,CAC3F,EACA,EAAgBjB,EAAO,IACzB,EAEIgB,IACFD,EAAYC,EAAW,UAEvBJ,EAAY,SAAM,0BAChBhB,EACAN,EACA,OAAI,IAAIoB,EAAOM,EAAW,MAAM,EAChCvB,EAAM,SACNa,GAAYb,EAAM,qBAAuBkB,EAAM,mBACjD,EAEJ,CAEA,IAAMO,EAAaxB,EAAK,aAAaD,CAAK,EAAE,gBAAgBA,EAAOmB,EAAW,CAC5E,aAAAjB,EACA,KAAM,KAAK,cACX,OAAQiB,EAAU,OAClB,OAAQA,EAAU,OAClB,gBAAiB,CAAC,GAAK,EAAG,CAC5B,CAAC,EAED,OAAIM,IACFT,EAAOhB,EAAM,IAAMyB,GAGjBpB,GAAYoB,GAAcA,EAAW,QACvCA,EAAW,MAAQ,OAAI,KAAKA,EAAW,MAAOb,CAAW,GAGpD,CACL,SAAU,CACR,UAAAU,CACF,EACA,SAAU,CACR,MAAO,CACL,CAAChB,GAAgB,CACf,OAAAU,CACF,CACF,CACF,CACF,CACF,GAEAjB,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,aAAAG,EACA,IAAK,CAAE,cAAAI,CAAc,CACvB,EAAI,KAEEU,EAAS,CAAC,EAEhB,OAAI,KAAK,SACPA,EAAOd,EAAa,IAAM,OAE1Bc,EAAOd,EAAa,IAAMA,EAGrB,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACI,GAAgB,CACf,OAAAU,CACF,CACF,EACA,WAAY,CACV,CAACV,GAAgB,CACf,YAAa,KAAK,SAAW,CAAC,EAAI,CAACJ,EAAa,EAAE,CACpD,CACF,CACF,CACF,CACF,GAEAH,EAAA,gBAAW,IAA6C,CACtD,GAAM,CACJ,aAAAG,EACA,IAAK,CAAE,cAAAI,CAAc,CACvB,EAAI,KAEJ,GAAIJ,EAAa,SAAU,OAE3B,GAAI,KAAK,UAAY,OAAI,KAAK,KAAK,IAAI,YAAa,KAAK,IAAI,YAAY,EAAI,EAC3E,OAAO,KAAK,OAAO,EAGrB,IAAMwB,EAAe,CAAC,EAChBC,EAAc,CAAC,EAErB,OAAAD,EAAaxB,EAAa,IAAM,KAAK,SAAW,OAAYA,EAE5DyB,EAAYzB,EAAa,IAAMD,EAAK,kBAAkB,KAAK,IAAI,SAASC,EAAa,EAAE,CAAC,EAEjF,CACL,GAAI,mBACJ,OAAQ,CACN,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACI,GAAgB,CACf,OAAQoB,CACV,CACF,EACA,WAAY,CACV,CAACpB,GAAgB,CACf,YAAa,KAAK,SAAW,CAAC,EAAI,CAACJ,EAAa,EAAE,EAClD,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACI,GAAgB,CACf,OAAQqB,CACV,CACF,EACA,WAAY,CACV,CAACrB,GAAgB,CACf,YAAa,CAACJ,EAAa,EAAE,EAC7B,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,CACF,CACF,GA3OE,KAAK,SAAWJ,EAChB,KAAK,cAAgBD,EAErB,IAAMG,EAAQ,KAAK,IAAI,SAASJ,CAAE,EAClC,KAAK,aAAeI,EACpB,KAAK,mBAAqBC,EAAK,UAAUD,CAAK,EAC9C,KAAK,oBAAsBC,EAAK,iBAAiBD,CAAK,EACtD,KAAK,IAAI,aAAa,YAAc,CAACA,EAAM,EAAE,CAC/C,CAoOF,EC1RA,IAAA4B,GAA6E,sBAC7EC,GAAoB,qBAwCb,IAAMC,GAAN,cAA+BC,EAAY,CA2BhD,YAAYC,EAAeC,EAAW,GAAOC,EAA4C,GAAO,CAC9F,MAAMF,CAAG,EA3BXG,EAAA,wBACAA,EAAA,yBACAA,EAAA,6BACAA,EAAA,aAAQ,CAAC,EAAG,CAAC,GACbA,EAAA,YAAO,CAAC,EAAG,CAAC,GACZA,EAAA,iBAAY,CAAC,EAAG,CAAC,GACjBA,EAAA,aAAQ,GACRA,EAAA,iBAAuB,CACrB,MAAO,OACT,GACAA,EAAA,gBAAqB,CACnB,MAAO,OACT,GACAA,EAAA,iBAA0B,CAAC,GAC3BA,EAAA,iBAAY,IACZA,EAAA,iBACAA,EAAA,aAEAA,EAAA,mBACAA,EAAA,0BACAA,EAAA,2BACAA,EAAA,4BACAA,EAAA,sBACAA,EAAA,8BACAA,EAAA,yBA6DAA,EAAA,aAAQ,IAA8B,CACpC,GAAM,CACJ,iBAAAC,EACA,WAAAC,EACA,IAAK,CAAE,cAAAC,EAAe,KAAAC,CAAK,CAC7B,EAAI,KAEEC,EAAkC,CAAC,EACnCC,EAAoC,CAAC,EAgB3C,GAdA,OAAO,OAAOF,EAAK,MAAM,EAAE,QAASG,GAAU,CAC5C,IAAMC,EAAS,SAAM,oBAAoBC,EAAK,iBAAiBF,CAAK,CAAC,EACrEF,EAAU,KAAKG,CAAM,EAChBN,EAAW,IAAIK,EAAM,EAAE,GAC1BD,EAAY,KAAKE,CAAM,CAE3B,CAAC,EAED,KAAK,SAAW,CACd,MAAO,QACP,OAAQH,EACR,OAAQC,CACV,EAEIL,EAAiB,SAAW,EAAG,OAEnC,IAAMS,EAAiD,CAAC,EAClDC,EAA6C,CAAC,EAEpD,OAAAV,EAAiB,QAASW,GAAY,CACpCF,EAAaE,EAAQ,IAAM,OAC3B,IAAMC,EAAY,KAAK,IAAI,SAASD,EAAQ,MAAM,EAClDD,EAAWC,EAAQ,QAAU,CAC3B,QAASE,EAAAC,EAAA,GACJF,EAAU,SADN,CAEP,CAACD,EAAQ,UAAWE,EAAAC,EAAA,GAEfF,EAAU,QAAQD,EAAQ,WAFX,CAGlB,UAAW,MACb,EACF,EACF,CACF,CAAC,EAEM,CACL,SAAU,CACR,MAAO,CACL,CAACT,GAAgB,CACf,SAAUO,EACV,OAAQC,CACV,CACF,CACF,CACF,CACF,GAEAX,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,sBAAAgB,EACA,cAAAC,EACA,oBAAAC,EACA,iBAAAjB,EACA,IAAK,CACH,UAAW,CAAE,OAAAkB,CAAO,EACpB,SAAU,CAAE,WAAAC,EAAY,SAAAC,CAAS,EACjC,cAAAlB,EACA,SAAAmB,EACA,YAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,EACA,OAAAC,EACA,SAAAC,EACA,QAAAC,EACA,YAAAC,CACF,CACF,EAAI,KAEEpB,EAAiD,CAAC,EAClDC,EAA6C,CAAC,EAC9CoB,EAAoC,CAAC,EAEvCC,EAAQ,OAAI,IAAIR,EAAcE,CAAW,EAEzCO,EAAmB,GAElB,KAAK,WACJN,GAAU,CAAC,KAAK,WAClB,KAAK,UAAY,GACjBM,EAAmB,IACV,CAACN,GAAU,KAAK,YACzB,KAAK,UAAY,GACjBM,EAAmB,KAInBL,IACE,KAAK,IAAII,EAAM,EAAE,EAAI,KAAK,IAAIA,EAAM,EAAE,EACxCA,EAAM,GAAK,EAEXA,EAAM,GAAK,GAgBf,IAAME,EAFQ,OAAI,KAAKV,EAAcC,CAAa,EAE3B,KAAK,MAM5B,GAJA,KAAK,MAAQ,KAAK,MAAQS,GAAUA,EAAS,EAAI,GAAM,KAEvD,KAAK,UAAY,CAAC,GAGdd,GAAc,CAACS,GAAa,CAACT,GAAcS,IAC7C,KAAK,MAAQV,EAAO,KAAO,IAC3B,KAAK,SAAS,QAAU,QACxB,CACA,IAAMgB,EAAa,SAAM,cACvB,SAAM,oBACJd,EACI,SAAM,iBAAiB,SAAM,gBAAgBH,EAAqBc,CAAK,EAAGF,CAAW,EACrF,SAAM,gBAAgBZ,EAAqBc,CAAK,CACtD,GACC,KAAK,UAAY,KAAK,SAAS,OAAS,KAAK,SAAS,QAAQ,OAAQxB,GAC9D,SAAM,cAAcc,EAAUd,CAAM,GAAK,SAAM,cAAcc,EAAUd,CAAM,CACrF,EACD,EAAgBW,EAAO,IACzB,EAEIgB,IACF,KAAK,UAAYA,EAAW,UAC5BH,EAAQ,OAAI,IAAIA,EAAOG,EAAW,MAAM,EAE5C,CAYA,GAHA,KAAK,KAAOH,EAGR,KAAK,UAEP,GAAIC,EAAkB,CAKpB,GAJI,KAAK,UAAU,QAAU,SAC3B,KAAK,gBAAgB,EAGnB,KAAK,UAAU,QAAU,QAC3B,MAAM,MAGR,GAAM,CAAE,OAAAG,EAAQ,eAAAC,CAAe,EAAI,KAAK,UAExC,KAAK,UAAY,GAGjBpC,EAAiB,QAASW,GAAaF,EAAaE,EAAQ,IAAMA,CAAQ,EAG1EK,EAAc,QAASV,GAAWI,EAAWJ,EAAM,IAAM,CAAE,MAAOA,EAAM,KAAM,CAAE,EAGhF6B,EAAO,QAASE,GAAU,CAhTlC,IAAAC,EAoTU,GAHA5B,EAAW2B,EAAM,IAAMvB,EAAA,GAAKuB,GAGxBA,EAAM,WAAanC,GAAiB,CAACoB,EAAY,SAASe,EAAM,QAAQ,EAAG,CAC7E,IAAME,KACJD,EAAA5B,EAAW2B,EAAM,YAAjB,YAAAC,EAA4B,WAAYvB,EAAsBsB,EAAM,UAEjEE,GAAS,SAASF,EAAM,EAAE,IAC7B3B,EAAW2B,EAAM,UAAYxB,EAAAC,EAAA,GACxBJ,EAAW2B,EAAM,WADO,CAE3B,SAAU,CAAC,GAAGE,GAAUF,EAAM,EAAE,CAClC,GAEJ,CACF,CAAC,EAGD,QAAW1B,KAAWyB,EACpB3B,EAAaE,EAAQ,IAAMA,EAI7BmB,EAAc,YAAcK,EAAO,IAAKE,GAAUA,EAAM,EAAE,EAG1DF,EAAO,QAASE,GAAU,CACxB3B,EAAW2B,EAAM,IAAMxB,EAAAC,EAAA,GAClBuB,GADkB,CAErB,MAAOjB,EACH,OAAI,KAAK,OAAI,QAAQ,OAAI,IAAIiB,EAAM,MAAON,CAAK,CAAC,EAAGF,CAAW,EAC9D,OAAI,QAAQ,OAAI,IAAIQ,EAAM,MAAON,CAAK,CAAC,CAC7C,EACF,CAAC,CACH,KAAO,CACL,GAAI,KAAK,UAAU,QAAU,QAAS,MAAM,MAE5C,GAAM,CAAE,OAAAI,CAAO,EAAI,KAAK,UAExBA,EAAO,QAASE,GAAU,CACxB3B,EAAW2B,EAAM,IAAM,CACrB,MAAOjB,EACH,OAAI,KAAK,OAAI,QAAQ,OAAI,IAAIiB,EAAM,MAAON,CAAK,CAAC,EAAGF,CAAW,EAC9D,OAAI,QAAQ,OAAI,IAAIQ,EAAM,MAAON,CAAK,CAAC,CAC7C,CACF,CAAC,CACH,SAKIC,EAAkB,CACpB,GAAI,KAAK,UAAU,QAAU,QAAS,MAAM,MAE5C,GAAM,CAAE,OAAAG,EAAQ,eAAAC,CAAe,EAAI,KAAK,UAExC,KAAK,UAAY,GAGjBpC,EAAiB,QAASW,GAAaF,EAAaE,EAAQ,IAAM,MAAU,EAG5EwB,EAAO,QAASE,GAAU,CACpBA,EAAM,WAAanC,IACrBQ,EAAW2B,EAAM,UAAYxB,EAAAC,EAAA,GACxBJ,EAAW2B,EAAM,WADO,CAE3B,SAAUtB,EAAsBsB,EAAM,SACxC,GAEJ,CAAC,EAGDF,EAAO,QAASE,GAAW3B,EAAW2B,EAAM,IAAM,MAAU,EAG5DrB,EAAc,QAASV,GAAU,CAC/BI,EAAWJ,EAAM,IAAM,CACrB,MAAOc,EACH,OAAI,KAAK,OAAI,QAAQ,OAAI,IAAId,EAAM,MAAOyB,CAAK,CAAC,EAAGF,CAAW,EAC9D,OAAI,QAAQ,OAAI,IAAIvB,EAAM,MAAOyB,CAAK,CAAC,CAC7C,CACF,CAAC,EAGD,QAAWpB,KAAWyB,EACpB3B,EAAaE,EAAQ,IAAM,OAI7BmB,EAAc,YAAcd,EAAc,IAAKV,GAAUA,EAAM,EAAE,CACnE,MAEEU,EAAc,QAASV,GAAU,CAG/BI,EAAWJ,EAAM,IAAM,CACrB,MAAOc,EACH,OAAI,KAAK,OAAI,QAAQ,OAAI,IAAId,EAAM,MAAOyB,CAAK,CAAC,EAAGF,CAAW,EAC9D,OAAI,QAAQ,OAAI,IAAIvB,EAAM,MAAOyB,CAAK,CAAC,CAC7C,CACF,CAAC,EAIL,MAAO,CACL,SAAU,CACR,UAAW,KAAK,SAClB,EACA,SAAU,CACR,MAAO,CACL,CAAC7B,GAAgB,CACf,OAAQQ,EACR,SAAUD,CACZ,CACF,EACA,WAAY,CACV,CAACP,GAAgB4B,CACnB,CACF,CACF,CACF,GAEA/B,EAAA,cAAS,IAA8B,CACrC,GAAM,CACJ,cAAAiB,EACA,mBAAAwB,EACA,iBAAAxC,EACA,IAAK,CAAE,cAAAE,CAAc,CACvB,EAAI,KAEEO,EAA+D,CAAC,EAChEC,EAA2D,CAAC,EAC5DoB,EAAsC,CAC1C,UAAW,OACX,UAAW,MACb,EAqBA,GAnBI,KAAK,UACPd,EAAc,QAAQ,CAAC,CAAE,GAAAyB,CAAG,IAAO/B,EAAW+B,GAAM,MAAU,EAC9DX,EAAc,YAAc,CAAC,IAG7Bd,EAAc,QACZ,CAAC,CAAE,GAAAyB,EAAI,MAAAC,EAAO,QAAAC,CAAQ,IACnBjC,EAAW+B,GAAME,EACb9B,EAAAC,EAAA,GAAKJ,EAAW+B,IAAhB,CAAqB,MAAAC,EAAO,QAAAC,CAAQ,GACrC9B,EAAAC,EAAA,GAAKJ,EAAW+B,IAAhB,CAAqB,MAAAC,CAAM,EACnC,EACAZ,EAAc,YAAcU,EAG5BxC,EAAiB,QAASW,GAAY,CACpCF,EAAaE,EAAQ,IAAMA,CAC7B,CAAC,GAGC,KAAK,UAAU,QAAU,QAAS,CACpC,GAAM,CAAE,OAAAwB,EAAQ,eAAAC,CAAe,EAAI,KAAK,UAExCD,EAAO,QAASE,GAAW3B,EAAW2B,EAAM,IAAM,MAAU,EAG5DD,EAAe,QAASzB,GAAaF,EAAaE,EAAQ,IAAM,MAAU,CAC5E,CAEA,MAAO,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACT,GAAgB,CACf,OAAQQ,EACR,SAAUD,CACZ,CACF,EACA,WAAY,CACV,CAACP,GAAgB4B,CACnB,CACF,CACF,CACF,GAEA/B,EAAA,gBAAW,IAA6C,CACtD,GAAM,CACJ,cAAAiB,EACA,sBAAAD,EACA,iBAAAf,EACA,IAAK,CAAE,cAAAE,CAAc,CACvB,EAAI,KAEE0C,EAAmD,CAAC,EACpDC,EAA+C,CAAC,EAEhDC,EAAkD,CAAC,EACnDC,EAA8C,CAAC,EAErD,GAAI,KAAK,UAAW,CAKlB,GAJI,KAAK,UAAU,QAAU,SAC3B,KAAK,gBAAgB,EAGnB,KAAK,UAAU,QAAU,QAAS,MAAM,MAC5C,GAAM,CAAE,OAAAZ,EAAQ,eAAAC,CAAe,EAAI,KAAK,UAGxCD,EAAO,QAASE,GAAU,CACxBQ,EAAaR,EAAM,IAAM,OAEzBU,EAAYV,EAAM,IAAM,KAAK,IAAI,SAASA,EAAM,EAAE,EAE9CA,EAAM,WAAanC,IACrB2C,EAAaR,EAAM,UAAYxB,EAAAC,EAAA,GAC1B+B,EAAaR,EAAM,WADO,CAE7B,SAAUtB,EAAsBsB,EAAM,SACxC,GAEAU,EAAYV,EAAM,UAAYxB,EAAAC,EAAA,GACzBiC,EAAYV,EAAM,WADO,CAE5B,SAAU,KAAK,IAAI,SAAqBA,EAAM,QAAQ,EAAE,QAC1D,GAEJ,CAAC,EAGDD,EAAe,QAASzB,GAAY,CAClCiC,EAAejC,EAAQ,IAAM,OAC7BmC,EAAcnC,EAAQ,IAAM,KAAK,IAAI,WAAWA,EAAQ,EAAE,CAC5D,CAAC,CACH,MAEEK,EAAc,QAASV,GAAU,CAC/BuC,EAAavC,EAAM,IAAM,KAAK,SAC1B,OACAO,EAAAC,EAAA,GACK+B,EAAavC,EAAM,KADxB,CAEE,MAAOA,EAAM,KACf,GAEJyC,EAAYzC,EAAM,IAAMQ,IAAA,GACnBiC,EAAYzC,EAAM,KACjB,KAAK,SACL,KAAK,IAAI,SAASA,EAAM,EAAE,EAC1B,CAAE,MAAO,KAAK,IAAI,SAASA,EAAM,EAAE,EAAE,KAAM,EAEnD,CAAC,EAIH,OAAAN,EAAiB,QAASW,GAAY,CAziB1C,IAAA2B,EAAAU,EAAAC,EAAAC,EAAAC,EA0iBMP,EAAejC,EAAQ,IAAMA,EAE7BkC,EAAalC,EAAQ,QAAUE,EAAAC,EAAA,GAC1B+B,EAAalC,EAAQ,SADK,CAE7B,GAAIA,EAAQ,OACZ,QAASE,EAAAC,EAAA,IACJwB,EAAAO,EAAalC,EAAQ,UAArB,YAAA2B,EAA8B,SAD1B,CAEP,CAAC3B,EAAQ,UAAWE,EAAAC,EAAA,IACfmC,GAAAD,EAAAH,EAAalC,EAAQ,UAArB,YAAAqC,EAA8B,UAA9B,YAAAC,EAAwCtC,EAAQ,WADjC,CAElB,UAAWA,EAAQ,EACrB,EACF,EACF,GAEAoC,EAAYpC,EAAQ,QAAUE,EAAAC,EAAA,GACzBiC,EAAYpC,EAAQ,SADK,CAE5B,GAAIA,EAAQ,OACZ,QAASE,EAAAC,EAAA,GAEJiC,EAAYpC,EAAQ,QAAQ,SAFxB,CAGP,CAACA,EAAQ,UAAWE,EAAAC,EAAA,IACfqC,GAAAD,EAAAH,EAAYpC,EAAQ,UAApB,YAAAuC,EAA6B,UAA7B,YAAAC,EAAuCxC,EAAQ,WADhC,CAElB,UAAW,MACb,EACF,EACF,EACF,CAAC,EAEDX,EAAiB,QAASW,GAAamC,EAAcnC,EAAQ,IAAM,MAAU,EAEtE,CACL,GAAI,YACJ,OAAQ,CACN,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACT,GAAgB,CACf,OAAQ2C,EACR,SAAUD,CACZ,CACF,EACA,WAAY,CACV,CAAC1C,GAAgB,CACf,YAAa,KAAK,SAAW,CAAC,EAAI,CAAC,GAAG,KAAK,kBAAkB,CAC/D,CACF,CACF,CACF,EACA,MAAO,CACL,SAAU,CACR,UAAW,CAAC,CACd,EACA,SAAU,CACR,MAAO,CACL,CAACA,GAAgB,CACf,OAAQ6C,EACR,SAAUD,CACZ,CACF,EACA,WAAY,CACV,CAAC5C,GAAgB,CACf,YAAa,CAAC,GAAG,KAAK,IAAI,WAAW,CACvC,CACF,CACF,CACF,CACF,CACF,GAEAH,EAAA,KAAQ,kBAAkB,IAAM,CAI9B,GAAM,CACJ,cAAAiB,EACA,sBAAAD,EACA,IAAK,CAAE,YAAAO,EAAa,cAAApB,EAAe,KAAAC,CAAK,CAC1C,EAAI,KAEEiD,EAAmC,CAAC,EACpCC,EAA4C,CAAC,EAC7CjB,EAA8B,CAAC,EAG/BD,EAAoB,CAAC,EAE3BnB,EAAc,QAASV,GAAU,CAC/B,IAAMgD,EAAQ,SAAM,SAAS,EAE7BvC,EAAsBuC,GAASvC,EAAsBT,EAAM,IAE3D8C,EAAS9C,EAAM,IAAMgD,EAErB,IAAMjB,EAAQxB,EAAAC,EAAA,GACT,SAAM,UAAUR,CAAK,GADZ,CAEZ,GAAIgD,EACJ,SAAUhD,EAAM,SAChB,WAAYE,EAAK,mBAAmB,KAAK,IAAI,MAAOF,EAAM,GAAIJ,CAAa,CAC7E,GAEA,GAAImC,EAAM,eAA4B,CACpC,IAAMkB,EAAU,SAAS,eAAejD,EAAM,GAAK,QAAQ,EACvDiD,IAASlB,EAAM,aAAekB,EAAQ,YAAc,IAAMA,EAAQ,SACxE,CAEApB,EAAO,KAAKE,CAAK,CACnB,CAAC,EAEDF,EAAO,QAASE,GAAU,CACpBA,EAAM,WAAa,SACrBA,EAAM,SAAWA,EAAM,SAAS,IAAKmB,GAAYJ,EAASI,EAAQ,EAEtE,CAAC,EAEDrB,EAAO,QAASE,GAAU,CACpBf,EAAY,SAASe,EAAM,QAAQ,IACrCA,EAAM,SAAWe,EAASf,EAAM,UAEpC,CAAC,EAID,IAAMoB,EAAiB,IAAI,IAAI,OAAO,KAAKL,CAAQ,CAAC,EAIpD,OAAO,OAAOjD,EAAK,QAAQ,EACxB,OAAQQ,GAAY8C,EAAe,IAAI9C,EAAQ,MAAM,GAAK8C,EAAe,IAAI9C,EAAQ,IAAI,CAAC,EAC1F,QAASA,GAAY,CACpB,GAAI8C,EAAe,IAAI9C,EAAQ,MAAM,GAC/B8C,EAAe,IAAI9C,EAAQ,IAAI,EAAG,CACpC,IAAM+C,EAAU,SAAM,SAAS,EAEzBC,EAAe9C,EAAAC,EAAA,GAChB,SAAM,UAAUH,CAAO,GADP,CAEnB,GAAI+C,EACJ,OAAQN,EAASzC,EAAQ,SAAWA,EAAQ,OAC5C,KAAMyC,EAASzC,EAAQ,OAASA,EAAQ,IAC1C,GACA0C,EAAkB1C,EAAQ,IAAM+C,EAChCtB,EAAe,KAAKuB,CAAY,CAClC,CAEJ,CAAC,EAGHxB,EAAO,QAASE,GAAU,CACxB,GAAIA,EAAM,SACJA,EAAM,QACR,QAAWI,KAAMJ,EAAM,QAAS,CAC9B,IAAMuB,EAASvB,EAAM,QAAQI,GAC7BmB,EAAO,UAAYA,EAAO,UAAYP,EAAkBO,EAAO,WAAa,MAC9E,CAGN,CAAC,EAEDzB,EAAO,QAASE,GAAU,CACxB,GAAIlC,EAAK,OAAOkC,EAAM,IACpB,MAAM,MAAM,kCAAkC,CAElD,CAAC,EAED,KAAK,UAAY,CACf,MAAO,QACP,OAAAF,EACA,SAAAiB,EACA,eAAAhB,CACF,CACF,GA/oBE,KAAK,SAAWvC,EAChB,KAAK,KAAOC,EAEZ,GAAM,CAAE,cAAAI,EAAe,YAAAoB,EAAa,KAAAnB,CAAK,EAAI,KAAK,IAElD,KAAK,mBAAqB,CAAC,GAAGmB,CAAW,EAEzC,IAAMuC,GACJ/D,EAAOU,EAAK,kBAAkB,KAAK,IAAI,MAAON,EAAeJ,EAAM,EAAK,EAAIwB,GAE3E,IAAKmB,GAAO,KAAK,IAAI,SAASA,CAAE,CAAC,EACjC,OAAQnC,GAAU,CAACA,EAAM,QAAQ,EAE9BwD,EAAmB,IAAI,IAAID,EAAe,IAAKvD,GAAUA,EAAM,EAAE,CAAC,EAExE,KAAK,kBAAoBuD,EAAe,OAAS,EAEjD,KAAK,cAAgB,MAAM,KACzB,IAAI,IACFA,EACG,OAAQvD,GAAU,CAACwD,EAAiB,IAAIxD,EAAM,QAAQ,CAAC,EACvD,QAASA,GACDA,EAAM,SACT,CAACA,EAAO,GAAGA,EAAM,SAAS,IAAKkD,GAAY,KAAK,IAAI,SAASA,CAAO,CAAC,CAAC,EACtE,CAAClD,CAAK,CACX,CACL,EAAE,OAAO,CACX,EAEA,KAAK,WAAa,IAAI,IAAI,KAAK,cAAc,IAAKA,GAAUA,EAAM,EAAE,CAAC,EAErE,KAAK,iBAAmB,CAAC,EAEzB,OAAO,OAAOH,EAAK,QAAQ,EACxB,OAAQQ,GAAY,KAAK,WAAW,IAAIA,EAAQ,MAAM,GAAK,KAAK,WAAW,IAAIA,EAAQ,IAAI,CAAC,EAC5F,QAASA,GAAY,CAChB,KAAK,WAAW,IAAIA,EAAQ,MAAM,IAC/B,KAAK,WAAW,IAAIA,EAAQ,IAAI,GACnC,KAAK,iBAAiB,KAAKA,CAAO,EAGxC,CAAC,EAEH,KAAK,sBAAwB,CAAC,EAE9B,KAAK,cACF,IAAKoD,GAAMA,EAAE,QAAQ,EACrB,OAAQtB,GAAOA,IAAOtC,EAAK,EAAE,EAC7B,QAASsC,GAAO,CACf,KAAK,sBAAsBA,GAAM,KAAK,IAAI,SAASA,CAAE,EAAE,QACzD,CAAC,EAEH,KAAK,oBAAsB,SAAM,gBAAgB,KAAK,cAAc,IAAIjC,EAAK,gBAAgB,CAAC,EAE9F,KAAK,IAAI,aAAa,YAAc,CAAC,GAAG,KAAK,IAAI,WAAW,CAC9D,CAylBF,ECxqBO,IAAMwD,GAAmD,CAC9D,UAAqBC,GACrB,UAAqBC,GACrB,SAAoBC,GACpB,UAAqBC,GACrB,WAAsBC,GACtB,WAAsBC,GACtB,cAAyBC,GACzB,oBAA+BC,GAC/B,cAAyBC,GACzB,SAAoBC,GACpB,SAAoBC,EACtB,EAEaC,GAAqCC,GACzCb,GAASa,GC7DlB,IAAAC,GAA6C,sBAC7CC,GAAgB,wBCDhB,IAAAC,GAKO,sBAUA,IAAeC,GAAf,cAAwDC,EAAe,CAO5E,YAAmBC,EAAe,CAChC,MAAM,EADW,SAAAA,EANnBC,EAAA,YAAmB,UAEnBA,EAAA,iBAEAA,EAAA,cAAqB,QAMrBA,EAAA,KAAmB,YAAaC,GAAuB,CACrD,KAAK,OAASA,EACd,KAAK,IAAI,UAAU,KAAK,MAAgB,CAC1C,GAEAD,EAAA,eAAU,IAAM,CACd,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,cAAS,IAAM,CACb,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,gBAAW,IAAM,CACX,KAAK,SAAW,OAClB,KAAK,IAAI,WAAW,QAAQ,EAE5B,KAAK,UAAU,MAAW,EAG5B,KAAK,IAAI,cAAc,CACzB,GAEAA,EAAA,yBAAoB,IAAM,CACxB,GAAM,CACJ,OAAAE,EACA,SAAU,CAAE,cAAAC,CAAc,CAC5B,EAAI,KAAK,IAET,OAAOD,EAAO,SAAW,EACrB,EACAA,EACG,OAAQE,GAAUA,EAAM,WAAaD,CAAa,EAClD,KAAK,CAACE,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,EAAE,GAAG,WAAa,CACrE,GAIAL,EAAA,oBAAoC,IAAM,CACxC,KAAK,IAAI,cAAc,EACvB,KAAK,UAAU,UAAe,CAChC,GAEAA,EAAA,kBAAkC,IAAM,CAClC,SAAM,eAAe,GACvB,KAAK,IAAI,WAAW,EAEtB,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,eAA+B,CAACO,EAAMC,IAAM,CA5E9C,IAAAC,EA6EQ,KAAK,SAAW,aAChB,MAAMF,EAAK,MAAM,EAAE,GAAK,MAAMA,EAAK,MAAM,EAAE,IAC/C,KAAK,IAAI,UAAUA,EAAK,MAAOA,EAAK,MAAOA,EAAK,MAAM,EAAE,GACxDE,EAAA,KAAK,gBAAL,MAAAA,EAAA,UAAqBF,EAAMC,IAC7B,GAIAR,EAAA,iBAAqCU,GAAQ,CAC3C,GAAIA,IAAQ,SAAU,CACpB,KAAK,SAAS,EACd,MACF,CAEA,GAAIA,IAAQ,QAAUA,IAAQ,WAAaA,IAAQ,MAAO,CACxD,KAAK,IAAI,cAAc,EACvB,MACF,CACF,GAEAV,EAAA,eAAmCU,GAAQ,CACzC,GAAIA,IAAQ,QAAUA,IAAQ,WAAaA,IAAQ,MAAO,CACxD,KAAK,IAAI,cAAc,EACvB,MACF,CACF,GAIAV,EAAA,qBAAuC,IAAM,CACvC,KAAK,SAAW,YAClB,KAAK,IAAI,cAAc,CAE3B,GAEAA,EAAA,mBAAqC,IAAM,CACzC,GAAI,KAAK,SAAW,WAAiB,CACnC,KAAK,IAAI,gBAAgB,EAEzB,GAAM,CAAE,aAAAW,CAAa,EAAI,KAAK,IAAI,SAE7BA,GACH,KAAK,IAAI,WAAW,QAAQ,CAEhC,CAEA,KAAK,UAAU,MAAW,CAC5B,EApGA,CAqGF,EDvHO,IAAMC,GAAN,cAAwBC,EAAS,CAAjC,kCACLC,EAAA,qBAIAA,EAAA,qBAAuC,IAAM,CAC3C,GAAI,KAAK,gBAAwB,OAEjC,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAEpBC,EAAWC,GAAM,OAAO,CAC5B,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,MAAOU,EAAA,GAAKN,EACd,CAAC,EAED,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,EAE/B,KAAK,IAAI,qBAAgCA,EAAS,GAAI,MAAO,EAAI,EAEjE,KAAK,oBAAyB,CAChC,GACF,EEvCA,IAAAI,GAA6C,sBAYtC,IAAMC,GAAN,cAAuBC,EAAS,CAAhC,kCACLC,EAAA,oBAEAA,EAAA,KAAQ,eAERA,EAAA,eAAU,IAAM,CACd,KAAK,YAAc,MACrB,GAEAA,EAAA,gBAAW,IAAM,CACf,OAAQ,KAAK,YACN,OAAa,CAChB,KAAK,IAAI,WAAW,QAAQ,EAC5B,KACF,SACS,CACP,KAAK,UAAU,MAAW,EAC1B,KACF,EAGF,KAAK,IAAI,cAAc,CACzB,GAIAA,EAAA,qBAAwCC,GAAS,CAE/C,GADI,KAAK,SAAW,QAChB,KAAK,IAAI,SAAU,OACvB,GAAM,CACJ,aAAAC,EACA,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IACHC,EAAW,KAAK,aAAe,KAAK,IAAI,SAAS,KAAK,WAAW,EACvE,GAAIJ,EAAK,UAAYI,EAEnB,KAAK,IAAI,oBAA+BA,EAAS,EAAE,EACnD,KAAK,UAAU,WAAgB,MAC1B,CAEL,IAAMC,EAAa,KAAK,kBAAkB,EACpCC,EAAK,SAAM,SAAS,EACpBC,EAAWC,GAAK,OAAO,CAC3B,GAAAF,EACA,SAAUJ,EACV,WAAAG,EACA,MAAOJ,EACP,MAAOQ,EAAA,GAAKN,EACd,CAAC,EACD,KAAK,YAAcG,EACnB,KAAK,IAAI,YAAY,CAACC,CAAQ,CAAC,EAC/B,KAAK,IAAI,oBAA+BD,CAAE,EAC1C,KAAK,UAAU,UAAe,CAChC,CACF,GAEAP,EAAA,qBAAuC,IAAM,CAC3C,GAAI,MAAK,IAAI,SAEb,OAAQ,KAAK,YACN,gBACA,WACH,KAAK,IAAI,cAAc,EAG7B,GAEAA,EAAA,mBAAqC,IAAM,CACzC,KAAK,IAAI,gBAAgB,EACzB,KAAK,UAAU,MAAW,CAC5B,GACF,ECnFA,IAAAW,GAA6D,sBAC7DC,GAAgB,wBAKT,IAAMC,GAAN,cAA0BC,EAAS,CAAnC,kCACLC,EAAA,uBAIAA,EAAA,qBAAuC,IAAM,CAE3C,GADI,KAAK,IAAI,UACT,KAAK,gBAAwB,OAEjC,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAEpBC,EAAWC,GAAQ,OAAO,CAC9B,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,MAAOU,EAAA,GAAKN,EACd,CAAC,EAED,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,EAE/B,KAAK,IAAI,+BAEPA,EAAS,GACT,kBAAe,YACf,EACF,EAEA,KAAK,oBAAyB,CAChC,GACF,EC5CA,IAAAI,GAAgB,wBAWT,IAAMC,GAAN,cAAwBC,EAAS,CAAjC,kCACLC,EAAA,YAAO,SAEPA,EAAA,cAAiB,QAIjBA,EAAA,qBAAuC,IAAM,CACvC,KAAK,IAAI,UACT,KAAK,SAAW,QAEpB,KAAK,UAAU,UAAe,CAChC,GAEAA,EAAA,qBAAwCC,GAAS,CAC/C,GAAI,MAAK,IAAI,SACb,OAAQ,KAAK,YACN,WAAiB,CAChB,GAAAC,QAAI,KAAKD,EAAK,OAAQA,EAAK,KAAK,EAAI,IACtC,KAAK,IAAI,oBAA8B,EACvC,KAAK,IAAI,cAAc,EACvB,KAAK,UAAU,SAAc,GAE/B,KACF,KACK,UACH,KAAK,IAAI,cAAc,EAG7B,GAEAD,EAAA,mBAAqC,IAAM,CACzC,GAAI,MAAK,IAAI,SACb,QAAQ,KAAK,YACN,WAAiB,CACpB,IAAMG,EAAkB,KAAK,IAAI,OAC9B,OAAQC,GAAU,CAACA,EAAM,QAAQ,EACjC,OAAQA,GACP,KAAK,IAAI,aAAaA,CAAK,EAAE,aAAaA,EAAO,KAAK,IAAI,YAAY,CACxE,EACC,QAASA,GAAWA,EAAM,SAAW,CAACA,EAAM,GAAI,GAAGA,EAAM,QAAQ,EAAIA,EAAM,EAAG,EAEjF,KAAK,IAAI,OAAOD,CAAe,EAE/B,KACF,KACK,UACH,KAAK,IAAI,gBAAgB,EAa7B,KAAK,UAAU,MAAW,EAC5B,GAEAH,EAAA,gBAAW,IAAM,CACX,KAAK,SAAW,OACd,KAAK,SACP,KAAK,IAAI,WAAW,KAAK,QAAQ,EAEjC,KAAK,IAAI,WAAW,QAAQ,EAG9B,KAAK,UAAU,MAAW,EAG5B,KAAK,IAAI,cAAc,CACzB,GACF,ECxFA,IAAAK,GAA6C,sBAC7CC,GAAgB,wBAKT,IAAMC,GAAN,cAAuBC,EAAS,CAAhC,kCACLC,EAAA,oBAIAA,EAAA,qBAAuC,IAAM,CAE3C,GADI,KAAK,IAAI,UACT,KAAK,gBAAwB,OAEjC,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAEpBC,EAAWC,GAAM,OAAO,CAC5B,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,YAAa,CACX,MAAO,OACP,IAAK,MACP,EACA,MAAOU,EAAA,GAAKN,EACd,CAAC,EAED,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,EAE/B,KAAK,IAAI,qBAAgCA,EAAS,GAAI,MAAO,EAAI,EAEjE,KAAK,oBAAyB,CAChC,GACF,EC5CA,IAAAI,GAKO,sBACPC,GAAgB,wBAWhB,IAAMC,GAAiB,EAEVC,GAAN,cAAsBC,EAAiB,CAAvC,kCACLC,EAAA,mBAEAA,EAAA,uBACAA,EAAA,kBACAA,EAAA,yBAAoB,GAEpBA,EAAA,eAAU,IAAM,CACd,KAAK,eAAiB,OACtB,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,cAAS,IAAM,CAET,KAAK,gBAAgB,KAAK,YAAY,EAC1C,KAAK,eAAiB,OACtB,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,gBAAW,IAAM,CACX,KAAK,iBAEP,KAAK,IAAI,OAAO,CAAC,KAAK,cAAc,CAAC,EACrC,KAAK,eAAiB,QAExB,KAAK,UAAU,MAAW,CAC5B,GAsJAA,EAAA,qBAAwCC,GAAS,CAC/C,GAAIA,EAAK,SAAU,OAEnB,IAAMC,EAAY,KAAK,IAAI,aAAaD,EAAK,KAAK,EAGlD,GAFA,KAAK,UAAYC,EAEb,KAAK,SAAW,QAAe,CAAC,KAAK,eAAgB,CAEvD,KAAK,cAAcA,CAAS,EAC5B,KAAK,UAAU,SAAoB,EACnC,MACF,CAEA,GAAI,KAAK,SAAW,UAAgB,CAElC,GAAI,KAAK,gBAAgBA,CAAS,EAAG,CACnC,IAAMC,EAAQ,KAAK,SAAS,EAC5B,GAAIA,GAASA,EAAM,SAAS,QAAU,EAAG,CACvC,GAAM,CAAE,SAAUC,EAAY,OAAAC,CAAO,EAAIC,GAAkBH,EAAM,QAAQ,EACzE,KAAK,IAAI,aAAa,CACpB,GAAIA,EAAM,GACV,MAAO,GAAAI,QAAI,IAAIJ,EAAM,MAAOE,CAAM,EAClC,SAAUD,EACV,SAAU,GACV,WAAY,EACd,CAAC,EACD,KAAK,IAAI,OAAOD,EAAM,EAAE,EACxB,KAAK,eAAiB,OACtB,KAAK,UAAU,MAAW,EAC1B,MACF,CACF,CAGA,IAAMK,EAAQ,KAAK,QAAQN,CAAS,EACpC,KAAK,WAAWM,CAAK,EACrB,KAAK,UAAU,SAAoB,CACrC,CACF,GAEAR,EAAA,qBAAwCC,GAAS,CAC/C,GAAI,CAAAA,EAAK,UAEL,KAAK,SAAW,WAAwB,KAAK,UAAW,CAC1D,IAAMC,EAAY,KAAK,IAAI,aAAaD,EAAK,KAAK,EAGlD,GAFiB,GAAAM,QAAI,KAAKL,EAAW,KAAK,SAAS,EAEpCL,GAAgB,CAE7B,IAAMM,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,GAASA,EAAM,SAAS,SAAW,EAAG,OAE3C,IAAMM,EAASN,EAAM,SAASA,EAAM,SAAS,OAAS,GAAG,MACnDO,EAAY,GAAAH,QAAI,IAAI,KAAK,UAAWJ,EAAM,KAAK,EAC/CQ,EAAQ,GAAAJ,QAAI,IAAI,GAAAA,QAAI,IAAIL,EAAWC,EAAM,KAAK,EAAGO,CAAS,EAI1DE,EAAM,GAAAL,QAAI,IAAIE,EAAQE,CAAK,EAC3BE,EAAMC,GAAaL,EAAQG,CAAG,EAEpC,KAAK,yBAAyBC,EAAKD,CAAG,CACxC,CACF,CACF,GAEAZ,EAAA,mBAAsCC,GAAS,CACzC,KAAK,SAAW,WAClB,KAAK,UAAU,SAAc,CAEjC,GAEAD,EAAA,2BAA4C,IAAM,CAChD,GAAI,KAAK,eAAgB,CAEvB,IAAMG,EAAQ,KAAK,SAAS,EAC5B,GAAIA,GAASA,EAAM,SAAS,OAAS,EAAG,CACtC,IAAMY,EAAUZ,EAAM,SAAS,MAAM,EAAG,EAAE,EAC1C,KAAK,IAAI,WAAW,CAClB,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CAAE,CAACA,EAAM,IAAK,CAAE,SAAUY,CAAQ,CAAE,CAC9C,CACF,CACF,CACF,CAAC,CACH,CACA,KAAK,YAAY,EACjB,KAAK,UAAU,MAAW,CAC5B,CACF,GAEAf,EAAA,iBAAoC,CAACgB,EAAKf,EAAMgB,IAAM,CACpD,OAAQD,OACD,SAAU,CACb,KAAK,SAAS,EACd,KACF,KACK,QAAS,CACR,KAAK,iBACP,KAAK,YAAY,EACjB,KAAK,UAAU,MAAW,GAE5B,KACF,EAEJ,GA9PQ,UAAiC,CACvC,GAAI,EAAC,KAAK,eACV,OAAO,KAAK,IAAI,SAAmB,KAAK,cAAc,CACxD,CAEA,IAAY,iBAAgC,CArD9C,IAAAE,EAAAC,EAsDI,OAAOA,GAAAD,EAAA,KAAK,SAAS,IAAd,YAAAA,EAAiB,WAAjB,KAAAC,EAA6B,CAAC,CACvC,CAGQ,cAAcjB,EAAqB,CACzC,GAAM,CACJ,SAAU,CAAE,cAAAkB,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAK,SAAM,SAAS,EACpBC,EAAa,KAAK,kBAAkB,EAEpCC,EAAuB,CAAE,MAAO,CAAC,EAAG,CAAC,CAAE,EAEvCC,EAAW,CACf,GAAAH,EACA,WACA,KAAM,MACN,SAAUF,EACV,WAAAG,EACA,MAAOrB,EACP,SAAU,EACV,MAAOwB,EAAA,GAAKL,GACZ,SAAU,CAACG,CAAQ,EACnB,SAAU,GACV,WAAY,EACd,EAEA,KAAK,eAAiBF,EACtB,KAAK,kBAAoB,EAEzB,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,CACjC,CAEQ,WAAWE,EAAsBd,EAAgBD,EAAgB,CACvE,IAAMT,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,EAAO,OAEZ,IAAMyB,EAAqB,CAAE,MAAOD,EAAY,IAAAd,EAAK,IAAAD,CAAI,EACnDiB,EAAU,CAAC,GAAG1B,EAAM,SAAUyB,CAAM,EAE1C,KAAK,kBAAoBC,EAAQ,OAAS,EAE1C,KAAK,IAAI,WAAW,CAClB,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CAAE,CAAC1B,EAAM,IAAK,CAAE,SAAU0B,CAAQ,CAAE,CAC9C,CACF,CACF,CACF,CAAC,CACH,CAEQ,yBAAyBhB,EAAgBD,EAAgB,CAC/D,IAAMT,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,GAASA,EAAM,SAAS,SAAW,EAAG,OAE3C,IAAM2B,EAAO,CAAC,GAAG3B,EAAM,QAAQ,EACzB4B,EAAOD,EAAKA,EAAK,OAAS,GAChCA,EAAKA,EAAK,OAAS,GAAKE,EAAAN,EAAA,GACnBK,GADmB,CAEtB,IAAKlB,GAAA,KAAAA,EAAOkB,EAAK,IACjB,IAAKnB,GAAA,KAAAA,EAAOmB,EAAK,GACnB,GAEA,KAAK,IAAI,WAAW,CAClB,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CAAE,CAAC5B,EAAM,IAAK,CAAE,SAAU2B,CAAK,CAAE,CAC3C,CACF,CACF,CACF,CAAC,CACH,CAEQ,cAAcjB,EAAgBD,EAAgB,CACpD,IAAMT,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,GAASA,EAAM,SAAS,SAAW,EAAG,OAE3C,IAAM2B,EAAO,CAAC,GAAG3B,EAAM,QAAQ,EACzB4B,EAAOD,EAAKA,EAAK,OAAS,GAChCA,EAAKA,EAAK,OAAS,GAAKE,EAAAN,EAAA,GACnBK,GADmB,CAEtB,IAAKlB,IAAQ,OAAYA,EAAMkB,EAAK,IACpC,IAAKnB,IAAQ,OAAYA,EAAMmB,EAAK,GACtC,GAEA,KAAK,IAAI,WAAW,CAClB,SAAU,CACR,MAAO,CACL,CAAC,KAAK,IAAI,eAAgB,CACxB,OAAQ,CAAE,CAAC5B,EAAM,IAAK,CAAE,SAAU2B,CAAK,CAAE,CAC3C,CACF,CACF,CACF,CAAC,CACH,CAGQ,QAAQ5B,EAA+B,CAC7C,IAAMC,EAAQ,KAAK,SAAS,EAC5B,OAAKA,EACE,GAAAI,QAAI,IAAIL,EAAWC,EAAM,KAAK,EADlBD,CAErB,CAGQ,gBAAgBA,EAA8B,CAlKxD,IAAAgB,EAmKI,IAAMf,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,GAASA,EAAM,SAAS,OAAS,EAAG,MAAO,GAChD,IAAM8B,EAAgB,GAAA1B,QAAI,IAAIJ,EAAM,MAAOA,EAAM,SAAS,GAAG,KAAK,EAClE,OAAO,GAAAI,QAAI,KAAKL,EAAW+B,CAAa,GAAK,KAAMf,EAAA,KAAK,IAAI,OAAT,KAAAA,EAAiB,EACtE,CAEQ,aAAc,CACpB,IAAMgB,EAAU,KAAK,eACrB,GAAI,CAACA,EAAS,OAEd,IAAM/B,EAAQ,KAAK,IAAI,SAAmB+B,CAAO,EACjD,GAAI,CAAC/B,EAAO,OAGZ,GAAM,CAAE,SAAUC,EAAY,OAAAC,CAAO,EAAIC,GAAkBH,EAAM,QAAQ,EACnEgC,EAAW,GAAA5B,QAAI,IAAIJ,EAAM,MAAOE,CAAM,EAE5C,KAAK,IAAI,aAAa,CACpB,GAAI6B,EACJ,MAAOC,EACP,SAAU/B,EACV,WAAY,EACd,CAAC,EAED,KAAK,IAAI,OAAO8B,CAAO,EACvB,KAAK,eAAiB,MACxB,CAkHF,EC/SA,IAAAE,GAA6D,sBAC7DC,GAAgB,wBAKT,IAAMC,GAAN,cAA4BC,EAAS,CAArC,kCACLC,EAAA,yBAIAA,EAAA,qBAAuC,IAAM,CAE3C,GADI,KAAK,IAAI,UACT,KAAK,gBAAwB,OAEjC,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAEpBC,EAAWC,GAAU,OAAO,CAChC,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,MAAOU,EAAA,GAAKN,EACd,CAAC,EAED,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,EAE/B,KAAK,IAAI,+BAEPA,EAAS,GACT,kBAAe,YACf,EACF,EAEA,KAAK,oBAAyB,CAChC,GACF,EC7CA,IAAAI,GAUO,sBACPC,GAAgB,wBAyBT,IAAMC,GAAN,cAAyBC,EAAiB,CAA1C,kCACLC,EAAA,YAAO,UAEPA,EAAA,kBAEAA,EAAA,wBAEAA,EAAA,wBAEAA,EAAA,4BAEAA,EAAA,4BAqBAA,EAAA,eAAU,IAAM,CACd,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,cAAS,IAAM,CACb,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,kBAAcC,GAAoB,CAChC,GAAI,KAAK,IAAI,YAAY,SAAW,EAAG,OAEvC,IAAMC,EAAS,KAAK,IAAI,YAAY,IAAKC,GAAO,KAAK,IAAI,SAASA,CAAE,CAAC,EAE/DC,EAAS,SAAM,aAAa,SAAM,gBAAgBF,EAAO,IAAIG,EAAK,SAAS,CAAC,EAAG,EAAE,EAEjFC,EAAS,SAAM,gBAAgBF,CAAM,EAErCG,EAAO,CAACH,EAAO,MAAOA,EAAO,MAAM,EAEnCI,EAAY,CAChBF,EAAO,GAAKC,EAAK,GAAK,KAAK,OAAON,EAAM,GAAKM,EAAK,GAAK,EAAID,EAAO,IAAMC,EAAK,EAAE,EAC/ED,EAAO,GAAKC,EAAK,GAAK,KAAK,OAAON,EAAM,GAAKM,EAAK,GAAK,EAAID,EAAO,IAAMC,EAAK,EAAE,CACjF,EAEME,EAAiB,SAAM,aAAaL,EAAQI,CAAS,EAE/C,KAAK,IAAI,OAAO,KAAME,GAChCL,EAAK,aAAaK,CAAK,EAAE,cAAcA,EAAOD,CAAc,CAC9D,GAGE,KAAK,IAAI,UAAU,KAAK,IAAI,YAAaD,CAAS,CAEtD,GAEAR,EAAA,qBAAgB,CACdG,EACAQ,IASG,CACH,IAAMD,EAAQ,KAAK,IAAI,SAASP,CAAE,EAE5BS,EAAQP,EAAK,aAAaK,CAAK,EAErC,GAAIE,EAAM,SAAU,CAClB,IAAMR,EAASQ,EAAM,UAAUF,CAAK,EAE9BJ,EAASM,EAAM,UAAUF,CAAK,EAEhCT,EAAQ,CACV,IAAK,CAACG,EAAO,KAAMA,EAAO,MAAQA,EAAO,OAAS,GAAiB,EACnE,MAAO,CAACA,EAAO,KAAO,GAAkBA,EAAO,IAAI,EACnD,OAAQ,CAACA,EAAO,KAAMA,EAAO,KAAO,EAAgB,EACpD,KAAM,CAACA,EAAO,MAAQA,EAAO,MAAQ,IAAmBA,EAAO,IAAI,EACnE,QAAS,CACPA,EAAO,MAAQA,EAAO,MAAQ,IAC9BA,EAAO,MAAQA,EAAO,OAAS,GACjC,EACA,SAAU,CACRA,EAAO,KAAO,GACdA,EAAO,MAAQA,EAAO,OAAS,GACjC,EACA,WAAY,CACVA,EAAO,MAAQA,EAAO,MAAQ,IAC9BA,EAAO,KAAO,EAChB,EACA,YAAa,CAACA,EAAO,KAAO,GAAkBA,EAAO,KAAO,EAAgB,CAC9E,EAAEO,GAEF,GAAID,EAAM,WAAa,EAAG,CACxB,IAAMG,EAAY,GAAAC,QAAI,IAAIb,EAAO,CAACG,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,EAEhEW,EAAgB,GAAAD,QAAI,QAAQD,EAAWP,EAAQI,EAAM,UAAY,CAAC,EAExET,EAAQ,GAAAa,QAAI,IAAIC,EAAe,CAACX,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,CACtE,CAEA,IAAMD,EAAK,SAAM,SAAS,EAEpBa,EAAQC,EAAAC,EAAA,GACTR,GADS,CAEZ,GAAAP,EACA,MAAAF,CACF,GAEA,OAAIe,EAAM,kBACRA,EAAM,KAAO,IAGRA,CACT,CAGF,GAIAhB,EAAA,gBAAW,IAAM,CACX,KAAK,IAAI,QACX,KAAK,IAAI,cAAc,EAEvB,KAAK,WAAW,EAGlB,KAAK,UAAU,MAAW,CAC5B,GAEAA,EAAA,iBAAoC,CAACmB,EAAKC,EAAMC,IAAM,CACpD,OAAQF,OACD,SAAU,CACb,KAAK,SAAS,EACd,KACF,KACK,MAAO,CACV,GAAI,KAAK,IAAI,SAAU,OAEvB,GACE,CAAC,KAAK,IAAI,UAAU,WACpB,KAAK,SAAW,QAChB,KAAK,IAAI,YAAY,SAAW,EAChC,CACA,GAAM,CAACG,CAAU,EAAI,KAAK,IAAI,YACxBC,EAAc,KAAK,cAAcD,EAAY,OAAO,EAEtDC,IACF,KAAK,IAAI,aAAaA,CAAW,EACjC,KAAK,UAAU,MAAW,EACtBA,EAAY,kBACd,KAAK,IAAI,OAAOA,EAAY,EAAE,EAC9B,KAAK,IAAI,aAAaA,EAAY,EAAE,GAG1C,CACA,KACF,KACK,WACA,cACA,MAAO,CACV,KAAK,IAAI,cAAc,EACvB,KACF,KACK,QAAS,CACZ,GAAI,KAAK,IAAI,SAAU,OAEvB,GAAM,CAAE,UAAAC,CAAU,EAAI,KAAK,IACvBA,EAAU,YAAY,SAAW,GAAK,CAACA,EAAU,YACnD,KAAK,IAAI,aAAaA,EAAU,YAAY,EAAE,EAC9CH,EAAE,eAAe,EAErB,EAEJ,GAEArB,EAAA,eAAkC,CAACmB,EAAKC,IAAS,CAC/C,GAAI,KAAK,SAAW,iBAAwB,EAAEA,EAAK,QAAUA,EAAK,UAAW,CAC3E,KAAK,UAAU,MAAW,EAC1B,MACF,CAGA,GAAID,IAAQ,QAAUA,IAAQ,WAAaA,IAAQ,MAAO,CACxD,KAAK,IAAI,cAAc,EACvB,MACF,CACF,GAMAnB,EAAA,qBAAuC,IAAM,CAC3C,GAAM,CAAE,YAAAyB,EAAa,aAAAC,CAAa,EAAI,KAAK,IAE3C,GAAI,KAAK,IAAI,UAAY,KAAK,IAAI,WAAY,CACxC,KAAK,IAAI,QACX,KAAK,IAAI,cAAc,EAEnB,GAAAZ,QAAI,KAAKW,EAAaC,CAAY,EAAI,IACxC,KAAK,IAAI,oBAA8B,EACvC,KAAK,UAAU,UAAe,GAGlC,MACF,CAEA,OAAQ,KAAK,YACN,uBAA6B,CAChC,GAAI,CAAC,KAAK,oBAAqB,MAAM,MAAM,0BAA0B,EACrE,GAAI,GAAAZ,QAAI,KAAKW,EAAaC,CAAY,EAAI,EAAW,CACnD,GAAI,KAAK,sBAAwB,SAE/B,KAAK,UAAU,UAAe,EAC9B,KAAK,IAAI,qBAA+B,UAExC,KAAK,sBAAwB,UAC7B,KAAK,sBAAwB,QAC7B,KAAK,sBAAwB,QAE7B,KAAK,UAAU,aAAkB,EACjC,KAAK,IAAI,yBAAoC,GAAO,KAAK,mBAAmB,MACvE,CAEL,KAAK,UAAU,cAAmB,EAClC,IAAMC,EAAiB,KAAK,IAAI,YAAY,QAASxB,GACnDE,EAAK,kBAAkB,KAAK,IAAI,MAAOF,EAAI,KAAK,IAAI,aAAa,CACnE,EACIwB,EAAe,SAAW,EAE5B,KAAK,IAAI,+BAEPA,EAAe,GACf,KAAK,mBACP,EAGA,KAAK,IAAI,yBAAoC,KAAK,mBAAmB,CAEzE,CAGA,KAAK,IAAI,cAAc,CACzB,CACA,KACF,KACK,iBAAuB,CACtB,GAAAb,QAAI,KAAKW,EAAaC,CAAY,EAAI,IACxC,KAAK,IAAI,oBAA8B,EACvC,KAAK,UAAU,UAAe,GAEhC,KACF,KACK,gBAAsB,CACrB,GAAAZ,QAAI,KAAKW,EAAaC,CAAY,EAAI,IACxC,KAAK,UAAU,kBAAuB,EACtC,KAAK,IAAI,wBAAkC,EAC3C,KAAK,IAAI,cAAc,GAEzB,KACF,KACK,iBAAuB,CACtB,GAAAZ,QAAI,KAAKW,EAAaC,CAAY,EAAI,IACxC,KAAK,UAAU,aAAkB,EACjC,KAAK,IAAI,wBAAkC,EAC3C,KAAK,IAAI,cAAc,GAEzB,KACF,KACK,iBAAuB,CAC1B,GAAI,CAAC,KAAK,gBAAiB,MAAM,MAAM,mBAAmB,EAC1D,GAAI,GAAAZ,QAAI,KAAKW,EAAaC,CAAY,EAAI,EAAW,CACnD,KAAK,UAAU,mBAAwB,EACvC,IAAME,EAAgB,KAAK,IAAI,SAAS,KAAK,IAAI,YAAY,EAAE,EAC3DA,IACE,KAAK,kBAAoB,QAC3B,KAAK,IAAI,sBAAiCA,EAAc,GAAI,KAAK,eAAe,EAChF,KAAK,IAAI,cAAc,IAEvB,KAAK,IAAI,qBAEPA,EAAc,GACd,KAAK,gBACL,EACF,EACA,KAAK,IAAI,cAAc,GAG7B,CACA,KACF,KACK,gBAAsB,CACzB,KAAK,WAAWF,CAAY,EAC5B,KACF,SAEE,GAAI,KAAK,IAAI,QAAS,CACpB,KAAK,IAAI,cAAc,EACvB,KACF,EAGN,GAEA1B,EAAA,qBAAuC,CAACoB,EAAMC,IAAM,CAClD,GAAID,EAAK,SAAW,UAAY,KAAK,SAAW,OAAa,CAC3D,GAAM,CAAE,aAAAM,CAAa,EAAI,KAAK,IAE9B,GAAIN,EAAK,UAAYC,EAAE,UAAY,EAAG,OAEtC,GAAI,KAAK,SAAW,QAAeD,EAAK,QAAUA,EAAK,SAAU,CAC/D,KAAK,UAAU,eAAoB,EACnC,KAAK,WAAWM,CAAY,EAC5B,MACF,CAGA,GAAI,CAACN,EAAK,SAAU,CAGlB,GAFA,KAAK,IAAI,YAAY,EAEjBA,EAAK,QAAU,KAAK,IAAI,YAAY,OAAS,EAAG,CAClD,KAAK,IAAI,UAAU,KAAK,IAAI,YAAaM,CAAY,EACrD,MACF,CAEA,KAAK,WAAW,CAClB,CAEA,KAAK,UAAU,gBAAqB,CACtC,CACF,GAEA1B,EAAA,mBAAsCoB,GAAS,CAjYjD,IAAAS,EAkYI,GAAI,KAAK,SAAW,oBAA2B,KAAK,SAAW,gBAAsB,CAC/E,KAAK,YACP,KAAK,IAAI,gBAAgB,EACzB,KAAK,IAAI,aAAa,KAAK,SAAS,GAEtC,KAAK,UAAU,MAAW,EAC1B,KAAK,UAAY,OACjB,MACF,CAEA,GAAI,KAAK,SAAW,kBAClB,GAAIT,EAAK,SAAW,SAGlB,KAAK,WAAW,UACP,KAAK,IAAI,WAAWA,EAAK,MAAM,EAEpCA,EAAK,SAGH,KAAK,YAAcA,EAAK,QAC1B,KAAK,SAASA,EAAK,MAAM,EAIvB,KAAK,YAAcA,EAAK,QAAU,KAAK,IAAI,YAAY,OAAS,GAClE,KAAK,OAAOA,EAAK,MAAM,UAGlB,KAAK,YAAcA,EAAK,OAAQ,CACzC,GAAI,KAAK,IAAI,SAASA,EAAK,MAAM,EAAE,SAAU,OAGzCA,EAAK,SACP,KAAK,WAAWA,EAAK,MAAM,EAE3B,KAAK,OAAOA,EAAK,MAAM,CAE3B,EAKF,KAAK,UAAU,MAAW,EAC1B,KAAK,oBAAsB,OAC3B,KAAK,gBAAkB,OACvB,KAAK,UAAY,SAGbS,EAAA,KAAK,IAAI,UAAT,YAAAA,EAAkB,gBAItB,KAAK,IAAI,gBAAgB,CAC3B,GAIA7B,EAAA,2BAA4C,IAAM,CAC5C,KAAK,IAAI,QAMf,GAIAA,EAAA,oBAAsC,CAACoB,EAAMC,IAAM,CAGjD,GAFID,EAAK,UAAYC,EAAE,UAAY,GAE/B,KAAK,IAAI,SAASD,EAAK,MAAM,EAAE,SAAU,OAE7C,GAAM,CAAE,UAAAU,EAAW,UAAAC,CAAU,EAAI,KAAK,IAAI,UAQ1C,GANID,GAAaV,EAAK,SAAWU,GAC/B,KAAK,IAAI,YAAY,GAMpB,KAAK,SAAW,QAAe,KAAK,SAAW,mBAChDV,EAAK,SACLA,EAAK,UACLW,EACA,CACA,KAAK,UAAYA,EAEb,KAAK,IAAI,WAAWA,CAAS,EAC/B,KAAK,SAASA,CAAS,GAEvB,KAAK,WAAWA,CAAS,EACzB,KAAK,UAAU,gBAAqB,GAGtC,MACF,CAEA,GAAI,KAAK,SAAW,iBAAuB,CAGzC,GAAM,CAAE,SAAAC,CAAS,EAAI,KAAK,IAAI,SAASZ,EAAK,MAAM,EAClD,KAAK,UAAYY,IAAa,KAAK,IAAI,cAAgBZ,EAAK,OAASY,EACrE,MACF,CAEA,GAAI,KAAK,SAAW,OAAa,CAG/B,GAFA,KAAK,UAAU,gBAAqB,EAEhCZ,EAAK,QAAS,CACXA,EAAK,UACR,KAAK,WAAW,EAGlB,KAAK,IAAI,oBAA8B,EAEvC,KAAK,UAAU,UAAe,EAC9B,MACF,CAIA,IAAIa,EACE,CAAE,SAAAD,CAAS,EAAI,KAAK,IAAI,SAASZ,EAAK,MAAM,EAI9CY,IAAa,KAAK,IAAI,eACxBC,EAAkBb,EAAK,OACvB,KAAK,gBAAkB,QAGnBY,IAAa,KAAK,gBAGpBC,EAAkBb,EAAK,QAIvBa,EAAkBD,EAElB,KAAK,gBAAkB,QAItB,KAAK,IAAI,WAAWC,CAAe,IAEtC,KAAK,UAAYA,EAKbb,EAAK,SACP,KAAK,WAAWa,CAAe,EAE/B,KAAK,OAAOA,CAAe,EAGjC,CACF,GAEAjC,EAAA,0BAA6CoB,GAAS,CACpD,GAAI,KAAK,IAAI,SAAU,OAEvB,IAAMV,EAAQ,KAAK,IAAI,SAASU,EAAK,MAAM,EAE3C,GAAIV,EAAM,SAAU,CAClB,KAAK,IAAI,OAAOU,EAAK,MAAM,EAC3B,MACF,CAKEf,EAAK,aAAaK,EAAM,IAAI,EAAE,UAC7BA,EAAM,WAAa,KAAK,IAAI,eAAiBA,EAAM,WAAa,KAAK,kBAEtE,KAAK,IAAI,aAAaU,EAAK,MAAM,EAI/BV,EAAM,WAAa,KAAK,IAAI,gBAC9B,KAAK,gBAAkBA,EAAM,UAG/B,KAAK,IAAI,OAAOU,EAAK,MAAM,CAC7B,GAEApB,EAAA,yBAA4CoB,GAAS,CAC9C,KAAK,IAAI,WAAWA,EAAK,MAAM,GAClC,KAAK,IAAI,OAAOA,EAAK,MAAM,CAE/B,GAEApB,EAAA,oBAAuCoB,GAAS,CAC9C,KAAK,IAAI,aAAaA,EAAK,MAAM,CACnC,GAEApB,EAAA,sBAAyCoB,GAAS,CAChD,GAAM,CAAE,cAAec,CAAiB,EAAI,KAAK,IAIjD,sBAAsB,IAAM,CAExBA,IAAqB,KAAK,IAAI,eAC9B,KAAK,IAAI,UAAU,YAAcd,EAAK,QAEtC,KAAK,IAAI,aAAa,MAAS,CAEnC,CAAC,CACH,GAIApB,EAAA,qBAAuCoB,GAAS,CAC9C,GAAIA,EAAK,QAAS,CACXA,EAAK,UACR,KAAK,WAAW,EAGlB,KAAK,IAAI,oBAA8B,EAEvC,KAAK,UAAU,UAAe,EAC9B,MACF,CAEA,KAAK,UAAU,gBAAqB,CACtC,GAEApB,EAAA,0BAA4C,CAACoB,EAAMC,IAAM,CACvDA,EAAE,gBAAgB,CACpB,GAEArB,EAAA,uBAAwC,IAAM,EACxC,KAAK,SAAW,eAAsB,KAAK,SAAW,aACxD,KAAK,IAAI,gBAAgB,EAG3B,KAAK,UAAU,MAAW,CAC5B,GAIAA,EAAA,2BAAmDoB,GAAS,CAC1D,KAAK,oBAAsBA,EAAK,OAChC,KAAK,UAAU,sBAA2B,CAC5C,GAEApB,EAAA,iCAAyDoB,GAAS,CAChE,OAAQA,EAAK,YACN,aACA,WACA,QAAS,CACZ,KAAK,IAAI,OACP,GAAGf,EAAK,kBACN,KAAK,IAAI,MACT,KAAK,IAAI,cACTe,EAAK,OACLA,EAAK,QACP,CACF,EACA,KACF,SAEE,GAAI,KAAK,IAAI,YAAY,SAAW,EAAG,CACrC,KAAK,IAAI,YAAY,KAAK,IAAI,WAAW,EACzC,IAAMV,EAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,YAAY,EAAE,EACnD,UAAWA,GACb,KAAK,IAAI,aAAaA,EAAM,EAAE,CAElC,EAGN,GAEAV,EAAA,6BAAoD,IAAM,CACxD,KAAK,UAAU,MAAW,CAC5B,GAIAA,EAAA,qBAAwCoB,GAAS,CAC/C,KAAK,gBAAkBA,EAAK,OAC5B,KAAK,UAAU,gBAAqB,CACtC,GAEApB,EAAA,2BAA8CoB,GAAS,CACrD,GAAIA,EAAK,SAAW,OAAQ,CAC1B,GAAM,CAAE,YAAAe,CAAY,EAAI,KAAK,IAC7B,GAAIA,EAAY,SAAW,EAAG,OAC9B,IAAMzB,EAAQ,KAAK,IAAI,SAASyB,EAAY,EAAE,EAE5C9B,EAAK,aAAaK,EAAM,IAAI,EAAE,UAC7BA,EAAM,WAAa,KAAK,IAAI,eAAiBA,EAAM,WAAa,KAAK,kBAEtE,KAAK,IAAI,aAAaA,EAAM,EAAE,EAEhC,MACF,CAEA,KAAK,IAAI,iBAAiBU,EAAK,MAAM,CACvC,GAEApB,EAAA,uBAAyC,IAAM,CAC7C,KAAK,UAAU,MAAW,CAC5B,GAIAA,EAAA,oBAAqCoB,GAAS,CAC5C,IAAMgB,EAAkB,KAAK,IAAI,YAAY,GAEvCb,EAAc,KAAK,cAAca,EAAiBhB,EAAK,MAAM,EAGjEA,EAAK,SAAW,QAChBA,EAAK,SAAW,SAChBA,EAAK,SAAW,OAChBA,EAAK,SAAW,SAEZG,IACF,KAAK,IAAI,aAAaA,CAAW,EAIjC,KAAK,UAAYA,EAAY,GAC7B,KAAK,UAAU,eAAoB,IAGrC,KAAK,UAAU,aAAkB,EACjC,KAAK,IAAI,oBAA+Ba,CAAe,EAE3D,GA9pBQ,SAASjC,EAAY,CAC3B,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,YAAY,OAAQkC,GAAQA,IAAQlC,CAAE,CAAC,CACrE,CAEQ,OAAOA,EAAY,CACzB,KAAK,IAAI,OAAOA,CAAE,CACpB,CAEQ,WAAWA,EAAY,CAC7B,IAAMO,EAAQ,KAAK,IAAI,SAASP,CAAE,EAClC,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,YAAY,OAAQkC,GAAQA,IAAQ3B,EAAM,QAAQ,EAAGP,CAAE,CACrF,CAEQ,YAAa,CACnB,KAAK,IAAI,WAAW,CACtB,CAgpBF,ECjtBA,IAAAmC,GAAsB,sBACtBC,GAAgB,wBAKT,IAAMC,GAAN,cAAyBC,EAAS,CAAlC,kCACLC,EAAA,sBAEAA,EAAA,gBAIAA,EAAA,qBAAuC,IAAM,CAC3C,GAAI,MAAK,IAAI,SACb,IAAI,KAAK,oBAA4B,CACnC,KAAK,gBAAqB,EAErB,KAAK,IAAI,SAAS,cACrB,KAAK,IAAI,WAAW,QAAQ,EAG9B,MACF,CAEA,GAAI,KAAK,gBAAwB,CAC/B,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAE1B,KAAK,QAAUA,EAEf,IAAMC,EAAWC,GAAO,OAAO,CAC7B,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,MAAOU,EAAA,GAAKN,EACd,CAAC,EAEKO,EAASH,GAAO,UAAUD,CAAQ,EAExCA,EAAS,MAAQ,GAAAE,QAAI,IAAIF,EAAS,MAAO,CAACI,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,EAE9E,KAAK,IAAI,YAAY,CAACJ,CAAQ,CAAC,EAE/B,KAAK,IAAI,wBAAkC,EAE3C,KAAK,oBAAyB,CAChC,EACF,GAEAR,EAAA,mBAAqC,IAAM,CACrC,KAAK,IAAI,UACT,KAAK,sBACP,KAAK,gBAAqB,EAC1B,KAAK,IAAI,gBAAgB,EACzB,KAAK,IAAI,WAAW,QAAQ,EAC5B,KAAK,IAAI,aAAa,KAAK,OAAO,EAEtC,GACF,ECpEA,IAAAa,GAAgB,wBAIT,IAAMC,GAAN,cAAuBC,EAAS,CAAhC,kCACLC,EAAA,oBAIAA,EAAA,wBAAmB,IAAM,CACvB,KAAK,gBAAqB,EAErB,KAAK,IAAI,SAAS,cACrB,KAAK,IAAI,WAAW,QAAQ,CAEhC,GAIAA,EAAA,eAAkC,IAAM,CAExC,GAEAA,EAAA,iBAAoC,IAAM,CAE1C,GAEAA,EAAA,qBAAuC,IAAM,CAC3C,GAAI,KAAK,oBAA4B,CACnC,KAAK,iBAAiB,EACtB,MACF,CAEA,GAAI,KAAK,gBAAwB,CAC/B,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,CACvB,EAAI,KAAK,IAET,KAAK,IAAI,uBACPA,EAAW,GAAAC,QAAI,KAAKH,EAAcC,CAAW,EAAID,EACjD,OACA,EACF,EACA,KAAK,oBAAyB,EAC9B,MACF,CACF,GAEAD,EAAA,mBAAqC,IAAM,CAG3C,GAEAA,EAAA,oBAAuCK,GAAS,CAC9C,GAAI,KAAK,IAAI,SAAU,OACvB,IAAMC,EAAQ,KAAK,IAAI,SAASD,EAAK,MAAM,EACvCC,EAAM,gBACR,KAAK,gBAAqB,EAC1B,KAAK,IAAI,aAAaA,EAAM,EAAE,EAElC,GAEAN,EAAA,mBAAc,IAAM,CACd,KAAK,IAAI,UACb,KAAK,iBAAiB,CACxB,GACF,ECrEA,IAAAO,GAA6D,sBAC7DC,GAAgB,wBAKT,IAAMC,GAAN,cAA2BC,EAAS,CAApC,kCACLC,EAAA,wBAIAA,EAAA,qBAAuC,IAAM,CAE3C,GADI,KAAK,IAAI,UACT,KAAK,gBAAwB,OAEjC,GAAM,CACJ,aAAAC,EACA,YAAAC,EACA,SAAU,CAAE,SAAAC,CAAS,EACrB,SAAU,CAAE,cAAAC,EAAe,aAAAC,CAAa,CAC1C,EAAI,KAAK,IAEHC,EAAa,KAAK,kBAAkB,EAEpCC,EAAK,SAAM,SAAS,EAEpBC,EAAWC,GAAS,OAAO,CAC/B,GAAAF,EACA,SAAUH,EACV,WAAAE,EACA,MAAOH,EAAW,GAAAO,QAAI,KAAKT,EAAcC,CAAW,EAAID,EACxD,MAAOU,EAAA,GAAKN,EACd,CAAC,EAED,KAAK,IAAI,YAAY,CAACG,CAAQ,CAAC,EAE/B,KAAK,IAAI,+BAEPA,EAAS,GACT,kBAAe,YACf,EACF,EAEA,KAAK,oBAAyB,CAChC,GACF,E1D2CA,IAAMI,GAAO,SAAM,SAAS,EA6GfC,GAAN,cAAuBC,EAAyB,CAiFrD,YAAYC,EAAaC,EAAY,CAAC,EAAkB,CACtD,MAAMH,GAAS,aAAcE,EAAIF,GAAS,QAAS,CAACI,EAAMC,EAAMC,IACvDC,GACLC,EAAAC,EAAA,GACKJ,GADL,CAEE,SAAUG,EAAAC,IAAA,GAAKJ,EAAK,UAAaD,EAAK,UAA5B,CAAsC,QAASE,CAAY,EACvE,GACAN,GAAS,OACX,CACD,EAzFHU,EAAA,iBAAyB,CAAC,GAE1BA,EAAA,aAAQ,CACN,OAAQ,IAAIC,GAAW,IAAI,EAC3B,MAAO,IAAIC,GAAU,IAAI,EACzB,SAAoB,IAAIC,GAAS,IAAI,EACrC,SAAoB,IAAIC,GAAS,IAAI,EACrC,YAAuB,IAAIC,GAAY,IAAI,EAC3C,cAAyB,IAAIC,GAAc,IAAI,EAC/C,aAAwB,IAAIC,GAAa,IAAI,EAC7C,SAAoB,IAAIC,GAAS,IAAI,EACrC,UAAqB,IAAIC,GAAU,IAAI,EACvC,WAAsB,IAAIC,GAAW,IAAI,EACzC,QAAmB,IAAIC,GAAQ,IAAI,CACrC,GAEAX,EAAA,mBAAwB,KAAK,MAAM,QAEnCA,EAAA,gBAEAA,EAAA,gBAAW,IAEXA,EAAA,eAAU,IAEVA,EAAA,kBAAa,IAEbA,EAAA,mBAAc,CAAC,EAAG,CAAC,GAEnBA,EAAA,oBAAe,CAAC,EAAG,CAAC,GAEpBA,EAAA,qBAAgB,CAAC,EAAG,CAAC,GAErBA,EAAA,gBAAW,IAEXA,EAAA,cAAS,IAETA,EAAA,eAAU,IAEVA,EAAA,eAAU,IAEVA,EAAA,gBAAW,IAEXA,EAAA,kBAAa,IAEbA,EAAA,sBAAiB,IAEjBA,EAAA,wBAAmB,IAEnBA,EAAA,wBAAmB,IAEnBA,EAAA,wBAAmB,IAEnBA,EAAA,wBAAgD,MAEhDA,EAAA,gBAAW,SAAM,oBAAoB,CACnC,CAAC,EAAG,CAAC,EACL,CAAC,IAAK,GAAG,CACX,CAAC,GAEDA,EAAA,sBAAiB,SAAM,oBAAoB,CACzC,CAAC,EAAG,CAAC,EACL,CAAC,IAAK,GAAG,CACX,CAAC,GAEDA,EAAA,qBAAgB,CACd,MAAO,CAAC,CAAC,CAAC,EACV,QAAS,CACX,GAEAA,EAAA,kBAMAA,EAAA,oBAAe,CACb,YAAa,CAAC,EACd,OAAQ,CAAC,EAAG,CAAC,CACf,GAkBAA,EAAA,KAAU,UAAWY,GACZf,GAAQe,EAAOtB,GAAS,OAAO,GAGxCU,EAAA,KAAU,UAAU,IAAM,CA1S5B,IAAAa,EAAAC,EA2SI,KAAK,aAAa,KAAK,QAAQ,EAE/BC,GAAe,EAAE,KAAMC,GAAe,CACpC,KAAK,iBAAmBA,CAC1B,CAAC,EAED,GAAI,CACF,KAAK,WAAWlB,EAAAC,EAAA,GACXF,GAAQ,KAAK,MAAOP,GAAS,OAAO,GADzB,CAEd,SAAU,CACR,aACF,CACF,EAAC,CACH,OAAS2B,EAAP,CACA,QAAQ,MAAM,+CAAgDA,CAAC,EAC/D,aAAa,QAAQ,KAAK,SAAS,GAAK,aAAc,KAAK,UAAU,KAAK,QAAQ,CAAC,EAEnF,KAAK,WAAWnB,EAAAC,EAAA,GACXT,GAAS,cADE,CAEd,SAAUQ,EAAAC,EAAA,GACLT,GAAS,aAAa,UADjB,CAER,aACF,EACF,EAAC,CACH,EAEAwB,GAAAD,EAAA,KAAK,WAAU,UAAf,MAAAC,EAAA,KAAAD,EAAyB,KAC3B,GASAb,EAAA,KAAU,UAAU,CAACY,EAAmBlB,IAAiC,CA/U3E,IAAAmB,EAgVI,IAAMlB,EAAmBI,EAAA,GAAKa,GAG1BjB,EAAK,WAAaD,EAAK,UACzB,OAAO,QAAQC,EAAK,SAAS,KAAK,EAAE,QAAQ,CAAC,CAACuB,EAAQC,CAAI,IAAM,CAC9D,GAAIA,IAAS,OAAW,CAEtB,OAAOxB,EAAK,SAAS,MAAMuB,GAC3B,OAAOvB,EAAK,SAAS,WAAWuB,GAChC,MACF,CAEA,IAAME,EAAW1B,EAAK,SAAS,MAAMwB,GAE/BG,EAAqD,CAAC,EAE5D,GAAI,CAACD,GAAYD,EAAK,SAAWC,EAAS,QAAUD,EAAK,WAAaC,EAAS,SAAU,CACvFD,EAAK,OAASpB,EAAA,GAAKoB,EAAK,QACxBA,EAAK,SAAWpB,EAAA,GAAKoB,EAAK,UAE1B,IAAMG,EAAiB,IAAI,IAG3B,OAAO,QAAQH,EAAK,MAAM,EAAE,QAAQ,CAAC,CAAC3B,EAAI+B,CAAK,IAAM,CAvW/D,IAAAV,EAwWY,IAAIW,EAECD,EAIHC,EAAWD,EAAM,UAHjBC,GAAWX,EAAAO,GAAA,YAAAA,EAAU,OAAO5B,KAAjB,YAAAqB,EAAsB,SACjC,OAAOM,EAAK,OAAO3B,IAKjB2B,EAAK,KAAOxB,EAAK,SAAS,gBACxByB,GAAA,YAAAA,EAAU,OAAO5B,MAAQ+B,IAC3BF,EAAc7B,GAAM+B,GAMpBC,GAAYA,IAAaN,GACbC,EAAK,OAAOK,KACZ,QACZF,EAAe,IAAIH,EAAK,OAAOK,EAAuB,CAG5D,CAAC,EAGD,OAAO,KAAKL,EAAK,QAAQ,EAAE,QAAS3B,GAAO,CACpC2B,EAAK,SAAS3B,IACjB,OAAO2B,EAAK,SAAS3B,EAEzB,CAAC,EAEDG,EAAK,SAAS,MAAMuB,GAAUC,EAG9B,IAAMM,EAAmBC,EAAK,mBAAmB/B,EAAM,OAAO,KAAK0B,CAAa,EAAGH,CAAM,EAEnFS,EAAgB,IAAI,IAG1BF,EAAiB,QAASG,GAAY,CACpC,GAAI,CAACT,EAAK,SAASS,EAAQ,IACzB,OAGF,IAAMC,EAAUV,EAAK,OAAOS,EAAQ,MAC9BE,EAAYX,EAAK,OAAOS,EAAQ,QAEtC,GAAI,EAAEC,GAAWC,GAAY,CAC3B,OAAOnC,EAAK,SAAS,MAAMuB,GAAQ,SAASU,EAAQ,IACpD,MACF,CAEA,GAAID,EAAc,IAAIG,CAAS,EAC7B,OAGF,IAAMC,EAAYL,EAAK,oBAAoBP,EAAMW,CAAS,EAG1D,GAFAH,EAAc,IAAIG,CAAS,EAEvBC,EAAW,CACb,IAAMC,EAAYjC,IAAA,GACb+B,GACAC,GAELZ,EAAK,OAAOW,EAAU,IAAME,CAC9B,CACF,CAAC,EAEDV,EAAe,QAASW,GAAU,CAChC,GAAI,CAACA,EAAO,MAAM,MAAM,WAAW,EACnC,IAAMC,EAAWD,EAAM,SAAS,OAAQzC,GAAO2B,EAAK,OAAO3B,KAAQ,MAAS,EAEtE2C,EAAe,SAAM,gBACzBD,EACG,IAAK1C,GAAO2B,EAAK,OAAO3B,EAAG,EAC3B,OAAO,OAAO,EACd,IAAK+B,GAAUG,EAAK,iBAAiBH,CAAK,CAAC,CAChD,EAEAJ,EAAK,OAAOc,EAAM,IAAMnC,EAAAC,EAAA,GACnBkC,GADmB,CAEtB,MAAO,CAACE,EAAa,KAAMA,EAAa,IAAI,EAC5C,KAAM,CAACA,EAAa,MAAOA,EAAa,MAAM,EAC9C,SAAAD,CACF,EACF,CAAC,CACH,CAIA,IAAME,EAA6BrC,EAAA,GAC9BJ,EAAK,SAAS,WAAWuB,IAGzBkB,EAAc,OACjB,OAAOA,EAAc,MAGnBA,EAAc,WAAa,CAACjB,EAAK,OAAOiB,EAAc,YACxD,OAAOA,EAAc,UAGnBA,EAAc,WAAa,CAACjB,EAAK,SAASiB,EAAc,aAC1DV,EAAK,KAAK,iCAAiCR,GAAQ,EACnD,OAAOkB,EAAc,WAGnBA,EAAc,WAAa,CAACjB,EAAK,OAAOiB,EAAc,aACxDV,EAAK,KAAK,mCAAmC,EAC7C,OAAOU,EAAc,WAGvBzC,EAAK,SAAS,WAAWuB,GAAUkB,CACrC,CAAC,EAGH,OAAO,MAAKvB,EAAAlB,EAAK,SAAS,SAAd,KAAAkB,EAAwB,CAAC,CAAC,EAAE,QAASrB,GAAO,CA7d5D,IAAAqB,EAAAC,GA8dWD,EAAAlB,EAAK,SAAS,SAAd,MAAAkB,EAAuBrB,KAC1BsB,EAAOnB,EAAK,SAAS,SAArB,aAAAmB,EAA8BtB,EAElC,CAAC,EAED,IAAM6C,EAAgB1C,EAAK,SAAS,cAE9B2C,EAAmB3C,EAAK,SAAS,WAAW0C,GAElD,GAAI1C,EAAK,MAAQA,EAAK,OAASD,EAAK,KAAM,CACxC,IAAM6C,EAAOzC,EAAAC,EAAA,GAAKJ,EAAK,MAAV,CAAgB,MAAOI,EAAA,GAAKJ,EAAK,KAAK,MAAQ,GAGvDD,EAAK,MACP,OAAO,OAAOA,EAAK,KAAK,KAAK,EAC1B,OAAO,OAAO,EACd,QAAS8C,GAAS,CACbD,EAAK,MAAMC,EAAK,MAAQ,QAC1B,OAAOD,EAAK,MAAMC,EAAK,GAE3B,CAAC,EAGL7C,EAAK,KAAO4C,CACd,CAEA,OAAI5C,EAAK,OACPA,EAAK,KAAK,MAAMA,EAAK,KAAK,QAAUG,EAAAC,EAAA,GAC/BJ,EAAK,KAAK,MAAMA,EAAK,KAAK,SADK,CAElC,MAAO,KAAK,aACZ,YAAa2C,EAAiB,WAChC,IAME,KAAK,WACP3C,EAAK,SAAS,MAAQD,EAAK,SAAS,OAG/BC,CACT,GAEAK,EAAA,KAAQ,iBAAiB,CAACyC,EAAmBC,IAA0B,CA1gBzE,IAAA7B,EAAAC,EAAA6B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA2gBI,IAAM5B,EAAqD,CAAC,EACtD6B,EAAyD,CAAC,EAC1DC,EAAqD,CAAC,EAEtDC,GAAST,GAAA7B,GAAAD,EAAA4B,GAAA,YAAAA,EAAO,WAAP,YAAA5B,EAAiB,QAAjB,YAAAC,EAAyB,KAAK,iBAA9B,YAAA6B,EAA8C,OACvDU,GAAWP,GAAAD,GAAAD,EAAAH,GAAA,YAAAA,EAAO,WAAP,YAAAG,EAAiB,QAAjB,YAAAC,EAAyB,KAAK,iBAA9B,YAAAC,EAA8C,SACzDQ,GAASP,EAAAN,GAAA,YAAAA,EAAO,WAAP,YAAAM,EAAiB,OAE5BK,GACF,OAAO,KAAKA,CAAM,EAAE,QAAS5D,GAAO,CAClC6B,EAAc7B,GAAO,KAAK,SAASA,EAAI,KAAK,aAAa,CAC3D,CAAC,EAGC6D,GACF,OAAO,KAAKA,CAAQ,EAAE,QAAS7D,GAAO,CACpC0D,EAAgB1D,GAAM,KAAK,WAAWA,EAAI,KAAK,aAAa,CAC9D,CAAC,EAGC8D,GACF,OAAO,KAAKA,CAAM,EAAE,QAAS9D,GAAO,CAClC2D,EAAc3D,GAAM,KAAK,SAAS,OAAOA,EAC3C,CAAC,GAGHyD,GAAAD,EAAA,KAAK,WAAU,eAAf,MAAAC,EAAA,KAAAD,EAA8B,KAAM3B,EAAe6B,EAAiBC,EAAeT,EACrF,GAEA1C,EAAA,eAAU,CAACY,EAAmB6B,EAAmBjD,IAAgB,CAxiBnE,IAAAqB,EAAAC,EAAA6B,EAAAC,EAAAC,EAAAC,GA0iBO,KAAK,UAAU,gBAAgBhC,GAAAD,EAAA4B,GAAA,YAAAA,EAAO,WAAP,YAAA5B,EAAiB,QAAjB,YAAAC,EAAyB,KAAK,mBAC9D6B,EAAAF,GAAA,YAAAA,EAAO,WAAP,YAAAE,EAAiB,aAGfC,EAAAH,GAAA,YAAAA,EAAO,WAAP,YAAAG,EAAiB,SAChB,KAAK,SACJ,KAAK,QAAQ,gBACb,KAAK,QAAQ,gBACb,KAAK,QAAQ,gBAEf,KAAK,eAAeH,EAAO,EAAK,GAIpCK,GAAAD,EAAA,KAAK,WAAU,UAAf,MAAAC,EAAA,KAAAD,EAAyB,KAAMJ,EAAOjD,EACxC,GAEAQ,EAAA,iBAAY,CAACY,EAAmB2C,EAAuB/D,IAAgB,CA3jBzE,IAAAqB,EAAAC,EA4jBI,KAAK,mBAAmB,EACxB,KAAK,QAAU,IACfA,GAAAD,EAAA,KAAK,WAAU,YAAf,MAAAC,EAAA,KAAAD,EAA2B,KAAM0C,EAAS/D,EAC5C,GAEAQ,EAAA,iBAAY,IAAM,CAChB,KAAK,mBAAmB,EACxB,KAAK,QAAU,EACjB,GAEAA,EAAA,cAAS,IAAM,CAtkBjB,IAAAa,EAAAC,EAukBI,KAAK,aAAa,YAAc,CAAC,GAAG,KAAK,WAAW,GACpDA,GAAAD,EAAA,KAAK,WAAU,SAAf,MAAAC,EAAA,KAAAD,EAAwB,KAC1B,GAEAb,EAAA,cAAS,IAAM,CA3kBjB,IAAAa,EAAAC,EA4kBI,KAAK,aAAa,YAAc,CAAC,GAAG,KAAK,WAAW,GACpDA,GAAAD,EAAA,KAAK,WAAU,SAAf,MAAAC,EAAA,KAAAD,EAAwB,KAC1B,GAEAb,EAAA,iBAAY,CAACY,EAAmB6B,IAAsB,CAhlBxD,IAAA5B,EAAAC,GAmlBIA,GAAAD,EAAA,KAAK,WAAU,YAAf,MAAAC,EAAA,KAAAD,EAA2B,MAC3B,KAAK,eAAe4B,EAAO,EAAI,CACjC,GAEAzC,EAAA,KAAQ,kBAAkB,KAAK,aAO/BA,EAAA,KAAU,mBAAmB,CAACwD,EAAoBhE,IAAsB,CA9lB1E,IAAAqB,EAAAC,EAAA6B,EAAAC,GA+lBI9B,GAAAD,EAAA,KAAK,WAAU,WAAf,MAAAC,EAAA,KAAAD,EAA0B,KAAMrB,GAE5B,KAAK,MAAQ,KAAK,cAAgB,KAAK,mBACzCoD,GAAAD,EAAA,KAAK,WAAU,mBAAf,MAAAC,EAAA,KAAAD,EAAkC,KAAM7C,EAAAC,EAAA,GACnC,KAAK,KAAK,MAAM,KAAK,KAAK,SADS,CAEtC,YAAa,KAAK,YAClB,QAAS,CAAC,CAAC,KAAK,OAClB,IACA,KAAK,gBAAkB,KAAK,YAEhC,GAEAC,EAAA,KAAQ,eAAe,IAAM,CAC3B,GAAI,KAAK,iBAAkB,OAE3B,IAAMyD,EAAWC,GAA0BA,EAAM,yBAAyB,EAEpEC,EAAS,IAAM,CACnB,WAAW,IAAM,CACf,SAAS,oBAAoB,QAASF,EAAS,CAAE,QAAS,EAAK,CAAC,EAChE,KAAK,iBAAmB,EAC1B,EAAG,EAAE,CACP,EAEA,SAAS,iBAAiB,QAASA,EAAS,CAAE,QAAS,EAAK,CAAC,EAC7D,OAAO,iBAAiB,YAAaE,EAAQ,CAAE,KAAM,EAAK,CAAC,EAC3D,KAAK,iBAAmB,EAC1B,GAIA3D,EAAA,KAAQ,WAAW,IAEnBA,EAAA,0BAAqB,CAAC4D,EAA2B1C,EAAS,KAAK,gBAAkB,CAC/E,GAAM,CAAE,SAAAmC,CAAS,EAAI,KAAK,SAAS,MAAMnC,GAGnC2C,EAA0C,CAAC,EAC3CC,EAA8C,CAAC,EAG/CC,EAAc,OAAO,OAAOV,CAAQ,EACpCW,EAAW,IAAI,IAAID,EAAY,IAAKnC,GAAY,CAACA,EAAQ,KAAMA,CAAO,CAAC,CAAC,EACxEqC,EAAa,IAAI,IAAIF,EAAY,IAAKnC,GAAY,CAACA,EAAQ,OAAQA,CAAO,CAAC,CAAC,EAC5EsC,EAAc,CAACF,EAAUC,CAAU,EAGnCE,EAA6B,CAAC,EAEhC,KAAK,SAASP,EAAgB,QAASpE,GAAO2E,EAAiB,KAAK3E,CAAE,CAAC,EACvE,KAAK,UAAU,WAAW2E,EAAiB,KAAK,KAAK,UAAU,SAAS,EAE5E,IAAMC,EAAyB,IAAI,IAAID,CAAgB,EAGjDE,EAAU,IAAI,IAGpB,KAAOF,EAAiB,OAAS,GAAG,CAClC,IAAM3E,EAAK2E,EAAiB,IAAI,EAChC,GAAI,CAAC3E,EAAI,MACT,GAAI6E,EAAQ,IAAI7E,CAAE,EAAG,SAGrB6E,EAAQ,IAAI7E,CAAE,EAGd,IAAM+B,EAAQ,KAAK,SAAS/B,CAAE,EAC9BqE,EAAerE,GAAM+B,EAEjBA,EAAM,WAAaL,GAAQiD,EAAiB,KAAK5C,EAAM,QAAQ,EAG/DA,EAAM,UAAU4C,EAAiB,KAAK,GAAG5C,EAAM,QAAQ,EAI3D2C,EACG,IAAKI,GAAQA,EAAI,IAAI/C,EAAM,EAAE,CAAE,EAC/B,OAAO,OAAO,EACd,QAASK,GAAY,CACpBkC,EAAiBlC,EAAQ,IAAMA,EAC/BuC,EAAiB,KAAKvC,EAAQ,KAAMA,EAAQ,MAAM,CACpD,CAAC,CACL,CAEA,MAAO,CAAE,eAAAiC,EAAgB,iBAAAC,EAAkB,uBAAAM,CAAuB,CACpE,GAKApE,EAAA,KAAO,qBAAqB,CAC1BoD,EACAC,EACAC,EACApC,EAAS,KAAK,gBACL,CACT,GAAI,KAAK,SAEP,YAAK,SAAW,GACT,KAGT,IAAMC,EAAO,KAAK,SAAS,MAAM,KAAK,eAEtC,cAAO,OAAOiC,CAAM,EAAE,QAAS7B,GAAU,CACnCA,EAAM,WAAaL,GAAU,EAAEC,EAAK,OAAOI,EAAM,WAAa6B,EAAO7B,EAAM,aAC7E,QAAQ,KAAK,4CAA4C,EACzDA,EAAM,SAAWL,EAErB,CAAC,EAED,KAAK,SAAS,SAAUqD,GAAY,CAClC,GAAM,CAAE,UAAAC,EAAW,UAAAC,EAAW,UAAAC,EAAW,YAAAC,CAAY,EAAIJ,EAAQ,SAAS,WAAWrD,GAE/E0C,EAAkB,CAAC,GAAGe,CAAW,EAEjCC,EAAeH,GAAaF,EAAQ,SAAS,MAAM,KAAK,eAAe,OAAOE,GAChFG,GAAchB,EAAgB,KAAKgB,EAAa,EAAE,EAEtD,GAAM,CAAE,eAAAf,EAAgB,iBAAAC,EAAkB,uBAAAM,CAAuB,EAAI,KAAK,mBACxER,EACA,KAAK,aACP,EAGA,OAAO,OAAOC,CAAc,EAEzB,OAAQgB,GAAkB,EAAE,SAAUA,EAAc,EACpD,QAASA,GAAkB,CAC1B,IAAMC,EAAgB1B,EAAOyB,EAAc,IAC3C,GAAI,EAACC,EAOL,IACE,EACED,EAAc,gBACdT,EAAuB,IAAIS,EAAc,EAAE,GAE7C,CACAzB,EAAOyB,EAAc,IAAMC,EAC3B,MACF,CAKI,gBAAiBA,GAAiB,gBAAiBD,IACrDzB,EAAOyB,EAAc,IAAM/E,EAAAC,EAAA,GAAK8E,GAAL,CAAoB,YAAaC,EAAc,WAAY,IAIxFD,EAAc,MAAQC,EAAc,MACtC,CAAC,EAOH,IAAMC,EAAahF,IAAA,GACdqD,GACAS,GAGDe,IACFG,EAAWH,EAAa,IAAMA,GAGhC,IAAMI,EAAejF,IAAA,GAChBsD,GACAS,GAECmB,EAAalF,EAAA,GACduD,GAGC3D,EAAmBG,EAAAC,EAAA,GACpBwE,GADoB,CAEvB,SAAUzE,EAAAC,EAAA,GACLwE,EAAQ,UADH,CAER,MAAO,CACL,CAACrD,GAASpB,EAAAC,EAAA,GACLwE,EAAQ,SAAS,MAAMrD,IADlB,CAER,OAAQ6D,EACR,SAAUC,CACZ,EACF,EACA,OAAQC,EACR,WAAYnF,EAAAC,EAAA,GACPwE,EAAQ,SAAS,YADV,CAEV,CAACrD,GAASpB,EAAAC,EAAA,GACLwE,EAAQ,SAAS,WAAWrD,IADvB,CAER,YAAayD,EAAY,OAAQnF,GAAOuF,EAAWvF,KAAQ,MAAS,EACpE,UAAWgF,EACPO,EAAWP,KAAe,OACxB,OACAA,EACF,OACJ,UAAWC,EACX,UAAWC,EACPM,EAAaN,KAAe,OAC1B,OACAA,EACF,MACN,EACF,EACF,EACF,GACMvD,EAAOxB,EAAK,SAAS,MAAMuB,GAG3BO,EAAmBC,EAAK,mBAAmB/B,EAAM,OAAO,KAAKoF,CAAU,EAAG7D,CAAM,EAEhFS,EAAgB,IAAI,IAG1B,OAAAF,EAAiB,QAASG,GAAY,CACpC,GAAI,CAACT,EAAK,SAASS,EAAQ,IACzB,OAGF,IAAME,EAAYX,EAAK,OAAOS,EAAQ,QAEtC,GAAID,EAAc,IAAIG,CAAS,EAC7B,OAIF,IAAMC,EAAYL,EAAK,oBAAoBP,EAAMW,CAAS,EAG1D,GAFAH,EAAc,IAAIG,CAAS,EAEvBC,EAAW,CACb,IAAMC,EAAYjC,IAAA,GACb+B,GACAC,GAGLZ,EAAK,OAAOW,EAAU,IAAME,CAC9B,CACF,CAAC,EAED,OAAO,OAAO+C,CAAU,EAAE,QAASxD,GAAU,CAC3C,GAAIA,EAAM,eAA4B,OAEtC,IAAMW,EAAWX,EAAM,SAAS,OAAQ/B,GAAO2B,EAAK,OAAO3B,KAAQ,MAAS,EAEtE2C,EAAe,SAAM,gBACzBD,EACG,IAAK1C,GAAO2B,EAAK,OAAO3B,EAAG,EAC3B,OAAO,OAAO,EACd,IAAK+B,GAAUG,EAAK,iBAAiBH,CAAK,CAAC,CAChD,EAEAJ,EAAK,OAAOI,EAAM,IAAMzB,EAAAC,EAAA,GACnBwB,GADmB,CAEtB,MAAO,CAACY,EAAa,KAAMA,EAAa,IAAI,EAC5C,KAAM,CAACA,EAAa,MAAOA,EAAa,MAAM,EAC9C,SAAAD,CACF,EACF,CAAC,EAED,KAAK,MAAM,SAAWvC,EAAK,SAEpBA,CACT,EAAG,EAAI,EAEA,IACT,GAqBAK,EAAA,oBAAgBkF,GAAqB,CACnC,KAAK,eAAiBA,EACtB,GAAM,CAAE,MAAAC,EAAO,KAAAC,CAAK,EAAI,KAAK,OAC7B,KAAK,eAAeD,EAAOC,CAAI,EAE3B,CAAC,KAAK,UAAY,KAAK,SACzB,KAAK,QAAQ,OAAO,CAExB,GAEApF,EAAA,sBAAiB,CAACmF,EAAiBC,IAAiB,CAClD,GAAM,CAAE,MAAAC,EAAO,OAAAC,CAAO,EAAI,KAAK,eACzB,CAACC,EAAMC,CAAI,EAAI,OAAI,IAAI,OAAI,IAAI,CAAC,EAAG,CAAC,EAAGJ,CAAI,EAAGD,CAAK,EACnD,CAACM,EAAMC,CAAI,EAAI,OAAI,IAAI,OAAI,IAAI,CAACL,EAAOC,CAAM,EAAGF,CAAI,EAAGD,CAAK,EAElE,KAAK,SAAW,CACd,KAAAI,EACA,KAAAC,EACA,KAAAC,EACA,KAAAC,EACA,MAAOD,EAAOF,EACd,OAAQG,EAAOF,CACjB,CACF,GAMAxF,EAAA,oBAAe,CAACR,EAAamG,EAAa,KAAU,CAClD,GAAI,MAAK,SAET,IAAInG,EAEF,KAAK,oBAA+BA,EAAImG,CAAU,MAC7C,CAEL,GAAI,CAAC,KAAK,UAAU,UAAW,OAG/B,KAAK,gBAAgB,CACvB,CAEA,KAAK,iBAAmB,YAAY,IAAI,EAExC,KAAK,WACH,CACE,SAAU,CACR,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,UAAWnG,CACb,CACF,CACF,CACF,EACA,gBACF,EACF,GAMAQ,EAAA,oBAAgBR,GAAgB,CAC9B,KAAK,WACH,CACE,SAAU,CACR,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,UAAWA,CACb,CACF,CACF,CACF,EACA,gBACF,CACF,GAUAQ,EAAA,wBAAoBR,GAAgB,CAClC,KAAK,WAAW,CAAE,SAAU,CAAE,cAAeA,CAAG,CAAE,EAAG,qBAAqB,CAC5E,GAKAQ,EAAA,kBAAa,CACX4F,EACAC,IACS,CACT,GAAI,KAAK,QAAS,OAAO,KAEzB,IAAMpD,EAAQ,CACZ,SAAU,CACR,CAACmD,GAAO,OAAOC,GAAU,WAAaA,EAAM,KAAK,SAASD,EAAU,EAAIC,CAC1E,CACF,EAEA,YAAK,WAAWpD,EAAO,YAAYmD,GAAM,EAEzC,KAAK,QAAQnD,CAAK,EACX,IACT,GAKAzC,EAAA,uBAAkB,IAAY,CAC5B,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CACZ,SAAU,CACR,YAAa,CAAC,KAAK,SAAS,WAC9B,CACF,EAEA,YAAK,WAAWA,EAAO,6BAA6B,EAEpD,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,qBAAgB,IAAY,CAC1B,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CACZ,SAAU,CACR,UAAW,CAAC,KAAK,SAAS,SAC5B,CACF,EACA,YAAK,WAAWA,EAAO,2BAA2B,EAClD,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,sBAAiB,IAAY,CAC3B,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CAAE,SAAU,CAAE,WAAY,CAAC,KAAK,SAAS,UAAW,CAAE,EACpE,YAAK,WAAWA,EAAO,4BAA4B,EACnD,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,sBAAiB,IAAM,CACrB,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CAAE,SAAU,CAAE,WAAY,CAAC,KAAK,SAAS,UAAW,CAAE,EACpE,YAAK,WAAWA,EAAO,4BAA4B,EACnD,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,uBAAkB,IAAM,CACtB,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CAAE,SAAU,CAAE,YAAa,CAAC,KAAK,SAAS,WAAY,CAAE,EACtE,YAAK,WAAWA,EAAO,wBAAwB,EAC/C,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,mBAAe8F,GAA0B,CACvC,IAAMrD,EAAQ,CAAE,SAAU,CAAE,WAAYqD,CAAO,CAAE,EACjD,YAAK,WAAWrD,EAAO,wBAAwB,EAC/C,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,oBAAgB+F,GAA6B,CAC3C,IAAMtD,EAAQ,CAAE,SAAU,CAAE,UAAAsD,CAAU,CAAE,EACxC,YAAK,WAAWtD,EAAO,uBAAuB,EAC9C,KAAK,QAAQA,CAAK,EACX,IACT,GAEAzC,EAAA,wBAAoBgG,IAClB,KAAK,WAAW,CAAE,SAAU,CAAE,cAAAA,CAAc,CAAE,EAAG,2BAA2B,EACrE,OAkBThG,EAAA,kBAAa,IAAY,CACvB,GAAI,KAAK,QAAS,OAAO,KACzB,IAAMyC,EAAQ,CAAE,SAAU,CAAE,SAAU,CAAC,KAAK,SAAS,QAAS,CAAE,EAChE,YAAK,WAAWA,EAAO,uBAAuB,EAC9C,KAAK,QAAQA,CAAK,EACX,IACT,GAKAzC,EAAA,wBAAmB,IAAY,CAC7B,GAAI,KAAK,QAAS,OAAO,KAEzB,IAAMyC,EAAQ,CAAE,SAAU,CAAE,WADX,KAAK,SAAS,aAAe,WAAa,WAAa,UACI,CAAE,EAC9E,YAAK,WAAWA,EAAO,8BAA8B,EACrD,KAAK,QAAQA,CAAK,EACX,IACT,GAUAzC,EAAA,kBAAciG,GAA2B,CACvC,GAAI,KAAK,UAAY,KAAK,QAAS,OAAO,KAE1C,KAAK,WAAa,GAElB,IAAMC,EAAO,KAAK,MAAMD,GAExB,OAAIC,IAAS,KAAK,aAChB,KAAK,WAAW,CACd,SAAU,CACR,aAAc,EAChB,CACF,CAAC,EACM,OAGT,KAAK,YAAY,OAAO,EACxBA,EAAK,SAAW,KAAK,YAAY,KACjC,KAAK,YAAcA,EACnB,KAAK,YAAY,QAAQ,EAElB,KAAK,WACV,CACE,SAAU,CACR,WAAYD,EACZ,aAAc,EAChB,CACF,EACA,iBAAiBA,GACnB,EACF,GAKAjG,EAAA,sBAAiB,IACX,KAAK,QAAgB,KAClB,KAAK,WACV,CACE,SAAU,CACR,aAAc,CAAC,KAAK,SAAS,YAC/B,CACF,EACA,mBACF,GAUFA,EAAA,qBAAgB,IAAY,CAC1B,GAAI,KAAK,QAAS,OAAO,KACzB,KAAK,QAAU,OACf,KAAK,YAAc,KAAK,MAAM,OAE9B,IAAMmG,EAAM7G,GAAS,gBAGrB,OAAA6G,EAAI,MAAM,KAAQ,KAAO,SAEzB,KAAK,aAAa,EAAE,mBAAmB,EAAE,aAAa7G,GAAS,eAAe,EAAE,QAAQ,CAAC,CAAC,EAEnF,IACT,GAMAU,EAAA,mBAAc,CAACoG,EAAiBC,EAAc,KAAU,CACtD,KAAK,WACH,CACE,KAAM,CACJ,MAAO,OAAO,YAAYD,EAAM,IAAK5D,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,CAChE,CACF,EACA6D,EAAc,mBAAqB,kBACrC,CACF,GAEArG,EAAA,kBAAcsG,GAAmB,CAC/B,KAAK,WAAW,CACd,KAAM,CACJ,MAAO,CACL,CAACA,GAAS,MACZ,CACF,CACF,CAAC,CACH,GAMAtG,EAAA,qBAAiBuG,GAA+B,CAE9C,GAAI,KAAK,SAAS,KAAOA,EAAS,GAChC,YAAK,aAAazG,EAAAC,EAAA,GACbF,GACDC,EAAAC,EAAA,GACK,KAAK,OADV,CAEE,SAAAwG,CACF,GACAjH,GAAS,OACX,GAPgB,CAQhB,SAAUQ,EAAAC,EAAA,GACL,KAAK,UADA,CAER,cAAe,OAAO,KAAKwG,EAAS,KAAK,EAAE,EAC7C,EACF,EAAC,EACM,KAKT,IAAMC,EAAoBzG,EAAA,GAAK,KAAK,SAAS,YAGvC0G,EAAe3G,EAAAC,EAAA,GAChB,KAAK,UADW,CAEnB,cAAewG,EAAS,MAAM,KAAK,eAC/B,KAAK,cACL,OAAO,KAAKA,EAAS,KAAK,EAAE,GAChC,MAAO,OAAO,OAAOA,EAAS,KAAK,EAAE,IAAI,CAACpF,EAAMuF,KAAO,CACrD,GAAIvF,EAAK,GACT,KAAMA,EAAK,KACX,WAAYA,EAAK,YAAcuF,CACjC,EAAE,CACJ,GAGA,KAAK,aAAa,EAElB,OAAO,KAAK,KAAK,SAAS,KAAK,EAAE,QAASxF,GAAW,CAC9CqF,EAAS,MAAMrF,KACdA,IAAW,KAAK,SAAS,gBAC3B,KAAK,cAAc,EACnB,KAAK,WAAW,GAGlBsF,EAAkBtF,GAAU,OAEhC,CAAC,EAIG,KAAK,SACP,KAAK,YACF,OAAQ1B,GAAO,CAAC+G,EAAS,MAAM,KAAK,eAAe,OAAO/G,EAAG,EAC7D,QAASA,GAAQ+G,EAAS,MAAM,KAAK,eAAe,OAAO/G,GAAM,KAAK,KAAK,OAAOA,EAAI,EAI3F,OAAO,QAAQgH,CAAiB,EAAE,QAAQ,CAAC,CAACtF,EAAQyF,CAAS,IAAM,CACjEA,EAAU,YAAcA,EAAU,YAAY,OAC3CnH,GAAO,CAAC,CAAC+G,EAAS,MAAMrF,GAAQ,OAAO1B,EAC1C,CACF,CAAC,EAID,GAAM,CAAE,UAAAiF,CAAU,EAAI,KAAK,UAE3B,OAAIA,IACF8B,EAAS,MAAM,KAAK,eAAe,OAAO9B,GAAa,KAAK,KAAK,OAAOA,GACxE+B,EAAkB,KAAK,eAAe,YAAc,CAAC/B,CAAS,GAGzD,KAAK,aACV3E,EAAAC,EAAA,GACKF,GACDC,EAAAC,EAAA,GAAK,KAAK,OAAV,CAAiB,SAAUD,EAAAC,EAAA,GAAKwG,GAAL,CAAe,WAAYC,CAAkB,EAAE,GAC1ElH,GAAS,OACX,GAJF,CAKE,SAAUmH,CACZ,GACA,OACF,CACF,GAMAzG,EAAA,sBAAiB,CAACuG,EAAsBK,EAAS,qBAA6B,CAC5E,IAAMC,EAAY,KAAK,MAEjBC,EAAYhH,EAAAC,EAAA,GACb8G,GADa,CAEhB,SAAU/G,EAAAC,EAAA,GACL8G,EAAU,UADL,CAER,OAAQN,EAAS,MACnB,EACF,GAEKA,EAAS,MAAM,KAAK,iBACvBO,EAAU,SAAWhH,EAAAC,EAAA,GAChB8G,EAAU,UADM,CAEnB,cAAe,OAAO,KAAKN,EAAS,KAAK,EAAE,EAC7C,IAGF,IAAIG,EAAI,EAER,QAAWK,KAAY,OAAO,OAAOR,EAAS,KAAK,EAC7CQ,IAAaF,EAAU,SAAS,MAAME,EAAS,MACjDD,EAAU,SAAS,MAAMC,EAAS,IAAMA,EAEnCA,EAAS,OACZD,EAAU,SAAS,MAAMC,EAAS,IAAI,KAAO,QAAQL,EAAI,IACzDA,MAKN,QAAWtE,KAAiB,OAAO,OAAOmE,EAAS,UAAU,EAC3D,GAAInE,IAAkByE,EAAU,SAAS,WAAWzE,EAAc,IAAK,CACrE0E,EAAU,SAAS,WAAW1E,EAAc,IAAMA,EAElD,IAAM2E,EAAWR,EAAS,MAAMnE,EAAc,IACxC4E,EAAc,CAAC,YAAa,YAAa,YAAa,WAAW,EAEvE,QAAWC,KAAOD,EACXD,EAAS,OAAOE,KACnB7E,EAAc6E,GAAO,QAIzB7E,EAAc,YAAcA,EAAc,YAAY,OACnD5C,GAAO,CAAC,CAAC+G,EAAS,MAAMQ,EAAS,IAAI,OAAOvH,EAC/C,CACF,CAGF,OAAO,KAAK,aACVK,GAAQiH,EAAWA,EAAU,SAAS,SAAW,CAAC,EAClD,GAAGF,KAAUL,EAAS,IACxB,CACF,GAMAvG,EAAA,gBAAYkH,IACV,KAAK,WAAW,CACd,KAAM,CACJ,GAAIA,EACJ,OAAQ7H,GACR,MAAO,CACL,CAACA,IAAO,CACN,GAAIA,GACJ,MAAO8H,GAAY,KAAK,MAAM,KAAK,OAAO,EAAIA,GAAY,MAAM,GAChE,MAAO,CAAC,IAAK,GAAG,EAChB,YAAa,CAAC,EACd,aAAc,CAAC,CACjB,CACF,CACF,CACF,CAAC,EACM,OAOTnH,EAAA,oBAAgBuG,GAA+B,CAC7C,KAAK,aAAa,EAAI,EACtB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,QAAU,OAEf,IAAM3F,EAAQd,EAAAC,EAAA,GACTT,GAAS,cADA,CAEZ,SAAUS,EAAA,GACL,KAAK,MAAM,UAEhB,SAAAwG,EACA,SAAUzG,EAAAC,IAAA,GACLT,GAAS,aAAa,UACtB,KAAK,MAAM,UAFN,CAGR,cAAe,OAAO,KAAKiH,EAAS,KAAK,EAAE,GAC3C,cAAe,KAAK,aACtB,EACF,GAEA,KAAK,aAAa1G,GAAQe,EAAOtB,GAAS,OAAO,EAAG,iBAAiB,EACrE,GAAM,CAAE,MAAA6F,EAAO,KAAAC,CAAK,EAAI,KAAK,OAC7B,YAAK,eAAeD,EAAOC,CAAI,EAC/B,KAAK,aAAa,EAAK,EAChB,IACT,GAQApF,EAAA,uBAAkB,CAACmB,EAAcwF,IAA2C,CAC1E,IAAMzF,EAASC,EAAK,GACdiG,EAAetH,EAAAC,EAAA,GAChB,KAAK,MAAM,UADK,CAEnB,WAAYD,EAAAC,EAAA,GACP,KAAK,MAAM,SAAS,YADb,CAEV,CAACmB,GAASyF,CACZ,GACA,MAAO7G,EAAAC,EAAA,GACF,KAAK,SAAS,OADZ,CAEL,CAACmB,GAASC,CACZ,EACF,GACA,KAAK,aAAaiG,CAA0B,EAC5C,KAAK,QAAQ,CAAC,CAAC,CACjB,GAOApH,EAAA,kBAAa,IAAM,CACb,CAAC,KAAK,UACV,KAAK,iBAAmB,KACxB,KAAK,cAAc,EACrB,GAKAA,EAAA,mBAAc,IAAYqH,EAAA,sBACxB,GAAI,KAAK,SAAU,OACnB,IAAMrG,EAAa,MAAMsG,GACvBzH,GAAQ,KAAK,MAAOP,GAAS,OAAO,EAAE,SACtC,KAAK,gBACP,EACA,YAAK,iBAAmB0B,EACxB,KAAK,QAAQ,CAAC,CAAC,EACf,KAAK,QAAU,GACR,IACT,IAOAhB,EAAA,qBAAgB,CAAOuH,EAAmBC,IAA4BH,EAAA,sBACpE,GAAI,CACF,IAAMrG,EAAa,MAAMsG,GAAiB,KAAK,SAAU,KAAMC,EAAUC,CAAM,EAC/E,KAAK,iBAAmBxG,EACxB,KAAK,QAAQ,CAAC,CAAC,EACf,KAAK,QAAU,EACjB,OAASC,EAAP,CAEA,QAAQ,MAAMA,EAAE,OAAO,CACzB,CACA,OAAO,IACT,IAMAjB,EAAA,mBAAc,IAAYqH,EAAA,sBACxB,GAAI,EAAC,KAAK,QAEV,GAAI,CACF,IAAMI,EAAS,MAAMC,GAAmB,EACxC,GAAI,CAACD,EACH,MAAM,MAAM,EAGd,GAAM,CAAE,WAAAzG,EAAY,SAAAuF,CAAS,EAAIkB,EACjC,KAAK,aAAalB,CAAQ,EAC1B,KAAK,iBAAmBvF,EACxB,KAAK,UAAU,EACf,KAAK,QAAQ,CAAC,CAAC,CACjB,OAAS,EAAP,CACA,QAAQ,MAAM,CAAC,CACjB,QAAE,CACA,KAAK,QAAQ,CAAC,CAAC,CACjB,CACF,IAKAhB,EAAA,iBAAY,IAAYqH,EAAA,sBACtB,GAAI,CAAC,KAAK,cACR,GAAI,CACF,IAAMM,EAAO,MAAMC,GAAyB,EAC5C,GAAI,MAAM,QAAQD,CAAI,EACpB,KAAK,kBAAkBA,EAAM,KAAK,WAAW,MACxC,CACL,GAAI,CAACA,EAAM,OACX,KAAK,kBAAkB,CAACA,CAAI,CAAC,CAC/B,CACF,OAAS,EAAP,CACA,QAAQ,MAAM,CAAC,CACjB,QAAE,CACA,KAAK,QAAQ,CAAC,CAAC,CACjB,CACJ,IAOA3H,EAAA,eAAU,IAAM,CAEhB,GAMAA,EAAA,mBAAc,IACL,KAAK,UAOdA,EAAA,eAAU,CAACkB,EAAS,KAAK,gBAChBQ,EAAK,QAAQ,KAAK,MAAOR,GAAU,KAAK,aAAa,GAO9DlB,EAAA,iBAAY,CAACkB,EAAS,KAAK,gBAClBQ,EAAK,UAAU,KAAK,MAAOR,GAAU,KAAK,aAAa,GAOhElB,EAAA,mBAAc,CAACkB,EAAS,KAAK,gBACpBQ,EAAK,YAAY,KAAK,MAAOR,GAAU,KAAK,aAAa,GAQlElB,EAAA,gBAAW,CAA8BR,EAAY0B,EAAS,KAAK,gBAC1DQ,EAAK,SAAY,KAAK,MAAOlC,EAAI0B,CAAM,GAQhDlB,EAAA,sBAAiB,CAACR,EAAY0B,EAAS,KAAK,gBACnCQ,EAAK,UAAU,KAAK,SAASlC,EAAI0B,CAAM,CAAC,GAQjDlB,EAAA,kBAAa,CAACR,EAAY0B,EAAS,KAAK,gBAC/BQ,EAAK,WAAW,KAAK,MAAOlC,EAAI0B,CAAM,GAO/ClB,EAAA,oBAAe,CAACkB,EAAS,KAAK,gBACrBQ,EAAK,aAAa,KAAK,MAAOR,GAAU,KAAK,aAAa,GAQnElB,EAAA,oBAAe,CAACmF,EAAiBjE,EAAS,KAAK,gBAA4B,CACzE,GAAM,CAAE,OAAA2G,CAAO,EAAI,KAAK,aAAa3G,CAAM,EAC3C,OAAO,OAAI,IAAI,OAAI,IAAIiE,EAAO0C,EAAO,IAAI,EAAGA,EAAO,KAAK,CAC1D,GAyGA7H,EAAA,kBAAa,CAACR,EAAaoG,IAAwB,CACjD,GAAI,KAAK,SAAU,OAAO,KAC1B,GAAM,CAAE,MAAAP,EAAO,OAAAC,CAAO,EAAI,KAAK,eAC/B,OAAO,KAAK,SAAkBwC,GAAW,KAAM,CAAC,CAACzC,EAAQ,EAAG,CAACC,EAAS,CAAC,EAAG9F,EAAIoG,CAAI,CAAC,CACrF,GAMA5F,EAAA,kBAAckB,GACL,KAAK,SAAkB6G,GAAW,KAAM7G,CAAM,CAAC,GAQxDlB,EAAA,gBAAW,CAACkB,EAAgB8G,IACtB,KAAK,SAAiB,KAEnB,KAAK,SAAkBC,GAAS,KAAM/G,EAAQ8G,CAAK,CAAC,GAQ7DhI,EAAA,kBAAa,CAACkB,EAAgB0E,IACxB,KAAK,SAAiB,KACnB,KAAK,SAAkBsC,GAAW,KAAMhH,EAAQ0E,CAAI,CAAC,GAO9D5F,EAAA,qBAAiBkB,GACX,KAAK,SAAiB,KACnB,KAAK,SAAkBiH,GAAc,KAAMjH,CAAM,CAAC,GAO3DlB,EAAA,kBAAckB,GACR,KAAK,SAAiB,KACtB,OAAO,OAAO,KAAK,SAAS,KAAK,EAAE,QAAU,EAAU,KACpD,KAAK,SAAkBkH,GAAW,KAAMlH,GAAkB,KAAK,aAAa,CAAC,GAWtFlB,EAAA,WAAM,CAACqI,EAAM,KAAK,YAAapH,KAC7BA,GAAA,MAAAA,EAAG,iBAEH,KAAK,KAAKoH,EAAKpH,CAAC,EAEX,KAAK,UACR,KAAK,OAAOoH,CAAG,EAGV,OAOTrI,EAAA,YAAO,CAACqI,EAAM,KAAK,YAAapH,IAA6B,CA/xD/D,IAAAJ,EAkyDII,GAAA,MAAAA,EAAG,iBAEH,KAAK,UAAY,KAAK,WAAWoH,CAAG,EAUpC,IAAMC,EAAc,UARD,KAAK,UAAUvI,EAAA,CAChC,KAAM,kBACN,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,SAAU,CAAC,GACR,KAAK,UACT,YAID,OAAAwI,GAAaD,CAAW,EAEpBrH,KACFJ,EAAAI,EAAE,gBAAF,MAAAJ,EAAiB,QAAQ,YAAayH,IAGpC,UAAU,WAAa,OAAO,eAChC,UAAU,UAAU,MAAM,CACxB,IAAI,cAAc,CAChB,YAAa,IAAI,KAAK,CAACA,CAAW,EAAG,CAAE,KAAM,WAAY,CAAC,CAC5D,CAAC,CACH,CAAC,EAGI,IACT,GAMAtI,EAAA,aAAQ,CAAOmF,EAAkBlE,IAAuBoG,EAAA,sBAr0D1D,IAAAxG,EAAAC,EAs0DI,GAAI,KAAK,SAAU,OAEnB,IAAM0H,EAAuB,CAAC,EACxBC,EAA4B,CAAC,EAE/BC,EAEEC,EAAwBC,GAAiBvB,EAAA,sBAC7C,IAAMwB,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAYD,EAChB,IAAME,EAAMD,EAAI,WAEhBC,EAAI,MAAM,YAAY,mBAAoB,aAAa,EAEvD,IAAMC,EAAY,MAAMrH,EAAK,eAAeoH,QAAuB,CACjE,MAAO,EACP,QAAS,CACX,CAAC,EAED,GAAIC,EAAW,CACb,IAAMpB,EAAO,IAAI,KAAK,CAACoB,CAAS,EAAG,WAAW,EAC9CP,EAAa,KAAKb,CAAI,CACxB,MACEqB,EAAiBJ,CAAI,CAEzB,GAEMI,EAAoBJ,GAAiB,CACzC,IAAMK,EAAY,KAAK,aAAa9D,GAAA,KAAAA,EAAS,KAAK,YAAa,KAAK,aAAa,EAE3E+D,EAAcN,EAAK,SAAS;AAAA,CAAI,EAEtCH,EAAe,KACb/G,EAAK,mBAA6B,EAAE,SAAS,CAC3C,GAAI,SAAM,SAAS,EACnB,YACA,SAAU,KAAK,SAAS,cACxB,KAAMA,EAAK,cAAckH,EAAK,KAAK,CAAC,EACpC,MAAOK,EACP,MAAOnJ,EAAAC,EAAA,GACF,KAAK,SAAS,cADZ,CAEL,UAAWmJ,UAAiC,KAAK,SAAS,aAAa,SACzE,EACF,CAAC,CACH,CACF,EAEMC,EAAoBC,GAAiB,CAr3D/C,IAAAvI,EAs3DM,GAAI,CACF,IAAMwI,GAAYxI,EAAAuI,EAAK,MAAM,sBAAsB,IAAjC,YAAAvI,EAAqC,GAEvD,GAAI,CAACwI,EAAW,OAEhB,IAAMC,EAKF,KAAK,MAAMD,CAAS,EACxB,GAAIC,EAAK,OAAS,kBAAmB,CACnCZ,EAAgBY,EAChB,MACF,KACE,OAAM,MAAM,iBAAiB,CAEjC,OAASrI,EAAP,CACA+H,EAAiBI,CAAI,CACvB,CACF,EAEA,GAAInI,IAAM,OAAW,CACnB,IAAMsI,EAAQ,MAAM,MAAKzI,GAAAD,EAAAI,EAAE,gBAAF,YAAAJ,EAAiB,QAAjB,KAAAC,EAA0B,CAAC,CAAC,EAErD,MAAM,QAAQ,IACZyI,EAAM,IAAWC,GAASnC,EAAA,sBAh5DlC,IAAAxG,EAi5DU,GAAM,CAAE,KAAAoF,EAAM,KAAAwD,CAAK,EAAID,EAEvB,OAAQC,OACD,SAAU,CACb,IAAMC,EAAc,MAAM,IAAI,QAASC,GAAYH,EAAK,YAAYG,CAAO,CAAC,EAE5E,OAAQ1D,OACD,YAAa,CAChB,IAAIpF,EAAA6I,EAAI,MAAM,sBAAsB,IAAhC,MAAA7I,EAAoC,GAAI,CAC1CsI,EAAiBO,CAAG,EACpB,MACF,CACA,KACF,KACK,aAAc,CACbA,EAAI,WAAW,MAAM,EACvB,MAAMf,EAAee,CAAG,EAExBV,EAAiBU,CAAG,EAEtB,KACF,EAGF,KACF,KACK,OAAQ,CACX,IAAM/B,EAAO6B,EAAK,UAAU,EACxB7B,GAAMa,EAAa,KAAKb,CAAI,EAChC,KACF,EAEJ,EAAC,CACH,CACF,CAEA,GAAIe,EACF,YAAK,cAAcA,EAAe,CAAE,MAAAvD,EAAO,OAAQ,EAAK,CAAC,EAClD,KAGT,GAAIqD,EAAa,OACf,YAAK,kBAAkBA,EAAcrD,CAAK,EACnC,KAGT,GAAIsD,EAAe,OAAQ,CACzB,IAAMQ,EAAY,KAAK,aAAa9D,GAAA,KAAAA,EAAS,KAAK,YAAa,KAAK,aAAa,EAE3EyE,EAAe,OAAI,IAAIX,EAAW,CAAC,EAAG,CAAC,CAAC,EAE9C,OAAAR,EAAe,QAAQ,CAAClH,EAAOmF,IAAM,CACnC,IAAMxB,EAASxD,EAAK,UAAUH,CAAK,EAE/BmF,IAAM,IAGRkD,EAAa,IAAM1E,EAAO,MAAQ,EAClC0E,EAAa,IAAM1E,EAAO,OAAS,GAIrC3D,EAAM,MAAQ,CAAC,GAAGqI,CAAY,EAG9BA,EAAa,IAAM1E,EAAO,KAC5B,CAAC,EAED,KAAK,aAAa,GAAGuD,CAAc,EAC5B,IACT,CAEA,OAAI,KAAK,UAEP,KAAK,cAAc,KAAK,SAAS,EAGjCoB,GAAa,EAAE,KAAMjB,GAAS,CACxBA,GAAMO,EAAiBP,CAAI,CACjC,CAAC,EAGI,IACT,IAEA5I,EAAA,cAAS,IAG6B8J,IAAAzC,EAAA,SAAAyC,GAAA,UAFpCzB,EAAM,KAAK,YAAY,OAAS,KAAK,YAAc,OAAO,KAAK,KAAK,KAAK,MAAM,EAC/E0B,EAAO,CAAC,EAC4B,CAz+DxC,IAAAlJ,EA0+DI,GAAIwH,EAAI,SAAW,EAAG,OAGtB,IAAMS,EAAM,SAAS,gBAAgB,6BAA8B,KAAK,EAClEkB,EAAO,SAAS,gBAAgB,6BAA8B,MAAM,EACpEC,EAAQ,SAAS,gBAAgB,6BAA8B,OAAO,EAM5E,GAJI,OAAO,QAAW,aACpB,OAAO,MAAM,EAGXF,EAAK,aACP,GAAI,CACF,GAAM,CAAE,MAAAG,CAAM,EAAI,MAAM,MAAM5K,GAAS,SAAU,CAAE,KAAM,SAAU,CAAC,EAAE,KAAM6K,GAAMA,EAAE,KAAK,CAAC,EAE1FF,EAAM,YAAc;AAAA;AAAA;AAAA,yEAG6CC,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yEAMNA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yEAMNA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yEAMNA,EAAM;AAAA;AAAA;AAAA;AAAA,WAKzE,OAASjJ,EAAP,CACAS,EAAK,KAAK,wCAAwC,CACpD,MAEAuI,EAAM,YAAc,uJAGtBD,EAAK,OAAOC,CAAK,EACjBnB,EAAI,OAAOkB,CAAI,EAGf,IAAM5G,EAASiF,EACZ,IAAK7I,GAAO,KAAK,SAASA,EAAI,KAAK,aAAa,CAAC,EACjD,KAAK,CAAC4K,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAGvClI,EAAe,SAAM,gBAAgBiB,EAAO,IAAI1B,EAAK,gBAAgB,CAAC,EAGtE4I,EAA+B/I,GAAmB8F,EAAA,sBACtD,IAAMkD,EAAO7I,EAAK,aAAaH,CAAK,EAC9B2D,EAASqF,EAAK,UAAUhJ,CAAK,EAC7BiJ,EAAM,MAAMD,EAAK,cAAchJ,EAAO,KAAK,SAAS,UAAU,EAEpE,GAAI,EAACiJ,EAGL,OAAIjJ,EAAM,eACRiJ,EAAI,aAAa,OAAQ,KAAK,SAAS,OAAOjJ,EAAM,SAAS,GAAG,EACvDA,EAAM,gBACfiJ,EAAI,aAAa,OAAQ,KAAK,eAAejJ,EAAM,EAAE,CAAC,EAIxDiJ,EAAI,aACF,YACA,cAAc,GAAqBjJ,EAAM,MAAM,GAAKY,EAAa,MAAM,QAAQ,CAAC,OAC9E,GACAZ,EAAM,MAAM,GACZY,EAAa,MACb,QAAQ,CAAC,eAAgBZ,EAAM,UAAY,GAAK,IAAO,KAAK,IAAI,QAAQ,CAAC,OACzE2D,EAAO,MAAQ,GACf,QAAQ,CAAC,OAAOA,EAAO,OAAS,GAAG,QAAQ,CAAC,IAChD,EAEOsF,CACT,GAGA,QAAWjJ,KAAS6B,EAAQ,CAE1B,IAAIvC,EAAAU,EAAM,WAAN,MAAAV,EAAgB,OAAQ,CAE1B,IAAM4J,EAAI,SAAS,gBAAgB,6BAA8B,GAAG,EAGpE,QAAWC,KAAWnJ,EAAM,SAAU,CACpC,IAAMoJ,EAAa,KAAK,SAASD,EAAS,KAAK,aAAa,EACtDF,EAAM,MAAMF,EAAsBK,CAAU,EAE9CH,GACFC,EAAE,OAAOD,CAAG,CAEhB,CAGA1B,EAAI,OAAO2B,CAAC,EACZ,QACF,CAGA,IAAMD,EAAM,MAAMF,EAAsB/I,CAAK,EAEzCiJ,GACF1B,EAAI,OAAO0B,CAAG,CAElB,CAGA1B,EAAI,aACF,UACA,CACE,EACA,EACA3G,EAAa,MAAQ,GAAqB,EAC1CA,EAAa,OAAS,GAAqB,CAC7C,EAAE,KAAK,GAAG,CACZ,EAGA2G,EAAI,aAAa,SAAU3G,EAAa,MAAQ,GAAqB,GAAG,SAAS,CAAC,EAClF2G,EAAI,aAAa,UAAW3G,EAAa,OAAS,GAAqB,GAAG,SAAS,CAAC,EAGpF,IAAMyI,EAAuC,KAAK,SAAS,iBACrDC,EAAiB,UACjBC,EAAkB,qBAExB,OAAQF,cACwB,CAC5B9B,EAAI,MAAM,YACR,mBACA,KAAK,SAAS,WAAa+B,EAAiBC,CAC9C,EACA,KACF,YAC8B,CAC5BhC,EAAI,MAAM,YAAY,mBAAoB+B,CAAc,EACxD,KACF,aAC+B,CAC7B/B,EAAI,MAAM,YAAY,mBAAoBgC,CAAe,EACzD,KACF,2BAES,CACPhC,EAAI,MAAM,YAAY,mBAAoB,aAAa,EACvD,KACF,EAGF,OAAAA,EACG,iBAAiB,6DAA6D,EAC9E,QAAS0B,GAAQA,EAAI,OAAO,CAAC,EAEzB1B,CACT,IAOA9I,EAAA,eAAU,IAEL8J,IAAAzC,EAAA,SAAAyC,GAAA,UADHzB,EAAM,KAAK,YAAY,OAAS,KAAK,YAAc,OAAO,KAAK,KAAK,KAAK,MAAM,EAC5E,CACH,GAAIA,EAAI,SAAW,EAAG,OAEtB,IAAMS,EAAM,MAAM,KAAK,OAAOT,CAAG,EAEjC,GAAI,CAACS,EAAK,OAEV,IAAMiC,EAAYrJ,EAAK,aAAaoH,EAAK,CAAC,EAE1C,KAAK,UAAY,KAAK,WAAWT,CAAG,EAEpC,IAAMC,EAAc,KAAK,UAAUvI,EAAA,CACjC,KAAM,kBACN,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,SAAU,CAAC,GACR,KAAK,UACT,EAED,OAAI,UAAU,WAAa,OAAO,eAChC,UAAU,UAAU,MAAM,CACxB,IAAI,cAAc,CAChB,YAAa,IAAI,KAAK,CAACuI,CAAW,EAAG,CAAE,KAAM,WAAY,CAAC,EAC1D,aAAc,IAAI,KAAK,CAACyC,CAAS,EAAG,CAAE,KAAM,YAAa,CAAC,CAC5D,CAAC,CACH,CAAC,EAGIA,CACT,IAOA/K,EAAA,kBAAcqI,GAAmB,CAC/B,IAAMlH,EAAO,KAAK,QAAQ,KAAK,aAAa,EAY5C,GATIkH,GAAOA,EAAI,SAAW,IAGrBA,IAAKA,EAAM,KAAK,aAGjBA,EAAI,SAAW,IAAGA,EAAM,OAAO,KAAKlH,EAAK,MAAM,GAG/CkH,EAAI,SAAW,GAAG,OAEtB,IAAMjF,EAASiF,EACZ,IAAK7I,GAAO2B,EAAK,OAAO3B,EAAG,EAC3B,QAAS+B,GAAO,CA/sEvB,IAAAV,EA+sE0B,OAACU,EAAO,KAAIV,EAAAU,EAAM,WAAN,KAAAV,EAAkB,CAAC,GAAG,IAAK6J,GAAYvJ,EAAK,OAAOuJ,EAAQ,CAAC,EAAC,EAC5F,IAAIM,EAAQ,EAETC,EAAS,IAAI,IAAI7H,EAAO,IAAK8H,GAAMA,EAAE,EAAE,CAAC,EAE9C9H,EAAO,QAAS7B,GAAU,CACpBA,EAAM,WAAa,KAAK,gBAC1BA,EAAM,SAAW,gBAErB,CAAC,EAID,IAAM8B,EAAW,OAAO,OAAOlC,EAAK,QAAQ,EACzC,OAAQS,GAAY,CACnB,GAAIqJ,EAAO,IAAIrJ,EAAQ,MAAM,GAAKqJ,EAAO,IAAIrJ,EAAQ,IAAI,EACvD,MAAO,GAGT,GAAIqJ,EAAO,IAAIrJ,EAAQ,MAAM,EAAG,CAE9B,IAAMuJ,EADQ/H,EAAO,KAAM8H,GAAMA,EAAE,KAAOtJ,EAAQ,MAAM,EACjC,QACnBuJ,GACF,OAAO,OAAOA,CAAO,EAAE,QAASC,GAAW,CACrCA,EAAQ,YAAcxJ,EAAQ,KAChCwJ,EAAQ,UAAY,OAExB,CAAC,CAEL,CAEA,GAAIH,EAAO,IAAIrJ,EAAQ,IAAI,EAAG,CAE5B,IAAMuJ,EADQ/H,EAAO,KAAM8H,GAAMA,EAAE,KAAOtJ,EAAQ,IAAI,EAC/B,QACnBuJ,GACF,OAAO,OAAOA,CAAO,EAAE,QAASC,GAAW,CACrCA,EAAQ,YAAcxJ,EAAQ,KAChCwJ,EAAQ,UAAY,OAExB,CAAC,CAEL,CAEA,MAAO,EACT,CAAC,EACA,IAAIJ,EAAQ,EAET1H,EAAS,CACb,GAAG,IAAI,IACLF,EACG,IAAK7B,GAAU,CACd,GAAI,EAACA,EAAM,QACX,OAAO,KAAK,SAAS,OAAOA,EAAM,QACpC,CAAC,EACA,OAAO,OAAO,EACd,IAAIyJ,EAAQ,CACjB,CACF,EAEA,MAAO,CAAE,OAAA5H,EAAQ,SAAAC,EAAU,OAAAC,CAAO,CACpC,GAOAtD,EAAA,gBAAW,CAACqI,EAAM,KAAK,cAAgB,CACrC,IAAMgD,EAAU,KAAK,WAAWhD,CAAG,EAEnC,OAAIgD,GACF3J,EAAK,sBAAsB,KAAK,UAAU2J,CAAO,CAAC,EAG7C,IACT,GAOArL,EAAA,kBAAa,CAACqI,EAAM,KAAK,cAAgB,CACvC,IAAMgD,EAAU,KAAK,WAAWhD,CAAG,EAEnC,GAAIgD,EAAS,CACX,IAAMC,EAAO,IAAI,KAAK,CAAC,KAAK,UAAUD,CAAO,CAAC,EAAG,CAAE,KAAM,kBAAmB,CAAC,EACvEE,EAAM,IAAI,gBAAgBD,CAAI,EAC9BE,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOD,EACZC,EAAK,SAAW,cAChBA,EAAK,MAAM,CACb,CAEA,OAAO,IACT,GAcAxL,EAAA,qBAAgB,CACdqL,EACAtB,EAAO,CAAC,IAED,KAAK,SAAkB0B,GAAc,KAAMJ,EAAStB,CAAI,EAAG,gBAAgB,GAYpF/J,EAAA,gBAAW,IAQqB8J,IAAAzC,EAAA,SAAAyC,GAAA,UAP9BtC,QACAuC,EAAO,CAAC,EAMsB,CAC9B,GAAM,CAAE,IAAA1B,EAAM,KAAK,YAAY,OAAS,KAAK,YAAc,OAAO,KAAK,KAAK,KAAK,MAAM,CAAE,EACvF0B,EAEIjB,EAAM,MAAM,KAAK,OAAOT,EAAK,CACjC,aAAcb,SAChB,CAAC,EAED,GAAI,CAACsB,EAAK,OAEV,GAAItB,UAA6B,CAC/B,IAAMuD,EAAYrJ,EAAK,aAAaoH,EAAK,CAAC,EAE1C,OADa,IAAI,KAAK,CAACiC,CAAS,EAAG,CAAE,KAAM,eAAgB,CAAC,CAE9D,CAEA,IAAMhC,EAAY,MAAMrH,EAAK,eAAeoH,EAAKtB,EAAQuC,CAAI,EAE7D,GAAI,EAAChB,EAEL,OAAOA,CACT,IAWA/I,EAAA,iBAAY,IAQP8J,IAAAzC,EAAA,SAAAyC,GAAA,UAPHtC,QACAuC,EAAO,CAAC,EAML,CACH,GAAIvC,UAA6B,CAC/B,KAAK,QAAQuC,EAAK,GAAG,EACrB,MACF,CAEA,GAAI,EAAE,UAAU,WAAa,OAAO,eAAgB,CAClD,QAAQ,KAAK,sDAAsD,EACnE,MACF,CAEA,IAAMuB,EAAO,MAAM,KAAK,SAAS9D,EAAQuC,CAAI,EAEzC,CAACuB,GAEL,UAAU,UAAU,MAAM,CACxB,IAAI,cAAc,CAChB,CAACA,EAAK,MAAOA,CACf,CAAC,CACH,CAAC,CACH,IAEAtL,EAAA,mBAAc,IAQT8J,IAAAzC,EAAA,SAAAyC,GAAA,UAPHtC,QACAuC,EAAO,CAAC,EAML,CA15EP,IAAAlJ,EA25EI,GAAM,CAAE,OAAAK,EAAS,KAAK,aAAc,EAAI6I,EAElCuB,EAAO,MAAM,KAAK,SAAS9D,EAAQuC,CAAI,EAE7C,GAAI,CAACuB,EAAM,OAEX,IAAM1F,GAAO/E,EAAA,KAAK,SAAS,MAAMK,GAAQ,OAA5B,KAAAL,EAAoC,SAEjD,GAAI,KAAK,UAAU,SACjB,KAAK,UAAU,SAAS,KAAM,CAC5B,KAAA+E,EACA,KAAM4B,EACN,KAAA8D,CACF,CAAC,MACI,CACL,IAAMC,EAAM,IAAI,gBAAgBD,CAAI,EAC9BE,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOD,EACZC,EAAK,SAAW,GAAG5F,KAAQ4B,IAC3BgE,EAAK,MAAM,CACb,CACF,IAUAxL,EAAA,sBAAiB,IAAYqH,EAAA,sBAC3B,IAAM1C,EAAc,KAAK,YACzB,GAAI,CAACA,EAAY,OAAQ,OAEzB,IAAM+G,EAAuB,CAAC,EACxBC,EAA2B,CAAC,EAElC,QAAWnM,KAAMmF,EAAa,CAC5B,IAAMpD,EAAQ,KAAK,SAAS/B,CAAE,EAC9B,GAAI+B,EAAM,wBAAqC,SAE/C,IAAMgJ,EAAO7I,EAAK,aAAaH,CAAK,EACpC,GAAI,CAACgJ,EAAK,cAAe,SAIzB,IAAMqB,EAAS,MAAMrB,EAAK,cAAchJ,EAAO,KAAK,SAAS,UAAU,EACvE,GAAI,CAACqK,EAAQ,SAEb,IAAMC,EAAOD,EAAO,aAAa,MAAM,EACvC,GAAI,CAACC,EAAM,SAGX,IAAMC,EAAapK,EAAK,oBAA8B,EAAE,OAAO,CAC7D,GAAI,SAAM,SAAS,EACnB,SAAUH,EAAM,SAChB,WAAYA,EAAM,WAClB,MAAO,CAAC,GAAGA,EAAM,KAAK,EACtB,KAAM,CAAC,GAAIA,EAAc,IAAI,EAC7B,MAAOxB,EAAA,GAAKwB,EAAM,OAClB,QAAS,SAAW,SAAM,SAAS,CACrC,CAAC,EAGD,KAAK,WACH,CACE,SAAU,CACR,OAAQ,CACN,CAAC,GAAGuK,EAAW,WAAY,CACzB,GAAIA,EAAW,QACf,KAAM,QACN,IAAKD,EACL,KAAOtK,EAAc,KACrB,SAAU,wBACZ,CACF,CACF,CACF,EACA,WACF,EAEAmK,EAAU,KAAKI,CAAU,EACzBH,EAAe,KAAKpK,EAAM,EAAE,CAC9B,CAEImK,EAAU,OAAS,IACrB,KAAK,aAAa,GAAGA,CAAS,EAC9B,KAAK,OAAOC,CAAc,EAC1B,KAAK,OAAO,GAAGD,EAAU,IAAKR,GAAMA,EAAE,EAAE,CAAC,EAE7C,IAYAlL,EAAA,iBAAY,CAACmF,EAAiBC,EAAcwB,KAC1C,KAAK,eAAezB,EAAOC,CAAI,EAC/B,KAAK,WACH,CACE,SAAU,CACR,WAAY,CACV,CAAC,KAAK,eAAgB,CAAE,OAAQ,CAAE,MAAAD,EAAO,KAAAC,CAAK,CAAE,CAClD,CACF,CACF,EACAwB,CACF,EACO,OAMT5G,EAAA,mBAAc,IACL,KAAK,UAAU,KAAK,YAAa,EAAG,cAAc,GAO3DA,EAAA,WAAO+L,GAA0B,CAC/B,GAAM,CAAE,OAAAlE,CAAO,EAAI,KAAK,UACxB,OAAO,KAAK,UAAU,OAAI,QAAQ,OAAI,IAAIA,EAAO,MAAOkE,CAAK,CAAC,EAAGlE,EAAO,KAAM,QAAQ,CACxF,GAQA7H,EAAA,iBAAY,CAACmF,EAAiB4G,EAAiB3G,IAAuB,CACpE,GAAM,CAAE,OAAAyC,CAAO,EAAI,KAAK,UAClBmE,EAAY,OAAI,IAAInE,EAAO,MAAO,OAAI,IAAIkE,EAAOlE,EAAO,IAAI,CAAC,EAC7DoE,EAAW7G,EACX8G,EAAK,OAAI,IAAI,OAAI,IAAI/G,EAAO0C,EAAO,IAAI,EAAGmE,CAAS,EACnDG,EAAK,OAAI,IAAI,OAAI,IAAIhH,EAAO8G,CAAQ,EAAGD,CAAS,EACtD,OAAO,KAAK,UACV,OAAI,QAAQ,OAAI,IAAIA,EAAW,OAAI,IAAIG,EAAID,CAAE,CAAC,CAAC,EAC/CD,EACA,cACF,CACF,GAOAjM,EAAA,cAAS,CAACL,EAAcyM,EAAS,KAAK,cAAsB,CAC1D,GAAM,CAAE,KAAAhH,EAAM,MAAAD,CAAM,EAAI,KAAK,OACvB+G,EAAK,OAAI,IAAI,OAAI,IAAIE,EAAQhH,CAAI,EAAGD,CAAK,EACzCgH,EAAK,OAAI,IAAI,OAAI,IAAIC,EAAQzM,CAAI,EAAGwF,CAAK,EAC/C,OAAO,KAAK,UAAU,OAAI,QAAQ,OAAI,IAAIA,EAAO,OAAI,IAAIgH,EAAID,CAAE,CAAC,CAAC,EAAGvM,EAAM,eAAe,CAC3F,GAKAK,EAAA,cAAS,IAAY,CACnB,IAAM0G,EAAI,KAAK,MAAO,KAAK,OAAO,KAAO,IAAO,EAAE,EAC5CuF,EAAWvK,EAAK,eAAegF,EAAI,GAAK,GAAI,EAClD,OAAO,KAAK,OAAOuF,CAAQ,CAC7B,GAKAjM,EAAA,eAAU,IAAY,CACpB,IAAM0G,EAAI,KAAK,MAAO,KAAK,OAAO,KAAO,IAAO,EAAE,EAC5CuF,EAAWvK,EAAK,eAAegF,EAAI,GAAK,GAAI,EAClD,OAAO,KAAK,OAAOuF,CAAQ,CAC7B,GAKAjM,EAAA,iBAAY,IAAY,CACtB,GAAM,CACJ,OAAAoD,EACA,UAAW,CAAE,OAAAyE,CAAO,CACtB,EAAI,KACJ,GAAIzE,EAAO,SAAW,EAAG,OAAO,KAChC,GAAM,CAAE,eAAAiJ,CAAe,EAAI,KACrBlK,EAAe,SAAM,gBAAgBiB,EAAO,IAAI1B,EAAK,SAAS,CAAC,EACjE0D,EAAO1D,EAAK,cACd,KAAK,KACF2K,EAAe,MAAQ,KAAyBlK,EAAa,OAC7DkK,EAAe,OAAS,KAAyBlK,EAAa,MACjE,CACF,EACAiD,EAAOyC,EAAO,OAASzC,GAAQyC,EAAO,KAAO,EAAI,KAAK,IAAI,EAAGzC,CAAI,EAAIA,EACrE,IAAMkH,GAAMD,EAAe,MAAQlK,EAAa,MAAQiD,GAAQ,EAAIA,EAC9DmH,GAAMF,EAAe,OAASlK,EAAa,OAASiD,GAAQ,EAAIA,EACtE,OAAO,KAAK,UACV,OAAI,QAAQ,OAAI,IAAI,CAACkH,EAAIC,CAAE,EAAG,CAACpK,EAAa,KAAMA,EAAa,IAAI,CAAC,CAAC,EACrEiD,EACA,eACF,CACF,GAKApF,EAAA,uBAAkB,IAAY,CAC5B,GAAI,KAAK,YAAY,SAAW,EAAG,OAAO,KAE1C,GAAM,CAAE,eAAAqM,CAAe,EAAI,KACrBG,EAAiB9K,EAAK,kBAAkB,KAAK,KAAK,EAEpD0D,EAAO1D,EAAK,cACd,KAAK,KACF2K,EAAe,MAAQ,KAAyBG,EAAe,OAC/DH,EAAe,OAAS,KAAyBG,EAAe,MACnE,CACF,EAEApH,EAAO,KAAK,OAAO,OAASA,GAAQ,KAAK,OAAO,KAAO,EAAI,KAAK,IAAI,EAAGA,CAAI,EAAIA,EAE/E,IAAMkH,GAAMD,EAAe,MAAQG,EAAe,MAAQpH,GAAQ,EAAIA,EAChEmH,GAAMF,EAAe,OAASG,EAAe,OAASpH,GAAQ,EAAIA,EAExE,OAAO,KAAK,UACV,OAAI,QAAQ,OAAI,IAAI,CAACkH,EAAIC,CAAE,EAAG,CAACC,EAAe,KAAMA,EAAe,IAAI,CAAC,CAAC,EACzEpH,EACA,qBACF,CACF,GAKApF,EAAA,qBAAgB,IAAY,CAC1B,IAAMoD,EAAS,KAAK,OACduD,EAAY,KAAK,UAEvB,GAAIvD,EAAO,SAAW,EAAG,OAAO,KAEhC,GAAM,CAAE,eAAAiJ,CAAe,EAAI,KACrB,CAAE,KAAAjH,CAAK,EAAIuB,EAAU,OACrBxE,EAAe,SAAM,gBAAgBiB,EAAO,IAAI1B,EAAK,SAAS,CAAC,EAE/D4K,GAAMD,EAAe,MAAQlK,EAAa,MAAQiD,GAAQ,EAAIA,EAC9DmH,GAAMF,EAAe,OAASlK,EAAa,OAASiD,GAAQ,EAAIA,EAEtE,OAAO,KAAK,UACV,OAAI,QAAQ,OAAI,IAAI,CAACkH,EAAIC,CAAE,EAAG,CAACpK,EAAa,KAAMA,EAAa,IAAI,CAAC,CAAC,EACrE,KAAK,OAAO,KACZ,mBACF,CACF,GAKAnC,EAAA,iBAAY,IACH,KAAK,OAAO,CAAC,GAQtBA,EAAA,cAAS,SAAM,SAAS,CAAC+L,EAAeK,IAA4B,CAClE,GAAM,CAAE,KAAAhH,CAAK,EAAI,KAAK,OAChB6G,EAAWvK,EAAK,cAAc0D,EAAO2G,EAAQ3G,CAAI,EACvD,OAAO,KAAK,OAAO6G,EAAUG,CAAM,CACrC,EAAG,EAAE,GASLpM,EAAA,KAAQ,qBAAqB,KAC3B,KAAK,cAAc,QAAU,EAC7B,KAAK,cAAc,MAAQ,CAAC,KAAK,WAAW,EACrC,OAMTA,EAAA,KAAQ,qBAAsBqI,IACxB,KAAK,cAAc,QAAU,KAAK,cAAc,MAAM,SACxD,KAAK,cAAc,MAAQ,KAAK,cAAc,MAAM,MAAM,EAAG,KAAK,cAAc,QAAU,CAAC,GAE7F,KAAK,cAAc,UACnB,KAAK,cAAc,MAAM,KAAKA,CAAG,EAC1B,OAQTrI,EAAA,KAAQ,iBAAiB,CAACqI,EAAeoE,EAAO,KAAgB,CAC9D,IAAMC,EAAUD,EAAO,CAAC,GAAG,KAAK,UAAU,YAAa,GAAGpE,CAAG,EAAI,CAAC,GAAGA,CAAG,EAExE,OAAO,KAAK,WACV,CACE,SAAU,CACR,WAAY,QACd,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,YAAaqE,CACf,CACF,CACF,CACF,EACA,UACF,CACF,GAKA1M,EAAA,kBAAa,KACP,KAAK,cAAc,QAAU,IAC/B,KAAK,cAAc,UACnB,KAAK,eAAe,KAAK,cAAc,MAAM,KAAK,cAAc,QAAQ,GAEnE,OAMTA,EAAA,kBAAa,KACP,KAAK,cAAc,QAAU,KAAK,cAAc,MAAM,OAAS,IACjE,KAAK,cAAc,UACnB,KAAK,eAAe,KAAK,cAAc,MAAM,KAAK,cAAc,QAAQ,GAEnE,OAOTA,EAAA,cAAS,IAAIqI,KACXA,EAAI,QAAS7I,GAAO,CAClB,GAAI,CAAC,KAAK,KAAK,OAAOA,GACpB,MAAM,MAAM,qCAAqC,KAAK,eAAe,CAEzE,CAAC,EACD,KAAK,eAAe6I,CAAG,EACvB,KAAK,mBAAmBA,CAAG,EACpB,OAMTrI,EAAA,iBAAY,CAACkB,EAAS,KAAK,gBACrB,KAAK,QAAgB,MAGzB,KAAK,eACH,OAAO,OAAO,KAAK,SAAS,MAAMA,GAAQ,MAAM,EAC7C,OAAQK,GAAUA,EAAM,WAAaL,CAAM,EAC3C,IAAKK,GAAUA,EAAM,EAAE,CAC5B,EAEA,KAAK,mBAAmB,KAAK,WAAW,EAExC,KAAK,WAAW,QAAQ,EAEjB,OAMTvB,EAAA,kBAAa,KACX,KAAK,eAAe,CAAC,CAAC,EACtB,KAAK,mBAAmB,KAAK,WAAW,EACjC,OAYTA,EAAA,oBAAe,CAAwBiG,KAAY0G,IAAqC,CA/yF1F,IAAA9L,EAAAC,EAgzFI,GAAI,KAAK,UAAYmF,YAA4B,OAAO,KAEpD,KAAK,UACPvE,EAAK,KAAK,0BAA0B,KAAK,QAAQ,YAAY,OAAO,EACpE,KAAK,cAAc,GAGrB,IAAMkL,EAAUC,GAAW5G,CAAI,EAC/B,KAAK,QAAU,IAAI2G,EAAQ,KAAM,GAAGD,CAAI,EAExC,IAAMlF,EAAS,KAAK,QAAS,MAAM,EAEnC,OAAIA,GACF,KAAK,WAAWA,EAAQ,iBAAiB,KAAK,QAAS,YAAY,MAAM,GAG3E3G,GAAAD,EAAA,KAAK,WAAU,iBAAf,MAAAC,EAAA,KAAAD,EAAgC,KAAM,KAAK,QAAS,YAAY,MAEzD,IAET,GAMAb,EAAA,qBAAgB,IAAY,CAC1B,GAAM,CAAE,QAAA8M,CAAQ,EAAI,KACpB,GAAI,CAACA,EAAS,OAAO,KAGrB,IAAMrK,EAAQqK,EAAQ,OAAO,EAC7B,OAAKrK,EACE,KAAK,WAAWA,EAAO,WAAWqK,GAAA,YAAAA,EAAS,YAAY,MAAM,EADjD,IAErB,GAMA9M,EAAA,qBAAgB,IAAY,CAx1F9B,IAAAa,EAAAC,EAy1FI,GAAM,CAAE,QAAAgM,CAAQ,EAAI,KACpB,GAAI,CAACA,EAAS,OAAO,KACrB,KAAK,QAAU,OAEf,IAAMrF,EAASqF,EAAQ,OAAO,EAE9B,OAAIrF,GACF,KAAK,WAAWA,EAAQ,kBAAkBqF,EAAQ,YAAY,MAAM,EAGtE,KAAK,aAAa,GAElBhM,GAAAD,EAAA,KAAK,WAAU,eAAf,MAAAC,EAAA,KAAAD,EAA8B,KAAMiM,EAAQ,YAAY,MAEjD,IACT,GAMA9M,EAAA,uBAAkB,IAAY,CA92FhC,IAAAa,EAAAC,EAAA6B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA+2FI,GAAM,CAAE,QAAA6J,CAAQ,EAAI,KAEpB,GAAI,CAACA,EAAS,OAAO,KAErB,KAAK,QAAU,OACf,IAAMrF,EAASqF,EAAQ,SAAS,EAEhC,GAAIrF,IAAW,OACb,KAAK,WAAa,GAElB,KAAK,WACH,CACE,SAAU,CACR,aACF,EACA,SAAU,CACR,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,UAAW,OACX,UAAW,OACX,UAAW,MACb,CACF,CACF,CACF,EACA,oBAAoBqF,EAAQ,YAAY,MAC1C,UACS,UAAWrF,EAAQ,CAG5B,GAAI,KAAK,WAAY,CA2BnB,GAtBAA,EAAO,OAAS,CACd,SAAU3H,EAAAC,EAAA,GACL0H,EAAO,OAAO,UADT,CAER,aACF,GACA,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,OAAO,YAAY,KAAK,YAAY,IAAKjI,GAAO,CAACA,EAAI,MAAS,CAAC,CAAC,CAC1E,CACF,EACA,WAAY,CACV,CAAC,KAAK,eAAgB,CACpB,YAAa,CAAC,EACd,UAAW,KACX,UAAW,KACX,UAAW,IACb,CACF,CACF,CACF,EAEI,KAAK,SAAS,aAAc,CAC9B,IAAMmH,IAAYhE,GAAA7B,GAAAD,EAAA4G,EAAO,QAAP,YAAA5G,EAAc,WAAd,YAAAC,EAAwB,aAAxB,YAAA6B,EAAqC,KAAK,iBAAkB,CAAC,EAC/EgE,EAAU,YAAc,CAAC,CAC3B,CAEA,KAAK,WAAa,EACpB,CAEAc,EAAO,MAAM,SAAW3H,EAAAC,EAAA,GACnB0H,EAAO,MAAM,UADM,CAEtB,aACF,GAEAA,EAAO,MAAM,SAAW3H,EAAAC,EAAA,GACnB0H,EAAO,MAAM,UADM,CAEtB,WAAY3H,EAAAC,EAAA,IACP6C,EAAA6E,EAAO,MAAM,WAAb,YAAA7E,EAAuB,YADhB,CAEV,CAAC,KAAK,eAAgB9C,EAAAC,EAAA,MAChB8C,EAAA4E,EAAO,MAAM,WAAb,YAAA5E,EAAuB,aAAc,CAAC,GAAG,KAAK,gBAD9B,CAEpB,UAAW,IACb,EACF,EACF,GAEA,KAAK,SAAS4E,EAAQ,oBAAoBqF,EAAQ,YAAY,MAAM,CACtE,MACE,KAAK,WACHhN,EAAAC,EAAA,GACK0H,GADL,CAEE,SAAU3H,EAAAC,EAAA,GACL0H,EAAO,UADF,CAER,aACF,GACA,SAAU3H,EAAAC,EAAA,GACL0H,EAAO,UADF,CAER,WAAY,CACV,CAAC,KAAK,eAAgB3H,EAAAC,EAAA,IACjBgD,GAAAD,EAAA2E,EAAO,WAAP,YAAA3E,EAAiB,aAAjB,YAAAC,EAA8B,KAAK,gBADlB,CAEpB,UAAW,IACb,EACF,CACF,EACF,GACA,oBAAoB+J,EAAQ,YAAY,MAC1C,EAGF,OAAA7J,GAAAD,EAAA,KAAK,WAAU,eAAf,MAAAC,EAAA,KAAAD,EAA8B,KAAM8J,EAAQ,YAAY,MAEjD,IACT,GAWA9M,EAAA,oBAAe,IAAIoD,IACbA,EAAO,SAAW,EAAU,KAEzB,KAAK,OACVA,EAAO,IAAK7B,GACHG,EAAK,aAAaH,EAAM,IAAI,EAAE,OAAOxB,EAAA,CAC1C,SAAU,KAAK,eACZwB,EACJ,CACF,CACH,GAQFvB,EAAA,oBAAe,IAAIoD,IAAwD,CACzE,IAAM2J,EAAa,KAAK,SAAS,MAAM,KAAK,eAAe,OACrDC,EAAiB5J,EAAO,OAAQ7B,GAAUwL,EAAWxL,EAAM,GAAG,EACpE,OAAIyL,EAAe,SAAW,EAAU,KACjC,KAAK,SACDC,GAAa,KAAMD,EAAgB,KAAK,aAAa,EAC9D,gBACF,CACF,GAkGAhN,EAAA,cAAS,CAACoD,EAAoB,CAAC,EAAGC,EAAwB,CAAC,IACrDD,EAAO,SAAW,EAAU,KACzB,KAAK,SAAkB8J,GAAa,KAAM9J,EAAQC,CAAQ,CAAC,GAQpErD,EAAA,mBAAc,CAACoD,EAAoB,CAAC,EAAGC,EAAwB,CAAC,IAC1DD,EAAO,SAAW,EAAU,KACzB,KAAK,WAAoB8J,GAAa,KAAM9J,EAAQC,CAAQ,EAAE,KAAK,GAQ5ErD,EAAA,cAAS,CAACqI,EAAM,KAAK,cAAsB,CArnG7C,IAAAxH,EAAAC,EAsnGI,GAAIuH,EAAI,SAAW,EAAG,OAAO,KAE7B,GAAI,KAAK,QAAS,OAAO,KACzB,IAAM8E,EAAuBC,GAAa,KAAM/E,CAAG,EAEnD,GACE,KAAK,UAAU,iBACfxH,EAAAsM,EAAY,OAAO,WAAnB,YAAAtM,EAA6B,WAC7BC,EAAAqM,EAAY,MAAM,WAAlB,YAAArM,EAA4B,QAC5B,CACA,IAAMuM,EAAiB,OAAO,KAAKF,EAAY,OAAO,SAAS,MAAM,EAAE,OACpEG,GAAM,CAAC,CAACH,EAAY,OAAO,SAAU,OAAQG,EAChD,EACMC,EAAgB,OAAO,KAAKJ,EAAY,MAAM,SAAS,MAAM,EAAE,OAClEG,GAAM,CAAC,CAACH,EAAY,MAAM,SAAU,OAAQG,EAC/C,EAEqBD,EAAe,OAAQG,GAAM,CAACD,EAAc,SAASC,CAAC,CAAC,EAC/D,QAAShO,GAAO,KAAK,UAAU,cAAe,KAAMA,CAAE,CAAC,CACtE,CAEA,OAAO,KAAK,SAAS2N,CAAW,CAClC,GAKAnN,EAAA,iBAAY,KACV,KAAK,UAAU,EACf,KAAK,OAAO,EACL,OAQTA,EAAA,aAAQ,CAACiK,EAA6B5B,EAAM,KAAK,cACxC,KAAK,SAAkBoF,GAAY,KAAMpF,EAAK4B,CAAK,CAAC,GAQ7DjK,EAAA,aAAQ,CAACiG,EAAiBoC,EAAM,KAAK,cAC/BA,EAAI,OAAS,EAAU,KACpB,KAAK,SAAkBqF,GAAY,KAAMrF,EAAKpC,CAAI,CAAC,GAQ5DjG,EAAA,kBAAa,CAAC2N,EAA2BtF,EAAM,KAAK,cAC9CA,EAAI,OAAS,EAAU,KACpB,KAAK,SAAkBuF,GAAiB,KAAMvF,EAAKsF,CAAS,CAAC,GAQtE3N,EAAA,eAAU,CAAC2N,EAAwBtF,EAAM,KAAK,cACxCA,EAAI,OAAS,EAAU,KACpB,KAAK,SAAkBwF,GAAc,KAAMxF,EAAKsF,CAAS,CAAC,GAOnE3N,EAAA,sBAAiB,CAACqI,EAAM,KAAK,cACvBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkByF,GAAW,KAAMzF,cAAwB,CAAC,GAO1ErI,EAAA,oBAAe,CAACqI,EAAM,KAAK,cACrBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkByF,GAAW,KAAMzF,YAAsB,CAAC,GASxErI,EAAA,kBAAa,CACX+N,EACAC,EAAa,KAAK,cAClB3F,EAAM,KAAK,cACF,CACT,GAAIA,EAAI,SAAW,EAAG,OAAO,KAC7B,GAAM,CAAE,eAAAgE,CAAe,EAAI,KAC3B,YAAK,SAAkB4B,GAAiB,KAAM5F,EAAKgE,EAAgB2B,EAAYD,CAAQ,CAAC,EACjF,IACT,GAMA/N,EAAA,kBAAa,CAACqI,EAAM,KAAK,cACnBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkB6F,GAAc,KAAM7F,UAAoB,CAAC,GAOzErI,EAAA,oBAAe,CAACqI,EAAM,KAAK,cACrBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkB6F,GAAc,KAAM7F,YAAsB,CAAC,GAO3ErI,EAAA,mBAAc,CAACqI,EAAM,KAAK,cACpBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkB6F,GAAc,KAAM7F,WAAqB,CAAC,GAO1ErI,EAAA,mBAAc,CAACqI,EAAM,KAAK,cACpBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkB6F,GAAc,KAAM7F,WAAqB,CAAC,GAS1ErI,EAAA,aAAQ,CAAC+L,EAAiBoC,EAAU,GAAO9F,EAAM,KAAK,cAAsB,CAC1E,GAAIA,EAAI,SAAW,EAAG,OAAO,KAC7B,IAAM+F,EAAOD,EACT,KAAK,SAAS,SACZ,KAAK,YAAc,EACnB,GACF,KAAK,SAAS,SACd,KAAK,YACL,EAEJ,OAAO,KAAK,SAAkBE,GAAgB,KAAMhG,EAAK,OAAI,IAAI0D,EAAOqC,CAAI,CAAC,CAAC,CAChF,GAMApO,EAAA,iBAAY,CAACqI,EAAM,KAAK,YAAalD,IAC/B,KAAK,SAAiB,KACtBkD,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkBiG,GAAgB,KAAMjG,EAAKlD,CAAK,CAAC,GASjEnF,EAAA,mBAAc,CAACqI,EAAM,KAAK,cAAsB,CAC9C,IAAM9E,EAAmBgL,GAAY,KAAMlG,EAAK,KAAK,aAAa,EAClE,OAAO,KAAK,SAAkBkG,GAAY,KAAMlG,EAAK,KAAK,aAAa,EAAG9E,EAAQ,EAAE,CACtF,GAMAvD,EAAA,oBAAe,CAACqI,EAAM,KAAK,cACrBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkBmG,GAAgB,KAAMnG,EAAK,UAAU,CAAC,GAOtErI,EAAA,oBAAe,CAACqI,EAAM,KAAK,cACrBA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkBmG,GAAgB,KAAMnG,EAAK,UAAU,CAAC,GAOtErI,EAAA,+BAA0B,CAACqI,EAAM,KAAK,cAChCA,EAAI,SAAW,EAAU,KACtB,KAAK,SAAkBmG,GAAgB,KAAMnG,EAAK,qBAAqB,CAAC,GAQjFrI,EAAA,wBAAmB,CAACyO,EAAkBpG,EAAM,KAAK,cAC3CA,EAAI,SAAW,GAAK,EAAEoG,IAAa,SAAWA,IAAa,OAAe,KACvE,KAAK,SAAkBC,GAAuB,KAAMrG,EAAKoG,CAAQ,CAAC,GAQ3EzO,EAAA,qBAAgB,CAAoB2O,EAAmBtG,EAAM,KAAK,cACzD,KAAK,SAAkBuG,GAAe,KAAMvG,EAAKsG,CAAK,CAAC,GAQhE3O,EAAA,cAAS,CAAC+L,EAAQ,KAAK,GAAK,IAAM1D,EAAM,KAAK,cAAsB,CACjE,GAAIA,EAAI,SAAW,EAAG,OAAO,KAC7B,IAAMwG,EAAkBC,GAAa,KAAMzG,EAAK0D,CAAK,EACrD,OAAK8C,EACE,KAAK,SAASA,CAAM,EADP,IAEtB,GAOA7O,EAAA,aAAQ,CACNqI,EAAM,KAAK,YACX0G,EAAU,SAAM,SAAS,EACzB7N,EAAS,KAAK,gBACL,CACT,GAAI,KAAK,SAAU,OAAO,KAE1B,GAAImH,EAAI,SAAW,GAAK,KAAK,SAASA,EAAI,GAAInH,CAAM,EAAE,eACpD,OAAO,KAAK,QAAQmH,EAAKnH,CAAM,EAGjC,GAAImH,EAAI,OAAS,EAAG,OAAO,KAE3B,IAAM9E,EAAmByL,GAAY,KAAM3G,EAAK0G,EAAS7N,CAAM,EAC/D,OAAKqC,EACE,KAAK,SAASA,CAAO,EADP,IAEvB,GAMAvD,EAAA,eAAU,CAACqI,EAAM,KAAK,YAAanH,EAAS,KAAK,gBAAwB,CACvE,GAAI,KAAK,SAAU,OAAO,KAE1B,IAAM+N,EAAS5G,EACZ,IAAK7I,GAAO,KAAK,SAASA,EAAI0B,CAAM,CAAC,EACrC,OAAQK,GAAUA,EAAM,cAA0B,EAErD,GAAI0N,EAAO,SAAW,EAAG,OAAO,KAEhC,IAAM1L,EAAmB2L,GAAc,KAAM7G,EAAK4G,EAAwB/N,CAAM,EAEhF,OAAKqC,EAIE,KAAK,SAASA,CAAO,EAHnB,IAIX,GAKAvD,EAAA,cAAS,IAAY,CAv5GvB,IAAAa,EAAAC,EAw5GI,OAAAA,GAAAD,EAAA,KAAK,aAAY,WAAjB,MAAAC,EAAA,KAAAD,GAEO,IACT,GAEAb,EAAA,yBAAoB,CAAO8J,KAA4CqF,IAAA9H,EAAA,MAA5CyC,EAA4C,GAAAqF,GAAA,UAA5CC,EAAejK,EAAQ,KAAK,YAAgB,CACrE,KAAK,aAAa,EAAI,EAOtB,IAAMsD,EAA4B,CAAC,EAE7BQ,EAAY,KAAK,aAAa9D,CAAK,EAEzC,QAAWwC,KAAQyH,EAAO,CACxB,IAAM5P,EAAK,SAAM,SAAS,EACpB6P,EAAY1H,EAAK,KAAK,MAAM,eAAe,EAEjD,GAAI,CAAC0H,EAAW,MAAM,MAAM,cAAc,EAE1C,IAAMC,EAAUC,GAAiB,SAASF,EAAU,GAAG,YAAY,CAAC,EAC9DG,EAAUC,GAAiB,SAASJ,EAAU,GAAG,YAAY,CAAC,EAEpE,GAAI,EAAEC,GAAWE,GAAU,MAAM,MAAM,iBAAiB,EAExD,IAAME,EAAYJ,kBACZK,EAAYL,kBAEdM,EAEJ,GAAI,CACF,GAAI,KAAK,UAAU,cAAe,CAChC,IAAMnI,EAAS,MAAM,KAAK,UAAU,cAAc,KAAME,EAAMnI,CAAE,EAEhE,GAAI,CAACiI,EAAQ,MAAM,MAAM,wCAAwC,EAEjEmI,EAAMnI,CACR,MACEmI,EAAM,MAAMC,GAAalI,CAAI,EAG/B,GAAI,OAAOiI,GAAQ,SAAU,CAC3B,IAAIxB,EAAO,CAAC,EAAG,CAAC,EAEhB,GAAIkB,EAAS,CAEX,GAAID,EAAU,IAAM,OAAQ,CAC1B,IAAIS,EACE/E,EAAY,MAAMgF,GAAWpI,CAAI,EACjCqI,EAAmB,KAAK,kBAAkBjF,CAAS,EAErDiF,IACFF,EAAUE,EAAiB,MAAM,GAAG,EACpC5B,EAAK,GAAK,WAAW0B,EAAQ,EAAE,EAC/B1B,EAAK,GAAK,WAAW0B,EAAQ,EAAE,EAEnC,CACI,OAAI,QAAQ1B,EAAM,CAAC,EAAG,CAAC,CAAC,IAC1BA,EAAO,MAAM6B,GAAoBL,CAAG,EAExC,MACExB,EAAO,MAAM8B,GAAoBN,CAAG,EAGtC,IAAMO,EAAQ,OAAO,OAAO,KAAK,SAAS,MAAM,EAAE,KAC/CC,GAAUA,EAAM,OAAST,GAAaS,EAAM,MAAQR,CACvD,EAEIS,EAEJ,GAAKF,EAmBHE,EAAUF,EAAM,OAnBN,CACVE,EAAU7Q,EAEV,IAAM4Q,EAAQ,CACZ,GAAIC,EACJ,KAAMV,EACN,KAAMhI,EAAK,KACX,IAAAiI,EACA,KAAAxB,CACF,EAEA,KAAK,WAAW,CACd,SAAU,CACR,OAAQ,CACN,CAACiC,GAAUD,CACb,CACF,CACF,CAAC,CACH,CAIA3H,EAAe,KAAK,KAAK,4BAA4BjJ,EAAIkQ,EAAWvK,EAAOiJ,EAAMiC,CAAO,CAAC,CAC3F,CACF,OAASC,EAAP,CAEA,QAAQ,KAAKA,CAAK,CACpB,CACF,CAEA,GAAI7H,EAAe,OAAQ,CACzB,IAAMmB,EAAe,OAAI,IAAIX,EAAW,CAAC,EAAG,CAAC,CAAC,EAE9CR,EAAe,QAAQ,CAAClH,EAAOmF,IAAM,CACnC,IAAMxB,EAASxD,EAAK,UAAUH,CAAK,EAE/BmF,IAAM,IAGRkD,EAAa,IAAM1E,EAAO,MAAQ,EAClC0E,EAAa,IAAM1E,EAAO,OAAS,GAIrC3D,EAAM,MAAQ,CAAC,GAAGqI,CAAY,EAG9BA,EAAa,IAAM1E,EAAO,KAC5B,CAAC,EAED,IAAM/C,EAAe,SAAM,gBAAgBsG,EAAe,IAAI/G,EAAK,SAAS,CAAC,EAE7E,KAAK,aAAa,GAAG+G,CAAc,EAG9B,SAAM,cAAc,KAAK,SAAUtG,CAAY,IAClD,KAAK,gBAAgB,EACjB,KAAK,KAAO,GACd,KAAK,UAAU,EAGrB,CAEA,YAAK,aAAa,EAAK,EAChB,IACT,IAEAnC,EAAA,KAAQ,oBAAqBuQ,GAAwC,CACnE,IAAMC,EAAe,iEAErB,GAAI,OAAOD,GAAW,SAAU,CAC9B,IAAME,EAAUF,EAAO,MAAMC,CAAY,EACzC,OAAOC,GAAWA,EAAQ,QAAU,EAAIA,EAAQ,GAAK,IACvD,CAEA,YAAK,aAAa,EAAK,EAEhB,IACT,GAQAzQ,EAAA,iBAAoC,CAACiH,EAAKyJ,EAAMzP,IAAM,CAvjHxD,IAAAJ,EAAAC,EAwjHI,OAAQG,EAAE,SACH,IAAK,CACR,GAAI,KAAK,SAAW,QAAU,CAAC,KAAK,UAAU,UAAW,CACvD,GAAM,CAAE,SAAA0P,EAAU,QAAAC,EAAS,OAAAC,EAAQ,QAAAC,EAAS,SAAAC,CAAS,EAAI,KAEzD,KAAK,cACH,CACE,OAAQ,SACR,UAAW,EACX,OAAQL,EAAK,MACb,MAAOA,EAAK,MACZ,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,GACV,SAAAC,EACA,QAAAG,EACA,QAAAF,EACA,OAAAC,EACA,SAAAE,CACF,EACA,CACE,SAAAJ,EACA,OAAAE,EACA,QAAAC,EACA,UAAW,EACX,QAASJ,EAAK,MAAM,GACpB,QAASA,EAAK,MAAM,EACtB,CACF,CACF,CACA,KACF,KACK,SAAU,CACb,KAAK,OAAO,EACZ,KACF,KACK,OAAQ,CACX,KAAK,QAAU,GACf,KACF,KACK,MAAO,CACV,KAAK,OAAS,GACd,KACF,KACK,UAAW,CACd,KAAK,QAAU,GACf,KACF,KACK,IAAK,CACR,KAAK,eAAiB,GACtB,KAAK,SAAW,GAChB,KACF,EAGF,OAAA5P,GAAAD,EAAA,KAAK,aAAY,YAAjB,MAAAC,EAAA,KAAAD,EAA6BoG,EAAKyJ,EAAMzP,GAEjC,IACT,GAEAjB,EAAA,eAAkC,CAACiH,EAAKyJ,EAAMzP,IAAM,CAnnHtD,IAAAJ,EAAAC,EAonHI,GAAI,EAAC4P,EAEL,QAAQzP,EAAE,SACH,IAAK,CACR,GAAM,CAAE,aAAA2I,EAAc,SAAA+G,EAAU,QAAAC,EAAS,OAAAC,EAAQ,QAAAC,EAAS,SAAAC,CAAS,EAAI,KAEvE,KAAK,YACH,CACE,OAAQ,SACR,UAAW,EACX,OAAQnH,EACR,MAAOA,EACP,MAAO,CAAC,EAAG,CAAC,EACZ,SAAU,GACV,SAAA+G,EACA,QAAAG,EACA,QAAAF,EACA,OAAAC,EACA,SAAAE,CACF,EACA,CACE,SAAAJ,EACA,OAAAE,EACA,QAAAC,EACA,UAAW,EACX,QAASlH,EAAa,GACtB,QAASA,EAAa,EACxB,CACF,EACA,KACF,KACK,OAAQ,CACX,KAAK,QAAU,GACf,KACF,KACK,MAAO,CACV,KAAK,OAAS,GACd,KACF,KACK,UAAW,CACd,KAAK,QAAU,GACf,KACF,KACK,IAAK,CACR,KAAK,eAAiB,GACtB,KAAK,SAAW,GAChB,KACF,GAGF9I,GAAAD,EAAA,KAAK,aAAY,UAAjB,MAAAC,EAAA,KAAAD,EAA2BoG,EAAKyJ,EAAMzP,GACxC,GAGAjB,EAAA,4BAAuB,IAAM,CAE3B,IAAMgR,EAAQ,KAAK,OAAO,IAAKzP,GACtB,CACLA,EAAM,GACNxB,EAAA,CACE,MAAO,CAAC,GAAGwB,EAAM,KAAK,GAClB,UAAWA,GAAS,CAAE,MAAO,EAAG,EAExC,CACD,EAEK0P,EAAU,KAAK,OAAO,IAAK1P,GACxB,CACLA,EAAM,GACNxB,EAAA,CACE,MAAO,CAAC,GAAGwB,EAAM,KAAK,GAClB,UAAWA,GAAS,CAAE,MAAOA,EAAM,KAAM,EAEjD,CACD,EAED2P,GAAc,EAEd,KAAK,WAAW,CACd,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,OAAO,YAAYF,CAAK,CAClC,CACF,CACF,CACF,CAAC,EACD,KAAK,WAAW,CACd,SAAU,CACR,MAAO,CACL,CAAC,KAAK,eAAgB,CACpB,OAAQ,OAAO,YAAYC,CAAO,CACpC,CACF,CACF,CACF,CAAC,CACH,GAIAjR,EAAA,kBAAkC,GAAM,CACtC,EAAE,eAAe,CACnB,GAEAA,EAAA,cAAoC,GAAMqH,EAAA,sBA5tH5C,IAAAxG,EA8tHI,OADA,EAAE,eAAe,EACb,KAAK,cAAsB,OAC3BA,EAAA,EAAE,aAAa,QAAf,MAAAA,EAAsB,QACxB,KAAK,kBAAkB,OAAO,OAAO,EAAE,aAAa,KAAK,EAAG,CAAC,EAAE,QAAS,EAAE,OAAO,CAAC,EAE7E,KACT,IAEAb,EAAA,oBAAoC,CAAC0Q,EAAMzP,IAAM,CAruHnD,IAAAJ,EAAAC,GAsuHIA,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,kBAAkC,CAAC0Q,EAAMzP,IAAG,CAzuH9C,IAAAJ,EAAAC,EAyuHiD,OAAAA,GAAAD,EAAA,KAAK,aAAY,aAAjB,YAAAC,EAAA,KAAAD,EAA8B6P,EAAMzP,KAEnFjB,EAAA,eAA+B,CAAC0Q,EAAMzP,IAAG,CA3uH3C,IAAAJ,EAAAC,EA2uH8C,OAAAA,GAAAD,EAAA,KAAK,aAAY,UAAjB,YAAAC,EAAA,KAAAD,EAA2B6P,EAAMzP,KAE7EjB,EAAA,aAA6B,CAAC0Q,EAAMzP,IAAM,CACxC,GAAI,KAAK,SAAS,SAAW,WAAY,OAGzC,IAAM8K,EAAQ,OAAI,IAAI2E,EAAK,MAAO,KAAK,OAAO,IAAI,EAC5ChR,EAAO,KAAK,OAAO,MACnBC,EAAO,OAAI,IAAID,EAAMqM,CAAK,EAE5B,OAAI,QAAQpM,EAAMD,CAAI,IAE1B,KAAK,IAAIqM,CAAK,EAGT,KAAK,gBAAgB,KAAK,cAAc2E,EAAMzP,CAAkC,EAGjFkQ,IAAW,KAAK,gBAAgB,KAAK,aAAa,EACxD,GAEAnR,EAAA,cAA8B,CAAC0Q,EAAMzP,IAAM,CACzC,GAAI,KAAK,MAAM,SAAS,gBAA0B,OAClD,IAAM8K,EAAQ2E,EAAK,MAAM,GAAK,GAC9B,KAAK,OAAO3E,EAAO2E,EAAK,KAAK,EAC7B,KAAK,cAAcA,EAAMzP,CAAkC,CAC7D,GAIAjB,EAAA,oBAAuC0Q,GAAS,CAC9C,KAAK,aAAe,KAAK,aAAaA,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACtE,KAAK,SAAWA,EAAK,SACrB,KAAK,OAASA,EAAK,OACnB,KAAK,QAAUA,EAAK,QACpB,KAAK,QAAUA,EAAK,OACtB,GAEA1Q,EAAA,qBAAuC,CAAC0Q,EAAMzP,IAAM,CAjxHtD,IAAAJ,EAAAC,EAAA6B,EAAAC,EAAAC,EAoxHI,GAFA,KAAK,cAAgB,KAAK,aAC1B,KAAK,aAAa6N,EAAMzP,CAAC,EACrB,KAAK,gBAAkB,KAAK,WAAY,EAC1CJ,EAAA,KAAK,QAAL,MAAAA,EAAA,UAAaf,EAAAC,EAAA,GAAK2Q,GAAL,CAAW,MAAO,OAAI,IAAIA,EAAK,KAAK,CAAE,GAAGzP,GACtD,MACF,CAMA,IAHA0B,GAAA7B,EAAA,KAAK,aAAY,gBAAjB,MAAA6B,EAAA,KAAA7B,EAAiC4P,EAAMzP,GAGnC,KAAK,MAAM,KAAM,CACnB,GAAM,CAAE,MAAAmF,EAAO,OAAAE,CAAO,EAAI,KAAK,MAAM,MAErCzD,GAAAD,EAAA,KAAK,WAAU,mBAAf,MAAAC,EAAA,KAAAD,EAAkC,KAAM9C,EAAAC,EAAA,GACnCqG,EAAME,IAD6B,CAEtC,MAAO,KAAK,aAAaoK,EAAK,KAAK,EACnC,QAAS,CAAC,CAAC,KAAK,OAClB,GACF,CACF,GAEA1Q,EAAA,qBAAuC,CAAC0Q,EAAMzP,IAAM,CAxyHtD,IAAAJ,EAAAC,EAyyHI,GAAIG,EAAE,UAAY,EAChB,KAAK,eAAiB,WACb,KAAK,WACd,OAEF,KAAK,WAAa,GAClB,KAAK,YAAc,KAAK,aAAayP,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,EACrB,MAAK,iBACL,KAAK,YAAY,eAA6BA,EAAE,cAAgB,OAASA,EAAE,SAAW,IACxF,KAAK,WAAW,OAAO,EACvB,KAAK,iBAAmB,KAE1BH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,GACzC,GAEAjB,EAAA,mBAAqC,CAAC0Q,EAAMzP,IAAM,CAzzHpD,IAAAJ,EAAAC,EA0zHI,KAAK,WAAa,GACb,KAAK,WAAU,KAAK,eAAiB,IAC1C,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,cAAjB,MAAAC,EAAA,KAAAD,EAA+B6P,EAAMzP,GACjC,KAAK,kBAAoBA,EAAE,cAAgB,OAASA,EAAE,SAAW,IACnE,KAAK,iBAA2B,EAChC,KAAK,iBAAmB,GAE5B,GAGAjB,EAAA,qBAAsC,CAAC0Q,EAAMzP,IAAM,CAr0HrD,IAAAJ,EAAAC,EAs0HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,EACzC,GAEAjB,EAAA,2BAA4C,CAAC0Q,EAAMzP,IAAM,CA10H3D,IAAAJ,EAAAC,EA20HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,sBAAjB,MAAAC,EAAA,KAAAD,EAAuC6P,EAAMzP,EAC/C,GAEAjB,EAAA,0BAA2C,CAAC0Q,EAAMzP,IAAM,CA/0H1D,IAAAJ,EAAAC,EAg1HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,qBAAjB,MAAAC,EAAA,KAAAD,EAAsC6P,EAAMzP,EAC9C,GAEAjB,EAAA,oBAAqC,CAAC0Q,EAAMzP,IAAM,CAp1HpD,IAAAJ,EAAAC,EAq1HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,uBAAwC,CAAC0Q,EAAMzP,IAAM,CAz1HvD,IAAAJ,EAAAC,EA01HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,kBAAjB,MAAAC,EAAA,KAAAD,EAAmC6P,EAAMzP,EAC3C,GAGAjB,EAAA,oBAAsC,CAAC0Q,EAAMzP,IAAM,CA/1HrD,IAAAJ,EAAAC,EAg2HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,sBAAwC,CAAC0Q,EAAMzP,IAAM,CAr2HvD,IAAAJ,EAAAC,EAs2HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,iBAAjB,MAAAC,EAAA,KAAAD,EAAkC6P,EAAMzP,EAC1C,GAEAjB,EAAA,0BAA4C,CAAC0Q,EAAMzP,IAAM,CA12H3D,IAAAJ,EAAAC,EA22HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,qBAAjB,MAAAC,EAAA,KAAAD,EAAsC6P,EAAMzP,EAC9C,GAEAjB,EAAA,yBAA2C,CAAC0Q,EAAMzP,IAAM,CAh3H1D,IAAAJ,EAAAC,EAi3HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,oBAAjB,MAAAC,EAAA,KAAAD,EAAqC6P,EAAMzP,EAC7C,GAEAjB,EAAA,mBAAqC,CAAC0Q,EAAMzP,IAAM,CAt3HpD,IAAAJ,EAAAC,EAu3HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,cAAjB,MAAAC,EAAA,KAAAD,EAA+B6P,EAAMzP,EACvC,GAEAjB,EAAA,oBAAsC,CAAC0Q,EAAMzP,IAAM,CA33HrD,IAAAJ,EAAAC,EA43HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,sBAAwC,CAAC0Q,EAAMzP,IAAM,CAh4HvD,IAAAJ,EAAAC,EAi4HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,iBAAjB,MAAAC,EAAA,KAAAD,EAAkC6P,EAAMzP,EAC1C,GAGAjB,EAAA,qBAAsC,CAAC0Q,EAAMzP,IAAM,CAt4HrD,IAAAJ,EAAAC,EAu4HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,EACzC,GAEAjB,EAAA,2BAA4C,CAAC0Q,EAAMzP,IAAM,CA54H3D,IAAAJ,EAAAC,EA64HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,sBAAjB,MAAAC,EAAA,KAAAD,EAAuC6P,EAAMzP,EAC/C,GAEAjB,EAAA,0BAA2C,CAAC0Q,EAAMzP,IAAM,CAl5H1D,IAAAJ,EAAAC,EAm5HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,qBAAjB,MAAAC,EAAA,KAAAD,EAAsC6P,EAAMzP,EAC9C,GAEAjB,EAAA,oBAAqC,CAAC0Q,EAAMzP,IAAM,CAx5HpD,IAAAJ,EAAAC,EAy5HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,qBAAsC,CAAC0Q,EAAMzP,IAAM,CA75HrD,IAAAJ,EAAAC,EA85HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,EACzC,GAEAjB,EAAA,uBAAwC,CAAC0Q,EAAMzP,IAAM,CAl6HvD,IAAAJ,EAAAC,EAm6HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,kBAAjB,MAAAC,EAAA,KAAAD,EAAmC6P,EAAMzP,EAC3C,GAEAjB,EAAA,uBAAwC,CAAC0Q,EAAMzP,IAAM,CAv6HvD,IAAAJ,EAAAC,EAw6HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,kBAAjB,MAAAC,EAAA,KAAAD,EAAmC6P,EAAMzP,EAC3C,GAGAjB,EAAA,2BAAkD,CAAC0Q,EAAMzP,IAAM,CA76HjE,IAAAJ,EAAAC,EA86HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,sBAAjB,MAAAC,EAAA,KAAAD,EAAuC6P,EAAMzP,EAC/C,GAEAjB,EAAA,iCAAwD,CAAC0Q,EAAMzP,IAAM,CAn7HvE,IAAAJ,EAAAC,EAy7HI,GALA,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,4BAAjB,MAAAC,EAAA,KAAAD,EAA6C6P,EAAMzP,GAG/C,KAAK,YAAY,SAAW,EAAG,OAEnC,IAAMM,EAAQ,KAAK,SAAS,KAAK,YAAY,EAAE,EAE/C,GAAIA,EAAM,gBAA8BA,EAAM,eAA4B,CACxE,IAAM6O,EAAQ,KAAK,SAAS,OAAO7O,EAAM,SACnCgJ,EAAO7I,EAAK,aAAaH,CAAK,EAC9B6P,EAAU7G,EAAK,UAAUhJ,CAAK,EAC9B8P,EAAU9G,EAAK,UAAUzK,EAAAC,EAAA,GAAKwB,GAAL,CAAY,KAAM6O,EAAM,IAAK,EAAC,EACvDrE,EAAQ,OAAI,IAAIsF,EAASD,CAAO,EAEtC,KAAK,aAAa,CAChB,GAAI7P,EAAM,GACV,MAAO,OAAI,IAAIA,EAAM,MAAOwK,CAAK,EACjC,KAAMqE,EAAM,IACd,CAAC,CACH,CACF,GAEApQ,EAAA,gCAAuD,CAAC0Q,EAAMzP,IAAM,CA58HtE,IAAAJ,EAAAC,EA68HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,2BAAjB,MAAAC,EAAA,KAAAD,EAA4C6P,EAAMzP,EACpD,GAEAjB,EAAA,0BAAiD,CAAC0Q,EAAMzP,IAAM,CAl9HhE,IAAAJ,EAAAC,EAm9HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,qBAAjB,MAAAC,EAAA,KAAAD,EAAsC6P,EAAMzP,EAC9C,GAEAjB,EAAA,2BAAkD,CAAC0Q,EAAMzP,IAAM,CAv9HjE,IAAAJ,EAAAC,EAw9HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,sBAAjB,MAAAC,EAAA,KAAAD,EAAuC6P,EAAMzP,EAC/C,GAEAjB,EAAA,6BAAoD,CAAC0Q,EAAMzP,IAAM,CA59HnE,IAAAJ,EAAAC,EA69HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,wBAAjB,MAAAC,EAAA,KAAAD,EAAyC6P,EAAMzP,EACjD,GAEAjB,EAAA,6BAAoD,CAAC0Q,EAAMzP,IAAM,CAj+HnE,IAAAJ,EAAAC,EAk+HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,wBAAjB,MAAAC,EAAA,KAAAD,EAAyC6P,EAAMzP,EACjD,GAGAjB,EAAA,qBAAuC,CAAC0Q,EAAMzP,IAAM,CAv+HtD,IAAAJ,EAAAC,EAw+HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,EACzC,GAEAjB,EAAA,2BAA6C,CAAC0Q,EAAMzP,IAAM,CA7+H5D,IAAAJ,EAAAC,EA8+HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,sBAAjB,MAAAC,EAAA,KAAAD,EAAuC6P,EAAMzP,EAC/C,GAEAjB,EAAA,0BAA4C,CAAC0Q,EAAMzP,IAAM,CAn/H3D,IAAAJ,EAAAC,EAo/HI,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,qBAAjB,MAAAC,EAAA,KAAAD,EAAsC6P,EAAMzP,EAC9C,GAEAjB,EAAA,oBAAsC,CAAC0Q,EAAMzP,IAAM,CAz/HrD,IAAAJ,EAAAC,EA0/HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,qBAAuC,CAAC0Q,EAAMzP,IAAM,CA9/HtD,IAAAJ,EAAAC,EA+/HI,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,gBAAjB,MAAAC,EAAA,KAAAD,EAAiC6P,EAAMzP,EACzC,GAEAjB,EAAA,uBAAyC,CAAC0Q,EAAMzP,IAAM,CAngIxD,IAAAJ,EAAAC,EAogII,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,kBAAjB,MAAAC,EAAA,KAAAD,EAAmC6P,EAAMzP,EAC3C,GAEAjB,EAAA,uBAAyC,CAAC0Q,EAAMzP,IAAM,CAxgIxD,IAAAJ,EAAAC,EAygII,KAAK,aAAa4P,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,kBAAjB,MAAAC,EAAA,KAAAD,EAAmC6P,EAAMzP,EAC3C,GAEAjB,EAAA,qBAAiBuB,GAA6C,CAC5D,IAAMwL,EAAa,KAAK,SAAS,MAAM,KAAK,eAAe,OACrDuE,EAAgBvR,IAAA,GAAMgN,EAAWxL,EAAM,KAAgBA,GACvDkB,EAAiBwK,GAAa,KAAM,CAACqE,CAAa,EAAG,KAAK,aAAa,EAAE,MAC/E,OAAO,KAAK,WAAW7O,EAAO,gBAAgB,CAEhD,GAEAzC,EAAA,mBAAc,IAAM,CArhItB,IAAAa,EAAAC,EAuhII,GAAI,YAAY,IAAI,EAAI,KAAK,iBAAmB,GAAI,OAEpD,GAAM,CAAE,UAAA2D,CAAU,EAAI,KAAK,UACrB,CAAE,aAAA8M,CAAa,EAAI,KAAK,YAAY,EAE1C,GAAI9M,EAAW,CAEb,IAAMlD,EAAQ,KAAK,SAASkD,CAAS,EACrC,KAAK,aAAa,EACdlD,EAAM,gBACJA,EAAM,KAAK,KAAK,EAAE,QAAU,EAC9B,KAAK,WAAoB6L,GAAa,KAAM,CAAC3I,CAAS,CAAC,EAAE,MAAO,mBAAmB,EACzE8M,GACV,KAAK,OAAO9M,CAAS,EAG3B,EAEA3D,GAAAD,EAAA,KAAK,aAAY,cAAjB,MAAAC,EAAA,KAAAD,EACF,GAEAb,EAAA,oBAAoC,CAAC0Q,EAAMzP,IAAM,CA5iInD,IAAAJ,EAAAC,EA6iII,KAAK,YAAc,KAAK,aAAa4P,EAAK,KAAK,EAAE,OAAOA,EAAK,QAAQ,EACrE,KAAK,aAAaA,EAAMzP,CAAC,GACzBH,GAAAD,EAAA,KAAK,aAAY,eAAjB,MAAAC,EAAA,KAAAD,EAAgC6P,EAAMzP,EACxC,GAEAjB,EAAA,2BAAuBqI,GAAkB,CACvC,IAAMmJ,EAAW,KAAK,YAAY,EAC9BA,EAAS,eAAiBnJ,EAAI,OAAS,EACzC,KAAK,WACH,CACE,SAAU,CACR,cAAe,EACjB,CACF,EACA,oBACF,EACS,CAACmJ,EAAS,eAAiBnJ,EAAI,QAAU,GAClD,KAAK,WACH,CACE,SAAU,CACR,cAAe,EACjB,CACF,EACA,mBACF,CAEJ,GAEArI,EAAA,eAAU,IAAM,CAEhB,GAmFAA,EAAA,oBAAe0B,EAAK,cA73HlB,KAAK,UAAYjC,CACnB,CAslBA,UAAUgS,EAAgB,CACxB,OAAO,KAAK,WACV,CACE,SAAU,CAAE,OAAAA,CAAO,CACrB,EACA,cAAcA,GAChB,CACF,CA+MA,IAAI,YAAsB,CACxB,OAAO,KAAK,SAAS,UACvB,CAEA,IAAI,WAAqB,CACvB,OAAO,KAAK,SAAS,SACvB,CAEA,IAAI,eAAyB,CAC3B,OAAO,KAAK,SAAS,aACvB,CAyBA,IAAI,YAAa,CAjnCnB,IAAA5Q,EAknCI,OAAOA,EAAA,KAAK,SAAS,aAAd,KAAAA,EAA4B,UACrC,CA0fA,IAAI,SAAU,CACZ,OAAO,KAAK,MAAM,MAAM,EAAG,KAAK,QAAU,CAAC,CAC7C,CAKA,IAAI,QAAQ6Q,EAA0B,CACpC,KAAK,eAAeA,CAAQ,CAC9B,CAKA,IAAI,UAAuB,CACzB,OAAO,KAAK,MAAM,QACpB,CAKA,IAAI,UAAmC,CACrC,OAAO,KAAK,MAAM,QACpB,CAKA,IAAI,UAAmC,CACrC,OAAO,KAAK,MAAM,QACpB,CAKA,IAAI,eAAwB,CAC1B,OAAO,KAAK,MAAM,SAAS,aAC7B,CAKA,IAAI,MAAe,CACjB,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,cACxC,CAKA,IAAI,QAAoB,CACtB,OAAO,OAAO,OAAO,KAAK,KAAK,MAAM,CACvC,CAKA,IAAI,UAAwB,CAC1B,OAAO,OAAO,OAAO,KAAK,KAAK,QAAQ,CACzC,CAKA,IAAI,QAAoB,CACtB,OAAO,OAAO,OAAO,KAAK,SAAS,MAAM,CAC3C,CAKA,IAAI,WAAyB,CAC3B,OAAO,KAAK,MAAM,SAAS,WAAW,KAAK,cAC7C,CAEA,IAAI,QAGF,CACA,OAAO,KAAK,UAAU,MACxB,CAEA,IAAI,MAAe,CACjB,OAAO,KAAK,UAAU,OAAO,IAC/B,CAKA,IAAI,aAAwB,CAC1B,OAAO,KAAK,UAAU,WACxB,CA0zCA,uBAAuBvM,EAAiB3F,EAAaiD,EAAuB,CAC1E,GAAM,CACJ,OAAAW,EACA,SAAU,CAAE,cAAAf,EAAe,aAAAsP,CAAa,CAC1C,EAAI,KAEEC,EACJxO,EAAO,SAAW,EACd,EACAA,EACG,OAAQ7B,GAAUA,EAAM,WAAac,CAAa,EAClD,KAAK,CAAC+H,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,EAAE,GAAG,WAAa,EAE/DyH,EAAOC,WAEPC,EAAWF,EAAK,OAAO,CAC3B,GAAIrS,GAAM,SAAM,SAAS,EACzB,SAAU6C,EACV,WAAAuP,EACA,MAAAzM,EACA,MAAOpF,EAAA,GAAK4R,EACd,CAAC,EAEKzM,EAAS2M,EAAK,UAAUE,CAAQ,EACtC,OAAAA,EAAS,MAAQ,OAAI,IAAIA,EAAS,MAAO,CAAC7M,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,CAAC,EAE1EzC,EACF,KAAK,YAAY,CAACf,EAAK,aAAaqQ,EAAS,IAAI,EAAE,OAAOA,CAAQ,CAAC,CAAC,EAEpE,KAAK,aAAaA,CAAQ,EAG5B,KAAK,aAAaA,EAAS,GAAI,EAAI,EAE5B,IACT,CAEA,4BACEvS,EACAyG,EACAd,EACAiJ,EACAiC,EACA,CACA,GAAM,CACJ,OAAAjN,EACA,SAAU,CAAE,cAAAf,EAAe,aAAAsP,CAAa,CAC1C,EAAI,KAEEC,EACJxO,EAAO,SAAW,EACd,EACAA,EACG,OAAQ7B,GAAUA,EAAM,WAAac,CAAa,EAClD,KAAK,CAAC+H,EAAGC,IAAMA,EAAE,WAAaD,EAAE,UAAU,EAAE,GAAG,WAAa,EAE/D4H,EAAQF,GAAW7L,GAIzB,GAAImI,EAAK,GAAK,KAAK,SAAS,MAAO,CACjC,IAAM6D,EAAI7D,EAAK,GAAKA,EAAK,GACzBA,EAAK,GAAK,KAAK,SAAS,MAAS,IAAwB,KAAK,OAAO,KAAQ,EAC7EA,EAAK,GAAKA,EAAK,GAAK6D,GAChB7D,EAAK,GAAK,IAAMA,EAAK,GAAK,MAC5BA,EAAK,GAAK,GACVA,EAAK,GAAKA,EAAK,GAAK6D,EAExB,SAAW7D,EAAK,GAAK,KAAK,SAAS,OAAQ,CACzC,IAAM6D,EAAI7D,EAAK,GAAKA,EAAK,GACzBA,EAAK,GAAK,KAAK,SAAS,OAAU,IAAwB,KAAK,OAAO,KAAQ,EAC9EA,EAAK,GAAKA,EAAK,GAAK6D,GAChB7D,EAAK,GAAK,IAAMA,EAAK,GAAK,MAC5BA,EAAK,GAAK,GACVA,EAAK,GAAKA,EAAK,GAAK6D,EAExB,CAYA,OAViBD,EAAM,OAAO,CAC5B,GAAAxS,EACA,SAAU6C,EACV,WAAAuP,EACA,MAAAzM,EACA,KAAAiJ,EACA,MAAOrO,EAAA,GAAK4R,GACZ,QAAAtB,CACF,CAAC,CAGH,CAm/BA,WAAW7Q,EAAY,CACrB,OAAO,KAAK,YAAY,SAASA,CAAE,CACrC,CAUA,eAAeA,EAAoB,CACjC,IAAM0S,EAAQ,SAAS,eAAe1S,EAAK,QAAQ,EACnD,GAAI0S,EAAO,CACT,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9C,OAAAA,EAAO,MAAQD,EAAM,WACrBC,EAAO,OAASD,EAAM,YACtBC,EAAO,WAAW,IAAI,EAAG,UAAUD,EAAO,EAAG,CAAC,EACvCC,EAAO,UAAU,WAAW,CACrC,KAAO,OAAM,IAAI,MAAM,iBAAmB3S,EAAK,YAAY,CAC7D,CAQA,eAAeA,EAAoB,CACjC,IAAM4S,EAAQ,SAAS,eAAe5S,EAAK,QAAQ,EACnD,GAAI4S,EAAO,CACT,IAAMD,EAAS,SAAS,cAAc,QAAQ,EAC9C,OAAAA,EAAO,MAAQC,EAAM,MACrBD,EAAO,OAASC,EAAM,OACtBD,EAAO,WAAW,IAAI,EAAG,UAAUC,EAAO,EAAG,CAAC,EACvCD,EAAO,UAAU,WAAW,CACrC,KAAO,OAAM,IAAI,MAAM,iBAAmB3S,EAAK,YAAY,CAC7D,CAEA,YAAY8D,EAAkB,CAC5B,KAAK,SAAS,OAASvD,IAAA,GAClB,KAAK,SAAS,QACduD,EAEP,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,MAAM,IACpB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,MAAM,OAAS,QAAa,KAAK,MAAM,KAAK,KAAO,OACjE,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,SAAS,MACvB,CAEA,IAAI,aAAc,CAChB,GAAI,EAAC,KAAK,MAAM,KAChB,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,OAC/C,CAGA,IAAI,aAAc,CAChB,GAAM,CAAE,MAAA+B,EAAO,OAAAC,CAAO,EAAI,KAAK,eAC/B,OAAO,OAAI,QAAQ,CAACD,EAAQ,EAAGC,EAAS,CAAC,CAAC,CAC5C,CAEA,IAAI,aAAc,CAChB,GAAM,CAAE,KAAAF,CAAK,EAAI,KAAK,OACtB,OAAIA,EAAO,IACF,EAAY,GACVA,EAAO,EACT,EAAY,EAEZ,EAAY,CAEvB,CAwEF,EA/hIaiN,GAAN/S,GA29HLU,EA39HWqS,GA29HJ,UAAU,MAEjBrS,EA79HWqS,GA69HJ,kBAA8B,CACnC,GAAI,MACJ,KAAM,eACN,QAAS/S,GAAS,QAClB,MAAO,CACL,KAAM,CACJ,GAAI,OACJ,KAAM,SACN,WAAY,EACZ,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,CACF,EACA,WAAY,CACV,KAAM,CACJ,GAAI,OACJ,YAAa,CAAC,EACd,OAAQ,CACN,MAAO,CAAC,EAAG,CAAC,EACZ,KAAM,CACR,CACF,CACF,EACA,OAAQ,CAAC,CACX,GAEAU,EAv/HWqS,GAu/HJ,eAA2B,CAChC,SAAU,CACR,gBAAiB,GACjB,UAAW,GACX,WAAY,GACZ,WAAY,GACZ,YAAa,GACb,WAAY,GACZ,YAAa,GACb,eAAgB,GAChB,kBAAmB,GACnB,mBAAoB,GACpB,mBAAoB,EACpB,kBAAmB,GACnB,mBAAoB,GACpB,iBAAkB,GAClB,SAAU,GACV,SAAU,KACV,aAAc,SACd,+BACA,WAAY,UACd,EACA,SAAU,CACR,cACA,WAAY,SACZ,UAAW,OACX,cAAe,OACf,aAAcC,GACd,aAAc,GACd,WAAY,GACZ,cAAe,GACf,UAAW,CAAC,EACZ,UAAW,CAAC,EACZ,UAAW,GACX,cAAe,EACjB,EACA,SAAUhT,GAAS,eACrB,GAEAU,EA9hIWqS,GA8hIJ,WAAW,qB2DpsIb,IAAME,GAA4C,CACvD,OAAQC,GACR,MAAOC,GACP,SAAoBC,GACpB,SAAoBC,GACpB,YAAuBC,GACvB,cAAyBC,GACzB,aAAwBC,GACxB,SAAoBC,GACpB,UAAqBC,GACrB,WAAsBC,GACtB,QAAmBC,EACrB,E/K3CA,IAAAC,GAAA,6BAqCMC,GAAgB,GAAAC,cA0GhBC,GAAmB,OAAO,WAC5B,OAAO,WAAW,8BAA8B,EAAE,QAClD,GAEG,SAASC,GAAM,CACpB,GAAAC,EACA,SAAAC,EACA,cAAAC,EACA,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,oBAAAC,EAAsB,GACtB,UAAAC,EAAY,GACZ,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,WAAAC,EAAa,GACb,OAAAC,EAAS,GACT,SAAAC,EAAW,GACX,cAAAC,EAAgB,GAChB,SAAAC,EAAWf,GACX,WAAAgB,EACA,QAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,cAAAC,EACA,cAAAC,GACA,cAAAC,EACA,eAAAC,GACA,aAAAC,GACA,SAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,kBAAAC,EACF,EAAe,CACb,GAAM,CAACC,GAAKC,EAAM,EAAU,YAASvC,CAAE,EAGjC,aAAU,IAAM,CAChBqC,KACFG,GAAqBH,EAAiB,EACtCI,GAAgB,EAEpB,EAAG,CAACJ,EAAiB,CAAC,EAGtB,GAAM,CAACK,EAAKC,EAAM,EAAU,YAAS,IACvB,IAAIC,GAAS5C,EAAI,CAC3B,QAAAe,EACA,SAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,cAAAE,GACA,cAAAD,EACA,cAAAE,EACA,eAAAC,GACA,aAAAC,EACF,CAAC,CAEF,EAEK,CAACY,GAAUC,CAAW,EAAU,YAA8B,IAAI,EAClE,CAACC,EAAOC,CAAQ,EAAU,YAA8B,IAAI,EAC5D,CAACC,GAAMC,CAAO,EAAU,YAA8B,IAAI,EAC1D,CAACC,GAAaC,EAAc,EAAU,YAA6B,IAAI,EAEvEC,GAAmB,eACvB,CAACF,GAA0BJ,GAAmBE,GAAkBJ,KAAyB,CACvFO,GAAe,IAAMD,EAAW,EAChCL,EAAY,IAAMD,EAAQ,EAC1BG,EAAS,IAAMD,EAAK,EACpBG,EAAQ,IAAMD,EAAI,CACpB,EACA,CAAC,CACH,EAGA,OAAM,mBAAgB,IAAM,CAC1B,GAAIjD,IAAOsC,GAAK,OAChB,IAAMgB,GAAS,IAAIV,GAAS5C,EAAI,CAC9B,QAAAe,EACA,SAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,cAAAE,GACA,cAAAD,EACA,cAAAE,EACA,SAAAG,GACA,eAAAF,GACA,aAAAC,EACF,CAAC,EAEDM,GAAOvC,CAAE,EAET2C,GAAOW,EAAM,CACf,EAAG,CAAChB,GAAKtC,CAAE,CAAC,EAIN,aAAU,IAAM,CAChB,CAACC,IAEDA,EAAS,KAAOyC,EAAI,SAAS,GAC/BA,EAAI,eAAezC,CAAQ,EAE3ByC,EAAI,aAAazC,CAAQ,EAE7B,EAAG,CAACA,EAAUyC,CAAG,CAAC,EAGZ,aAAU,IAAM,CACpBA,EAAI,iBAAiB9B,CAAa,CACpC,EAAG,CAAC8B,EAAK9B,CAAa,CAAC,EAGjB,aAAU,IAAM,CAChB,CAACV,GACLwC,EAAI,WAAWxC,CAAa,CAC9B,EAAG,CAACA,EAAewC,CAAG,CAAC,EAGjB,aAAU,IAAM,CACpBA,EAAI,SAAW/B,EACVA,IACH+B,EAAI,WAAW,EACfA,EAAI,cAAc,EAClBA,EAAI,aAAa,EAErB,EAAG,CAACA,EAAK/B,CAAQ,CAAC,EAGZ,aAAU,IAAM,CAChBE,IAAa6B,EAAI,SAAS,YAC5BA,EAAI,eAAe,CAEvB,EAAG,CAACA,EAAK7B,CAAQ,CAAC,EAGZ,aAAU,IAAM,CACpB6B,EAAI,UAAY,CACd,QAAA3B,EACA,SAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,cAAAE,GACA,cAAAD,EACA,cAAAE,EACA,SAAAG,GACA,eAAAF,GACA,aAAAC,EACF,CACF,EAAG,CACDlB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAE,GACAD,EACAE,EACAG,GACAF,GACAC,EACF,CAAC,EAEK,mBAAgB,IAAM,CApW9B,IAAAsB,GAsWI,GADI,OAAO,QAAW,aAClB,GAACA,GAAA,OAAO,WAAP,MAAAA,GAAiB,OAAO,OAE7B,SAASC,IAAuB,CAC9Bd,EAAI,qBAAqB,CAC3B,CACA,cAAO,SAAS,MAAM,iBAAiB,cAAec,EAAoB,EACnE,IAAM,CACX,OAAO,SAAS,MAAM,oBAAoB,cAAeA,EAAoB,CAC/E,CACF,EAAG,CAACd,CAAG,CAAC,KAIN,QAACe,GAAa,SAAb,CAAsB,MAAOf,EAC5B,oBAACgB,GAAmB,SAAnB,CACC,MAAO,CAAE,MAAAX,EAAO,SAAAF,GAAU,KAAAI,GAAM,YAAAE,GAAa,eAAAC,GAAgB,WAAAC,EAAW,EAExE,oBAACM,GAAqB,SAArB,CAA8B,MAAOvB,IAAmB,CAAC,EACxD,oBAACwB,GAAA,CAEC,GAAItB,GACJ,UAAWnC,EACX,UAAWG,EACX,SAAUF,EACV,oBAAqBC,EACrB,WAAYI,EACZ,SAAUD,EACV,UAAWD,EACX,OAAQG,EACR,SAAUC,EACV,WAAYG,EACZ,YAAaqB,GACb,gBAAiBC,IAbZE,IAAO,OAcd,EACF,EACF,EACF,CAEJ,CAoBA,IAAMsB,GAAmB,QAAK,SAAoB,CAChD,GAAA5D,EACA,UAAAG,EACA,UAAAG,EACA,SAAAF,EACA,oBAAAC,EACA,SAAAG,EACA,WAAAC,EACA,UAAAF,EACA,SAAAI,EACA,OAAAD,EACA,WAAAI,EACA,YAAAqB,EACA,gBAAAC,CACF,EAAoB,CA9apB,IAAAmB,EAAAM,GAAAC,GA+aE,IAAMpB,EAAMqB,EAAY,EAClB,CAACC,EAAiBC,CAAkB,EAAU,YAAc,IAAI,EAChEC,EAAiB,UAAuB,IAAI,EAC5CC,EAAoB,UAAuB,IAAI,EAE/CC,EAAQ1B,EAAI,SAAS,EAErB,CAAE,SAAAzC,EAAU,SAAAoE,EAAU,SAAAC,EAAU,KAAAC,CAAK,EAAIH,EAEzCI,EAAcJ,EAAM,SAAS,aAAe,SAE5CK,EAAOxE,EAAS,MAAMqE,EAAS,eAC/BI,EAAYzE,EAAS,WAAWwE,EAAK,IACrCE,EAAS1E,EAAS,OAClB,CAAE,YAAA2E,CAAY,EAAIF,EAElBG,EACJD,EAAY,SAAW,GACvBH,EAAK,OAAOG,EAAY,KACxBE,EAAK,aAAaL,EAAK,OAAOG,EAAY,IAAI,IAAI,EAAE,WAEhDG,GACJH,EAAY,SAAW,GACvBH,EAAK,OAAOG,EAAY,KACxBE,EAAK,aAAaL,EAAK,OAAOG,EAAY,IAAI,IAAI,EAAE,kBAGhDI,EAAa,WAAQ,KAClB,CACL,WAAYX,EAAS,WACrB,WAAYA,EAAS,YAAc,WACnC,cAAeC,EAAS,aAC1B,GACC,CAACD,EAAS,WAAYA,EAAS,WAAYC,EAAS,aAAa,CAAC,EAE/DW,GAAkBZ,EAAS,gBAC7B,CAACC,EAAS,gBACVA,EAAS,gBAGPY,GAAc,WAAQ,IAAM,CAChC,GAAM,CAAE,gBAAAC,CAAgB,EAAIb,EACtB,CAAE,WAAAc,EAAY,gBAAAC,CAAgB,EAAIhB,EAExC,GAAIe,EAAY,CACd,IAAME,EAAYD,EACdF,EACE,eACA,eACF,gBACJ,MAAO,CACL,UAAW,QAAQG,MAAcD,EAAkB,IAAO,OAC1D,YAAa,QAAQC,MAAcD,EAAkB,GAAM,OAC3D,gBAAiB,QAAQC,SACzB,SAAU,wBACV,WAAY,2BACZ,WAAY,YACZ,WAAY,SACd,CACF,CAEA,IAAMA,GAAYD,EAAmBF,EAAkB,aAAe,cAAiB,QAEvF,MAAO,CACL,UAAW,QAAQG,OAAcD,EAAkB,IAAO,OAC1D,YAAa,QAAQC,OAAcD,EAAkB,GAAM,OAC3D,gBAAiB,QAAQC,UACzB,SAAU,wBACV,WAAY,2BACZ,WAAY,YACZ,WAAY,WACd,CACF,EAAG,CAACjB,EAAS,WAAYA,EAAS,gBAAiBC,EAAS,eAAe,CAAC,EAEtEiB,GAAc7C,EAAI,UAAY,OAG9B8C,GACHD,MAAehC,EAAAb,EAAI,UAAJ,YAAAa,EAAa,YAAY,QAAS,gBAClD,CAACiB,GACDK,GACA,CAAC,CAACH,EAAU,WACZ,CAAC,CAACJ,EAAS,cAGPmB,GAAcF,IAAe,CAACf,GAAe,CAAC,CAACF,EAAS,cAGxDoB,GACHH,IAAenB,EAAM,SAAS,qBAC/B,CAACI,GACD,CAAC,CAACF,EAAS,cAEPqB,GAAmBJ,IAAe,CAACf,GAAeE,EAAU,OAAO,KAAO,GAE1EkB,GAAcC,GAAexB,EAAS,QAAQ,EAIpD,OAAM,mBAAgB,IAAM,CAC1B,IAAMyB,EAAM5B,EAAS,QACjB,CAAC4B,IACDzB,EAAS,WACXyB,EAAI,UAAU,IAAIC,EAAI,EAEtBD,EAAI,UAAU,OAAOC,EAAI,EAE7B,EAAG,CAAC1B,EAAS,UAAU,CAAC,EAExB2B,GAAU9B,CAAQ,KAGhB,QAAC+B,GAAiB,SAAjB,CAA0B,MAAO/B,EAChC,qBAAC,iBAAa,OAAQ0B,GAAY,OAAQ,SAAUA,GAAY,SAC9D,qBAACM,GAAA,CAAY,UAAWlC,EAAiB,KACzC,SAACmC,GAAA,CAAa,IAAKjC,EAAU,SAAU,GACrC,qBAACkC,GAAA,EAAQ,KACT,QAACC,GAAA,CAAO,aAAcnC,EAAU,UAAW/D,EAAW,EAErDO,MACC,SAAC4F,GAAA,CAAkB,IAAKrC,EAEtB,qBAACsC,GAAA,CACC,oBAACC,GAAA,CACC,SAAU7F,EACV,UAAWL,EACX,SAAUF,EACV,oBAAqBC,EACrB,WAAY,GACZ,SAAUG,EACZ,EACF,KAGA,SAACiG,GAAA,CAEE,UAAAlG,GAAa,CAACI,MAAY,QAAC+F,GAAA,EAAU,KAGtC,SAACC,GAAA,CAAiB,IAAKxC,EACrB,qBAACyC,GAAA,CACC,oBAAChH,GAAA,CAAc,kBAAmBiH,GAChC,oBAAC,aACC,GAAI7G,EACJ,aAAcmE,EACd,WAAY2C,GACZ,KAAMrC,EACN,UAAWC,EACX,OAAQC,EACR,UAAWL,EAAS,UACpB,UAAWA,EAAS,UACpB,KAAM,EACN,MAAOC,GAAA,YAAAA,EAAM,MACb,OAAQA,GAAA,YAAAA,EAAM,OACd,MAAOW,GACP,KAAMF,EACN,WAAYlE,EACZ,YAAaqB,EACb,WAAYqD,GACZ,YAAaC,GACb,kBAAmBV,GACnB,eAAgBW,GAChB,mBAAoB,CAACrB,EAAS,mBAC9B,iBAAkBsB,GAClB,kBAAmB,CAACtB,EAAS,kBAC7B,SAAU,CAACA,EAAS,SACpB,gBAAiBY,GACjB,iBAAiBpB,GAAAnB,EAAI,UAAJ,YAAAmB,GAAa,gBAC9B,aAAcnB,EAAI,aAClB,WAAYA,EAAI,WAChB,QAASA,EAAI,QACb,MAAOA,EAAI,MACX,OAAQA,EAAI,OACZ,cAAeA,EAAI,cACnB,cAAeA,EAAI,cACnB,YAAaA,EAAI,YACjB,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,gBAAiBA,EAAI,gBACrB,aAAcA,EAAI,aAClB,mBAAoBA,EAAI,mBACxB,kBAAmBA,EAAI,kBACvB,YAAaA,EAAI,YACjB,aAAcA,EAAI,aAClB,eAAgBA,EAAI,eACpB,eAAgBA,EAAI,eACpB,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,cAAeA,EAAI,cACnB,gBAAiBA,EAAI,gBACrB,gBAAiBA,EAAI,gBACrB,oBAAqBA,EAAI,oBACzB,0BAA2BA,EAAI,0BAC/B,yBAA0BA,EAAI,yBAC9B,mBAAoBA,EAAI,mBACxB,oBAAqBA,EAAI,oBACzB,sBAAuBA,EAAI,sBAC3B,sBAAuBA,EAAI,sBAC3B,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,cAAeA,EAAI,cACnB,gBAAiBA,EAAI,gBACrB,gBAAiBA,EAAI,gBACrB,QAASA,EAAI,QACb,oBAAqBA,EAAI,oBACzB,cAAeA,EAAI,cACnB,YAAaA,EAAI,YACjB,aAAcA,EAAI,aAClB,eAAgBA,EAAI,aACpB,UAAWA,EAAI,UACf,QAASA,EAAI,QACb,WAAYA,EAAI,WAChB,OAAQA,EAAI,OACd,EACF,EACF,EAECnC,GAAa,CAACI,MAAY,QAACoG,GAAA,EAAc,GAC5C,KAGA,QAACC,GAAA,EAAW,GACd,GACF,EAID,CAACtG,MACA,QAACkG,GAAA,CACC,oBAAChH,GAAA,CAAc,kBAAmBiH,GAChC,oBAAC,aACC,GAAI7G,EACJ,aAAckE,EACd,WAAY4C,GACZ,KAAMrC,EACN,UAAWC,EACX,OAAQC,EACR,UAAWL,EAAS,UACpB,UAAWA,EAAS,UACpB,KAAM,EACN,MAAOC,GAAA,YAAAA,EAAM,MACb,OAAQA,GAAA,YAAAA,EAAM,OACd,MAAOW,GACP,KAAMF,EACN,WAAYlE,EACZ,YAAaqB,EACb,WAAYqD,GACZ,YAAaC,GACb,kBAAmBV,GACnB,eAAgBW,GAChB,mBAAoB,CAACrB,EAAS,mBAC9B,iBAAkBsB,GAClB,kBAAmB,CAACtB,EAAS,kBAC7B,SAAU,CAACA,EAAS,SACpB,gBAAiBY,GACjB,iBAAiBnB,GAAApB,EAAI,UAAJ,YAAAoB,GAAa,gBAC9B,aAAcpB,EAAI,aAClB,WAAYA,EAAI,WAChB,QAASA,EAAI,QACb,MAAOA,EAAI,MACX,OAAQA,EAAI,OACZ,cAAeA,EAAI,cACnB,cAAeA,EAAI,cACnB,YAAaA,EAAI,YACjB,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,gBAAiBA,EAAI,gBACrB,aAAcA,EAAI,aAClB,mBAAoBA,EAAI,mBACxB,kBAAmBA,EAAI,kBACvB,YAAaA,EAAI,YACjB,aAAcA,EAAI,aAClB,eAAgBA,EAAI,eACpB,eAAgBA,EAAI,eACpB,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,cAAeA,EAAI,cACnB,gBAAiBA,EAAI,gBACrB,gBAAiBA,EAAI,gBACrB,oBAAqBA,EAAI,oBACzB,0BAA2BA,EAAI,0BAC/B,yBAA0BA,EAAI,yBAC9B,mBAAoBA,EAAI,mBACxB,oBAAqBA,EAAI,oBACzB,sBAAuBA,EAAI,sBAC3B,sBAAuBA,EAAI,sBAC3B,cAAeA,EAAI,cACnB,oBAAqBA,EAAI,oBACzB,mBAAoBA,EAAI,mBACxB,aAAcA,EAAI,aAClB,cAAeA,EAAI,cACnB,gBAAiBA,EAAI,gBACrB,gBAAiBA,EAAI,gBACrB,QAASA,EAAI,QACb,oBAAqBA,EAAI,oBACzB,cAAeA,EAAI,cACnB,YAAaA,EAAI,YACjB,aAAcA,EAAI,aAClB,eAAgBA,EAAI,aACpB,UAAWA,EAAI,UACf,QAASA,EAAI,QACb,WAAYA,EAAI,WAChB,OAAQA,EAAI,OACd,EACF,EACF,GAEJ,GACF,EACF,CAEJ,CAAC,EAEK2D,GAAe,QAAK,SAAgB,CACxC,aAAAY,EACA,UAAA9G,CACF,EAGG,CACD,OAAA+G,GAAqBD,CAAY,EAE3B,aAAU,IAAM,CA3vBxB,IAAA1D,EA4vBQpD,KACFoD,EAAA0D,EAAa,UAAb,MAAA1D,EAAsB,QAE1B,EAAG,CAACpD,CAAS,CAAC,EAEP,IACT,CAAC,EAEKgG,GAAegB,EAAO,MAAO,CACjC,SAAU,WACV,OAAQ,OACR,MAAO,OACP,UAAW,EACX,SAAU,EACV,UAAW,OACX,SAAU,OACV,SAAU,SACV,UAAW,aACX,QAAS,OACT,WAAY,OACZ,iBAAkB,OAClB,WAAY,UAEZ,mDAAoD,CAClD,mBAAoB,OACpB,iBAAkB,OAClB,8BAA+B,cAC/B,sBAAuB,aACzB,CACF,CAAC,EAEKb,GAAoBa,EAAO,MAAO,CACtC,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,OACR,MAAO,OACP,QAAS,OACT,cAAe,SACf,OAAQ,EACR,cAAe,MACjB,CAAC,EAEKZ,GAAeY,EAAO,MAAO,CACjC,MAAO,OACP,OAAQ,OACR,WAAY,SACZ,aAAc,uBACd,QAAS,OACT,WAAY,SACZ,cAAe,MACf,WAAY,EACZ,OAAQ,GACV,CAAC,EAEKV,GAAiBU,EAAO,MAAO,CACnC,QAAS,OACT,KAAM,EACN,UAAW,EACX,SAAU,UACZ,CAAC,EAEKR,GAAmBQ,EAAO,MAAO,CACrC,KAAM,EACN,SAAU,WACV,SAAU,SACV,cAAe,MACf,SAAU,EAEV,kBAAmB,CACjB,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,OACP,OAAQ,OACR,OAAQ,CACV,CACF,CAAC",
6
+ "names": ["googleFonts_exports", "__export", "fetchGoogleFonts", "getGoogleFontCategories", "initGoogleFonts", "loadGoogleFont", "searchGoogleFonts", "setGoogleFontsApiKey", "key", "cleaned", "_apiKey", "cachedFonts", "fontsPromise", "__async", "_a", "url", "res", "e", "query", "category", "list", "f", "q", "getPersistedFonts", "STORAGE_KEY", "persistFont", "family", "existing", "variants", "id", "familyParam", "link", "restorePersistedFonts", "init_googleFonts", "__esmMin", "src_exports", "__export", "AlignStyle", "AlignType", "Arrow", "ColorStyle", "DashStyle", "Decoration", "DistributeType", "Draw", "Ellipse", "FlipType", "FontSize", "FontStyle", "Group", "Image", "MoveType", "Pen", "ReactComponent", "Rectangle", "SessionType", "SizeStyle", "Sticky", "StretchType", "TVAssetType", "TVDR", "TVEventHandler", "TVExportBackground", "TVExportType", "TVShapeType", "TVStatus", "TVUserStatus", "Telva", "TelvaApp", "Text", "Triangle", "Video", "buildCssGradient", "getShapeUtil", "shapeUtils", "useFileSystem", "__toCommonJS", "import_caveat_brush", "import_crimson_pro", "import_dm_sans", "import_recursive", "import_source_code_pro", "import_source_sans_pro", "React", "import_react_error_boundary", "import_react_intl", "import_telva_core", "import_react_icons", "React", "import_react_intl", "import_jsx_runtime", "import_jsx_runtime", "CircleIcon", "props", "_a", "size", "rest", "__objRest", "__spreadProps", "__spreadValues", "import_jsx_runtime", "DashDashedIcon", "import_jsx_runtime", "dottedDasharray", "DashDottedIcon", "import_jsx_runtime", "DashDrawIcon", "import_jsx_runtime", "DashSolidIcon", "import_jsx_runtime", "import_jsx_runtime", "UndoIcon", "_a", "_b", "flipHorizontal", "props", "__objRest", "__spreadProps", "__spreadValues", "import_jsx_runtime", "SizeSmallIcon", "props", "__spreadProps", "__spreadValues", "import_jsx_runtime", "SizeMediumIcon", "props", "__spreadProps", "__spreadValues", "import_jsx_runtime", "SizeLargeIcon", "props", "__spreadProps", "__spreadValues", "import_jsx_runtime", "EraserIcon", "import_jsx_runtime", "import_jsx_runtime", "LineIcon", "DropdownMenu", "import_react_icons", "React", "import_react_intl", "import_react", "styled", "createTheme", "__spreadValues", "value", "dark", "Panel", "styled", "React", "RadixTooltip", "import_telva_core", "import_jsx_runtime", "commandKey", "Kbd", "variant", "children", "StyledKbd", "k", "i", "styled", "import_jsx_runtime", "Tooltip", "children", "label", "kbdProp", "id", "side", "StyledContent", "Kbd", "StyledArrow", "styled", "breakpoints", "React", "useFileSystem", "onNewProject", "app", "openDialog", "__async", "e", "onOpenProject", "onSaveProject", "onSaveProjectAs", "onOpenMedia", "_a", "React", "useFileSystemHandlers", "app", "useTelvaApp", "openDialog", "useDialog", "onNewProject", "e", "__async", "_a", "_b", "onSaveProject", "onSaveProjectAs", "onOpenProject", "onOpenMedia", "React", "import_react_hotkeys_hook", "TVEventHandler", "__publicField", "TVUserStatus", "SessionType", "TVStatus", "MoveType", "AlignType", "StretchType", "DistributeType", "FlipType", "TVShapeType", "Decoration", "ColorStyle", "SizeStyle", "DashStyle", "FontSize", "AlignStyle", "FontStyle", "buildCssGradient", "data", "stops", "s", "hex", "r", "g", "b", "i", "TVAssetType", "TVExportType", "TVExportBackground", "useKeyboardShortcuts", "ref", "app", "useTelvaApp", "canHandleEvent", "ignoreMenus", "elm", "handleCut", "e", "handleCopy", "handlePaste", "onNewProject", "onOpenProject", "onSaveProject", "onSaveProjectAs", "onOpenMedia", "useFileSystemHandlers", "React", "TelvaContext", "useForceUpdate", "_state", "setState", "useTelvaApp", "ContainerContext", "useContainer", "context", "React", "TRANSLATIONS", "ar_default", "da_default", "de_default", "en_default", "es_default", "fa_default", "fr_default", "gl_default", "he_default", "it_default", "ja_default", "ko_kr_default", "my_default", "nb_no_default", "ne_default", "nn_no_default", "pl_default", "pt_pt_default", "pt_br_default", "ru_default", "sv_default", "te_default", "tr_default", "uk_default", "zh_cn_default", "zh_tw_default", "th_default", "ku_default", "a", "b", "getTranslation", "locale", "_a", "translation", "__spreadValues", "main_default", "useTranslation", "locale", "getTranslation", "React", "AlertDialogContext", "useDialog", "context", "import_jsx_runtime", "ToolButton", "_a", "ref", "_b", "onSelect", "onClick", "onDoubleClick", "variant", "children", "isToolLocked", "disabled", "isActive", "onKeyDown", "id", "rest", "__objRest", "StyledToolButton", "__spreadProps", "__spreadValues", "breakpoints", "StyledToolButtonInner", "ToolLockIndicator", "ToolButtonWithTooltip", "label", "kbd", "isLocked", "app", "useTelvaApp", "handleDoubleClick", "handleKeyDown", "e", "Tooltip", "styled", "import_jsx_runtime", "shapeShapes", "shapeShapeIcons", "LineIcon", "dockPositionState", "s", "ShapesMenu", "activeTool", "isToolLocked", "app", "useTelvaApp", "intl", "dockPosition", "lastActiveTool", "setLastActiveTool", "selectShapeTool", "handleDoubleClick", "handleKeyDown", "e", "isActive", "contentSide", "panelStyle", "ToolButton", "Panel", "shape", "i", "Tooltip", "import_jsx_runtime", "activeToolSelector", "s", "toolLockedSelector", "canvasModeSelector", "CenterToolbar", "app", "useTelvaApp", "intl", "activeTool", "isToolLocked", "canvasMode", "selectSelectTool", "selectEraseTool", "selectDrawTool", "selectPenTool", "selectArrowTool", "selectTextTool", "selectStickyTool", "uploadMedias", "__async", "toggleCanvasMode", "handlePointerDown", "e", "StyledToolbarWrap", "StyledToolbarPill", "ToolBtn", "StyledDivider", "EraserIcon", "ShapesMenuWrap", "ShapesMenu", "styled", "RadixContextMenu", "import_react_icons", "React", "import_react_intl", "Divider", "styled", "MenuContent", "styled", "import_react_dropdown_menu", "import_react_icons", "React", "SmallIcon", "styled", "import_jsx_runtime", "RowButton", "_a", "ref", "_b", "onClick", "isActive", "isWarning", "hasIndicator", "hasArrow", "disabled", "variant", "kbd", "children", "rest", "__objRest", "StyledRowButton", "__spreadProps", "__spreadValues", "breakpoints", "StyledRowButtonInner", "Kbd", "SmallIcon", "styled", "import_jsx_runtime", "numberOfSelectedIdsSelector", "s", "isDebugModeSelector", "hasGroupSelectedSelector", "id", "preventDefault", "e", "_ContextMenu", "onBlur", "children", "container", "useContainer", "MenuContent", "InnerMenu", "app", "useTelvaApp", "intl", "numberOfSelectedIds", "isDebugMode", "hasGroupSelected", "handleFlipHorizontal", "handleFlipVertical", "handleDuplicate", "handleLock", "handleGroup", "handleMoveToBack", "handleMoveBackward", "handleMoveForward", "handleMoveToFront", "handleDelete", "handleCut", "handleCopy", "handlePaste", "handleCopySVG", "handleCopyPNG", "handleUndo", "handleRedo", "handleExportPNG", "__async", "handleExportJPG", "handleExportWEBP", "handleExportSVG", "handleCopyJSON", "handleExportJSON", "handleConvertToImage", "hasSelection", "hasTwoOrMore", "hasThreeOrMore", "selectedShape", "isReactComponent", "CMRowButton", "Divider", "ContextMenuSubMenu", "MoveToPageMenu", "AlignDistributeSubMenu", "alignTop", "alignCenterVertical", "alignBottom", "stretchVertically", "distributeVertically", "alignLeft", "alignCenterHorizontal", "alignRight", "stretchHorizontally", "distributeHorizontally", "CMSubTriggerButton", "StyledGridContent", "CMIconButton", "CMArrow", "styled", "currentPageIdSelector", "documentPagesSelector", "currentPageId", "documentPages", "sorted", "a", "b", "name", "i", "label", "size", "_a", "_b", "onSelect", "rest", "__objRest", "ToolButton", "__spreadValues", "RowButton", "ContextMenu", "import_jsx_runtime", "ErrorFallback", "error", "resetErrorBoundary", "app", "useTelvaApp", "refreshPage", "copyError", "textarea", "downloadBackup", "resetDocument", "Container", "InnerContainer", "Buttons", "RowButton", "Divider", "styled", "import_react_icons", "React", "React", "import_telva_core", "React", "ReactRegistryContext", "useReactRegistry", "import_jsx_runtime", "ComponentsTab", "app", "useTelvaApp", "registry", "useReactRegistry", "importing", "setImporting", "handleImport", "entry", "w", "h", "pagePoint", "shapeId", "err", "StyledComponentsList", "StyledEmpty", "StyledComponentCard", "StyledPreview", "StyledCardInfo", "StyledCardName", "StyledCardDesc", "StyledCardPath", "StyledImportBtn", "StyledHelpText", "styled", "import_jsx_runtime", "shapesSelector", "s", "page", "a", "b", "selectedIdsSelector", "shapeIcons", "LayersPanel", "activeTab", "setActiveTab", "StyledPanel", "e", "StyledTabBar", "StyledTab", "LayersList", "ComponentsTab", "app", "useTelvaApp", "allShapes", "selectedIds", "dragOverInfo", "setDragOverInfo", "draggingId", "topLevelShapes", "handleReorder", "fromId", "targetId", "position", "sorted", "fromIdx", "reordered", "newToIdx", "insertAt", "total", "updates", "i", "StyledList", "StyledEmpty", "shape", "LayerItem", "id", "pos", "depth", "onLayerDragStart", "onLayerDragOver", "onLayerDrop", "onLayerDragEnd", "isSelected", "children", "hasChildren", "expanded", "setExpanded", "handleSelect", "handleToggleVisibility", "handleToggleLock", "icon", "name", "childShapes", "dropStyle", "StyledLayerItem", "__spreadValues", "rect", "StyledChevron", "StyledChevronPlaceholder", "StyledIcon", "StyledName", "StyledActions", "StyledActionBtn", "StyledChildrenWrap", "child", "styled", "React", "import_jsx_runtime", "LeftPanel", "StyledLeftPanel", "LayersPanel", "styled", "import_react_intl", "import_jsx_runtime", "loadingSelector", "s", "Loading", "isLoading", "useTelvaApp", "StyledLoadingPanelContainer", "styled", "AlertDialogPrimitive", "import_react_intl", "import_jsx_runtime", "Content", "children", "onClose", "container", "StyledOverlay", "StyledContent", "event", "StyledDescription", "styled", "AlertDialogRoot", "AlertDialogContent", "AlertDialogDescription", "AlertDialogAction", "AlertDialogCancel", "AlertDialog", "setDialogState", "dialogState", "onCancel", "onNo", "onYes", "useDialog", "intl", "descriptions", "Button", "StyledDialogOverlay", "Dialog", "import_react_icons", "React", "import_react_intl", "React", "import_jsx_runtime", "TextField", "_a", "ref", "_b", "icon", "rest", "__objRest", "StyledInputWrapper", "StyledInput", "__spreadProps", "__spreadValues", "StyledInputIcon", "styled", "SmallIcon", "import_jsx_runtime", "FilenameDialog", "isOpen", "onClose", "app", "useTelvaApp", "container", "useContainer", "intl", "filename", "setFilename", "format", "setFormat", "handleChange", "event", "value", "stopPropagation", "e", "handleTextFieldKeyDown", "name", "StyledDialogOverlay", "StyledDialogContent", "Input", "FormatRow", "FormatLabel", "FormatBtn", "ActionWrapper", "Button", "styled", "TextField", "React", "React", "import_telva_core", "import_telva_core", "getBoundsRectangle", "shape", "boundsCache", "bounds", "width", "height", "ALIGN_VALUES", "getTextAlign", "alignStyle", "LETTER_SPACING", "LABEL_POINT", "PI2", "FILE_EXTENSION", "EASINGS", "t", "USER_COLORS", "isSafari", "isLinux", "IMAGE_EXTENSIONS", "VIDEO_EXTENSIONS", "melm", "getMeasurementDiv", "_a", "pre", "LETTER_SPACING", "prevText", "clearPrevSize", "prevText", "getTextLabelSize", "text", "font", "maxWidth", "melm", "width", "height", "wordSeparator", "c", "getTextSvgElement", "text", "fontSize", "fontFamily", "textAlign", "width", "wrap", "fontWeight", "letterSpacingPct", "LETTER_SPACING", "lines", "breakText", "textElm", "textLines", "line", "i", "tspan", "opts", "words", "word", "prevHeight", "currentLine", "newHeight", "import_jsx_runtime", "LabelMask", "id", "bounds", "labelSize", "offset", "scale", "import_telva_intersect", "import_telva_vec", "PI2", "_PolygonUtils", "edge", "delta", "len", "polygon", "index", "v0", "v1", "v2", "vertices", "vert", "i", "A1", "A2", "B1", "B2", "den", "ua", "ub", "center", "radius", "startVertex", "endVertex", "isPaddingBoundary", "startAngle", "endAngle", "arcSegmentCount", "angle", "angle5", "offset", "edges", "offsetEdges", "thisEdge", "prevEdge", "vertex", "shapePadding", "PolygonUtils", "__publicField", "getOffsetPolygon", "points", "point", "A", "B", "offsetVector", "intersection", "import_telva_core", "canvasLight", "canvasDark", "colors", "stickyFills", "__spreadProps", "__spreadValues", "k", "v", "strokes", "fills", "strokeWidths", "fontSizes", "fontFaces", "fontSizeModifiers", "stickyFontSizes", "getStrokeWidth", "size", "getFontSize", "fontStyle", "getFontFace", "font", "fontFamily", "getStickyFontSize", "getFontStyle", "style", "fontSize", "fontFace", "scale", "getStickyFontStyle", "getStickyShapeStyle", "isDarkMode", "_a", "_b", "color", "theme", "adjustedColor", "getShapeStyle", "_c", "_d", "isFilled", "strokeWidth", "defaultStyle", "defaultTextStyle", "INDENT", "TextAreaUtils", "field", "text", "document", "initialFocus", "selectionStart", "selectionEnd", "wrap", "wrapEnd", "selection", "searchValue", "replacer", "drift", "args", "matchStart", "matchLength", "replacement", "value", "currentEnd", "lastLineStart", "element", "_a", "selectedContrast", "lineBreakCount", "firstLineStart", "newSelection", "indentedText", "replacementsCount", "minimumSelectionEnd", "firstLineIndentation", "difference", "newSelectionStart", "React", "stopPropagation", "e", "import_telva_core", "import_telva_intersect", "import_telva_vec", "deepCopy", "target", "cp", "arrayMember", "targetKeys", "key", "React", "import_telva_core", "import_telva_intersect", "import_telva_vec", "React", "import_telva_core", "import_telva_intersect", "import_telva_vec", "TVShapeUtil", "__publicField", "shape", "point", "A", "B", "box", "bounds", "props", "fromShape", "origin", "direction", "bindAnywhere", "expandedBounds", "intersections", "int", "center", "intersection", "a", "b", "middlePoint", "anchor", "distance", "side", "bindingPoint", "info", "__spreadProps", "__spreadValues", "isDarkMode", "_a", "_b", "_c", "_d", "_e", "elm", "s", "g", "font", "getFontStyle", "fontSize", "getFontSize", "fontFamily", "getFontFace", "wrapWidth", "labelSize", "getTextLabelSize", "labelElm", "getTextSvgElement", "getShapeStyle", "import_perfect_freehand", "import_telva_core", "import_telva_intersect", "import_telva_vec", "getArrowArcPath", "start", "end", "circle", "bend", "getBendPoint", "handles", "dist", "Vec", "midPoint", "bendDist", "u", "renderFreehandArrowShaft", "id", "style", "decorationStart", "decorationEnd", "getRandom", "strokeWidth", "getShapeStyle", "startPoint", "endPoint", "stroke", "getStroke", "EASINGS", "renderCurvedFreehandArrowShaft", "center", "radius", "length", "easing", "startAngle", "endAngle", "points", "count", "i", "t", "angle", "getCtp", "getCurvedArrowHeadPoints", "A", "r1", "C", "r2", "sweep", "ints", "TVDR", "int", "left", "right", "getStraightArrowHeadPoints", "B", "r", "getCurvedArrowHeadPath", "getStraightArrowHeadPath", "getArrowPath", "arrowDist", "arrowHeadLength", "path", "getArcLength", "getArcPoints", "isAngleBetween", "a", "b", "c", "PI2", "AB", "AC", "React", "import_telva_core", "import_telva_vec", "import_jsx_runtime", "Arrowhead", "left", "middle", "right", "stroke", "strokeWidth", "import_jsx_runtime", "CurvedArrow", "id", "style", "start", "bend", "end", "arrowBend", "decorationStart", "decorationEnd", "isDraw", "isDarkMode", "arrowDist", "Vec", "styles", "getShapeStyle", "strokeWidth", "sw", "circle", "getCtp", "center", "radius", "length", "getArcLength", "getRandom", "easing", "EASINGS", "path", "renderCurvedFreehandArrowShaft", "getArrowArcPath", "strokeDasharray", "strokeDashoffset", "arrowHeadLength", "startArrowHead", "getCurvedArrowHeadPoints", "endArrowHead", "Arrowhead", "React", "import_telva_core", "import_telva_vec", "import_jsx_runtime", "StraightArrow", "id", "style", "start", "end", "decorationStart", "decorationEnd", "isDraw", "isDarkMode", "arrowDist", "Vec", "styles", "getShapeStyle", "strokeWidth", "sw", "path", "renderFreehandArrowShaft", "strokeDasharray", "strokeDashoffset", "arrowHeadLength", "startArrowHead", "getStraightArrowHeadPoints", "endArrowHead", "Arrowhead", "import_jsx_runtime", "ArrowUtil", "TVShapeUtil", "__publicField", "props", "_a", "_b", "_c", "_d", "__spreadValues", "__spreadProps", "defaultStyle", "shape", "isEditing", "isGhost", "meta", "events", "onShapeChange", "onShapeBlur", "ref", "id", "label", "start", "bend", "end", "decorations", "style", "hasLabel", "isStraightLine", "font", "getFontStyle", "styles", "getShapeStyle", "labelSize", "getTextLabelSize", "bounds", "dist", "circle", "getCtp", "center", "radius", "length", "getArcLength", "scale", "offset", "handleLabelChange", "Component", "StraightArrow", "CurvedArrow", "FullWrapper", "TextLabel", "LabelMask", "getArrowPath", "getArcPoints", "points", "minX", "minY", "maxX", "maxY", "pt", "prev", "next", "point", "i", "A", "B", "ptA", "ptB", "sp", "ep", "cx", "cy", "r", "cp", "initialShape", "scaleX", "scaleY", "initialShapeBounds", "handles", "nextHandles", "handle", "x", "y", "nw", "nh", "nextBend", "bendPoint", "getBendPoint", "distance", "midPoint", "angle", "u", "ap", "bp", "realBend", "angleToBend", "isAngleBetween", "nextShape", "topLeft", "nextBounds", "isDarkMode", "_e", "elm", "s", "g", "fontSize", "getFontSize", "fontFamily", "getFontFace", "labelElm", "getTextSvgElement", "styled", "React", "import_telva_core", "import_telva_intersect", "import_telva_vec", "import_jsx_runtime", "useGradientFill", "id", "style", "_a", "_b", "_c", "g", "gradId", "stops", "s", "i", "rad", "cos", "sin", "x1", "y1", "x2", "y2", "cx", "cy", "import_perfect_freehand", "import_telva_core", "import_telva_vec", "simulatePressureSettings", "t", "realPressureSettings", "getFreehandOptions", "shape", "styles", "getShapeStyle", "__spreadProps", "__spreadValues", "getFillPath", "pt", "getDrawStrokePoints", "options", "getDrawStrokePathTDSnapshot", "strokePoints", "getSolidStrokePathTDSnapshot", "points", "last", "Vec", "getStraightStrokePath", "simplified", "simplifyPoints", "path", "i", "getStraightFillPath", "tolerance", "maxDist", "maxIndex", "first", "dist", "perpendicularDistance", "left", "right", "point", "lineStart", "lineEnd", "dx", "dy", "mag", "u", "closest", "import_jsx_runtime", "DrawUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "meta", "isSelected", "isGhost", "events", "ref", "_a", "points", "style", "isComplete", "isStraight", "isNodeEditing", "app", "useTelvaApp", "dragRef", "hoveredNode", "setHoveredNode", "screenToLocal", "clientX", "clientY", "commitNodeMove", "newPts", "minX", "p", "minY", "normalized", "x", "y", "pr", "newShapePoint", "polygonPathTDSnapshot", "getStraightFillPath", "getFillPath", "pathTDSnapshot", "getStraightStrokePath", "getDrawStrokePathTDSnapshot", "getSolidStrokePathTDSnapshot", "styles", "getShapeStyle", "stroke", "fill", "strokeWidth", "shapeOpacity", "defs", "gradFill", "useGradientFill", "activeFill", "zoom", "nodeOverlay", "r", "rmid", "nodeHandles", "pt", "i", "e", "local", "np", "midHandles", "next", "mx", "my", "newPt", "bounds", "sw", "__spreadProps", "__spreadValues", "shouldFill", "svgOverflowStyle", "strokeDasharray", "strokeDashoffset", "initialShape", "scaleX", "scaleY", "initialShapeBounds", "newBounds", "point", "pointsHaveChanged", "pointHasChanged", "prev", "ptA", "A", "B", "ptB", "shapeBounds", "rBounds", "rotatedBounds", "c", "React", "import_telva_core", "import_telva_intersect", "import_telva_vec", "React", "import_telva_core", "import_jsx_runtime", "DashedEllipse", "id", "radius", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "sw", "rx", "ry", "perimeter", "strokeDasharray", "strokeDashoffset", "React", "import_perfect_freehand", "import_telva_core", "getEllipseStrokePoints", "id", "radius", "style", "strokeWidth", "getShapeStyle", "getRandom", "rx", "ry", "perimeter", "points", "start", "extra", "count", "i", "t", "EASINGS", "rads", "c", "s", "getEllipsePath", "getEllipseIndicatorPath", "import_jsx_runtime", "DrawEllipse", "id", "radius", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "innerPath", "getEllipsePath", "getEllipseIndicatorPath", "import_jsx_runtime", "EllipseUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "isGhost", "isSelected", "isBinding", "isEditing", "meta", "bounds", "events", "onShapeChange", "onShapeBlur", "ref", "_a", "id", "radius", "style", "label", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "strokeWidth", "sw", "rx", "ry", "Component", "DrawEllipse", "DashedEllipse", "handleLabelChange", "FullWrapper", "__spreadProps", "__spreadValues", "TextLabel", "getEllipseIndicatorPath", "point", "A", "B", "shapeBounds", "prev", "next", "fromShape", "origin", "direction", "bindAnywhere", "expandedBounds", "center", "bindingPoint", "distance", "intersection", "a", "b", "anchor", "innerIntersection", "scaleX", "scaleY", "initialShape", "rotation", "styled", "import_telva_core", "import_jsx_runtime", "GroupUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "isBinding", "isGhost", "isHovered", "isSelected", "events", "ref", "id", "size", "sw", "w", "h", "paths", "start", "end", "i", "__spreadProps", "__spreadValues", "ScaledLines", "getBoundsRectangle", "prev", "next", "styled", "import_react", "React", "import_telva_core", "import_jsx_runtime", "ImageUtil", "TVShapeUtil", "__publicField", "props", "__spreadProps", "__spreadValues", "defaultStyle", "shape", "asset", "isBinding", "isGhost", "meta", "events", "onShapeChange", "ref", "size", "style", "bindingDistance", "rImage", "rWrapper", "wrapper", "width", "height", "Wrapper", "ImageElement", "getBoundsRectangle", "prev", "next", "transformRectangle", "transformSingleRectangle", "bounds", "elm", "React", "import_telva_core", "import_telva_vec", "import_telva_core", "segmentsToPath", "segments", "isClosed", "_a", "_b", "_c", "_d", "point", "d", "i", "prev", "curr", "c1", "c2", "getSegmentsBounds", "pts", "s", "normalizeSegments", "bounds", "offset", "mirrorHandle", "anchor", "handle", "import_jsx_runtime", "PenUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "meta", "isSelected", "isGhost", "events", "ref", "_a", "_b", "_c", "segments", "style", "isClosed", "isComplete", "previewPoint", "isPlacingHandle", "isNodeEditing", "app", "useTelvaApp", "dragRef", "hoveredTarget", "setHoveredTarget", "screenToLocal", "clientX", "clientY", "patchSegments", "newSegs", "commitSegments", "styles", "getShapeStyle", "stroke", "fill", "strokeWidth", "shapeOpacity", "defs", "gradFill", "useGradientFill", "activeFill", "pathData", "segmentsToPath", "zoom", "sw", "strokeDasharray", "strokeDashoffset", "nodeOverlay", "nodeR", "handleR", "lineW", "nodeEls", "handleEls", "lineEls", "seg", "i", "px", "py", "hx", "hy", "hKey", "e", "local", "ns", "__spreadProps", "__spreadValues", "mirrorHandle", "nKey", "prev", "delta", "next", "mx", "my", "newSeg", "svgOverflowStyle", "last", "previewD", "ax", "ay", "c2x", "c2y", "first", "dist", "snapLocalDist", "pointsHaveChanged", "pointHasChanged", "bounds", "getSegmentsBounds", "safeBounds", "initialShape", "scaleX", "scaleY", "initialBounds", "iW", "iH", "scaleSegment", "newBounds", "point", "ptA", "A", "B", "shapeBounds", "React", "import_telva_core", "import_jsx_runtime", "ReactComponentUtil", "TVShapeUtil", "__publicField", "props", "__spreadProps", "__spreadValues", "defaultStyle", "shape", "isGhost", "events", "ref", "size", "componentId", "rWrapper", "wrapper", "LiveReactComponent", "width", "height", "getBoundsRectangle", "prev", "next", "transformRectangle", "transformSingleRectangle", "isDarkMode", "__async", "canvasEl", "dataUrl", "clone", "html2canvas", "elm", "err", "registry", "useReactRegistry", "entry", "r", "Comp", "React", "import_telva_core", "import_telva_vec", "import_jsx_runtime", "BindingIndicator", "strokeWidth", "size", "React", "import_telva_core", "import_jsx_runtime", "DashedRectangle", "id", "style", "size", "isSelected", "isDarkMode", "_a", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "sw", "w", "h", "r", "useRect", "strokeDasharray", "strokeDashoffset", "start", "end", "length", "i", "dash", "React", "import_perfect_freehand", "import_telva_core", "import_telva_vec", "getRectangleDrawPoints", "id", "style", "size", "styles", "getShapeStyle", "getRandom", "sw", "w", "h", "offsets", "tl", "Vec", "tr", "br", "bl", "rm", "rx", "ry", "px", "py", "lines", "getDrawStrokeInfo", "points", "strokeWidth", "getRectanglePath", "options", "stroke", "getStroke", "getRectangleIndicatorPathTDSnapshot", "import_jsx_runtime", "DrawRectangle", "id", "style", "size", "isSelected", "isDarkMode", "isFilled", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "pathTDSnapshot", "getRectanglePath", "innerPath", "getRectangleIndicatorPathTDSnapshot", "import_jsx_runtime", "RectangleUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "isEditing", "isBinding", "isSelected", "isGhost", "meta", "bounds", "events", "onShapeBlur", "onShapeChange", "ref", "_a", "_b", "id", "size", "style", "label", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "Component", "DrawRectangle", "DashedRectangle", "handleLabelChange", "isNodeEditing", "app", "useTelvaApp", "dragRef", "hoveredNode", "setHoveredNode", "zoom", "nodeOverlay", "w", "h", "corners", "opposites", "r", "lw", "c", "ci", "next", "cx", "cy", "e", "fixedLocal", "Vec", "pp", "fp", "x0", "y0", "x1", "y1", "mx", "my", "svgOverflow", "FullWrapper", "__spreadProps", "__spreadValues", "TextLabel", "BindingIndicator", "getRectangleIndicatorPathTDSnapshot", "getBoundsRectangle", "prev", "transformRectangle", "transformSingleRectangle", "styled", "React", "import_telva_core", "import_telva_vec", "import_jsx_runtime", "StickyUtil", "TVShapeUtil", "__publicField", "props", "defaultTextStyle", "shape", "meta", "events", "isGhost", "isBinding", "isEditing", "onShapeBlur", "onShapeChange", "ref", "font", "getStickyFontStyle", "color", "fill", "stroke", "getStickyShapeStyle", "rContainer", "rTextArea", "rText", "rIsMounted", "handlePointerDown", "e", "onChange", "text", "TVDR", "handleTextChange", "handleKeyDown", "TextAreaUtils", "__spreadProps", "__spreadValues", "handleBlur", "handleFocus", "elm", "size", "currTextHeight", "minTextHeight", "MIN_CONTAINER_HEIGHT", "PADDING", "prevTextHeight", "textarea", "textGradient", "style", "buildCssGradient", "StyledStickyContainer", "StyledText", "StyledTextArea", "stopPropagation", "width", "height", "getBoundsRectangle", "prev", "next", "bounds", "scaleX", "scaleY", "transformOrigin", "isDarkMode", "_a", "_b", "fontSize", "getStickyFontSize", "fontFamily", "getFontFace", "textAlign", "textElm", "getTextSvgElement", "g", "rect", "styled", "commonTextWrapping", "LETTER_SPACING", "React", "import_telva_core", "import_telva_vec", "import_jsx_runtime", "TextUtil", "TVShapeUtil", "__publicField", "props", "defaultTextStyle", "shape", "isBinding", "isGhost", "isEditing", "onShapeBlur", "onShapeChange", "meta", "events", "ref", "text", "style", "styles", "getShapeStyle", "font", "getFontStyle", "rInput", "rIsMounted", "rEditedText", "delta", "currentBounds", "nextBounds", "__spreadProps", "__spreadValues", "handleChange", "e", "newText", "TVDR", "handleKeyDown", "TextAreaUtils", "handleBlur", "handleFocus", "handlePointerDown", "rWasEditing", "elm", "Wrapper", "InnerWrapper", "getTextAlign", "buildCssGradient", "TextArea", "stopPropagation", "width", "height", "bounds", "_a", "melm", "prev", "next", "initialShape", "scaleX", "scaleY", "rotation", "scale", "nextScale", "center", "newCenter", "isDarkMode", "_b", "fontSize", "getFontSize", "fontFamily", "getFontFace", "textAlign", "textElm", "getTextSvgElement", "getMeasurementDiv", "pre", "LETTER_SPACING", "styled", "commonTextWrapping", "React", "import_telva_core", "import_telva_intersect", "import_telva_vec", "React", "import_telva_core", "import_telva_vec", "import_perfect_freehand", "import_telva_core", "import_telva_vec", "getTrianglePoints", "size", "offset", "rotation", "w", "h", "points", "getOffsetPolygon", "pt", "Vec", "getTriangleCentroid", "getTriangleDrawPoints", "id", "strokeWidth", "getRandom", "offsets", "corners", "rm", "lines", "getDrawStrokeInfo", "style", "getShapeStyle", "getTrianglePath", "options", "stroke", "getStroke", "getTriangleIndicatorPathTDSnapshot", "import_jsx_runtime", "DashedTriangle", "id", "size", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "sw", "points", "getTrianglePoints", "paths", "start", "end", "i", "strokeDasharray", "strokeDashoffset", "Vec", "bgPath", "React", "import_jsx_runtime", "DrawTriangle", "id", "size", "style", "isSelected", "isDarkMode", "stroke", "strokeWidth", "fill", "getShapeStyle", "defs", "gradFill", "useGradientFill", "activeFill", "pathTDSnapshot", "getTrianglePath", "indicatorPath", "getTriangleIndicatorPathTDSnapshot", "import_jsx_runtime", "TriangleBindingIndicator", "size", "trianglePoints", "getTrianglePoints", "import_jsx_runtime", "TriangleUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "bounds", "isBinding", "isEditing", "isSelected", "isGhost", "meta", "events", "onShapeChange", "onShapeBlur", "ref", "_a", "_b", "id", "label", "size", "style", "labelPoint", "LABEL_POINT", "font", "getFontStyle", "styles", "getShapeStyle", "Component", "DrawTriangle", "DashedTriangle", "handleLabelChange", "offsetY", "center", "Vec", "getTriangleCentroid", "isNodeEditing", "app", "useTelvaApp", "dragRef", "hoveredNode", "setHoveredNode", "zoom", "nodeOverlay", "w", "h", "corners", "opposites", "r", "lw", "verts", "getTrianglePoints", "v", "vi", "next", "cx", "cy", "ci", "e", "fixedLocal", "pp", "fp", "x0", "y0", "x1", "y1", "svgOverflow", "FullWrapper", "__spreadProps", "__spreadValues", "TextLabel", "TriangleBindingIndicator", "prev", "getBoundsRectangle", "pt", "A", "B", "fromShape", "point", "origin", "direction", "bindAnywhere", "expandedBounds", "points", "expandedPoints", "closestDistanceToEdge", "a", "b", "intersections", "segment", "intersection", "middlePoint", "anchor", "distance", "bindingPoint", "transformRectangle", "transformSingleRectangle", "rotation", "x", "y", "styled", "import_react", "React", "import_telva_core", "import_jsx_runtime", "VideoUtil", "TVShapeUtil", "__publicField", "props", "defaultStyle", "shape", "asset", "isBinding", "isEditing", "isGhost", "meta", "events", "onShapeChange", "ref", "rVideo", "rWrapper", "currentTime", "size", "isPlaying", "style", "wrapper", "width", "height", "video", "handlePlay", "handlePause", "handleSetCurrentTime", "__spreadProps", "__spreadValues", "Wrapper", "VideoElement", "getBoundsRectangle", "prev", "next", "bounds", "elm", "transformRectangle", "transformSingleRectangle", "Rectangle", "RectangleUtil", "Triangle", "TriangleUtil", "Ellipse", "EllipseUtil", "Draw", "DrawUtil", "Arrow", "ArrowUtil", "Text", "TextUtil", "Group", "GroupUtil", "Sticky", "StickyUtil", "Image", "ImageUtil", "Video", "VideoUtil", "ReactComponent", "ReactComponentUtil", "Pen", "PenUtil", "shapeUtils", "getShapeUtil", "shape", "isDev", "_TVDR", "shape", "getShapeUtil", "data", "pageId", "page", "id", "point", "camera", "zoom", "shapeId", "childId", "fn", "copies", "__spreadValues", "ids", "visited", "collectDescendants", "collectAscendants", "parentId", "binding", "direction", "includeArrows", "selectedIds", "linkedIds", "checkedIds", "idsToCheck", "arrows", "_a", "arrow", "_b", "startBindingId", "endBindingId", "startBinding", "endBinding", "hit", "siblings", "a", "b", "parent", "index", "nextSibling", "change", "k", "forceChildrenTraversal", "beforeShapes", "afterShapes", "i", "dataWithMutations", "shapes", "before", "results", "after", "shapeIds", "delta", "arrowShape", "_c", "_d", "_e", "_f", "result", "deepCopy", "start", "end", "hasDecoration", "handle", "target", "util", "bounds", "expandedBounds", "intersectBounds", "minX", "minY", "width", "height", "anchorPoint", "ID", "A", "B", "hits", "targetPoint", "points", "getTrianglePoints", "pt", "p0", "p1", "intersection", "int", "bHit", "shortArrowDirection", "shortArrowHits", "__spreadProps", "info", "center", "origin", "relativeCenter", "rotatedCenter", "nextPoint", "handleId", "nextRotation", "changedShapeIds", "parentToUpdateIds", "bindingsArr", "bindingsToUpdate", "prevSize", "fromId", "otherBinding", "text", "x", "prop", "e", "svg", "scale", "clone", "svgString", "_0", "__async", "type", "opts", "quality", "canvas", "resolve", "image", "dataUrl", "context", "imageWidth", "imageHeight", "blob", "TVDR", "__publicField", "string", "textarea", "range", "sel", "err", "acc", "import_jsx_runtime", "TextLabel", "font", "text", "color", "background", "textGradient", "offsetX", "offsetY", "scale", "isEditing", "width", "onBlur", "onChange", "rInput", "rIsMounted", "handleChange", "e", "TVDR", "handleKeyDown", "TextAreaUtils", "handleBlur", "handleFocus", "handlePointerDown", "rWasEditing", "elm", "rInnerWrapper", "size", "getTextLabelSize", "TextWrapper", "InnerWrapper", "__spreadValues", "buildCssGradient", "TextArea", "stopPropagation", "styled", "commonTextWrapping", "LETTER_SPACING", "__spreadProps", "import_telva_vec", "transformRectangle", "shape", "bounds", "initialShape", "transformOrigin", "scaleX", "scaleY", "size", "Vec", "point", "rotation", "import_telva_vec", "transformSingleRectangle", "shape", "bounds", "Vec", "React", "import_jsx_runtime", "hsvToRgb", "h", "s", "v", "r", "g", "b", "i", "f", "p", "q", "t", "rgbToHsv", "mx", "mn", "d", "hexToRgb", "hex", "m", "rgbToHex", "c", "HISTORY_KEY", "getColorHistory", "e", "pushColorHistory", "CHECKER", "ColorPicker", "color", "opacity", "onChange", "showTransparent", "showOpacity", "isTransparent", "rgb", "hexToRgb", "hsv", "setHsv", "rgbToHsv", "newRgb", "newHsv", "satCanvasRef", "hueCanvasRef", "canvas", "ctx", "w", "h", "r", "g", "b", "hsvToRgb", "gw", "gb", "i", "gb2", "emit", "s", "v", "a", "hex", "rgbToHex", "pushColorHistory", "onSatDown", "e", "rect", "update", "ev", "onMove", "onUp", "onHueDown", "opacityBarRef", "onOpacityDown", "currentHex", "currentRgb", "Wrapper", "SatPanel", "SatMarker", "BarWrap", "BarThumb", "OpacityBar", "InputRow", "HexInput", "r2", "RgbInput", "InputLabels", "SwatchRow", "Swatch", "CHECKER", "getColorHistory", "c", "ColorSwatchInput", "label", "open", "setOpen", "ref", "SwatchInputWrap", "SwatchInputRow", "SwatchLabel", "SwatchPreview", "SwatchHexText", "clean", "SwatchOpacityText", "SwatchPopover", "styled", "React", "import_jsx_runtime", "DraggableInput", "value", "onChange", "label", "min", "max", "step", "suffix", "style", "labelWidth", "editing", "setEditing", "editValue", "setEditValue", "inputRef", "dragRef", "clamp", "v", "onLabelPointerDown", "e", "el", "onMove", "ev", "dx", "speed", "delta", "onUp", "onValuePointerDown", "startX", "startVal", "dragged", "_a", "commitEdit", "n", "Wrap", "DragLabel", "StyledInput", "ValueDisplay", "Suffix", "styled", "React", "import_jsx_runtime", "buildCssGradient", "data", "stops", "a", "b", "s", "hex", "alpha", "DEFAULT_DATA", "PRESETS_KEY", "getPresets", "e", "savePreset", "presets", "removePreset", "idx", "LinearIcon", "RadialIcon", "ConicIcon", "DiamondIcon", "TYPE_ICONS", "GradientPicker", "value", "onChange", "setData", "selectedIdx", "setSelectedIdx", "showPresets", "setShowPresets", "barRef", "wrapperRef", "onKey", "removeStopAtIdx", "el", "update", "patch", "d", "next", "__spreadValues", "updateStop", "i", "__spreadProps", "addStop", "rect", "pos", "newStop", "_", "onThumbDown", "onMove", "ev", "onUp", "cssGrad", "selectedStop", "Wrapper", "TypeRow", "t", "TypeBtn", "TypeLabel", "PreviewBox", "BarSection", "BarLabel", "BarContainer", "GradientBar", "stop", "StopThumb", "BarHint", "StopPosRow", "StopPosLabel", "GeomInput", "GeomLabel", "ColorPicker", "c", "pushColorHistory", "GeomSection", "GeomSectionTitle", "GeomRow", "AngleDial", "cx", "cy", "ang", "DialLine", "ActionRow", "ActionBtn", "reversed", "PresetsSection", "PresetsTitle", "PresetsToggle", "PresetsGrid", "p", "PresetSwatch", "styled", "import_jsx_runtime", "hexToRgba", "hex", "opacity", "r", "g", "b", "hexToRgb", "parseCssColor", "css", "fallback", "m", "rgbToHex", "selectedDataSelector", "s", "page", "shapes", "id", "themeSelector", "PropertiesPanel", "app", "useTelvaApp", "selectedShapes", "theme", "Panel", "SectionWrap", "SectionTitle", "Hint", "shape", "multi", "isText", "isArrow", "isRect", "isNodeEditable", "HeaderSection", "Divider", "PositionSection", "AlignmentSection", "LayoutSection", "AppearanceSection", "FillSection", "CollapsibleRow", "StrokeSection", "GradientSection", "TextStyleSection", "EffectsSection", "ArrowSection", "TypographySection", "ExportSection", "count", "name", "icon", "i", "IconBtn", "point", "rotation", "update", "field", "value", "u", "AlignGrid", "fn", "t", "SmallBtn", "FieldGrid", "DraggableInput", "v", "size", "locked", "setLocked", "handleSize", "dim", "newH", "newW", "LayoutGrid", "_a", "_b", "opacityPct", "borderRadius", "FieldRow", "FieldLabel", "BtnGroup", "val", "label", "style", "fillHex", "fills", "commit", "ColorSwatchInput", "strokeHex", "strokes", "strokeWidth", "enabled", "setEnabled", "gradientData", "handleToggle", "defaultGrad", "Toggle", "ToggleThumb", "GradientPicker", "data", "_css", "defaultColor", "labelColorHex", "labelColorOp", "labelBgHex", "labelBgOp", "textGradient", "textGradEnabled", "setTextGradEnabled", "handleTextGradToggle", "normalizeEffects", "raw", "arr", "defaults", "k", "EFFECT_NAMES", "effects", "updateEffects", "newEffects", "updateEffect", "patch", "e", "__spreadValues", "removeEffect", "addEffect", "type", "newEff", "eff", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "arrow", "hasStartDec", "hasEndDec", "__spreadProps", "fontSearch", "setFontSearch", "showDrop", "setShowDrop", "filtered", "setFiltered", "ref", "mod", "selectFont", "font", "fontEnum", "h", "curFont", "displayFont", "scalePct", "Input", "Dropdown", "f", "DropItem", "svg", "SmallText", "_downloadBlob", "blob", "filename", "url", "a", "ExportSection", "shape", "app", "loading", "setLoading", "slug", "SmallBtn", "__async", "blob", "_downloadBlob", "e", "json", "_e", "CollapsibleRow", "title", "children", "defaultOpen", "open", "setOpen", "SectionWrap", "SectionTitle", "IconBtn", "Panel", "styled", "Divider", "Hint", "FieldGrid", "FieldRow", "FieldLabel", "_Unit", "Input", "SmallText", "AlignGrid", "BtnGroup", "Toggle", "ToggleThumb", "LayoutGrid", "LockBtn", "Dropdown", "DropItem", "import_jsx_runtime", "RightPanel", "StyledRightPanel", "PropertiesPanel", "styled", "init_googleFonts", "React", "import_react_intl", "DropdownMenu", "import_react_icons", "React", "import_react_intl", "import_react_dropdown_menu", "import_jsx_runtime", "DMItem", "_a", "_b", "onSelect", "id", "rest", "__objRest", "RowButton", "__spreadValues", "import_react_dropdown_menu", "preventEvent", "e", "import_jsx_runtime", "DMCheckboxItem", "checked", "disabled", "variant", "onCheckedChange", "kbd", "id", "ariaLabel", "children", "preventEvent", "RowButton", "DropdownMenu", "import_jsx_runtime", "DMContent", "sideOffset", "alignOffset", "children", "align", "variant", "id", "overflow", "side", "container", "useContainer", "stopPropagation", "StyledContent", "styled", "MenuContent", "import_react_dropdown_menu", "DMDivider", "styled", "import_react_dropdown_menu", "DMRadioItem", "styled", "import_react_dropdown_menu", "import_jsx_runtime", "DMSubMenu", "children", "size", "overflow", "disabled", "label", "id", "RowButton", "MenuContent", "import_react_dropdown_menu", "import_jsx_runtime", "DMTriggerIcon", "_a", "_b", "id", "children", "rest", "__objRest", "ToolButton", "__spreadProps", "__spreadValues", "React", "import_react_intl", "import_jsx_runtime", "settingsSelector", "s", "DockPosition", "PreferencesMenu", "app", "useTelvaApp", "intl", "settings", "toggleDebugMode", "v", "toggleDarkMode", "toggleFocusMode", "toggleGrid", "toggleKeepStyleMenuOpen", "toggleCadSelectMode", "handleChangeDockPosition", "position", "selectExportBackground", "background", "DMSubMenu", "DMCheckboxItem", "Divider", "StyledText", "TVExportBackground", "exportBackground", "styled", "import_jsx_runtime", "numberOfSelectedIdsSelector", "s", "disableAssetsSelector", "Menu", "readOnly", "app", "useTelvaApp", "intl", "openDialog", "setOpenDialog", "numberOfSelectedIds", "disableAssets", "_", "setForce", "onNewProject", "onOpenProject", "onSaveProject", "onSaveProjectAs", "useFileSystemHandlers", "handleSaveProjectAs", "handleDelete", "handleCopySVG", "handleCopyPNG", "handleExportPNG", "__async", "handleExportJPG", "handleExportWEBP", "handleExportSVG", "handleCopyJSON", "handleExportJSON", "handleCut", "handleCopy", "handlePaste", "handleSelectAll", "handleSelectNone", "handleUploadMedia", "handleZoomTo100", "showFileMenu", "hasSelection", "DMTriggerIcon", "DMContent", "DMSubMenu", "DMItem", "Divider", "preventEvent", "PreferencesMenu", "FilenameDialog", "DropdownMenu", "import_react_icons", "React", "import_react_intl", "import_telva_core", "import_jsx_runtime", "MultiplayerIcon2", "import_jsx_runtime", "roomSelector", "state", "MultiplayerMenu", "app", "useTelvaApp", "room", "copied", "setCopied", "rTimeout", "handleCopySelect", "TVDR", "handleCopyReadOnlySelect", "segs", "handleCreateMultiplayerProject", "__async", "handleCopyToMultiplayerProject", "_a", "nextDocument", "id", "asset", "file", "dataURLtoFile", "newSrc", "result", "d", "e", "DMTriggerIcon", "MultiplayerIcon2", "DMContent", "DMItem", "SmallIcon", "Divider", "dataurl", "filename", "_b", "arr", "mime", "bstr", "n", "u8arr", "DropdownMenu", "import_react_icons", "React", "import_react_intl", "Dialog", "import_react_icons", "React", "import_react_intl", "IconButton", "styled", "import_jsx_runtime", "canDeleteSelector", "s", "PageOptionsDialog", "page", "onOpen", "onClose", "app", "useTelvaApp", "intl", "isOpen", "setIsOpen", "pageName", "setPageName", "canDelete", "rInput", "handleClose", "handleDuplicate", "handleDelete", "handleOpenChange", "stopPropagation", "e", "rInitialName", "rCurrentName", "handleTextFieldChange", "event", "value", "handleTextFieldKeyDown", "elm", "rWasOpen", "container", "useContainer", "IconButton", "breakpoints", "SmallIcon", "StyledDialogOverlay", "StyledDialogContent", "TextField", "Divider", "DialogAction", "RowButton", "styled", "_a", "_b", "onSelect", "rest", "__objRest", "__spreadValues", "import_jsx_runtime", "sortedSelector", "s", "a", "b", "currentPageNameSelector", "currentPageIdSelector", "PageMenu", "app", "useTelvaApp", "intl", "rIsOpen", "isOpen", "setIsOpen", "handleClose", "handleOpenChange", "currentPageName", "ToolButton", "DMContent", "PageMenuContent", "onClose", "sortedPages", "currentPageId", "defaultPageName", "handleCreatePage", "pageName", "handleChangePage", "id", "dragId", "setDragId", "dropIndex", "setDropIndex", "handleDragStart", "ev", "p", "handleDrag", "rect", "handleDrop", "page", "i", "ButtonWithOptions", "PageButton", "SmallIcon", "PageOptionsDialog", "Divider", "RowButton", "styled", "DropdownMenu", "import_react_icons", "React", "import_react_intl", "import_jsx_runtime", "currentStyleSelector", "s", "selectedIdsSelector", "STYLE_KEYS", "defaultTextStyle", "DASH_ICONS", "DashDrawIcon", "DashSolidIcon", "DashDashedIcon", "DashDottedIcon", "SIZE_ICONS", "SizeSmallIcon", "SizeMediumIcon", "SizeLargeIcon", "ALIGN_ICONS", "themeSelector", "keepOpenSelector", "optionsSelector", "activeTool", "pageId", "page", "hasText", "hasLabel", "id", "StyleMenu", "app", "useTelvaApp", "intl", "theme", "keepOpen", "options", "currentStyle", "selectedIds", "displayedStyle", "setDisplayedStyle", "rDisplayedStyle", "commonStyle", "overrides", "shape", "key", "handleToggleKeepOpen", "checked", "handleToggleFilled", "handleDashChange", "value", "handleSizeChange", "handleFontChange", "handleTextAlignChange", "handleMenuOpenChange", "open", "ToolButton", "OverlapIcons", "strokes", "CircleIcon", "fills", "DMContent", "StyledRow", "ColorGrid", "style", "preventEvent", "DMCheckboxItem", "StyledGroup", "DashStyle", "DMRadioItem", "breakpoints", "SizeStyle", "sizeStyle", "Divider", "FontStyle", "fontStyle", "FontIcon", "AlignStyle", "styled", "DropdownMenu", "import_react_intl", "import_jsx_runtime", "zoomSelector", "s", "ZoomMenu", "app", "useTelvaApp", "zoom", "FixedWidthToolButton", "DMContent", "DMItem", "preventEvent", "styled", "ToolButton", "import_jsx_runtime", "_TopPanel", "readOnly", "showPages", "showMenu", "showStyles", "showZoom", "showMultiplayerMenu", "app", "useTelvaApp", "intl", "StyledTopPanel", "Panel", "Menu", "MultiplayerMenu", "PageMenu", "StyledSpacer", "ReadOnlyLabel", "ToolButtonWithTooltip", "UndoIcon", "ZoomMenu", "StyleMenu", "styled", "TopPanel", "import_react", "useCursor", "ref", "React", "isPointing", "isSpacePanning", "elm", "onKeyDown", "e", "onKeyUp", "onPointerDown", "onPointerUp", "import_telva_core", "import_telva_vec", "import_idb_keyval", "ID", "getClipboard", "__async", "setClipboard", "item", "idb", "import_telva_core", "import_zustand", "import_vanilla", "StateManager", "initialState", "id", "version", "update", "__publicField", "patch", "e", "prev", "next", "final", "nextState", "_prevState", "_patch", "_id", "state", "command", "__spreadProps", "__spreadValues", "history", "pointer", "deepCopy", "createVanilla", "create", "resolve", "message", "saved", "__async", "savedVersion", "prevEmpty", "import_telva_core", "import_telva_vec", "alignShapes", "app", "ids", "type", "currentPageId", "initialShapes", "id", "boundsForShapes", "shape", "TVDR", "commonBounds", "bounds", "midX", "midY", "deltaMap", "point", "before", "after", "delta", "child", "changePage", "app", "pageId", "import_telva_core", "getIncrementedName", "name", "others", "_a", "result", "set", "m", "removeShapesFromPage", "data", "ids", "pageId", "before", "after", "parentsToUpdate", "deletedIds", "assetsToRemove", "id", "TVDR", "shape", "childId", "child", "parent", "_a", "page", "binding", "handle", "_b", "_c", "_d", "_e", "_f", "__spreadProps", "__spreadValues", "createPage", "app", "center", "pageId", "pageName", "currentPageId", "pages", "a", "b", "_a", "_b", "topPage", "nextChildIndex", "page", "getIncrementedName", "pageState", "createShapes", "app", "shapes", "bindings", "currentPageId", "beforeShapes", "afterShapes", "shape", "beforeBindings", "afterBindings", "binding", "deletePage", "app", "pageId", "currentPageId", "pages", "pageStates", "pagesArr", "b", "currentIndex", "page", "nextCurrentPageId", "__spreadValues", "removeAssetsFromDocument", "assets", "idsToRemove", "afterAssets", "__spreadValues", "id", "deleteShapes", "app", "ids", "pageId", "pageState", "selectedIds", "beforeAssets", "before", "after", "assetsToRemove", "removeShapesFromPage", "import_telva_core", "import_telva_vec", "distributeShapes", "app", "ids", "type", "currentPageId", "initialShapes", "id", "deltaMap", "getDistributions", "d", "before", "after", "TVDR", "shape", "_a", "delta", "Vec", "child", "entries", "utils", "len", "commonBounds", "bounds", "results", "span", "a", "c", "left", "b", "right", "entriesToMove", "step", "x", "point", "i", "top", "bottom", "y", "import_telva_core", "duplicatePage", "app", "pageId", "currentPageId", "camera", "page", "newId", "oldToNewIds", "id", "shapes", "shape", "__spreadProps", "__spreadValues", "bindings", "binding", "fromId", "fromHandles", "handle", "toId", "toHandles", "nextPage", "import_telva_core", "import_telva_vec", "duplicateShapes", "app", "ids", "point", "selectedIds", "currentPageId", "page", "shapes", "before", "after", "duplicateMap", "shapesToDuplicate", "id", "shape", "duplicatedId", "__spreadProps", "__spreadValues", "TVDR", "parent", "childId", "_a", "_b", "child", "duplicatedParentId", "dupedShapeIds", "binding", "duplicatedBindingId", "duplicatedBinding", "boundShape", "handle", "shapesToMove", "commonBounds", "center", "offset", "import_telva_core", "flipShapes", "app", "ids", "type", "selectedIds", "currentPageId", "shapes", "boundsForShapes", "id", "TVDR", "isSinglySelectedGroup", "commonBounds", "before", "after", "shape", "shapeBounds", "isChildOfGroup", "groupBounds", "dx", "__spreadProps", "__spreadValues", "newShapeBounds", "dy", "import_telva_core", "groupShapes", "app", "ids", "groupId", "pageId", "_a", "_b", "beforeShapes", "afterShapes", "beforeBindings", "afterBindings", "idsToGroup", "shapesToGroup", "deletedGroupIds", "otherEffectedGroups", "id", "shape", "childIds", "flattenedShapes", "TVDR", "shapeIndexMap", "sortedShapes", "a", "b", "groupParentId", "groupChildIndex", "groupBounds", "index", "parentShape", "__spreadProps", "__spreadValues", "nextChildren", "childId", "bindings", "deletedGroupIdsSet", "binding", "handle", "import_telva_core", "import_telva_vec", "moveShapesToPage", "app", "ids", "viewportBounds", "fromPageId", "toPageId", "page", "fromPage", "toPage", "movingShapeIds", "shapesToMove", "id", "shape", "childId", "startingChildIndex", "TVDR", "movingShapes", "i", "__spreadProps", "__spreadValues", "parent", "binding", "fromBoundShape", "fromShape", "handleId", "handle", "toPageShape", "toPageState", "bounds", "zoom", "mx", "my", "point", "movePage", "app", "pageId", "index", "pages", "movingPage", "beforePages", "b", "_a", "_b", "fromIndex", "afterPages", "p", "childIndex", "reorderShapes", "app", "ids", "type", "currentPageId", "page", "parentIds", "id", "result", "startIndex", "startChildIndex", "step", "parentId", "sortedChildren", "a", "b", "parent", "childId", "sortedChildIds", "shape", "sortedIndicesToMove", "i", "TVDR", "_shape", "indexMap", "j", "endChildIndex", "k", "renamePage", "app", "pageId", "name", "page", "resetBounds", "app", "ids", "pageId", "currentPageId", "before", "after", "TVDR", "shape", "_a", "_b", "import_telva_core", "PI2", "rotateShapes", "app", "ids", "delta", "currentPageId", "before", "after", "shapesToRotate", "id", "shape", "childId", "origin", "TVDR", "change", "import_telva_core", "stretchShapes", "app", "ids", "type", "currentPageId", "selectedIds", "initialShapes", "id", "boundsForShapes", "shape", "TVDR", "commonBounds", "idsToMutate", "before", "after", "bounds", "newBounds", "__spreadProps", "__spreadValues", "import_telva_vec", "styleShapes", "app", "ids", "changes", "currentPageId", "selectedIds", "shapeIdsToMutate", "id", "TVDR", "beforeShapes", "afterShapes", "shape", "__spreadValues", "key", "__spreadProps", "toggleShapesDecoration", "app", "ids", "decorationId", "currentPageId", "selectedIds", "beforeShapes", "id", "_a", "afterShapes", "toggleShapeProp", "app", "ids", "prop", "currentPageId", "initialShapes", "id", "shape", "isAllToggled", "before", "after", "import_telva_vec", "translateShapes", "app", "ids", "delta", "currentPageId", "selectedIds", "before", "after", "idsToMutate", "id", "shape", "change", "TVDR", "binding", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "ungroupShapes", "app", "selectedIds", "groupShapes", "pageId", "bindings", "beforeShapes", "afterShapes", "beforeBindings", "afterBindings", "beforeSelectedIds", "afterSelectedIds", "id", "shape", "groupShape", "shapesToReparent", "deletedGroupIds", "startingChildIndex", "step", "TVDR", "a", "b", "index", "binding", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "updateShapes", "app", "updates", "pageId", "ids", "update", "change", "TVDR", "id", "_shape", "i", "setShapesProps", "app", "ids", "partial", "currentPageId", "selectedIds", "initialShapes", "id", "shape", "before", "after", "keys", "key", "import_telva_core", "import_telva_vec", "insertContent", "app", "content", "opts", "currentPageId", "point", "select", "overwrite", "page", "before", "afterAssets", "after", "shape", "binding", "asset", "oldToNewIds", "nextIndex", "TVDR", "shapesToInsert", "a", "b", "newShapeId", "__spreadProps", "__spreadValues", "visited", "parent", "newBindingId", "toId", "fromId", "handles", "handle", "fromHandles", "newBinding", "shapesToMove", "commonBounds", "center", "centeredBounds", "delta", "elm", "data_exports", "__export", "fileToBase64", "fileToText", "getImageSizeFromSrc", "getVideoSizeFromSrc", "loadFileHandle", "migrate", "openAssetsFromFileSystem", "openFromFileSystem", "saveFileHandle", "saveToFileSystem", "tldrawFileToTVDocument", "tvDocumentToTldrawFile", "migrate", "state", "newVersion", "document", "settings", "version", "assetIdsInUse", "page", "shape", "parentId", "children", "assetId", "childId", "binding", "id", "style", "decoration", "__spreadProps", "__spreadValues", "pageState", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "arrow", "startPt", "endPt", "bendPt", "import_browser_fs_access", "import_idb_keyval", "options", "checkPermissions", "handle", "__async", "loadFileHandle", "fileHandle", "getFromIdb", "saveFileHandle", "setToIdb", "TLD_SCHEMA", "tvDocumentToTldrawFile", "document", "_a", "_b", "_d", "_e", "_f", "_g", "records", "pageIndex", "pageId", "page", "pageState", "indexStr", "shapes", "shapeIdx", "shapeId", "shape", "_c", "point", "rotation", "style", "type", "rest", "__objRest", "__spreadValues", "tldrawFileToTVDocument", "tldFile", "docRecord", "r", "pageRecords", "shapeRecords", "pageStateRecords", "pages", "pageStates", "pr", "rawId", "shapesForPage", "sr", "expectedParent", "rawShapeId", "props", "x", "y", "opacity", "start", "end", "bend", "arrowheadStart", "arrowheadEnd", "restProps", "base", "startPt", "endPt", "bendVal", "bendPt", "ps", "pid", "saveToFileSystem", "name", "format", "ext", "FILE_EXTENSION", "json", "mimeType", "file", "blob", "docName", "filename", "newFileHandle", "openFromFileSystem", "resolve", "reader", "parsed", "openAssetsFromFileSystem", "IMAGE_EXTENSIONS", "VIDEO_EXTENSIONS", "fileToBase64", "reject", "error", "fileToText", "getImageSizeFromSrc", "src", "img", "getVideoSizeFromSrc", "video", "__reExport", "data_exports", "import_telva_core", "import_telva_vec", "BaseSession", "app", "ArrowSession", "BaseSession", "app", "shapeId", "handleId", "isCreate", "_a", "_b", "_c", "__publicField", "initialShape", "currentPoint", "shiftKey", "altKey", "metaKey", "currentGrid", "showGrid", "shape", "handles", "delta", "A", "B", "C", "angle", "adjusted", "nextPoint", "handleChanges", "__spreadProps", "__spreadValues", "utils", "shapeUtils", "handleChange", "next", "draggedBinding", "draggingHandle", "oppositeHandle", "nextStartBinding", "startTarget", "startTargetUtils", "TVDR", "center", "startHandle", "endHandle", "rayPoint", "rayOrigin", "isInsideShape", "rayDirection", "hasStartBinding", "startPoint", "endPoint", "targets", "id", "a", "b", "point", "target", "currentBindingId", "change", "initialBinding", "newStartBindingId", "draggedBindingId", "currentShape", "isDeleting", "afterBindings", "startBindingShapeId", "length", "beforeBindings", "bindingId", "origin", "direction", "bindAnywhere", "bindingPoint", "currentPageId", "page", "deepCopy", "oppositeHandleBindingId", "oppositeToId", "originPoint", "initialBindingId", "import_telva_core", "BrushSession", "BaseSession", "app", "__publicField", "initialSelectedIds", "shapesToTest", "metaKey", "settings", "originPoint", "currentPoint", "brush", "selectByContain", "hits", "selectedIds", "id", "selectId", "shape", "util", "currentSelectedIds", "didChange", "afterSelectedIds", "currentPageId", "import_telva_vec", "DrawSession", "BaseSession", "app", "id", "_a", "__publicField", "currentPoint", "newAdjustedPoint", "topLeft", "delta", "pt", "shapeId", "originPoint", "shiftKey", "zoom", "returning", "change", "pageId", "shape", "__spreadProps", "__spreadValues", "prevTopLeft", "points", "initialPoints", "newPoints", "prevPoint", "len", "i", "t", "EditSession", "BaseSession", "app", "id", "isCreating", "__publicField", "shape", "import_telva_vec", "EraseSession", "BaseSession", "app", "__publicField", "now", "elapsed1", "elapsed2", "eraseLine", "next", "didUpdate", "page", "shiftKey", "originPoint", "currentPoint", "zoom", "delta", "newPoint", "deletedShapeIds", "shape", "childId", "binding", "id", "erasedShapes", "erasedBindings", "erasedShapeIds", "erasedBindingIds", "before", "after", "handle", "_a", "_b", "__spreadProps", "__spreadValues", "import_telva_core", "import_telva_vec", "GridSession", "BaseSession", "app", "id", "_a", "__publicField", "currentPageId", "altKey", "shiftKey", "currentPoint", "nextShapes", "nextPageState", "center", "offset", "gapX", "gapY", "columns", "rows", "minX", "minY", "maxX", "maxY", "inGrid", "isCopying", "y", "position", "clone", "__spreadProps", "__spreadValues", "beforeShapes", "afterShapes", "afterSelectedIds", "point", "copy", "import_telva_vec", "HandleSession", "BaseSession", "app", "shapeId", "handleId", "commandId", "__publicField", "_a", "_b", "initialShape", "currentPageId", "currentPoint", "shape", "handles", "delta", "handleChanges", "__spreadProps", "__spreadValues", "change", "TVDR", "originPoint", "import_telva_core", "import_telva_vec", "RotateSession", "BaseSession", "app", "__publicField", "commonBoundsCenter", "initialShapes", "currentPageId", "currentPoint", "shiftKey", "shapes", "directionDelta", "center", "shape", "rotation", "shapeDelta", "change", "TVDR", "beforeShapes", "afterShapes", "id", "point", "handles", "pageState", "originPoint", "import_telva_core", "import_telva_vec", "TransformSession", "BaseSession", "app", "transformType", "isCreate", "__publicField", "shape", "TVDR", "shapeBounds", "initialCommonBounds", "isAllAspectRatioLocked", "currentPageId", "camera", "viewport", "currentPoint", "previousPoint", "originPoint", "shiftKey", "altKey", "metaKey", "currentGrid", "isSnapping", "showGrid", "shapes", "delta", "newBounds", "__spreadValues", "speedChange", "snapLines", "snapResult", "bounds", "initialShape", "initialShapeBounds", "transformOrigin", "newShapeBounds", "afterShape", "hasUnlockedShapes", "beforeShapes", "afterShapes", "beforeSelectedIds", "afterSelectedIds", "shapesBounds", "boundsArr", "initialInnerBounds", "ic", "ix", "iy", "import_telva_core", "import_telva_vec", "TransformSingleSession", "BaseSession", "app", "id", "transformType", "isCreate", "__publicField", "shape", "TVDR", "initialShape", "initialShapeBounds", "isSnapping", "showGrid", "currentPageId", "camera", "viewport", "currentPoint", "previousPoint", "originPoint", "currentGrid", "shiftKey", "altKey", "metaKey", "shapes", "delta", "utils", "newBounds", "__spreadValues", "speedChange", "snapLines", "snapResult", "bounds", "afterShape", "beforeShapes", "afterShapes", "import_telva_core", "import_telva_vec", "TranslateSession", "BaseSession", "app", "isCreate", "link", "__publicField", "bindingsToDelete", "initialIds", "currentPageId", "page", "allBounds", "otherBounds", "shape", "bounds", "TVDR", "nextBindings", "nextShapes", "binding", "fromShape", "__spreadProps", "__spreadValues", "initialParentChildren", "initialShapes", "initialCommonBounds", "camera", "isSnapping", "showGrid", "viewport", "selectedIds", "currentPoint", "previousPoint", "originPoint", "altKey", "shiftKey", "metaKey", "currentGrid", "nextPageState", "delta", "didChangeCloning", "change", "snapResult", "clones", "clonedBindings", "clone", "_a", "children", "initialSelectedIds", "id", "point", "handles", "beforeBindings", "beforeShapes", "afterBindings", "afterShapes", "_b", "_c", "_d", "_e", "cloneMap", "clonedBindingsMap", "newId", "element", "childId", "clonedShapeIds", "cloneId", "cloneBinding", "handle", "selectedShapes", "selectedShapeIds", "s", "sessions", "ArrowSession", "BrushSession", "DrawSession", "EraseSession", "HandleSession", "RotateSession", "TransformSession", "TransformSingleSession", "TranslateSession", "GridSession", "EditSession", "getSession", "type", "import_telva_core", "import_telva_vec", "import_telva_core", "BaseTool", "TVEventHandler", "app", "__publicField", "status", "shapes", "currentPageId", "shape", "a", "b", "info", "e", "_a", "key", "isToolLocked", "ArrowTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Arrow", "Vec", "__spreadValues", "import_telva_core", "DrawTool", "BaseTool", "__publicField", "info", "currentPoint", "currentPageId", "currentStyle", "previous", "childIndex", "id", "newShape", "Draw", "__spreadValues", "import_telva_core", "import_telva_vec", "EllipseTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Ellipse", "Vec", "__spreadValues", "import_telva_vec", "EraseTool", "BaseTool", "__publicField", "info", "Vec", "shapeIdsAtPoint", "shape", "import_telva_core", "import_telva_vec", "LineTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Arrow", "Vec", "__spreadValues", "import_telva_core", "import_telva_vec", "DRAG_THRESHOLD", "PenTool", "BaseTool", "__publicField", "info", "pagePoint", "shape", "normalized", "offset", "normalizeSegments", "Vec", "local", "anchor", "localDown", "delta", "cp2", "cp1", "mirrorHandle", "trimmed", "key", "e", "_a", "_b", "currentPageId", "currentStyle", "id", "childIndex", "firstSeg", "newShape", "__spreadValues", "localPoint", "newSeg", "newSegs", "segs", "last", "__spreadProps", "firstNodePage", "shapeId", "newPoint", "import_telva_core", "import_telva_vec", "RectangleTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Rectangle", "Vec", "__spreadValues", "import_telva_core", "import_telva_vec", "SelectTool", "BaseTool", "__publicField", "point", "shapes", "id", "bounds", "TVDR", "center", "size", "gridPoint", "centeredBounds", "shape", "side", "utils", "newCenter", "Vec", "rotatedCenter", "clone", "__spreadProps", "__spreadValues", "key", "info", "e", "selectedId", "clonedShape", "pageState", "originPoint", "currentPoint", "idsToTransform", "selectedShape", "_a", "editingId", "hoveredId", "parentId", "shapeIdToSelect", "oldCurrentPageId", "selectedIds", "selectedShapeId", "oid", "import_telva_core", "import_telva_vec", "StickyTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Sticky", "Vec", "__spreadValues", "bounds", "import_telva_vec", "TextTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "Vec", "info", "shape", "import_telva_core", "import_telva_vec", "TriangleTool", "BaseTool", "__publicField", "currentPoint", "currentGrid", "showGrid", "currentPageId", "currentStyle", "childIndex", "id", "newShape", "Triangle", "Vec", "__spreadValues", "uuid", "_TelvaApp", "StateManager", "id", "callbacks", "prev", "next", "prevVersion", "migrate", "__spreadProps", "__spreadValues", "__publicField", "SelectTool", "EraseTool", "TextTool", "DrawTool", "EllipseTool", "RectangleTool", "TriangleTool", "LineTool", "ArrowTool", "StickyTool", "PenTool", "state", "_a", "_b", "loadFileHandle", "fileHandle", "e", "pageId", "page", "prevPage", "changedShapes", "groupsToUpdate", "shape", "parentId", "bindingsToUpdate", "TVDR", "visitedShapes", "binding", "toShape", "fromShape", "fromDelta", "nextShape", "group", "children", "commonBounds", "nextPageState", "currentPageId", "currentPageState", "room", "user", "patch", "addToHistory", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "changedBindings", "changedAssets", "shapes", "bindings", "assets", "command", "_state", "prevent", "event", "enable", "coreReservedIds", "reservedShapes", "reservedBindings", "bindingsArr", "boundTos", "boundFroms", "bindingMaps", "reservedShapeIds", "strongReservedShapeIds", "visited", "map", "current", "hoveredId", "editingId", "bindingId", "selectedIds", "editingShape", "reservedShape", "incomingShape", "nextShapes", "nextBindings", "nextAssets", "bounds", "point", "zoom", "width", "height", "minX", "minY", "maxX", "maxY", "isCreating", "name", "value", "isOpen", "isLoading", "disableAssets", "type", "tool", "doc", "users", "isOwnUpdate", "userId", "document", "currentPageStates", "nextAppState", "i", "pageState", "reason", "prevState", "nextState", "nextPage", "keysToCheck", "key", "roomId", "USER_COLORS", "nextDocument", "__async", "saveToFileSystem", "filename", "format", "result", "openFromFileSystem", "file", "openAssetsFromFileSystem", "camera", "createPage", "changePage", "index", "movePage", "renamePage", "duplicatePage", "deletePage", "ids", "telvaString", "setClipboard", "filesToPaste", "shapesToCreate", "clipboardData", "getSvgFromText", "text", "div", "svg", "imageBlob", "getShapeFromText", "pagePoint", "isMultiline", "getShapeFromHtml", "html", "maybeJson", "json", "items", "item", "kind", "str", "resolve", "currentPoint", "getClipboard", "_0", "opts", "defs", "style", "fonts", "d", "a", "b", "getSvgElementForShape", "util", "elm", "g", "childId", "childShape", "exportBackground", "darkBackground", "lightBackground", "svgString", "deepCopy", "idsSet", "s", "handles", "handle", "content", "blob", "url", "link", "insertContent", "newShapes", "shapesToDelete", "svgElm", "href", "imageShape", "delta", "nextPoint", "nextZoom", "p0", "p1", "center", "rendererBounds", "mx", "my", "selectedBounds", "push", "nextIds", "args", "Session", "getSession", "session", "pageShapes", "shapesToUpdate", "updateShapes", "createShapes", "drawCommand", "deleteShapes", "beforeAssetIds", "k", "afterAssetIds", "x", "styleShapes", "alignShapes", "direction", "distributeShapes", "stretchShapes", "flipShapes", "toPageId", "fromPageId", "moveShapesToPage", "reorderShapes", "isMajor", "size", "translateShapes", "duplicateShapes", "resetBounds", "toggleShapeProp", "handleId", "toggleShapesDecoration", "props", "setShapesProps", "change", "rotateShapes", "groupId", "groupShapes", "groups", "ungroupShapes", "_1", "files", "extension", "isImage", "IMAGE_EXTENSIONS", "isVideo", "VIDEO_EXTENSIONS", "shapeType", "assetType", "src", "fileToBase64", "viewBox", "fileToText", "viewBoxAttribute", "getImageSizeFromSrc", "getVideoSizeFromSrc", "match", "asset", "assetId", "error", "svgStr", "viewBoxRegex", "matches", "info", "shiftKey", "metaKey", "altKey", "ctrlKey", "spaceKey", "force", "restore", "clearPrevSize", "isLinux", "centerA", "centerB", "shapeToUpdate", "isToolLocked", "appState", "status", "commands", "currentStyle", "childIndex", "Text", "shapeUtils", "newShape", "Shape", "r", "video", "canvas", "image", "TelvaApp", "defaultStyle", "tools", "SelectTool", "EraseTool", "TextTool", "DrawTool", "EllipseTool", "RectangleTool", "TriangleTool", "LineTool", "ArrowTool", "StickyTool", "PenTool", "import_jsx_runtime", "ErrorBoundary", "_Errorboundary", "isSystemDarkMode", "Telva", "id", "document", "currentPageId", "autofocus", "showMenu", "showMultiplayerMenu", "showPages", "showTools", "showZoom", "showStyles", "showUI", "readOnly", "disableAssets", "darkMode", "components", "onMount", "onChange", "onChangePresence", "onNewProject", "onSaveProject", "onSaveProjectAs", "onOpenProject", "onOpenMedia", "onUndo", "onRedo", "onPersist", "onPatch", "onCommand", "onChangePage", "onAssetCreate", "onAssetDelete", "onAssetUpload", "onSessionStart", "onSessionEnd", "onExport", "hideCursors", "reactComponents", "googleFontsApiKey", "sId", "setSId", "setGoogleFontsApiKey", "initGoogleFonts", "app", "setApp", "TelvaApp", "onCancel", "setOnCancel", "onYes", "setOnYes", "onNo", "setOnNo", "dialogState", "setDialogState", "openDialog", "newApp", "_a", "refreshBoundingBoxes", "TelvaContext", "AlertDialogContext", "ReactRegistryContext", "InnerTelva", "_b", "_c", "useTelvaApp", "dialogContainer", "setDialogContainer", "rWrapper", "rCanvasWrap", "state", "settings", "appState", "room", "isSelecting", "page", "pageState", "assets", "selectedIds", "isHideBoundsShape", "TVDR", "isHideResizeHandlesShape", "meta", "showDashedBrush", "theme", "selectByContain", "isDarkMode", "isCadSelectMode", "brushBase", "isInSession", "hideBounds", "hideHandles", "hideIndicators", "hideCloneHandles", "translation", "useTranslation", "elm", "dark", "useCursor", "ContainerContext", "AlertDialog", "StyledLayout", "Loading", "OneOff", "StyledFigmaLayout", "StyledTopBar", "TopPanel", "StyledMainArea", "LeftPanel", "StyledCanvasWrap", "ContextMenu", "ErrorFallback", "shapeUtils", "CenterToolbar", "RightPanel", "focusableRef", "useKeyboardShortcuts", "styled"]
7
+ }