@falcon-ui/falcon-ui 1.0.0

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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/cjs/JsBarcode-BlUjuVmB.cjs +3519 -0
  4. package/cjs/JsBarcode-BlUjuVmB.cjs.map +1 -0
  5. package/cjs/chunk-D4y6LrGi.cjs +40 -0
  6. package/cjs/components/JsBarcode-BOXEZn4Q.cjs +3519 -0
  7. package/cjs/components/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  8. package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs +3519 -0
  9. package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  10. package/cjs/components/barcode/chunk-D4y6LrGi.cjs +40 -0
  11. package/cjs/components/barcode/index.cjs +211 -0
  12. package/cjs/components/barcode/index.cjs.map +1 -0
  13. package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs +3519 -0
  14. package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  15. package/cjs/components/barcode/src/barcode.cjs +102 -0
  16. package/cjs/components/barcode/src/barcode.cjs.map +1 -0
  17. package/cjs/components/barcode/src/barcode.vue.cjs +200 -0
  18. package/cjs/components/barcode/src/barcode.vue.cjs.map +1 -0
  19. package/cjs/components/barcode/src/chunk-D4y6LrGi.cjs +40 -0
  20. package/cjs/components/button/index.cjs +135 -0
  21. package/cjs/components/button/index.cjs.map +1 -0
  22. package/cjs/components/button/src/button.cjs +16 -0
  23. package/cjs/components/button/src/button.cjs.map +1 -0
  24. package/cjs/components/button/src/button.vue.cjs +124 -0
  25. package/cjs/components/button/src/button.vue.cjs.map +1 -0
  26. package/cjs/components/chunk-D4y6LrGi.cjs +40 -0
  27. package/cjs/components/date-picker/index.cjs +164 -0
  28. package/cjs/components/date-picker/index.cjs.map +1 -0
  29. package/cjs/components/date-picker/src/date-picker.cjs +25 -0
  30. package/cjs/components/date-picker/src/date-picker.cjs.map +1 -0
  31. package/cjs/components/date-picker/src/date-picker.vue.cjs +153 -0
  32. package/cjs/components/date-picker/src/date-picker.vue.cjs.map +1 -0
  33. package/cjs/components/dialog/index.cjs +346 -0
  34. package/cjs/components/dialog/index.cjs.map +1 -0
  35. package/cjs/components/dialog/src/dialog.cjs +40 -0
  36. package/cjs/components/dialog/src/dialog.cjs.map +1 -0
  37. package/cjs/components/dialog/src/dialog.vue.cjs +343 -0
  38. package/cjs/components/dialog/src/dialog.vue.cjs.map +1 -0
  39. package/cjs/components/index.cjs +9450 -0
  40. package/cjs/components/index.cjs.map +1 -0
  41. package/cjs/components/input/index.cjs +175 -0
  42. package/cjs/components/input/index.cjs.map +1 -0
  43. package/cjs/components/input/src/input.cjs +27 -0
  44. package/cjs/components/input/src/input.cjs.map +1 -0
  45. package/cjs/components/input/src/input.vue.cjs +164 -0
  46. package/cjs/components/input/src/input.vue.cjs.map +1 -0
  47. package/cjs/components/input-number/index.cjs +374 -0
  48. package/cjs/components/input-number/index.cjs.map +1 -0
  49. package/cjs/components/input-number/src/input-number.cjs +48 -0
  50. package/cjs/components/input-number/src/input-number.cjs.map +1 -0
  51. package/cjs/components/input-number/src/input-number.vue.cjs +363 -0
  52. package/cjs/components/input-number/src/input-number.vue.cjs.map +1 -0
  53. package/cjs/components/input-search/index.cjs +286 -0
  54. package/cjs/components/input-search/index.cjs.map +1 -0
  55. package/cjs/components/input-search/src/input-search.cjs +55 -0
  56. package/cjs/components/input-search/src/input-search.cjs.map +1 -0
  57. package/cjs/components/input-search/src/input-search.vue.cjs +275 -0
  58. package/cjs/components/input-search/src/input-search.vue.cjs.map +1 -0
  59. package/cjs/components/qr-code/index.cjs +1975 -0
  60. package/cjs/components/qr-code/index.cjs.map +1 -0
  61. package/cjs/components/qr-code/src/qr-code.cjs +63 -0
  62. package/cjs/components/qr-code/src/qr-code.cjs.map +1 -0
  63. package/cjs/components/qr-code/src/qr-code.vue.cjs +1964 -0
  64. package/cjs/components/qr-code/src/qr-code.vue.cjs.map +1 -0
  65. package/cjs/components/radial-menu/index.cjs +983 -0
  66. package/cjs/components/radial-menu/index.cjs.map +1 -0
  67. package/cjs/components/radial-menu/src/radial-menu.cjs +96 -0
  68. package/cjs/components/radial-menu/src/radial-menu.cjs.map +1 -0
  69. package/cjs/components/radial-menu/src/radial-menu.vue.cjs +921 -0
  70. package/cjs/components/radial-menu/src/radial-menu.vue.cjs.map +1 -0
  71. package/cjs/components/select/index.cjs +163 -0
  72. package/cjs/components/select/index.cjs.map +1 -0
  73. package/cjs/components/select/src/select.cjs +16 -0
  74. package/cjs/components/select/src/select.cjs.map +1 -0
  75. package/cjs/components/select/src/select.vue.cjs +152 -0
  76. package/cjs/components/select/src/select.vue.cjs.map +1 -0
  77. package/cjs/components/table/index.cjs +3351 -0
  78. package/cjs/components/table/index.cjs.map +1 -0
  79. package/cjs/components/table/src/table.cjs +62 -0
  80. package/cjs/components/table/src/table.cjs.map +1 -0
  81. package/cjs/components/table/src/table.vue.cjs +3085 -0
  82. package/cjs/components/table/src/table.vue.cjs.map +1 -0
  83. package/cjs/dialog-CJU00aEV.cjs +614 -0
  84. package/cjs/dialog-CJU00aEV.cjs.map +1 -0
  85. package/cjs/dialog-DcH26KbE.cjs +2 -0
  86. package/cjs/hooks/dialog-DpYPBcKV.cjs +266 -0
  87. package/cjs/hooks/dialog-DpYPBcKV.cjs.map +1 -0
  88. package/cjs/hooks/hooks-D2Jaq5kO.cjs +328 -0
  89. package/cjs/hooks/hooks-D2Jaq5kO.cjs.map +1 -0
  90. package/cjs/hooks/index.cjs +8 -0
  91. package/cjs/icons/index.cjs +86 -0
  92. package/cjs/icons/index.cjs.map +1 -0
  93. package/cjs/index.cjs +9141 -0
  94. package/cjs/index.cjs.map +1 -0
  95. package/cjs/utils/index.cjs +69 -0
  96. package/cjs/utils/index.cjs.map +1 -0
  97. package/esm/JsBarcode-kVJER62m.js +3514 -0
  98. package/esm/JsBarcode-kVJER62m.js.map +1 -0
  99. package/esm/chunk-BuRq7rDw.js +23 -0
  100. package/esm/components/JsBarcode-CzzxrEd_.js +3514 -0
  101. package/esm/components/JsBarcode-CzzxrEd_.js.map +1 -0
  102. package/esm/components/barcode/JsBarcode-C5ux6wsb.js +3514 -0
  103. package/esm/components/barcode/JsBarcode-C5ux6wsb.js.map +1 -0
  104. package/esm/components/barcode/chunk--em_ddB3.js +23 -0
  105. package/esm/components/barcode/index.mjs +204 -0
  106. package/esm/components/barcode/index.mjs.map +1 -0
  107. package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js +3514 -0
  108. package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js.map +1 -0
  109. package/esm/components/barcode/src/barcode.mjs +98 -0
  110. package/esm/components/barcode/src/barcode.mjs.map +1 -0
  111. package/esm/components/barcode/src/barcode.vue.mjs +194 -0
  112. package/esm/components/barcode/src/barcode.vue.mjs.map +1 -0
  113. package/esm/components/barcode/src/chunk--em_ddB3.js +23 -0
  114. package/esm/components/button/index.mjs +126 -0
  115. package/esm/components/button/index.mjs.map +1 -0
  116. package/esm/components/button/src/button.mjs +14 -0
  117. package/esm/components/button/src/button.mjs.map +1 -0
  118. package/esm/components/button/src/button.vue.mjs +117 -0
  119. package/esm/components/button/src/button.vue.mjs.map +1 -0
  120. package/esm/components/chunk-BuRq7rDw.js +23 -0
  121. package/esm/components/date-picker/index.mjs +155 -0
  122. package/esm/components/date-picker/index.mjs.map +1 -0
  123. package/esm/components/date-picker/src/date-picker.mjs +23 -0
  124. package/esm/components/date-picker/src/date-picker.mjs.map +1 -0
  125. package/esm/components/date-picker/src/date-picker.vue.mjs +146 -0
  126. package/esm/components/date-picker/src/date-picker.vue.mjs.map +1 -0
  127. package/esm/components/dialog/index.mjs +335 -0
  128. package/esm/components/dialog/index.mjs.map +1 -0
  129. package/esm/components/dialog/src/dialog.mjs +38 -0
  130. package/esm/components/dialog/src/dialog.mjs.map +1 -0
  131. package/esm/components/dialog/src/dialog.vue.mjs +334 -0
  132. package/esm/components/dialog/src/dialog.vue.mjs.map +1 -0
  133. package/esm/components/index.mjs +9386 -0
  134. package/esm/components/index.mjs.map +1 -0
  135. package/esm/components/input/index.mjs +166 -0
  136. package/esm/components/input/index.mjs.map +1 -0
  137. package/esm/components/input/src/input.mjs +25 -0
  138. package/esm/components/input/src/input.mjs.map +1 -0
  139. package/esm/components/input/src/input.vue.mjs +157 -0
  140. package/esm/components/input/src/input.vue.mjs.map +1 -0
  141. package/esm/components/input-number/index.mjs +365 -0
  142. package/esm/components/input-number/index.mjs.map +1 -0
  143. package/esm/components/input-number/src/input-number.mjs +45 -0
  144. package/esm/components/input-number/src/input-number.mjs.map +1 -0
  145. package/esm/components/input-number/src/input-number.vue.mjs +356 -0
  146. package/esm/components/input-number/src/input-number.vue.mjs.map +1 -0
  147. package/esm/components/input-search/index.mjs +277 -0
  148. package/esm/components/input-search/index.mjs.map +1 -0
  149. package/esm/components/input-search/src/input-search.mjs +53 -0
  150. package/esm/components/input-search/src/input-search.mjs.map +1 -0
  151. package/esm/components/input-search/src/input-search.vue.mjs +268 -0
  152. package/esm/components/input-search/src/input-search.vue.mjs.map +1 -0
  153. package/esm/components/qr-code/index.mjs +1967 -0
  154. package/esm/components/qr-code/index.mjs.map +1 -0
  155. package/esm/components/qr-code/src/qr-code.mjs +59 -0
  156. package/esm/components/qr-code/src/qr-code.mjs.map +1 -0
  157. package/esm/components/qr-code/src/qr-code.vue.mjs +1958 -0
  158. package/esm/components/qr-code/src/qr-code.vue.mjs.map +1 -0
  159. package/esm/components/radial-menu/index.mjs +974 -0
  160. package/esm/components/radial-menu/index.mjs.map +1 -0
  161. package/esm/components/radial-menu/src/radial-menu.mjs +94 -0
  162. package/esm/components/radial-menu/src/radial-menu.mjs.map +1 -0
  163. package/esm/components/radial-menu/src/radial-menu.vue.mjs +916 -0
  164. package/esm/components/radial-menu/src/radial-menu.vue.mjs.map +1 -0
  165. package/esm/components/select/index.mjs +154 -0
  166. package/esm/components/select/index.mjs.map +1 -0
  167. package/esm/components/select/src/select.mjs +14 -0
  168. package/esm/components/select/src/select.mjs.map +1 -0
  169. package/esm/components/select/src/select.vue.mjs +145 -0
  170. package/esm/components/select/src/select.vue.mjs.map +1 -0
  171. package/esm/components/table/index.mjs +3342 -0
  172. package/esm/components/table/index.mjs.map +1 -0
  173. package/esm/components/table/src/table.mjs +60 -0
  174. package/esm/components/table/src/table.mjs.map +1 -0
  175. package/esm/components/table/src/table.vue.mjs +3080 -0
  176. package/esm/components/table/src/table.vue.mjs.map +1 -0
  177. package/esm/dialog-Cm3Px-Bu.js +537 -0
  178. package/esm/dialog-Cm3Px-Bu.js.map +1 -0
  179. package/esm/dialog-CzZm50XM.js +2 -0
  180. package/esm/hooks/dialog-d4SMZWbw.js +261 -0
  181. package/esm/hooks/dialog-d4SMZWbw.js.map +1 -0
  182. package/esm/hooks/hooks-DdjieG2I.js +281 -0
  183. package/esm/hooks/hooks-DdjieG2I.js.map +1 -0
  184. package/esm/hooks/index.mjs +2 -0
  185. package/esm/icons/index.mjs +79 -0
  186. package/esm/icons/index.mjs.map +1 -0
  187. package/esm/index.mjs +9065 -0
  188. package/esm/index.mjs.map +1 -0
  189. package/esm/utils/index.mjs +65 -0
  190. package/esm/utils/index.mjs.map +1 -0
  191. package/global.d.ts +39 -0
  192. package/package.json +131 -0
  193. package/theme/index.css +1 -0
  194. package/theme/index.scss +16 -0
  195. package/theme/src/barcode.scss +14 -0
  196. package/theme/src/button.scss +65 -0
  197. package/theme/src/date-picker.scss +87 -0
  198. package/theme/src/dialog.scss +146 -0
  199. package/theme/src/ep-vars.scss +11 -0
  200. package/theme/src/input-number.scss +66 -0
  201. package/theme/src/input-search.scss +78 -0
  202. package/theme/src/input.scss +66 -0
  203. package/theme/src/mixins/bem.scss +35 -0
  204. package/theme/src/mixins/color.scss +8 -0
  205. package/theme/src/qr-code.scss +23 -0
  206. package/theme/src/radial-menu.scss +346 -0
  207. package/theme/src/select.scss +44 -0
  208. package/theme/src/table.scss +143 -0
  209. package/theme/src/tokens.scss +26 -0
  210. package/theme/src/tree-select.scss +45 -0
  211. package/theme/src/tree.scss +369 -0
  212. package/types/components/barcode/index.d.ts +183 -0
  213. package/types/components/barcode/src/barcode.d.ts +147 -0
  214. package/types/components/barcode/src/barcode.vue.d.ts +184 -0
  215. package/types/components/button/index.d.ts +135 -0
  216. package/types/components/button/src/button.d.ts +33 -0
  217. package/types/components/button/src/button.vue.d.ts +138 -0
  218. package/types/components/date-picker/index.d.ts +508 -0
  219. package/types/components/date-picker/src/date-picker.d.ts +35 -0
  220. package/types/components/date-picker/src/date-picker.vue.d.ts +509 -0
  221. package/types/components/dialog/index.d.ts +630 -0
  222. package/types/components/dialog/src/dialog.d.ts +70 -0
  223. package/types/components/dialog/src/dialog.vue.d.ts +257 -0
  224. package/types/components/index.d.ts +27 -0
  225. package/types/components/input/index.d.ts +233 -0
  226. package/types/components/input/src/input.d.ts +65 -0
  227. package/types/components/input/src/input.vue.d.ts +239 -0
  228. package/types/components/input-number/index.d.ts +713 -0
  229. package/types/components/input-number/src/input-number.d.ts +101 -0
  230. package/types/components/input-number/src/input-number.vue.d.ts +283 -0
  231. package/types/components/input-search/index.d.ts +113 -0
  232. package/types/components/input-search/src/input-search.d.ts +128 -0
  233. package/types/components/input-search/src/input-search.vue.d.ts +114 -0
  234. package/types/components/qr-code/index.d.ts +109 -0
  235. package/types/components/qr-code/src/qr-code.d.ts +93 -0
  236. package/types/components/qr-code/src/qr-code.vue.d.ts +109 -0
  237. package/types/components/radial-menu/index.d.ts +499 -0
  238. package/types/components/radial-menu/src/radial-menu-item.d.ts +40 -0
  239. package/types/components/radial-menu/src/radial-menu-item.vue.d.ts +95 -0
  240. package/types/components/radial-menu/src/radial-menu.d.ts +92 -0
  241. package/types/components/radial-menu/src/radial-menu.vue.d.ts +200 -0
  242. package/types/components/radial-menu/src/types.d.ts +48 -0
  243. package/types/components/radial-menu/src/use-radial-menu-items.d.ts +19 -0
  244. package/types/components/radial-menu/src/use-radial-menu-keyboard.d.ts +17 -0
  245. package/types/components/radial-menu/src/use-radial-menu-position.d.ts +45 -0
  246. package/types/components/radial-menu/src/use-radial-menu-shortcut.d.ts +8 -0
  247. package/types/components/radial-menu/src/use-radial-menu-state.d.ts +15 -0
  248. package/types/components/select/index.d.ts +5 -0
  249. package/types/components/select/src/select.d.ts +30 -0
  250. package/types/components/select/src/select.vue.d.ts +25 -0
  251. package/types/components/table/index.d.ts +8 -0
  252. package/types/components/table/src/editor-registry.d.ts +24 -0
  253. package/types/components/table/src/proxy-data.d.ts +10 -0
  254. package/types/components/table/src/table-editor.d.ts +18 -0
  255. package/types/components/table/src/table-editor.vue.d.ts +43 -0
  256. package/types/components/table/src/table.d.ts +179 -0
  257. package/types/components/table/src/table.vue.d.ts +121 -0
  258. package/types/components/tree/index.d.ts +5 -0
  259. package/types/components/tree/src/tree-node.vue.d.ts +88 -0
  260. package/types/components/tree/src/tree-types.d.ts +90 -0
  261. package/types/components/tree/src/tree.d.ts +448 -0
  262. package/types/components/tree/src/tree.vue.d.ts +301 -0
  263. package/types/components/tree/src/use-tree-check-conduct.d.ts +43 -0
  264. package/types/components/tree/src/use-tree-checked-state.d.ts +34 -0
  265. package/types/components/tree/src/use-tree-drag.d.ts +45 -0
  266. package/types/components/tree/src/use-tree-expanded-state.d.ts +41 -0
  267. package/types/components/tree/src/use-tree-keyboard.d.ts +21 -0
  268. package/types/components/tree/src/use-tree-load.d.ts +25 -0
  269. package/types/components/tree/src/use-tree-scroll.d.ts +17 -0
  270. package/types/components/tree/src/use-tree-selected-state.d.ts +29 -0
  271. package/types/components/tree-select/index.d.ts +5 -0
  272. package/types/components/tree-select/src/tree-select.d.ts +26 -0
  273. package/types/components/tree-select/src/tree-select.vue.d.ts +25 -0
  274. package/types/falcon-ui/index.d.ts +8 -0
  275. package/types/hooks/index.d.ts +3 -0
  276. package/types/hooks/src/use-clearable-state.d.ts +10 -0
  277. package/types/hooks/src/use-component.d.ts +15 -0
  278. package/types/hooks/src/use-dialog.d.ts +49 -0
  279. package/types/icons/index.d.ts +1 -0
  280. package/types/icons/src/components/holder-outlined.vue.d.ts +3 -0
  281. package/types/icons/src/components/index.d.ts +3 -0
  282. package/types/icons/src/components/minus-square-outlined.vue.d.ts +3 -0
  283. package/types/icons/src/components/plus-square-outlined.vue.d.ts +3 -0
  284. package/types/utils/index.d.ts +3 -0
  285. package/types/utils/src/bem.d.ts +11 -0
  286. package/types/utils/src/component.d.ts +6 -0
  287. package/types/utils/src/install.d.ts +5 -0
  288. package/umd/falcon-ui.umd.js +13297 -0
  289. package/umd/falcon-ui.umd.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["getSymbolSize","version","kanji","fromString","BitBuffer","index","BitMatrix","index","getSymbolSize","version","version","module","ECLevel","version","ReedSolomonEncoder","version","VersionCheck","Regex","version","Utils","ECCode","ECLevel","Mode","version","Utils","Mode","NumericData","Mode","AlphanumericData","Mode","ByteData","Mode","Utils","KanjiData","dijkstra","closest","Mode","Utils","version","fromString","Utils","matrix","version","index","Utils","FlSelect: SFCWithInstall<typeof Select>","FlTreeSelect: SFCWithInstall<typeof TreeSelect>","treeNodePropsDefaults: Required<TreeNodeProps>","treeNode: TreeNodeModel","visibleNodeKeys: TreeKey[]","nextExpandedKeys: TreeKey[]","nextSelectedKeys: TreeKey[]","nextCheckedKeys: TreeKey[]","nextLoadedKeys: TreeKey[]","expandedKeys: TreeKey[]","orderedExpandedKeys: TreeKey[]","eventNode: TreeNode","normalizedKeys: TreeKey[]","nextChildren: TreeData[]","initialExpandedKeys: TreeKey[]","orderedExpandedKeys: TreeKey[]","nextVisibleNodeKeys: TreeKey[]","FlTree: SFCWithInstall<typeof Tree>","radialMenuSizes: FlRadialMenuSize[]","radialMenuItemTypes: FlRadialMenuItemType[]","normalizedItems: FlRadialMenuResolvedItem[]","r","o","index","ghostEl","pluginEvent","defaults","rootEl","cloneEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","putSortable","_detectDirection","_dragElInRowColumn","_detectNearestEmptySortable","_prepareGroup","dragEl","_hideGhostForTarget","_unhideGhostForTarget","nearestEmptyInsertDetectEvent","_checkOutsideTargetEl","dragStartFn","target","after","plugins","drop","autoScroll","cache: PathAwareCache","runtime: ProxyRuntime","record: EditorRecord","candidates: TableEditorEndpoint[]","FlTable: SFCWithInstall<typeof Table>","FlTableEditor: SFCWithInstall<typeof TableEditor>"],"sources":["../../../../packages/utils/src/bem.ts","../../../../packages/utils/src/component.ts","../../../../packages/utils/src/install.ts","../../../../packages/hooks/src/use-component.ts","../../../../packages/hooks/src/use-clearable-state.ts","../../../../packages/components/button/src/button.ts","../../../../packages/components/button/src/button.vue","../../../../packages/components/button/src/button.vue","../../../../packages/components/button/index.ts","../../../../packages/components/dialog/src/dialog.ts","../../../../packages/components/dialog/src/dialog.vue","../../../../packages/components/dialog/src/dialog.vue","../../../../packages/components/dialog/index.ts","../../../../packages/components/input/src/input.ts","../../../../packages/components/input/src/input.vue","../../../../packages/components/input/src/input.vue","../../../../packages/components/input/index.ts","../../../../packages/components/input-search/src/input-search.ts","../../../../packages/components/input-search/src/input-search.vue","../../../../packages/components/input-search/src/input-search.vue","../../../../packages/components/input-search/index.ts","../../../../packages/components/input-number/src/input-number.ts","../../../../packages/components/input-number/src/input-number.vue","../../../../packages/components/input-number/src/input-number.vue","../../../../packages/components/input-number/index.ts","../../../../packages/components/date-picker/src/date-picker.ts","../../../../packages/components/date-picker/src/date-picker.vue","../../../../packages/components/date-picker/src/date-picker.vue","../../../../packages/components/date-picker/index.ts","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/can-promise.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-level.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-buffer.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/bit-matrix.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alignment-pattern.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/finder-pattern.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mask-pattern.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/error-correction-code.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/galois-field.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/polynomial.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/reed-solomon-encoder.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version-check.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/regex.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/mode.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/version.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/format-info.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/numeric-data.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/alphanumeric-data.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/byte-data.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/kanji-data.js","../../../../node_modules/.pnpm/dijkstrajs@1.0.3/node_modules/dijkstrajs/dijkstra.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/segments.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/qrcode.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/canvas.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/svg-tag.js","../../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/browser.js","../../../../packages/components/qr-code/src/qr-code.ts","../../../../packages/components/qr-code/src/qr-code.vue","../../../../packages/components/qr-code/src/qr-code.vue","../../../../packages/components/qr-code/index.ts","../../../../packages/components/barcode/src/barcode.ts","../../../../packages/components/barcode/src/barcode.vue","../../../../packages/components/barcode/src/barcode.vue","../../../../packages/components/barcode/index.ts","../../../../packages/components/select/src/select.ts","../../../../packages/components/select/src/select.vue","../../../../packages/components/select/src/select.vue","../../../../packages/components/select/index.ts","../../../../packages/components/tree-select/src/tree-select.ts","../../../../packages/components/tree-select/src/tree-select.vue","../../../../packages/components/tree-select/src/tree-select.vue","../../../../packages/components/tree-select/index.ts","../../../../packages/components/tree/src/tree.ts","../../../../packages/icons/src/components/holder-outlined.vue","../../../../packages/icons/src/components/holder-outlined.vue","../../../../packages/icons/src/components/minus-square-outlined.vue","../../../../packages/icons/src/components/minus-square-outlined.vue","../../../../packages/icons/src/components/plus-square-outlined.vue","../../../../packages/icons/src/components/plus-square-outlined.vue","../../../../packages/icons/src/components/index.ts","../../../../packages/components/tree/src/tree-node.vue","../../../../packages/components/tree/src/tree-node.vue","../../../../packages/components/tree/src/use-tree-check-conduct.ts","../../../../packages/components/tree/src/use-tree-checked-state.ts","../../../../packages/components/tree/src/use-tree-drag.ts","../../../../packages/components/tree/src/use-tree-expanded-state.ts","../../../../packages/components/tree/src/use-tree-keyboard.ts","../../../../packages/components/tree/src/use-tree-load.ts","../../../../packages/components/tree/src/use-tree-scroll.ts","../../../../packages/components/tree/src/use-tree-selected-state.ts","../../../../packages/components/tree/src/tree.vue","../../../../packages/components/tree/src/tree.vue","../../../../packages/components/tree/index.ts","../../../../packages/components/radial-menu/src/radial-menu.ts","../../../../packages/components/radial-menu/src/use-radial-menu-items.ts","../../../../packages/components/radial-menu/src/use-radial-menu-keyboard.ts","../../../../packages/components/radial-menu/src/use-radial-menu-position.ts","../../../../packages/components/radial-menu/src/use-radial-menu-shortcut.ts","../../../../packages/components/radial-menu/src/use-radial-menu-state.ts","../../../../packages/components/radial-menu/src/radial-menu.vue","../../../../packages/components/radial-menu/src/radial-menu.vue","../../../../packages/components/radial-menu/src/radial-menu-item.ts","../../../../packages/components/radial-menu/src/radial-menu-item.vue","../../../../packages/components/radial-menu/src/radial-menu-item.vue","../../../../packages/components/radial-menu/index.ts","../../../../node_modules/.pnpm/sortablejs@1.15.7/node_modules/sortablejs/modular/sortable.esm.js","../../../../packages/components/table/src/table.ts","../../../../packages/components/table/src/proxy-data.ts","../../../../packages/components/table/src/editor-registry.ts","../../../../packages/components/table/src/table.vue","../../../../packages/components/table/src/table.vue","../../../../packages/components/table/src/table-editor.ts","../../../../packages/components/table/src/table-editor.vue","../../../../packages/components/table/src/table-editor.vue","../../../../packages/components/table/index.ts"],"sourcesContent":["const defaultNamespace = 'fl'\r\nconst statePrefix = 'is-'\r\n\r\nconst buildBemName = (\r\n namespace: string,\r\n block: string,\r\n blockSuffix = '',\r\n element = '',\r\n modifier = ''\r\n) => {\r\n let className = `${namespace}-${block}`\r\n\r\n if (blockSuffix) {\r\n className += `-${blockSuffix}`\r\n }\r\n\r\n if (element) {\r\n className += `__${element}`\r\n }\r\n\r\n if (modifier) {\r\n className += `--${modifier}`\r\n }\r\n\r\n return className\r\n}\r\n\r\nexport const useNamespace = (block: string, namespace = defaultNamespace) => {\r\n const b = (blockSuffix = '') => buildBemName(namespace, block, blockSuffix)\r\n\r\n const e = (element?: string) => (element ? buildBemName(namespace, block, '', element) : '')\r\n\r\n const m = (modifier?: string) =>\r\n modifier ? buildBemName(namespace, block, '', '', modifier) : ''\r\n\r\n const be = (blockSuffix?: string, element?: string) => {\r\n if (!blockSuffix || !element) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element)\r\n }\r\n\r\n const em = (element?: string, modifier?: string) => {\r\n if (!element || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, '', element, modifier)\r\n }\r\n\r\n const bm = (blockSuffix?: string, modifier?: string) => {\r\n if (!blockSuffix || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, '', modifier)\r\n }\r\n\r\n const bem = (blockSuffix?: string, element?: string, modifier?: string) => {\r\n if (!blockSuffix && !element && !modifier) {\r\n return b()\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element, modifier)\r\n }\r\n\r\n const is = (name: string, state = true) => (state ? `${statePrefix}${name}` : '')\r\n\r\n return {\r\n namespace,\r\n b,\r\n e,\r\n m,\r\n be,\r\n em,\r\n bm,\r\n bem,\r\n is\r\n }\r\n}\r\n","type ExposedTarget = {\r\n exposed?: Record<string, unknown> | null\r\n} | null\r\n\r\nexport const mergeComponentExpose = (\r\n vm: ExposedTarget,\r\n exposed: unknown,\r\n extras: Record<string, unknown> = {}\r\n) => {\r\n if (!vm?.exposed || !exposed || (typeof exposed !== 'object' && typeof exposed !== 'function')) {\r\n return\r\n }\r\n\r\n Object.assign(vm.exposed, extras, exposed)\r\n}\r\n\r\nexport const invokeListener = (listener: unknown, ...args: unknown[]) => {\r\n if (typeof listener === 'function') {\r\n listener(...args)\r\n return\r\n }\r\n\r\n if (!Array.isArray(listener)) {\r\n return\r\n }\r\n\r\n for (const item of listener) {\r\n if (typeof item === 'function') {\r\n item(...args)\r\n }\r\n }\r\n}\r\n","import type { App, Plugin } from 'vue'\r\n\r\nexport type SFCWithInstall<T> = T & Plugin\r\n\r\nexport const withInstall = <T extends { name?: string }>(component: T): SFCWithInstall<T> => {\r\n const installable = component as SFCWithInstall<T>\r\n\r\n installable.install = (app: App) => {\r\n if (!component.name) {\r\n return\r\n }\r\n\r\n app.component(component.name, component as unknown as object)\r\n }\r\n\r\n return installable\r\n}\r\n","import { computed, getCurrentInstance } from 'vue'\r\nimport { invokeListener, mergeComponentExpose, useNamespace } from '@falcon-ui/utils'\r\n\r\ntype UseMergedAttrsOptions = {\r\n attrs: Record<string, unknown>\r\n block: string\r\n listenerName: string\r\n onListener?: (...args: unknown[]) => void\r\n}\r\n\r\nexport const useMergedAttrs = ({\r\n attrs,\r\n block,\r\n listenerName,\r\n onListener\r\n}: UseMergedAttrsOptions) => {\r\n const ns = useNamespace(block)\r\n const className = ns.b()\r\n\r\n const mergedAttrs = computed(() => {\r\n const next = { ...attrs }\r\n const originalListener = next[listenerName]\r\n next.class = [className, next.class]\r\n\r\n next[listenerName] = (...args: unknown[]) => {\r\n onListener?.(...args)\r\n invokeListener(originalListener, ...args)\r\n }\r\n\r\n return next\r\n })\r\n\r\n return {\r\n mergedAttrs\r\n }\r\n}\r\n\r\nexport const useMergedExpose = <TExpose extends Record<string, unknown>>(extras: TExpose) => {\r\n const vm = getCurrentInstance()\r\n\r\n const changeRef = (exposed: unknown) => {\r\n mergeComponentExpose(vm, exposed, extras)\r\n }\r\n\r\n return {\r\n changeRef\r\n }\r\n}\r\n","import { watch } from 'vue'\r\nimport { invokeListener } from '@falcon-ui/utils'\r\n\r\nexport type ClearValueResolver = () => unknown\r\n\r\nexport interface UseClearableStateOptions {\r\n attrs: Record<string, unknown>\r\n isError: () => boolean\r\n resolveClearValue?: ClearValueResolver\r\n}\r\n\r\nexport const useClearableState = ({\r\n attrs,\r\n isError,\r\n resolveClearValue = () => undefined\r\n}: UseClearableStateOptions) => {\r\n const resolveClearable = (): boolean => {\r\n const candidate = attrs.clearable\r\n if (typeof candidate === 'boolean') {\r\n return candidate\r\n }\r\n\r\n return true\r\n }\r\n\r\n const clearModelValue = () => {\r\n invokeListener(attrs['onUpdate:modelValue'], resolveClearValue())\r\n }\r\n\r\n watch(\r\n isError,\r\n (active, previousActive) => {\r\n if (active && previousActive !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n return {\r\n clearModelValue,\r\n resolveClearable\r\n }\r\n}\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flButtonProps = {\r\n /**\r\n * 调试事件标签,在开启调试模式后会随 `debug-click` 一起抛出。\r\n */\r\n debugLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否开启调试点击事件,开启后每次点击都会触发 `debug-click`。\r\n */\r\n debugMode: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport interface FlButtonDebugPayload {\r\n /**\r\n * 用于标识当前按钮实例的业务标签。\r\n */\r\n label: string\r\n}\r\n\r\nexport const flButtonEmits = {\r\n /**\r\n * 开启调试模式后,在按钮点击时触发。\r\n */\r\n 'debug-click': (payload: FlButtonDebugPayload) => typeof payload.label === 'string'\r\n} as const\r\n\r\nexport type FlButtonProps = ExtractPublicPropTypes<typeof flButtonProps>\r\nexport type FlButtonEmits = typeof flButtonEmits\r\n\r\nexport type ButtonProps = FlButtonProps\r\nexport type ButtonEmits = FlButtonEmits\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","import Button from './src/button.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlButton = withInstall(Button)\r\n\r\nexport default FlButton\r\n\r\nexport type { ButtonEmits, ButtonProps, FlButtonEmits, FlButtonProps } from './src/button'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flDialogProps = {\r\n /**\r\n * 对话框主体区域固定高度,传入数字时按像素处理。\r\n */\r\n bodyHeight: {\r\n type: [Number, String] as [NumberConstructor, StringConstructor],\r\n default: undefined\r\n },\r\n /**\r\n * 是否禁用默认页脚中的取消按钮。\r\n */\r\n cancelDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚取消按钮文案。\r\n */\r\n cancelText: {\r\n type: String,\r\n default: '取消'\r\n },\r\n /**\r\n * 是否禁用默认页脚中的确认按钮。\r\n */\r\n confirmDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚确认按钮文案。\r\n */\r\n confirmText: {\r\n type: String,\r\n default: '确认'\r\n },\r\n /**\r\n * 通过 v-model 控制对话框显示状态。\r\n */\r\n modelValue: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否渲染默认页脚操作区。\r\n */\r\n showFooter: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport const flDialogEmits = {\r\n /**\r\n * 点击默认取消动作时触发。\r\n */\r\n cancel: () => true,\r\n /**\r\n * 点击默认确认动作时触发。\r\n */\r\n confirm: () => true,\r\n /**\r\n * 对话框显示状态变更时触发。\r\n */\r\n 'update:modelValue': (value: boolean) => typeof value === 'boolean'\r\n} as const\r\n\r\nexport type FlDialogProps = ExtractPublicPropTypes<typeof flDialogProps>\r\nexport type FlDialogEmits = typeof flDialogEmits\r\n\r\nexport type DialogProps = FlDialogProps\r\nexport type DialogEmits = FlDialogEmits\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n","import Dialog from './src/dialog.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlDialog = withInstall(Dialog)\r\n\r\nexport default FlDialog\r\n\r\nexport type { DialogEmits, DialogProps, FlDialogEmits, FlDialogProps } from './src/dialog'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flInputProps = {\r\n /**\r\n * 是否用于表格单元格内输入场景。开启后会使用表格样式。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。开启后会触发错误样式并清空输入值。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 调试事件标签,在开启调试模式后会随 `debug-event` 一起抛出。\r\n */\r\n debugLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否开启调试事件派发,开启后每次输入都会触发调试事件。\r\n */\r\n debugMode: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport interface FlInputCustomPayload {\r\n /**\r\n * 当前输入字符串长度。\r\n */\r\n length: number\r\n /**\r\n * 底层 ElInput 当前输入值。\r\n */\r\n value: string\r\n}\r\n\r\nexport interface FlInputDebugPayload {\r\n /**\r\n * 用于标识输入来源的业务标签。\r\n */\r\n label: string\r\n /**\r\n * 触发调试事件时的当前输入值。\r\n */\r\n value: string\r\n}\r\n\r\nexport const flInputEmits = {\r\n /**\r\n * 原生输入变化时触发,携带当前值与字符长度。\r\n */\r\n 'custom-input': (payload: FlInputCustomPayload) =>\r\n typeof payload.value === 'string' && typeof payload.length === 'number',\r\n /**\r\n * 开启 `debugMode` 后在 `custom-input` 之后触发,用于调试追踪。\r\n */\r\n 'debug-event': (payload: FlInputDebugPayload) =>\r\n typeof payload.label === 'string' && typeof payload.value === 'string'\r\n} as const\r\n\r\nexport type FlInputProps = ExtractPublicPropTypes<typeof flInputProps>\r\nexport type FlInputEmits = typeof flInputEmits\r\n\r\nexport type InputProps = FlInputProps\r\nexport type InputEmits = FlInputEmits\r\n","<template>\r\n <component :is=\"h(ElInput, { ...mergedInputAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, h, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener } from '@falcon-ui/utils'\r\nimport { flInputEmits, flInputProps } from './input'\r\n\r\ndefineOptions({\r\n name: 'FlInput',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flInputProps)\r\nconst emit = defineEmits(flInputEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\n// Keep user-defined exposed capabilities and merge with ElInput expose.\r\nconst _myExpose = {\r\n /**\r\n * FlInput 额外暴露的示例方法,可用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInput 额外暴露的示例数值,用于文档演示与调试。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'input',\r\n listenerName: 'onInput',\r\n onListener: (...args: unknown[]) => {\r\n const value = args[0]\r\n if (typeof value === 'string') {\r\n emit('custom-input', {\r\n value,\r\n length: value.length\r\n })\r\n\r\n if (props.debugMode) {\r\n emit('debug-event', {\r\n label: props.debugLabel,\r\n value\r\n })\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst mergedInputAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\nconst clearModelValue = () => {\r\n invokeListener(rawAttrs['onUpdate:modelValue'], '')\r\n}\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElInput, { ...mergedInputAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, h, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener } from '@falcon-ui/utils'\r\nimport { flInputEmits, flInputProps } from './input'\r\n\r\ndefineOptions({\r\n name: 'FlInput',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flInputProps)\r\nconst emit = defineEmits(flInputEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\n// Keep user-defined exposed capabilities and merge with ElInput expose.\r\nconst _myExpose = {\r\n /**\r\n * FlInput 额外暴露的示例方法,可用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInput 额外暴露的示例数值,用于文档演示与调试。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'input',\r\n listenerName: 'onInput',\r\n onListener: (...args: unknown[]) => {\r\n const value = args[0]\r\n if (typeof value === 'string') {\r\n emit('custom-input', {\r\n value,\r\n length: value.length\r\n })\r\n\r\n if (props.debugMode) {\r\n emit('debug-event', {\r\n label: props.debugLabel,\r\n value\r\n })\r\n }\r\n }\r\n }\r\n})\r\n\r\nconst mergedInputAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\nconst clearModelValue = () => {\r\n invokeListener(rawAttrs['onUpdate:modelValue'], '')\r\n}\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n","import Input from './src/input.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlInput = withInstall(Input)\r\n\r\nexport default FlInput\r\n\r\nexport type { FlInputEmits, FlInputProps, InputEmits, InputProps } from './src/input'\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type FlInputSearchValue = string | number | null\r\n\r\nexport interface FlInputSearchMappedResult {\r\n label: string\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport type FlInputSearchFetchApi = (keyword: string) => Promise<unknown[]>\r\nexport type FlInputSearchMapResult = (item: unknown) => FlInputSearchMappedResult\r\n\r\nexport const flInputSearchProps = {\r\n /**\r\n * 绑定值,通常为业务实体 ID。\r\n */\r\n modelValue: {\r\n type: [String, Number] as PropType<string | number | null>,\r\n default: null\r\n },\r\n /**\r\n * 输入框显示值(业务标签)。\r\n */\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 回车检索方法。\r\n */\r\n fetchApi: {\r\n type: Function as PropType<FlInputSearchFetchApi>,\r\n default: undefined\r\n },\r\n /**\r\n * 外部结果映射方法,统一映射到 value/label。\r\n */\r\n mapResult: {\r\n type: Function as PropType<FlInputSearchMapResult>,\r\n required: true\r\n },\r\n /**\r\n * 占位提示文案。\r\n */\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否禁用输入。\r\n */\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否显示清空按钮。\r\n */\r\n clearable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否用于表格单元格输入。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Blur 时未确认输入是否强制清空。\r\n */\r\n clearOnBlurUnconfirmed: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport type FlInputSearchOpenDialogReason = 'manual' | 'multi-match'\r\n\r\nexport interface FlInputSearchOpenDialogPayload {\r\n keyword: string\r\n reason: FlInputSearchOpenDialogReason\r\n results?: unknown[]\r\n}\r\n\r\nexport interface FlInputSearchSelectionCommitPayload {\r\n label: string\r\n source: 'enter'\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport interface FlInputSearchSearchErrorPayload {\r\n error: unknown\r\n keyword: string\r\n}\r\n\r\nexport interface FlInputSearchClearPayload {\r\n reason: 'manual-empty' | 'blur-unconfirmed' | 'error'\r\n}\r\n\r\nexport const flInputSearchEmits = {\r\n /**\r\n * 绑定值更新事件。\r\n */\r\n 'update:modelValue': (value: FlInputSearchValue) =>\r\n value === null || typeof value === 'string' || typeof value === 'number',\r\n /**\r\n * 显示值更新事件。\r\n */\r\n 'update:label': (value: string) => typeof value === 'string',\r\n /**\r\n * 触发外部弹窗占位事件。\r\n */\r\n openDialog: (payload: FlInputSearchOpenDialogPayload) =>\r\n typeof payload.keyword === 'string' &&\r\n (payload.reason === 'manual' || payload.reason === 'multi-match') &&\r\n (payload.results === undefined || Array.isArray(payload.results)),\r\n /**\r\n * 唯一结果选中提交事件。\r\n */\r\n 'selection-commit': (payload: FlInputSearchSelectionCommitPayload) =>\r\n typeof payload.label === 'string' &&\r\n payload.source === 'enter' &&\r\n (payload.value === null ||\r\n typeof payload.value === 'string' ||\r\n typeof payload.value === 'number'),\r\n /**\r\n * 回车检索失败事件。\r\n */\r\n 'search-error': (payload: FlInputSearchSearchErrorPayload) => typeof payload.keyword === 'string',\r\n /**\r\n * 清空行为事件。\r\n */\r\n clear: (payload: FlInputSearchClearPayload) =>\r\n payload.reason === 'manual-empty' ||\r\n payload.reason === 'blur-unconfirmed' ||\r\n payload.reason === 'error'\r\n} as const\r\n\r\nexport type FlInputSearchProps = ExtractPublicPropTypes<typeof flInputSearchProps>\r\nexport type FlInputSearchEmits = typeof flInputSearchEmits\r\n\r\nexport type InputSearchProps = FlInputSearchProps\r\nexport type InputSearchEmits = FlInputSearchEmits\r\n","<template>\r\n <el-input\r\n ref=\"inputRef\"\r\n :class=\"inputClass\"\r\n :clearable=\"props.clearable\"\r\n :disabled=\"props.disabled || isLoading\"\r\n :model-value=\"innerLabel\"\r\n :placeholder=\"props.placeholder\"\r\n @blur=\"handleBlur\"\r\n @clear=\"handleNativeClear\"\r\n @keydown.enter.prevent=\"handleEnter\"\r\n @update:model-value=\"handleInput\">\r\n <template #suffix>\r\n <span\r\n :class=\"searchTriggerClass\"\r\n aria-label=\"Search\"\r\n role=\"button\"\r\n tabindex=\"-1\"\r\n @click=\"handleManualSearch\"\r\n @mousedown.prevent>\r\n <el-icon :class=\"ns.is('loading', isLoading)\">\r\n <Loading v-if=\"isLoading\" />\r\n <Search v-else />\r\n </el-icon>\r\n </span>\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Loading, Search } from '@element-plus/icons-vue'\r\nimport { ElIcon, ElInput } from 'element-plus'\r\nimport { computed, ref, watch } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputSearchMappedResult, FlInputSearchValue } from './input-search'\r\nimport { flInputSearchEmits, flInputSearchProps } from './input-search'\r\n\r\ndefineOptions({\r\n name: 'FlInputSearch',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ElInputExpose = {\r\n blur: () => void\r\n clear: () => void\r\n focus: () => void\r\n}\r\n\r\nconst props = defineProps(flInputSearchProps)\r\nconst emit = defineEmits(flInputSearchEmits)\r\nconst ns = useNamespace('input-search')\r\n\r\nconst inputRef = ref<ElInputExpose | null>(null)\r\nconst innerLabel = ref(props.label)\r\nconst isLoading = ref(false)\r\nconst latestSearchToken = ref(0)\r\nconst lastValidLabel = ref(props.label)\r\nconst lastValidValue = ref<FlInputSearchValue>(props.modelValue)\r\n\r\nconst inputClass = computed(() => [\r\n ns.b(),\r\n {\r\n 'is-error': props.isError,\r\n 'is-table': props.isTable\r\n }\r\n])\r\n\r\nconst searchTriggerClass = ns.e('trigger')\r\n\r\nconst normalizeLabel = (value: unknown): string => (typeof value === 'string' ? value : '')\r\n\r\nconst normalizeValue = (value: unknown): FlInputSearchValue => {\r\n if (value === null || typeof value === 'string' || typeof value === 'number') {\r\n return value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst syncSnapshot = (value: FlInputSearchValue, label: string) => {\r\n lastValidValue.value = value\r\n lastValidLabel.value = label\r\n}\r\n\r\nconst clearSelection = (reason: 'manual-empty' | 'blur-unconfirmed' | 'error') => {\r\n innerLabel.value = ''\r\n syncSnapshot(null, '')\r\n\r\n emit('update:modelValue', null)\r\n emit('update:label', '')\r\n emit('clear', { reason })\r\n}\r\n\r\nconst commitSelection = (result: FlInputSearchMappedResult) => {\r\n const nextValue = normalizeValue(result.value)\r\n const nextLabel = normalizeLabel(result.label)\r\n\r\n innerLabel.value = nextLabel\r\n syncSnapshot(nextValue, nextLabel)\r\n\r\n emit('update:modelValue', nextValue)\r\n emit('update:label', nextLabel)\r\n emit('selection-commit', {\r\n value: nextValue,\r\n label: nextLabel,\r\n source: 'enter'\r\n })\r\n}\r\n\r\nconst handleInput = (value: string) => {\r\n const nextLabel = normalizeLabel(value)\r\n innerLabel.value = nextLabel\r\n emit('update:label', nextLabel)\r\n}\r\n\r\nconst handleManualSearch = () => {\r\n emit('openDialog', {\r\n keyword: innerLabel.value.trim(),\r\n reason: 'manual'\r\n })\r\n}\r\n\r\nconst handleEnter = async () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const keyword = innerLabel.value.trim()\r\n if (!keyword) {\r\n return\r\n }\r\n\r\n if (!props.fetchApi) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'manual'\r\n })\r\n return\r\n }\r\n\r\n const currentToken = latestSearchToken.value + 1\r\n latestSearchToken.value = currentToken\r\n isLoading.value = true\r\n\r\n try {\r\n const response = await props.fetchApi(keyword)\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n const results = Array.isArray(response) ? response : []\r\n\r\n if (results.length === 1) {\r\n commitSelection(props.mapResult(results[0]))\r\n return\r\n }\r\n\r\n if (results.length > 1) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'multi-match',\r\n results\r\n })\r\n }\r\n } catch (error) {\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n emit('search-error', {\r\n keyword,\r\n error\r\n })\r\n } finally {\r\n if (currentToken === latestSearchToken.value) {\r\n isLoading.value = false\r\n }\r\n }\r\n}\r\n\r\nconst handleNativeClear = () => {\r\n clearSelection('manual-empty')\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const currentLabel = innerLabel.value\r\n if (currentLabel === lastValidLabel.value) {\r\n return\r\n }\r\n\r\n if (!currentLabel) {\r\n clearSelection('manual-empty')\r\n return\r\n }\r\n\r\n if (props.clearOnBlurUnconfirmed) {\r\n clearSelection('blur-unconfirmed')\r\n }\r\n}\r\n\r\nconst focus = () => {\r\n inputRef.value?.focus()\r\n}\r\n\r\nconst blur = () => {\r\n inputRef.value?.blur()\r\n}\r\n\r\nconst clear = () => {\r\n inputRef.value?.clear()\r\n}\r\n\r\nwatch(\r\n () => props.label,\r\n (value) => {\r\n innerLabel.value = value\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value === lastValidValue.value) {\r\n return\r\n }\r\n\r\n syncSnapshot(normalizeValue(value), props.label)\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearSelection('error')\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({\r\n focus,\r\n blur,\r\n clear\r\n})\r\n</script>\r\n","<template>\r\n <el-input\r\n ref=\"inputRef\"\r\n :class=\"inputClass\"\r\n :clearable=\"props.clearable\"\r\n :disabled=\"props.disabled || isLoading\"\r\n :model-value=\"innerLabel\"\r\n :placeholder=\"props.placeholder\"\r\n @blur=\"handleBlur\"\r\n @clear=\"handleNativeClear\"\r\n @keydown.enter.prevent=\"handleEnter\"\r\n @update:model-value=\"handleInput\">\r\n <template #suffix>\r\n <span\r\n :class=\"searchTriggerClass\"\r\n aria-label=\"Search\"\r\n role=\"button\"\r\n tabindex=\"-1\"\r\n @click=\"handleManualSearch\"\r\n @mousedown.prevent>\r\n <el-icon :class=\"ns.is('loading', isLoading)\">\r\n <Loading v-if=\"isLoading\" />\r\n <Search v-else />\r\n </el-icon>\r\n </span>\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Loading, Search } from '@element-plus/icons-vue'\r\nimport { ElIcon, ElInput } from 'element-plus'\r\nimport { computed, ref, watch } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputSearchMappedResult, FlInputSearchValue } from './input-search'\r\nimport { flInputSearchEmits, flInputSearchProps } from './input-search'\r\n\r\ndefineOptions({\r\n name: 'FlInputSearch',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ElInputExpose = {\r\n blur: () => void\r\n clear: () => void\r\n focus: () => void\r\n}\r\n\r\nconst props = defineProps(flInputSearchProps)\r\nconst emit = defineEmits(flInputSearchEmits)\r\nconst ns = useNamespace('input-search')\r\n\r\nconst inputRef = ref<ElInputExpose | null>(null)\r\nconst innerLabel = ref(props.label)\r\nconst isLoading = ref(false)\r\nconst latestSearchToken = ref(0)\r\nconst lastValidLabel = ref(props.label)\r\nconst lastValidValue = ref<FlInputSearchValue>(props.modelValue)\r\n\r\nconst inputClass = computed(() => [\r\n ns.b(),\r\n {\r\n 'is-error': props.isError,\r\n 'is-table': props.isTable\r\n }\r\n])\r\n\r\nconst searchTriggerClass = ns.e('trigger')\r\n\r\nconst normalizeLabel = (value: unknown): string => (typeof value === 'string' ? value : '')\r\n\r\nconst normalizeValue = (value: unknown): FlInputSearchValue => {\r\n if (value === null || typeof value === 'string' || typeof value === 'number') {\r\n return value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst syncSnapshot = (value: FlInputSearchValue, label: string) => {\r\n lastValidValue.value = value\r\n lastValidLabel.value = label\r\n}\r\n\r\nconst clearSelection = (reason: 'manual-empty' | 'blur-unconfirmed' | 'error') => {\r\n innerLabel.value = ''\r\n syncSnapshot(null, '')\r\n\r\n emit('update:modelValue', null)\r\n emit('update:label', '')\r\n emit('clear', { reason })\r\n}\r\n\r\nconst commitSelection = (result: FlInputSearchMappedResult) => {\r\n const nextValue = normalizeValue(result.value)\r\n const nextLabel = normalizeLabel(result.label)\r\n\r\n innerLabel.value = nextLabel\r\n syncSnapshot(nextValue, nextLabel)\r\n\r\n emit('update:modelValue', nextValue)\r\n emit('update:label', nextLabel)\r\n emit('selection-commit', {\r\n value: nextValue,\r\n label: nextLabel,\r\n source: 'enter'\r\n })\r\n}\r\n\r\nconst handleInput = (value: string) => {\r\n const nextLabel = normalizeLabel(value)\r\n innerLabel.value = nextLabel\r\n emit('update:label', nextLabel)\r\n}\r\n\r\nconst handleManualSearch = () => {\r\n emit('openDialog', {\r\n keyword: innerLabel.value.trim(),\r\n reason: 'manual'\r\n })\r\n}\r\n\r\nconst handleEnter = async () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const keyword = innerLabel.value.trim()\r\n if (!keyword) {\r\n return\r\n }\r\n\r\n if (!props.fetchApi) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'manual'\r\n })\r\n return\r\n }\r\n\r\n const currentToken = latestSearchToken.value + 1\r\n latestSearchToken.value = currentToken\r\n isLoading.value = true\r\n\r\n try {\r\n const response = await props.fetchApi(keyword)\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n const results = Array.isArray(response) ? response : []\r\n\r\n if (results.length === 1) {\r\n commitSelection(props.mapResult(results[0]))\r\n return\r\n }\r\n\r\n if (results.length > 1) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'multi-match',\r\n results\r\n })\r\n }\r\n } catch (error) {\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n emit('search-error', {\r\n keyword,\r\n error\r\n })\r\n } finally {\r\n if (currentToken === latestSearchToken.value) {\r\n isLoading.value = false\r\n }\r\n }\r\n}\r\n\r\nconst handleNativeClear = () => {\r\n clearSelection('manual-empty')\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const currentLabel = innerLabel.value\r\n if (currentLabel === lastValidLabel.value) {\r\n return\r\n }\r\n\r\n if (!currentLabel) {\r\n clearSelection('manual-empty')\r\n return\r\n }\r\n\r\n if (props.clearOnBlurUnconfirmed) {\r\n clearSelection('blur-unconfirmed')\r\n }\r\n}\r\n\r\nconst focus = () => {\r\n inputRef.value?.focus()\r\n}\r\n\r\nconst blur = () => {\r\n inputRef.value?.blur()\r\n}\r\n\r\nconst clear = () => {\r\n inputRef.value?.clear()\r\n}\r\n\r\nwatch(\r\n () => props.label,\r\n (value) => {\r\n innerLabel.value = value\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value === lastValidValue.value) {\r\n return\r\n }\r\n\r\n syncSnapshot(normalizeValue(value), props.label)\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearSelection('error')\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({\r\n focus,\r\n blur,\r\n clear\r\n})\r\n</script>\r\n","import InputSearch from './src/input-search.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlInputSearch = withInstall(InputSearch)\r\n\r\nexport default FlInputSearch\r\n\r\nexport type {\r\n FlInputSearchClearPayload,\r\n FlInputSearchEmits,\r\n FlInputSearchFetchApi,\r\n FlInputSearchMappedResult,\r\n FlInputSearchMapResult,\r\n FlInputSearchOpenDialogPayload,\r\n FlInputSearchOpenDialogReason,\r\n FlInputSearchProps,\r\n FlInputSearchSearchErrorPayload,\r\n FlInputSearchSelectionCommitPayload,\r\n FlInputSearchValue,\r\n InputSearchEmits,\r\n InputSearchProps\r\n} from './src/input-search'\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flInputNumberPrecisionModes = ['ROUND', 'FIXED', 'STRICT'] as const\r\n\r\nexport type FlInputNumberPrecisionMode = (typeof flInputNumberPrecisionModes)[number]\r\n\r\nexport const flInputNumberProps = {\r\n /**\r\n * 绑定值,仅输出 number 或 null。\r\n */\r\n modelValue: {\r\n type: [Number, String] as PropType<number | string | null>,\r\n default: null\r\n },\r\n /**\r\n * 是否用于表格单元格内输入场景。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。开启后会触发错误样式并清空输入值。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 小数精度位数。\r\n */\r\n precision: {\r\n type: Number,\r\n default: 2\r\n },\r\n /**\r\n * 精度处理模式:ROUND(四舍五入) / FIXED(截断) / STRICT(严格)。\r\n */\r\n precisionMode: {\r\n type: String as PropType<FlInputNumberPrecisionMode>,\r\n default: 'ROUND',\r\n validator: (value: string) =>\r\n flInputNumberPrecisionModes.includes(value as FlInputNumberPrecisionMode)\r\n },\r\n /**\r\n * 是否开启格式化显示。\r\n */\r\n isFormat: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 严格模式下精度不匹配时的 placeholder 提示。\r\n */\r\n strictErrorPlaceholder: {\r\n type: String,\r\n default: '精度不对'\r\n }\r\n} as const\r\n\r\nexport interface FlInputNumberCustomPayload {\r\n /**\r\n * 输入框当前原始字符串值(经字符过滤后)。\r\n */\r\n rawValue: string\r\n /**\r\n * 归一化后的数值,无法解析时为 null。\r\n */\r\n value: number | null\r\n}\r\n\r\nexport interface FlInputNumberStrictErrorPayload {\r\n /**\r\n * 严格模式校验失败时的原始输入值。\r\n */\r\n rawValue: string\r\n /**\r\n * 允许精度。\r\n */\r\n precision: number\r\n /**\r\n * 实际小数位长度。\r\n */\r\n actualPrecision: number\r\n}\r\n\r\nexport const flInputNumberEmits = {\r\n /**\r\n * modelValue 更新,仅输出 number 或 null。\r\n */\r\n 'update:modelValue': (value: number | null) => value === null || typeof value === 'number',\r\n /**\r\n * 严格模式触发错误时同步错误态。\r\n */\r\n 'update:isError': (value: boolean) => typeof value === 'boolean',\r\n /**\r\n * 每次输入后触发,携带归一化结果。\r\n */\r\n 'custom-input': (payload: FlInputNumberCustomPayload) =>\r\n typeof payload.rawValue === 'string' &&\r\n (payload.value === null || typeof payload.value === 'number'),\r\n /**\r\n * 严格模式下精度超限时触发。\r\n */\r\n 'strict-error': (payload: FlInputNumberStrictErrorPayload) =>\r\n typeof payload.rawValue === 'string' &&\r\n typeof payload.precision === 'number' &&\r\n typeof payload.actualPrecision === 'number'\r\n} as const\r\n\r\nexport type FlInputNumberProps = ExtractPublicPropTypes<typeof flInputNumberProps>\r\nexport type FlInputNumberEmits = typeof flInputNumberEmits\r\n\r\nexport type InputNumberProps = FlInputNumberProps\r\nexport type InputNumberEmits = FlInputNumberEmits\r\n","<template>\r\n <component :is=\"ElInput\" v-bind=\"mergedInputAttrs\" :ref=\"changeRef\">\r\n <template v-for=\"(_, slotName) in slots\" :key=\"String(slotName)\" #[slotName]=\"slotScope\">\r\n <slot :name=\"slotName\" v-bind=\"slotScope || {}\" />\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputNumberPrecisionMode } from './input-number'\r\nimport { flInputNumberEmits, flInputNumberProps } from './input-number'\r\n\r\ndefineOptions({\r\n name: 'FlInputNumber',\r\n inheritAttrs: false\r\n})\r\n\r\ntype NumberLike = number | string | null | undefined\r\ntype InputMode = 'text' | 'search' | 'email' | 'tel' | 'url' | 'none' | 'numeric' | 'decimal'\r\ntype FormatterFn = (value: string) => string\r\ntype ParserFn = (value: string) => string\r\n\r\nconst props = defineProps(flInputNumberProps)\r\nconst emit = defineEmits(flInputNumberEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('input-number')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst displayValue = ref('')\r\nconst strictErrorActive = ref(false)\r\nconst isFocused = ref(false)\r\n\r\nconst precisionValue = computed(() => {\r\n if (!Number.isFinite(props.precision) || props.precision < 0) {\r\n return 0\r\n }\r\n\r\n return Math.trunc(props.precision)\r\n})\r\n\r\nconst resolvedPlaceholder = computed(() => {\r\n if (strictErrorActive.value) {\r\n return props.strictErrorPlaceholder\r\n }\r\n\r\n const candidate = rawAttrs.placeholder\r\n return typeof candidate === 'string' ? candidate : undefined\r\n})\r\n\r\nconst mergedIsError = computed(() => props.isError || strictErrorActive.value)\r\n\r\nconst validInputModes = new Set<InputMode>([\r\n 'text',\r\n 'search',\r\n 'email',\r\n 'tel',\r\n 'url',\r\n 'none',\r\n 'numeric',\r\n 'decimal'\r\n])\r\n\r\nconst defaultNumberFormatter = new Intl.NumberFormat('en-US', {\r\n useGrouping: true,\r\n maximumFractionDigits: 20\r\n})\r\n\r\nconst toNumeric = (value: NumberLike): number | null => {\r\n if (value === null || value === undefined || value === '') {\r\n return null\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null\r\n }\r\n\r\n const trimmed = value.trim()\r\n if (!trimmed) {\r\n return null\r\n }\r\n\r\n if (!/^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(trimmed)) {\r\n return null\r\n }\r\n\r\n const next = Number(trimmed)\r\n return Number.isFinite(next) ? next : null\r\n}\r\n\r\nconst toRawString = (value: number): string => {\r\n if (Object.is(value, -0)) {\r\n return '0'\r\n }\r\n\r\n return `${value}`\r\n}\r\n\r\nconst defaultElInputFormatter: FormatterFn = (value) => {\r\n const numericValue = toNumeric(value)\r\n if (numericValue === null) {\r\n return value\r\n }\r\n\r\n return defaultNumberFormatter.format(numericValue)\r\n}\r\n\r\nconst defaultElInputParser: ParserFn = (value) => value.replace(/,/g, '').trim()\r\n\r\nconst sanitizeNumericInput = (value: string): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n let filtered = value.replace(/[^\\d.-]/g, '')\r\n const isNegative = filtered.startsWith('-')\r\n filtered = filtered.replace(/-/g, '')\r\n\r\n const dotIndex = filtered.indexOf('.')\r\n if (dotIndex !== -1) {\r\n const integerPart = filtered.slice(0, dotIndex)\r\n const decimalPart = filtered.slice(dotIndex + 1).replace(/\\./g, '')\r\n filtered = `${integerPart}.${decimalPart}`\r\n }\r\n\r\n return `${isNegative ? '-' : ''}${filtered}`\r\n}\r\n\r\nconst isPartialNumber = (value: string): boolean => value === '-' || value === '.' || value === '-.'\r\n\r\nconst countFractionLength = (value: string): number => {\r\n const dotIndex = value.indexOf('.')\r\n if (dotIndex < 0) {\r\n return 0\r\n }\r\n\r\n return value.slice(dotIndex + 1).length\r\n}\r\n\r\nconst applyPrecision = (\r\n value: number,\r\n mode: FlInputNumberPrecisionMode,\r\n precision: number\r\n): number => {\r\n if (precision < 0) {\r\n return value\r\n }\r\n\r\n if (mode === 'ROUND') {\r\n return Number(value.toFixed(precision))\r\n }\r\n\r\n if (mode === 'FIXED') {\r\n const factor = 10 ** precision\r\n return Math.trunc(value * factor) / factor\r\n }\r\n\r\n return value\r\n}\r\n\r\nconst emitModelValue = (value: number | null) => {\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst emitStrictErrorState = (active: boolean) => {\r\n if (strictErrorActive.value === active) {\r\n return\r\n }\r\n\r\n strictErrorActive.value = active\r\n emit('update:isError', active)\r\n}\r\n\r\nconst clearModelValue = () => {\r\n emitModelValue(null)\r\n displayValue.value = ''\r\n}\r\n\r\nconst syncDisplayFromModel = (value: number | null) => {\r\n if (value === null) {\r\n displayValue.value = ''\r\n return\r\n }\r\n\r\n displayValue.value = toRawString(value)\r\n}\r\n\r\nconst handleCustomPayload = (rawValue: string, value: number | null) => {\r\n emit('custom-input', { rawValue, value })\r\n}\r\n\r\nconst handleInput = (value: unknown) => {\r\n const input = typeof value === 'string' ? value : ''\r\n const sanitized = sanitizeNumericInput(input)\r\n displayValue.value = sanitized\r\n\r\n if (strictErrorActive.value) {\r\n emitStrictErrorState(false)\r\n }\r\n\r\n if (!sanitized || isPartialNumber(sanitized)) {\r\n emitModelValue(null)\r\n handleCustomPayload(sanitized, null)\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(sanitized)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n handleCustomPayload('', null)\r\n return\r\n }\r\n\r\n emitModelValue(numericValue)\r\n handleCustomPayload(sanitized, numericValue)\r\n}\r\n\r\nconst handleStrictError = (rawValue: string, actualPrecision: number) => {\r\n emit('strict-error', {\r\n rawValue,\r\n precision: precisionValue.value,\r\n actualPrecision\r\n })\r\n emitStrictErrorState(true)\r\n clearModelValue()\r\n}\r\n\r\nconst handleChange = (value: unknown) => {\r\n const input = typeof value === 'string' ? sanitizeNumericInput(value) : ''\r\n\r\n if (!input || isPartialNumber(input)) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(input)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const actualPrecision = countFractionLength(input)\r\n if (actualPrecision > precisionValue.value && props.precisionMode === 'STRICT') {\r\n handleStrictError(input, actualPrecision)\r\n return\r\n }\r\n\r\n const nextValue = applyPrecision(numericValue, props.precisionMode, precisionValue.value)\r\n emitModelValue(nextValue)\r\n emitStrictErrorState(false)\r\n syncDisplayFromModel(nextValue)\r\n}\r\n\r\nconst handleFocus = (evt: FocusEvent) => {\r\n isFocused.value = true\r\n\r\n const current = toNumeric(props.modelValue)\r\n if (current !== null) {\r\n displayValue.value = toRawString(current)\r\n }\r\n\r\n invokeListener(rawAttrs.onFocus, evt)\r\n}\r\n\r\nconst handleBlur = (evt: FocusEvent) => {\r\n isFocused.value = false\r\n\r\n const current = toNumeric(props.modelValue)\r\n syncDisplayFromModel(current)\r\n invokeListener(rawAttrs.onBlur, evt)\r\n}\r\n\r\nconst resolveInputMode = (): InputMode => {\r\n const candidate = rawAttrs.inputmode\r\n if (typeof candidate === 'string' && validInputModes.has(candidate as InputMode)) {\r\n return candidate as InputMode\r\n }\r\n\r\n return 'decimal'\r\n}\r\n\r\nconst resolveFormatter = (): FormatterFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const formatter = rawAttrs.formatter\r\n if (typeof formatter === 'function') {\r\n return formatter as FormatterFn\r\n }\r\n\r\n return defaultElInputFormatter\r\n}\r\n\r\nconst resolveParser = (): ParserFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const parser = rawAttrs.parser\r\n if (typeof parser === 'function') {\r\n return parser as ParserFn\r\n }\r\n\r\n if (typeof rawAttrs.formatter === 'function') {\r\n return undefined\r\n }\r\n\r\n return defaultElInputParser\r\n}\r\n\r\nconst mergedInputAttrs = computed(() => {\r\n const originalInputListener = rawAttrs.onInput\r\n const originalChangeListener = rawAttrs.onChange\r\n\r\n return {\r\n ...rawAttrs,\r\n class: [\r\n ns.b(),\r\n rawAttrs.class,\r\n {\r\n 'is-error': mergedIsError.value,\r\n 'is-table': props.isTable\r\n }\r\n ],\r\n modelValue: displayValue.value,\r\n placeholder: resolvedPlaceholder.value,\r\n inputmode: resolveInputMode(),\r\n formatter: resolveFormatter(),\r\n parser: resolveParser(),\r\n 'onUpdate:modelValue': undefined,\r\n onInput: (value: string) => {\r\n handleInput(value)\r\n invokeListener(originalInputListener, value)\r\n },\r\n onChange: (value: string) => {\r\n handleChange(value)\r\n invokeListener(originalChangeListener, value)\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur\r\n }\r\n})\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const numericValue = toNumeric(value)\r\n\r\n if (numericValue === null) {\r\n displayValue.value = ''\r\n if (value !== null && value !== undefined && value !== '') {\r\n emitModelValue(null)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'string') {\r\n emitModelValue(numericValue)\r\n }\r\n\r\n syncDisplayFromModel(numericValue)\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isFormat,\r\n () => {\r\n const numericValue = toNumeric(props.modelValue)\r\n syncDisplayFromModel(numericValue)\r\n }\r\n)\r\n\r\nconst _myExpose = {\r\n /**\r\n * FlInputNumber 额外暴露的方法,用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInputNumber 额外暴露的示例数值。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"ElInput\" v-bind=\"mergedInputAttrs\" :ref=\"changeRef\">\r\n <template v-for=\"(_, slotName) in slots\" :key=\"String(slotName)\" #[slotName]=\"slotScope\">\r\n <slot :name=\"slotName\" v-bind=\"slotScope || {}\" />\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputNumberPrecisionMode } from './input-number'\r\nimport { flInputNumberEmits, flInputNumberProps } from './input-number'\r\n\r\ndefineOptions({\r\n name: 'FlInputNumber',\r\n inheritAttrs: false\r\n})\r\n\r\ntype NumberLike = number | string | null | undefined\r\ntype InputMode = 'text' | 'search' | 'email' | 'tel' | 'url' | 'none' | 'numeric' | 'decimal'\r\ntype FormatterFn = (value: string) => string\r\ntype ParserFn = (value: string) => string\r\n\r\nconst props = defineProps(flInputNumberProps)\r\nconst emit = defineEmits(flInputNumberEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('input-number')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst displayValue = ref('')\r\nconst strictErrorActive = ref(false)\r\nconst isFocused = ref(false)\r\n\r\nconst precisionValue = computed(() => {\r\n if (!Number.isFinite(props.precision) || props.precision < 0) {\r\n return 0\r\n }\r\n\r\n return Math.trunc(props.precision)\r\n})\r\n\r\nconst resolvedPlaceholder = computed(() => {\r\n if (strictErrorActive.value) {\r\n return props.strictErrorPlaceholder\r\n }\r\n\r\n const candidate = rawAttrs.placeholder\r\n return typeof candidate === 'string' ? candidate : undefined\r\n})\r\n\r\nconst mergedIsError = computed(() => props.isError || strictErrorActive.value)\r\n\r\nconst validInputModes = new Set<InputMode>([\r\n 'text',\r\n 'search',\r\n 'email',\r\n 'tel',\r\n 'url',\r\n 'none',\r\n 'numeric',\r\n 'decimal'\r\n])\r\n\r\nconst defaultNumberFormatter = new Intl.NumberFormat('en-US', {\r\n useGrouping: true,\r\n maximumFractionDigits: 20\r\n})\r\n\r\nconst toNumeric = (value: NumberLike): number | null => {\r\n if (value === null || value === undefined || value === '') {\r\n return null\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null\r\n }\r\n\r\n const trimmed = value.trim()\r\n if (!trimmed) {\r\n return null\r\n }\r\n\r\n if (!/^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(trimmed)) {\r\n return null\r\n }\r\n\r\n const next = Number(trimmed)\r\n return Number.isFinite(next) ? next : null\r\n}\r\n\r\nconst toRawString = (value: number): string => {\r\n if (Object.is(value, -0)) {\r\n return '0'\r\n }\r\n\r\n return `${value}`\r\n}\r\n\r\nconst defaultElInputFormatter: FormatterFn = (value) => {\r\n const numericValue = toNumeric(value)\r\n if (numericValue === null) {\r\n return value\r\n }\r\n\r\n return defaultNumberFormatter.format(numericValue)\r\n}\r\n\r\nconst defaultElInputParser: ParserFn = (value) => value.replace(/,/g, '').trim()\r\n\r\nconst sanitizeNumericInput = (value: string): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n let filtered = value.replace(/[^\\d.-]/g, '')\r\n const isNegative = filtered.startsWith('-')\r\n filtered = filtered.replace(/-/g, '')\r\n\r\n const dotIndex = filtered.indexOf('.')\r\n if (dotIndex !== -1) {\r\n const integerPart = filtered.slice(0, dotIndex)\r\n const decimalPart = filtered.slice(dotIndex + 1).replace(/\\./g, '')\r\n filtered = `${integerPart}.${decimalPart}`\r\n }\r\n\r\n return `${isNegative ? '-' : ''}${filtered}`\r\n}\r\n\r\nconst isPartialNumber = (value: string): boolean => value === '-' || value === '.' || value === '-.'\r\n\r\nconst countFractionLength = (value: string): number => {\r\n const dotIndex = value.indexOf('.')\r\n if (dotIndex < 0) {\r\n return 0\r\n }\r\n\r\n return value.slice(dotIndex + 1).length\r\n}\r\n\r\nconst applyPrecision = (\r\n value: number,\r\n mode: FlInputNumberPrecisionMode,\r\n precision: number\r\n): number => {\r\n if (precision < 0) {\r\n return value\r\n }\r\n\r\n if (mode === 'ROUND') {\r\n return Number(value.toFixed(precision))\r\n }\r\n\r\n if (mode === 'FIXED') {\r\n const factor = 10 ** precision\r\n return Math.trunc(value * factor) / factor\r\n }\r\n\r\n return value\r\n}\r\n\r\nconst emitModelValue = (value: number | null) => {\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst emitStrictErrorState = (active: boolean) => {\r\n if (strictErrorActive.value === active) {\r\n return\r\n }\r\n\r\n strictErrorActive.value = active\r\n emit('update:isError', active)\r\n}\r\n\r\nconst clearModelValue = () => {\r\n emitModelValue(null)\r\n displayValue.value = ''\r\n}\r\n\r\nconst syncDisplayFromModel = (value: number | null) => {\r\n if (value === null) {\r\n displayValue.value = ''\r\n return\r\n }\r\n\r\n displayValue.value = toRawString(value)\r\n}\r\n\r\nconst handleCustomPayload = (rawValue: string, value: number | null) => {\r\n emit('custom-input', { rawValue, value })\r\n}\r\n\r\nconst handleInput = (value: unknown) => {\r\n const input = typeof value === 'string' ? value : ''\r\n const sanitized = sanitizeNumericInput(input)\r\n displayValue.value = sanitized\r\n\r\n if (strictErrorActive.value) {\r\n emitStrictErrorState(false)\r\n }\r\n\r\n if (!sanitized || isPartialNumber(sanitized)) {\r\n emitModelValue(null)\r\n handleCustomPayload(sanitized, null)\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(sanitized)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n handleCustomPayload('', null)\r\n return\r\n }\r\n\r\n emitModelValue(numericValue)\r\n handleCustomPayload(sanitized, numericValue)\r\n}\r\n\r\nconst handleStrictError = (rawValue: string, actualPrecision: number) => {\r\n emit('strict-error', {\r\n rawValue,\r\n precision: precisionValue.value,\r\n actualPrecision\r\n })\r\n emitStrictErrorState(true)\r\n clearModelValue()\r\n}\r\n\r\nconst handleChange = (value: unknown) => {\r\n const input = typeof value === 'string' ? sanitizeNumericInput(value) : ''\r\n\r\n if (!input || isPartialNumber(input)) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(input)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const actualPrecision = countFractionLength(input)\r\n if (actualPrecision > precisionValue.value && props.precisionMode === 'STRICT') {\r\n handleStrictError(input, actualPrecision)\r\n return\r\n }\r\n\r\n const nextValue = applyPrecision(numericValue, props.precisionMode, precisionValue.value)\r\n emitModelValue(nextValue)\r\n emitStrictErrorState(false)\r\n syncDisplayFromModel(nextValue)\r\n}\r\n\r\nconst handleFocus = (evt: FocusEvent) => {\r\n isFocused.value = true\r\n\r\n const current = toNumeric(props.modelValue)\r\n if (current !== null) {\r\n displayValue.value = toRawString(current)\r\n }\r\n\r\n invokeListener(rawAttrs.onFocus, evt)\r\n}\r\n\r\nconst handleBlur = (evt: FocusEvent) => {\r\n isFocused.value = false\r\n\r\n const current = toNumeric(props.modelValue)\r\n syncDisplayFromModel(current)\r\n invokeListener(rawAttrs.onBlur, evt)\r\n}\r\n\r\nconst resolveInputMode = (): InputMode => {\r\n const candidate = rawAttrs.inputmode\r\n if (typeof candidate === 'string' && validInputModes.has(candidate as InputMode)) {\r\n return candidate as InputMode\r\n }\r\n\r\n return 'decimal'\r\n}\r\n\r\nconst resolveFormatter = (): FormatterFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const formatter = rawAttrs.formatter\r\n if (typeof formatter === 'function') {\r\n return formatter as FormatterFn\r\n }\r\n\r\n return defaultElInputFormatter\r\n}\r\n\r\nconst resolveParser = (): ParserFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const parser = rawAttrs.parser\r\n if (typeof parser === 'function') {\r\n return parser as ParserFn\r\n }\r\n\r\n if (typeof rawAttrs.formatter === 'function') {\r\n return undefined\r\n }\r\n\r\n return defaultElInputParser\r\n}\r\n\r\nconst mergedInputAttrs = computed(() => {\r\n const originalInputListener = rawAttrs.onInput\r\n const originalChangeListener = rawAttrs.onChange\r\n\r\n return {\r\n ...rawAttrs,\r\n class: [\r\n ns.b(),\r\n rawAttrs.class,\r\n {\r\n 'is-error': mergedIsError.value,\r\n 'is-table': props.isTable\r\n }\r\n ],\r\n modelValue: displayValue.value,\r\n placeholder: resolvedPlaceholder.value,\r\n inputmode: resolveInputMode(),\r\n formatter: resolveFormatter(),\r\n parser: resolveParser(),\r\n 'onUpdate:modelValue': undefined,\r\n onInput: (value: string) => {\r\n handleInput(value)\r\n invokeListener(originalInputListener, value)\r\n },\r\n onChange: (value: string) => {\r\n handleChange(value)\r\n invokeListener(originalChangeListener, value)\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur\r\n }\r\n})\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const numericValue = toNumeric(value)\r\n\r\n if (numericValue === null) {\r\n displayValue.value = ''\r\n if (value !== null && value !== undefined && value !== '') {\r\n emitModelValue(null)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'string') {\r\n emitModelValue(numericValue)\r\n }\r\n\r\n syncDisplayFromModel(numericValue)\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isFormat,\r\n () => {\r\n const numericValue = toNumeric(props.modelValue)\r\n syncDisplayFromModel(numericValue)\r\n }\r\n)\r\n\r\nconst _myExpose = {\r\n /**\r\n * FlInputNumber 额外暴露的方法,用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInputNumber 额外暴露的示例数值。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n","import InputNumber from './src/input-number.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlInputNumber = withInstall(InputNumber)\r\n\r\nexport default FlInputNumber\r\n\r\nexport type {\r\n FlInputNumberCustomPayload,\r\n FlInputNumberEmits,\r\n FlInputNumberPrecisionMode,\r\n FlInputNumberProps,\r\n FlInputNumberStrictErrorPayload,\r\n InputNumberEmits,\r\n InputNumberProps\r\n} from './src/input-number'\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type FlDatePickerValue = string | number | Date | string[] | number[] | Date[] | null\r\n\r\nexport const flDatePickerProps = {\r\n /**\r\n * Bound value. Keeps the wrapper on explicit v-model contract.\r\n */\r\n modelValue: {\r\n type: [String, Number, Date, Array] as PropType<FlDatePickerValue>,\r\n default: null\r\n },\r\n /**\r\n * Whether the component is in error state.\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Whether the component is used in a table-cell context.\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const flDatePickerEmits = {\r\n /**\r\n * Model value update event.\r\n */\r\n 'update:modelValue': (_value: FlDatePickerValue) => true\r\n} as const\r\n\r\nexport type FlDatePickerProps = ExtractPublicPropTypes<typeof flDatePickerProps>\r\nexport type FlDatePickerEmits = typeof flDatePickerEmits\r\n\r\nexport type DatePickerProps = FlDatePickerProps\r\nexport type DatePickerEmits = FlDatePickerEmits\r\n","<template>\r\n <component :is=\"h(ElDatePicker, { ...mergedDatePickerAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElDatePicker } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, h, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flDatePickerEmits, flDatePickerProps } from './date-picker'\r\nimport type { FlDatePickerValue } from './date-picker'\r\n\r\ndefineOptions({\r\n name: 'FlDatePicker',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flDatePickerProps)\r\nconst emit = defineEmits(flDatePickerEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'date-picker',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst updateModelValue = (value: FlDatePickerValue) => {\r\n if (props.isError) {\r\n emit('update:modelValue', null)\r\n return\r\n }\r\n\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst mergedDatePickerAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n modelValue: props.modelValue,\r\n 'onUpdate:modelValue': updateModelValue,\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\nconst clearModelValue = () => {\r\n emit('update:modelValue', null)\r\n}\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDatePicker>)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElDatePicker, { ...mergedDatePickerAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElDatePicker } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, h, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flDatePickerEmits, flDatePickerProps } from './date-picker'\r\nimport type { FlDatePickerValue } from './date-picker'\r\n\r\ndefineOptions({\r\n name: 'FlDatePicker',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flDatePickerProps)\r\nconst emit = defineEmits(flDatePickerEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'date-picker',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst updateModelValue = (value: FlDatePickerValue) => {\r\n if (props.isError) {\r\n emit('update:modelValue', null)\r\n return\r\n }\r\n\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst mergedDatePickerAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n modelValue: props.modelValue,\r\n 'onUpdate:modelValue': updateModelValue,\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\nconst clearModelValue = () => {\r\n emit('update:modelValue', null)\r\n}\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDatePicker>)\r\n</script>\r\n","import DatePicker from './src/date-picker.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlDatePicker = withInstall(DatePicker)\r\n\r\nexport default FlDatePicker\r\n\r\nexport type {\r\n DatePickerEmits,\r\n DatePickerProps,\r\n FlDatePickerEmits,\r\n FlDatePickerProps\r\n} from './src/date-picker'\r\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flQrCodeErrorCorrectionLevels = ['L', 'M', 'Q', 'H'] as const\r\n\r\nexport type FlQrCodeErrorCorrectionLevel = (typeof flQrCodeErrorCorrectionLevels)[number]\r\n\r\nexport const flQrCodeTypes = ['canvas', 'svg'] as const\r\n\r\nexport type FlQrCodeType = (typeof flQrCodeTypes)[number]\r\n\r\nexport const flQrCodeProps = {\r\n /**\r\n * 需要编码到二维码中的字符串内容。\r\n */\r\n value: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 二维码外部显示尺寸,单位 px。\r\n */\r\n size: {\r\n type: Number,\r\n default: 100\r\n },\r\n /**\r\n * 深色模块颜色。\r\n */\r\n color: {\r\n type: String,\r\n default: '#000000'\r\n },\r\n /**\r\n * 浅色背景颜色。\r\n */\r\n backgroundColor: {\r\n type: String,\r\n default: '#ffffff'\r\n },\r\n /**\r\n * 二维码内容区域的内边距,单位 px。\r\n */\r\n padding: {\r\n type: Number,\r\n default: 12\r\n },\r\n /**\r\n * 容错等级。\r\n */\r\n errorCorrectionLevel: {\r\n type: String as PropType<FlQrCodeErrorCorrectionLevel>,\r\n default: 'M',\r\n validator: (value: string) =>\r\n flQrCodeErrorCorrectionLevels.includes(value as FlQrCodeErrorCorrectionLevel)\r\n },\r\n /**\r\n * 居中覆盖层图标地址。\r\n */\r\n iconSrc: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 居中覆盖层图标尺寸,单位 px。\r\n */\r\n iconSize: {\r\n type: Number,\r\n default: 24\r\n },\r\n /**\r\n * 图标底板背景色。\r\n */\r\n iconBackgroundColor: {\r\n type: String,\r\n default: '#ffffff'\r\n },\r\n /**\r\n * 图标底板圆角,单位 px。\r\n */\r\n iconBorderRadius: {\r\n type: Number,\r\n default: 4\r\n },\r\n /**\r\n * 输出方式。\r\n */\r\n type: {\r\n type: String as PropType<FlQrCodeType>,\r\n default: 'canvas',\r\n validator: (value: string) => flQrCodeTypes.includes(value as FlQrCodeType)\r\n }\r\n} as const\r\n\r\nexport const flQrCodeEmits = {} as const\r\n\r\nexport type FlQrCodeProps = ExtractPublicPropTypes<typeof flQrCodeProps>\r\nexport type FlQrCodeEmits = typeof flQrCodeEmits\r\n\r\nexport type QrCodeProps = FlQrCodeProps\r\nexport type QrCodeEmits = FlQrCodeEmits\r\nexport type QrCodeErrorCorrectionLevel = FlQrCodeErrorCorrectionLevel\r\nexport type QrCodeType = FlQrCodeType\r\n","<template>\r\n <div class=\"fl-qr-code\" v-bind=\"attrs\" :style=\"rootStyle\" role=\"img\">\r\n <div ref=\"renderRef\" class=\"fl-qr-code__render\" :style=\"renderStyle\" />\r\n <div v-if=\"shouldShowIcon\" class=\"fl-qr-code__icon\" :style=\"iconWrapStyle\">\r\n <img :src=\"props.iconSrc\" alt=\"\" class=\"fl-qr-code__icon-image\" :style=\"iconImageStyle\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport * as QRCode from 'qrcode'\r\nimport type { QRCodeRenderersOptions } from 'qrcode'\r\nimport type { CSSProperties } from 'vue'\r\nimport { computed, onBeforeUnmount, onMounted, ref, useAttrs, watch } from 'vue'\r\nimport { flQrCodeProps } from './qr-code'\r\n\r\ndefineOptions({\r\n name: 'FlQrCode',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flQrCodeProps)\r\nconst attrs = useAttrs()\r\n\r\nconst renderRef = ref<HTMLDivElement | null>(null)\r\nconst isMounted = ref(false)\r\nconst hasRendered = ref(false)\r\nlet renderToken = 0\r\n\r\nconst resolvedSize = computed(() =>\r\n Number.isFinite(props.size) && props.size > 0 ? Math.trunc(props.size) : 0\r\n)\r\nconst resolvedPadding = computed(() =>\r\n Number.isFinite(props.padding) && props.padding >= 0 ? Math.trunc(props.padding) : -1\r\n)\r\nconst resolvedRenderSize = computed(() => resolvedSize.value - resolvedPadding.value * 2)\r\nconst resolvedIconSize = computed(() =>\r\n Number.isFinite(props.iconSize) && props.iconSize > 0 ? Math.trunc(props.iconSize) : 0\r\n)\r\n\r\nconst rootStyle = computed<CSSProperties>(() => ({\r\n width: `${resolvedSize.value}px`,\r\n height: `${resolvedSize.value}px`,\r\n position: 'relative',\r\n display: 'inline-block',\r\n overflow: 'hidden',\r\n backgroundColor: props.backgroundColor\r\n}))\r\n\r\nconst renderStyle = computed<CSSProperties>(() => ({\r\n position: 'absolute',\r\n inset: `${resolvedPadding.value}px`,\r\n width: 'auto',\r\n height: 'auto'\r\n}))\r\n\r\nconst shouldShowIcon = computed(() => hasRendered.value && Boolean(props.iconSrc))\r\n\r\nconst iconWrapStyle = computed<CSSProperties>(() => ({\r\n position: 'absolute',\r\n left: '50%',\r\n top: '50%',\r\n width: `${resolvedIconSize.value}px`,\r\n height: `${resolvedIconSize.value}px`,\r\n transform: 'translate(-50%, -50%)',\r\n overflow: 'hidden',\r\n borderRadius: `${props.iconBorderRadius}px`,\r\n backgroundColor: props.iconBackgroundColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n pointerEvents: 'none'\r\n}))\r\n\r\nconst iconImageStyle = computed<CSSProperties>(() => ({\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n objectFit: 'cover'\r\n}))\r\n\r\nconst clearRender = () => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n container.innerHTML = ''\r\n hasRendered.value = false\r\n}\r\n\r\nconst buildRenderOptions = (): QRCodeRenderersOptions => ({\r\n width: resolvedRenderSize.value,\r\n margin: 0,\r\n errorCorrectionLevel: props.errorCorrectionLevel,\r\n color: {\r\n dark: props.color,\r\n light: props.backgroundColor\r\n }\r\n})\r\n\r\nconst renderCanvas = async (token: number) => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n container.innerHTML = ''\r\n const canvas = document.createElement('canvas')\r\n container.appendChild(canvas)\r\n\r\n await QRCode.toCanvas(canvas, props.value, buildRenderOptions())\r\n if (token !== renderToken) {\r\n return\r\n }\r\n\r\n hasRendered.value = true\r\n}\r\n\r\nconst renderSvg = async (token: number) => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n const svg = await QRCode.toString(props.value, {\r\n ...buildRenderOptions(),\r\n type: 'svg'\r\n })\r\n if (token !== renderToken) {\r\n return\r\n }\r\n\r\n container.innerHTML = svg\r\n hasRendered.value = true\r\n}\r\n\r\nconst renderCurrent = async () => {\r\n if (!isMounted.value) return\r\n\r\n const token = ++renderToken\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n clearRender()\r\n\r\n if (!props.value) return\r\n if (resolvedSize.value <= 0) {\r\n throw new RangeError('Invalid size')\r\n }\r\n if (resolvedPadding.value < 0) {\r\n throw new RangeError('Invalid padding')\r\n }\r\n if (resolvedPadding.value * 2 >= resolvedSize.value) {\r\n throw new RangeError('Padding is too large')\r\n }\r\n\r\n if (props.type === 'canvas') {\r\n await renderCanvas(token)\r\n } else {\r\n await renderSvg(token)\r\n }\r\n}\r\n\r\nwatch(\r\n () => [\r\n props.value,\r\n props.size,\r\n props.color,\r\n props.backgroundColor,\r\n props.padding,\r\n props.errorCorrectionLevel,\r\n props.type\r\n ],\r\n () => {\r\n if (!isMounted.value) return\r\n void renderCurrent()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonMounted(() => {\r\n isMounted.value = true\r\n void renderCurrent()\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n renderToken += 1\r\n clearRender()\r\n})\r\n</script>\r\n","<template>\r\n <div class=\"fl-qr-code\" v-bind=\"attrs\" :style=\"rootStyle\" role=\"img\">\r\n <div ref=\"renderRef\" class=\"fl-qr-code__render\" :style=\"renderStyle\" />\r\n <div v-if=\"shouldShowIcon\" class=\"fl-qr-code__icon\" :style=\"iconWrapStyle\">\r\n <img :src=\"props.iconSrc\" alt=\"\" class=\"fl-qr-code__icon-image\" :style=\"iconImageStyle\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport * as QRCode from 'qrcode'\r\nimport type { QRCodeRenderersOptions } from 'qrcode'\r\nimport type { CSSProperties } from 'vue'\r\nimport { computed, onBeforeUnmount, onMounted, ref, useAttrs, watch } from 'vue'\r\nimport { flQrCodeProps } from './qr-code'\r\n\r\ndefineOptions({\r\n name: 'FlQrCode',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flQrCodeProps)\r\nconst attrs = useAttrs()\r\n\r\nconst renderRef = ref<HTMLDivElement | null>(null)\r\nconst isMounted = ref(false)\r\nconst hasRendered = ref(false)\r\nlet renderToken = 0\r\n\r\nconst resolvedSize = computed(() =>\r\n Number.isFinite(props.size) && props.size > 0 ? Math.trunc(props.size) : 0\r\n)\r\nconst resolvedPadding = computed(() =>\r\n Number.isFinite(props.padding) && props.padding >= 0 ? Math.trunc(props.padding) : -1\r\n)\r\nconst resolvedRenderSize = computed(() => resolvedSize.value - resolvedPadding.value * 2)\r\nconst resolvedIconSize = computed(() =>\r\n Number.isFinite(props.iconSize) && props.iconSize > 0 ? Math.trunc(props.iconSize) : 0\r\n)\r\n\r\nconst rootStyle = computed<CSSProperties>(() => ({\r\n width: `${resolvedSize.value}px`,\r\n height: `${resolvedSize.value}px`,\r\n position: 'relative',\r\n display: 'inline-block',\r\n overflow: 'hidden',\r\n backgroundColor: props.backgroundColor\r\n}))\r\n\r\nconst renderStyle = computed<CSSProperties>(() => ({\r\n position: 'absolute',\r\n inset: `${resolvedPadding.value}px`,\r\n width: 'auto',\r\n height: 'auto'\r\n}))\r\n\r\nconst shouldShowIcon = computed(() => hasRendered.value && Boolean(props.iconSrc))\r\n\r\nconst iconWrapStyle = computed<CSSProperties>(() => ({\r\n position: 'absolute',\r\n left: '50%',\r\n top: '50%',\r\n width: `${resolvedIconSize.value}px`,\r\n height: `${resolvedIconSize.value}px`,\r\n transform: 'translate(-50%, -50%)',\r\n overflow: 'hidden',\r\n borderRadius: `${props.iconBorderRadius}px`,\r\n backgroundColor: props.iconBackgroundColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n pointerEvents: 'none'\r\n}))\r\n\r\nconst iconImageStyle = computed<CSSProperties>(() => ({\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n objectFit: 'cover'\r\n}))\r\n\r\nconst clearRender = () => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n container.innerHTML = ''\r\n hasRendered.value = false\r\n}\r\n\r\nconst buildRenderOptions = (): QRCodeRenderersOptions => ({\r\n width: resolvedRenderSize.value,\r\n margin: 0,\r\n errorCorrectionLevel: props.errorCorrectionLevel,\r\n color: {\r\n dark: props.color,\r\n light: props.backgroundColor\r\n }\r\n})\r\n\r\nconst renderCanvas = async (token: number) => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n container.innerHTML = ''\r\n const canvas = document.createElement('canvas')\r\n container.appendChild(canvas)\r\n\r\n await QRCode.toCanvas(canvas, props.value, buildRenderOptions())\r\n if (token !== renderToken) {\r\n return\r\n }\r\n\r\n hasRendered.value = true\r\n}\r\n\r\nconst renderSvg = async (token: number) => {\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n const svg = await QRCode.toString(props.value, {\r\n ...buildRenderOptions(),\r\n type: 'svg'\r\n })\r\n if (token !== renderToken) {\r\n return\r\n }\r\n\r\n container.innerHTML = svg\r\n hasRendered.value = true\r\n}\r\n\r\nconst renderCurrent = async () => {\r\n if (!isMounted.value) return\r\n\r\n const token = ++renderToken\r\n const container = renderRef.value\r\n if (!container) return\r\n\r\n clearRender()\r\n\r\n if (!props.value) return\r\n if (resolvedSize.value <= 0) {\r\n throw new RangeError('Invalid size')\r\n }\r\n if (resolvedPadding.value < 0) {\r\n throw new RangeError('Invalid padding')\r\n }\r\n if (resolvedPadding.value * 2 >= resolvedSize.value) {\r\n throw new RangeError('Padding is too large')\r\n }\r\n\r\n if (props.type === 'canvas') {\r\n await renderCanvas(token)\r\n } else {\r\n await renderSvg(token)\r\n }\r\n}\r\n\r\nwatch(\r\n () => [\r\n props.value,\r\n props.size,\r\n props.color,\r\n props.backgroundColor,\r\n props.padding,\r\n props.errorCorrectionLevel,\r\n props.type\r\n ],\r\n () => {\r\n if (!isMounted.value) return\r\n void renderCurrent()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonMounted(() => {\r\n isMounted.value = true\r\n void renderCurrent()\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n renderToken += 1\r\n clearRender()\r\n})\r\n</script>\r\n","import { withInstall } from '@falcon-ui/utils'\r\nimport QrCode from './src/qr-code.vue'\r\n\r\nexport const FlQrCode = withInstall(QrCode)\r\n\r\nexport default FlQrCode\r\n\r\nexport type {\r\n FlQrCodeEmits,\r\n FlQrCodeErrorCorrectionLevel,\r\n FlQrCodeProps,\r\n FlQrCodeType,\r\n QrCodeEmits,\r\n QrCodeErrorCorrectionLevel,\r\n QrCodeProps,\r\n QrCodeType\r\n} from './src/qr-code'\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flBarcodeFormats = ['CODE128', 'CODE39', 'EAN13', 'EAN8', 'UPCA', 'UPCE'] as const\r\n\r\nexport type FlBarcodeFormat = (typeof flBarcodeFormats)[number]\r\n\r\nexport const flBarcodeTextAligns = ['left', 'center', 'right'] as const\r\n\r\nexport type FlBarcodeTextAlign = (typeof flBarcodeTextAligns)[number]\r\n\r\nexport const flBarcodeTextPositions = ['top', 'bottom'] as const\r\n\r\nexport type FlBarcodeTextPosition = (typeof flBarcodeTextPositions)[number]\r\n\r\nexport const flBarcodeProps = {\r\n /**\r\n * Barcode payload.\r\n */\r\n value: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * Supported barcode format.\r\n */\r\n format: {\r\n type: String as PropType<FlBarcodeFormat>,\r\n default: 'CODE128',\r\n validator: (value: string) => flBarcodeFormats.includes(value as FlBarcodeFormat)\r\n },\r\n /**\r\n * Width of each bar.\r\n */\r\n width: {\r\n type: Number,\r\n default: 2\r\n },\r\n /**\r\n * Barcode height.\r\n */\r\n height: {\r\n type: Number,\r\n default: 100\r\n },\r\n /**\r\n * Bar color.\r\n */\r\n color: {\r\n type: String,\r\n default: '#000000'\r\n },\r\n /**\r\n * Background color.\r\n */\r\n backgroundColor: {\r\n type: String,\r\n default: '#ffffff'\r\n },\r\n /**\r\n * Whether to display readable text.\r\n */\r\n displayValue: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Custom text. Falls back to value when empty.\r\n */\r\n text: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * Text font family.\r\n */\r\n font: {\r\n type: String,\r\n default: 'monospace'\r\n },\r\n /**\r\n * Text font style flags.\r\n */\r\n fontOptions: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * Text font size.\r\n */\r\n fontSize: {\r\n type: Number,\r\n default: 20\r\n },\r\n /**\r\n * Text alignment.\r\n */\r\n textAlign: {\r\n type: String as PropType<FlBarcodeTextAlign>,\r\n default: 'center',\r\n validator: (value: string) => flBarcodeTextAligns.includes(value as FlBarcodeTextAlign)\r\n },\r\n /**\r\n * Text position.\r\n */\r\n textPosition: {\r\n type: String as PropType<FlBarcodeTextPosition>,\r\n default: 'bottom',\r\n validator: (value: string) => flBarcodeTextPositions.includes(value as FlBarcodeTextPosition)\r\n },\r\n /**\r\n * Distance between barcode bars and text.\r\n */\r\n textMargin: {\r\n type: Number,\r\n default: 2\r\n },\r\n /**\r\n * Global margin around the barcode.\r\n */\r\n margin: {\r\n type: Number,\r\n default: 10\r\n },\r\n /**\r\n * Overrides the top margin when provided.\r\n */\r\n marginTop: {\r\n type: Number,\r\n default: undefined\r\n },\r\n /**\r\n * Overrides the right margin when provided.\r\n */\r\n marginRight: {\r\n type: Number,\r\n default: undefined\r\n },\r\n /**\r\n * Overrides the bottom margin when provided.\r\n */\r\n marginBottom: {\r\n type: Number,\r\n default: undefined\r\n },\r\n /**\r\n * Overrides the left margin when provided.\r\n */\r\n marginLeft: {\r\n type: Number,\r\n default: undefined\r\n }\r\n} as const\r\n\r\nexport type FlBarcodeProps = ExtractPublicPropTypes<typeof flBarcodeProps>\r\n\r\nexport type BarcodeProps = FlBarcodeProps\r\n","<template>\r\n <svg ref=\"svgRef\" class=\"fl-barcode\" v-bind=\"attrs\"></svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onBeforeUnmount, onMounted, ref, useAttrs, watch } from 'vue'\r\nimport { flBarcodeProps } from './barcode'\r\nimport type { FlBarcodeFormat } from './barcode'\r\n\r\ndefineOptions({\r\n name: 'FlBarcode',\r\n inheritAttrs: false\r\n})\r\n\r\ntype JsBarcodeRenderer = (\r\n element: SVGSVGElement,\r\n value: string,\r\n options: Record<string, unknown>\r\n) => void\r\n\r\ntype JsBarcodeModule = {\r\n default: JsBarcodeRenderer\r\n}\r\n\r\nconst props = defineProps(flBarcodeProps)\r\nconst attrs = useAttrs()\r\nconst svgRef = ref<SVGSVGElement | null>(null)\r\n\r\nlet renderVersion = 0\r\nlet jsBarcodeModulePromise: Promise<JsBarcodeModule> | null = null\r\n\r\nconst clearSvg = (svg: SVGSVGElement) => {\r\n svg.innerHTML = ''\r\n}\r\n\r\nconst resolveFormat = (format: FlBarcodeFormat): string => {\r\n const normalized = String(format).toUpperCase()\r\n\r\n if (normalized === 'UPCA') {\r\n return 'UPC'\r\n }\r\n\r\n return normalized\r\n}\r\n\r\nconst buildOptions = (): Record<string, unknown> => {\r\n const options: Record<string, unknown> = {\r\n format: resolveFormat(props.format),\r\n width: props.width,\r\n height: props.height,\r\n lineColor: props.color,\r\n background: props.backgroundColor,\r\n displayValue: props.displayValue,\r\n text: props.text === '' ? undefined : props.text,\r\n font: props.font,\r\n fontOptions: props.fontOptions,\r\n fontSize: props.fontSize,\r\n textAlign: props.textAlign,\r\n textPosition: props.textPosition,\r\n textMargin: props.textMargin,\r\n margin: props.margin\r\n }\r\n\r\n if (props.marginTop !== undefined) {\r\n options.marginTop = props.marginTop\r\n }\r\n\r\n if (props.marginRight !== undefined) {\r\n options.marginRight = props.marginRight\r\n }\r\n\r\n if (props.marginBottom !== undefined) {\r\n options.marginBottom = props.marginBottom\r\n }\r\n\r\n if (props.marginLeft !== undefined) {\r\n options.marginLeft = props.marginLeft\r\n }\r\n\r\n return options\r\n}\r\n\r\nconst loadJsBarcode = async (): Promise<JsBarcodeRenderer> => {\r\n if (!jsBarcodeModulePromise) {\r\n jsBarcodeModulePromise = import('jsbarcode') as Promise<JsBarcodeModule>\r\n }\r\n\r\n const module = await jsBarcodeModulePromise\r\n return module.default\r\n}\r\n\r\nconst renderBarcode = async () => {\r\n const currentVersion = ++renderVersion\r\n const svg = svgRef.value\r\n\r\n if (!svg) {\r\n return\r\n }\r\n\r\n clearSvg(svg)\r\n\r\n if (props.value === '') {\r\n return\r\n }\r\n\r\n const JsBarcode = await loadJsBarcode()\r\n if (currentVersion !== renderVersion) {\r\n return\r\n }\r\n\r\n JsBarcode(svg, props.value, buildOptions())\r\n}\r\n\r\nconst watchSources = () => [\r\n props.value,\r\n props.format,\r\n props.width,\r\n props.height,\r\n props.color,\r\n props.backgroundColor,\r\n props.displayValue,\r\n props.text,\r\n props.font,\r\n props.fontOptions,\r\n props.fontSize,\r\n props.textAlign,\r\n props.textPosition,\r\n props.textMargin,\r\n props.margin,\r\n props.marginTop,\r\n props.marginRight,\r\n props.marginBottom,\r\n props.marginLeft\r\n]\r\n\r\nonMounted(() => {\r\n void renderBarcode()\r\n})\r\n\r\nwatch(\r\n watchSources,\r\n () => {\r\n void renderBarcode()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n renderVersion += 1\r\n})\r\n</script>\r\n","<template>\r\n <svg ref=\"svgRef\" class=\"fl-barcode\" v-bind=\"attrs\"></svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onBeforeUnmount, onMounted, ref, useAttrs, watch } from 'vue'\r\nimport { flBarcodeProps } from './barcode'\r\nimport type { FlBarcodeFormat } from './barcode'\r\n\r\ndefineOptions({\r\n name: 'FlBarcode',\r\n inheritAttrs: false\r\n})\r\n\r\ntype JsBarcodeRenderer = (\r\n element: SVGSVGElement,\r\n value: string,\r\n options: Record<string, unknown>\r\n) => void\r\n\r\ntype JsBarcodeModule = {\r\n default: JsBarcodeRenderer\r\n}\r\n\r\nconst props = defineProps(flBarcodeProps)\r\nconst attrs = useAttrs()\r\nconst svgRef = ref<SVGSVGElement | null>(null)\r\n\r\nlet renderVersion = 0\r\nlet jsBarcodeModulePromise: Promise<JsBarcodeModule> | null = null\r\n\r\nconst clearSvg = (svg: SVGSVGElement) => {\r\n svg.innerHTML = ''\r\n}\r\n\r\nconst resolveFormat = (format: FlBarcodeFormat): string => {\r\n const normalized = String(format).toUpperCase()\r\n\r\n if (normalized === 'UPCA') {\r\n return 'UPC'\r\n }\r\n\r\n return normalized\r\n}\r\n\r\nconst buildOptions = (): Record<string, unknown> => {\r\n const options: Record<string, unknown> = {\r\n format: resolveFormat(props.format),\r\n width: props.width,\r\n height: props.height,\r\n lineColor: props.color,\r\n background: props.backgroundColor,\r\n displayValue: props.displayValue,\r\n text: props.text === '' ? undefined : props.text,\r\n font: props.font,\r\n fontOptions: props.fontOptions,\r\n fontSize: props.fontSize,\r\n textAlign: props.textAlign,\r\n textPosition: props.textPosition,\r\n textMargin: props.textMargin,\r\n margin: props.margin\r\n }\r\n\r\n if (props.marginTop !== undefined) {\r\n options.marginTop = props.marginTop\r\n }\r\n\r\n if (props.marginRight !== undefined) {\r\n options.marginRight = props.marginRight\r\n }\r\n\r\n if (props.marginBottom !== undefined) {\r\n options.marginBottom = props.marginBottom\r\n }\r\n\r\n if (props.marginLeft !== undefined) {\r\n options.marginLeft = props.marginLeft\r\n }\r\n\r\n return options\r\n}\r\n\r\nconst loadJsBarcode = async (): Promise<JsBarcodeRenderer> => {\r\n if (!jsBarcodeModulePromise) {\r\n jsBarcodeModulePromise = import('jsbarcode') as Promise<JsBarcodeModule>\r\n }\r\n\r\n const module = await jsBarcodeModulePromise\r\n return module.default\r\n}\r\n\r\nconst renderBarcode = async () => {\r\n const currentVersion = ++renderVersion\r\n const svg = svgRef.value\r\n\r\n if (!svg) {\r\n return\r\n }\r\n\r\n clearSvg(svg)\r\n\r\n if (props.value === '') {\r\n return\r\n }\r\n\r\n const JsBarcode = await loadJsBarcode()\r\n if (currentVersion !== renderVersion) {\r\n return\r\n }\r\n\r\n JsBarcode(svg, props.value, buildOptions())\r\n}\r\n\r\nconst watchSources = () => [\r\n props.value,\r\n props.format,\r\n props.width,\r\n props.height,\r\n props.color,\r\n props.backgroundColor,\r\n props.displayValue,\r\n props.text,\r\n props.font,\r\n props.fontOptions,\r\n props.fontSize,\r\n props.textAlign,\r\n props.textPosition,\r\n props.textMargin,\r\n props.margin,\r\n props.marginTop,\r\n props.marginRight,\r\n props.marginBottom,\r\n props.marginLeft\r\n]\r\n\r\nonMounted(() => {\r\n void renderBarcode()\r\n})\r\n\r\nwatch(\r\n watchSources,\r\n () => {\r\n void renderBarcode()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n renderVersion += 1\r\n})\r\n</script>\r\n","import Barcode from './src/barcode.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlBarcode = withInstall(Barcode)\r\n\r\nexport default FlBarcode\r\n\r\nexport type {\r\n BarcodeProps,\r\n FlBarcodeFormat,\r\n FlBarcodeProps,\r\n FlBarcodeTextAlign,\r\n FlBarcodeTextPosition\r\n} from './src/barcode'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flSelectProps = {\r\n /**\r\n * 是否进入错误态。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否用于表格单元格内选择场景。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const flSelectEmits = {} as const\r\n\r\nexport type FlSelectProps = ExtractPublicPropTypes<typeof flSelectProps>\r\nexport type FlSelectEmits = typeof flSelectEmits\r\nexport interface FlSelectExpose {\r\n focus: () => void\r\n blur: () => void\r\n selectedLabel?: string | string[]\r\n toggleMenu?: (event?: Event) => void\r\n handleClearClick?: (event: Event) => void\r\n}\r\n\r\nexport type SelectProps = FlSelectProps\r\nexport type SelectEmits = FlSelectEmits\r\nexport type SelectExpose = FlSelectExpose\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n","import Select from './src/select.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\nimport type { SFCWithInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlSelect: SFCWithInstall<typeof Select> = withInstall(Select)\r\n\r\nexport default FlSelect\r\n\r\nexport type {\r\n FlSelectEmits,\r\n FlSelectExpose,\r\n FlSelectProps,\r\n SelectEmits,\r\n SelectExpose,\r\n SelectProps\r\n} from './src/select'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\nimport type { TreeSelectInstance } from 'element-plus'\r\n\r\nexport const treeSelectProps = {\r\n /**\r\n * 是否进入错误态。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否用于表格单元格内树选择场景。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const treeSelectEmits = {} as const\r\n\r\nexport type TreeSelectProps = ExtractPublicPropTypes<typeof treeSelectProps>\r\nexport type TreeSelectEmits = typeof treeSelectEmits\r\nexport interface TreeSelectExpose extends TreeSelectInstance {\r\n focus: () => void\r\n blur: () => void\r\n selectedLabel?: string | string[]\r\n}\r\n","<template>\r\n <component :is=\"h(ElTreeSelect, { ...mergedTreeSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElTreeSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { TreeSelectExpose } from './tree-select'\r\nimport { treeSelectEmits, treeSelectProps } from './tree-select'\r\n\r\ndefineOptions({\r\n name: 'FlTreeSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(treeSelectProps)\r\ndefineEmits(treeSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'tree-select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedTreeSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as TreeSelectExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElTreeSelect, { ...mergedTreeSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElTreeSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { TreeSelectExpose } from './tree-select'\r\nimport { treeSelectEmits, treeSelectProps } from './tree-select'\r\n\r\ndefineOptions({\r\n name: 'FlTreeSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(treeSelectProps)\r\ndefineEmits(treeSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'tree-select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedTreeSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as TreeSelectExpose)\r\n</script>\r\n","import TreeSelect from './src/tree-select.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\nimport type { SFCWithInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlTreeSelect: SFCWithInstall<typeof TreeSelect> = withInstall(TreeSelect)\r\n\r\nexport default FlTreeSelect\r\n\r\nexport type { TreeSelectEmits, TreeSelectExpose, TreeSelectProps } from './src/tree-select'\r\n","import { Loading } from '@element-plus/icons-vue'\r\nimport type {\r\n Component,\r\n ComponentPublicInstance,\r\n CSSProperties,\r\n ExtractPublicPropTypes,\r\n PropType\r\n} from 'vue'\r\nimport type {\r\n TreeClassValue,\r\n TreeData,\r\n TreeIndex,\r\n TreeKey,\r\n TreeNode,\r\n TreeNodeClassName,\r\n TreeNodeClassNameInfo,\r\n TreeNodeModel,\r\n TreeNodeProps,\r\n TreeSemanticDOM,\r\n TreeSemanticRecord,\r\n TreeShowLine,\r\n TreeShowLineOptions,\r\n TreeSwitcherIconMode\r\n} from './tree-types'\r\n\r\nexport interface TreeCheckedKeysObject {\r\n checked: TreeKey[]\r\n halfChecked: TreeKey[]\r\n}\r\n\r\nexport type TreeCheckedKeys = TreeKey[] | TreeCheckedKeysObject\r\n\r\nexport type TreeLoadData = (node: TreeNode) => Promise<unknown>\r\n\r\nexport type TreeSwitcherLoadingIcon = Component\r\n\r\nexport type TreeFilterTreeNode = (node: TreeNode) => boolean\r\n\r\nexport type TreeAllowDropType = 'prev' | 'inner' | 'next'\r\n\r\nexport type TreeNodeDropType = 'before' | 'after' | 'inner' | 'none'\r\n\r\nexport type TreeAllowDrag = (node: TreeNode) => boolean\r\n\r\nexport type TreeAllowDrop = (\r\n draggingNode: TreeNode,\r\n dropNode: TreeNode,\r\n type: TreeAllowDropType\r\n) => boolean\r\n\r\nexport type TreeInteractionEvent = MouseEvent | KeyboardEvent\r\n\r\nexport type TreeScrollAlign = 'top' | 'bottom' | 'auto'\r\n\r\nexport interface TreeScrollToOptions {\r\n key: TreeKey\r\n align?: TreeScrollAlign\r\n offset?: number\r\n}\r\n\r\nexport interface TreeExpose {\r\n scrollTo: (options: TreeScrollToOptions) => void\r\n}\r\n\r\nexport interface TreeInteractionStateConfig {\r\n disabledKeys?: TreeKey[]\r\n unselectableKeys?: TreeKey[]\r\n disabledCheckboxKeys?: TreeKey[]\r\n hiddenCheckboxKeys?: TreeKey[]\r\n}\r\n\r\nexport interface TreeInteractionStateSets {\r\n disabledKeySet: Set<TreeKey>\r\n unselectableKeySet: Set<TreeKey>\r\n disabledCheckboxKeySet: Set<TreeKey>\r\n hiddenCheckboxKeySet: Set<TreeKey>\r\n}\r\n\r\n/**\r\n * Tree 语义化样式回调接收当前组件公开 props 快照。\r\n */\r\nexport interface TreeSemanticInfo {\r\n props: TreeProps\r\n}\r\n\r\ninterface TreeClassNamesResolver {\r\n (info: TreeSemanticInfo): TreeSemanticRecord<TreeClassValue>\r\n}\r\n\r\ninterface TreeStylesResolver {\r\n (info: TreeSemanticInfo): TreeSemanticRecord<CSSProperties>\r\n}\r\n\r\nexport type TreeClassNames = TreeSemanticRecord<TreeClassValue> | TreeClassNamesResolver\r\n\r\nexport type TreeStyles = TreeSemanticRecord<CSSProperties> | TreeStylesResolver\r\n\r\n/**\r\n * 首版使用稳定的默认字段映射,保证常规树数据可直接渲染。\r\n */\r\nexport const treeNodePropsDefaults: Required<TreeNodeProps> = {\r\n label: 'label',\r\n children: 'children',\r\n isLeaf: 'isLeaf'\r\n}\r\n\r\n/**\r\n * 阶段 3 在基础树结构之外,正式开放默认展开与受控展开相关契约。\r\n */\r\nexport const treeProps = {\r\n data: {\r\n type: Array as PropType<TreeData[]>,\r\n default: () => []\r\n },\r\n showLine: {\r\n type: [Boolean, Object] as PropType<TreeShowLine>,\r\n default: false\r\n },\r\n switcherIcon: {\r\n type: String as PropType<TreeSwitcherIconMode>,\r\n default: 'arrow'\r\n },\r\n switcherLoadingIcon: {\r\n type: [Object, Function] as PropType<TreeSwitcherLoadingIcon>,\r\n default: Loading\r\n },\r\n selectable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n multiple: {\r\n type: Boolean,\r\n default: false\r\n },\r\n checkable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n checkStrictly: {\r\n type: Boolean,\r\n default: false\r\n },\r\n props: {\r\n type: Object as PropType<TreeNodeProps>,\r\n default: () => ({ ...treeNodePropsDefaults })\r\n },\r\n classNames: {\r\n type: [Object, Function] as PropType<TreeClassNames>\r\n },\r\n nodeClassName: {\r\n type: Function as PropType<TreeNodeClassName>\r\n },\r\n styles: {\r\n type: [Object, Function] as PropType<TreeStyles>\r\n },\r\n defaultExpandAll: {\r\n type: Boolean,\r\n default: false\r\n },\r\n defaultExpandedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n expandedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n autoExpandParent: {\r\n type: Boolean,\r\n default: false\r\n },\r\n defaultExpandParent: {\r\n type: Boolean,\r\n default: true\r\n },\r\n accordion: {\r\n type: Boolean,\r\n default: false\r\n },\r\n defaultSelectedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n selectedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n disabledKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n unselectableKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n defaultCheckedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n checkedKeys: {\r\n type: [Array, Object] as PropType<TreeCheckedKeys>\r\n },\r\n disabledCheckboxKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n hiddenCheckboxKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n loadData: {\r\n type: Function as PropType<TreeLoadData>\r\n },\r\n loadedKeys: {\r\n type: Array as PropType<TreeKey[]>\r\n },\r\n draggable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n allowDrag: {\r\n type: Function as PropType<TreeAllowDrag>\r\n },\r\n allowDrop: {\r\n type: Function as PropType<TreeAllowDrop>\r\n },\r\n filterTreeNode: {\r\n type: Function as PropType<TreeFilterTreeNode>\r\n }\r\n} as const\r\n\r\nexport type TreeProps = ExtractPublicPropTypes<typeof treeProps>\r\n\r\n/**\r\n * 树节点展开事件统一返回本次节点状态与当前源展开键集合。\r\n */\r\nexport interface TreeExpandEvent {\r\n expanded: boolean\r\n node: TreeData\r\n key: TreeKey\r\n expandedKeys: TreeKey[]\r\n}\r\n\r\n/**\r\n * 树节点选中事件统一返回当前节点结果与最新选中集合。\r\n */\r\nexport interface TreeSelectEvent {\r\n selected: boolean\r\n node: TreeNode\r\n selectedNodes: TreeNode[]\r\n key: TreeKey\r\n event: TreeInteractionEvent\r\n}\r\n\r\n/**\r\n * 树节点勾选事件统一返回当前节点结果与最新勾选集合。\r\n */\r\nexport interface TreeCheckEvent {\r\n checked: boolean\r\n node: TreeNode\r\n checkedNodes: TreeNode[]\r\n halfCheckedKeys: TreeKey[]\r\n key: TreeKey\r\n event: TreeInteractionEvent\r\n}\r\n\r\n/**\r\n * 树节点异步加载完成事件统一返回当前节点与最新已加载键集合。\r\n */\r\nexport interface TreeLoadEvent {\r\n node: TreeNode\r\n key: TreeKey\r\n loadedKeys: TreeKey[]\r\n}\r\n\r\n/**\r\n * 节点组件实例通过 Vue public instance 向外暴露。\r\n */\r\nexport type TreeNodeInstance = ComponentPublicInstance | null\r\n\r\nexport type TreeExpandedNode = TreeNode & { expanded: boolean }\r\n\r\n/**\r\n * `node-click` 事件固定采用 Element Plus 风格的多参数出参。\r\n */\r\nexport type TreeNodeClickArgs = [\r\n data: TreeData,\r\n node: TreeNode,\r\n component: TreeNodeInstance,\r\n event: TreeInteractionEvent\r\n]\r\n\r\n/**\r\n * `dblclick` 事件固定采用 Element Plus 风格的多参数出参。\r\n */\r\nexport type TreeNodeDblclickArgs = [\r\n data: TreeData,\r\n node: TreeNode,\r\n component: TreeNodeInstance,\r\n event: MouseEvent\r\n]\r\n\r\nexport type TreeNodeRightClickArgs = [\r\n data: TreeData,\r\n node: TreeNode,\r\n component: TreeNodeInstance,\r\n event: MouseEvent\r\n]\r\n\r\n/**\r\n * `node-expand` / `node-collapse` 事件固定采用 Element Plus 风格的多参数出参。\r\n */\r\nexport type TreeNodeToggleArgs = [\r\n data: TreeData,\r\n node: TreeExpandedNode,\r\n instance: TreeNodeInstance\r\n]\r\n\r\n/**\r\n * `select` 事件固定采用双参数出参。\r\n */\r\nexport type TreeSelectArgs = [selectedKeys: TreeKey[], event: TreeSelectEvent]\r\n\r\n/**\r\n * `check` 事件固定采用双参数出参。\r\n */\r\nexport type TreeCheckArgs = [checkedKeys: TreeCheckedKeys, event: TreeCheckEvent]\r\n\r\n/**\r\n * `load` 事件固定采用双参数出参。\r\n */\r\nexport type TreeLoadArgs = [loadedKeys: TreeKey[], event: TreeLoadEvent]\r\n\r\n/**\r\n * `node-drag-start` 事件对齐 Element Plus 多参数出参。\r\n */\r\nexport type TreeNodeDragStartArgs = [node: TreeNode, event: DragEvent]\r\n\r\n/**\r\n * `node-drag-enter` / `node-drag-over` / `node-drag-leave` 事件对齐 Element Plus。\r\n */\r\nexport type TreeNodeDragTargetArgs = [draggingNode: TreeNode, dropNode: TreeNode, event: DragEvent]\r\n\r\n/**\r\n * `node-drag-end` 事件对齐 Element Plus。\r\n */\r\nexport type TreeNodeDragEndArgs = [\r\n draggingNode: TreeNode,\r\n dropNode: TreeNode | null,\r\n dropType: TreeNodeDropType,\r\n event: DragEvent\r\n]\r\n\r\n/**\r\n * `node-drop` 仅在非 none 落点触发。\r\n */\r\nexport type TreeNodeDropArgs = [\r\n draggingNode: TreeNode,\r\n dropNode: TreeNode,\r\n dropType: Exclude<TreeNodeDropType, 'none'>,\r\n event: DragEvent\r\n]\r\n\r\n/**\r\n * 判断当前值是否为普通对象。\r\n */\r\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\r\n value !== null && typeof value === 'object'\r\n\r\n/**\r\n * 判断当前值是否为树组件允许使用的节点键类型。\r\n */\r\nexport const isTreeKey = (value: unknown): value is TreeKey =>\r\n typeof value === 'string' || typeof value === 'number'\r\n\r\n/**\r\n * 判断当前值是否为 `{ checked, halfChecked }` 形态的勾选结果对象。\r\n */\r\nexport const isTreeCheckedKeysObject = (value: unknown): value is TreeCheckedKeysObject =>\r\n isRecord(value) &&\r\n Array.isArray(value.checked) &&\r\n value.checked.every((item) => isTreeKey(item)) &&\r\n Array.isArray(value.halfChecked) &&\r\n value.halfChecked.every((item) => isTreeKey(item))\r\n\r\n/**\r\n * 判断当前值是否满足树组件允许的勾选结果输入形态。\r\n */\r\nexport const isTreeCheckedKeys = (value: unknown): value is TreeCheckedKeys =>\r\n (Array.isArray(value) && value.every((item) => isTreeKey(item))) || isTreeCheckedKeysObject(value)\r\n\r\n/**\r\n * 判断当前值是否为树节点组件实例。\r\n */\r\nconst isTreeNodeInstance = (value: unknown): value is TreeNodeInstance =>\r\n value === null || isRecord(value)\r\n\r\n/**\r\n * 判断当前值是否满足对外节点对象的最小结构。\r\n */\r\nconst isTreeNode = (value: unknown): value is TreeNode =>\r\n isRecord(value) &&\r\n isTreeKey(value.key) &&\r\n typeof value.level === 'number' &&\r\n typeof value.label === 'string' &&\r\n typeof value.disabled === 'boolean' &&\r\n typeof value.selectable === 'boolean' &&\r\n typeof value.checkboxDisabled === 'boolean' &&\r\n typeof value.checkboxVisible === 'boolean' &&\r\n typeof value.isLeaf === 'boolean' &&\r\n Array.isArray(value.childNodes) &&\r\n 'data' in value\r\n\r\n/**\r\n * 验证 `node-click` 事件的四元组参数。\r\n */\r\nconst isTreeNodeClickArgs = (\r\n data: TreeData,\r\n node: TreeNode,\r\n component: TreeNodeInstance,\r\n event: TreeInteractionEvent\r\n) =>\r\n isRecord(data) &&\r\n isTreeNode(node) &&\r\n isTreeNodeInstance(component) &&\r\n isRecord(event) &&\r\n typeof event.type === 'string'\r\n\r\n/**\r\n * 验证 `dblclick` 事件的四元组参数。\r\n */\r\nconst isTreeNodeDblclickArgs = (\r\n data: TreeData,\r\n node: TreeNode,\r\n component: TreeNodeInstance,\r\n event: MouseEvent\r\n) =>\r\n isRecord(data) &&\r\n isTreeNode(node) &&\r\n isTreeNodeInstance(component) &&\r\n isRecord(event) &&\r\n typeof event.type === 'string'\r\n\r\nconst isTreeNodeRightClickArgs = isTreeNodeDblclickArgs\r\n\r\n/**\r\n * 验证 `node-expand` / `node-collapse` 事件的三元组参数。\r\n */\r\nconst isTreeNodeToggleArgs = (data: TreeData, node: TreeExpandedNode, instance: TreeNodeInstance) =>\r\n isRecord(data) &&\r\n isTreeNode(node) &&\r\n typeof node.expanded === 'boolean' &&\r\n isTreeNodeInstance(instance)\r\n\r\n/**\r\n * 验证 `select` 事件的双元组参数。\r\n */\r\nconst isTreeSelectArgs = (selectedKeys: TreeKey[], event: TreeSelectEvent) =>\r\n Array.isArray(selectedKeys) &&\r\n selectedKeys.every((item) => isTreeKey(item)) &&\r\n typeof event.selected === 'boolean' &&\r\n isTreeKey(event.key) &&\r\n isTreeNode(event.node) &&\r\n Array.isArray(event.selectedNodes) &&\r\n event.selectedNodes.every((item) => isTreeNode(item)) &&\r\n isRecord(event.event) &&\r\n typeof event.event.type === 'string'\r\n\r\n/**\r\n * 验证 `check` 事件的双元组参数。\r\n */\r\nconst isTreeCheckArgs = (checkedKeys: TreeCheckedKeys, event: TreeCheckEvent) =>\r\n isTreeCheckedKeys(checkedKeys) &&\r\n typeof event.checked === 'boolean' &&\r\n isTreeKey(event.key) &&\r\n isTreeNode(event.node) &&\r\n Array.isArray(event.checkedNodes) &&\r\n event.checkedNodes.every((item) => isTreeNode(item)) &&\r\n Array.isArray(event.halfCheckedKeys) &&\r\n event.halfCheckedKeys.every((item) => isTreeKey(item)) &&\r\n isRecord(event.event) &&\r\n typeof event.event.type === 'string'\r\n\r\n/**\r\n * 验证 `load` 事件的双元组参数。\r\n */\r\nconst isTreeLoadArgs = (loadedKeys: TreeKey[], event: TreeLoadEvent) =>\r\n Array.isArray(loadedKeys) &&\r\n loadedKeys.every((item) => isTreeKey(item)) &&\r\n isTreeKey(event.key) &&\r\n isTreeNode(event.node) &&\r\n Array.isArray(event.loadedKeys) &&\r\n event.loadedKeys.every((item) => isTreeKey(item))\r\n\r\nconst isDragEventLike = (event: DragEvent) => isRecord(event) && typeof event.type === 'string'\r\n\r\nconst isTreeNodeDropType = (dropType: unknown): dropType is TreeNodeDropType =>\r\n dropType === 'before' || dropType === 'after' || dropType === 'inner' || dropType === 'none'\r\n\r\nconst isTreeNodeNonNoneDropType = (\r\n dropType: unknown\r\n): dropType is Exclude<TreeNodeDropType, 'none'> =>\r\n dropType === 'before' || dropType === 'after' || dropType === 'inner'\r\n\r\nconst isTreeNodeDragStartArgs = (node: TreeNode, event: DragEvent) =>\r\n isTreeNode(node) && isDragEventLike(event)\r\n\r\nconst isTreeNodeDragTargetArgs = (draggingNode: TreeNode, dropNode: TreeNode, event: DragEvent) =>\r\n isTreeNode(draggingNode) && isTreeNode(dropNode) && isDragEventLike(event)\r\n\r\nconst isTreeNodeDragEndArgs = (\r\n draggingNode: TreeNode,\r\n dropNode: TreeNode | null,\r\n dropType: TreeNodeDropType,\r\n event: DragEvent\r\n) =>\r\n isTreeNode(draggingNode) &&\r\n (dropNode === null || isTreeNode(dropNode)) &&\r\n isTreeNodeDropType(dropType) &&\r\n isDragEventLike(event)\r\n\r\nconst isTreeNodeDropArgs = (\r\n draggingNode: TreeNode,\r\n dropNode: TreeNode,\r\n dropType: Exclude<TreeNodeDropType, 'none'>,\r\n event: DragEvent\r\n) =>\r\n isTreeNode(draggingNode) &&\r\n isTreeNode(dropNode) &&\r\n isTreeNodeNonNoneDropType(dropType) &&\r\n isDragEventLike(event)\r\n\r\n/**\r\n * 阶段 3 正式开放展开状态双向同步与展开事件。\r\n */\r\nexport const treeEmits = {\r\n /**\r\n * 请求外部同步当前源展开键集合。\r\n */\r\n 'update:expandedKeys': (value: TreeKey[]) =>\r\n Array.isArray(value) && value.every((item) => isTreeKey(item)),\r\n /**\r\n * 请求外部同步当前源选中键集合。\r\n */\r\n 'update:selectedKeys': (value: TreeKey[]) =>\r\n Array.isArray(value) && value.every((item) => isTreeKey(item)),\r\n /**\r\n * 请求外部同步当前源勾选键集合。\r\n */\r\n 'update:checkedKeys': (value: TreeCheckedKeys) => isTreeCheckedKeys(value),\r\n /**\r\n * 请求外部同步当前已完成异步加载的节点键集合。\r\n */\r\n 'update:loadedKeys': (value: TreeKey[]) =>\r\n Array.isArray(value) && value.every((item) => isTreeKey(item)),\r\n /**\r\n * 节点展开状态切换后抛出当前节点的展开结果。\r\n */\r\n expand: (event: TreeExpandEvent) =>\r\n typeof event.expanded === 'boolean' &&\r\n isTreeKey(event.key) &&\r\n Array.isArray(event.expandedKeys) &&\r\n event.expandedKeys.every((item) => isTreeKey(item)) &&\r\n event.node !== null &&\r\n typeof event.node === 'object',\r\n /**\r\n * 节点被点击时抛出节点数据、节点对象、组件实例与鼠标事件。\r\n */\r\n 'node-click': (...args: TreeNodeClickArgs) => isTreeNodeClickArgs(...args),\r\n /**\r\n * 节点内容区被双击时抛出节点数据、节点对象、组件实例与鼠标事件。\r\n */\r\n dblclick: (...args: TreeNodeDblclickArgs) => isTreeNodeDblclickArgs(...args),\r\n 'right-click': (...args: TreeNodeRightClickArgs) => isTreeNodeRightClickArgs(...args),\r\n /**\r\n * 节点被选中或取消选中时抛出最新选中结果。\r\n */\r\n select: (...args: TreeSelectArgs) => isTreeSelectArgs(...args),\r\n /**\r\n * 节点复选框勾选状态切换后抛出当前勾选结果。\r\n */\r\n check: (...args: TreeCheckArgs) => isTreeCheckArgs(...args),\r\n /**\r\n * 节点异步加载完成后抛出最新已加载结果。\r\n */\r\n load: (...args: TreeLoadArgs) => isTreeLoadArgs(...args),\r\n /**\r\n * 节点被用户展开时抛出切换后的节点对象与组件实例。\r\n */\r\n 'node-expand': (...args: TreeNodeToggleArgs) => isTreeNodeToggleArgs(...args),\r\n /**\r\n * 节点被用户收起时抛出切换后的节点对象与组件实例。\r\n */\r\n 'node-collapse': (...args: TreeNodeToggleArgs) => isTreeNodeToggleArgs(...args),\r\n /**\r\n * 节点开始拖拽时抛出拖拽源节点。\r\n */\r\n 'node-drag-start': (...args: TreeNodeDragStartArgs) => isTreeNodeDragStartArgs(...args),\r\n /**\r\n * 拖拽进入节点落点区域时抛出当前拖拽源和目标节点。\r\n */\r\n 'node-drag-enter': (...args: TreeNodeDragTargetArgs) => isTreeNodeDragTargetArgs(...args),\r\n /**\r\n * 拖拽悬停在节点落点区域时抛出当前拖拽源和目标节点。\r\n */\r\n 'node-drag-over': (...args: TreeNodeDragTargetArgs) => isTreeNodeDragTargetArgs(...args),\r\n /**\r\n * 拖拽离开节点落点区域时抛出当前拖拽源和目标节点。\r\n */\r\n 'node-drag-leave': (...args: TreeNodeDragTargetArgs) => isTreeNodeDragTargetArgs(...args),\r\n /**\r\n * 节点拖拽结束时抛出拖拽源、目标和投放类型。\r\n */\r\n 'node-drag-end': (...args: TreeNodeDragEndArgs) => isTreeNodeDragEndArgs(...args),\r\n /**\r\n * 节点成功投放时抛出拖拽源、目标和投放类型。\r\n */\r\n 'node-drop': (...args: TreeNodeDropArgs) => isTreeNodeDropArgs(...args)\r\n} as const\r\n\r\nexport type TreeEmits = typeof treeEmits\r\n\r\n/**\r\n * 将用户传入的部分映射与默认映射合并,统一生成内部字段配置。\r\n */\r\nexport const resolveTreeNodePropsConfig = (\r\n propsConfig?: TreeNodeProps\r\n): Required<TreeNodeProps> => ({\r\n ...treeNodePropsDefaults,\r\n ...propsConfig\r\n})\r\n\r\n/**\r\n * 将 key-based 交互策略归一化为 Set,后续节点标准化只读取这些集合。\r\n */\r\nconst createTreeKeySet = (keys: TreeKey[] | undefined): Set<TreeKey> => {\r\n if (!Array.isArray(keys)) {\r\n return new Set()\r\n }\r\n\r\n const keySet = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (isTreeKey(key)) {\r\n keySet.add(key)\r\n }\r\n }\r\n\r\n return keySet\r\n}\r\n\r\nconst createTreeInteractionStateSets = ({\r\n disabledKeys,\r\n unselectableKeys,\r\n disabledCheckboxKeys,\r\n hiddenCheckboxKeys\r\n}: TreeInteractionStateConfig = {}): TreeInteractionStateSets => ({\r\n disabledKeySet: createTreeKeySet(disabledKeys),\r\n unselectableKeySet: createTreeKeySet(unselectableKeys),\r\n disabledCheckboxKeySet: createTreeKeySet(disabledCheckboxKeys),\r\n hiddenCheckboxKeySet: createTreeKeySet(hiddenCheckboxKeys)\r\n})\r\n\r\n/**\r\n * 按映射字段名读取原始节点字段,避免字段读取逻辑散落在各处。\r\n */\r\nconst readTreeField = (node: TreeData, fieldName: string): unknown => node[fieldName]\r\n\r\n/**\r\n * 将单个原始节点转换为内部标准化节点。\r\n */\r\nexport const normalizeTreeNode = (\r\n rawNode: TreeData,\r\n level: number,\r\n propsConfig?: TreeNodeProps,\r\n interactionStateSets: TreeInteractionStateSets = createTreeInteractionStateSets(),\r\n parent: TreeNodeModel | null = null,\r\n isLastSibling = true,\r\n lineTrackEnds: boolean[] = []\r\n): TreeNodeModel => {\r\n const mappedProps = resolveTreeNodePropsConfig(propsConfig)\r\n const childrenValue = readTreeField(rawNode, mappedProps.children)\r\n const childNodes = Array.isArray(childrenValue) ? (childrenValue as TreeData[]) : []\r\n\r\n const labelValue = readTreeField(rawNode, mappedProps.label)\r\n const isLeafValue = readTreeField(rawNode, mappedProps.isLeaf)\r\n\r\n if (rawNode.key === undefined || rawNode.key === null) {\r\n throw new Error('[FlTree] Every node must provide a unique `key`.')\r\n }\r\n\r\n const disabled = interactionStateSets.disabledKeySet.has(rawNode.key)\r\n\r\n const treeNode: TreeNodeModel = {\r\n key: rawNode.key,\r\n level,\r\n data: rawNode,\r\n label: labelValue == null ? '' : String(labelValue),\r\n disabled,\r\n selectable: !disabled && !interactionStateSets.unselectableKeySet.has(rawNode.key),\r\n checkboxDisabled: disabled || interactionStateSets.disabledCheckboxKeySet.has(rawNode.key),\r\n checkboxVisible: !interactionStateSets.hiddenCheckboxKeySet.has(rawNode.key),\r\n isLeaf: Boolean(isLeafValue),\r\n isLastSibling,\r\n lineTrackEnds,\r\n parent,\r\n childNodes: []\r\n }\r\n\r\n treeNode.childNodes = childNodes.map((childNode, index) =>\r\n normalizeTreeNode(\r\n childNode,\r\n level + 1,\r\n mappedProps,\r\n interactionStateSets,\r\n treeNode,\r\n index === childNodes.length - 1,\r\n [...lineTrackEnds, isLastSibling]\r\n )\r\n )\r\n\r\n return treeNode\r\n}\r\n\r\n/**\r\n * 在递归树结构之外,同时建立扁平索引,供后续阶段复用。\r\n */\r\nexport const buildTreeIndex = (\r\n data: TreeData[],\r\n propsConfig?: TreeNodeProps,\r\n interactionStateConfig?: TreeInteractionStateConfig\r\n): TreeIndex => {\r\n const keyNodeMap = new Map<TreeKey, TreeNodeModel>()\r\n const parentKeyMap = new Map<TreeKey, TreeKey | null>()\r\n const childrenKeyMap = new Map<TreeKey, TreeKey[]>()\r\n const visibleNodeKeys: TreeKey[] = []\r\n const interactionStateSets = createTreeInteractionStateSets(interactionStateConfig)\r\n const normalizedNodes = data.map((node, index) =>\r\n normalizeTreeNode(node, 1, propsConfig, interactionStateSets, null, index === data.length - 1)\r\n )\r\n\r\n /**\r\n * 递归遍历标准化节点,并同步填充索引表。\r\n */\r\n const visit = (nodes: TreeNodeModel[], parentKey: TreeKey | null) => {\r\n for (const node of nodes) {\r\n if (keyNodeMap.has(node.key)) {\r\n throw new Error(`[FlTree] Duplicate node key detected: ${String(node.key)}`)\r\n }\r\n\r\n keyNodeMap.set(node.key, node)\r\n parentKeyMap.set(node.key, parentKey)\r\n visibleNodeKeys.push(node.key)\r\n childrenKeyMap.set(\r\n node.key,\r\n node.childNodes.map((childNode) => childNode.key)\r\n )\r\n\r\n if (node.childNodes.length > 0) {\r\n visit(node.childNodes, node.key)\r\n }\r\n }\r\n }\r\n\r\n visit(normalizedNodes, null)\r\n\r\n return {\r\n nodes: normalizedNodes,\r\n keyNodeMap,\r\n parentKeyMap,\r\n childrenKeyMap,\r\n visibleNodeKeys\r\n }\r\n}\r\n\r\n/**\r\n * 过滤无效、重复或已从树结构中移除的展开键。\r\n */\r\nexport const filterTreeExpandedKeys = (\r\n keys: TreeKey[] | undefined,\r\n keyNodeMap: Map<TreeKey, TreeNodeModel>\r\n): TreeKey[] => {\r\n if (!Array.isArray(keys)) {\r\n return []\r\n }\r\n\r\n const nextExpandedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (!isTreeKey(key) || visitedKeys.has(key) || !keyNodeMap.has(key)) {\r\n continue\r\n }\r\n\r\n visitedKeys.add(key)\r\n nextExpandedKeys.push(key)\r\n }\r\n\r\n return nextExpandedKeys\r\n}\r\n\r\nexport const normalizeAccordionExpandedKeys = (\r\n expandedKeys: TreeKey[],\r\n parentKeyMap: Map<TreeKey, TreeKey | null>\r\n): TreeKey[] => {\r\n const lastSiblingExpandedKeyMap = new Map<TreeKey | null, TreeKey>()\r\n\r\n for (const key of expandedKeys) {\r\n lastSiblingExpandedKeyMap.set(parentKeyMap.get(key) ?? null, key)\r\n }\r\n\r\n return expandedKeys.filter(\r\n (key) => lastSiblingExpandedKeyMap.get(parentKeyMap.get(key) ?? null) === key\r\n )\r\n}\r\n\r\n/**\r\n * 过滤无效、重复或已从树结构中移除的选中键。\r\n */\r\nexport const filterTreeSelectedKeys = (\r\n keys: TreeKey[] | undefined,\r\n keyNodeMap: Map<TreeKey, TreeNodeModel>\r\n): TreeKey[] => {\r\n if (!Array.isArray(keys)) {\r\n return []\r\n }\r\n\r\n const nextSelectedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (!isTreeKey(key) || visitedKeys.has(key) || !keyNodeMap.has(key)) {\r\n continue\r\n }\r\n\r\n visitedKeys.add(key)\r\n nextSelectedKeys.push(key)\r\n }\r\n\r\n return nextSelectedKeys\r\n}\r\n\r\n/**\r\n * 过滤无效、重复或已从树结构中移除的勾选键。\r\n */\r\nexport const filterTreeCheckedKeys = (\r\n keys: TreeKey[] | undefined,\r\n keyNodeMap: Map<TreeKey, TreeNodeModel>\r\n): TreeKey[] => {\r\n if (!Array.isArray(keys)) {\r\n return []\r\n }\r\n\r\n const nextCheckedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (!isTreeKey(key) || visitedKeys.has(key) || !keyNodeMap.has(key)) {\r\n continue\r\n }\r\n\r\n visitedKeys.add(key)\r\n nextCheckedKeys.push(key)\r\n }\r\n\r\n return nextCheckedKeys\r\n}\r\n\r\n/**\r\n * 过滤无效、重复或已从树结构中移除的异步加载完成键。\r\n */\r\nexport const filterTreeLoadedKeys = (\r\n keys: TreeKey[] | undefined,\r\n keyNodeMap: Map<TreeKey, TreeNodeModel>\r\n): TreeKey[] => {\r\n if (!Array.isArray(keys)) {\r\n return []\r\n }\r\n\r\n const nextLoadedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (!isTreeKey(key) || visitedKeys.has(key) || !keyNodeMap.has(key)) {\r\n continue\r\n }\r\n\r\n visitedKeys.add(key)\r\n nextLoadedKeys.push(key)\r\n }\r\n\r\n return nextLoadedKeys\r\n}\r\n\r\n/**\r\n * 清理集合中已经失效的节点键,供非受控状态在数据更新后裁剪缓存。\r\n */\r\nexport const pruneTreeKeySet = (\r\n keys: Set<TreeKey>,\r\n keyNodeMap: Map<TreeKey, TreeNodeModel>\r\n): Set<TreeKey> => {\r\n const nextKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (keyNodeMap.has(key)) {\r\n nextKeys.add(key)\r\n }\r\n }\r\n\r\n return nextKeys\r\n}\r\n\r\n/**\r\n * 收集当前树中所有可展开节点的 key,供 `defaultExpandAll` 初始化使用。\r\n */\r\nexport const collectExpandableTreeKeys = (nodes: TreeNodeModel[]): TreeKey[] => {\r\n const expandedKeys: TreeKey[] = []\r\n\r\n /**\r\n * 递归遍历存在子节点的分支节点,并记录其 key。\r\n */\r\n const visit = (currentNodes: TreeNodeModel[]) => {\r\n for (const node of currentNodes) {\r\n if (node.childNodes.length === 0) {\r\n continue\r\n }\r\n\r\n expandedKeys.push(node.key)\r\n visit(node.childNodes)\r\n }\r\n }\r\n\r\n visit(nodes)\r\n\r\n return expandedKeys\r\n}\r\n\r\n/**\r\n * 基于父节点索引补齐源展开键的全部祖先节点键。\r\n */\r\nexport const collectAncestorExpandedKeys = (\r\n sourceExpandedKeys: TreeKey[],\r\n parentKeyMap: Map<TreeKey, TreeKey | null>\r\n): Set<TreeKey> => {\r\n const ancestorKeys = new Set<TreeKey>()\r\n\r\n for (const key of sourceExpandedKeys) {\r\n let parentKey = parentKeyMap.get(key) ?? null\r\n\r\n while (parentKey !== null) {\r\n ancestorKeys.add(parentKey)\r\n parentKey = parentKeyMap.get(parentKey) ?? null\r\n }\r\n }\r\n\r\n return ancestorKeys\r\n}\r\n\r\n/**\r\n * 根据源展开键生成最终用于渲染的展开集合,可按需补齐祖先节点。\r\n */\r\nexport const createEffectiveExpandedKeySet = ({\r\n sourceExpandedKeys,\r\n parentKeyMap,\r\n includeAncestorKeys,\r\n accordion = false\r\n}: {\r\n sourceExpandedKeys: TreeKey[]\r\n parentKeyMap: Map<TreeKey, TreeKey | null>\r\n includeAncestorKeys: boolean\r\n accordion?: boolean\r\n}): Set<TreeKey> => {\r\n if (accordion) {\r\n const orderedExpandedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n const addExpandedKey = (key: TreeKey) => {\r\n if (!visitedKeys.has(key)) {\r\n visitedKeys.add(key)\r\n orderedExpandedKeys.push(key)\r\n }\r\n }\r\n\r\n for (const key of sourceExpandedKeys) {\r\n if (includeAncestorKeys) {\r\n let parentKey = parentKeyMap.get(key) ?? null\r\n\r\n while (parentKey !== null) {\r\n addExpandedKey(parentKey)\r\n parentKey = parentKeyMap.get(parentKey) ?? null\r\n }\r\n }\r\n\r\n addExpandedKey(key)\r\n }\r\n\r\n return new Set(normalizeAccordionExpandedKeys(orderedExpandedKeys, parentKeyMap))\r\n }\r\n\r\n const effectiveExpandedKeys = new Set<TreeKey>(sourceExpandedKeys)\r\n\r\n if (includeAncestorKeys) {\r\n const ancestorKeys = collectAncestorExpandedKeys(sourceExpandedKeys, parentKeyMap)\r\n\r\n for (const key of ancestorKeys) {\r\n effectiveExpandedKeys.add(key)\r\n }\r\n }\r\n\r\n return effectiveExpandedKeys\r\n}\r\n\r\ninterface CreateTreeEventNodeOptions {\r\n node: TreeNodeModel\r\n resolveExpanded?: undefined\r\n}\r\n\r\ninterface CreateExpandedTreeEventNodeOptions {\r\n node: TreeNodeModel\r\n resolveExpanded: (nodeKey: TreeKey) => boolean\r\n}\r\n\r\n/**\r\n * 根据内部节点模型构造对外事件节点对象,并按需附带展开状态。\r\n */\r\nexport function createTreeEventNode(options: CreateExpandedTreeEventNodeOptions): TreeExpandedNode\r\nexport function createTreeEventNode(options: CreateTreeEventNodeOptions): TreeNode\r\nexport function createTreeEventNode({\r\n node,\r\n resolveExpanded\r\n}: CreateTreeEventNodeOptions | CreateExpandedTreeEventNodeOptions): TreeNode | TreeExpandedNode {\r\n const cachedNodes = new Map<TreeKey, TreeNode | TreeExpandedNode>()\r\n\r\n /**\r\n * 递归复制节点字段,并通过缓存避免父子链循环导致的无限递归。\r\n */\r\n const visit = (currentNode: TreeNodeModel): TreeNode | TreeExpandedNode => {\r\n const cachedNode = cachedNodes.get(currentNode.key)\r\n\r\n if (cachedNode) {\r\n return cachedNode\r\n }\r\n\r\n const eventNode: TreeNode = {\r\n key: currentNode.key,\r\n level: currentNode.level,\r\n data: currentNode.data,\r\n label: currentNode.label,\r\n disabled: currentNode.disabled,\r\n selectable: currentNode.selectable,\r\n checkboxDisabled: currentNode.checkboxDisabled,\r\n checkboxVisible: currentNode.checkboxVisible,\r\n isLeaf: currentNode.isLeaf,\r\n parent: null,\r\n childNodes: []\r\n }\r\n\r\n if (resolveExpanded) {\r\n const expandedEventNode = eventNode as TreeExpandedNode\r\n\r\n expandedEventNode.expanded = resolveExpanded(currentNode.key)\r\n }\r\n\r\n cachedNodes.set(currentNode.key, eventNode)\r\n eventNode.parent = currentNode.parent ? visit(currentNode.parent) : null\r\n eventNode.childNodes = currentNode.childNodes.map((childNode) => visit(childNode))\r\n\r\n return eventNode\r\n }\r\n\r\n return visit(node)\r\n}\r\n\r\n/**\r\n * 统一解析对象形式和工厂函数形式的语义化记录。\r\n */\r\nexport const resolveTreeSemanticRecord = <T>(\r\n source: TreeSemanticRecord<T> | ((info: TreeSemanticInfo) => TreeSemanticRecord<T>) | undefined,\r\n info: TreeSemanticInfo\r\n): TreeSemanticRecord<T> => {\r\n if (typeof source === 'function') {\r\n return source(info) ?? {}\r\n }\r\n\r\n return source ?? {}\r\n}\r\n\r\nexport type {\r\n TreeClassValue,\r\n TreeData,\r\n TreeIndex,\r\n TreeKey,\r\n TreeNode,\r\n TreeNodeClassName,\r\n TreeNodeClassNameInfo,\r\n TreeNodeModel,\r\n TreeNodeProps,\r\n TreeSemanticDOM,\r\n TreeSemanticRecord,\r\n TreeShowLine,\r\n TreeShowLineOptions,\r\n TreeSwitcherIconMode\r\n}\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M300 276.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97zm0 284a56 56 0 1 0 56-97 56 56 0 0 0-56 97zM640 228a56 56 0 1 0 112 0 56 56 0 0 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 0 0-112 0zM300 844.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97zM640 796a56 56 0 1 0 112 0 56 56 0 0 0-112 0z\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'HolderOutlined'\r\n})\r\n</script>\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M300 276.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97zm0 284a56 56 0 1 0 56-97 56 56 0 0 0-56 97zM640 228a56 56 0 1 0 112 0 56 56 0 0 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 0 0-112 0zM300 844.5a56 56 0 1 0 56-97 56 56 0 0 0-56 97zM640 796a56 56 0 1 0 112 0 56 56 0 0 0-112 0z\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'HolderOutlined'\r\n})\r\n</script>\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M192 192v640h640V192zm-32-64h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32\" />\r\n <path fill=\"currentColor\" d=\"M352 480h320a32 32 0 1 1 0 64H352a32 32 0 0 1 0-64\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'MinusSquareOutlined'\r\n})\r\n</script>\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M192 192v640h640V192zm-32-64h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32\" />\r\n <path fill=\"currentColor\" d=\"M352 480h320a32 32 0 1 1 0 64H352a32 32 0 0 1 0-64\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'MinusSquareOutlined'\r\n})\r\n</script>\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M192 192v640h640V192zm-32-64h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32\" />\r\n <path fill=\"currentColor\" d=\"M352 480h320a32 32 0 1 1 0 64H352a32 32 0 0 1 0-64\" />\r\n <path fill=\"currentColor\" d=\"M480 672V352a32 32 0 1 1 64 0v320a32 32 0 0 1-64 0\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'PlusSquareOutlined'\r\n})\r\n</script>\r\n","<template>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n clip-rule=\"evenodd\"\r\n d=\"M192 192v640h640V192zm-32-64h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32\" />\r\n <path fill=\"currentColor\" d=\"M352 480h320a32 32 0 1 1 0 64H352a32 32 0 0 1 0-64\" />\r\n <path fill=\"currentColor\" d=\"M480 672V352a32 32 0 1 1 64 0v320a32 32 0 0 1-64 0\" />\r\n </svg>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({\r\n name: 'PlusSquareOutlined'\r\n})\r\n</script>\r\n","import { withInstall } from '@falcon-ui/utils'\r\nimport HolderOutlinedComponent from './holder-outlined.vue'\r\nimport MinusSquareOutlinedComponent from './minus-square-outlined.vue'\r\nimport PlusSquareOutlinedComponent from './plus-square-outlined.vue'\r\n\r\nexport const PlusSquareOutlined = withInstall(PlusSquareOutlinedComponent)\r\nexport const MinusSquareOutlined = withInstall(MinusSquareOutlinedComponent)\r\nexport const HolderOutlined = withInstall(HolderOutlinedComponent)\r\n","<template>\r\n <!-- 递归节点消费主入口下发的树状态与交互能力,连线模式仅补充渲染结构,不改动事件链路。 -->\r\n <div\r\n :id=\"nodeId\"\r\n :class=\"[\r\n itemClassName,\r\n semanticClassNames.item,\r\n customNodeClassName,\r\n ns.is('line-mode', showLine),\r\n ns.is('leaf', isLeafNode),\r\n ns.is('last', isLastSiblingNode)\r\n ]\"\r\n :style=\"[semanticStyles.item, itemStyle]\"\r\n role=\"treeitem\"\r\n :aria-expanded=\"isExpandableNode ? isExpandedNode : undefined\"\r\n :aria-checked=\"nodeAriaChecked\"\r\n :aria-selected=\"isSelectableNode ? isSelectedNode : undefined\"\r\n :aria-disabled=\"node.disabled ? 'true' : undefined\"\r\n :aria-level=\"node.level\">\r\n <div\r\n ref=\"itemContentRef\"\r\n :class=\"[\r\n itemContentClassName,\r\n ns.is('selected', isSelectedNode),\r\n ns.is('disabled', node.disabled),\r\n ns.is('line-mode', showLine),\r\n ns.is('focused', isFocusedNode),\r\n ns.is('filtered', isFilteredNode),\r\n ns.is('draggable', isDraggableNode),\r\n ns.is('dragging', isDraggingNode),\r\n ns.is('drop-target', isDropTargetNode),\r\n ns.is('drop-allowed', isDropAllowedNode),\r\n ns.is('drop-forbidden', isDropForbiddenNode),\r\n ns.is('drop-before', isDropBeforeNode),\r\n ns.is('drop-inside', isDropInsideNode),\r\n ns.is('drop-after', isDropAfterNode)\r\n ]\"\r\n :draggable=\"isDraggableNode ? true : undefined\"\r\n @click=\"handleNodeContentClick\"\r\n @dblclick=\"handleNodeContentDblclick\"\r\n @contextmenu=\"handleNodeContentContextmenu\"\r\n @dragstart.stop=\"handleDragStart\"\r\n @dragenter.stop=\"handleDragEnter\"\r\n @dragover.stop=\"handleDragOver\"\r\n @dragleave.stop=\"handleDragLeave\"\r\n @drop.stop=\"handleDrop\"\r\n @dragend.stop=\"handleDragEnd\">\r\n <span v-if=\"lineTrackEnds.length > 0\" :class=\"indentClassName\" aria-hidden=\"true\">\r\n <span\r\n v-for=\"(isTrackEnd, index) in lineTrackEnds\"\r\n :key=\"`${String(node.key)}-${index}`\"\r\n :class=\"[indentUnitClassName, ns.is('end', isTrackEnd)]\" />\r\n </span>\r\n <span :class=\"[itemIconClassName, ns.is('leaf', isLeafNode)]\">\r\n <span\r\n v-if=\"isLeafNode && showLine\"\r\n :class=\"[switcherClassName, switcherNoopClassName]\"\r\n aria-hidden=\"true\">\r\n <span :class=\"switcherLeafLineClassName\" />\r\n <span v-if=\"showLeafIcon\" :class=\"switcherLeafIconClassName\" />\r\n </span>\r\n <span v-else-if=\"isLeafNode\" :class=\"switcherDotClassName\" aria-hidden=\"true\" />\r\n <span v-else :class=\"switcherClassName\">\r\n <button\r\n type=\"button\"\r\n :class=\"switcherButtonClassName\"\r\n :aria-label=\"isExpandedNode ? '收起节点' : '展开节点'\"\r\n :disabled=\"isLoadingNode\"\r\n tabindex=\"-1\"\r\n @click.stop=\"handleSwitcherClick\"\r\n @dblclick.stop\r\n @keydown.stop>\r\n <ElIcon\r\n :class=\"[switcherIconClassName, ns.is('loading', isLoadingNode)]\"\r\n aria-hidden=\"true\">\r\n <component :is=\"switcherLoadingIcon\" v-if=\"isLoadingNode\" />\r\n <template v-else-if=\"switcherIcon === 'plus-minus'\">\r\n <MinusSquareOutlined v-if=\"isExpandedNode\" />\r\n <PlusSquareOutlined v-else />\r\n </template>\r\n <template v-else-if=\"switcherIcon === 'folder'\">\r\n <FolderOpened v-if=\"isExpandedNode\" />\r\n <Folder v-else />\r\n </template>\r\n <template v-else>\r\n <CaretBottom v-if=\"isExpandedNode\" />\r\n <CaretRight v-else />\r\n </template>\r\n </ElIcon>\r\n </button>\r\n </span>\r\n </span>\r\n <span\r\n v-if=\"shouldShowCheckbox\"\r\n :class=\"itemCheckboxClassName\"\r\n @click.stop=\"handleCheckboxClick\"\r\n @dblclick.stop\r\n @keydown.stop>\r\n <ElCheckbox\r\n :model-value=\"isCheckedNode\"\r\n :indeterminate=\"isHalfCheckedNode\"\r\n :disabled=\"isCurrentCheckboxDisabled\"\r\n tabindex=\"-1\"\r\n aria-label=\"Select tree node\" />\r\n </span>\r\n <span :class=\"itemTitleClassName\">\r\n <slot v-if=\"hasDefaultSlot\" :node=\"slotNode\" :data=\"node.data\" />\r\n <template v-else>{{ node.label }}</template>\r\n </span>\r\n </div>\r\n <Transition name=\"fl-tree-collapse\">\r\n <div v-if=\"hasChildNodes && isExpandedNode\" :class=\"childrenClassName\" role=\"group\">\r\n <div :class=\"childrenInnerClassName\" role=\"presentation\">\r\n <FlTreeNode\r\n v-for=\"childNode in node.childNodes\"\r\n :key=\"childNode.key\"\r\n :node=\"childNode\"\r\n :get-node-id=\"getNodeId\"\r\n :register-node-element=\"registerNodeElement\"\r\n :unregister-node-element=\"unregisterNodeElement\"\r\n :on-node-content-click=\"onNodeContentClick\"\r\n :on-node-content-dblclick=\"onNodeContentDblclick\"\r\n :on-node-content-contextmenu=\"onNodeContentContextmenu\"\r\n :is-node-expanded=\"isNodeExpanded\"\r\n :is-node-checked=\"isNodeChecked\"\r\n :is-node-half-checked=\"isNodeHalfChecked\"\r\n :is-node-selected=\"isNodeSelected\"\r\n :is-node-focused=\"isNodeFocused\"\r\n :is-node-filtered=\"isNodeFiltered\"\r\n :is-node-loading=\"isNodeLoading\"\r\n :is-node-expandable=\"isNodeExpandable\"\r\n :is-node-draggable=\"isNodeDraggable\"\r\n :is-node-dragging=\"isNodeDragging\"\r\n :is-node-drop-target=\"isNodeDropTarget\"\r\n :is-node-drop-allowed=\"isNodeDropAllowed\"\r\n :get-node-drop-type=\"getNodeDropType\"\r\n :tree-checkable=\"treeCheckable\"\r\n :tree-selectable=\"treeSelectable\"\r\n :show-line=\"showLine\"\r\n :show-leaf-icon=\"showLeafIcon\"\r\n :switcher-icon=\"switcherIcon\"\r\n :switcher-loading-icon=\"switcherLoadingIcon\"\r\n :is-checkbox-disabled=\"isCheckboxDisabled\"\r\n :should-render-checkbox=\"shouldRenderCheckbox\"\r\n :toggle-node-checked=\"toggleNodeChecked\"\r\n :toggle-node-expansion=\"toggleNodeExpansion\"\r\n :handle-node-drag-start=\"handleNodeDragStart\"\r\n :handle-node-drag-enter=\"handleNodeDragEnter\"\r\n :handle-node-drag-over=\"handleNodeDragOver\"\r\n :handle-node-drag-leave=\"handleNodeDragLeave\"\r\n :handle-node-drop=\"handleNodeDrop\"\r\n :handle-node-drag-end=\"handleNodeDragEnd\"\r\n :resolved-class-names=\"resolvedClassNames\"\r\n :node-class-name=\"nodeClassName\"\r\n :resolved-styles=\"resolvedStyles\">\r\n <template v-if=\"hasDefaultSlot\" #default=\"slotProps\">\r\n <slot v-bind=\"slotProps\" />\r\n </template>\r\n </FlTreeNode>\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { MinusSquareOutlined, PlusSquareOutlined } from '@falcon-ui/icons'\r\nimport { CaretBottom, CaretRight, Folder, FolderOpened } from '@element-plus/icons-vue'\r\nimport { ElCheckbox, ElIcon } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport {\r\n computed,\r\n getCurrentInstance,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n type CSSProperties\r\n} from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n type TreeData,\r\n type TreeClassValue,\r\n type TreeInteractionEvent,\r\n type TreeKey,\r\n type TreeNode,\r\n type TreeNodeClassName,\r\n type TreeNodeDropType,\r\n type TreeNodeInstance,\r\n type TreeNodeModel,\r\n type TreeSemanticRecord,\r\n type TreeSwitcherLoadingIcon,\r\n type TreeSwitcherIconMode\r\n} from './tree'\r\n\r\ndefineOptions({\r\n name: 'FlTreeNode'\r\n})\r\n\r\ninterface TreeNodeDragTargetHandlerOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n element: HTMLElement\r\n}\r\n\r\ninterface TreeNodeDragHandlerOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n}\r\n\r\n/**\r\n * 内部节点组件只接收标准化节点和主入口下发的树状态能力。\r\n */\r\ninterface TreeNodeComponentProps {\r\n node: TreeNodeModel\r\n getNodeId: (nodeKey: TreeKey) => string\r\n registerNodeElement: (nodeKey: TreeKey, element: HTMLElement | null) => void\r\n unregisterNodeElement: (nodeKey: TreeKey, element: HTMLElement | null) => void\r\n onNodeContentClick: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n }) => void\r\n onNodeContentDblclick: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n }) => void\r\n onNodeContentContextmenu: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n }) => void\r\n isNodeExpanded: (nodeKey: TreeKey) => boolean\r\n isNodeChecked: (nodeKey: TreeKey) => boolean\r\n isNodeHalfChecked: (nodeKey: TreeKey) => boolean\r\n isNodeSelected: (nodeKey: TreeKey) => boolean\r\n isNodeFocused: (nodeKey: TreeKey) => boolean\r\n isNodeFiltered: (node: TreeNodeModel) => boolean\r\n isNodeLoading: (nodeKey: TreeKey) => boolean\r\n isNodeExpandable: (node: TreeNodeModel) => boolean\r\n isNodeDraggable: (node: TreeNodeModel) => boolean\r\n isNodeDragging: (nodeKey: TreeKey) => boolean\r\n isNodeDropTarget: (nodeKey: TreeKey) => boolean\r\n isNodeDropAllowed: (nodeKey: TreeKey) => boolean\r\n getNodeDropType: (nodeKey: TreeKey) => TreeNodeDropType | undefined\r\n treeCheckable: boolean\r\n treeSelectable: boolean\r\n showLine: boolean\r\n showLeafIcon: boolean\r\n switcherIcon: TreeSwitcherIconMode\r\n switcherLoadingIcon: TreeSwitcherLoadingIcon\r\n isCheckboxDisabled: (node: TreeNodeModel) => boolean\r\n shouldRenderCheckbox: (node: TreeNodeModel) => boolean\r\n toggleNodeChecked: (options: { node: TreeNodeModel; event: TreeInteractionEvent }) => void\r\n toggleNodeExpansion: (options: { node: TreeNodeModel; instance: TreeNodeInstance }) => void\r\n handleNodeDragStart: (options: TreeNodeDragHandlerOptions) => void\r\n handleNodeDragEnter: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragOver: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragLeave: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDrop: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragEnd: (options: TreeNodeDragHandlerOptions) => void\r\n resolvedClassNames: TreeSemanticRecord<TreeClassValue>\r\n nodeClassName?: TreeNodeClassName\r\n resolvedStyles: TreeSemanticRecord<CSSProperties>\r\n}\r\n\r\nconst props = defineProps<TreeNodeComponentProps>()\r\nconst slots = defineSlots<{\r\n default?: (props: { node: TreeNode; data: TreeData }) => unknown\r\n}>()\r\nconst currentInstance = getCurrentInstance()\r\nconst itemContentRef = ref<HTMLElement | null>(null)\r\nconst ns = useNamespace('tree')\r\nconst itemClassName = ns.e('item')\r\nconst itemContentClassName = ns.e('item-content')\r\nconst indentClassName = ns.e('indent')\r\nconst indentUnitClassName = ns.e('indent-unit')\r\nconst itemIconClassName = ns.e('item-icon')\r\nconst itemCheckboxClassName = ns.e('item-checkbox')\r\nconst switcherClassName = ns.e('switcher')\r\nconst switcherNoopClassName = ns.em('switcher', 'noop')\r\nconst switcherButtonClassName = ns.e('switcher-button')\r\nconst switcherDotClassName = ns.e('switcher-dot')\r\nconst switcherIconClassName = ns.e('switcher-icon')\r\nconst switcherLeafLineClassName = ns.e('switcher-leaf-line')\r\nconst switcherLeafIconClassName = ns.e('switcher-leaf-icon')\r\nconst itemTitleClassName = ns.e('item-title')\r\nconst childrenClassName = ns.e('children')\r\nconst childrenInnerClassName = ns.e('children-inner')\r\n\r\n/**\r\n * 返回当前递归节点组件的 public instance。\r\n */\r\nconst getNodeInstance = (): TreeNodeInstance => currentInstance?.proxy ?? null\r\n\r\n/**\r\n * 生成节点基础样式变量,保留层级信息供样式调试与后续扩展使用。\r\n */\r\nconst createItemStyle = () =>\r\n ({\r\n '--fl-tree-level': String(props.node.level)\r\n }) as CSSProperties & Record<string, string>\r\n\r\n/**\r\n * 判断当前节点是否具备展开能力。\r\n */\r\nconst resolveExpandableNodeState = () => props.isNodeExpandable(props.node)\r\n\r\n/**\r\n * 判断当前节点是否存在已经渲染到数据树中的子节点。\r\n */\r\nconst resolveHasChildNodesState = () => props.node.childNodes.length > 0\r\n\r\n/**\r\n * 判断当前节点是否处于展开状态。\r\n */\r\nconst resolveExpandedNodeState = () =>\r\n resolveExpandableNodeState() && props.isNodeExpanded(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否按叶子节点视觉渲染。\r\n */\r\nconst resolveLeafNodeState = () => !resolveExpandableNodeState()\r\n\r\n/**\r\n * 判断当前节点是否处于异步加载中。\r\n */\r\nconst resolveLoadingNodeState = () => props.isNodeLoading(props.node.key)\r\n\r\n/**\r\n * 返回当前节点祖先轨道的终止状态列表,用于逐层渲染连线轨道。\r\n */\r\nconst resolveLineTrackEnds = () => props.node.lineTrackEnds\r\n\r\n/**\r\n * 判断当前节点是否为所在层级的最后一个兄弟节点。\r\n */\r\nconst resolveLastSiblingNodeState = () => props.node.isLastSibling\r\n\r\n/**\r\n * 判断当前节点是否允许作为原生拖拽源。\r\n */\r\nconst resolveDraggableNodeState = () => props.isNodeDraggable(props.node)\r\n\r\n/**\r\n * 判断当前节点是否正在作为拖拽源。\r\n */\r\nconst resolveDraggingNodeState = () => props.isNodeDragging(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否为当前拖拽悬停目标。\r\n */\r\nconst resolveDropTargetNodeState = () => props.isNodeDropTarget(props.node.key)\r\n\r\n/**\r\n * 判断当前拖拽悬停目标是否允许投放。\r\n */\r\nconst resolveDropAllowedNodeState = () => props.isNodeDropAllowed(props.node.key)\r\n\r\n/**\r\n * 返回当前节点落点类型。\r\n */\r\nconst resolveNodeDropType = () => props.getNodeDropType(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否允许输出选中态语义。\r\n */\r\nconst resolveSelectableNodeState = () =>\r\n props.treeSelectable && props.node.selectable && !props.node.disabled\r\n\r\n/**\r\n * 判断当前节点是否处于选中态。\r\n */\r\nconst resolveSelectedNodeState = () => props.isNodeSelected(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否为键盘活动节点。\r\n */\r\nconst resolveFocusedNodeState = () => props.isNodeFocused(props.node.key)\r\n\r\nconst resolveFilteredNodeState = () => props.isNodeFiltered(props.node)\r\n\r\n/**\r\n * 判断当前节点是否处于勾选态。\r\n */\r\nconst resolveCheckedNodeState = () => props.isNodeChecked(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否处于 half-checked 状态。\r\n */\r\nconst resolveHalfCheckedNodeState = () => props.isNodeHalfChecked(props.node.key)\r\n\r\n/**\r\n * 判断当前节点复选框是否应表现为禁用。\r\n */\r\nconst resolveCheckboxDisabledState = () => props.isCheckboxDisabled(props.node)\r\n\r\n/**\r\n * 判断当前节点是否应渲染复选框。\r\n */\r\nconst resolveCheckboxVisibleState = () =>\r\n props.treeCheckable && props.shouldRenderCheckbox(props.node)\r\n\r\n/**\r\n * 根据 checked / half-checked 结果生成节点级 `aria-checked`。\r\n */\r\nconst resolveAriaCheckedState = () => {\r\n if (!resolveCheckboxVisibleState()) {\r\n return undefined\r\n }\r\n\r\n if (resolveHalfCheckedNodeState()) {\r\n return 'mixed'\r\n }\r\n\r\n return resolveCheckedNodeState() ? 'true' : 'false'\r\n}\r\n\r\n/**\r\n * 处理节点内容区点击,统一派发 `node-click` 与选择事件。\r\n */\r\nconst handleNodeContentClick = (event: MouseEvent) => {\r\n if (event.detail > 1) {\r\n return\r\n }\r\n\r\n props.onNodeContentClick({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 处理节点内容区双击,独立于单击选择链路派发。\r\n */\r\nconst handleNodeContentDblclick = (event: MouseEvent) => {\r\n props.onNodeContentDblclick({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\nconst handleNodeContentContextmenu = (event: MouseEvent) => {\r\n props.onNodeContentContextmenu({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 点击复选框只走勾选链路,不触发展开或选择事件。\r\n */\r\nconst handleCheckboxClick = (event: MouseEvent) => {\r\n if (!resolveCheckboxVisibleState() || props.isCheckboxDisabled(props.node)) {\r\n return\r\n }\r\n\r\n props.toggleNodeChecked({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 切换当前节点的展开状态;阶段 4 起 switcher 不再触发选择链路。\r\n */\r\nconst handleSwitcherClick = () => {\r\n if (!resolveExpandableNodeState() || resolveLoadingNodeState()) {\r\n return\r\n }\r\n\r\n props.toggleNodeExpansion({\r\n node: props.node,\r\n instance: getNodeInstance()\r\n })\r\n}\r\n\r\n/**\r\n * 返回拖拽事件当前绑定的内容区元素。\r\n */\r\nconst getDragEventElement = (event: DragEvent) => event.currentTarget as HTMLElement\r\n\r\n/**\r\n * 处理原生 dragstart。\r\n */\r\nconst handleDragStart = (event: DragEvent) => {\r\n props.handleNodeDragStart({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragenter。\r\n */\r\nconst handleDragEnter = (event: DragEvent) => {\r\n props.handleNodeDragEnter({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragover。\r\n */\r\nconst handleDragOver = (event: DragEvent) => {\r\n props.handleNodeDragOver({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragleave。\r\n */\r\nconst handleDragLeave = (event: DragEvent) => {\r\n props.handleNodeDragLeave({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 drop。\r\n */\r\nconst handleDrop = (event: DragEvent) => {\r\n props.handleNodeDrop({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragend。\r\n */\r\nconst handleDragEnd = (event: DragEvent) => {\r\n props.handleNodeDragEnd({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 返回已经解析完成的语义化 classNames。\r\n */\r\nconst getResolvedClassNames = () => props.resolvedClassNames\r\n\r\n/**\r\n * 返回由视图层回调解析出的节点级 class。\r\n */\r\nconst resolveCustomNodeClassName = () =>\r\n props.nodeClassName?.({\r\n node: slotNode.value,\r\n data: props.node.data\r\n })\r\n\r\n/**\r\n * 返回已经解析完成的语义化 styles。\r\n */\r\nconst getResolvedStyles = () => props.resolvedStyles\r\n\r\nconst nodeId = computed(() => props.getNodeId(props.node.key))\r\nconst itemStyle = computed(createItemStyle)\r\nconst hasDefaultSlot = computed(() => Boolean(slots.default))\r\nconst isExpandableNode = computed(resolveExpandableNodeState)\r\nconst hasChildNodes = computed(resolveHasChildNodesState)\r\nconst isExpandedNode = computed(resolveExpandedNodeState)\r\nconst isLeafNode = computed(resolveLeafNodeState)\r\nconst isLoadingNode = computed(resolveLoadingNodeState)\r\nconst lineTrackEnds = computed(resolveLineTrackEnds)\r\nconst isLastSiblingNode = computed(resolveLastSiblingNodeState)\r\nconst isDraggableNode = computed(resolveDraggableNodeState)\r\nconst isDraggingNode = computed(resolveDraggingNodeState)\r\nconst isDropTargetNode = computed(resolveDropTargetNodeState)\r\nconst isDropAllowedNode = computed(resolveDropAllowedNodeState)\r\nconst nodeDropType = computed(resolveNodeDropType)\r\nconst isDropForbiddenNode = computed(() => isDropTargetNode.value && !isDropAllowedNode.value)\r\nconst isDropBeforeNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'before')\r\nconst isDropInsideNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'inner')\r\nconst isDropAfterNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'after')\r\nconst isCheckedNode = computed(resolveCheckedNodeState)\r\nconst isHalfCheckedNode = computed(resolveHalfCheckedNodeState)\r\nconst isCurrentCheckboxDisabled = computed(resolveCheckboxDisabledState)\r\nconst shouldShowCheckbox = computed(resolveCheckboxVisibleState)\r\nconst isSelectableNode = computed(resolveSelectableNodeState)\r\nconst isSelectedNode = computed(resolveSelectedNodeState)\r\nconst isFocusedNode = computed(resolveFocusedNodeState)\r\nconst isFilteredNode = computed(resolveFilteredNodeState)\r\nconst nodeAriaChecked = computed(resolveAriaCheckedState)\r\nconst slotNode = computed(() => createTreeEventNode({ node: props.node }))\r\nconst semanticClassNames = computed(getResolvedClassNames)\r\nconst customNodeClassName = computed(resolveCustomNodeClassName)\r\nconst semanticStyles = computed(getResolvedStyles)\r\n\r\nonMounted(() => {\r\n props.registerNodeElement(props.node.key, itemContentRef.value)\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n props.unregisterNodeElement(props.node.key, itemContentRef.value)\r\n})\r\n</script>\r\n","<template>\r\n <!-- 递归节点消费主入口下发的树状态与交互能力,连线模式仅补充渲染结构,不改动事件链路。 -->\r\n <div\r\n :id=\"nodeId\"\r\n :class=\"[\r\n itemClassName,\r\n semanticClassNames.item,\r\n customNodeClassName,\r\n ns.is('line-mode', showLine),\r\n ns.is('leaf', isLeafNode),\r\n ns.is('last', isLastSiblingNode)\r\n ]\"\r\n :style=\"[semanticStyles.item, itemStyle]\"\r\n role=\"treeitem\"\r\n :aria-expanded=\"isExpandableNode ? isExpandedNode : undefined\"\r\n :aria-checked=\"nodeAriaChecked\"\r\n :aria-selected=\"isSelectableNode ? isSelectedNode : undefined\"\r\n :aria-disabled=\"node.disabled ? 'true' : undefined\"\r\n :aria-level=\"node.level\">\r\n <div\r\n ref=\"itemContentRef\"\r\n :class=\"[\r\n itemContentClassName,\r\n ns.is('selected', isSelectedNode),\r\n ns.is('disabled', node.disabled),\r\n ns.is('line-mode', showLine),\r\n ns.is('focused', isFocusedNode),\r\n ns.is('filtered', isFilteredNode),\r\n ns.is('draggable', isDraggableNode),\r\n ns.is('dragging', isDraggingNode),\r\n ns.is('drop-target', isDropTargetNode),\r\n ns.is('drop-allowed', isDropAllowedNode),\r\n ns.is('drop-forbidden', isDropForbiddenNode),\r\n ns.is('drop-before', isDropBeforeNode),\r\n ns.is('drop-inside', isDropInsideNode),\r\n ns.is('drop-after', isDropAfterNode)\r\n ]\"\r\n :draggable=\"isDraggableNode ? true : undefined\"\r\n @click=\"handleNodeContentClick\"\r\n @dblclick=\"handleNodeContentDblclick\"\r\n @contextmenu=\"handleNodeContentContextmenu\"\r\n @dragstart.stop=\"handleDragStart\"\r\n @dragenter.stop=\"handleDragEnter\"\r\n @dragover.stop=\"handleDragOver\"\r\n @dragleave.stop=\"handleDragLeave\"\r\n @drop.stop=\"handleDrop\"\r\n @dragend.stop=\"handleDragEnd\">\r\n <span v-if=\"lineTrackEnds.length > 0\" :class=\"indentClassName\" aria-hidden=\"true\">\r\n <span\r\n v-for=\"(isTrackEnd, index) in lineTrackEnds\"\r\n :key=\"`${String(node.key)}-${index}`\"\r\n :class=\"[indentUnitClassName, ns.is('end', isTrackEnd)]\" />\r\n </span>\r\n <span :class=\"[itemIconClassName, ns.is('leaf', isLeafNode)]\">\r\n <span\r\n v-if=\"isLeafNode && showLine\"\r\n :class=\"[switcherClassName, switcherNoopClassName]\"\r\n aria-hidden=\"true\">\r\n <span :class=\"switcherLeafLineClassName\" />\r\n <span v-if=\"showLeafIcon\" :class=\"switcherLeafIconClassName\" />\r\n </span>\r\n <span v-else-if=\"isLeafNode\" :class=\"switcherDotClassName\" aria-hidden=\"true\" />\r\n <span v-else :class=\"switcherClassName\">\r\n <button\r\n type=\"button\"\r\n :class=\"switcherButtonClassName\"\r\n :aria-label=\"isExpandedNode ? '收起节点' : '展开节点'\"\r\n :disabled=\"isLoadingNode\"\r\n tabindex=\"-1\"\r\n @click.stop=\"handleSwitcherClick\"\r\n @dblclick.stop\r\n @keydown.stop>\r\n <ElIcon\r\n :class=\"[switcherIconClassName, ns.is('loading', isLoadingNode)]\"\r\n aria-hidden=\"true\">\r\n <component :is=\"switcherLoadingIcon\" v-if=\"isLoadingNode\" />\r\n <template v-else-if=\"switcherIcon === 'plus-minus'\">\r\n <MinusSquareOutlined v-if=\"isExpandedNode\" />\r\n <PlusSquareOutlined v-else />\r\n </template>\r\n <template v-else-if=\"switcherIcon === 'folder'\">\r\n <FolderOpened v-if=\"isExpandedNode\" />\r\n <Folder v-else />\r\n </template>\r\n <template v-else>\r\n <CaretBottom v-if=\"isExpandedNode\" />\r\n <CaretRight v-else />\r\n </template>\r\n </ElIcon>\r\n </button>\r\n </span>\r\n </span>\r\n <span\r\n v-if=\"shouldShowCheckbox\"\r\n :class=\"itemCheckboxClassName\"\r\n @click.stop=\"handleCheckboxClick\"\r\n @dblclick.stop\r\n @keydown.stop>\r\n <ElCheckbox\r\n :model-value=\"isCheckedNode\"\r\n :indeterminate=\"isHalfCheckedNode\"\r\n :disabled=\"isCurrentCheckboxDisabled\"\r\n tabindex=\"-1\"\r\n aria-label=\"Select tree node\" />\r\n </span>\r\n <span :class=\"itemTitleClassName\">\r\n <slot v-if=\"hasDefaultSlot\" :node=\"slotNode\" :data=\"node.data\" />\r\n <template v-else>{{ node.label }}</template>\r\n </span>\r\n </div>\r\n <Transition name=\"fl-tree-collapse\">\r\n <div v-if=\"hasChildNodes && isExpandedNode\" :class=\"childrenClassName\" role=\"group\">\r\n <div :class=\"childrenInnerClassName\" role=\"presentation\">\r\n <FlTreeNode\r\n v-for=\"childNode in node.childNodes\"\r\n :key=\"childNode.key\"\r\n :node=\"childNode\"\r\n :get-node-id=\"getNodeId\"\r\n :register-node-element=\"registerNodeElement\"\r\n :unregister-node-element=\"unregisterNodeElement\"\r\n :on-node-content-click=\"onNodeContentClick\"\r\n :on-node-content-dblclick=\"onNodeContentDblclick\"\r\n :on-node-content-contextmenu=\"onNodeContentContextmenu\"\r\n :is-node-expanded=\"isNodeExpanded\"\r\n :is-node-checked=\"isNodeChecked\"\r\n :is-node-half-checked=\"isNodeHalfChecked\"\r\n :is-node-selected=\"isNodeSelected\"\r\n :is-node-focused=\"isNodeFocused\"\r\n :is-node-filtered=\"isNodeFiltered\"\r\n :is-node-loading=\"isNodeLoading\"\r\n :is-node-expandable=\"isNodeExpandable\"\r\n :is-node-draggable=\"isNodeDraggable\"\r\n :is-node-dragging=\"isNodeDragging\"\r\n :is-node-drop-target=\"isNodeDropTarget\"\r\n :is-node-drop-allowed=\"isNodeDropAllowed\"\r\n :get-node-drop-type=\"getNodeDropType\"\r\n :tree-checkable=\"treeCheckable\"\r\n :tree-selectable=\"treeSelectable\"\r\n :show-line=\"showLine\"\r\n :show-leaf-icon=\"showLeafIcon\"\r\n :switcher-icon=\"switcherIcon\"\r\n :switcher-loading-icon=\"switcherLoadingIcon\"\r\n :is-checkbox-disabled=\"isCheckboxDisabled\"\r\n :should-render-checkbox=\"shouldRenderCheckbox\"\r\n :toggle-node-checked=\"toggleNodeChecked\"\r\n :toggle-node-expansion=\"toggleNodeExpansion\"\r\n :handle-node-drag-start=\"handleNodeDragStart\"\r\n :handle-node-drag-enter=\"handleNodeDragEnter\"\r\n :handle-node-drag-over=\"handleNodeDragOver\"\r\n :handle-node-drag-leave=\"handleNodeDragLeave\"\r\n :handle-node-drop=\"handleNodeDrop\"\r\n :handle-node-drag-end=\"handleNodeDragEnd\"\r\n :resolved-class-names=\"resolvedClassNames\"\r\n :node-class-name=\"nodeClassName\"\r\n :resolved-styles=\"resolvedStyles\">\r\n <template v-if=\"hasDefaultSlot\" #default=\"slotProps\">\r\n <slot v-bind=\"slotProps\" />\r\n </template>\r\n </FlTreeNode>\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { MinusSquareOutlined, PlusSquareOutlined } from '@falcon-ui/icons'\r\nimport { CaretBottom, CaretRight, Folder, FolderOpened } from '@element-plus/icons-vue'\r\nimport { ElCheckbox, ElIcon } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport {\r\n computed,\r\n getCurrentInstance,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n type CSSProperties\r\n} from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n type TreeData,\r\n type TreeClassValue,\r\n type TreeInteractionEvent,\r\n type TreeKey,\r\n type TreeNode,\r\n type TreeNodeClassName,\r\n type TreeNodeDropType,\r\n type TreeNodeInstance,\r\n type TreeNodeModel,\r\n type TreeSemanticRecord,\r\n type TreeSwitcherLoadingIcon,\r\n type TreeSwitcherIconMode\r\n} from './tree'\r\n\r\ndefineOptions({\r\n name: 'FlTreeNode'\r\n})\r\n\r\ninterface TreeNodeDragTargetHandlerOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n element: HTMLElement\r\n}\r\n\r\ninterface TreeNodeDragHandlerOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n}\r\n\r\n/**\r\n * 内部节点组件只接收标准化节点和主入口下发的树状态能力。\r\n */\r\ninterface TreeNodeComponentProps {\r\n node: TreeNodeModel\r\n getNodeId: (nodeKey: TreeKey) => string\r\n registerNodeElement: (nodeKey: TreeKey, element: HTMLElement | null) => void\r\n unregisterNodeElement: (nodeKey: TreeKey, element: HTMLElement | null) => void\r\n onNodeContentClick: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n }) => void\r\n onNodeContentDblclick: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n }) => void\r\n onNodeContentContextmenu: (options: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n }) => void\r\n isNodeExpanded: (nodeKey: TreeKey) => boolean\r\n isNodeChecked: (nodeKey: TreeKey) => boolean\r\n isNodeHalfChecked: (nodeKey: TreeKey) => boolean\r\n isNodeSelected: (nodeKey: TreeKey) => boolean\r\n isNodeFocused: (nodeKey: TreeKey) => boolean\r\n isNodeFiltered: (node: TreeNodeModel) => boolean\r\n isNodeLoading: (nodeKey: TreeKey) => boolean\r\n isNodeExpandable: (node: TreeNodeModel) => boolean\r\n isNodeDraggable: (node: TreeNodeModel) => boolean\r\n isNodeDragging: (nodeKey: TreeKey) => boolean\r\n isNodeDropTarget: (nodeKey: TreeKey) => boolean\r\n isNodeDropAllowed: (nodeKey: TreeKey) => boolean\r\n getNodeDropType: (nodeKey: TreeKey) => TreeNodeDropType | undefined\r\n treeCheckable: boolean\r\n treeSelectable: boolean\r\n showLine: boolean\r\n showLeafIcon: boolean\r\n switcherIcon: TreeSwitcherIconMode\r\n switcherLoadingIcon: TreeSwitcherLoadingIcon\r\n isCheckboxDisabled: (node: TreeNodeModel) => boolean\r\n shouldRenderCheckbox: (node: TreeNodeModel) => boolean\r\n toggleNodeChecked: (options: { node: TreeNodeModel; event: TreeInteractionEvent }) => void\r\n toggleNodeExpansion: (options: { node: TreeNodeModel; instance: TreeNodeInstance }) => void\r\n handleNodeDragStart: (options: TreeNodeDragHandlerOptions) => void\r\n handleNodeDragEnter: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragOver: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragLeave: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDrop: (options: TreeNodeDragTargetHandlerOptions) => void\r\n handleNodeDragEnd: (options: TreeNodeDragHandlerOptions) => void\r\n resolvedClassNames: TreeSemanticRecord<TreeClassValue>\r\n nodeClassName?: TreeNodeClassName\r\n resolvedStyles: TreeSemanticRecord<CSSProperties>\r\n}\r\n\r\nconst props = defineProps<TreeNodeComponentProps>()\r\nconst slots = defineSlots<{\r\n default?: (props: { node: TreeNode; data: TreeData }) => unknown\r\n}>()\r\nconst currentInstance = getCurrentInstance()\r\nconst itemContentRef = ref<HTMLElement | null>(null)\r\nconst ns = useNamespace('tree')\r\nconst itemClassName = ns.e('item')\r\nconst itemContentClassName = ns.e('item-content')\r\nconst indentClassName = ns.e('indent')\r\nconst indentUnitClassName = ns.e('indent-unit')\r\nconst itemIconClassName = ns.e('item-icon')\r\nconst itemCheckboxClassName = ns.e('item-checkbox')\r\nconst switcherClassName = ns.e('switcher')\r\nconst switcherNoopClassName = ns.em('switcher', 'noop')\r\nconst switcherButtonClassName = ns.e('switcher-button')\r\nconst switcherDotClassName = ns.e('switcher-dot')\r\nconst switcherIconClassName = ns.e('switcher-icon')\r\nconst switcherLeafLineClassName = ns.e('switcher-leaf-line')\r\nconst switcherLeafIconClassName = ns.e('switcher-leaf-icon')\r\nconst itemTitleClassName = ns.e('item-title')\r\nconst childrenClassName = ns.e('children')\r\nconst childrenInnerClassName = ns.e('children-inner')\r\n\r\n/**\r\n * 返回当前递归节点组件的 public instance。\r\n */\r\nconst getNodeInstance = (): TreeNodeInstance => currentInstance?.proxy ?? null\r\n\r\n/**\r\n * 生成节点基础样式变量,保留层级信息供样式调试与后续扩展使用。\r\n */\r\nconst createItemStyle = () =>\r\n ({\r\n '--fl-tree-level': String(props.node.level)\r\n }) as CSSProperties & Record<string, string>\r\n\r\n/**\r\n * 判断当前节点是否具备展开能力。\r\n */\r\nconst resolveExpandableNodeState = () => props.isNodeExpandable(props.node)\r\n\r\n/**\r\n * 判断当前节点是否存在已经渲染到数据树中的子节点。\r\n */\r\nconst resolveHasChildNodesState = () => props.node.childNodes.length > 0\r\n\r\n/**\r\n * 判断当前节点是否处于展开状态。\r\n */\r\nconst resolveExpandedNodeState = () =>\r\n resolveExpandableNodeState() && props.isNodeExpanded(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否按叶子节点视觉渲染。\r\n */\r\nconst resolveLeafNodeState = () => !resolveExpandableNodeState()\r\n\r\n/**\r\n * 判断当前节点是否处于异步加载中。\r\n */\r\nconst resolveLoadingNodeState = () => props.isNodeLoading(props.node.key)\r\n\r\n/**\r\n * 返回当前节点祖先轨道的终止状态列表,用于逐层渲染连线轨道。\r\n */\r\nconst resolveLineTrackEnds = () => props.node.lineTrackEnds\r\n\r\n/**\r\n * 判断当前节点是否为所在层级的最后一个兄弟节点。\r\n */\r\nconst resolveLastSiblingNodeState = () => props.node.isLastSibling\r\n\r\n/**\r\n * 判断当前节点是否允许作为原生拖拽源。\r\n */\r\nconst resolveDraggableNodeState = () => props.isNodeDraggable(props.node)\r\n\r\n/**\r\n * 判断当前节点是否正在作为拖拽源。\r\n */\r\nconst resolveDraggingNodeState = () => props.isNodeDragging(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否为当前拖拽悬停目标。\r\n */\r\nconst resolveDropTargetNodeState = () => props.isNodeDropTarget(props.node.key)\r\n\r\n/**\r\n * 判断当前拖拽悬停目标是否允许投放。\r\n */\r\nconst resolveDropAllowedNodeState = () => props.isNodeDropAllowed(props.node.key)\r\n\r\n/**\r\n * 返回当前节点落点类型。\r\n */\r\nconst resolveNodeDropType = () => props.getNodeDropType(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否允许输出选中态语义。\r\n */\r\nconst resolveSelectableNodeState = () =>\r\n props.treeSelectable && props.node.selectable && !props.node.disabled\r\n\r\n/**\r\n * 判断当前节点是否处于选中态。\r\n */\r\nconst resolveSelectedNodeState = () => props.isNodeSelected(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否为键盘活动节点。\r\n */\r\nconst resolveFocusedNodeState = () => props.isNodeFocused(props.node.key)\r\n\r\nconst resolveFilteredNodeState = () => props.isNodeFiltered(props.node)\r\n\r\n/**\r\n * 判断当前节点是否处于勾选态。\r\n */\r\nconst resolveCheckedNodeState = () => props.isNodeChecked(props.node.key)\r\n\r\n/**\r\n * 判断当前节点是否处于 half-checked 状态。\r\n */\r\nconst resolveHalfCheckedNodeState = () => props.isNodeHalfChecked(props.node.key)\r\n\r\n/**\r\n * 判断当前节点复选框是否应表现为禁用。\r\n */\r\nconst resolveCheckboxDisabledState = () => props.isCheckboxDisabled(props.node)\r\n\r\n/**\r\n * 判断当前节点是否应渲染复选框。\r\n */\r\nconst resolveCheckboxVisibleState = () =>\r\n props.treeCheckable && props.shouldRenderCheckbox(props.node)\r\n\r\n/**\r\n * 根据 checked / half-checked 结果生成节点级 `aria-checked`。\r\n */\r\nconst resolveAriaCheckedState = () => {\r\n if (!resolveCheckboxVisibleState()) {\r\n return undefined\r\n }\r\n\r\n if (resolveHalfCheckedNodeState()) {\r\n return 'mixed'\r\n }\r\n\r\n return resolveCheckedNodeState() ? 'true' : 'false'\r\n}\r\n\r\n/**\r\n * 处理节点内容区点击,统一派发 `node-click` 与选择事件。\r\n */\r\nconst handleNodeContentClick = (event: MouseEvent) => {\r\n if (event.detail > 1) {\r\n return\r\n }\r\n\r\n props.onNodeContentClick({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 处理节点内容区双击,独立于单击选择链路派发。\r\n */\r\nconst handleNodeContentDblclick = (event: MouseEvent) => {\r\n props.onNodeContentDblclick({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\nconst handleNodeContentContextmenu = (event: MouseEvent) => {\r\n props.onNodeContentContextmenu({\r\n node: props.node,\r\n component: getNodeInstance(),\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 点击复选框只走勾选链路,不触发展开或选择事件。\r\n */\r\nconst handleCheckboxClick = (event: MouseEvent) => {\r\n if (!resolveCheckboxVisibleState() || props.isCheckboxDisabled(props.node)) {\r\n return\r\n }\r\n\r\n props.toggleNodeChecked({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 切换当前节点的展开状态;阶段 4 起 switcher 不再触发选择链路。\r\n */\r\nconst handleSwitcherClick = () => {\r\n if (!resolveExpandableNodeState() || resolveLoadingNodeState()) {\r\n return\r\n }\r\n\r\n props.toggleNodeExpansion({\r\n node: props.node,\r\n instance: getNodeInstance()\r\n })\r\n}\r\n\r\n/**\r\n * 返回拖拽事件当前绑定的内容区元素。\r\n */\r\nconst getDragEventElement = (event: DragEvent) => event.currentTarget as HTMLElement\r\n\r\n/**\r\n * 处理原生 dragstart。\r\n */\r\nconst handleDragStart = (event: DragEvent) => {\r\n props.handleNodeDragStart({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragenter。\r\n */\r\nconst handleDragEnter = (event: DragEvent) => {\r\n props.handleNodeDragEnter({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragover。\r\n */\r\nconst handleDragOver = (event: DragEvent) => {\r\n props.handleNodeDragOver({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragleave。\r\n */\r\nconst handleDragLeave = (event: DragEvent) => {\r\n props.handleNodeDragLeave({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 drop。\r\n */\r\nconst handleDrop = (event: DragEvent) => {\r\n props.handleNodeDrop({\r\n node: props.node,\r\n event,\r\n element: getDragEventElement(event)\r\n })\r\n}\r\n\r\n/**\r\n * 处理原生 dragend。\r\n */\r\nconst handleDragEnd = (event: DragEvent) => {\r\n props.handleNodeDragEnd({\r\n node: props.node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 返回已经解析完成的语义化 classNames。\r\n */\r\nconst getResolvedClassNames = () => props.resolvedClassNames\r\n\r\n/**\r\n * 返回由视图层回调解析出的节点级 class。\r\n */\r\nconst resolveCustomNodeClassName = () =>\r\n props.nodeClassName?.({\r\n node: slotNode.value,\r\n data: props.node.data\r\n })\r\n\r\n/**\r\n * 返回已经解析完成的语义化 styles。\r\n */\r\nconst getResolvedStyles = () => props.resolvedStyles\r\n\r\nconst nodeId = computed(() => props.getNodeId(props.node.key))\r\nconst itemStyle = computed(createItemStyle)\r\nconst hasDefaultSlot = computed(() => Boolean(slots.default))\r\nconst isExpandableNode = computed(resolveExpandableNodeState)\r\nconst hasChildNodes = computed(resolveHasChildNodesState)\r\nconst isExpandedNode = computed(resolveExpandedNodeState)\r\nconst isLeafNode = computed(resolveLeafNodeState)\r\nconst isLoadingNode = computed(resolveLoadingNodeState)\r\nconst lineTrackEnds = computed(resolveLineTrackEnds)\r\nconst isLastSiblingNode = computed(resolveLastSiblingNodeState)\r\nconst isDraggableNode = computed(resolveDraggableNodeState)\r\nconst isDraggingNode = computed(resolveDraggingNodeState)\r\nconst isDropTargetNode = computed(resolveDropTargetNodeState)\r\nconst isDropAllowedNode = computed(resolveDropAllowedNodeState)\r\nconst nodeDropType = computed(resolveNodeDropType)\r\nconst isDropForbiddenNode = computed(() => isDropTargetNode.value && !isDropAllowedNode.value)\r\nconst isDropBeforeNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'before')\r\nconst isDropInsideNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'inner')\r\nconst isDropAfterNode = computed(() => isDropTargetNode.value && nodeDropType.value === 'after')\r\nconst isCheckedNode = computed(resolveCheckedNodeState)\r\nconst isHalfCheckedNode = computed(resolveHalfCheckedNodeState)\r\nconst isCurrentCheckboxDisabled = computed(resolveCheckboxDisabledState)\r\nconst shouldShowCheckbox = computed(resolveCheckboxVisibleState)\r\nconst isSelectableNode = computed(resolveSelectableNodeState)\r\nconst isSelectedNode = computed(resolveSelectedNodeState)\r\nconst isFocusedNode = computed(resolveFocusedNodeState)\r\nconst isFilteredNode = computed(resolveFilteredNodeState)\r\nconst nodeAriaChecked = computed(resolveAriaCheckedState)\r\nconst slotNode = computed(() => createTreeEventNode({ node: props.node }))\r\nconst semanticClassNames = computed(getResolvedClassNames)\r\nconst customNodeClassName = computed(resolveCustomNodeClassName)\r\nconst semanticStyles = computed(getResolvedStyles)\r\n\r\nonMounted(() => {\r\n props.registerNodeElement(props.node.key, itemContentRef.value)\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n props.unregisterNodeElement(props.node.key, itemContentRef.value)\r\n})\r\n</script>\r\n","import {\r\n isTreeCheckedKeysObject,\r\n isTreeKey,\r\n type TreeCheckedKeys,\r\n type TreeIndex,\r\n type TreeKey,\r\n type TreeNodeModel\r\n} from './tree'\r\n\r\n/**\r\n * 勾选状态统一拆分为 checked / halfChecked 两套集合,便于默认联动与严格模式复用。\r\n */\r\nexport interface TreeCheckedState {\r\n checkedKeys: TreeKey[]\r\n halfCheckedKeys: TreeKey[]\r\n}\r\n\r\ntype TreeConductState = 'full' | 'partial' | 'none' | 'skip'\r\n\r\n/**\r\n * 判断节点自身是否允许渲染复选框并进入勾选结果。\r\n */\r\nconst isNodeCheckable = (node: TreeNodeModel) => node.checkboxVisible\r\n\r\n/**\r\n * 按树的可见遍历顺序输出 key,保证勾选与半选结果稳定。\r\n */\r\nconst orderTreeKeys = (keySet: Set<TreeKey>, treeIndex: TreeIndex) =>\r\n treeIndex.visibleNodeKeys.filter((key) => keySet.has(key))\r\n\r\n/**\r\n * 归一化勾选 key:\r\n * 1. 过滤非法 / 不存在节点\r\n * 2. 去重\r\n * 3. 过滤 `hiddenCheckboxKeys`\r\n * 4. 保留 `disabledKeys` / `disabledCheckboxKeys`,以支持受控展示\r\n */\r\nconst normalizeTreeCheckedKeyList = (\r\n keys: TreeKey[] | undefined,\r\n treeIndex: TreeIndex\r\n): TreeKey[] => {\r\n if (!Array.isArray(keys)) {\r\n return []\r\n }\r\n\r\n const normalizedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n\r\n for (const key of keys) {\r\n if (!isTreeKey(key) || visitedKeys.has(key)) {\r\n continue\r\n }\r\n\r\n const node = treeIndex.keyNodeMap.get(key)\r\n\r\n if (!node || !isNodeCheckable(node)) {\r\n continue\r\n }\r\n\r\n visitedKeys.add(key)\r\n normalizedKeys.push(key)\r\n }\r\n\r\n return normalizedKeys\r\n}\r\n\r\n/**\r\n * 严格模式下的 `halfChecked` 由外部直接控制,但不能与 `checked` 重复。\r\n */\r\nconst normalizeStrictHalfCheckedKeys = (\r\n keys: TreeKey[] | undefined,\r\n checkedKeys: TreeKey[],\r\n treeIndex: TreeIndex\r\n) => {\r\n const checkedKeySet = new Set<TreeKey>(checkedKeys)\r\n\r\n return normalizeTreeCheckedKeyList(keys, treeIndex).filter((key) => !checkedKeySet.has(key))\r\n}\r\n\r\n/**\r\n * 从树节点向下收集当前联动分支内所有可进入勾选结果的 key。\r\n * `disabledKeys` 是硬边界;`hiddenCheckboxKeys` 只跳过自身,不阻断对子孙的遍历。\r\n */\r\nconst collectConductBranchKeys = (node: TreeNodeModel) => {\r\n const branchKeySet = new Set<TreeKey>()\r\n\r\n const visit = (currentNode: TreeNodeModel) => {\r\n if (currentNode.disabled) {\r\n return\r\n }\r\n\r\n if (isNodeCheckable(currentNode)) {\r\n branchKeySet.add(currentNode.key)\r\n }\r\n\r\n for (const childNode of currentNode.childNodes) {\r\n visit(childNode)\r\n }\r\n }\r\n\r\n visit(node)\r\n\r\n return branchKeySet\r\n}\r\n\r\n/**\r\n * 取消联动勾选时,需要同步清理当前节点可达链路上的可勾选祖先。\r\n * `disabled` 祖先是硬边界,不再继续向上清理。\r\n */\r\nconst collectConductAncestorKeys = (node: TreeNodeModel) => {\r\n const ancestorKeySet = new Set<TreeKey>()\r\n let currentParent = node.parent\r\n\r\n while (currentParent) {\r\n if (currentParent.disabled) {\r\n break\r\n }\r\n\r\n if (isNodeCheckable(currentParent)) {\r\n ancestorKeySet.add(currentParent.key)\r\n }\r\n\r\n currentParent = currentParent.parent\r\n }\r\n\r\n return ancestorKeySet\r\n}\r\n\r\n/**\r\n * 从显式勾选 key 出发执行向下传导,得到用于后续半选计算的中间结果。\r\n */\r\nconst createConductedCheckedKeySet = (sourceCheckedKeys: TreeKey[], treeIndex: TreeIndex) => {\r\n const conductedCheckedKeySet = new Set<TreeKey>()\r\n\r\n for (const key of normalizeTreeCheckedKeyList(sourceCheckedKeys, treeIndex)) {\r\n const node = treeIndex.keyNodeMap.get(key)\r\n\r\n if (!node) {\r\n continue\r\n }\r\n\r\n if (node.disabled) {\r\n conductedCheckedKeySet.add(node.key)\r\n continue\r\n }\r\n\r\n for (const branchKey of collectConductBranchKeys(node)) {\r\n conductedCheckedKeySet.add(branchKey)\r\n }\r\n }\r\n\r\n return conductedCheckedKeySet\r\n}\r\n\r\n/**\r\n * 自底向上计算最终 checked / halfChecked:\r\n * 1. `disabled` 节点只保留自身受控状态,并阻断向父级的贡献\r\n * 2. 隐藏 checkbox 的节点作为透明桥接层,只透传子孙勾选结果\r\n */\r\nconst createConductedTreeCheckedState = (\r\n sourceCheckedKeySet: Set<TreeKey>,\r\n treeIndex: TreeIndex\r\n): TreeCheckedState => {\r\n const checkedKeySet = new Set<TreeKey>()\r\n const halfCheckedKeySet = new Set<TreeKey>()\r\n\r\n const visit = (node: TreeNodeModel): TreeConductState => {\r\n if (node.disabled) {\r\n for (const childNode of node.childNodes) {\r\n visit(childNode)\r\n }\r\n\r\n if (isNodeCheckable(node) && sourceCheckedKeySet.has(node.key)) {\r\n checkedKeySet.add(node.key)\r\n }\r\n\r\n return 'skip'\r\n }\r\n\r\n const childStates = node.childNodes\r\n .map((childNode) => visit(childNode))\r\n .filter((state) => state !== 'skip')\r\n const hasReachableChildren = childStates.length > 0\r\n const allChildrenChecked =\r\n hasReachableChildren && childStates.every((state) => state === 'full')\r\n const hasCheckedDescendant = childStates.some(\r\n (state) => state === 'full' || state === 'partial'\r\n )\r\n const selfChecked = isNodeCheckable(node) && sourceCheckedKeySet.has(node.key)\r\n\r\n if (!isNodeCheckable(node)) {\r\n if (allChildrenChecked) {\r\n return 'full'\r\n }\r\n\r\n if (hasCheckedDescendant) {\r\n return 'partial'\r\n }\r\n\r\n return 'skip'\r\n }\r\n\r\n if (hasReachableChildren && allChildrenChecked) {\r\n checkedKeySet.add(node.key)\r\n return 'full'\r\n }\r\n\r\n if (hasCheckedDescendant) {\r\n halfCheckedKeySet.add(node.key)\r\n return 'partial'\r\n }\r\n\r\n if (selfChecked) {\r\n checkedKeySet.add(node.key)\r\n return 'full'\r\n }\r\n\r\n return 'none'\r\n }\r\n\r\n for (const node of treeIndex.nodes) {\r\n visit(node)\r\n }\r\n\r\n return {\r\n checkedKeys: orderTreeKeys(checkedKeySet, treeIndex),\r\n halfCheckedKeys: orderTreeKeys(halfCheckedKeySet, treeIndex)\r\n }\r\n}\r\n\r\n/**\r\n * 默认联动模式下,对输入数组执行父子传导与半选态计算。\r\n */\r\nexport const conductTreeCheckedState = (\r\n sourceCheckedKeys: TreeKey[] | undefined,\r\n treeIndex: TreeIndex\r\n): TreeCheckedState =>\r\n createConductedTreeCheckedState(\r\n createConductedCheckedKeySet(sourceCheckedKeys ?? [], treeIndex),\r\n treeIndex\r\n )\r\n\r\n/**\r\n * 严格模式下,`checked` 与 `halfChecked` 仅做归一化,不自动联动。\r\n */\r\nexport const normalizeStrictTreeCheckedState = (\r\n checkedKeys: TreeCheckedKeys | undefined,\r\n treeIndex: TreeIndex\r\n): TreeCheckedState => {\r\n const normalizedCheckedKeys = normalizeTreeCheckedKeyList(\r\n isTreeCheckedKeysObject(checkedKeys) ? checkedKeys.checked : checkedKeys,\r\n treeIndex\r\n )\r\n const normalizedHalfCheckedKeys = isTreeCheckedKeysObject(checkedKeys)\r\n ? normalizeStrictHalfCheckedKeys(checkedKeys.halfChecked, normalizedCheckedKeys, treeIndex)\r\n : []\r\n\r\n return {\r\n checkedKeys: normalizedCheckedKeys,\r\n halfCheckedKeys: normalizedHalfCheckedKeys\r\n }\r\n}\r\n\r\n/**\r\n * 统一归一化当前模式下的勾选状态。\r\n */\r\nexport const normalizeTreeCheckedState = ({\r\n checkedKeys,\r\n treeIndex,\r\n strict\r\n}: {\r\n checkedKeys: TreeCheckedKeys | undefined\r\n treeIndex: TreeIndex\r\n strict: boolean\r\n}): TreeCheckedState =>\r\n strict\r\n ? normalizeStrictTreeCheckedState(checkedKeys, treeIndex)\r\n : conductTreeCheckedState(\r\n isTreeCheckedKeysObject(checkedKeys) ? checkedKeys.checked : checkedKeys,\r\n treeIndex\r\n )\r\n\r\n/**\r\n * 默认联动模式下切换某个节点的勾选状态:\r\n * 1. 勾选时选中当前节点及其可达子孙\r\n * 2. 取消时移除当前节点、其可达子孙以及沿途可勾选祖先\r\n * 3. 之后重新执行传导,生成新的 checked / halfChecked 结果\r\n */\r\nexport const toggleConductedTreeCheckedState = ({\r\n node,\r\n checkedKeys,\r\n treeIndex\r\n}: {\r\n node: TreeNodeModel\r\n checkedKeys: TreeKey[]\r\n treeIndex: TreeIndex\r\n}): TreeCheckedState => {\r\n const nextCheckedKeySet = new Set<TreeKey>(checkedKeys)\r\n const branchKeySet = collectConductBranchKeys(node)\r\n\r\n if (nextCheckedKeySet.has(node.key)) {\r\n for (const key of branchKeySet) {\r\n nextCheckedKeySet.delete(key)\r\n }\r\n\r\n for (const key of collectConductAncestorKeys(node)) {\r\n nextCheckedKeySet.delete(key)\r\n }\r\n } else {\r\n for (const key of branchKeySet) {\r\n nextCheckedKeySet.add(key)\r\n }\r\n }\r\n\r\n return conductTreeCheckedState(Array.from(nextCheckedKeySet), treeIndex)\r\n}\r\n\r\n/**\r\n * 将当前模式下的勾选状态编码回对外值形态。\r\n */\r\nexport const createTreeCheckedKeysValue = ({\r\n strict,\r\n checkedKeys,\r\n halfCheckedKeys\r\n}: {\r\n strict: boolean\r\n checkedKeys: TreeKey[]\r\n halfCheckedKeys: TreeKey[]\r\n}): TreeCheckedKeys =>\r\n strict\r\n ? {\r\n checked: checkedKeys,\r\n halfChecked: halfCheckedKeys\r\n }\r\n : checkedKeys\r\n","import { computed, ref, shallowRef, watch, type ComputedRef } from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n type TreeCheckEvent,\r\n type TreeCheckedKeys,\r\n type TreeIndex,\r\n type TreeInteractionEvent,\r\n type TreeKey,\r\n type TreeNodeModel,\r\n type TreeProps\r\n} from './tree'\r\nimport {\r\n createTreeCheckedKeysValue,\r\n normalizeTreeCheckedState,\r\n type TreeCheckedState,\r\n toggleConductedTreeCheckedState\r\n} from './use-tree-check-conduct'\r\n\r\ninterface UseTreeCheckedStateOptions {\r\n props: TreeProps\r\n treeIndex: ComputedRef<TreeIndex>\r\n emit: TreeCheckedStateEmit\r\n}\r\n\r\nexport interface TreeCheckedStateEmit {\r\n (event: 'update:checkedKeys', value: TreeCheckedKeys): void\r\n (event: 'check', checkedKeys: TreeCheckedKeys, checkEvent: TreeCheckEvent): void\r\n}\r\n\r\ninterface ToggleCheckedNodeOptions {\r\n node: TreeNodeModel\r\n event: TreeInteractionEvent\r\n}\r\n\r\n/**\r\n * FlTree 阶段 7-9 的勾选状态层统一负责:\r\n * 1. 默认联动模式的父子传导与半选态\r\n * 2. strict 模式的 `{ checked, halfChecked }` 对象态\r\n * 3. key-based 禁用、禁用 checkbox 与隐藏 checkbox 的交互边界\r\n */\r\nexport const useTreeCheckedState = ({ props, treeIndex, emit }: UseTreeCheckedStateOptions) => {\r\n const uncontrolledCheckedState = shallowRef<TreeCheckedState>({\r\n checkedKeys: [],\r\n halfCheckedKeys: []\r\n })\r\n const hasInitializedUncontrolledState = ref(false)\r\n\r\n /**\r\n * 显式传入 `checkedKeys` 时,组件进入受控勾选模式。\r\n */\r\n const isControlled = computed(() => props.checkedKeys !== undefined)\r\n\r\n /**\r\n * 树级 `checkable` 仅负责复选框的渲染与交互开关。\r\n */\r\n const isTreeCheckable = computed(() => props.checkable === true)\r\n\r\n /**\r\n * `checkStrictly` 决定当前对外值形态与勾选计算模式。\r\n */\r\n const isStrictMode = computed(() => props.checkStrictly === true)\r\n\r\n /**\r\n * 受控模式下始终按当前模式归一化外部勾选结果。\r\n */\r\n const controlledCheckedState = computed(() =>\r\n normalizeTreeCheckedState({\r\n checkedKeys: props.checkedKeys,\r\n treeIndex: treeIndex.value,\r\n strict: isStrictMode.value\r\n })\r\n )\r\n\r\n /**\r\n * 返回当前模式下对外可观察的勾选状态。\r\n */\r\n const getCurrentCheckedState = () =>\r\n isControlled.value ? controlledCheckedState.value : uncontrolledCheckedState.value\r\n\r\n /**\r\n * 统一返回当前 checked 集合。\r\n */\r\n const getCurrentCheckedKeys = () => getCurrentCheckedState().checkedKeys\r\n\r\n /**\r\n * 统一返回当前 half-checked 集合。\r\n */\r\n const getCurrentHalfCheckedKeys = () => getCurrentCheckedState().halfCheckedKeys\r\n\r\n /**\r\n * 初始化或裁剪非受控勾选状态:\r\n * 1. 首次只消费 `defaultCheckedKeys`\r\n * 2. 后续数据变更只裁剪失效 key\r\n * 3. 模式切换时复用当前可见状态重新归一化\r\n */\r\n const syncUncontrolledCheckedState = () => {\r\n if (!hasInitializedUncontrolledState.value) {\r\n uncontrolledCheckedState.value = normalizeTreeCheckedState({\r\n checkedKeys: props.defaultCheckedKeys,\r\n treeIndex: treeIndex.value,\r\n strict: isStrictMode.value\r\n })\r\n hasInitializedUncontrolledState.value = true\r\n return\r\n }\r\n\r\n uncontrolledCheckedState.value = normalizeTreeCheckedState({\r\n checkedKeys: createTreeCheckedKeysValue({\r\n strict: isStrictMode.value,\r\n checkedKeys: uncontrolledCheckedState.value.checkedKeys,\r\n halfCheckedKeys: uncontrolledCheckedState.value.halfCheckedKeys\r\n }),\r\n treeIndex: treeIndex.value,\r\n strict: isStrictMode.value\r\n })\r\n }\r\n\r\n /**\r\n * 判断指定节点当前是否处于 checked 状态。\r\n */\r\n const isNodeChecked = (nodeKey: TreeKey) => getCurrentCheckedKeys().includes(nodeKey)\r\n\r\n /**\r\n * 判断指定节点当前是否处于 half-checked 状态。\r\n */\r\n const isNodeHalfChecked = (nodeKey: TreeKey) => getCurrentHalfCheckedKeys().includes(nodeKey)\r\n\r\n /**\r\n * `hiddenCheckboxKeys` 只隐藏当前节点复选框,不阻断后代勾选。\r\n */\r\n const shouldRenderCheckbox = (node: TreeNodeModel) => node.checkboxVisible\r\n\r\n /**\r\n * `disabledKeys` 与 `disabledCheckboxKeys` 都会使当前节点复选框不可交互。\r\n */\r\n const isCheckboxDisabled = (node: TreeNodeModel) => node.checkboxDisabled\r\n\r\n /**\r\n * 判断当前节点是否允许响应复选框点击。\r\n */\r\n const canToggleNode = (node: TreeNodeModel) =>\r\n isTreeCheckable.value && shouldRenderCheckbox(node) && !isCheckboxDisabled(node)\r\n\r\n /**\r\n * strict 模式下只增删 `checked`,`halfChecked` 仅由外部回写控制。\r\n */\r\n const createNextStrictCheckedState = (nodeKey: TreeKey): TreeCheckedState => {\r\n const currentCheckedState = getCurrentCheckedState()\r\n const nextCheckedKeys = currentCheckedState.checkedKeys.includes(nodeKey)\r\n ? currentCheckedState.checkedKeys.filter((key) => key !== nodeKey)\r\n : [...currentCheckedState.checkedKeys, nodeKey]\r\n const nextCheckedKeySet = new Set<TreeKey>(nextCheckedKeys)\r\n\r\n return {\r\n checkedKeys: nextCheckedKeys,\r\n halfCheckedKeys: currentCheckedState.halfCheckedKeys.filter(\r\n (key) => key !== nodeKey && !nextCheckedKeySet.has(key)\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 根据当前模式生成下一次勾选结果。\r\n */\r\n const createNextCheckedState = (node: TreeNodeModel) =>\r\n isStrictMode.value\r\n ? createNextStrictCheckedState(node.key)\r\n : toggleConductedTreeCheckedState({\r\n node,\r\n checkedKeys: getCurrentCheckedKeys(),\r\n treeIndex: treeIndex.value\r\n })\r\n\r\n /**\r\n * 统一抛出勾选状态变更事件,并补齐 half-checked 信息。\r\n */\r\n const emitCheckedStateChange = ({\r\n node,\r\n event,\r\n nextCheckedState\r\n }: {\r\n node: TreeNodeModel\r\n event: TreeInteractionEvent\r\n nextCheckedState: TreeCheckedState\r\n }) => {\r\n const nextCheckedKeysValue = createTreeCheckedKeysValue({\r\n strict: isStrictMode.value,\r\n checkedKeys: nextCheckedState.checkedKeys,\r\n halfCheckedKeys: nextCheckedState.halfCheckedKeys\r\n })\r\n\r\n emit('update:checkedKeys', nextCheckedKeysValue)\r\n emit('check', nextCheckedKeysValue, {\r\n checked: nextCheckedState.checkedKeys.includes(node.key),\r\n node: createTreeEventNode({ node }),\r\n checkedNodes: nextCheckedState.checkedKeys\r\n .map((key) => treeIndex.value.keyNodeMap.get(key))\r\n .filter((item): item is TreeNodeModel => item !== undefined)\r\n .map((checkedNode) => createTreeEventNode({ node: checkedNode })),\r\n halfCheckedKeys: nextCheckedState.halfCheckedKeys,\r\n key: node.key,\r\n event\r\n })\r\n }\r\n\r\n /**\r\n * 切换当前节点勾选状态。\r\n */\r\n const toggleCheckedNode = ({ node, event }: ToggleCheckedNodeOptions) => {\r\n if (!canToggleNode(node)) {\r\n return\r\n }\r\n\r\n const nextCheckedState = createNextCheckedState(node)\r\n\r\n if (!isControlled.value) {\r\n uncontrolledCheckedState.value = nextCheckedState\r\n }\r\n\r\n emitCheckedStateChange({\r\n node,\r\n event,\r\n nextCheckedState\r\n })\r\n }\r\n\r\n watch(\r\n [treeIndex, isControlled, isStrictMode],\r\n () => {\r\n if (!isControlled.value) {\r\n syncUncontrolledCheckedState()\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n return {\r\n checkedKeys: computed(getCurrentCheckedKeys),\r\n halfCheckedKeys: computed(getCurrentHalfCheckedKeys),\r\n isCheckboxDisabled,\r\n isControlled,\r\n isNodeChecked,\r\n isNodeHalfChecked,\r\n isStrictMode,\r\n isTreeCheckable,\r\n shouldRenderCheckbox,\r\n toggleCheckedNode\r\n }\r\n}\r\n","import { computed, shallowRef, watch, type ComputedRef } from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n resolveTreeNodePropsConfig,\r\n type TreeData,\r\n type TreeIndex,\r\n type TreeKey,\r\n type TreeNode,\r\n type TreeNodeDragEndArgs,\r\n type TreeNodeDragStartArgs,\r\n type TreeNodeDragTargetArgs,\r\n type TreeNodeDropArgs,\r\n type TreeNodeDropType,\r\n type TreeNodeModel,\r\n type TreeProps\r\n} from './tree'\r\n\r\ninterface UseTreeDragStateOptions {\r\n props: TreeProps\r\n treeIndex: ComputedRef<TreeIndex>\r\n emit: TreeDragStateEmit\r\n notifyDataChange: () => void\r\n}\r\n\r\nexport interface TreeDragStateEmit {\r\n (event: 'node-drag-start', ...args: TreeNodeDragStartArgs): void\r\n (event: 'node-drag-enter', ...args: TreeNodeDragTargetArgs): void\r\n (event: 'node-drag-over', ...args: TreeNodeDragTargetArgs): void\r\n (event: 'node-drag-leave', ...args: TreeNodeDragTargetArgs): void\r\n (event: 'node-drag-end', ...args: TreeNodeDragEndArgs): void\r\n (event: 'node-drop', ...args: TreeNodeDropArgs): void\r\n}\r\n\r\ninterface TreeDragTargetState {\r\n key: TreeKey\r\n dropType: TreeNodeDropType\r\n}\r\n\r\ninterface TreeDragTargetOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n element: HTMLElement\r\n}\r\n\r\ninterface TreeDragNodeOptions {\r\n node: TreeNodeModel\r\n event: DragEvent\r\n}\r\n\r\ninterface TreeDataLocation {\r\n parent: TreeData[]\r\n index: number\r\n node: TreeData\r\n}\r\n\r\ninterface TreeDropPermission {\r\n prev: boolean\r\n inner: boolean\r\n next: boolean\r\n}\r\n\r\n/**\r\n * 判断 source 是否包含 target。\r\n */\r\nconst containsTreeNode = (source: TreeNodeModel, target: TreeNodeModel): boolean =>\r\n source.childNodes.some(\r\n (childNode) => childNode.key === target.key || containsTreeNode(childNode, target)\r\n )\r\n\r\n/**\r\n * 读取原始节点 children;拖拽排序必须遵守 props.children 字段映射。\r\n */\r\nconst readRawChildren = (node: TreeData, childrenFieldName: string): TreeData[] => {\r\n const childrenValue = node[childrenFieldName]\r\n\r\n return Array.isArray(childrenValue) ? (childrenValue as TreeData[]) : []\r\n}\r\n\r\n/**\r\n * 获取可写 children,不存在时按字段映射创建空数组。\r\n */\r\nconst ensureRawChildren = (node: TreeData, childrenFieldName: string): TreeData[] => {\r\n const childrenValue = node[childrenFieldName]\r\n\r\n if (Array.isArray(childrenValue)) {\r\n return childrenValue as TreeData[]\r\n }\r\n\r\n const nextChildren: TreeData[] = []\r\n node[childrenFieldName] = nextChildren\r\n\r\n return nextChildren\r\n}\r\n\r\n/**\r\n * 在原始数据中定位指定 key 的节点与所在数组。\r\n */\r\nconst findTreeDataLocation = (\r\n nodes: TreeData[],\r\n targetKey: TreeKey,\r\n childrenFieldName: string\r\n): TreeDataLocation | undefined => {\r\n for (let index = 0; index < nodes.length; index += 1) {\r\n const node = nodes[index]\r\n\r\n if (node.key === targetKey) {\r\n return {\r\n parent: nodes,\r\n index,\r\n node\r\n }\r\n }\r\n\r\n const childLocation = findTreeDataLocation(\r\n readRawChildren(node, childrenFieldName),\r\n targetKey,\r\n childrenFieldName\r\n )\r\n\r\n if (childLocation) {\r\n return childLocation\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\n/**\r\n * 计算 Element Plus 风格的实际投放类型。\r\n */\r\nconst resolveDropType = ({\r\n event,\r\n element,\r\n permission\r\n}: {\r\n event: DragEvent\r\n element: HTMLElement\r\n permission: TreeDropPermission\r\n}): TreeNodeDropType => {\r\n const rect = element.getBoundingClientRect()\r\n\r\n if (rect.height <= 0) {\r\n return permission.inner ? 'inner' : 'none'\r\n }\r\n\r\n const prevPercent = permission.prev\r\n ? permission.inner\r\n ? 0.25\r\n : permission.next\r\n ? 0.45\r\n : 1\r\n : Number.NEGATIVE_INFINITY\r\n const nextPercent = permission.next\r\n ? permission.inner\r\n ? 0.75\r\n : permission.prev\r\n ? 0.55\r\n : 0\r\n : Number.POSITIVE_INFINITY\r\n const distance = event.clientY - rect.top\r\n\r\n if (distance < rect.height * prevPercent) {\r\n return 'before'\r\n }\r\n\r\n if (distance > rect.height * nextPercent) {\r\n return 'after'\r\n }\r\n\r\n return permission.inner ? 'inner' : 'none'\r\n}\r\n\r\n/**\r\n * FlTree 拖拽状态层,对齐 Element Plus Tree:\r\n * 1. dragend 阶段内部原地重排 data\r\n * 2. 使用 node-drag-* / node-drop 多参数事件\r\n * 3. allowDrop 按 prev / inner / next 三种类型分别判断\r\n */\r\nexport const useTreeDragState = ({\r\n props,\r\n treeIndex,\r\n emit,\r\n notifyDataChange\r\n}: UseTreeDragStateOptions) => {\r\n const dragNodeKey = shallowRef<TreeKey | null>(null)\r\n const dragTargetState = shallowRef<TreeDragTargetState | null>(null)\r\n\r\n const isTreeDraggable = computed(() => props.draggable === true)\r\n\r\n const getDragNode = () => {\r\n if (dragNodeKey.value === null) {\r\n return undefined\r\n }\r\n\r\n return treeIndex.value.keyNodeMap.get(dragNodeKey.value)\r\n }\r\n\r\n const getDropNode = () => {\r\n const dropNodeKey = dragTargetState.value?.key\r\n\r\n if (dropNodeKey === undefined) {\r\n return undefined\r\n }\r\n\r\n return treeIndex.value.keyNodeMap.get(dropNodeKey)\r\n }\r\n\r\n const createEventNode = (node: TreeNodeModel): TreeNode => createTreeEventNode({ node })\r\n\r\n const isNodeDraggable = () => isTreeDraggable.value\r\n\r\n const getSiblings = (node: TreeNodeModel) =>\r\n node.parent ? node.parent.childNodes : treeIndex.value.nodes\r\n\r\n const applyBuiltinDropRules = (\r\n permission: TreeDropPermission,\r\n draggingNode: TreeNodeModel,\r\n dropNode: TreeNodeModel\r\n ): TreeDropPermission => {\r\n const nextPermission = { ...permission }\r\n const siblings = getSiblings(dropNode)\r\n const dropNodeIndex = siblings.findIndex((node) => node.key === dropNode.key)\r\n\r\n if (siblings[dropNodeIndex + 1]?.key === draggingNode.key) {\r\n nextPermission.next = false\r\n }\r\n\r\n if (siblings[dropNodeIndex - 1]?.key === draggingNode.key) {\r\n nextPermission.prev = false\r\n }\r\n\r\n if (dropNode.childNodes.some((childNode) => childNode.key === draggingNode.key)) {\r\n nextPermission.inner = false\r\n }\r\n\r\n if (draggingNode.key === dropNode.key || containsTreeNode(draggingNode, dropNode)) {\r\n nextPermission.prev = false\r\n nextPermission.inner = false\r\n nextPermission.next = false\r\n }\r\n\r\n return nextPermission\r\n }\r\n\r\n const createUserDropPermission = (\r\n draggingNode: TreeNodeModel,\r\n dropNode: TreeNodeModel\r\n ): TreeDropPermission => {\r\n if (typeof props.allowDrop !== 'function') {\r\n return {\r\n prev: true,\r\n inner: true,\r\n next: true\r\n }\r\n }\r\n\r\n const draggingEventNode = createEventNode(draggingNode)\r\n const dropEventNode = createEventNode(dropNode)\r\n\r\n return {\r\n prev: props.allowDrop(draggingEventNode, dropEventNode, 'prev') !== false,\r\n inner: props.allowDrop(draggingEventNode, dropEventNode, 'inner') !== false,\r\n next: props.allowDrop(draggingEventNode, dropEventNode, 'next') !== false\r\n }\r\n }\r\n\r\n const createDropPermission = (\r\n draggingNode: TreeNodeModel,\r\n dropNode: TreeNodeModel\r\n ): TreeDropPermission =>\r\n applyBuiltinDropRules(createUserDropPermission(draggingNode, dropNode), draggingNode, dropNode)\r\n\r\n const updateDragTargetState = ({\r\n node,\r\n event,\r\n element\r\n }: TreeDragTargetOptions): {\r\n draggingNode: TreeNodeModel\r\n dropNode: TreeNodeModel\r\n previousDropNode: TreeNodeModel | undefined\r\n dropType: TreeNodeDropType\r\n } | null => {\r\n const draggingNode = getDragNode()\r\n\r\n if (!draggingNode) {\r\n return null\r\n }\r\n\r\n const previousDropNode = getDropNode()\r\n const dropType = resolveDropType({\r\n event,\r\n element,\r\n permission: createDropPermission(draggingNode, node)\r\n })\r\n\r\n dragTargetState.value = {\r\n key: node.key,\r\n dropType\r\n }\r\n\r\n return {\r\n draggingNode,\r\n dropNode: node,\r\n previousDropNode,\r\n dropType\r\n }\r\n }\r\n\r\n const setNativeDragData = (event: DragEvent) => {\r\n if (!event.dataTransfer) {\r\n return\r\n }\r\n\r\n event.dataTransfer.effectAllowed = 'move'\r\n\r\n try {\r\n event.dataTransfer.setData('text/plain', '')\r\n } catch {\r\n /**\r\n * Firefox 需要 setData 才能启动拖拽;测试环境不支持时忽略。\r\n */\r\n }\r\n }\r\n\r\n const moveTreeData = ({\r\n dragKey,\r\n dropKey,\r\n dropType\r\n }: {\r\n dragKey: TreeKey\r\n dropKey: TreeKey\r\n dropType: Exclude<TreeNodeDropType, 'none'>\r\n }) => {\r\n const childrenFieldName = resolveTreeNodePropsConfig(props.props).children\r\n const rootData = props.data ?? []\r\n const dragLocation = findTreeDataLocation(rootData, dragKey, childrenFieldName)\r\n\r\n if (!dragLocation) {\r\n return false\r\n }\r\n\r\n const [dragData] = dragLocation.parent.splice(dragLocation.index, 1)\r\n const dropLocation = findTreeDataLocation(rootData, dropKey, childrenFieldName)\r\n\r\n if (!dragData || !dropLocation) {\r\n if (dragData) {\r\n dragLocation.parent.splice(\r\n Math.min(dragLocation.index, dragLocation.parent.length),\r\n 0,\r\n dragData\r\n )\r\n }\r\n\r\n return false\r\n }\r\n\r\n if (dropType === 'inner') {\r\n ensureRawChildren(dropLocation.node, childrenFieldName).push(dragData)\r\n return true\r\n }\r\n\r\n const insertIndex = dropType === 'before' ? dropLocation.index : dropLocation.index + 1\r\n dropLocation.parent.splice(insertIndex, 0, dragData)\r\n\r\n return true\r\n }\r\n\r\n const handleNodeDragStart = ({ node, event }: TreeDragNodeOptions) => {\r\n if (!props.draggable) {\r\n return\r\n }\r\n\r\n if (typeof props.allowDrag === 'function' && !props.allowDrag(createEventNode(node))) {\r\n event.preventDefault()\r\n return\r\n }\r\n\r\n dragNodeKey.value = node.key\r\n dragTargetState.value = null\r\n setNativeDragData(event)\r\n emit('node-drag-start', createEventNode(node), event)\r\n }\r\n\r\n const handleNodeDragEnter = (options: TreeDragTargetOptions) => {\r\n if (!getDragNode()) {\r\n return\r\n }\r\n\r\n options.event.preventDefault()\r\n\r\n const currentTarget = updateDragTargetState(options)\r\n\r\n if (currentTarget) {\r\n emit(\r\n 'node-drag-enter',\r\n createEventNode(currentTarget.draggingNode),\r\n createEventNode(currentTarget.dropNode),\r\n options.event\r\n )\r\n }\r\n }\r\n\r\n const handleNodeDragOver = (options: TreeDragTargetOptions) => {\r\n if (!getDragNode()) {\r\n return\r\n }\r\n\r\n options.event.preventDefault()\r\n\r\n const previousTargetKey = dragTargetState.value?.key\r\n const currentTarget = updateDragTargetState(options)\r\n\r\n if (!currentTarget) {\r\n return\r\n }\r\n\r\n if (options.event.dataTransfer) {\r\n options.event.dataTransfer.dropEffect = currentTarget.dropType === 'none' ? 'none' : 'move'\r\n }\r\n\r\n if (previousTargetKey !== currentTarget.dropNode.key) {\r\n if (currentTarget.previousDropNode) {\r\n emit(\r\n 'node-drag-leave',\r\n createEventNode(currentTarget.draggingNode),\r\n createEventNode(currentTarget.previousDropNode),\r\n options.event\r\n )\r\n }\r\n\r\n emit(\r\n 'node-drag-enter',\r\n createEventNode(currentTarget.draggingNode),\r\n createEventNode(currentTarget.dropNode),\r\n options.event\r\n )\r\n }\r\n\r\n emit(\r\n 'node-drag-over',\r\n createEventNode(currentTarget.draggingNode),\r\n createEventNode(currentTarget.dropNode),\r\n options.event\r\n )\r\n }\r\n\r\n const handleNodeDragLeave = ({ node, event }: TreeDragTargetOptions) => {\r\n const draggingNode = getDragNode()\r\n\r\n if (!draggingNode || dragTargetState.value?.key !== node.key) {\r\n return\r\n }\r\n\r\n dragTargetState.value = null\r\n emit('node-drag-leave', createEventNode(draggingNode), createEventNode(node), event)\r\n }\r\n\r\n const handleNodeDrop = ({ event }: TreeDragTargetOptions) => {\r\n if (!getDragNode()) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n }\r\n\r\n const handleNodeDragEnd = ({ node, event }: TreeDragNodeOptions) => {\r\n const draggingNode = getDragNode() ?? node\r\n const dropNode = getDropNode()\r\n const targetState = dragTargetState.value\r\n let finalDropType = targetState?.dropType ?? 'none'\r\n let moved = false\r\n\r\n event.preventDefault()\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = finalDropType === 'none' ? 'none' : 'move'\r\n }\r\n\r\n if (dropNode && finalDropType !== 'none') {\r\n moved = moveTreeData({\r\n dragKey: draggingNode.key,\r\n dropKey: dropNode.key,\r\n dropType: finalDropType\r\n })\r\n\r\n if (moved) {\r\n notifyDataChange()\r\n } else {\r\n finalDropType = 'none'\r\n }\r\n }\r\n\r\n const latestDraggingNode = treeIndex.value.keyNodeMap.get(draggingNode.key) ?? draggingNode\r\n const latestDropNode = dropNode\r\n ? (treeIndex.value.keyNodeMap.get(dropNode.key) ?? dropNode)\r\n : null\r\n\r\n if (dragNodeKey.value !== null) {\r\n emit(\r\n 'node-drag-end',\r\n createEventNode(latestDraggingNode),\r\n latestDropNode ? createEventNode(latestDropNode) : null,\r\n finalDropType,\r\n event\r\n )\r\n\r\n if (moved && latestDropNode && finalDropType !== 'none') {\r\n emit(\r\n 'node-drop',\r\n createEventNode(latestDraggingNode),\r\n createEventNode(latestDropNode),\r\n finalDropType,\r\n event\r\n )\r\n }\r\n }\r\n\r\n dragNodeKey.value = null\r\n dragTargetState.value = null\r\n }\r\n\r\n const isNodeDragging = (nodeKey: TreeKey) => dragNodeKey.value === nodeKey\r\n\r\n const isNodeDropTarget = (nodeKey: TreeKey) => dragTargetState.value?.key === nodeKey\r\n\r\n const isNodeDropAllowed = (nodeKey: TreeKey) =>\r\n dragTargetState.value?.key === nodeKey && dragTargetState.value.dropType !== 'none'\r\n\r\n const getNodeDropType = (nodeKey: TreeKey) =>\r\n dragTargetState.value?.key === nodeKey ? dragTargetState.value.dropType : undefined\r\n\r\n const syncDragState = () => {\r\n if (dragNodeKey.value !== null && !treeIndex.value.keyNodeMap.has(dragNodeKey.value)) {\r\n dragNodeKey.value = null\r\n }\r\n\r\n const targetKey = dragTargetState.value?.key\r\n\r\n if (targetKey !== undefined && !treeIndex.value.keyNodeMap.has(targetKey)) {\r\n dragTargetState.value = null\r\n }\r\n }\r\n\r\n watch(treeIndex, syncDragState)\r\n\r\n return {\r\n getNodeDropType,\r\n handleNodeDragEnd,\r\n handleNodeDragEnter,\r\n handleNodeDragLeave,\r\n handleNodeDragOver,\r\n handleNodeDragStart,\r\n handleNodeDrop,\r\n isNodeDraggable,\r\n isNodeDragging,\r\n isNodeDropAllowed,\r\n isNodeDropTarget\r\n }\r\n}\r\n","import { computed, ref, shallowRef, watch, type ComputedRef } from 'vue'\r\nimport {\r\n collectAncestorExpandedKeys,\r\n collectExpandableTreeKeys,\r\n createEffectiveExpandedKeySet,\r\n createTreeEventNode,\r\n filterTreeExpandedKeys,\r\n normalizeAccordionExpandedKeys,\r\n pruneTreeKeySet,\r\n type TreeExpandEvent,\r\n type TreeExpandedNode,\r\n type TreeIndex,\r\n type TreeKey,\r\n type TreeNodeInstance,\r\n type TreeNodeModel,\r\n type TreeProps\r\n} from './tree'\r\n\r\n/**\r\n * 统一约束组合式展开状态层的输入参数。\r\n */\r\ninterface UseTreeExpandedStateOptions {\r\n props: TreeProps\r\n treeIndex: ComputedRef<TreeIndex>\r\n emit: TreeExpandedStateEmit\r\n isNodeExpandable?: (node: TreeNodeModel) => boolean\r\n}\r\n\r\n/**\r\n * 灞曞紑鐘舵€佸眰鍙叧蹇冨睍寮€鐩稿叧鐨勪簨浠跺悎鍚屻€?\r\n */\r\nexport interface TreeExpandedStateEmit {\r\n (event: 'update:expandedKeys', value: TreeKey[]): void\r\n (event: 'expand', eventPayload: TreeExpandEvent): void\r\n (\r\n event: 'node-expand',\r\n data: TreeNodeModel['data'],\r\n node: TreeExpandedNode,\r\n instance: TreeNodeInstance\r\n ): void\r\n (\r\n event: 'node-collapse',\r\n data: TreeNodeModel['data'],\r\n node: TreeExpandedNode,\r\n instance: TreeNodeInstance\r\n ): void\r\n}\r\n\r\n/**\r\n * 切换展开状态时需要的节点上下文。\r\n */\r\ninterface ToggleNodeExpansionOptions {\r\n node: TreeNodeModel\r\n instance: TreeNodeInstance\r\n}\r\n\r\n/**\r\n * 切换源展开键数组中的单个节点键,保持原有顺序并在末尾追加新键。\r\n */\r\nconst toggleExpandedKey = (expandedKeys: TreeKey[], nodeKey: TreeKey): TreeKey[] => {\r\n if (expandedKeys.includes(nodeKey)) {\r\n return expandedKeys.filter((key) => key !== nodeKey)\r\n }\r\n\r\n return [...expandedKeys, nodeKey]\r\n}\r\n\r\nconst normalizeSourceExpandedKeys = (\r\n expandedKeys: TreeKey[],\r\n props: TreeProps,\r\n treeIndex: TreeIndex\r\n) =>\r\n props.accordion\r\n ? normalizeAccordionExpandedKeys(expandedKeys, treeIndex.parentKeyMap)\r\n : expandedKeys\r\n\r\n/**\r\n * 构建非受控模式的初始化源展开键集合。\r\n */\r\nconst createInitialSourceExpandedKeys = (props: TreeProps, treeIndex: TreeIndex): TreeKey[] => {\r\n let initialExpandedKeys: TreeKey[]\r\n\r\n if (props.defaultExpandedKeys !== undefined) {\r\n initialExpandedKeys = filterTreeExpandedKeys(props.defaultExpandedKeys, treeIndex.keyNodeMap)\r\n return normalizeSourceExpandedKeys(initialExpandedKeys, props, treeIndex)\r\n }\r\n\r\n if (props.defaultExpandAll) {\r\n initialExpandedKeys = collectExpandableTreeKeys(treeIndex.nodes)\r\n return normalizeSourceExpandedKeys(initialExpandedKeys, props, treeIndex)\r\n }\r\n\r\n return []\r\n}\r\n\r\n/**\r\n * 仅在非受控初始化阶段,为 `defaultExpandedKeys` 生成祖先自动展开集合。\r\n */\r\nconst createInitialInheritedExpandedKeySet = (\r\n props: TreeProps,\r\n treeIndex: TreeIndex,\r\n sourceExpandedKeys: TreeKey[]\r\n): Set<TreeKey> => {\r\n if (props.defaultExpandedKeys === undefined || !props.defaultExpandParent) {\r\n return new Set<TreeKey>()\r\n }\r\n\r\n const ancestorExpandedKeys = collectAncestorExpandedKeys(\r\n sourceExpandedKeys,\r\n treeIndex.parentKeyMap\r\n )\r\n\r\n for (const key of sourceExpandedKeys) {\r\n ancestorExpandedKeys.delete(key)\r\n }\r\n\r\n return ancestorExpandedKeys\r\n}\r\n\r\n/**\r\n * 合并非受控模式的源展开键与初始化继承展开键,生成实际渲染集合。\r\n */\r\nconst createUncontrolledEffectiveExpandedKeySet = ({\r\n sourceExpandedKeys,\r\n inheritedExpandedKeySet,\r\n collapsedInheritedKeySet,\r\n parentKeyMap,\r\n accordion\r\n}: {\r\n sourceExpandedKeys: TreeKey[]\r\n inheritedExpandedKeySet: Set<TreeKey>\r\n collapsedInheritedKeySet: Set<TreeKey>\r\n parentKeyMap: Map<TreeKey, TreeKey | null>\r\n accordion: boolean\r\n}): Set<TreeKey> => {\r\n const inheritedExpandedKeys = [...inheritedExpandedKeySet].filter(\r\n (key) => !collapsedInheritedKeySet.has(key)\r\n )\r\n\r\n if (accordion) {\r\n const orderedExpandedKeys: TreeKey[] = []\r\n const visitedKeys = new Set<TreeKey>()\r\n const addExpandedKey = (key: TreeKey) => {\r\n if (!visitedKeys.has(key)) {\r\n visitedKeys.add(key)\r\n orderedExpandedKeys.push(key)\r\n }\r\n }\r\n\r\n for (const key of sourceExpandedKeys) {\r\n let parentKey = parentKeyMap.get(key) ?? null\r\n\r\n while (parentKey !== null) {\r\n if (inheritedExpandedKeySet.has(parentKey) && !collapsedInheritedKeySet.has(parentKey)) {\r\n addExpandedKey(parentKey)\r\n }\r\n\r\n parentKey = parentKeyMap.get(parentKey) ?? null\r\n }\r\n\r\n addExpandedKey(key)\r\n }\r\n\r\n return new Set(normalizeAccordionExpandedKeys(orderedExpandedKeys, parentKeyMap))\r\n }\r\n\r\n const effectiveExpandedKeys = new Set<TreeKey>(sourceExpandedKeys)\r\n\r\n for (const key of inheritedExpandedKeys) {\r\n effectiveExpandedKeys.add(key)\r\n }\r\n\r\n return effectiveExpandedKeys\r\n}\r\n\r\n/**\r\n * FlTree 阶段 3 的展开状态层:\r\n * 1. 管理非受控初始化与受控渲染优先级\r\n * 2. 区分源展开键与最终渲染展开集合\r\n * 3. 统一收口 switcher 展开/收起事件\r\n */\r\nexport const useTreeExpandedState = ({\r\n props,\r\n treeIndex,\r\n emit,\r\n isNodeExpandable\r\n}: UseTreeExpandedStateOptions) => {\r\n const uncontrolledSourceExpandedKeys = shallowRef<TreeKey[]>([])\r\n const inheritedExpandedKeySet = shallowRef(new Set<TreeKey>())\r\n const collapsedInheritedKeySet = shallowRef(new Set<TreeKey>())\r\n const hasInitializedUncontrolledState = ref(false)\r\n const canToggleNodeExpansion =\r\n isNodeExpandable ?? ((node: TreeNodeModel) => node.childNodes.length > 0)\r\n\r\n /**\r\n * 只要外部显式传入 `expandedKeys`,组件即进入受控模式。\r\n */\r\n const isControlled = computed(() => props.expandedKeys !== undefined)\r\n\r\n /**\r\n * 受控模式下直接基于外部 prop 过滤源展开键。\r\n */\r\n const controlledSourceExpandedKeys = computed(() =>\r\n normalizeSourceExpandedKeys(\r\n filterTreeExpandedKeys(props.expandedKeys, treeIndex.value.keyNodeMap),\r\n props,\r\n treeIndex.value\r\n )\r\n )\r\n\r\n /**\r\n * 返回当前模式下对外可观察的源展开键集合。\r\n */\r\n const getCurrentSourceExpandedKeys = () =>\r\n isControlled.value ? controlledSourceExpandedKeys.value : uncontrolledSourceExpandedKeys.value\r\n\r\n /**\r\n * 初始化或裁剪非受控模式内部状态。\r\n */\r\n const syncUncontrolledExpandedState = () => {\r\n if (!hasInitializedUncontrolledState.value) {\r\n const initialSourceExpandedKeys = createInitialSourceExpandedKeys(props, treeIndex.value)\r\n\r\n uncontrolledSourceExpandedKeys.value = initialSourceExpandedKeys\r\n inheritedExpandedKeySet.value = createInitialInheritedExpandedKeySet(\r\n props,\r\n treeIndex.value,\r\n initialSourceExpandedKeys\r\n )\r\n collapsedInheritedKeySet.value = new Set<TreeKey>()\r\n hasInitializedUncontrolledState.value = true\r\n return\r\n }\r\n\r\n uncontrolledSourceExpandedKeys.value = normalizeSourceExpandedKeys(\r\n filterTreeExpandedKeys(uncontrolledSourceExpandedKeys.value, treeIndex.value.keyNodeMap),\r\n props,\r\n treeIndex.value\r\n )\r\n inheritedExpandedKeySet.value = pruneTreeKeySet(\r\n inheritedExpandedKeySet.value,\r\n treeIndex.value.keyNodeMap\r\n )\r\n collapsedInheritedKeySet.value = pruneTreeKeySet(\r\n collapsedInheritedKeySet.value,\r\n treeIndex.value.keyNodeMap\r\n )\r\n }\r\n\r\n /**\r\n * 受控模式下按 `autoExpandParent` 规则计算最终渲染集合。\r\n */\r\n const createControlledEffectiveExpandedKeySet = () =>\r\n createEffectiveExpandedKeySet({\r\n sourceExpandedKeys: controlledSourceExpandedKeys.value,\r\n parentKeyMap: treeIndex.value.parentKeyMap,\r\n includeAncestorKeys: Boolean(props.autoExpandParent),\r\n accordion: Boolean(props.accordion)\r\n })\r\n\r\n /**\r\n * 非受控模式下合并源展开键与初始化阶段的祖先补齐结果。\r\n */\r\n const createLocalEffectiveExpandedKeySet = () =>\r\n createUncontrolledEffectiveExpandedKeySet({\r\n sourceExpandedKeys: uncontrolledSourceExpandedKeys.value,\r\n inheritedExpandedKeySet: inheritedExpandedKeySet.value,\r\n collapsedInheritedKeySet: collapsedInheritedKeySet.value,\r\n parentKeyMap: treeIndex.value.parentKeyMap,\r\n accordion: Boolean(props.accordion)\r\n })\r\n\r\n /**\r\n * 获取当前模式下真正驱动渲染的展开集合。\r\n */\r\n const effectiveExpandedKeySet = computed(() =>\r\n isControlled.value\r\n ? createControlledEffectiveExpandedKeySet()\r\n : createLocalEffectiveExpandedKeySet()\r\n )\r\n\r\n /**\r\n * 判断指定节点当前是否处于展开状态。\r\n */\r\n const isNodeExpanded = (nodeKey: TreeKey) => effectiveExpandedKeySet.value.has(nodeKey)\r\n\r\n /**\r\n * 统一发送展开 / 收起事件。\r\n */\r\n const emitNodeToggleEvent = ({\r\n node,\r\n instance,\r\n nextEffectiveExpandedKeySet\r\n }: {\r\n node: TreeNodeModel\r\n instance: TreeNodeInstance\r\n nextEffectiveExpandedKeySet: Set<TreeKey>\r\n }) => {\r\n const eventNode = createTreeEventNode({\r\n node,\r\n resolveExpanded: (nodeKey) => nextEffectiveExpandedKeySet.has(nodeKey)\r\n })\r\n\r\n if (nextEffectiveExpandedKeySet.has(node.key)) {\r\n emit('node-expand', node.data, eventNode, instance)\r\n return\r\n }\r\n\r\n emit('node-collapse', node.data, eventNode, instance)\r\n }\r\n\r\n /**\r\n * 统一发送展开状态变更事件。\r\n */\r\n const emitExpandedStateChange = ({\r\n node,\r\n instance,\r\n nextSourceExpandedKeys,\r\n nextEffectiveExpandedKeySet\r\n }: {\r\n node: TreeNodeModel\r\n instance: TreeNodeInstance\r\n nextSourceExpandedKeys: TreeKey[]\r\n nextEffectiveExpandedKeySet: Set<TreeKey>\r\n }) => {\r\n emit('update:expandedKeys', nextSourceExpandedKeys)\r\n emitNodeToggleEvent({\r\n node,\r\n instance,\r\n nextEffectiveExpandedKeySet\r\n })\r\n emit('expand', {\r\n expanded: nextEffectiveExpandedKeySet.has(node.key),\r\n node: node.data,\r\n key: node.key,\r\n expandedKeys: nextSourceExpandedKeys\r\n })\r\n }\r\n\r\n /**\r\n * 切换指定节点的展开状态:\r\n * 1. 受控模式只发事件,不落本地最终状态\r\n * 2. 非受控模式更新本地源展开键,并保留后代展开缓存\r\n */\r\n const toggleNodeExpansion = ({ node, instance }: ToggleNodeExpansionOptions) => {\r\n if (!canToggleNodeExpansion(node)) {\r\n return\r\n }\r\n\r\n if (isControlled.value) {\r\n const nextSourceExpandedKeys = normalizeSourceExpandedKeys(\r\n toggleExpandedKey(controlledSourceExpandedKeys.value, node.key),\r\n props,\r\n treeIndex.value\r\n )\r\n const nextEffectiveExpandedKeySet = createEffectiveExpandedKeySet({\r\n sourceExpandedKeys: nextSourceExpandedKeys,\r\n parentKeyMap: treeIndex.value.parentKeyMap,\r\n includeAncestorKeys: Boolean(props.autoExpandParent),\r\n accordion: Boolean(props.accordion)\r\n })\r\n\r\n emitExpandedStateChange({\r\n node,\r\n instance,\r\n nextSourceExpandedKeys,\r\n nextEffectiveExpandedKeySet\r\n })\r\n return\r\n }\r\n\r\n let nextSourceExpandedKeys = uncontrolledSourceExpandedKeys.value\r\n let nextCollapsedInheritedKeySet = collapsedInheritedKeySet.value\r\n\r\n if (uncontrolledSourceExpandedKeys.value.includes(node.key)) {\r\n nextSourceExpandedKeys = toggleExpandedKey(uncontrolledSourceExpandedKeys.value, node.key)\r\n } else if (inheritedExpandedKeySet.value.has(node.key)) {\r\n nextCollapsedInheritedKeySet = new Set<TreeKey>(collapsedInheritedKeySet.value)\r\n\r\n if (nextCollapsedInheritedKeySet.has(node.key)) {\r\n nextCollapsedInheritedKeySet.delete(node.key)\r\n } else {\r\n nextCollapsedInheritedKeySet.add(node.key)\r\n }\r\n } else {\r\n nextSourceExpandedKeys = toggleExpandedKey(uncontrolledSourceExpandedKeys.value, node.key)\r\n }\r\n\r\n nextSourceExpandedKeys = normalizeSourceExpandedKeys(\r\n nextSourceExpandedKeys,\r\n props,\r\n treeIndex.value\r\n )\r\n uncontrolledSourceExpandedKeys.value = nextSourceExpandedKeys\r\n collapsedInheritedKeySet.value = nextCollapsedInheritedKeySet\r\n\r\n const nextEffectiveExpandedKeySet = createUncontrolledEffectiveExpandedKeySet({\r\n sourceExpandedKeys: nextSourceExpandedKeys,\r\n inheritedExpandedKeySet: inheritedExpandedKeySet.value,\r\n collapsedInheritedKeySet: nextCollapsedInheritedKeySet,\r\n parentKeyMap: treeIndex.value.parentKeyMap,\r\n accordion: Boolean(props.accordion)\r\n })\r\n\r\n emitExpandedStateChange({\r\n node,\r\n instance,\r\n nextSourceExpandedKeys,\r\n nextEffectiveExpandedKeySet\r\n })\r\n }\r\n\r\n watch(\r\n [treeIndex, isControlled],\r\n () => {\r\n if (!isControlled.value) {\r\n syncUncontrolledExpandedState()\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n return {\r\n effectiveExpandedKeySet,\r\n isControlled,\r\n isNodeExpanded,\r\n sourceExpandedKeys: computed(getCurrentSourceExpandedKeys),\r\n toggleNodeExpansion\r\n }\r\n}\r\n","import { computed, ref, watch, type ComputedRef } from 'vue'\r\nimport type { TreeIndex, TreeKey, TreeNodeModel } from './tree'\r\n\r\ninterface UseTreeKeyboardStateOptions {\r\n treeIndex: ComputedRef<TreeIndex>\r\n selectedKeys: ComputedRef<TreeKey[]>\r\n isNodeExpanded: (nodeKey: TreeKey) => boolean\r\n isNodeExpandable: (node: TreeNodeModel) => boolean\r\n}\r\n\r\nlet treeIdSeed = 0\r\n\r\nconst createTreeId = () => {\r\n treeIdSeed += 1\r\n return `fl-tree-${treeIdSeed}`\r\n}\r\n\r\nconst encodeTreeKey = (key: TreeKey) => encodeURIComponent(String(key))\r\n\r\nconst createTreeNodeId = (treeId: string, key: TreeKey) =>\r\n `${treeId}-node-${typeof key}-${encodeTreeKey(key)}`\r\n\r\nexport const useTreeKeyboardState = ({\r\n treeIndex,\r\n selectedKeys,\r\n isNodeExpanded,\r\n isNodeExpandable\r\n}: UseTreeKeyboardStateOptions) => {\r\n const treeId = createTreeId()\r\n const focusedKey = ref<TreeKey>()\r\n\r\n const visibleNodeKeys = computed(() => {\r\n const nextVisibleNodeKeys: TreeKey[] = []\r\n\r\n const visit = (nodes: TreeNodeModel[]) => {\r\n for (const node of nodes) {\r\n nextVisibleNodeKeys.push(node.key)\r\n\r\n if (isNodeExpandable(node) && isNodeExpanded(node.key)) {\r\n visit(node.childNodes)\r\n }\r\n }\r\n }\r\n\r\n visit(treeIndex.value.nodes)\r\n\r\n return nextVisibleNodeKeys\r\n })\r\n\r\n const visibleNodeKeySet = computed(() => new Set<TreeKey>(visibleNodeKeys.value))\r\n\r\n const getNodeId = (nodeKey: TreeKey) => createTreeNodeId(treeId, nodeKey)\r\n\r\n const activeDescendantId = computed(() =>\r\n focusedKey.value === undefined ? undefined : getNodeId(focusedKey.value)\r\n )\r\n\r\n const getFocusedNode = () =>\r\n focusedKey.value === undefined ? undefined : treeIndex.value.keyNodeMap.get(focusedKey.value)\r\n\r\n const isNodeFocused = (nodeKey: TreeKey) => focusedKey.value === nodeKey\r\n\r\n const focusNode = (nodeKey: TreeKey) => {\r\n if (!treeIndex.value.keyNodeMap.has(nodeKey)) {\r\n return\r\n }\r\n\r\n focusedKey.value = nodeKey\r\n }\r\n\r\n const findVisibleAncestorKey = (nodeKey: TreeKey) => {\r\n let currentNode = treeIndex.value.keyNodeMap.get(nodeKey)?.parent ?? null\r\n\r\n while (currentNode) {\r\n if (visibleNodeKeySet.value.has(currentNode.key)) {\r\n return currentNode.key\r\n }\r\n\r\n currentNode = currentNode.parent\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n const findInitialFocusedKey = () => {\r\n const selectedVisibleKey = selectedKeys.value.find((key) => visibleNodeKeySet.value.has(key))\r\n\r\n return selectedVisibleKey ?? visibleNodeKeys.value[0]\r\n }\r\n\r\n const syncFocusedKey = () => {\r\n if (visibleNodeKeys.value.length === 0) {\r\n focusedKey.value = undefined\r\n return\r\n }\r\n\r\n if (focusedKey.value !== undefined && visibleNodeKeySet.value.has(focusedKey.value)) {\r\n return\r\n }\r\n\r\n focusedKey.value =\r\n focusedKey.value === undefined\r\n ? findInitialFocusedKey()\r\n : (findVisibleAncestorKey(focusedKey.value) ?? findInitialFocusedKey())\r\n }\r\n\r\n const moveFocusBy = (offset: number) => {\r\n if (visibleNodeKeys.value.length === 0) {\r\n focusedKey.value = undefined\r\n return\r\n }\r\n\r\n const currentIndex =\r\n focusedKey.value === undefined ? -1 : visibleNodeKeys.value.indexOf(focusedKey.value)\r\n const fallbackIndex = offset > 0 ? 0 : visibleNodeKeys.value.length - 1\r\n const nextIndex =\r\n currentIndex === -1\r\n ? fallbackIndex\r\n : Math.min(Math.max(currentIndex + offset, 0), visibleNodeKeys.value.length - 1)\r\n\r\n focusedKey.value = visibleNodeKeys.value[nextIndex]\r\n }\r\n\r\n const moveFocusToParent = (node: TreeNodeModel) => {\r\n if (node.parent) {\r\n focusedKey.value = node.parent.key\r\n }\r\n }\r\n\r\n const moveFocusToFirstChild = (node: TreeNodeModel) => {\r\n const firstVisibleChild = node.childNodes.find((childNode) =>\r\n visibleNodeKeySet.value.has(childNode.key)\r\n )\r\n\r\n if (firstVisibleChild) {\r\n focusedKey.value = firstVisibleChild.key\r\n }\r\n }\r\n\r\n watch([visibleNodeKeys, visibleNodeKeySet, selectedKeys], syncFocusedKey, {\r\n immediate: true\r\n })\r\n\r\n return {\r\n activeDescendantId,\r\n focusNode,\r\n focusedKey,\r\n getFocusedNode,\r\n getNodeId,\r\n isNodeFocused,\r\n moveFocusBy,\r\n moveFocusToFirstChild,\r\n moveFocusToParent,\r\n visibleNodeKeys\r\n }\r\n}\r\n","import { computed, shallowRef, watch, type ComputedRef } from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n filterTreeLoadedKeys,\r\n pruneTreeKeySet,\r\n type TreeIndex,\r\n type TreeKey,\r\n type TreeLoadEvent,\r\n type TreeNodeModel,\r\n type TreeProps\r\n} from './tree'\r\n\r\ninterface UseTreeLoadStateOptions {\r\n props: TreeProps\r\n treeIndex: ComputedRef<TreeIndex>\r\n emit: TreeLoadStateEmit\r\n}\r\n\r\nexport interface TreeLoadStateEmit {\r\n (event: 'update:loadedKeys', value: TreeKey[]): void\r\n (event: 'load', loadedKeys: TreeKey[], loadEvent: TreeLoadEvent): void\r\n}\r\n\r\n/**\r\n * FlTree 阶段 13 的异步加载状态层:\r\n * 1. 管理受控 / 非受控 loadedKeys\r\n * 2. 维护节点加载中状态与重复请求保护\r\n * 3. 只消费 loadData 的完成 / 失败结果,不读取 resolve 值\r\n */\r\nexport const useTreeLoadState = ({ props, treeIndex, emit }: UseTreeLoadStateOptions) => {\r\n const uncontrolledLoadedKeys = shallowRef<TreeKey[]>([])\r\n const loadingKeySet = shallowRef(new Set<TreeKey>())\r\n\r\n /**\r\n * 显式传入 `loadedKeys` 时,组件进入受控加载完成状态。\r\n */\r\n const isControlled = computed(() => props.loadedKeys !== undefined)\r\n\r\n /**\r\n * 受控模式下直接基于外部 prop 过滤已加载键。\r\n */\r\n const controlledLoadedKeys = computed(() =>\r\n filterTreeLoadedKeys(props.loadedKeys, treeIndex.value.keyNodeMap)\r\n )\r\n\r\n /**\r\n * 返回当前模式下对外可观察的已加载键集合。\r\n */\r\n const getCurrentLoadedKeys = () =>\r\n isControlled.value ? controlledLoadedKeys.value : uncontrolledLoadedKeys.value\r\n\r\n /**\r\n * 裁剪非受控 loadedKeys 与 loadingKeys 中已经从树结构移除的 key。\r\n */\r\n const syncTreeLoadState = () => {\r\n if (!isControlled.value) {\r\n uncontrolledLoadedKeys.value = filterTreeLoadedKeys(\r\n uncontrolledLoadedKeys.value,\r\n treeIndex.value.keyNodeMap\r\n )\r\n }\r\n\r\n loadingKeySet.value = pruneTreeKeySet(loadingKeySet.value, treeIndex.value.keyNodeMap)\r\n }\r\n\r\n /**\r\n * 判断指定节点是否已经完成异步加载。\r\n */\r\n const isNodeLoaded = (nodeKey: TreeKey) => getCurrentLoadedKeys().includes(nodeKey)\r\n\r\n /**\r\n * 判断指定节点当前是否处于异步加载中。\r\n */\r\n const isNodeLoading = (nodeKey: TreeKey) => loadingKeySet.value.has(nodeKey)\r\n\r\n /**\r\n * 判断当前节点是否允许触发异步加载。\r\n */\r\n const canLoadNode = (node: TreeNodeModel) =>\r\n typeof props.loadData === 'function' &&\r\n !node.isLeaf &&\r\n !isNodeLoaded(node.key) &&\r\n !isNodeLoading(node.key)\r\n\r\n /**\r\n * 设置指定节点的 loading 状态。\r\n */\r\n const setNodeLoading = (nodeKey: TreeKey, loading: boolean) => {\r\n const nextLoadingKeySet = new Set<TreeKey>(loadingKeySet.value)\r\n\r\n if (loading) {\r\n nextLoadingKeySet.add(nodeKey)\r\n } else {\r\n nextLoadingKeySet.delete(nodeKey)\r\n }\r\n\r\n loadingKeySet.value = nextLoadingKeySet\r\n }\r\n\r\n /**\r\n * 成功完成加载后,在当前 loadedKeys 末尾追加本次节点。\r\n */\r\n const createNextLoadedKeys = (nodeKey: TreeKey) =>\r\n filterTreeLoadedKeys([...getCurrentLoadedKeys(), nodeKey], treeIndex.value.keyNodeMap)\r\n\r\n /**\r\n * 触发节点异步加载。组件只等待 Promise 状态,不消费 resolve 值。\r\n */\r\n const loadNode = async (node: TreeNodeModel) => {\r\n if (!canLoadNode(node) || typeof props.loadData !== 'function') {\r\n return\r\n }\r\n\r\n setNodeLoading(node.key, true)\r\n\r\n try {\r\n await props.loadData(createTreeEventNode({ node }))\r\n\r\n const nextLoadedKeys = createNextLoadedKeys(node.key)\r\n const loadedNode = treeIndex.value.keyNodeMap.get(node.key) ?? node\r\n\r\n if (!isControlled.value) {\r\n uncontrolledLoadedKeys.value = nextLoadedKeys\r\n }\r\n\r\n emit('update:loadedKeys', nextLoadedKeys)\r\n emit('load', nextLoadedKeys, {\r\n node: createTreeEventNode({ node: loadedNode }),\r\n key: node.key,\r\n loadedKeys: nextLoadedKeys\r\n })\r\n } catch {\r\n /**\r\n * 失败态由业务侧在 loadData 内处理;组件保持节点可重试。\r\n */\r\n } finally {\r\n setNodeLoading(node.key, false)\r\n }\r\n }\r\n\r\n watch([treeIndex, isControlled], syncTreeLoadState, { immediate: true })\r\n\r\n return {\r\n isControlled,\r\n isNodeLoaded,\r\n isNodeLoading,\r\n loadNode,\r\n loadedKeys: computed(getCurrentLoadedKeys)\r\n }\r\n}\r\n","import type { ComputedRef } from 'vue'\r\nimport type { TreeIndex, TreeKey, TreeScrollToOptions } from './tree'\r\n\r\ninterface UseTreeScrollStateOptions {\r\n treeIndex: ComputedRef<TreeIndex>\r\n}\r\n\r\nconst scrollableOverflowPattern = /(auto|scroll|overlay)/\r\n\r\nconst isBrowser = () => typeof window !== 'undefined' && typeof document !== 'undefined'\r\n\r\nconst isPageScrollContainer = (element: HTMLElement) =>\r\n element === document.scrollingElement ||\r\n element === document.documentElement ||\r\n element === document.body\r\n\r\nconst getPageViewportRect = () => {\r\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight\r\n\r\n return {\r\n top: 0,\r\n bottom: viewportHeight\r\n }\r\n}\r\n\r\nconst getContainerRect = (container: HTMLElement) => {\r\n if (isPageScrollContainer(container)) {\r\n return getPageViewportRect()\r\n }\r\n\r\n const rect = container.getBoundingClientRect()\r\n\r\n return {\r\n top: rect.top,\r\n bottom: rect.bottom\r\n }\r\n}\r\n\r\nconst isScrollableElement = (element: HTMLElement) => {\r\n const style = window.getComputedStyle(element)\r\n const overflowY = style.overflowY || style.overflow\r\n\r\n return scrollableOverflowPattern.test(overflowY) && element.scrollHeight > element.clientHeight\r\n}\r\n\r\nconst getPageScrollContainer = () =>\r\n (document.scrollingElement as HTMLElement | null) ?? document.documentElement\r\n\r\nconst findScrollContainer = (element: HTMLElement) => {\r\n let currentElement = element.parentElement\r\n\r\n while (currentElement) {\r\n if (isScrollableElement(currentElement)) {\r\n return currentElement\r\n }\r\n\r\n currentElement = currentElement.parentElement\r\n }\r\n\r\n return getPageScrollContainer()\r\n}\r\n\r\nconst resolveAlignedScrollTop = ({\r\n align,\r\n container,\r\n offset,\r\n target\r\n}: {\r\n align: NonNullable<TreeScrollToOptions['align']>\r\n container: HTMLElement\r\n offset: number\r\n target: HTMLElement\r\n}) => {\r\n const containerRect = getContainerRect(container)\r\n const targetRect = target.getBoundingClientRect()\r\n\r\n if (align === 'top') {\r\n return container.scrollTop + targetRect.top - containerRect.top - offset\r\n }\r\n\r\n if (align === 'bottom') {\r\n return container.scrollTop + targetRect.bottom - containerRect.bottom + offset\r\n }\r\n\r\n if (targetRect.top < containerRect.top + offset) {\r\n return container.scrollTop + targetRect.top - containerRect.top - offset\r\n }\r\n\r\n if (targetRect.bottom > containerRect.bottom - offset) {\r\n return container.scrollTop + targetRect.bottom - containerRect.bottom + offset\r\n }\r\n\r\n return container.scrollTop\r\n}\r\n\r\n/**\r\n * FlTree 阶段 17 的滚动定位状态层:\r\n * 1. 只注册当前已经渲染的节点内容区元素\r\n * 2. 自动寻找最近可滚动祖先,找不到时回退页面滚动容器\r\n * 3. 不改变展开状态,也不要求 Tree 根节点成为固定高度滚动容器\r\n */\r\nexport const useTreeScrollState = ({ treeIndex }: UseTreeScrollStateOptions) => {\r\n const nodeElementMap = new Map<TreeKey, HTMLElement>()\r\n\r\n const registerNodeElement = (nodeKey: TreeKey, element: HTMLElement | null) => {\r\n if (!element) {\r\n nodeElementMap.delete(nodeKey)\r\n return\r\n }\r\n\r\n nodeElementMap.set(nodeKey, element)\r\n }\r\n\r\n const unregisterNodeElement = (nodeKey: TreeKey, element: HTMLElement | null) => {\r\n if (!element || nodeElementMap.get(nodeKey) === element) {\r\n nodeElementMap.delete(nodeKey)\r\n }\r\n }\r\n\r\n const scrollTo = ({ key, align = 'auto', offset = 0 }: TreeScrollToOptions) => {\r\n if (!isBrowser() || !treeIndex.value.keyNodeMap.has(key)) {\r\n return\r\n }\r\n\r\n const targetElement = nodeElementMap.get(key)\r\n\r\n if (!targetElement) {\r\n return\r\n }\r\n\r\n const scrollContainer = findScrollContainer(targetElement)\r\n const nextScrollTop = resolveAlignedScrollTop({\r\n align,\r\n container: scrollContainer,\r\n offset,\r\n target: targetElement\r\n })\r\n\r\n scrollContainer.scrollTop = nextScrollTop\r\n }\r\n\r\n return {\r\n registerNodeElement,\r\n scrollTo,\r\n unregisterNodeElement\r\n }\r\n}\r\n","import { computed, ref, shallowRef, watch, type ComputedRef } from 'vue'\r\nimport {\r\n createTreeEventNode,\r\n filterTreeSelectedKeys,\r\n type TreeIndex,\r\n type TreeInteractionEvent,\r\n type TreeKey,\r\n type TreeNodeModel,\r\n type TreeProps,\r\n type TreeSelectEvent\r\n} from './tree'\r\n\r\ninterface UseTreeSelectedStateOptions {\r\n props: TreeProps\r\n treeIndex: ComputedRef<TreeIndex>\r\n emit: TreeSelectedStateEmit\r\n}\r\n\r\nexport interface TreeSelectedStateEmit {\r\n (event: 'update:selectedKeys', value: TreeKey[]): void\r\n (event: 'select', selectedKeys: TreeKey[], selectEvent: TreeSelectEvent): void\r\n}\r\n\r\ninterface SelectNodeOptions {\r\n node: TreeNodeModel\r\n event: TreeInteractionEvent\r\n}\r\n\r\n/**\r\n * 过滤非法 key,并跳过 disabledKeys / unselectableKeys 命中的节点。\r\n */\r\nconst collectSelectableKeys = (keys: TreeKey[] | undefined, treeIndex: TreeIndex): TreeKey[] =>\r\n filterTreeSelectedKeys(keys, treeIndex.keyNodeMap).filter((key) => {\r\n const node = treeIndex.keyNodeMap.get(key)\r\n\r\n if (!node) {\r\n return false\r\n }\r\n\r\n return !node.disabled && node.selectable\r\n })\r\n\r\n/**\r\n * FlTree 阶段 5 的选中状态层同时承接单选与多选语义:\r\n * 1. 受控模式只读取外部 selectedKeys\r\n * 2. 非受控模式只在初始化时消费 defaultSelectedKeys\r\n * 3. 后续数据变化只做 key 裁剪,不重复初始化\r\n */\r\nexport const useTreeSelectedState = ({ props, treeIndex, emit }: UseTreeSelectedStateOptions) => {\r\n const uncontrolledSelectedKeys = shallowRef<TreeKey[]>([])\r\n const hasInitializedUncontrolledState = ref(false)\r\n\r\n /**\r\n * 只要树级 selectable 没有被显式关闭,就允许节点进入选中能力判定。\r\n */\r\n const isTreeSelectable = computed(() => props.selectable !== false)\r\n\r\n /**\r\n * 显式传入 selectedKeys 时,组件进入受控选中模式。\r\n */\r\n const isControlled = computed(() => props.selectedKeys !== undefined)\r\n\r\n /**\r\n * `multiple=true` 时,普通树进入点击增删的多选语义。\r\n */\r\n const isMultiple = computed(() => props.multiple === true)\r\n\r\n /**\r\n * 统一归一化选中 key:\r\n * 1. 去重并过滤非法 key\r\n * 2. 跳过 disabledKeys / unselectableKeys 命中的节点\r\n * 3. 单选模式只保留第一个合法 key,多选模式保留完整集合\r\n */\r\n const normalizeSelectedKeys = (keys: TreeKey[] | undefined): TreeKey[] => {\r\n if (!isTreeSelectable.value) {\r\n return []\r\n }\r\n\r\n const selectableKeys = collectSelectableKeys(keys, treeIndex.value)\r\n\r\n if (isMultiple.value) {\r\n return selectableKeys\r\n }\r\n\r\n return selectableKeys.length > 0 ? [selectableKeys[0]!] : []\r\n }\r\n\r\n /**\r\n * 受控模式下直接基于外部 prop 解析当前选中结果。\r\n */\r\n const controlledSelectedKeys = computed(() => normalizeSelectedKeys(props.selectedKeys))\r\n\r\n /**\r\n * 返回当前模式下对外可观察的源选中 key 集合。\r\n */\r\n const getCurrentSelectedKeys = () =>\r\n isControlled.value ? controlledSelectedKeys.value : uncontrolledSelectedKeys.value\r\n\r\n /**\r\n * 初始化或裁剪非受控选中状态。\r\n */\r\n const syncUncontrolledSelectedState = () => {\r\n if (!hasInitializedUncontrolledState.value) {\r\n uncontrolledSelectedKeys.value = normalizeSelectedKeys(props.defaultSelectedKeys)\r\n hasInitializedUncontrolledState.value = true\r\n return\r\n }\r\n\r\n uncontrolledSelectedKeys.value = normalizeSelectedKeys(uncontrolledSelectedKeys.value)\r\n }\r\n\r\n /**\r\n * 判断当前节点是否允许进入选中态。\r\n */\r\n const canSelectNode = (node: TreeNodeModel) =>\r\n isTreeSelectable.value && !node.disabled && node.selectable\r\n\r\n /**\r\n * 判断指定节点当前是否处于选中态。\r\n */\r\n const isNodeSelected = (nodeKey: TreeKey) => getCurrentSelectedKeys().includes(nodeKey)\r\n\r\n /**\r\n * 统一抛出选中变更事件。\r\n */\r\n const emitSelectedStateChange = ({\r\n node,\r\n event,\r\n nextSelectedKeys\r\n }: {\r\n node: TreeNodeModel\r\n event: TreeInteractionEvent\r\n nextSelectedKeys: TreeKey[]\r\n }) => {\r\n emit('update:selectedKeys', nextSelectedKeys)\r\n emit('select', nextSelectedKeys, {\r\n selected: nextSelectedKeys.includes(node.key),\r\n node: createTreeEventNode({ node }),\r\n /**\r\n * `selectedNodes` 返回的是事件层 `TreeNode[]`,不暴露原始 `TreeData[]`。\r\n * 业务侧如果需要原始数据,可统一通过 `eventNode.data` 读取。\r\n */\r\n selectedNodes: nextSelectedKeys\r\n .map((key) => treeIndex.value.keyNodeMap.get(key))\r\n .filter((item): item is TreeNodeModel => item !== undefined)\r\n .map((selectedNode) => createTreeEventNode({ node: selectedNode })),\r\n key: node.key,\r\n event\r\n })\r\n }\r\n\r\n /**\r\n * 基于当前模式生成下一次选中结果:\r\n * 1. 单选模式保持阶段 4 语义\r\n * 2. 多选模式点击未选中节点时追加,点击已选中节点时仅移除当前节点\r\n */\r\n const createNextSelectedKeys = (nodeKey: TreeKey): TreeKey[] => {\r\n const currentSelectedKeys = getCurrentSelectedKeys()\r\n\r\n if (!isMultiple.value) {\r\n return currentSelectedKeys.includes(nodeKey) ? [] : [nodeKey]\r\n }\r\n\r\n if (currentSelectedKeys.includes(nodeKey)) {\r\n return currentSelectedKeys.filter((key) => key !== nodeKey)\r\n }\r\n\r\n return [...currentSelectedKeys, nodeKey]\r\n }\r\n\r\n /**\r\n * 点击节点内容区时,根据当前模式切换单选或多选结果。\r\n */\r\n const selectNode = ({ node, event }: SelectNodeOptions) => {\r\n if (!canSelectNode(node)) {\r\n return\r\n }\r\n\r\n const nextSelectedKeys = createNextSelectedKeys(node.key)\r\n\r\n if (!isControlled.value) {\r\n uncontrolledSelectedKeys.value = nextSelectedKeys\r\n }\r\n\r\n emitSelectedStateChange({\r\n node,\r\n event,\r\n nextSelectedKeys\r\n })\r\n }\r\n\r\n watch(\r\n [treeIndex, isControlled, isTreeSelectable, isMultiple],\r\n () => {\r\n if (!isControlled.value) {\r\n syncUncontrolledSelectedState()\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n return {\r\n isControlled,\r\n isNodeSelected,\r\n isTreeSelectable,\r\n selectNode,\r\n selectedKeys: computed(getCurrentSelectedKeys)\r\n }\r\n}\r\n","<template>\r\n <!-- 根节点在阶段 4 起同时接入展开与单选状态层,并把渲染能力下发给递归节点。 -->\r\n <div\r\n v-bind=\"attrs\"\r\n :class=\"[rootClassName, resolvedClassNames.root, ns.is('show-line', showLineEnabled)]\"\r\n :style=\"resolvedStyles.root\"\r\n :tabindex=\"rootTabIndex\"\r\n role=\"tree\"\r\n :aria-activedescendant=\"activeDescendantId\"\r\n @keydown=\"handleTreeKeydown\">\r\n <FlTreeNode\r\n v-for=\"node in treeIndex.nodes\"\r\n :key=\"node.key\"\r\n :node=\"node\"\r\n :get-node-id=\"getNodeId\"\r\n :register-node-element=\"registerNodeElement\"\r\n :unregister-node-element=\"unregisterNodeElement\"\r\n :on-node-content-click=\"handleNodeContentClick\"\r\n :on-node-content-dblclick=\"handleNodeContentDblclick\"\r\n :on-node-content-contextmenu=\"handleNodeContentContextmenu\"\r\n :is-node-expanded=\"isNodeExpanded\"\r\n :is-node-checked=\"isNodeChecked\"\r\n :is-node-half-checked=\"isNodeHalfChecked\"\r\n :is-node-selected=\"isNodeSelected\"\r\n :is-node-focused=\"isNodeFocused\"\r\n :is-node-filtered=\"isNodeFiltered\"\r\n :is-node-loading=\"isNodeLoading\"\r\n :is-node-expandable=\"isNodeExpandable\"\r\n :is-node-draggable=\"isNodeDraggable\"\r\n :is-node-dragging=\"isNodeDragging\"\r\n :is-node-drop-target=\"isNodeDropTarget\"\r\n :is-node-drop-allowed=\"isNodeDropAllowed\"\r\n :get-node-drop-type=\"getNodeDropType\"\r\n :tree-checkable=\"isTreeCheckable\"\r\n :tree-selectable=\"isTreeSelectable\"\r\n :show-line=\"showLineEnabled\"\r\n :show-leaf-icon=\"showLeafIcon\"\r\n :switcher-icon=\"props.switcherIcon\"\r\n :switcher-loading-icon=\"props.switcherLoadingIcon\"\r\n :is-checkbox-disabled=\"isCheckboxDisabled\"\r\n :should-render-checkbox=\"shouldRenderCheckbox\"\r\n :toggle-node-checked=\"toggleNodeChecked\"\r\n :toggle-node-expansion=\"toggleNodeExpansion\"\r\n :handle-node-drag-start=\"handleNodeDragStart\"\r\n :handle-node-drag-enter=\"handleNodeDragEnter\"\r\n :handle-node-drag-over=\"handleNodeDragOver\"\r\n :handle-node-drag-leave=\"handleNodeDragLeave\"\r\n :handle-node-drop=\"handleNodeDrop\"\r\n :handle-node-drag-end=\"handleNodeDragEnd\"\r\n :resolved-class-names=\"resolvedClassNames\"\r\n :node-class-name=\"props.nodeClassName\"\r\n :resolved-styles=\"resolvedStyles\">\r\n <template v-if=\"hasDefaultSlot\" #default=\"slotProps\">\r\n <slot v-bind=\"slotProps\" />\r\n </template>\r\n </FlTreeNode>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { computed, ref, useAttrs, type CSSProperties } from 'vue'\r\nimport {\r\n buildTreeIndex,\r\n createTreeEventNode,\r\n resolveTreeSemanticRecord,\r\n treeEmits,\r\n treeProps,\r\n type TreeClassValue,\r\n type TreeData,\r\n type TreeExpose,\r\n type TreeInteractionEvent,\r\n type TreeNodeInstance,\r\n type TreeNode,\r\n type TreeNodeModel,\r\n type TreeSemanticRecord\r\n} from './tree'\r\nimport FlTreeNode from './tree-node.vue'\r\nimport { useTreeCheckedState, type TreeCheckedStateEmit } from './use-tree-checked-state'\r\nimport { useTreeDragState, type TreeDragStateEmit } from './use-tree-drag'\r\nimport { useTreeExpandedState, type TreeExpandedStateEmit } from './use-tree-expanded-state'\r\nimport { useTreeKeyboardState } from './use-tree-keyboard'\r\nimport { useTreeLoadState, type TreeLoadStateEmit } from './use-tree-load'\r\nimport { useTreeScrollState } from './use-tree-scroll'\r\nimport { useTreeSelectedState, type TreeSelectedStateEmit } from './use-tree-selected-state'\r\n\r\ndefineOptions({\r\n name: 'FlTree',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(treeProps)\r\nconst emit = defineEmits(treeEmits)\r\nconst slots = defineSlots<{\r\n default?: (props: { node: TreeNode; data: TreeData }) => unknown\r\n}>()\r\nconst attrs = useAttrs()\r\nconst ns = useNamespace('tree')\r\nconst rootClassName = ns.b()\r\nconst treeDataVersion = ref(0)\r\n\r\nconst notifyTreeDataChange = () => {\r\n treeDataVersion.value += 1\r\n}\r\n\r\n/**\r\n * 构建当前渲染所需的标准化树索引。\r\n */\r\nconst createCurrentTreeIndex = () => {\r\n void treeDataVersion.value\r\n return buildTreeIndex(props.data, props.props, {\r\n disabledKeys: props.disabledKeys,\r\n unselectableKeys: props.unselectableKeys,\r\n disabledCheckboxKeys: props.disabledCheckboxKeys,\r\n hiddenCheckboxKeys: props.hiddenCheckboxKeys\r\n })\r\n}\r\n\r\n/**\r\n * 解析组件级语义化 classNames 配置。\r\n */\r\nconst createResolvedClassNames = () =>\r\n resolveTreeSemanticRecord(props.classNames, {\r\n props\r\n })\r\n\r\n/**\r\n * 解析组件级语义化 styles 配置。\r\n */\r\nconst createResolvedStyles = () =>\r\n resolveTreeSemanticRecord(props.styles, {\r\n props\r\n })\r\n\r\nconst treeIndex = computed(createCurrentTreeIndex)\r\nconst hasDefaultSlot = computed(() => Boolean(slots.default))\r\nconst resolvedClassNames = computed<TreeSemanticRecord<TreeClassValue>>(createResolvedClassNames)\r\nconst resolvedStyles = computed<TreeSemanticRecord<CSSProperties>>(createResolvedStyles)\r\nconst showLineEnabled = computed(() => Boolean(props.showLine))\r\nconst showLeafIcon = computed(() =>\r\n typeof props.showLine === 'object' && props.showLine !== null\r\n ? props.showLine.showLeafIcon !== false\r\n : false\r\n)\r\nconst rootTabIndex = computed(() => {\r\n const tabindex = attrs.tabindex ?? attrs.tabIndex\r\n\r\n return tabindex === undefined ? 0 : (tabindex as string | number)\r\n})\r\n\r\n/**\r\n * 统一派发节点点击事件。`node-click` 不暴露 `expanded` 字段。\r\n */\r\nconst emitNodeClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n}) => {\r\n emit('node-click', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\n/**\r\n * 统一派发节点双击事件。`dblclick` 不暴露 `expanded` 字段。\r\n */\r\nconst emitNodeDblclick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n emit('dblclick', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\nconst emitNodeRightClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n emit('right-click', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\nconst { isNodeLoaded, isNodeLoading, loadNode } = useTreeLoadState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeLoadStateEmit\r\n})\r\n\r\nconst { registerNodeElement, scrollTo, unregisterNodeElement } = useTreeScrollState({\r\n treeIndex\r\n})\r\n\r\n/**\r\n * 异步加载开启时,无 children 且未加载的非叶子节点也需要展示 switcher。\r\n */\r\nconst isNodeExpandable = (node: TreeNodeModel) =>\r\n !node.isLeaf &&\r\n (node.childNodes.length > 0 ||\r\n isNodeLoading(node.key) ||\r\n (Boolean(props.loadData) && !isNodeLoaded(node.key)))\r\n\r\nconst { isNodeExpanded, toggleNodeExpansion: toggleExpandedNode } = useTreeExpandedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeExpandedStateEmit,\r\n isNodeExpandable\r\n})\r\n\r\nconst isNodeFiltered = (node: TreeNodeModel) =>\r\n Boolean(\r\n props.filterTreeNode?.(\r\n createTreeEventNode({\r\n node,\r\n resolveExpanded: isNodeExpanded\r\n })\r\n )\r\n )\r\n\r\nconst { isNodeSelected, isTreeSelectable, selectNode, selectedKeys } = useTreeSelectedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeSelectedStateEmit\r\n})\r\n\r\nconst {\r\n isCheckboxDisabled,\r\n isNodeChecked,\r\n isNodeHalfChecked,\r\n isTreeCheckable,\r\n shouldRenderCheckbox,\r\n toggleCheckedNode\r\n} = useTreeCheckedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeCheckedStateEmit\r\n})\r\n\r\nconst {\r\n getNodeDropType,\r\n handleNodeDragEnd,\r\n handleNodeDragEnter,\r\n handleNodeDragLeave,\r\n handleNodeDragOver,\r\n handleNodeDragStart,\r\n handleNodeDrop,\r\n isNodeDraggable,\r\n isNodeDragging,\r\n isNodeDropAllowed,\r\n isNodeDropTarget\r\n} = useTreeDragState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeDragStateEmit,\r\n notifyDataChange: notifyTreeDataChange\r\n})\r\n\r\nconst {\r\n activeDescendantId,\r\n focusNode,\r\n getFocusedNode,\r\n getNodeId,\r\n isNodeFocused,\r\n moveFocusBy,\r\n moveFocusToFirstChild,\r\n moveFocusToParent\r\n} = useTreeKeyboardState({\r\n treeIndex,\r\n selectedKeys,\r\n isNodeExpanded,\r\n isNodeExpandable\r\n})\r\n\r\n/**\r\n * 用户请求展开时先保持原展开事件顺序,再进入异步加载链路。\r\n */\r\nconst toggleNodeExpansion = (options: { node: TreeNodeModel; instance: TreeNodeInstance }) => {\r\n focusNode(options.node.key)\r\n\r\n const wasExpanded = isNodeExpanded(options.node.key)\r\n\r\n toggleExpandedNode(options)\r\n\r\n if (!wasExpanded) {\r\n void loadNode(options.node)\r\n }\r\n}\r\n\r\nconst toggleNodeChecked = (options: { node: TreeNodeModel; event: TreeInteractionEvent }) => {\r\n focusNode(options.node.key)\r\n toggleCheckedNode(options)\r\n}\r\n\r\n/**\r\n * 节点内容区点击时先派发 `node-click`,再进入阶段 4 的单选链路。\r\n */\r\nconst handleNodeContentClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeClick({\r\n node,\r\n component,\r\n event\r\n })\r\n selectNode({\r\n node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 节点内容区双击先派发独立事件,再复用展开与异步加载链路。\r\n */\r\nconst handleNodeContentDblclick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeDblclick({\r\n node,\r\n component,\r\n event\r\n })\r\n\r\n if (!isNodeExpandable(node) || isNodeLoading(node.key)) {\r\n return\r\n }\r\n\r\n toggleNodeExpansion({\r\n node,\r\n instance: component\r\n })\r\n}\r\n\r\nconst handleNodeContentContextmenu = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeRightClick({\r\n node,\r\n component,\r\n event\r\n })\r\n}\r\n\r\nconst handleFocusedNodeAction = (node: TreeNodeModel, event: KeyboardEvent) => {\r\n handleNodeContentClick({\r\n node,\r\n component: null,\r\n event\r\n })\r\n}\r\n\r\nconst handleTreeKeydown = (event: KeyboardEvent) => {\r\n const focusedNode = getFocusedNode()\r\n\r\n if (!focusedNode) {\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n moveFocusBy(1)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n moveFocusBy(-1)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault()\r\n\r\n if (!isNodeExpandable(focusedNode)) {\r\n return\r\n }\r\n\r\n if (!isNodeExpanded(focusedNode.key)) {\r\n toggleNodeExpansion({\r\n node: focusedNode,\r\n instance: null\r\n })\r\n return\r\n }\r\n\r\n moveFocusToFirstChild(focusedNode)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault()\r\n\r\n if (isNodeExpandable(focusedNode) && isNodeExpanded(focusedNode.key)) {\r\n toggleNodeExpansion({\r\n node: focusedNode,\r\n instance: null\r\n })\r\n return\r\n }\r\n\r\n moveFocusToParent(focusedNode)\r\n return\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n handleFocusedNodeAction(focusedNode, event)\r\n return\r\n }\r\n\r\n if (event.key === ' ') {\r\n event.preventDefault()\r\n\r\n if (isTreeCheckable.value) {\r\n toggleNodeChecked({\r\n node: focusedNode,\r\n event\r\n })\r\n return\r\n }\r\n\r\n handleFocusedNodeAction(focusedNode, event)\r\n }\r\n}\r\n\r\nconst exposed: TreeExpose = {\r\n scrollTo\r\n}\r\n\r\ndefineExpose(exposed)\r\n</script>\r\n","<template>\r\n <!-- 根节点在阶段 4 起同时接入展开与单选状态层,并把渲染能力下发给递归节点。 -->\r\n <div\r\n v-bind=\"attrs\"\r\n :class=\"[rootClassName, resolvedClassNames.root, ns.is('show-line', showLineEnabled)]\"\r\n :style=\"resolvedStyles.root\"\r\n :tabindex=\"rootTabIndex\"\r\n role=\"tree\"\r\n :aria-activedescendant=\"activeDescendantId\"\r\n @keydown=\"handleTreeKeydown\">\r\n <FlTreeNode\r\n v-for=\"node in treeIndex.nodes\"\r\n :key=\"node.key\"\r\n :node=\"node\"\r\n :get-node-id=\"getNodeId\"\r\n :register-node-element=\"registerNodeElement\"\r\n :unregister-node-element=\"unregisterNodeElement\"\r\n :on-node-content-click=\"handleNodeContentClick\"\r\n :on-node-content-dblclick=\"handleNodeContentDblclick\"\r\n :on-node-content-contextmenu=\"handleNodeContentContextmenu\"\r\n :is-node-expanded=\"isNodeExpanded\"\r\n :is-node-checked=\"isNodeChecked\"\r\n :is-node-half-checked=\"isNodeHalfChecked\"\r\n :is-node-selected=\"isNodeSelected\"\r\n :is-node-focused=\"isNodeFocused\"\r\n :is-node-filtered=\"isNodeFiltered\"\r\n :is-node-loading=\"isNodeLoading\"\r\n :is-node-expandable=\"isNodeExpandable\"\r\n :is-node-draggable=\"isNodeDraggable\"\r\n :is-node-dragging=\"isNodeDragging\"\r\n :is-node-drop-target=\"isNodeDropTarget\"\r\n :is-node-drop-allowed=\"isNodeDropAllowed\"\r\n :get-node-drop-type=\"getNodeDropType\"\r\n :tree-checkable=\"isTreeCheckable\"\r\n :tree-selectable=\"isTreeSelectable\"\r\n :show-line=\"showLineEnabled\"\r\n :show-leaf-icon=\"showLeafIcon\"\r\n :switcher-icon=\"props.switcherIcon\"\r\n :switcher-loading-icon=\"props.switcherLoadingIcon\"\r\n :is-checkbox-disabled=\"isCheckboxDisabled\"\r\n :should-render-checkbox=\"shouldRenderCheckbox\"\r\n :toggle-node-checked=\"toggleNodeChecked\"\r\n :toggle-node-expansion=\"toggleNodeExpansion\"\r\n :handle-node-drag-start=\"handleNodeDragStart\"\r\n :handle-node-drag-enter=\"handleNodeDragEnter\"\r\n :handle-node-drag-over=\"handleNodeDragOver\"\r\n :handle-node-drag-leave=\"handleNodeDragLeave\"\r\n :handle-node-drop=\"handleNodeDrop\"\r\n :handle-node-drag-end=\"handleNodeDragEnd\"\r\n :resolved-class-names=\"resolvedClassNames\"\r\n :node-class-name=\"props.nodeClassName\"\r\n :resolved-styles=\"resolvedStyles\">\r\n <template v-if=\"hasDefaultSlot\" #default=\"slotProps\">\r\n <slot v-bind=\"slotProps\" />\r\n </template>\r\n </FlTreeNode>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { computed, ref, useAttrs, type CSSProperties } from 'vue'\r\nimport {\r\n buildTreeIndex,\r\n createTreeEventNode,\r\n resolveTreeSemanticRecord,\r\n treeEmits,\r\n treeProps,\r\n type TreeClassValue,\r\n type TreeData,\r\n type TreeExpose,\r\n type TreeInteractionEvent,\r\n type TreeNodeInstance,\r\n type TreeNode,\r\n type TreeNodeModel,\r\n type TreeSemanticRecord\r\n} from './tree'\r\nimport FlTreeNode from './tree-node.vue'\r\nimport { useTreeCheckedState, type TreeCheckedStateEmit } from './use-tree-checked-state'\r\nimport { useTreeDragState, type TreeDragStateEmit } from './use-tree-drag'\r\nimport { useTreeExpandedState, type TreeExpandedStateEmit } from './use-tree-expanded-state'\r\nimport { useTreeKeyboardState } from './use-tree-keyboard'\r\nimport { useTreeLoadState, type TreeLoadStateEmit } from './use-tree-load'\r\nimport { useTreeScrollState } from './use-tree-scroll'\r\nimport { useTreeSelectedState, type TreeSelectedStateEmit } from './use-tree-selected-state'\r\n\r\ndefineOptions({\r\n name: 'FlTree',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(treeProps)\r\nconst emit = defineEmits(treeEmits)\r\nconst slots = defineSlots<{\r\n default?: (props: { node: TreeNode; data: TreeData }) => unknown\r\n}>()\r\nconst attrs = useAttrs()\r\nconst ns = useNamespace('tree')\r\nconst rootClassName = ns.b()\r\nconst treeDataVersion = ref(0)\r\n\r\nconst notifyTreeDataChange = () => {\r\n treeDataVersion.value += 1\r\n}\r\n\r\n/**\r\n * 构建当前渲染所需的标准化树索引。\r\n */\r\nconst createCurrentTreeIndex = () => {\r\n void treeDataVersion.value\r\n return buildTreeIndex(props.data, props.props, {\r\n disabledKeys: props.disabledKeys,\r\n unselectableKeys: props.unselectableKeys,\r\n disabledCheckboxKeys: props.disabledCheckboxKeys,\r\n hiddenCheckboxKeys: props.hiddenCheckboxKeys\r\n })\r\n}\r\n\r\n/**\r\n * 解析组件级语义化 classNames 配置。\r\n */\r\nconst createResolvedClassNames = () =>\r\n resolveTreeSemanticRecord(props.classNames, {\r\n props\r\n })\r\n\r\n/**\r\n * 解析组件级语义化 styles 配置。\r\n */\r\nconst createResolvedStyles = () =>\r\n resolveTreeSemanticRecord(props.styles, {\r\n props\r\n })\r\n\r\nconst treeIndex = computed(createCurrentTreeIndex)\r\nconst hasDefaultSlot = computed(() => Boolean(slots.default))\r\nconst resolvedClassNames = computed<TreeSemanticRecord<TreeClassValue>>(createResolvedClassNames)\r\nconst resolvedStyles = computed<TreeSemanticRecord<CSSProperties>>(createResolvedStyles)\r\nconst showLineEnabled = computed(() => Boolean(props.showLine))\r\nconst showLeafIcon = computed(() =>\r\n typeof props.showLine === 'object' && props.showLine !== null\r\n ? props.showLine.showLeafIcon !== false\r\n : false\r\n)\r\nconst rootTabIndex = computed(() => {\r\n const tabindex = attrs.tabindex ?? attrs.tabIndex\r\n\r\n return tabindex === undefined ? 0 : (tabindex as string | number)\r\n})\r\n\r\n/**\r\n * 统一派发节点点击事件。`node-click` 不暴露 `expanded` 字段。\r\n */\r\nconst emitNodeClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n}) => {\r\n emit('node-click', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\n/**\r\n * 统一派发节点双击事件。`dblclick` 不暴露 `expanded` 字段。\r\n */\r\nconst emitNodeDblclick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n emit('dblclick', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\nconst emitNodeRightClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n emit('right-click', node.data, createTreeEventNode({ node }), component, event)\r\n}\r\n\r\nconst { isNodeLoaded, isNodeLoading, loadNode } = useTreeLoadState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeLoadStateEmit\r\n})\r\n\r\nconst { registerNodeElement, scrollTo, unregisterNodeElement } = useTreeScrollState({\r\n treeIndex\r\n})\r\n\r\n/**\r\n * 异步加载开启时,无 children 且未加载的非叶子节点也需要展示 switcher。\r\n */\r\nconst isNodeExpandable = (node: TreeNodeModel) =>\r\n !node.isLeaf &&\r\n (node.childNodes.length > 0 ||\r\n isNodeLoading(node.key) ||\r\n (Boolean(props.loadData) && !isNodeLoaded(node.key)))\r\n\r\nconst { isNodeExpanded, toggleNodeExpansion: toggleExpandedNode } = useTreeExpandedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeExpandedStateEmit,\r\n isNodeExpandable\r\n})\r\n\r\nconst isNodeFiltered = (node: TreeNodeModel) =>\r\n Boolean(\r\n props.filterTreeNode?.(\r\n createTreeEventNode({\r\n node,\r\n resolveExpanded: isNodeExpanded\r\n })\r\n )\r\n )\r\n\r\nconst { isNodeSelected, isTreeSelectable, selectNode, selectedKeys } = useTreeSelectedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeSelectedStateEmit\r\n})\r\n\r\nconst {\r\n isCheckboxDisabled,\r\n isNodeChecked,\r\n isNodeHalfChecked,\r\n isTreeCheckable,\r\n shouldRenderCheckbox,\r\n toggleCheckedNode\r\n} = useTreeCheckedState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeCheckedStateEmit\r\n})\r\n\r\nconst {\r\n getNodeDropType,\r\n handleNodeDragEnd,\r\n handleNodeDragEnter,\r\n handleNodeDragLeave,\r\n handleNodeDragOver,\r\n handleNodeDragStart,\r\n handleNodeDrop,\r\n isNodeDraggable,\r\n isNodeDragging,\r\n isNodeDropAllowed,\r\n isNodeDropTarget\r\n} = useTreeDragState({\r\n props,\r\n treeIndex,\r\n emit: emit as TreeDragStateEmit,\r\n notifyDataChange: notifyTreeDataChange\r\n})\r\n\r\nconst {\r\n activeDescendantId,\r\n focusNode,\r\n getFocusedNode,\r\n getNodeId,\r\n isNodeFocused,\r\n moveFocusBy,\r\n moveFocusToFirstChild,\r\n moveFocusToParent\r\n} = useTreeKeyboardState({\r\n treeIndex,\r\n selectedKeys,\r\n isNodeExpanded,\r\n isNodeExpandable\r\n})\r\n\r\n/**\r\n * 用户请求展开时先保持原展开事件顺序,再进入异步加载链路。\r\n */\r\nconst toggleNodeExpansion = (options: { node: TreeNodeModel; instance: TreeNodeInstance }) => {\r\n focusNode(options.node.key)\r\n\r\n const wasExpanded = isNodeExpanded(options.node.key)\r\n\r\n toggleExpandedNode(options)\r\n\r\n if (!wasExpanded) {\r\n void loadNode(options.node)\r\n }\r\n}\r\n\r\nconst toggleNodeChecked = (options: { node: TreeNodeModel; event: TreeInteractionEvent }) => {\r\n focusNode(options.node.key)\r\n toggleCheckedNode(options)\r\n}\r\n\r\n/**\r\n * 节点内容区点击时先派发 `node-click`,再进入阶段 4 的单选链路。\r\n */\r\nconst handleNodeContentClick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: TreeInteractionEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeClick({\r\n node,\r\n component,\r\n event\r\n })\r\n selectNode({\r\n node,\r\n event\r\n })\r\n}\r\n\r\n/**\r\n * 节点内容区双击先派发独立事件,再复用展开与异步加载链路。\r\n */\r\nconst handleNodeContentDblclick = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeDblclick({\r\n node,\r\n component,\r\n event\r\n })\r\n\r\n if (!isNodeExpandable(node) || isNodeLoading(node.key)) {\r\n return\r\n }\r\n\r\n toggleNodeExpansion({\r\n node,\r\n instance: component\r\n })\r\n}\r\n\r\nconst handleNodeContentContextmenu = ({\r\n node,\r\n component,\r\n event\r\n}: {\r\n node: TreeNodeModel\r\n component: TreeNodeInstance\r\n event: MouseEvent\r\n}) => {\r\n focusNode(node.key)\r\n emitNodeRightClick({\r\n node,\r\n component,\r\n event\r\n })\r\n}\r\n\r\nconst handleFocusedNodeAction = (node: TreeNodeModel, event: KeyboardEvent) => {\r\n handleNodeContentClick({\r\n node,\r\n component: null,\r\n event\r\n })\r\n}\r\n\r\nconst handleTreeKeydown = (event: KeyboardEvent) => {\r\n const focusedNode = getFocusedNode()\r\n\r\n if (!focusedNode) {\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n moveFocusBy(1)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n moveFocusBy(-1)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault()\r\n\r\n if (!isNodeExpandable(focusedNode)) {\r\n return\r\n }\r\n\r\n if (!isNodeExpanded(focusedNode.key)) {\r\n toggleNodeExpansion({\r\n node: focusedNode,\r\n instance: null\r\n })\r\n return\r\n }\r\n\r\n moveFocusToFirstChild(focusedNode)\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault()\r\n\r\n if (isNodeExpandable(focusedNode) && isNodeExpanded(focusedNode.key)) {\r\n toggleNodeExpansion({\r\n node: focusedNode,\r\n instance: null\r\n })\r\n return\r\n }\r\n\r\n moveFocusToParent(focusedNode)\r\n return\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n handleFocusedNodeAction(focusedNode, event)\r\n return\r\n }\r\n\r\n if (event.key === ' ') {\r\n event.preventDefault()\r\n\r\n if (isTreeCheckable.value) {\r\n toggleNodeChecked({\r\n node: focusedNode,\r\n event\r\n })\r\n return\r\n }\r\n\r\n handleFocusedNodeAction(focusedNode, event)\r\n }\r\n}\r\n\r\nconst exposed: TreeExpose = {\r\n scrollTo\r\n}\r\n\r\ndefineExpose(exposed)\r\n</script>\r\n","import { withInstall } from '@falcon-ui/utils'\r\nimport type { SFCWithInstall } from '@falcon-ui/utils'\r\nimport Tree from './src/tree.vue'\r\n\r\nexport const FlTree: SFCWithInstall<typeof Tree> = withInstall(Tree)\r\n\r\nexport default FlTree\r\n\r\nexport type {\r\n TreeClassNames,\r\n TreeClassValue,\r\n TreeCheckArgs,\r\n TreeCheckEvent,\r\n TreeCheckedKeys,\r\n TreeCheckedKeysObject,\r\n TreeData,\r\n TreeFilterTreeNode,\r\n TreeAllowDrag,\r\n TreeAllowDrop,\r\n TreeAllowDropType,\r\n TreeEmits,\r\n TreeExpandEvent,\r\n TreeExpose,\r\n TreeIndex,\r\n TreeInteractionEvent,\r\n TreeKey,\r\n TreeLoadArgs,\r\n TreeLoadData,\r\n TreeLoadEvent,\r\n TreeNode,\r\n TreeNodeClickArgs,\r\n TreeNodeClassName,\r\n TreeNodeClassNameInfo,\r\n TreeNodeDblclickArgs,\r\n TreeNodeDragEndArgs,\r\n TreeNodeDragStartArgs,\r\n TreeNodeDragTargetArgs,\r\n TreeNodeDropArgs,\r\n TreeNodeDropType,\r\n TreeExpandedNode,\r\n TreeNodeRightClickArgs,\r\n TreeNodeInstance,\r\n TreeNodeModel,\r\n TreeNodeProps,\r\n TreeSelectArgs,\r\n TreeSelectEvent,\r\n TreeSwitcherLoadingIcon,\r\n TreeSwitcherIconMode,\r\n TreeNodeToggleArgs,\r\n TreeProps,\r\n TreeScrollAlign,\r\n TreeScrollToOptions,\r\n TreeSemanticDOM,\r\n TreeSemanticRecord,\r\n TreeShowLine,\r\n TreeShowLineOptions,\r\n TreeStyles\r\n} from './src/tree'\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\nimport type {\r\n FlRadialMenuCloseReason,\r\n FlRadialMenuDropdownPlacement,\r\n FlRadialMenuItemData,\r\n FlRadialMenuItemType,\r\n FlRadialMenuMode,\r\n FlRadialMenuMoreMode,\r\n FlRadialMenuOpenReason,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSelectContext,\r\n FlRadialMenuSize,\r\n FlRadialMenuTrigger\r\n} from './types'\r\n\r\nconst radialMenuSizes: FlRadialMenuSize[] = ['large', 'medium', 'small']\r\nconst radialMenuItemTypes: FlRadialMenuItemType[] = ['square', 'circle']\r\n\r\nexport const flRadialMenuProps = {\r\n items: {\r\n type: Array as PropType<FlRadialMenuItemData[]>,\r\n default: () => []\r\n },\r\n mode: {\r\n type: String as PropType<FlRadialMenuMode>,\r\n default: 'inline'\r\n },\r\n trigger: {\r\n type: String as PropType<FlRadialMenuTrigger>,\r\n default: 'click'\r\n },\r\n modelValue: {\r\n type: Boolean,\r\n default: undefined\r\n },\r\n shortcut: {\r\n type: String,\r\n default: ''\r\n },\r\n shortcutEnabled: {\r\n type: Boolean,\r\n default: true\r\n },\r\n centerIcon: {\r\n type: [Object, String] as PropType<FlRadialMenuItemData['icon']>,\r\n default: undefined\r\n },\r\n centerLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n maxRingItems: {\r\n type: Number,\r\n default: 6\r\n },\r\n closeOnSelect: {\r\n type: Boolean,\r\n default: true\r\n },\r\n moreText: {\r\n type: String,\r\n default: 'More'\r\n },\r\n moreMode: {\r\n type: String as PropType<FlRadialMenuMoreMode>,\r\n default: 'text-ellipsis'\r\n },\r\n moreDropdownPlacement: {\r\n type: String as PropType<FlRadialMenuDropdownPlacement>,\r\n default: 'bottom'\r\n },\r\n size: {\r\n type: String as PropType<FlRadialMenuSize>,\r\n default: undefined,\r\n validator: (value: string) => radialMenuSizes.includes(value as FlRadialMenuSize)\r\n },\r\n itemType: {\r\n type: String as PropType<FlRadialMenuItemType>,\r\n default: 'square',\r\n validator: (value: string) => radialMenuItemTypes.includes(value as FlRadialMenuItemType)\r\n },\r\n teleport: {\r\n type: [Boolean, String] as unknown as PropType<boolean | string>,\r\n default: true\r\n },\r\n zIndex: {\r\n type: Number,\r\n default: 2000\r\n }\r\n} as const\r\n\r\nexport const flRadialMenuEmits = {\r\n 'update:modelValue': (opened: boolean) => typeof opened === 'boolean',\r\n open: (reason: FlRadialMenuOpenReason) => typeof reason === 'string',\r\n close: (reason: FlRadialMenuCloseReason) => typeof reason === 'string',\r\n select: (\r\n index: string,\r\n indexPath: string[],\r\n item: FlRadialMenuResolvedItem,\r\n context: FlRadialMenuSelectContext\r\n ) =>\r\n typeof index === 'string' &&\r\n Array.isArray(indexPath) &&\r\n indexPath.every((path) => typeof path === 'string') &&\r\n item !== undefined &&\r\n context !== undefined,\r\n 'active-change': (item: FlRadialMenuResolvedItem | null) => item === null || item !== undefined,\r\n 'more-open': () => true,\r\n 'more-close': () => true\r\n} as const\r\n\r\nexport type FlRadialMenuProps = ExtractPublicPropTypes<typeof flRadialMenuProps>\r\nexport type FlRadialMenuEmits = typeof flRadialMenuEmits\r\nexport type RadialMenuProps = FlRadialMenuProps\r\nexport type RadialMenuEmits = FlRadialMenuEmits\r\n\r\nexport type {\r\n FlRadialMenuCloseReason,\r\n FlRadialMenuDropdownPlacement,\r\n FlRadialMenuExpose,\r\n FlRadialMenuItemData,\r\n FlRadialMenuItemType,\r\n FlRadialMenuMode,\r\n FlRadialMenuMoreMode,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuOpenReason,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSelectContext,\r\n FlRadialMenuSize,\r\n FlRadialMenuTrigger\r\n} from './types'\r\n","import type {\r\n FlRadialMenuItemData,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem\r\n} from './types'\r\n\r\ninterface RadialMenuItemVisibility {\r\n hidden?: boolean\r\n}\r\n\r\nexport interface RadialMenuSplitItems<\r\n T extends RadialMenuItemVisibility = FlRadialMenuResolvedItem\r\n> {\r\n visibleItems: T[]\r\n ringItems: T[]\r\n moreItems: T[]\r\n ringLimit: number\r\n}\r\n\r\nexport interface NormalizeRadialMenuItemsOptions {\r\n warn?: (message: string) => void\r\n}\r\n\r\nexport const clampRingItemCount = (maxRingItems: number) => {\r\n if (!Number.isFinite(maxRingItems)) {\r\n return 6\r\n }\r\n\r\n return Math.min(Math.max(Math.trunc(maxRingItems), 1), 6)\r\n}\r\n\r\nexport const resolveRadialMenuItemIndex = (item: FlRadialMenuItemData) => {\r\n const rawIndex = item.index ?? item.key\r\n\r\n if (rawIndex === undefined || rawIndex === null || rawIndex === '') {\r\n return ''\r\n }\r\n\r\n return String(rawIndex)\r\n}\r\n\r\nexport const normalizeRadialMenuItems = (\r\n items: FlRadialMenuResolvableItem[],\r\n options: NormalizeRadialMenuItemsOptions = {}\r\n): FlRadialMenuResolvedItem[] => {\r\n const seenIndexes = new Set<string>()\r\n const normalizedItems: FlRadialMenuResolvedItem[] = []\r\n\r\n for (const item of items) {\r\n const index = resolveRadialMenuItemIndex(item)\r\n\r\n if (!index) {\r\n options.warn?.('Missing required prop: \"index\"')\r\n continue\r\n }\r\n\r\n if (seenIndexes.has(index)) {\r\n options.warn?.(`Duplicate item index detected: ${index}`)\r\n continue\r\n }\r\n\r\n seenIndexes.add(index)\r\n normalizedItems.push({\r\n ...item,\r\n index\r\n })\r\n }\r\n\r\n return normalizedItems\r\n}\r\n\r\nexport const splitRadialMenuItems = <T extends RadialMenuItemVisibility>(\r\n items: T[],\r\n maxRingItems: number\r\n): RadialMenuSplitItems<T> => {\r\n const ringLimit = clampRingItemCount(maxRingItems)\r\n const visibleItems = items.filter((item) => !item.hidden)\r\n\r\n return {\r\n visibleItems,\r\n ringItems: visibleItems.slice(0, ringLimit),\r\n moreItems: visibleItems.slice(ringLimit),\r\n ringLimit\r\n }\r\n}\r\n\r\nexport const isRadialMenuItemDisabled = (item: FlRadialMenuResolvedItem | undefined) =>\r\n item?.disabled === true\r\n","import type { Ref } from 'vue'\r\nimport type { FlRadialMenuResolvedItem } from './types'\r\n\r\nexport interface UseRadialMenuKeyboardOptions {\r\n ringItems: Ref<FlRadialMenuResolvedItem[]>\r\n moreItems: Ref<FlRadialMenuResolvedItem[]>\r\n ringRefs: Ref<HTMLButtonElement[]>\r\n moreRefs: Ref<HTMLButtonElement[]>\r\n closeMenu: () => void\r\n closeMore: () => void\r\n activateFocused: (event: KeyboardEvent) => void\r\n}\r\n\r\nconst findNextEnabledIndex = (\r\n items: FlRadialMenuResolvedItem[],\r\n currentIndex: number,\r\n direction: 1 | -1\r\n) => {\r\n if (items.length === 0) {\r\n return -1\r\n }\r\n\r\n for (let step = 1; step <= items.length; step += 1) {\r\n const nextIndex = (currentIndex + step * direction + items.length) % items.length\r\n if (!items[nextIndex]?.disabled) {\r\n return nextIndex\r\n }\r\n }\r\n\r\n return -1\r\n}\r\n\r\nexport const useRadialMenuKeyboard = ({\r\n ringItems,\r\n moreItems,\r\n ringRefs,\r\n moreRefs,\r\n closeMenu,\r\n closeMore,\r\n activateFocused\r\n}: UseRadialMenuKeyboardOptions) => {\r\n const focusRingItem = (index: number) => {\r\n ringRefs.value[index]?.focus()\r\n }\r\n\r\n const focusFirstAvailableRingItem = () => {\r\n const index = findNextEnabledIndex(ringItems.value, -1, 1)\r\n if (index >= 0) {\r\n focusRingItem(index)\r\n }\r\n }\r\n\r\n const handleRingKeydown = (event: KeyboardEvent, index: number) => {\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(ringItems.value, index, 1)\r\n if (nextIndex >= 0) {\r\n focusRingItem(nextIndex)\r\n }\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(ringItems.value, index, -1)\r\n if (nextIndex >= 0) {\r\n focusRingItem(nextIndex)\r\n }\r\n return\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n activateFocused(event)\r\n }\r\n }\r\n\r\n const handleMoreKeydown = (event: KeyboardEvent, index: number) => {\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(moreItems.value, index, 1)\r\n moreRefs.value[nextIndex]?.focus()\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(moreItems.value, index, -1)\r\n moreRefs.value[nextIndex]?.focus()\r\n return\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n activateFocused(event)\r\n }\r\n }\r\n\r\n const handleMenuKeydown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault()\r\n closeMore()\r\n closeMenu()\r\n }\r\n }\r\n\r\n return {\r\n focusFirstAvailableRingItem,\r\n handleMenuKeydown,\r\n handleRingKeydown,\r\n handleMoreKeydown\r\n }\r\n}\r\n","export interface RadialMenuItemLayoutOptions {\r\n count: number\r\n index: number\r\n radius: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuItemLayout {\r\n angle: number\r\n x: number\r\n y: number\r\n}\r\n\r\nexport interface RadialMenuSectorPathOptions {\r\n activeIndex: number\r\n count: number\r\n innerRadius: number\r\n outerRadius: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuTrackArcPathOptions {\r\n activeIndex: number\r\n count: number\r\n radius: number\r\n innerRadius?: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuClockwiseArcPointsOptions {\r\n radius: number\r\n targetAngle: number\r\n startAngle?: number\r\n steps?: number\r\n}\r\n\r\nexport interface RadialMenuClockwiseEntryOrderOptions {\r\n startAngle?: number\r\n}\r\n\r\nexport type RadialMenuTipPlacement = 'left' | 'right' | 'top' | 'bottom'\r\n\r\nconst toRadians = (degree: number) => (degree * Math.PI) / 180\r\nconst normalizeCircleCoordinate = (value: number) => (Math.abs(value) < 0.001 ? 0 : value)\r\n\r\nexport const normalizeRadialMenuAngle = (angle: number) => {\r\n const normalized = angle % 360\r\n\r\n return normalized < 0 ? normalized + 360 : normalized\r\n}\r\n\r\nconst pointOnCircle = (radius: number, angle: number) => {\r\n const radians = toRadians(angle)\r\n\r\n return {\r\n x: normalizeCircleCoordinate(Math.cos(radians) * radius),\r\n y: normalizeCircleCoordinate(Math.sin(radians) * radius)\r\n }\r\n}\r\n\r\nexport const getRadialMenuClockwiseArcPoints = ({\r\n radius,\r\n targetAngle,\r\n startAngle = 0,\r\n steps = 7\r\n}: RadialMenuClockwiseArcPointsOptions) => {\r\n const safeSteps = Math.max(Math.floor(steps), 2)\r\n const normalizedStartAngle = normalizeRadialMenuAngle(startAngle)\r\n const clockwiseSweep = normalizeRadialMenuAngle(targetAngle - normalizedStartAngle)\r\n\r\n return Array.from({ length: safeSteps }, (_, index) => {\r\n const progress = index / (safeSteps - 1)\r\n\r\n return pointOnCircle(radius, normalizedStartAngle + clockwiseSweep * progress)\r\n })\r\n}\r\n\r\nexport const getRadialMenuClockwiseEntryOrder = (\r\n layouts: Array<Pick<RadialMenuItemLayout, 'angle'>>,\r\n { startAngle = 0 }: RadialMenuClockwiseEntryOrderOptions = {}\r\n) => {\r\n const normalizedStartAngle = normalizeRadialMenuAngle(startAngle)\r\n\r\n return layouts\r\n .map((layout, index) => ({\r\n index,\r\n distance: normalizeRadialMenuAngle(layout.angle - normalizedStartAngle)\r\n }))\r\n .sort((current, next) => next.distance - current.distance || current.index - next.index)\r\n .map(({ index }) => index)\r\n}\r\n\r\nconst getRadialMenuActiveAngles = ({\r\n activeIndex,\r\n count,\r\n startAngle = -90\r\n}: Pick<RadialMenuSectorPathOptions, 'activeIndex' | 'count' | 'startAngle'>) => {\r\n const safeCount = Math.max(count, 1)\r\n const sectorAngle = 360 / safeCount\r\n const gap = Math.min(6, sectorAngle / 4)\r\n const centerAngle = startAngle + sectorAngle * activeIndex\r\n const start = centerAngle - sectorAngle / 2 + gap\r\n const end = centerAngle + sectorAngle / 2 - gap\r\n\r\n return {\r\n start,\r\n end,\r\n largeArcFlag: end - start > 180 ? 1 : 0\r\n }\r\n}\r\n\r\nexport const getRadialMenuItemLayout = ({\r\n count,\r\n index,\r\n radius,\r\n startAngle = -90\r\n}: RadialMenuItemLayoutOptions): RadialMenuItemLayout => {\r\n const safeCount = Math.max(count, 1)\r\n const angle = startAngle + (360 / safeCount) * index\r\n const point = pointOnCircle(radius, angle)\r\n\r\n return {\r\n angle,\r\n x: point.x,\r\n y: point.y\r\n }\r\n}\r\n\r\nexport const getRadialMenuSectorPath = ({\r\n activeIndex,\r\n count,\r\n innerRadius,\r\n outerRadius,\r\n startAngle = -90\r\n}: RadialMenuSectorPathOptions) => {\r\n if (outerRadius <= innerRadius) {\r\n return ''\r\n }\r\n\r\n const { start, end, largeArcFlag } = getRadialMenuActiveAngles({\r\n activeIndex,\r\n count,\r\n startAngle\r\n })\r\n const outerStart = pointOnCircle(outerRadius, start)\r\n const outerEnd = pointOnCircle(outerRadius, end)\r\n const innerEnd = pointOnCircle(innerRadius, end)\r\n const innerStart = pointOnCircle(innerRadius, start)\r\n\r\n return [\r\n `M ${outerStart.x.toFixed(3)} ${outerStart.y.toFixed(3)}`,\r\n `A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${outerEnd.x.toFixed(3)} ${outerEnd.y.toFixed(3)}`,\r\n `L ${innerEnd.x.toFixed(3)} ${innerEnd.y.toFixed(3)}`,\r\n `A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${innerStart.x.toFixed(3)} ${innerStart.y.toFixed(3)}`,\r\n 'Z'\r\n ].join(' ')\r\n}\r\n\r\nexport const getRadialMenuTrackArcPath = ({\r\n activeIndex,\r\n count,\r\n radius,\r\n innerRadius = 0,\r\n startAngle = -90\r\n}: RadialMenuTrackArcPathOptions) => {\r\n if (radius <= innerRadius) {\r\n return ''\r\n }\r\n\r\n const { start, end, largeArcFlag } = getRadialMenuActiveAngles({\r\n activeIndex,\r\n count,\r\n startAngle\r\n })\r\n const arcStart = pointOnCircle(radius, start)\r\n const arcEnd = pointOnCircle(radius, end)\r\n\r\n return [\r\n `M ${arcStart.x.toFixed(3)} ${arcStart.y.toFixed(3)}`,\r\n `A ${radius} ${radius} 0 ${largeArcFlag} 1 ${arcEnd.x.toFixed(3)} ${arcEnd.y.toFixed(3)}`\r\n ].join(' ')\r\n}\r\n\r\nexport const getRadialMenuTipPlacement = ({\r\n x,\r\n y\r\n}: Pick<RadialMenuItemLayout, 'x' | 'y'>): RadialMenuTipPlacement => {\r\n if (Math.abs(x) > Math.abs(y)) {\r\n return x < 0 ? 'left' : 'right'\r\n }\r\n\r\n return y < 0 ? 'top' : 'bottom'\r\n}\r\n","import { onMounted, onUnmounted, type Ref } from 'vue'\r\nimport type { FlRadialMenuOpenOptions } from './types'\r\n\r\nexport interface UseRadialMenuShortcutOptions {\r\n shortcut: Ref<string>\r\n enabled: Ref<boolean>\r\n open: (options: FlRadialMenuOpenOptions) => void\r\n}\r\n\r\nconst modifierKeys = new Set(['alt', 'ctrl', 'control', 'meta', 'shift'])\r\n\r\nconst isEditableTarget = (target: EventTarget | null) => {\r\n if (!(target instanceof HTMLElement)) {\r\n return false\r\n }\r\n\r\n const tagName = target.tagName.toLowerCase()\r\n return (\r\n tagName === 'input' ||\r\n tagName === 'textarea' ||\r\n tagName === 'select' ||\r\n target.isContentEditable\r\n )\r\n}\r\n\r\nconst normalizeShortcut = (value: string) =>\r\n value\r\n .split('+')\r\n .map((part) => part.trim().toLowerCase())\r\n .filter(Boolean)\r\n\r\nconst matchesShortcut = (event: KeyboardEvent, shortcut: string) => {\r\n const parts = normalizeShortcut(shortcut)\r\n if (parts.length === 0) {\r\n return false\r\n }\r\n\r\n const key = parts.find((part) => !modifierKeys.has(part))\r\n const expectsAlt = parts.includes('alt')\r\n const expectsCtrl = parts.includes('ctrl') || parts.includes('control')\r\n const expectsMeta = parts.includes('meta')\r\n const expectsShift = parts.includes('shift')\r\n\r\n return (\r\n event.altKey === expectsAlt &&\r\n event.ctrlKey === expectsCtrl &&\r\n event.metaKey === expectsMeta &&\r\n event.shiftKey === expectsShift &&\r\n event.key.toLowerCase() === key\r\n )\r\n}\r\n\r\nconst getViewportCenter = () => ({\r\n x: typeof window === 'undefined' ? 0 : window.innerWidth / 2,\r\n y: typeof window === 'undefined' ? 0 : window.innerHeight / 2\r\n})\r\n\r\nexport const useRadialMenuShortcut = ({\r\n shortcut,\r\n enabled,\r\n open\r\n}: UseRadialMenuShortcutOptions) => {\r\n const center = getViewportCenter()\r\n let lastMouseX = center.x\r\n let lastMouseY = center.y\r\n\r\n const handleMouseMove = (event: MouseEvent) => {\r\n lastMouseX = event.clientX\r\n lastMouseY = event.clientY\r\n }\r\n\r\n const handleKeydown = (event: KeyboardEvent) => {\r\n if (\r\n !enabled.value ||\r\n !matchesShortcut(event, shortcut.value) ||\r\n isEditableTarget(event.target)\r\n ) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n open({\r\n x: lastMouseX,\r\n y: lastMouseY,\r\n reason: 'shortcut'\r\n })\r\n }\r\n\r\n onMounted(() => {\r\n window.addEventListener('mousemove', handleMouseMove)\r\n window.addEventListener('keydown', handleKeydown)\r\n })\r\n\r\n onUnmounted(() => {\r\n window.removeEventListener('mousemove', handleMouseMove)\r\n window.removeEventListener('keydown', handleKeydown)\r\n })\r\n}\r\n","import { computed, ref, type Ref } from 'vue'\r\nimport type { FlRadialMenuCloseReason, FlRadialMenuOpenOptions } from './types'\r\n\r\nexport interface UseRadialMenuStateOptions {\r\n modelValue: Ref<boolean | undefined>\r\n disabled: Ref<boolean>\r\n emitUpdate: (opened: boolean) => void\r\n}\r\n\r\nexport const useRadialMenuState = ({\r\n modelValue,\r\n disabled,\r\n emitUpdate\r\n}: UseRadialMenuStateOptions) => {\r\n const uncontrolledOpened = ref(false)\r\n const floatingX = ref<number | undefined>()\r\n const floatingY = ref<number | undefined>()\r\n const isControlled = computed(() => modelValue.value !== undefined)\r\n const opened = computed(() =>\r\n isControlled.value ? modelValue.value === true : uncontrolledOpened.value\r\n )\r\n\r\n const setOpened = (nextOpened: boolean) => {\r\n if (disabled.value && nextOpened) {\r\n return\r\n }\r\n\r\n if (!isControlled.value) {\r\n uncontrolledOpened.value = nextOpened\r\n }\r\n\r\n emitUpdate(nextOpened)\r\n }\r\n\r\n const open = (options: FlRadialMenuOpenOptions = {}) => {\r\n if (options.x !== undefined) {\r\n floatingX.value = options.x\r\n }\r\n\r\n if (options.y !== undefined) {\r\n floatingY.value = options.y\r\n }\r\n\r\n setOpened(true)\r\n }\r\n\r\n const close = (_reason: FlRadialMenuCloseReason = 'manual') => {\r\n setOpened(false)\r\n }\r\n\r\n const toggle = (options: FlRadialMenuOpenOptions = {}) => {\r\n if (opened.value) {\r\n close('manual')\r\n } else {\r\n open(options)\r\n }\r\n }\r\n\r\n return {\r\n opened,\r\n floatingX,\r\n floatingY,\r\n open,\r\n close,\r\n toggle\r\n }\r\n}\r\n","<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"rootClass\"\r\n :style=\"rootStyle\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\">\r\n <button\r\n ref=\"centerRef\"\r\n type=\"button\"\r\n :class=\"ns.e('center')\"\r\n :disabled=\"props.disabled\"\r\n :aria-expanded=\"opened\"\r\n aria-haspopup=\"menu\"\r\n @click=\"handleCenterClick\">\r\n <slot name=\"center\">\r\n <component\r\n :is=\"props.centerIcon\"\r\n v-if=\"props.centerIcon && typeof props.centerIcon !== 'string'\" />\r\n <span v-else-if=\"props.centerIcon\" :class=\"ns.e('center-icon')\">\r\n {{ props.centerIcon }}\r\n </span>\r\n <span v-if=\"props.centerLabel\" :class=\"ns.e('center-label')\">{{ props.centerLabel }}</span>\r\n </slot>\r\n </button>\r\n\r\n <div v-if=\"opened\" :class=\"ns.e('panel')\" role=\"menu\" @keydown=\"handleMenuKeydown\">\r\n <svg :class=\"ns.e('sector')\" viewBox=\"-140 -140 280 280\" aria-hidden=\"true\">\r\n <circle :class=\"ns.e('track')\" cx=\"0\" cy=\"0\" :r=\"resolvedRadius\" />\r\n <path v-if=\"sectorPath\" :class=\"ns.e('sector-path')\" :d=\"sectorPath\" />\r\n <path v-if=\"activeTrackPath\" :class=\"ns.e('track-active')\" :d=\"activeTrackPath\" />\r\n </svg>\r\n\r\n <button\r\n v-for=\"(item, index) in ringItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setRingButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[\r\n ns.e('item'),\r\n ns.is('active', activeRingIndex === index),\r\n ns.is('disabled', item.disabled === true)\r\n ]\"\r\n :style=\"getItemStyle(index)\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-index=\"item.index\"\r\n @mouseenter=\"setActiveRingIndex(index)\"\r\n @focus=\"setActiveRingIndex(index)\"\r\n @mouseleave=\"setActiveRingIndex(null)\"\r\n @click=\"activateItem(item, 'ring', index, $event)\"\r\n @keydown=\"handleRingKeydown($event, index)\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('item-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"getItemLabelClass(index)\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </button>\r\n\r\n <button\r\n v-if=\"moreItems.length > 0\"\r\n type=\"button\"\r\n :class=\"ns.e('more')\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"moreOpened\"\r\n @click=\"setMoreOpened(!moreOpened)\">\r\n {{ moreLabel }}\r\n </button>\r\n\r\n <div\r\n v-if=\"moreOpened\"\r\n :class=\"[ns.e('more-dropdown'), ns.m(`more-${props.moreDropdownPlacement}`)]\"\r\n role=\"menu\">\r\n <button\r\n v-for=\"(item, index) in moreItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setMoreButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[ns.e('more-item'), ns.is('disabled', item.disabled === true)]\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-more-index=\"item.index\"\r\n @click=\"activateItem(item, 'more', index, $event)\"\r\n @keydown=\"handleMoreKeydown($event, index)\">\r\n <span :class=\"ns.e('more-content')\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\"\r\n :class=\"ns.e('more-icon')\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('more-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"ns.e('more-label')\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </span>\r\n <span v-if=\"item.shortcut\" :class=\"ns.e('shortcut')\">{{ item.shortcut }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n Fragment,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n ref,\r\n toRef,\r\n useSlots,\r\n useTemplateRef,\r\n watch,\r\n type Component,\r\n type ComponentPublicInstance,\r\n type Slot,\r\n type VNode,\r\n type VNodeArrayChildren\r\n} from 'vue'\r\nimport { useGlobalSize } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flRadialMenuEmits, flRadialMenuProps } from './radial-menu'\r\nimport { normalizeRadialMenuItems, splitRadialMenuItems } from './use-radial-menu-items'\r\nimport { useRadialMenuKeyboard } from './use-radial-menu-keyboard'\r\nimport {\r\n getRadialMenuClockwiseArcPoints,\r\n getRadialMenuClockwiseEntryOrder,\r\n getRadialMenuItemLayout,\r\n getRadialMenuSectorPath,\r\n getRadialMenuTrackArcPath,\r\n getRadialMenuTipPlacement,\r\n normalizeRadialMenuAngle\r\n} from './use-radial-menu-position'\r\nimport { useRadialMenuShortcut } from './use-radial-menu-shortcut'\r\nimport { useRadialMenuState } from './use-radial-menu-state'\r\nimport type {\r\n FlRadialMenuExpose,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSize\r\n} from './types'\r\n\r\ntype RadialMenuEntryKeyframe = {\r\n offset: number\r\n opacity: number\r\n transform: string\r\n}\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenu'\r\n})\r\n\r\nconst props = defineProps(flRadialMenuProps)\r\nconst emit = defineEmits(flRadialMenuEmits)\r\ndefineSlots<{\r\n default?: () => unknown\r\n center?: () => unknown\r\n}>()\r\nconst ns = useNamespace('radial-menu')\r\nconst slots = useSlots()\r\nconst rootRef = useTemplateRef<HTMLDivElement>('rootRef')\r\nconst centerRef = useTemplateRef<HTMLButtonElement>('centerRef')\r\nconst activeRingIndex = ref<number | null>(null)\r\nconst moreOpened = ref(false)\r\nconst isEntryAnimating = ref(false)\r\nconst ringButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst moreButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst warnedMessages = new Set<string>()\r\nconst globalSize = useGlobalSize()\r\nconst radialMenuEntryTrackDelay = 120\r\nconst radialMenuEntryItemMinDuration = 440\r\nconst radialMenuEntryItemMaxDuration = 600\r\nconst radialMenuEntryItemStagger = 90\r\nconst radialMenuEntryArcSteps = 9\r\nconst radialMenuEntryStartAngle = 180\r\nconst radialMenuEntryEasing = 'cubic-bezier(0.2, 0, 0, 1)'\r\nconst radialMenuGeometryBySize = {\r\n large: {\r\n radius: 96,\r\n centerSize: 56\r\n },\r\n medium: {\r\n radius: 80,\r\n centerSize: 48\r\n },\r\n small: {\r\n radius: 64,\r\n centerSize: 40\r\n }\r\n} satisfies Record<FlRadialMenuSize, { radius: number; centerSize: number }>\r\n\r\nconst mapGlobalSize = (size: '' | 'default' | 'large' | 'small'): FlRadialMenuSize => {\r\n if (size === 'large' || size === 'small') {\r\n return size\r\n }\r\n\r\n if (size === 'default') {\r\n return 'medium'\r\n }\r\n\r\n return 'large'\r\n}\r\n\r\nconst warnRadialMenu = (message: string) => {\r\n if (warnedMessages.has(message)) {\r\n return\r\n }\r\n\r\n warnedMessages.add(message)\r\n console.warn(`[FlRadialMenu] ${message}`)\r\n}\r\n\r\nconst flattenSlotVNodes = (children: VNodeArrayChildren): VNode[] => {\r\n const vnodes: VNode[] = []\r\n\r\n for (const child of children) {\r\n if (Array.isArray(child)) {\r\n vnodes.push(...flattenSlotVNodes(child as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n if (!isVNode(child)) {\r\n continue\r\n }\r\n\r\n if (child.type === Fragment && Array.isArray(child.children)) {\r\n vnodes.push(...flattenSlotVNodes(child.children as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n vnodes.push(child)\r\n }\r\n\r\n return vnodes\r\n}\r\n\r\nconst isRadialMenuItemVNode = (vnode: VNode) =>\r\n typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'FlRadialMenuItem'\r\n\r\nconst readBooleanSlotProp = (value: unknown) => value === true || value === ''\r\n\r\nconst readOptionalBooleanSlotProp = (value: unknown) =>\r\n value === undefined ? undefined : readBooleanSlotProp(value)\r\n\r\nconst readSlotItemSlots = (children: VNode['children']) => {\r\n if (!children || Array.isArray(children) || typeof children !== 'object') {\r\n return undefined\r\n }\r\n\r\n return children as Partial<Record<string, Slot>>\r\n}\r\n\r\nconst readSlotItemProps = (vnode: VNode): FlRadialMenuResolvableItem => {\r\n const vnodeProps = (vnode.props ?? {}) as Record<string, unknown>\r\n const vnodeSlots = readSlotItemSlots(vnode.children)\r\n\r\n return {\r\n index: typeof vnodeProps.index === 'string' ? vnodeProps.index : undefined,\r\n label: typeof vnodeProps.label === 'string' ? vnodeProps.label : '',\r\n icon: vnodeProps.icon as Component | undefined,\r\n shortcut: typeof vnodeProps.shortcut === 'string' ? vnodeProps.shortcut : undefined,\r\n disabled: readBooleanSlotProp(vnodeProps.disabled),\r\n hidden: readBooleanSlotProp(vnodeProps.hidden),\r\n divided: readBooleanSlotProp(vnodeProps.divided),\r\n closeOnSelect: readOptionalBooleanSlotProp(vnodeProps.closeOnSelect),\r\n meta:\r\n vnodeProps.meta && typeof vnodeProps.meta === 'object'\r\n ? (vnodeProps.meta as Record<string, unknown>)\r\n : undefined,\r\n iconSlot: vnodeSlots?.icon,\r\n labelSlot: vnodeSlots?.label\r\n }\r\n}\r\n\r\nconst slotItems = computed(() =>\r\n flattenSlotVNodes(slots.default?.() ?? [])\r\n .filter(isRadialMenuItemVNode)\r\n .map(readSlotItemProps)\r\n)\r\nconst resolvedItems = computed(() =>\r\n normalizeRadialMenuItems(slotItems.value.length > 0 ? slotItems.value : props.items, {\r\n warn: warnRadialMenu\r\n })\r\n)\r\nconst splitItems = computed(() => splitRadialMenuItems(resolvedItems.value, props.maxRingItems))\r\nconst ringItems = computed(() => splitItems.value.ringItems)\r\nconst moreItems = computed(() => splitItems.value.moreItems)\r\nconst resolvedSize = computed(() => props.size ?? mapGlobalSize(globalSize.value))\r\nconst sizeGeometry = computed(() => radialMenuGeometryBySize[resolvedSize.value])\r\nconst resolvedRadius = computed(() => sizeGeometry.value.radius)\r\nconst resolvedCenterSize = computed(() => sizeGeometry.value.centerSize)\r\nconst activeItem = computed(() =>\r\n activeRingIndex.value === null ? null : (ringItems.value[activeRingIndex.value] ?? null)\r\n)\r\nconst sectorInnerRadius = computed(() => resolvedCenterSize.value / 2 + 8)\r\nconst sectorPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuSectorPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n innerRadius: sectorInnerRadius.value,\r\n outerRadius: resolvedRadius.value\r\n })\r\n})\r\nconst activeTrackPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuTrackArcPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n radius: resolvedRadius.value,\r\n innerRadius: sectorInnerRadius.value\r\n })\r\n})\r\n\r\nconst { opened, floatingX, floatingY, open, close, toggle } = useRadialMenuState({\r\n modelValue: toRef(props, 'modelValue'),\r\n disabled: toRef(props, 'disabled'),\r\n emitUpdate: (nextOpened) => emit('update:modelValue', nextOpened)\r\n})\r\n\r\nuseRadialMenuShortcut({\r\n shortcut: toRef(props, 'shortcut'),\r\n enabled: computed(() => props.shortcutEnabled && Boolean(props.shortcut)),\r\n open\r\n})\r\n\r\nconst rootClass = computed(() => [\r\n ns.b(),\r\n ns.m(props.mode),\r\n ns.m(resolvedSize.value),\r\n ns.m(`item-${props.itemType}`),\r\n ns.is('opened', opened.value),\r\n ns.is('entering', isEntryAnimating.value),\r\n ns.is('disabled', props.disabled)\r\n])\r\n\r\nconst rootStyle = computed(() => ({\r\n '--fl-radial-menu-floating-x': `${floatingX.value ?? (typeof window === 'undefined' ? 0 : window.innerWidth / 2)}px`,\r\n '--fl-radial-menu-floating-y': `${floatingY.value ?? (typeof window === 'undefined' ? 0 : window.innerHeight / 2)}px`,\r\n '--fl-radial-menu-z-index': String(props.zIndex),\r\n '--fl-radial-menu-more-enter-delay': `${radialMenuEntryTrackDelay + Math.max(ringItems.value.length - 1, 0) * radialMenuEntryItemStagger}ms`\r\n}))\r\n\r\nconst getItemIcon = (item: FlRadialMenuResolvedItem) => item.iconSlot ?? item.icon\r\nconst RadialMenuItemLabel = ({ item }: { item: FlRadialMenuResolvedItem }) =>\r\n item.labelSlot?.() ?? item.label\r\n\r\nconst getItemLayout = (index: number) =>\r\n getRadialMenuItemLayout({\r\n count: ringItems.value.length,\r\n index,\r\n radius: resolvedRadius.value\r\n })\r\n\r\nconst formatEntryCoordinate = (value: number) => {\r\n const rounded = Math.abs(value) < 0.001 ? 0 : Number(value.toFixed(3))\r\n\r\n return `${rounded}px`\r\n}\r\n\r\nconst getEntryTransform = (x: number, y: number, scale = 1) =>\r\n `translate(calc(-50% + ${formatEntryCoordinate(x)}), calc(-50% + ${formatEntryCoordinate(y)})) scale(${scale})`\r\n\r\nconst prefersReducedMotion = () =>\r\n typeof window !== 'undefined' &&\r\n typeof window.matchMedia === 'function' &&\r\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n\r\nconst canUseWebAnimations = () =>\r\n typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.animate === 'function'\r\n\r\nconst canAnimateElement = (element: HTMLElement) => typeof element.animate === 'function'\r\n\r\nconst getItemStyle = (index: number) => {\r\n const layout = getItemLayout(index)\r\n\r\n return {\r\n '--fl-radial-menu-item-x': `${layout.x}px`,\r\n '--fl-radial-menu-item-y': `${layout.y}px`,\r\n '--fl-radial-menu-item-index': String(index)\r\n }\r\n}\r\n\r\nconst getItemLabelClass = (index: number) => {\r\n const placement = getRadialMenuTipPlacement(getItemLayout(index))\r\n\r\n return [\r\n ns.e('item-label'),\r\n ns.em('item-label', `tip-${placement}`),\r\n moreItems.value.length > 0 && placement === 'bottom'\r\n ? ns.em('item-label', 'hidden-by-more')\r\n : ''\r\n ]\r\n}\r\n\r\nconst moreLabel = computed(() => {\r\n if (props.moreMode === 'ellipsis') {\r\n return '...'\r\n }\r\n\r\n if (props.moreMode === 'text') {\r\n return props.moreText\r\n }\r\n\r\n return `${props.moreText} ...`\r\n})\r\n\r\nconst setActiveRingIndex = (index: number | null) => {\r\n activeRingIndex.value = index\r\n emit('active-change', activeItem.value)\r\n}\r\n\r\nconst setRingButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n ringButtonRefs.value[index] = element\r\n } else {\r\n delete ringButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n moreButtonRefs.value[index] = element\r\n } else {\r\n delete moreButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreOpened = (nextOpened: boolean) => {\r\n moreOpened.value = nextOpened\r\n if (nextOpened) {\r\n emit('more-open')\r\n } else {\r\n emit('more-close')\r\n }\r\n}\r\n\r\nlet isDocumentPointerdownBound = false\r\n\r\nconst removeDocumentPointerdown = () => {\r\n if (!isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = false\r\n}\r\n\r\nconst addDocumentPointerdown = () => {\r\n if (isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.addEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = true\r\n}\r\n\r\nconst handleDocumentPointerdown = (event: PointerEvent) => {\r\n const { target } = event\r\n\r\n if (!(target instanceof Node)) {\r\n return\r\n }\r\n\r\n if (rootRef.value?.contains(target)) {\r\n return\r\n }\r\n\r\n moreOpened.value = false\r\n close('click-outside')\r\n}\r\n\r\nconst activateItem = (\r\n item: FlRadialMenuResolvedItem,\r\n source: 'ring' | 'more',\r\n index: number,\r\n event: MouseEvent | KeyboardEvent\r\n) => {\r\n if (item.disabled) {\r\n return\r\n }\r\n\r\n emit('select', item.index, [item.index], item, { source, index, event })\r\n\r\n const shouldClose = item.closeOnSelect ?? props.closeOnSelect\r\n if (shouldClose) {\r\n moreOpened.value = false\r\n close('select')\r\n }\r\n}\r\n\r\nconst activateKeyboardItem = (event: KeyboardEvent) => {\r\n const target = event.currentTarget\r\n if (!(target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n target.click()\r\n}\r\n\r\nconst { focusFirstAvailableRingItem, handleMenuKeydown, handleRingKeydown, handleMoreKeydown } =\r\n useRadialMenuKeyboard({\r\n ringItems,\r\n moreItems,\r\n ringRefs: ringButtonRefs,\r\n moreRefs: moreButtonRefs,\r\n closeMenu: () => close('escape'),\r\n closeMore: () => {\r\n moreOpened.value = false\r\n },\r\n activateFocused: activateKeyboardItem\r\n })\r\n\r\nlet entryAnimations: Animation[] = []\r\nlet entryAnimationToken = 0\r\nlet entryFinishTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst clearEntryFinishTimer = () => {\r\n if (entryFinishTimer === undefined) {\r\n return\r\n }\r\n\r\n clearTimeout(entryFinishTimer)\r\n entryFinishTimer = undefined\r\n}\r\n\r\nconst cancelEntryAnimations = () => {\r\n entryAnimationToken += 1\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst finishEntryAnimations = (token: number) => {\r\n if (token !== entryAnimationToken) {\r\n return\r\n }\r\n\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst getEntryOrderByIndex = () => {\r\n const layouts = ringItems.value.map((_, index) => getItemLayout(index))\r\n const entryOrder = getRadialMenuClockwiseEntryOrder(layouts, {\r\n startAngle: radialMenuEntryStartAngle\r\n })\r\n\r\n return new Map(entryOrder.map((itemIndex, orderIndex) => [itemIndex, orderIndex]))\r\n}\r\n\r\nconst getRingItemEntryDistance = (index: number) =>\r\n normalizeRadialMenuAngle(getItemLayout(index).angle - radialMenuEntryStartAngle)\r\n\r\nconst getRingItemEntryDuration = (index: number) => {\r\n const distanceRatio = Math.min(getRingItemEntryDistance(index), 360) / 360\r\n\r\n return (\r\n radialMenuEntryItemMinDuration +\r\n (radialMenuEntryItemMaxDuration - radialMenuEntryItemMinDuration) * distanceRatio\r\n )\r\n}\r\n\r\nconst getRingItemEntryKeyframes = (index: number): RadialMenuEntryKeyframe[] => {\r\n const layout = getItemLayout(index)\r\n const finalOpacity = ringItems.value[index]?.disabled ? 0.5 : 1\r\n const points = getRadialMenuClockwiseArcPoints({\r\n radius: resolvedRadius.value,\r\n startAngle: radialMenuEntryStartAngle,\r\n targetAngle: layout.angle,\r\n steps: radialMenuEntryArcSteps\r\n })\r\n\r\n return points.map((point, pointIndex) => ({\r\n offset: pointIndex / (points.length - 1),\r\n opacity: pointIndex === 0 ? 0 : finalOpacity,\r\n transform: getEntryTransform(point.x, point.y, pointIndex === 0 ? 0.86 : 1)\r\n }))\r\n}\r\n\r\nconst playEntryAnimations = () => {\r\n if (prefersReducedMotion() || ringItems.value.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n const ringButtons = ringButtonRefs.value.slice(0, ringItems.value.length)\r\n const entryOrderByIndex = getEntryOrderByIndex()\r\n const animations: Animation[] = []\r\n let maxEntryEndTime = 0\r\n\r\n ringButtons.forEach((button, index) => {\r\n if (!button || !canAnimateElement(button)) {\r\n return\r\n }\r\n\r\n const orderIndex = entryOrderByIndex.get(index) ?? index\r\n const delay = radialMenuEntryTrackDelay + orderIndex * radialMenuEntryItemStagger\r\n const duration = getRingItemEntryDuration(index)\r\n const animation = button.animate(getRingItemEntryKeyframes(index), {\r\n delay,\r\n duration,\r\n easing: radialMenuEntryEasing,\r\n fill: 'both'\r\n })\r\n\r\n maxEntryEndTime = Math.max(maxEntryEndTime, delay + duration)\r\n animations.push(animation)\r\n })\r\n\r\n if (animations.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n entryAnimationToken += 1\r\n const token = entryAnimationToken\r\n\r\n entryAnimations = animations\r\n isEntryAnimating.value = true\r\n entryFinishTimer = setTimeout(() => finishEntryAnimations(token), Math.ceil(maxEntryEndTime) + 40)\r\n}\r\n\r\nwatch(opened, async (nextOpened) => {\r\n cancelEntryAnimations()\r\n\r\n if (!nextOpened) {\r\n return\r\n }\r\n\r\n isEntryAnimating.value =\r\n canUseWebAnimations() && !prefersReducedMotion() && ringItems.value.length > 0\r\n\r\n await nextTick()\r\n if (!opened.value) {\r\n return\r\n }\r\n\r\n playEntryAnimations()\r\n focusFirstAvailableRingItem()\r\n})\r\n\r\nwatch(\r\n opened,\r\n (nextOpened) => {\r\n if (nextOpened) {\r\n addDocumentPointerdown()\r\n } else {\r\n removeDocumentPointerdown()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n removeDocumentPointerdown()\r\n cancelEntryAnimations()\r\n})\r\n\r\nconst handleCenterClick = () => {\r\n if (props.disabled || props.trigger !== 'click') {\r\n return\r\n }\r\n\r\n toggle({ reason: 'click' })\r\n}\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.disabled || props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n open({ reason: 'hover' })\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n close('hover-leave')\r\n}\r\n\r\nconst focus = () => {\r\n centerRef.value?.focus()\r\n}\r\n\r\ndefineExpose<FlRadialMenuExpose>({\r\n open: (options?: FlRadialMenuOpenOptions) => open(options),\r\n close,\r\n toggle,\r\n focus\r\n})\r\n</script>\r\n","<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"rootClass\"\r\n :style=\"rootStyle\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\">\r\n <button\r\n ref=\"centerRef\"\r\n type=\"button\"\r\n :class=\"ns.e('center')\"\r\n :disabled=\"props.disabled\"\r\n :aria-expanded=\"opened\"\r\n aria-haspopup=\"menu\"\r\n @click=\"handleCenterClick\">\r\n <slot name=\"center\">\r\n <component\r\n :is=\"props.centerIcon\"\r\n v-if=\"props.centerIcon && typeof props.centerIcon !== 'string'\" />\r\n <span v-else-if=\"props.centerIcon\" :class=\"ns.e('center-icon')\">\r\n {{ props.centerIcon }}\r\n </span>\r\n <span v-if=\"props.centerLabel\" :class=\"ns.e('center-label')\">{{ props.centerLabel }}</span>\r\n </slot>\r\n </button>\r\n\r\n <div v-if=\"opened\" :class=\"ns.e('panel')\" role=\"menu\" @keydown=\"handleMenuKeydown\">\r\n <svg :class=\"ns.e('sector')\" viewBox=\"-140 -140 280 280\" aria-hidden=\"true\">\r\n <circle :class=\"ns.e('track')\" cx=\"0\" cy=\"0\" :r=\"resolvedRadius\" />\r\n <path v-if=\"sectorPath\" :class=\"ns.e('sector-path')\" :d=\"sectorPath\" />\r\n <path v-if=\"activeTrackPath\" :class=\"ns.e('track-active')\" :d=\"activeTrackPath\" />\r\n </svg>\r\n\r\n <button\r\n v-for=\"(item, index) in ringItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setRingButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[\r\n ns.e('item'),\r\n ns.is('active', activeRingIndex === index),\r\n ns.is('disabled', item.disabled === true)\r\n ]\"\r\n :style=\"getItemStyle(index)\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-index=\"item.index\"\r\n @mouseenter=\"setActiveRingIndex(index)\"\r\n @focus=\"setActiveRingIndex(index)\"\r\n @mouseleave=\"setActiveRingIndex(null)\"\r\n @click=\"activateItem(item, 'ring', index, $event)\"\r\n @keydown=\"handleRingKeydown($event, index)\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('item-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"getItemLabelClass(index)\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </button>\r\n\r\n <button\r\n v-if=\"moreItems.length > 0\"\r\n type=\"button\"\r\n :class=\"ns.e('more')\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"moreOpened\"\r\n @click=\"setMoreOpened(!moreOpened)\">\r\n {{ moreLabel }}\r\n </button>\r\n\r\n <div\r\n v-if=\"moreOpened\"\r\n :class=\"[ns.e('more-dropdown'), ns.m(`more-${props.moreDropdownPlacement}`)]\"\r\n role=\"menu\">\r\n <button\r\n v-for=\"(item, index) in moreItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setMoreButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[ns.e('more-item'), ns.is('disabled', item.disabled === true)]\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-more-index=\"item.index\"\r\n @click=\"activateItem(item, 'more', index, $event)\"\r\n @keydown=\"handleMoreKeydown($event, index)\">\r\n <span :class=\"ns.e('more-content')\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\"\r\n :class=\"ns.e('more-icon')\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('more-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"ns.e('more-label')\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </span>\r\n <span v-if=\"item.shortcut\" :class=\"ns.e('shortcut')\">{{ item.shortcut }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n Fragment,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n ref,\r\n toRef,\r\n useSlots,\r\n useTemplateRef,\r\n watch,\r\n type Component,\r\n type ComponentPublicInstance,\r\n type Slot,\r\n type VNode,\r\n type VNodeArrayChildren\r\n} from 'vue'\r\nimport { useGlobalSize } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flRadialMenuEmits, flRadialMenuProps } from './radial-menu'\r\nimport { normalizeRadialMenuItems, splitRadialMenuItems } from './use-radial-menu-items'\r\nimport { useRadialMenuKeyboard } from './use-radial-menu-keyboard'\r\nimport {\r\n getRadialMenuClockwiseArcPoints,\r\n getRadialMenuClockwiseEntryOrder,\r\n getRadialMenuItemLayout,\r\n getRadialMenuSectorPath,\r\n getRadialMenuTrackArcPath,\r\n getRadialMenuTipPlacement,\r\n normalizeRadialMenuAngle\r\n} from './use-radial-menu-position'\r\nimport { useRadialMenuShortcut } from './use-radial-menu-shortcut'\r\nimport { useRadialMenuState } from './use-radial-menu-state'\r\nimport type {\r\n FlRadialMenuExpose,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSize\r\n} from './types'\r\n\r\ntype RadialMenuEntryKeyframe = {\r\n offset: number\r\n opacity: number\r\n transform: string\r\n}\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenu'\r\n})\r\n\r\nconst props = defineProps(flRadialMenuProps)\r\nconst emit = defineEmits(flRadialMenuEmits)\r\ndefineSlots<{\r\n default?: () => unknown\r\n center?: () => unknown\r\n}>()\r\nconst ns = useNamespace('radial-menu')\r\nconst slots = useSlots()\r\nconst rootRef = useTemplateRef<HTMLDivElement>('rootRef')\r\nconst centerRef = useTemplateRef<HTMLButtonElement>('centerRef')\r\nconst activeRingIndex = ref<number | null>(null)\r\nconst moreOpened = ref(false)\r\nconst isEntryAnimating = ref(false)\r\nconst ringButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst moreButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst warnedMessages = new Set<string>()\r\nconst globalSize = useGlobalSize()\r\nconst radialMenuEntryTrackDelay = 120\r\nconst radialMenuEntryItemMinDuration = 440\r\nconst radialMenuEntryItemMaxDuration = 600\r\nconst radialMenuEntryItemStagger = 90\r\nconst radialMenuEntryArcSteps = 9\r\nconst radialMenuEntryStartAngle = 180\r\nconst radialMenuEntryEasing = 'cubic-bezier(0.2, 0, 0, 1)'\r\nconst radialMenuGeometryBySize = {\r\n large: {\r\n radius: 96,\r\n centerSize: 56\r\n },\r\n medium: {\r\n radius: 80,\r\n centerSize: 48\r\n },\r\n small: {\r\n radius: 64,\r\n centerSize: 40\r\n }\r\n} satisfies Record<FlRadialMenuSize, { radius: number; centerSize: number }>\r\n\r\nconst mapGlobalSize = (size: '' | 'default' | 'large' | 'small'): FlRadialMenuSize => {\r\n if (size === 'large' || size === 'small') {\r\n return size\r\n }\r\n\r\n if (size === 'default') {\r\n return 'medium'\r\n }\r\n\r\n return 'large'\r\n}\r\n\r\nconst warnRadialMenu = (message: string) => {\r\n if (warnedMessages.has(message)) {\r\n return\r\n }\r\n\r\n warnedMessages.add(message)\r\n console.warn(`[FlRadialMenu] ${message}`)\r\n}\r\n\r\nconst flattenSlotVNodes = (children: VNodeArrayChildren): VNode[] => {\r\n const vnodes: VNode[] = []\r\n\r\n for (const child of children) {\r\n if (Array.isArray(child)) {\r\n vnodes.push(...flattenSlotVNodes(child as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n if (!isVNode(child)) {\r\n continue\r\n }\r\n\r\n if (child.type === Fragment && Array.isArray(child.children)) {\r\n vnodes.push(...flattenSlotVNodes(child.children as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n vnodes.push(child)\r\n }\r\n\r\n return vnodes\r\n}\r\n\r\nconst isRadialMenuItemVNode = (vnode: VNode) =>\r\n typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'FlRadialMenuItem'\r\n\r\nconst readBooleanSlotProp = (value: unknown) => value === true || value === ''\r\n\r\nconst readOptionalBooleanSlotProp = (value: unknown) =>\r\n value === undefined ? undefined : readBooleanSlotProp(value)\r\n\r\nconst readSlotItemSlots = (children: VNode['children']) => {\r\n if (!children || Array.isArray(children) || typeof children !== 'object') {\r\n return undefined\r\n }\r\n\r\n return children as Partial<Record<string, Slot>>\r\n}\r\n\r\nconst readSlotItemProps = (vnode: VNode): FlRadialMenuResolvableItem => {\r\n const vnodeProps = (vnode.props ?? {}) as Record<string, unknown>\r\n const vnodeSlots = readSlotItemSlots(vnode.children)\r\n\r\n return {\r\n index: typeof vnodeProps.index === 'string' ? vnodeProps.index : undefined,\r\n label: typeof vnodeProps.label === 'string' ? vnodeProps.label : '',\r\n icon: vnodeProps.icon as Component | undefined,\r\n shortcut: typeof vnodeProps.shortcut === 'string' ? vnodeProps.shortcut : undefined,\r\n disabled: readBooleanSlotProp(vnodeProps.disabled),\r\n hidden: readBooleanSlotProp(vnodeProps.hidden),\r\n divided: readBooleanSlotProp(vnodeProps.divided),\r\n closeOnSelect: readOptionalBooleanSlotProp(vnodeProps.closeOnSelect),\r\n meta:\r\n vnodeProps.meta && typeof vnodeProps.meta === 'object'\r\n ? (vnodeProps.meta as Record<string, unknown>)\r\n : undefined,\r\n iconSlot: vnodeSlots?.icon,\r\n labelSlot: vnodeSlots?.label\r\n }\r\n}\r\n\r\nconst slotItems = computed(() =>\r\n flattenSlotVNodes(slots.default?.() ?? [])\r\n .filter(isRadialMenuItemVNode)\r\n .map(readSlotItemProps)\r\n)\r\nconst resolvedItems = computed(() =>\r\n normalizeRadialMenuItems(slotItems.value.length > 0 ? slotItems.value : props.items, {\r\n warn: warnRadialMenu\r\n })\r\n)\r\nconst splitItems = computed(() => splitRadialMenuItems(resolvedItems.value, props.maxRingItems))\r\nconst ringItems = computed(() => splitItems.value.ringItems)\r\nconst moreItems = computed(() => splitItems.value.moreItems)\r\nconst resolvedSize = computed(() => props.size ?? mapGlobalSize(globalSize.value))\r\nconst sizeGeometry = computed(() => radialMenuGeometryBySize[resolvedSize.value])\r\nconst resolvedRadius = computed(() => sizeGeometry.value.radius)\r\nconst resolvedCenterSize = computed(() => sizeGeometry.value.centerSize)\r\nconst activeItem = computed(() =>\r\n activeRingIndex.value === null ? null : (ringItems.value[activeRingIndex.value] ?? null)\r\n)\r\nconst sectorInnerRadius = computed(() => resolvedCenterSize.value / 2 + 8)\r\nconst sectorPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuSectorPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n innerRadius: sectorInnerRadius.value,\r\n outerRadius: resolvedRadius.value\r\n })\r\n})\r\nconst activeTrackPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuTrackArcPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n radius: resolvedRadius.value,\r\n innerRadius: sectorInnerRadius.value\r\n })\r\n})\r\n\r\nconst { opened, floatingX, floatingY, open, close, toggle } = useRadialMenuState({\r\n modelValue: toRef(props, 'modelValue'),\r\n disabled: toRef(props, 'disabled'),\r\n emitUpdate: (nextOpened) => emit('update:modelValue', nextOpened)\r\n})\r\n\r\nuseRadialMenuShortcut({\r\n shortcut: toRef(props, 'shortcut'),\r\n enabled: computed(() => props.shortcutEnabled && Boolean(props.shortcut)),\r\n open\r\n})\r\n\r\nconst rootClass = computed(() => [\r\n ns.b(),\r\n ns.m(props.mode),\r\n ns.m(resolvedSize.value),\r\n ns.m(`item-${props.itemType}`),\r\n ns.is('opened', opened.value),\r\n ns.is('entering', isEntryAnimating.value),\r\n ns.is('disabled', props.disabled)\r\n])\r\n\r\nconst rootStyle = computed(() => ({\r\n '--fl-radial-menu-floating-x': `${floatingX.value ?? (typeof window === 'undefined' ? 0 : window.innerWidth / 2)}px`,\r\n '--fl-radial-menu-floating-y': `${floatingY.value ?? (typeof window === 'undefined' ? 0 : window.innerHeight / 2)}px`,\r\n '--fl-radial-menu-z-index': String(props.zIndex),\r\n '--fl-radial-menu-more-enter-delay': `${radialMenuEntryTrackDelay + Math.max(ringItems.value.length - 1, 0) * radialMenuEntryItemStagger}ms`\r\n}))\r\n\r\nconst getItemIcon = (item: FlRadialMenuResolvedItem) => item.iconSlot ?? item.icon\r\nconst RadialMenuItemLabel = ({ item }: { item: FlRadialMenuResolvedItem }) =>\r\n item.labelSlot?.() ?? item.label\r\n\r\nconst getItemLayout = (index: number) =>\r\n getRadialMenuItemLayout({\r\n count: ringItems.value.length,\r\n index,\r\n radius: resolvedRadius.value\r\n })\r\n\r\nconst formatEntryCoordinate = (value: number) => {\r\n const rounded = Math.abs(value) < 0.001 ? 0 : Number(value.toFixed(3))\r\n\r\n return `${rounded}px`\r\n}\r\n\r\nconst getEntryTransform = (x: number, y: number, scale = 1) =>\r\n `translate(calc(-50% + ${formatEntryCoordinate(x)}), calc(-50% + ${formatEntryCoordinate(y)})) scale(${scale})`\r\n\r\nconst prefersReducedMotion = () =>\r\n typeof window !== 'undefined' &&\r\n typeof window.matchMedia === 'function' &&\r\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n\r\nconst canUseWebAnimations = () =>\r\n typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.animate === 'function'\r\n\r\nconst canAnimateElement = (element: HTMLElement) => typeof element.animate === 'function'\r\n\r\nconst getItemStyle = (index: number) => {\r\n const layout = getItemLayout(index)\r\n\r\n return {\r\n '--fl-radial-menu-item-x': `${layout.x}px`,\r\n '--fl-radial-menu-item-y': `${layout.y}px`,\r\n '--fl-radial-menu-item-index': String(index)\r\n }\r\n}\r\n\r\nconst getItemLabelClass = (index: number) => {\r\n const placement = getRadialMenuTipPlacement(getItemLayout(index))\r\n\r\n return [\r\n ns.e('item-label'),\r\n ns.em('item-label', `tip-${placement}`),\r\n moreItems.value.length > 0 && placement === 'bottom'\r\n ? ns.em('item-label', 'hidden-by-more')\r\n : ''\r\n ]\r\n}\r\n\r\nconst moreLabel = computed(() => {\r\n if (props.moreMode === 'ellipsis') {\r\n return '...'\r\n }\r\n\r\n if (props.moreMode === 'text') {\r\n return props.moreText\r\n }\r\n\r\n return `${props.moreText} ...`\r\n})\r\n\r\nconst setActiveRingIndex = (index: number | null) => {\r\n activeRingIndex.value = index\r\n emit('active-change', activeItem.value)\r\n}\r\n\r\nconst setRingButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n ringButtonRefs.value[index] = element\r\n } else {\r\n delete ringButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n moreButtonRefs.value[index] = element\r\n } else {\r\n delete moreButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreOpened = (nextOpened: boolean) => {\r\n moreOpened.value = nextOpened\r\n if (nextOpened) {\r\n emit('more-open')\r\n } else {\r\n emit('more-close')\r\n }\r\n}\r\n\r\nlet isDocumentPointerdownBound = false\r\n\r\nconst removeDocumentPointerdown = () => {\r\n if (!isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = false\r\n}\r\n\r\nconst addDocumentPointerdown = () => {\r\n if (isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.addEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = true\r\n}\r\n\r\nconst handleDocumentPointerdown = (event: PointerEvent) => {\r\n const { target } = event\r\n\r\n if (!(target instanceof Node)) {\r\n return\r\n }\r\n\r\n if (rootRef.value?.contains(target)) {\r\n return\r\n }\r\n\r\n moreOpened.value = false\r\n close('click-outside')\r\n}\r\n\r\nconst activateItem = (\r\n item: FlRadialMenuResolvedItem,\r\n source: 'ring' | 'more',\r\n index: number,\r\n event: MouseEvent | KeyboardEvent\r\n) => {\r\n if (item.disabled) {\r\n return\r\n }\r\n\r\n emit('select', item.index, [item.index], item, { source, index, event })\r\n\r\n const shouldClose = item.closeOnSelect ?? props.closeOnSelect\r\n if (shouldClose) {\r\n moreOpened.value = false\r\n close('select')\r\n }\r\n}\r\n\r\nconst activateKeyboardItem = (event: KeyboardEvent) => {\r\n const target = event.currentTarget\r\n if (!(target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n target.click()\r\n}\r\n\r\nconst { focusFirstAvailableRingItem, handleMenuKeydown, handleRingKeydown, handleMoreKeydown } =\r\n useRadialMenuKeyboard({\r\n ringItems,\r\n moreItems,\r\n ringRefs: ringButtonRefs,\r\n moreRefs: moreButtonRefs,\r\n closeMenu: () => close('escape'),\r\n closeMore: () => {\r\n moreOpened.value = false\r\n },\r\n activateFocused: activateKeyboardItem\r\n })\r\n\r\nlet entryAnimations: Animation[] = []\r\nlet entryAnimationToken = 0\r\nlet entryFinishTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst clearEntryFinishTimer = () => {\r\n if (entryFinishTimer === undefined) {\r\n return\r\n }\r\n\r\n clearTimeout(entryFinishTimer)\r\n entryFinishTimer = undefined\r\n}\r\n\r\nconst cancelEntryAnimations = () => {\r\n entryAnimationToken += 1\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst finishEntryAnimations = (token: number) => {\r\n if (token !== entryAnimationToken) {\r\n return\r\n }\r\n\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst getEntryOrderByIndex = () => {\r\n const layouts = ringItems.value.map((_, index) => getItemLayout(index))\r\n const entryOrder = getRadialMenuClockwiseEntryOrder(layouts, {\r\n startAngle: radialMenuEntryStartAngle\r\n })\r\n\r\n return new Map(entryOrder.map((itemIndex, orderIndex) => [itemIndex, orderIndex]))\r\n}\r\n\r\nconst getRingItemEntryDistance = (index: number) =>\r\n normalizeRadialMenuAngle(getItemLayout(index).angle - radialMenuEntryStartAngle)\r\n\r\nconst getRingItemEntryDuration = (index: number) => {\r\n const distanceRatio = Math.min(getRingItemEntryDistance(index), 360) / 360\r\n\r\n return (\r\n radialMenuEntryItemMinDuration +\r\n (radialMenuEntryItemMaxDuration - radialMenuEntryItemMinDuration) * distanceRatio\r\n )\r\n}\r\n\r\nconst getRingItemEntryKeyframes = (index: number): RadialMenuEntryKeyframe[] => {\r\n const layout = getItemLayout(index)\r\n const finalOpacity = ringItems.value[index]?.disabled ? 0.5 : 1\r\n const points = getRadialMenuClockwiseArcPoints({\r\n radius: resolvedRadius.value,\r\n startAngle: radialMenuEntryStartAngle,\r\n targetAngle: layout.angle,\r\n steps: radialMenuEntryArcSteps\r\n })\r\n\r\n return points.map((point, pointIndex) => ({\r\n offset: pointIndex / (points.length - 1),\r\n opacity: pointIndex === 0 ? 0 : finalOpacity,\r\n transform: getEntryTransform(point.x, point.y, pointIndex === 0 ? 0.86 : 1)\r\n }))\r\n}\r\n\r\nconst playEntryAnimations = () => {\r\n if (prefersReducedMotion() || ringItems.value.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n const ringButtons = ringButtonRefs.value.slice(0, ringItems.value.length)\r\n const entryOrderByIndex = getEntryOrderByIndex()\r\n const animations: Animation[] = []\r\n let maxEntryEndTime = 0\r\n\r\n ringButtons.forEach((button, index) => {\r\n if (!button || !canAnimateElement(button)) {\r\n return\r\n }\r\n\r\n const orderIndex = entryOrderByIndex.get(index) ?? index\r\n const delay = radialMenuEntryTrackDelay + orderIndex * radialMenuEntryItemStagger\r\n const duration = getRingItemEntryDuration(index)\r\n const animation = button.animate(getRingItemEntryKeyframes(index), {\r\n delay,\r\n duration,\r\n easing: radialMenuEntryEasing,\r\n fill: 'both'\r\n })\r\n\r\n maxEntryEndTime = Math.max(maxEntryEndTime, delay + duration)\r\n animations.push(animation)\r\n })\r\n\r\n if (animations.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n entryAnimationToken += 1\r\n const token = entryAnimationToken\r\n\r\n entryAnimations = animations\r\n isEntryAnimating.value = true\r\n entryFinishTimer = setTimeout(() => finishEntryAnimations(token), Math.ceil(maxEntryEndTime) + 40)\r\n}\r\n\r\nwatch(opened, async (nextOpened) => {\r\n cancelEntryAnimations()\r\n\r\n if (!nextOpened) {\r\n return\r\n }\r\n\r\n isEntryAnimating.value =\r\n canUseWebAnimations() && !prefersReducedMotion() && ringItems.value.length > 0\r\n\r\n await nextTick()\r\n if (!opened.value) {\r\n return\r\n }\r\n\r\n playEntryAnimations()\r\n focusFirstAvailableRingItem()\r\n})\r\n\r\nwatch(\r\n opened,\r\n (nextOpened) => {\r\n if (nextOpened) {\r\n addDocumentPointerdown()\r\n } else {\r\n removeDocumentPointerdown()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n removeDocumentPointerdown()\r\n cancelEntryAnimations()\r\n})\r\n\r\nconst handleCenterClick = () => {\r\n if (props.disabled || props.trigger !== 'click') {\r\n return\r\n }\r\n\r\n toggle({ reason: 'click' })\r\n}\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.disabled || props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n open({ reason: 'hover' })\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n close('hover-leave')\r\n}\r\n\r\nconst focus = () => {\r\n centerRef.value?.focus()\r\n}\r\n\r\ndefineExpose<FlRadialMenuExpose>({\r\n open: (options?: FlRadialMenuOpenOptions) => open(options),\r\n close,\r\n toggle,\r\n focus\r\n})\r\n</script>\r\n","import type { Component, ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flRadialMenuItemProps = {\r\n index: {\r\n type: String,\r\n required: true\r\n },\r\n label: {\r\n type: String,\r\n required: true\r\n },\r\n icon: {\r\n type: [Object, Function] as PropType<Component>,\r\n default: undefined\r\n },\r\n shortcut: {\r\n type: String,\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n hidden: {\r\n type: Boolean,\r\n default: false\r\n },\r\n divided: {\r\n type: Boolean,\r\n default: false\r\n },\r\n closeOnSelect: {\r\n type: Boolean as PropType<boolean | undefined>,\r\n default: undefined\r\n },\r\n meta: {\r\n type: Object as PropType<Record<string, unknown>>,\r\n default: undefined\r\n }\r\n} as const\r\n\r\nexport type FlRadialMenuItemProps = ExtractPublicPropTypes<typeof flRadialMenuItemProps>\r\n","<template>\r\n <span v-if=\"false\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { flRadialMenuItemProps } from './radial-menu-item'\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenuItem'\r\n})\r\n\r\ndefineProps(flRadialMenuItemProps)\r\ndefineSlots<{\r\n icon?: () => unknown\r\n label?: () => unknown\r\n}>()\r\n</script>\r\n","<template>\r\n <span v-if=\"false\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { flRadialMenuItemProps } from './radial-menu-item'\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenuItem'\r\n})\r\n\r\ndefineProps(flRadialMenuItemProps)\r\ndefineSlots<{\r\n icon?: () => unknown\r\n label?: () => unknown\r\n}>()\r\n</script>\r\n","import RadialMenu from './src/radial-menu.vue'\r\nimport RadialMenuItem from './src/radial-menu-item.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlRadialMenu = withInstall(RadialMenu as typeof RadialMenu & { name: string })\r\nexport const FlRadialMenuItem = withInstall(\r\n RadialMenuItem as typeof RadialMenuItem & { name: string }\r\n)\r\n\r\nexport default FlRadialMenu\r\n\r\nexport type {\r\n FlRadialMenuCloseReason,\r\n FlRadialMenuDropdownPlacement,\r\n FlRadialMenuEmits,\r\n FlRadialMenuExpose,\r\n FlRadialMenuItemData,\r\n FlRadialMenuItemType,\r\n FlRadialMenuMode,\r\n FlRadialMenuMoreMode,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuOpenReason,\r\n FlRadialMenuProps,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSelectContext,\r\n FlRadialMenuSize,\r\n FlRadialMenuTrigger,\r\n RadialMenuEmits,\r\n RadialMenuProps\r\n} from './src/radial-menu'\r\n","/**!\n * Sortable 1.15.7\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar version = \"1.15.7\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n var el = this.el;\n savedInputChecked.forEach(function (checkEl) {\n if (el.contains(checkEl)) {\n checkEl.checked = true;\n }\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type RowData = Record<string, unknown>\r\n\r\nexport type EmitTrigger = 'row-click' | 'selection-change' | 'proxy-set'\r\n\r\nexport interface SelectionRowToggleEvent {\r\n row: RowData\r\n rowIndex: number\r\n selected: boolean\r\n selectionBefore: RowData[]\r\n selectionAfter: RowData[]\r\n trigger: Exclude<EmitTrigger, 'proxy-set'>\r\n}\r\n\r\nexport interface SelectionSingleConflictEvent {\r\n reason: 'multiple-selected' | 'select-all-disabled'\r\n selection: RowData[]\r\n}\r\n\r\nexport interface CellChangeEvent {\r\n rowIndex: number\r\n rowKey: string | number\r\n columnKey: string\r\n path: string\r\n prevValue: unknown\r\n nextValue: unknown\r\n trigger: 'proxy-set'\r\n}\r\n\r\nexport interface RowDragEvent {\r\n oldIndex: number | null\r\n newIndex: number | null\r\n row: RowData | null\r\n}\r\n\r\nexport interface RowOrderChangeEvent {\r\n oldIndex: number\r\n newIndex: number\r\n row: RowData\r\n data: RowData[]\r\n}\r\n\r\nexport interface ColumnDragEvent {\r\n oldIndex: number | null\r\n newIndex: number | null\r\n columnIndex: number | null\r\n}\r\n\r\nexport interface ColumnOrderChangeEvent {\r\n oldIndex: number\r\n newIndex: number\r\n columnIndex: number\r\n order: number[]\r\n}\r\n\r\nexport interface FlTableExpose {\r\n clearSelection: () => void\r\n getSelectionRows: () => RowData[]\r\n toggleRowSelection: (row: RowData, selected?: boolean, ignoreSelectable?: boolean) => void\r\n toggleAllSelection: () => void\r\n toggleRowExpansion: (row: RowData, expanded?: boolean) => void\r\n setCurrentRow: (row?: RowData) => void\r\n clearSort: () => void\r\n clearFilter: (columnKeys?: string | string[]) => void\r\n doLayout: () => void\r\n sort: (prop: string, order: 'ascending' | 'descending' | null) => void\r\n scrollTo: {\r\n (options: ScrollToOptions): void\r\n (xCoord: number, yCoord?: number): void\r\n }\r\n setScrollTop: (top: number) => void\r\n setScrollLeft: (left: number) => void\r\n}\r\n\r\nexport const tableProps = {\r\n /**\r\n * Enable row click to toggle selection when selection column exists.\r\n */\r\n selectionRowClick: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Restrict selection to one row in selection-table mode.\r\n */\r\n selectionSingle: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Enable editable cell mode with proxy intercept for row field assignments.\r\n */\r\n isEdit: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Maximum proxy depth for nested row fields.\r\n */\r\n cellProxyMaxDepth: {\r\n type: Number,\r\n default: 4,\r\n validator: (value: number) => Number.isInteger(value) && value >= 1\r\n },\r\n /**\r\n * Extend clicked data cells with row and column cross highlight.\r\n */\r\n crossHighlight: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Enable row drag sorting.\r\n */\r\n rowDraggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Enable column drag sorting.\r\n */\r\n columnDraggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Which column index should act as row drag handle.\r\n */\r\n rowDragHandleColumnIndex: {\r\n type: Number,\r\n default: 0,\r\n validator: (value: number) => Number.isInteger(value) && value >= 0\r\n },\r\n /**\r\n * Field name used as row key in emitted payload.\r\n */\r\n rowKeyField: {\r\n type: String,\r\n default: 'id'\r\n },\r\n /**\r\n * Bound data source. Falls through to ElTable `data`.\r\n */\r\n data: {\r\n type: Array as PropType<RowData[]>,\r\n default: () => []\r\n }\r\n} as const\r\n\r\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\r\n value !== null && typeof value === 'object'\r\n\r\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\r\n\r\nexport const tableEmits = {\r\n /**\r\n * Emit when row click triggers selection toggle.\r\n */\r\n 'selection-row-toggle': (payload: SelectionRowToggleEvent) =>\r\n isRecord(payload) &&\r\n isRecord(payload.row) &&\r\n isNumber(payload.rowIndex) &&\r\n typeof payload.selected === 'boolean' &&\r\n Array.isArray(payload.selectionBefore) &&\r\n Array.isArray(payload.selectionAfter) &&\r\n (payload.trigger === 'row-click' || payload.trigger === 'selection-change'),\r\n /**\r\n * Emit when single-selection rule conflicts with native selection behavior.\r\n */\r\n 'selection-single-conflict': (payload: SelectionSingleConflictEvent) =>\r\n isRecord(payload) &&\r\n (payload.reason === 'multiple-selected' || payload.reason === 'select-all-disabled') &&\r\n Array.isArray(payload.selection),\r\n /**\r\n * Emit when proxy-tracked row field value is changed.\r\n */\r\n 'cell-change': (payload: CellChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.rowIndex) &&\r\n (typeof payload.rowKey === 'string' || typeof payload.rowKey === 'number') &&\r\n typeof payload.columnKey === 'string' &&\r\n typeof payload.path === 'string' &&\r\n payload.trigger === 'proxy-set',\r\n /**\r\n * Emit when row drag starts.\r\n */\r\n 'row-drag-start': (payload: RowDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)),\r\n /**\r\n * Emit when row drag ends.\r\n */\r\n 'row-drag-end': (payload: RowDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)),\r\n /**\r\n * Emit when row order has changed.\r\n */\r\n 'row-order-change': (payload: RowOrderChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.oldIndex) &&\r\n isNumber(payload.newIndex) &&\r\n isRecord(payload.row) &&\r\n Array.isArray(payload.data),\r\n /**\r\n * Emit when column drag starts.\r\n */\r\n 'column-drag-start': (payload: ColumnDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)) &&\r\n (payload.columnIndex === null || isNumber(payload.columnIndex)),\r\n /**\r\n * Emit when column drag ends.\r\n */\r\n 'column-drag-end': (payload: ColumnDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)) &&\r\n (payload.columnIndex === null || isNumber(payload.columnIndex)),\r\n /**\r\n * Emit when column order has changed.\r\n */\r\n 'column-order-change': (payload: ColumnOrderChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.oldIndex) &&\r\n isNumber(payload.newIndex) &&\r\n isNumber(payload.columnIndex) &&\r\n Array.isArray(payload.order)\r\n} as const\r\n\r\nexport type TableProps = ExtractPublicPropTypes<typeof tableProps>\r\nexport type TableEmits = typeof tableEmits\r\nexport type TableExpose = FlTableExpose\r\n","import type { CellChangeEvent, RowData } from './table'\r\n\r\ntype ProxyRuntime = {\r\n onCellChange: (payload: CellChangeEvent) => void\r\n resolveRowIndex: (row: RowData) => number\r\n rowKeyField: string\r\n maxDepth: number\r\n}\r\n\r\ntype BuildProxyDataOptions = {\r\n data: RowData[]\r\n onCellChange: (payload: CellChangeEvent) => void\r\n resolveRowIndex: (row: RowData) => number\r\n rowKeyField: string\r\n maxDepth: number\r\n}\r\n\r\ntype PathAwareCache = WeakMap<object, Map<string, unknown>>\r\n\r\nconst isObjectLike = (value: unknown): value is Record<PropertyKey, unknown> =>\r\n value !== null && typeof value === 'object'\r\n\r\nconst composePath = (base: string, key: PropertyKey) => {\r\n const keyText = typeof key === 'symbol' ? '' : String(key)\r\n if (!keyText) {\r\n return base\r\n }\r\n\r\n return base ? `${base}.${keyText}` : keyText\r\n}\r\n\r\nconst resolveRowKey = (row: RowData, rowIndex: number, rowKeyField: string): string | number => {\r\n const candidate = row[rowKeyField]\r\n if (typeof candidate === 'string' || typeof candidate === 'number') {\r\n return candidate\r\n }\r\n\r\n return rowIndex\r\n}\r\n\r\nconst resolveColumnKey = (path: string): string => {\r\n if (!path) {\r\n return ''\r\n }\r\n\r\n const [first] = path.split('.')\r\n return first || path\r\n}\r\n\r\nexport const createTableProxyDataBuilder = () => {\r\n const cache: PathAwareCache = new WeakMap()\r\n\r\n const runtime: ProxyRuntime = {\r\n onCellChange: () => undefined,\r\n resolveRowIndex: () => -1,\r\n rowKeyField: 'id',\r\n maxDepth: 4\r\n }\r\n\r\n const getCachedProxy = (target: object, path: string) => cache.get(target)?.get(path)\r\n\r\n const setCachedProxy = (target: object, path: string, proxy: unknown) => {\r\n if (!cache.has(target)) {\r\n cache.set(target, new Map())\r\n }\r\n\r\n cache.get(target)?.set(path, proxy)\r\n }\r\n\r\n const toNullableRow = (value: unknown): RowData | null => {\r\n if (!isObjectLike(value)) {\r\n return null\r\n }\r\n\r\n return value as RowData\r\n }\r\n\r\n const createProxy = (\r\n target: Record<PropertyKey, unknown>,\r\n rootRow: RowData,\r\n path: string,\r\n depth: number\r\n ): unknown => {\r\n const cached = getCachedProxy(target, path)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(currentTarget, key) {\r\n const value = Reflect.get(currentTarget, key)\r\n\r\n if (!isObjectLike(value)) {\r\n return value\r\n }\r\n\r\n if (depth >= runtime.maxDepth) {\r\n return value\r\n }\r\n\r\n const nextPath = composePath(path, key)\r\n return createProxy(value, rootRow, nextPath, depth + 1)\r\n },\r\n set(currentTarget, key, value) {\r\n const previousValue = Reflect.get(currentTarget, key)\r\n const result = Reflect.set(currentTarget, key, value)\r\n\r\n if (!result || typeof key === 'symbol' || Object.is(previousValue, value)) {\r\n return result\r\n }\r\n\r\n const nextPath = composePath(path, key)\r\n const rowIndex = runtime.resolveRowIndex(rootRow)\r\n\r\n runtime.onCellChange({\r\n rowIndex,\r\n rowKey: resolveRowKey(rootRow, rowIndex, runtime.rowKeyField),\r\n columnKey: resolveColumnKey(nextPath),\r\n path: nextPath,\r\n prevValue: previousValue,\r\n nextValue: value,\r\n trigger: 'proxy-set'\r\n })\r\n\r\n return result\r\n }\r\n })\r\n\r\n setCachedProxy(target, path, proxy)\r\n return proxy\r\n }\r\n\r\n return ({\r\n data,\r\n onCellChange,\r\n resolveRowIndex,\r\n rowKeyField,\r\n maxDepth\r\n }: BuildProxyDataOptions) => {\r\n runtime.onCellChange = onCellChange\r\n runtime.resolveRowIndex = resolveRowIndex\r\n runtime.rowKeyField = rowKeyField\r\n runtime.maxDepth = maxDepth\r\n\r\n return data.map((row) => {\r\n const rawRow = toNullableRow(row)\r\n if (!rawRow) {\r\n return row\r\n }\r\n\r\n return createProxy(rawRow, rawRow, '', 0) as RowData\r\n })\r\n }\r\n}\r\n","import type { ComponentPublicInstance } from 'vue'\r\n\r\nexport type TableEditorMode = 'text' | 'controlled'\r\n\r\nexport type TableEditorTarget = ComponentPublicInstance | HTMLElement | null\r\n\r\nexport type TableEditorEndpoint = {\r\n id: symbol\r\n getRootEl: () => HTMLElement | null\r\n focus: () => void | Promise<void>\r\n blur: () => void | Promise<void>\r\n handoffFirstKey: (event: KeyboardEvent) => Promise<boolean>\r\n isPanelOpen?: () => boolean\r\n open?: () => void | Promise<void>\r\n close?: () => void | Promise<void>\r\n isFixedClone?: boolean\r\n priority?: number\r\n}\r\n\r\nexport type TableEditorRegistry = {\r\n register: (endpoint: TableEditorEndpoint) => () => void\r\n getEditors: () => TableEditorEndpoint[]\r\n getEditorsInCells: (cells: HTMLElement[]) => TableEditorEndpoint[]\r\n invalidate: () => void\r\n refresh: () => void\r\n}\r\n\r\nexport const tableEditorRegistryDomKey = Symbol('fl-table-editor-registry')\r\n\r\ntype EditorRecord = {\r\n endpoint: TableEditorEndpoint\r\n cell: HTMLElement | null\r\n}\r\n\r\nconst resolveEditorCell = (endpoint: TableEditorEndpoint): HTMLElement | null => {\r\n const cell = endpoint.getRootEl()?.closest('td.el-table__cell')\r\n return cell instanceof HTMLElement ? cell : null\r\n}\r\n\r\nexport const createTableEditorRegistry = (): TableEditorRegistry => {\r\n const records = new Map<symbol, EditorRecord>()\r\n const unindexedIds = new Set<symbol>()\r\n let idsByCell = new WeakMap<HTMLElement, Set<symbol>>()\r\n let isIndexDirty = false\r\n\r\n const detachRecord = (record: EditorRecord) => {\r\n if (!record.cell) {\r\n unindexedIds.delete(record.endpoint.id)\r\n return\r\n }\r\n\r\n const ids = idsByCell.get(record.cell)\r\n ids?.delete(record.endpoint.id)\r\n if (ids?.size === 0) {\r\n idsByCell.delete(record.cell)\r\n }\r\n record.cell = null\r\n }\r\n\r\n const indexRecord = (record: EditorRecord) => {\r\n detachRecord(record)\r\n const cell = resolveEditorCell(record.endpoint)\r\n record.cell = cell\r\n\r\n if (!cell) {\r\n unindexedIds.add(record.endpoint.id)\r\n return\r\n }\r\n\r\n const ids = idsByCell.get(cell) ?? new Set<symbol>()\r\n ids.add(record.endpoint.id)\r\n idsByCell.set(cell, ids)\r\n }\r\n\r\n const refresh = () => {\r\n idsByCell = new WeakMap<HTMLElement, Set<symbol>>()\r\n unindexedIds.clear()\r\n for (const record of records.values()) {\r\n record.cell = null\r\n indexRecord(record)\r\n }\r\n isIndexDirty = false\r\n }\r\n\r\n const refreshUnindexed = () => {\r\n for (const id of [...unindexedIds]) {\r\n const record = records.get(id)\r\n if (record) {\r\n indexRecord(record)\r\n } else {\r\n unindexedIds.delete(id)\r\n }\r\n }\r\n }\r\n\r\n return {\r\n register(endpoint) {\r\n const previous = records.get(endpoint.id)\r\n if (previous) {\r\n detachRecord(previous)\r\n }\r\n\r\n const record: EditorRecord = { endpoint, cell: null }\r\n records.set(endpoint.id, record)\r\n indexRecord(record)\r\n\r\n return () => {\r\n const current = records.get(endpoint.id)\r\n if (current?.endpoint !== endpoint) {\r\n return\r\n }\r\n\r\n detachRecord(current)\r\n records.delete(endpoint.id)\r\n }\r\n },\r\n getEditors: () => [...records.values()].map((record) => record.endpoint),\r\n getEditorsInCells(cells) {\r\n if (cells.length === 0) {\r\n return []\r\n }\r\n if (isIndexDirty) {\r\n refresh()\r\n } else if (unindexedIds.size > 0) {\r\n refreshUnindexed()\r\n }\r\n\r\n const cellSet = new Set(cells)\r\n const candidateIds = new Set<symbol>()\r\n for (const cell of cells) {\r\n for (const id of idsByCell.get(cell) ?? []) {\r\n candidateIds.add(id)\r\n }\r\n }\r\n\r\n const candidates: TableEditorEndpoint[] = []\r\n for (const id of candidateIds) {\r\n const record = records.get(id)\r\n if (!record) {\r\n continue\r\n }\r\n\r\n const root = record.endpoint.getRootEl()\r\n if (root && cells.some((cell) => cell.contains(root))) {\r\n candidates.push(record.endpoint)\r\n continue\r\n }\r\n\r\n indexRecord(record)\r\n if (record.cell && cellSet.has(record.cell)) {\r\n candidates.push(record.endpoint)\r\n }\r\n }\r\n\r\n return candidates\r\n },\r\n invalidate: () => {\r\n isIndexDirty = true\r\n },\r\n refresh\r\n }\r\n}\r\n","<template>\r\n <component :is=\"h(ElTable, { ...mergedTableAttrs, ref: setTableRef }, tableSlots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport Sortable from 'sortablejs'\r\nimport type { SortableEvent } from 'sortablejs'\r\nimport { ElTable } from 'element-plus'\r\nimport type { VNode } from 'vue'\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n cloneVNode,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n shallowRef,\r\n useAttrs,\r\n useSlots,\r\n h,\r\n watch\r\n} from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type {\r\n CellChangeEvent,\r\n ColumnDragEvent,\r\n ColumnOrderChangeEvent,\r\n FlTableExpose,\r\n RowData,\r\n RowDragEvent,\r\n RowOrderChangeEvent,\r\n SelectionRowToggleEvent\r\n} from './table'\r\nimport { tableEmits, tableProps } from './table'\r\nimport { createTableProxyDataBuilder } from './proxy-data'\r\nimport type { TableEditorEndpoint, TableEditorRegistry } from './editor-registry'\r\nimport { createTableEditorRegistry, tableEditorRegistryDomKey } from './editor-registry'\r\n\r\ndefineOptions({\r\n name: 'FlTable',\r\n inheritAttrs: false\r\n})\r\n\r\ntype CellClassNameScope = {\r\n row: RowData\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype HeaderCellClassNameScope = {\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype ColumnState = {\r\n type?: string\r\n columnKey?: string\r\n rawColumnKey?: string\r\n}\r\n\r\ntype ActiveCell = {\r\n rowKey: string | number\r\n columnKey: string\r\n}\r\n\r\ntype ClientPoint = {\r\n x: number\r\n y: number\r\n}\r\n\r\ntype ColumnDragIndicatorSide = 'left' | 'right'\r\n\r\ntype ColumnDropState = {\r\n dropDisplayIndex: number\r\n targetDisplayIndex: number\r\n side: ColumnDragIndicatorSide\r\n}\r\n\r\ntype DirectionKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight'\r\n\r\ntype VisibleColumnEntry = {\r\n displayIndex: number\r\n columnKey: string\r\n column: ColumnState\r\n}\r\n\r\ntype ActiveCellPosition = {\r\n rowIndex: number\r\n row: RowData\r\n column: VisibleColumnEntry\r\n columns: VisibleColumnEntry[]\r\n}\r\n\r\nconst COLUMN_RESIZE_HOTZONE_PX = 8\r\nconst ROW_DRAG_HANDLE_HOTZONE_PX = 24\r\nconst CONTROL_COLUMN_TYPES = new Set(['selection', 'index', 'expand'])\r\n\r\nconst props = defineProps(tableProps)\r\nconst emit = defineEmits(tableEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('table')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst tableRef = shallowRef<FlTableExpose | null>(null)\r\nconst rowSortable = shallowRef<Sortable | null>(null)\r\nconst columnSortable = shallowRef<Sortable | null>(null)\r\nconst columnOrder = ref<number[]>([])\r\nconst columnDragCount = ref<number | null>(null)\r\nconst visibleColumnCount = ref<number>(0)\r\nconst draggingColumnOldDisplayIndex = ref<number | null>(null)\r\nconst pendingColumnDropDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorSide = ref<ColumnDragIndicatorSide | null>(null)\r\nconst isColumnDragging = ref<boolean>(false)\r\nconst columnDragPointerMoveListener = ref<((event: Event) => void) | null>(null)\r\nconst isColumnResizeGesture = ref<boolean>(false)\r\nconst columnResizeGuardHeaderRow = shallowRef<HTMLElement | null>(null)\r\nconst columnResizePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst columnResizePointerUpListener = ref<((event: Event) => void) | null>(null)\r\nconst activeCell = ref<ActiveCell | null>(null)\r\nconst isEditing = ref(false)\r\nconst outsidePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst keyboardListener = ref<((event: KeyboardEvent) => void) | null>(null)\r\nconst editorFocusInListener = ref<((event: FocusEvent) => void) | null>(null)\r\nconst buildProxyData = createTableProxyDataBuilder()\r\nconst editorRegistry = createTableEditorRegistry()\r\n\r\nlet activeCellClassSnapshot: ActiveCell | null = null\r\nlet renderedActiveCell: ActiveCell | null = null\r\nlet renderedCrossHighlight = props.crossHighlight\r\nlet activeCellClassSyncVersion = 0\r\nlet shouldResetActiveCellClasses = false\r\n\r\nconst { changeRef } = useMergedExpose({})\r\n\r\nconst setTableRef = (instance: unknown) => {\r\n tableRef.value = instance as FlTableExpose | null\r\n changeRef(instance)\r\n}\r\n\r\nconst flattenSlotNodes = (nodes: unknown): VNode[] => {\r\n const flatNodes: VNode[] = []\r\n const list = Array.isArray(nodes) ? nodes : []\r\n\r\n const visit = (node: unknown) => {\r\n if (!isVNode(node)) {\r\n return\r\n }\r\n\r\n if (node.type === Comment || node.type === Text) {\r\n return\r\n }\r\n\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n visit(child)\r\n }\r\n return\r\n }\r\n\r\n flatNodes.push(node)\r\n }\r\n\r\n for (const node of list) {\r\n visit(node)\r\n }\r\n\r\n return flatNodes\r\n}\r\n\r\nconst getInternalColumnKey = (sourceIndex: number) => `column-${sourceIndex}`\r\n\r\nconst createColumnOrder = (count: number): number[] =>\r\n Array.from({ length: count }, (_, index) => index)\r\n\r\nconst resolveColumnOrder = (\r\n count: number,\r\n currentOrder: number[] = columnOrder.value\r\n): number[] => {\r\n if (\r\n count <= 0 ||\r\n currentOrder.length !== count ||\r\n new Set(currentOrder).size !== count ||\r\n currentOrder.some((index) => index < 0 || index >= count)\r\n ) {\r\n return createColumnOrder(count)\r\n }\r\n\r\n return currentOrder\r\n}\r\n\r\nconst reorderColumnOrder = (order: number[], oldIndex: number, newIndex: number): number[] => {\r\n if (oldIndex === newIndex) {\r\n return [...order]\r\n }\r\n\r\n const nextOrder = [...order]\r\n const [moved] = nextOrder.splice(oldIndex, 1)\r\n if (moved === undefined) {\r\n return [...order]\r\n }\r\n\r\n nextOrder.splice(newIndex, 0, moved)\r\n return nextOrder\r\n}\r\n\r\nconst tableSlots = computed(() => {\r\n const orderSnapshot = columnOrder.value\r\n const userDefaultSlot = slots.default\r\n\r\n if (!userDefaultSlot) {\r\n return slots\r\n }\r\n\r\n return {\r\n ...slots,\r\n default: (...args: unknown[]) => {\r\n const rawNodes = userDefaultSlot(...args)\r\n const columnNodes = flattenSlotNodes(rawNodes)\r\n if (columnNodes.length === 0) {\r\n return rawNodes\r\n }\r\n\r\n const activeOrder = resolveColumnOrder(columnNodes.length, orderSnapshot)\r\n return activeOrder\r\n .map((sourceIndex) => {\r\n const node = columnNodes[sourceIndex]\r\n if (!node) {\r\n return null\r\n }\r\n\r\n return cloneVNode(node, {\r\n key: node.key ?? `fl-table-column-${sourceIndex}`,\r\n columnKey: getInternalColumnKey(sourceIndex)\r\n })\r\n })\r\n .filter((node): node is VNode => node !== null)\r\n }\r\n }\r\n})\r\n\r\nconst controlledAttrKeys = [\r\n 'class',\r\n 'data',\r\n 'border',\r\n 'stripe',\r\n 'highlightCurrentRow',\r\n 'highlight-current-row',\r\n 'headerRowClassName',\r\n 'header-row-class-name',\r\n 'cellClassName',\r\n 'cell-class-name',\r\n 'headerCellClassName',\r\n 'header-cell-class-name',\r\n 'onCellClick',\r\n 'onCell-click',\r\n 'onRowClick',\r\n 'onSelect',\r\n 'onSelectAll'\r\n]\r\n\r\nconst readAttr = <T = unknown,>(...keys: string[]): T | undefined => {\r\n for (const key of keys) {\r\n if (key in rawAttrs) {\r\n return rawAttrs[key] as T\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nconst normalizeClass = (value: unknown): string[] => {\r\n if (!value) {\r\n return []\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.flatMap((item) => normalizeClass(item))\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value as Record<string, unknown>)\r\n .filter(([, enabled]) => Boolean(enabled))\r\n .map(([name]) => name)\r\n }\r\n\r\n return []\r\n}\r\n\r\nconst mergeClass = (...values: unknown[]): string => {\r\n const classSet = new Set<string>()\r\n for (const item of values.flatMap((value) => normalizeClass(value))) {\r\n classSet.add(item)\r\n }\r\n\r\n return Array.from(classSet).join(' ')\r\n}\r\n\r\nconst resolveBooleanAttr = (defaultValue: boolean, ...keys: string[]): boolean => {\r\n const value = readAttr(...keys)\r\n if (value === undefined) {\r\n return defaultValue\r\n }\r\n\r\n if (value === '') {\r\n return true\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\nconst toNullableIndex = (value: unknown): number | null =>\r\n typeof value === 'number' && Number.isInteger(value) ? value : null\r\n\r\nconst reorderRows = (rows: RowData[], oldIndex: number, newIndex: number): RowData[] => {\r\n if (oldIndex === newIndex) {\r\n return [...rows]\r\n }\r\n\r\n const next = [...rows]\r\n const [moved] = next.splice(oldIndex, 1)\r\n if (!moved) {\r\n return [...rows]\r\n }\r\n\r\n next.splice(newIndex, 0, moved)\r\n return next\r\n}\r\n\r\nconst getTableElement = (): HTMLElement | null => {\r\n const candidate = (tableRef.value as unknown as { $el?: Element | null })?.$el\r\n return candidate instanceof HTMLElement ? candidate : null\r\n}\r\n\r\nconst bindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement) {\r\n tableElement[tableEditorRegistryDomKey] = editorRegistry\r\n }\r\n}\r\n\r\nconst unbindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement?.[tableEditorRegistryDomKey]) {\r\n delete tableElement[tableEditorRegistryDomKey]\r\n }\r\n}\r\n\r\nconst hasSelectionColumn = (): boolean => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n return (\r\n tableElement.querySelector('.el-table__header-wrapper th.el-table-column--selection') !== null\r\n )\r\n}\r\n\r\nconst getSelectionRows = (): RowData[] => {\r\n const rows = tableRef.value?.getSelectionRows?.()\r\n return Array.isArray(rows) ? (rows as RowData[]) : []\r\n}\r\n\r\nconst sourceData = computed<RowData[]>(() => props.data)\r\n\r\nconst tableData = computed<RowData[]>(() => {\r\n if (!props.isEdit) {\r\n return sourceData.value\r\n }\r\n\r\n return buildProxyData({\r\n data: sourceData.value,\r\n rowKeyField: props.rowKeyField,\r\n maxDepth: props.cellProxyMaxDepth,\r\n resolveRowIndex: (row) => sourceData.value.indexOf(row),\r\n onCellChange: (payload: CellChangeEvent) => {\r\n emit('cell-change', payload)\r\n }\r\n })\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next = { ...rawAttrs }\r\n for (const key of controlledAttrKeys) {\r\n delete next[key]\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst readRowKey = (row: RowData): string | number | null => {\r\n const candidate = row[props.rowKeyField]\r\n return typeof candidate === 'string' || typeof candidate === 'number' ? candidate : null\r\n}\r\n\r\nconst isControlColumn = (column: ColumnState | null | undefined): boolean =>\r\n typeof column?.type === 'string' && CONTROL_COLUMN_TYPES.has(column.type)\r\n\r\nconst resolveColumnKey = (\r\n column: ColumnState | null | undefined,\r\n displayIndex: number | null = null\r\n): string | null => {\r\n if (typeof column?.columnKey === 'string' && column.columnKey) {\r\n return column.columnKey\r\n }\r\n\r\n if (typeof column?.rawColumnKey === 'string' && column.rawColumnKey) {\r\n return column.rawColumnKey\r\n }\r\n\r\n if (displayIndex === null) {\r\n return null\r\n }\r\n\r\n const count = Math.max(columnOrder.value.length, displayIndex + 1, visibleColumnCount.value)\r\n const activeOrder = resolveColumnOrder(count)\r\n const sourceIndex = activeOrder[displayIndex] ?? displayIndex\r\n return getInternalColumnKey(sourceIndex)\r\n}\r\n\r\nconst resolveCellDisplayIndex = (cell: Element | null): number | null => {\r\n if (\r\n !(cell instanceof HTMLTableCellElement) ||\r\n !(cell.parentElement instanceof HTMLTableRowElement)\r\n ) {\r\n return null\r\n }\r\n\r\n return Array.from(cell.parentElement.children).indexOf(cell)\r\n}\r\n\r\nconst isRowDragHandleHotzone = (\r\n cell: Element | null,\r\n event: Event,\r\n displayIndex: number | null\r\n) => {\r\n if (\r\n !props.rowDraggable ||\r\n displayIndex !== props.rowDragHandleColumnIndex ||\r\n !(cell instanceof HTMLElement)\r\n ) {\r\n return false\r\n }\r\n\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return false\r\n }\r\n\r\n const rect = cell.getBoundingClientRect()\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return false\r\n }\r\n\r\n return point.x - rect.left <= Math.min(ROW_DRAG_HANDLE_HOTZONE_PX, rect.width)\r\n}\r\n\r\nconst commitActiveCell = (nextActiveCell: ActiveCell | null) => {\r\n activeCellClassSnapshot = nextActiveCell ? { ...nextActiveCell } : null\r\n activeCell.value = nextActiveCell ? { ...nextActiveCell } : null\r\n scheduleActiveCellClassSync()\r\n}\r\n\r\nconst setActiveCell = (\r\n row: RowData,\r\n column: ColumnState | null | undefined,\r\n displayIndex: number\r\n) => {\r\n if (isControlColumn(column)) {\r\n return\r\n }\r\n\r\n const rowKey = readRowKey(row)\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n\r\n if (rowKey === null || !columnKey) {\r\n return\r\n }\r\n\r\n commitActiveCell({\r\n rowKey,\r\n columnKey\r\n })\r\n}\r\n\r\nconst resolveVisibleColumns = (): VisibleColumnEntry[] => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return []\r\n }\r\n\r\n return columns.flatMap((item, displayIndex) => {\r\n const column = item as ColumnState\r\n if (isControlColumn(column)) {\r\n return []\r\n }\r\n\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n if (!columnKey) {\r\n return []\r\n }\r\n\r\n return [\r\n {\r\n displayIndex,\r\n columnKey,\r\n column\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst resolveCellPosition = (\r\n cell: ActiveCell | null,\r\n rows: RowData[] = sourceData.value\r\n): ActiveCellPosition | null => {\r\n if (!cell) {\r\n return null\r\n }\r\n\r\n const rowIndex = rows.findIndex((row) => readRowKey(row) === cell.rowKey)\r\n if (rowIndex < 0) {\r\n return null\r\n }\r\n\r\n const columns = resolveVisibleColumns()\r\n const column = columns.find((item) => item.columnKey === cell.columnKey)\r\n if (!column) {\r\n return null\r\n }\r\n\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n return {\r\n rowIndex,\r\n row,\r\n column,\r\n columns\r\n }\r\n}\r\n\r\nconst resolveActiveCellPosition = (): ActiveCellPosition | null =>\r\n resolveCellPosition(activeCell.value)\r\n\r\nconst getBodyWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__body-wrapper, .el-table__fixed-body-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst isFixedCloneElement = (element: Element | null): boolean =>\r\n Boolean(element?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n\r\nconst resolveBodyCellsByPosition = (rowIndex: number, displayIndex: number): HTMLElement[] =>\r\n getBodyWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr')\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return []\r\n }\r\n\r\n const cell = row.querySelectorAll<HTMLElement>('td.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst pickPrimaryCell = (cells: HTMLElement[]): HTMLElement | null =>\r\n cells.find((cell) => !isFixedCloneElement(cell)) ?? cells[0] ?? null\r\n\r\nconst activeCellClassNames = {\r\n active: ns.e('cross-active'),\r\n row: ns.e('cross-row'),\r\n column: ns.e('cross-column'),\r\n control: ns.e('cross-control-cell')\r\n} as const\r\n\r\ntype ActiveCellClassState = Map<HTMLElement, Set<string>>\r\n\r\nconst getHeaderWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__header-wrapper, .el-table__fixed-header-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst resolveHeaderCellsByPosition = (displayIndex: number): HTMLElement[] =>\r\n getHeaderWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('thead tr')\r\n const row = rows[rows.length - 1]\r\n const cell = row?.querySelectorAll<HTMLElement>('th.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst createActiveCellDomLookup = () => {\r\n const bodyWrappers = getBodyWrappers().map((wrapper) => ({\r\n rows: wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr'),\r\n rowCells: new Map<number, HTMLElement[]>()\r\n }))\r\n\r\n const readRowCells = (\r\n wrapper: (typeof bodyWrappers)[number],\r\n rowIndex: number\r\n ): HTMLElement[] | null => {\r\n const cached = wrapper.rowCells.get(rowIndex)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const row = wrapper.rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n wrapper.rowCells.set(rowIndex, cells)\r\n return cells\r\n }\r\n\r\n return {\r\n resolveBodyCells(rowIndex: number, displayIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) => {\r\n const cell = readRowCells(wrapper, rowIndex)?.[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n },\r\n resolveBodyRowCells(rowIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(readRowCells(wrapper, rowIndex) ?? []).map((cell, displayIndex) => ({\r\n cell,\r\n displayIndex\r\n }))\r\n )\r\n },\r\n resolveBodyColumnCells(displayIndex: number) {\r\n const selector = `tr > td.el-table__cell:nth-child(${displayIndex + 1})`\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(wrapper.rows[0]?.parentElement?.querySelectorAll<HTMLElement>(selector) ?? [])\r\n )\r\n },\r\n resolveHeaderCells: resolveHeaderCellsByPosition\r\n }\r\n}\r\n\r\nconst addActiveCellClass = (\r\n state: ActiveCellClassState,\r\n elements: Iterable<HTMLElement>,\r\n className: string\r\n) => {\r\n for (const element of elements) {\r\n const classes = state.get(element) ?? new Set<string>()\r\n classes.add(className)\r\n state.set(element, classes)\r\n }\r\n}\r\n\r\nconst collectActiveCellClasses = (\r\n cell: ActiveCell | null,\r\n crossHighlight: boolean,\r\n lookup: ReturnType<typeof createActiveCellDomLookup>\r\n): ActiveCellClassState => {\r\n const state: ActiveCellClassState = new Map()\r\n const storeData = readStoreData()\r\n const position = resolveCellPosition(\r\n cell,\r\n Array.isArray(storeData) ? (storeData as RowData[]) : sourceData.value\r\n )\r\n if (!position) {\r\n return state\r\n }\r\n\r\n const activeCells = lookup.resolveBodyCells(position.rowIndex, position.column.displayIndex)\r\n addActiveCellClass(state, activeCells, activeCellClassNames.active)\r\n\r\n if (!crossHighlight) {\r\n return state\r\n }\r\n\r\n const columns = readStoreColumns()\r\n if (Array.isArray(columns)) {\r\n for (const { cell: rowCell, displayIndex } of lookup.resolveBodyRowCells(position.rowIndex)) {\r\n if (displayIndex === position.column.displayIndex) {\r\n continue\r\n }\r\n\r\n addActiveCellClass(\r\n state,\r\n [rowCell],\r\n isControlColumn(columns[displayIndex] as ColumnState)\r\n ? activeCellClassNames.control\r\n : activeCellClassNames.row\r\n )\r\n }\r\n }\r\n\r\n const activeCellSet = new Set(activeCells)\r\n addActiveCellClass(\r\n state,\r\n lookup\r\n .resolveBodyColumnCells(position.column.displayIndex)\r\n .filter((columnCell) => !activeCellSet.has(columnCell)),\r\n activeCellClassNames.column\r\n )\r\n addActiveCellClass(\r\n state,\r\n lookup.resolveHeaderCells(position.column.displayIndex),\r\n activeCellClassNames.column\r\n )\r\n\r\n return state\r\n}\r\n\r\nconst applyActiveCellClassDelta = (previous: ActiveCellClassState, next: ActiveCellClassState) => {\r\n for (const [element, classes] of previous) {\r\n const nextClasses = next.get(element)\r\n for (const className of classes) {\r\n if (!nextClasses?.has(className)) {\r\n element.classList.remove(className)\r\n }\r\n }\r\n }\r\n\r\n for (const [element, classes] of next) {\r\n const previousClasses = previous.get(element)\r\n for (const className of classes) {\r\n if (!previousClasses?.has(className)) {\r\n element.classList.add(className)\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst clearActiveCellClasses = () => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n const selector = Object.values(activeCellClassNames)\r\n .map((className) => `.${className}`)\r\n .join(',')\r\n for (const element of tableElement.querySelectorAll<HTMLElement>(selector)) {\r\n element.classList.remove(...Object.values(activeCellClassNames))\r\n }\r\n}\r\n\r\nconst syncActiveCellClasses = () => {\r\n const nextActiveCell = activeCellClassSnapshot ? { ...activeCellClassSnapshot } : null\r\n const nextCrossHighlight = props.crossHighlight\r\n const lookup = createActiveCellDomLookup()\r\n const nextClasses = collectActiveCellClasses(nextActiveCell, nextCrossHighlight, lookup)\r\n\r\n if (shouldResetActiveCellClasses) {\r\n clearActiveCellClasses()\r\n applyActiveCellClassDelta(new Map(), nextClasses)\r\n } else {\r\n const previousClasses = collectActiveCellClasses(\r\n renderedActiveCell,\r\n renderedCrossHighlight,\r\n lookup\r\n )\r\n applyActiveCellClassDelta(previousClasses, nextClasses)\r\n }\r\n\r\n renderedActiveCell = nextActiveCell\r\n renderedCrossHighlight = nextCrossHighlight\r\n shouldResetActiveCellClasses = false\r\n}\r\n\r\nfunction scheduleActiveCellClassSync(shouldReset = false) {\r\n shouldResetActiveCellClasses ||= shouldReset\r\n const version = ++activeCellClassSyncVersion\r\n void nextTick(() => {\r\n if (version === activeCellClassSyncVersion) {\r\n syncActiveCellClasses()\r\n }\r\n })\r\n}\r\n\r\nconst sortEditorCandidates = (items: TableEditorEndpoint[]): TableEditorEndpoint[] =>\r\n [...items].sort((left, right) => {\r\n const fixedDelta = Number(Boolean(left.isFixedClone)) - Number(Boolean(right.isFixedClone))\r\n if (fixedDelta !== 0) {\r\n return fixedDelta\r\n }\r\n\r\n return (right.priority ?? 0) - (left.priority ?? 0)\r\n })\r\n\r\nconst findEditorsInCells = (cells: HTMLElement[]): TableEditorEndpoint[] =>\r\n sortEditorCandidates(editorRegistry.getEditorsInCells(cells))\r\n\r\nconst findEditorForActiveCell = (): TableEditorEndpoint | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n const cells = resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n return findEditorsInCells(cells)[0] ?? null\r\n}\r\n\r\nconst resolveNextActiveCell = (direction: DirectionKey): ActiveCell | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n if (direction === 'ArrowUp' || direction === 'ArrowDown') {\r\n const nextRowIndex = position.rowIndex + (direction === 'ArrowDown' ? 1 : -1)\r\n const nextRow = sourceData.value[nextRowIndex]\r\n const nextRowKey = nextRow ? readRowKey(nextRow) : null\r\n if (nextRowIndex < 0 || !nextRow || nextRowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey: nextRowKey,\r\n columnKey: position.column.columnKey\r\n }\r\n }\r\n\r\n const currentColumnIndex = position.columns.findIndex(\r\n (item) => item.columnKey === position.column.columnKey\r\n )\r\n if (currentColumnIndex < 0) {\r\n return null\r\n }\r\n\r\n const nextColumnIndex = currentColumnIndex + (direction === 'ArrowRight' ? 1 : -1)\r\n const nextColumn = position.columns[nextColumnIndex]\r\n if (!nextColumn) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(position.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey,\r\n columnKey: nextColumn.columnKey\r\n }\r\n}\r\n\r\nconst scrollActiveCellIntoView = () => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return\r\n }\r\n\r\n const targetCell = pickPrimaryCell(\r\n resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n )\r\n targetCell?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest'\r\n })\r\n}\r\n\r\nconst blurActiveEditor = async () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n await Promise.resolve(editor.close?.())\r\n await Promise.resolve(editor.blur())\r\n isEditing.value = false\r\n}\r\n\r\nconst isActiveEditorPanelOpen = () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor?.isPanelOpen) {\r\n return false\r\n }\r\n\r\n return Boolean(editor.isPanelOpen())\r\n}\r\n\r\nconst resolveSelectionTogglePayload = (\r\n row: RowData,\r\n selectionBefore: RowData[],\r\n selectionAfter: RowData[],\r\n trigger: SelectionRowToggleEvent['trigger']\r\n): SelectionRowToggleEvent => ({\r\n row,\r\n rowIndex: sourceData.value.indexOf(row),\r\n selected: selectionAfter.includes(row),\r\n selectionBefore,\r\n selectionAfter,\r\n trigger\r\n})\r\n\r\nconst handleRowClick = (row: RowData, column: unknown, event: Event) => {\r\n if (props.selectionRowClick && hasSelectionColumn() && tableRef.value) {\r\n const selectionBefore = getSelectionRows()\r\n\r\n if (props.selectionSingle) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n } else {\r\n const nextSelected = !selectionBefore.includes(row)\r\n tableRef.value.toggleRowSelection(row, nextSelected)\r\n }\r\n\r\n const selectionAfter = getSelectionRows()\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selectionBefore, selectionAfter, 'row-click')\r\n )\r\n }\r\n\r\n invokeListener(readAttr('onRowClick'), row, column, event)\r\n}\r\n\r\nconst handleCellClick = (row: RowData, column: ColumnState, cell: Element, event: Event) => {\r\n const displayIndex = resolveCellDisplayIndex(cell)\r\n const isHandleHotzone = isRowDragHandleHotzone(cell, event, displayIndex)\r\n\r\n if (!isHandleHotzone && displayIndex !== null) {\r\n setActiveCell(row, column, displayIndex)\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n invokeListener(readAttr('onCellClick', 'onCell-click'), row, column, cell, event)\r\n}\r\n\r\nconst handleSelect = (selection: RowData[], row: RowData) => {\r\n if (props.selectionSingle && tableRef.value && selection.length > 1) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n\r\n const nextSelection = getSelectionRows()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'multiple-selected',\r\n selection\r\n })\r\n\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selection, nextSelection, 'selection-change')\r\n )\r\n\r\n invokeListener(readAttr('onSelect'), nextSelection, row)\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelect'), selection, row)\r\n}\r\n\r\nconst handleSelectAll = (selection: RowData[]) => {\r\n if (props.selectionSingle && tableRef.value) {\r\n tableRef.value.clearSelection()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'select-all-disabled',\r\n selection\r\n })\r\n\r\n invokeListener(readAttr('onSelectAll'), [])\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelectAll'), selection)\r\n}\r\n\r\nconst resolveHeaderRowClassName = () => {\r\n const baseClass = ns.e('header-row')\r\n const userClassName = readAttr('headerRowClassName', 'header-row-class-name')\r\n\r\n if (typeof userClassName === 'function') {\r\n return (...args: unknown[]) => mergeClass(userClassName(...args), baseClass)\r\n }\r\n\r\n return mergeClass(userClassName, baseClass)\r\n}\r\n\r\nconst resolveCellClassName = () => {\r\n const userCellClassName = readAttr('cellClassName', 'cell-class-name')\r\n\r\n const resolveCrossClass = (scope: CellClassNameScope): string | null => {\r\n const focusCell = activeCellClassSnapshot\r\n if (!focusCell) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(scope.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n if (isControlColumn(scope.column)) {\r\n return props.crossHighlight && rowKey === focusCell.rowKey ? ns.e('cross-control-cell') : null\r\n }\r\n\r\n const columnKey = resolveColumnKey(scope.column, scope.columnIndex)\r\n if (!columnKey) {\r\n return null\r\n }\r\n\r\n const isActiveRow = rowKey === focusCell.rowKey\r\n const isActiveColumn = columnKey === focusCell.columnKey\r\n\r\n if (isActiveRow && isActiveColumn) {\r\n return ns.e('cross-active')\r\n }\r\n\r\n if (!props.crossHighlight) {\r\n return null\r\n }\r\n\r\n if (isActiveRow) {\r\n return ns.e('cross-row')\r\n }\r\n\r\n if (isActiveColumn) {\r\n return ns.e('cross-column')\r\n }\r\n\r\n return null\r\n }\r\n\r\n const resolveByScope = (scope: CellClassNameScope) =>\r\n mergeClass(\r\n typeof userCellClassName === 'function' ? userCellClassName(scope) : userCellClassName,\r\n props.rowDraggable &&\r\n scope.columnIndex === props.rowDragHandleColumnIndex &&\r\n ns.e('row-drag-cell'),\r\n resolveCrossClass(scope)\r\n )\r\n\r\n return (scope: CellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst resolveHeaderCellClassName = () => {\r\n const userHeaderCellClassName = readAttr('headerCellClassName', 'header-cell-class-name')\r\n\r\n const resolveByScope = (scope: HeaderCellClassNameScope) => {\r\n const focusCell = activeCellClassSnapshot\r\n const columnClass =\r\n props.crossHighlight &&\r\n focusCell &&\r\n !isControlColumn(scope.column) &&\r\n resolveColumnKey(scope.column, scope.columnIndex) === focusCell.columnKey\r\n ? ns.e('cross-column')\r\n : null\r\n\r\n return mergeClass(\r\n typeof userHeaderCellClassName === 'function'\r\n ? userHeaderCellClassName(scope)\r\n : userHeaderCellClassName,\r\n columnClass\r\n )\r\n }\r\n\r\n return (scope: HeaderCellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst syncVisibleColumnCount = (headerRow: HTMLElement) => {\r\n const cells = headerRow.querySelectorAll<HTMLElement>('th.el-table__cell')\r\n visibleColumnCount.value = cells.length\r\n}\r\n\r\nconst readStoreColumns = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n columns?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.columns?.value\r\n\r\nconst readStoreData = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n data?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.data?.value\r\n\r\nconst columnStoreSignature = computed(() => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return ''\r\n }\r\n\r\n return columns\r\n .map((column, index) => {\r\n const current = column as ColumnState & { label?: unknown; property?: unknown }\r\n return [\r\n index,\r\n String(current.columnKey ?? ''),\r\n String(current.type ?? ''),\r\n String(current.label ?? ''),\r\n String(current.property ?? '')\r\n ].join(':')\r\n })\r\n .join('|')\r\n})\r\n\r\nconst readStoreColumnCount = (): number => {\r\n const columns = readStoreColumns()\r\n\r\n return Array.isArray(columns) ? columns.length : 0\r\n}\r\n\r\nconst resolveColumnCount = (headerRow: HTMLElement | null, minimumCount = 0): number => {\r\n const headerCount = headerRow?.querySelectorAll<HTMLElement>('th.el-table__cell').length ?? 0\r\n\r\n return Math.max(minimumCount, columnOrder.value.length, readStoreColumnCount(), headerCount)\r\n}\r\n\r\nconst destroyRowSortable = () => {\r\n rowSortable.value?.destroy()\r\n rowSortable.value = null\r\n}\r\n\r\nconst stopColumnResizeGestureReleaseTracking = () => {\r\n if (!columnResizePointerUpListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerup', columnResizePointerUpListener.value)\r\n document.removeEventListener('mouseup', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchend', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchcancel', columnResizePointerUpListener.value)\r\n document.removeEventListener('dragend', columnResizePointerUpListener.value)\r\n columnResizePointerUpListener.value = null\r\n}\r\n\r\nconst clearColumnResizeGesture = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n columnSortable.value?.option?.('disabled', false)\r\n isColumnResizeGesture.value = false\r\n}\r\n\r\nconst unbindColumnResizeGuard = () => {\r\n if (columnResizeGuardHeaderRow.value && columnResizePointerDownListener.value) {\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'pointerdown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'mousedown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'touchstart',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = null\r\n columnResizePointerDownListener.value = null\r\n}\r\n\r\nconst destroyColumnSortable = () => {\r\n clearColumnResizeGesture()\r\n unbindColumnResizeGuard()\r\n columnSortable.value?.destroy()\r\n columnSortable.value = null\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n}\r\n\r\nconst unbindOutsidePointerDown = () => {\r\n if (!outsidePointerDownListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('mousedown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('touchstart', outsidePointerDownListener.value, true)\r\n outsidePointerDownListener.value = null\r\n}\r\n\r\nconst bindOutsidePointerDown = () => {\r\n unbindOutsidePointerDown()\r\n\r\n const listener = (event: Event) => {\r\n if (!activeCell.value) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const target = event.target\r\n const isOverlayTarget =\r\n target instanceof Element &&\r\n Boolean(target.closest('.el-select__popper, .el-picker__popper, .el-popper'))\r\n\r\n if (\r\n !tableElement ||\r\n !(target instanceof Node) ||\r\n tableElement.contains(target) ||\r\n (isEditing.value && isOverlayTarget)\r\n ) {\r\n return\r\n }\r\n\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n outsidePointerDownListener.value = listener\r\n document.addEventListener('pointerdown', listener, true)\r\n document.addEventListener('mousedown', listener, true)\r\n document.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst isDirectionKey = (value: string): value is DirectionKey =>\r\n value === 'ArrowUp' || value === 'ArrowDown' || value === 'ArrowLeft' || value === 'ArrowRight'\r\n\r\nconst isInputActivationKey = (event: KeyboardEvent) =>\r\n event.key.length === 1 ||\r\n event.key === 'Backspace' ||\r\n event.key === 'Delete' ||\r\n event.key === 'Enter' ||\r\n event.key === 'F2'\r\n\r\nconst canHandleKeyEvent = (event: KeyboardEvent) => {\r\n if (!activeCell.value || event.isComposing || event.ctrlKey || event.metaKey || event.altKey) {\r\n return false\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n if (isEditing.value) {\r\n return true\r\n }\r\n\r\n const target = event.target\r\n if (target instanceof Node && tableElement.contains(target)) {\r\n return true\r\n }\r\n\r\n const activeElement = document.activeElement\r\n return (\r\n activeElement === null ||\r\n activeElement === document.body ||\r\n activeElement === document.documentElement ||\r\n (activeElement instanceof Node && tableElement.contains(activeElement))\r\n )\r\n}\r\n\r\nconst syncEditingStateFromTarget = (target: EventTarget | null) => {\r\n if (!activeCell.value) {\r\n isEditing.value = false\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n const root = editor?.getRootEl()\r\n if (root && target instanceof Node && root.contains(target)) {\r\n isEditing.value = true\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (tableElement && target instanceof Node && tableElement.contains(target)) {\r\n isEditing.value = false\r\n }\r\n}\r\n\r\nconst unbindKeyboardListener = () => {\r\n if (!keyboardListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('keydown', keyboardListener.value, true)\r\n keyboardListener.value = null\r\n}\r\n\r\nconst bindKeyboardListener = () => {\r\n unbindKeyboardListener()\r\n\r\n const listener = async (event: KeyboardEvent) => {\r\n if (!canHandleKeyEvent(event)) {\r\n return\r\n }\r\n\r\n if (isDirectionKey(event.key)) {\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n const nextActive = resolveNextActiveCell(event.key)\r\n if (!nextActive) {\r\n return\r\n }\r\n\r\n await blurActiveEditor()\r\n commitActiveCell(nextActive)\r\n await nextTick()\r\n scrollActiveCellIntoView()\r\n return\r\n }\r\n\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n if (!isInputActivationKey(event) || isEditing.value) {\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n const handled = await editor.handoffFirstKey(event)\r\n if (handled) {\r\n isEditing.value = true\r\n }\r\n }\r\n\r\n keyboardListener.value = listener\r\n document.addEventListener('keydown', listener, true)\r\n}\r\n\r\nconst unbindEditorFocusTracking = () => {\r\n if (!editorFocusInListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('focusin', editorFocusInListener.value, true)\r\n editorFocusInListener.value = null\r\n}\r\n\r\nconst bindEditorFocusTracking = () => {\r\n unbindEditorFocusTracking()\r\n\r\n const listener = (event: FocusEvent) => {\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n editorFocusInListener.value = listener\r\n document.addEventListener('focusin', listener, true)\r\n}\r\n\r\nconst readClientPointFromEvent = (event: Event): ClientPoint | null => {\r\n const pointEvent = event as { clientX?: unknown; clientY?: unknown }\r\n if (typeof pointEvent.clientX === 'number' && typeof pointEvent.clientY === 'number') {\r\n return { x: pointEvent.clientX, y: pointEvent.clientY }\r\n }\r\n\r\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\r\n return { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\r\n const touch = event.touches[0] ?? event.changedTouches[0]\r\n return touch\r\n ? {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n : null\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveHeaderCellFromEvent = (event: Event): HTMLElement | null => {\r\n const target = event.target\r\n if (!(target instanceof Element)) {\r\n return null\r\n }\r\n\r\n const headerCell = target.closest('th.el-table__cell')\r\n return headerCell instanceof HTMLElement ? headerCell : null\r\n}\r\n\r\nconst isColumnResizeHotzone = (headerCell: HTMLElement, clientX: number): boolean => {\r\n const rect = headerCell.getBoundingClientRect()\r\n if (rect.width <= 0) {\r\n return false\r\n }\r\n\r\n const hotzoneWidth = Math.min(COLUMN_RESIZE_HOTZONE_PX, rect.width / 2)\r\n return clientX - rect.left <= hotzoneWidth || rect.right - clientX <= hotzoneWidth\r\n}\r\n\r\nconst startColumnResizeGestureReleaseTracking = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n\r\n const listener = () => {\r\n clearColumnResizeGesture()\r\n }\r\n\r\n columnResizePointerUpListener.value = listener\r\n document.addEventListener('pointerup', listener)\r\n document.addEventListener('mouseup', listener)\r\n document.addEventListener('touchend', listener)\r\n document.addEventListener('touchcancel', listener)\r\n document.addEventListener('dragend', listener)\r\n}\r\n\r\nconst bindColumnResizeGuard = (headerRow: HTMLElement) => {\r\n unbindColumnResizeGuard()\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n const headerCell = resolveHeaderCellFromEvent(event)\r\n const hitResizeHotzone =\r\n point !== null && headerCell !== null && isColumnResizeHotzone(headerCell, point.x)\r\n\r\n if (!hitResizeHotzone) {\r\n if (!isColumnDragging.value && isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n }\r\n return\r\n }\r\n\r\n isColumnResizeGesture.value = true\r\n updateColumnDragState(null)\r\n columnSortable.value?.option?.('disabled', true)\r\n startColumnResizeGestureReleaseTracking()\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = headerRow\r\n columnResizePointerDownListener.value = listener\r\n headerRow.addEventListener('pointerdown', listener, true)\r\n headerRow.addEventListener('mousedown', listener, true)\r\n headerRow.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst updateColumnDragState = (state: ColumnDropState | null) => {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n if (!state) {\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n return\r\n }\r\n pendingColumnDropDisplayIndex.value = state.dropDisplayIndex\r\n columnDragIndicatorDisplayIndex.value = state.targetDisplayIndex\r\n columnDragIndicatorSide.value = state.side\r\n if (!tableElement) {\r\n return\r\n }\r\n const indicatorClass = state.side === 'left' ? leftClass : rightClass\r\n const headerCells = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__header-wrapper th.el-table__cell')\r\n )\r\n const headerCell = headerCells[state.targetDisplayIndex]\r\n headerCell?.classList.add(indicatorClass)\r\n\r\n const bodyRows = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__body-wrapper tbody tr')\r\n )\r\n for (const row of bodyRows) {\r\n const bodyCells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n bodyCells[state.targetDisplayIndex]?.classList.add(indicatorClass)\r\n }\r\n}\r\n\r\nconst resolveColumnDropStateByClientPoint = (\r\n point: ClientPoint,\r\n oldIndex: number | null\r\n): ColumnDropState | null => {\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return null\r\n }\r\n\r\n const headerRowRect = headerRow.getBoundingClientRect()\r\n if (\r\n point.x < headerRowRect.left ||\r\n point.x > headerRowRect.right ||\r\n point.y < headerRowRect.top ||\r\n point.y > headerRowRect.bottom\r\n ) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLElement>('th.el-table__cell'))\r\n if (cells.length === 0) {\r\n return null\r\n }\r\n\r\n let targetDisplayIndex = cells.length - 1\r\n for (let index = 0; index < cells.length; index += 1) {\r\n const rect = cells[index].getBoundingClientRect()\r\n if (point.x <= rect.right) {\r\n targetDisplayIndex = index\r\n break\r\n }\r\n }\r\n\r\n const targetCellRect = cells[targetDisplayIndex]?.getBoundingClientRect()\r\n if (!targetCellRect) {\r\n return null\r\n }\r\n\r\n const targetCenterX = targetCellRect.left + targetCellRect.width / 2\r\n const side: ColumnDragIndicatorSide = point.x < targetCenterX ? 'left' : 'right'\r\n\r\n let dropDisplayIndex = targetDisplayIndex + (side === 'right' ? 1 : 0)\r\n if (oldIndex !== null && dropDisplayIndex > oldIndex) {\r\n dropDisplayIndex -= 1\r\n }\r\n const maxIndex = cells.length - 1\r\n return {\r\n dropDisplayIndex: Math.min(Math.max(dropDisplayIndex, 0), maxIndex),\r\n targetDisplayIndex,\r\n side\r\n }\r\n}\r\n\r\nconst startColumnDragPointerTracking = (oldIndex: number | null) => {\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n }\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return\r\n }\r\n\r\n updateColumnDragState(resolveColumnDropStateByClientPoint(point, oldIndex))\r\n }\r\n\r\n columnDragPointerMoveListener.value = listener\r\n document.addEventListener('dragover', listener)\r\n document.addEventListener('pointermove', listener)\r\n document.addEventListener('mousemove', listener)\r\n document.addEventListener('touchmove', listener)\r\n}\r\n\r\nconst initRowSortable = () => {\r\n destroyRowSortable()\r\n\r\n if (!props.rowDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const body = tableElement?.querySelector('.el-table__body-wrapper tbody')\r\n\r\n if (!(body instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n rowSortable.value = Sortable.create(body, {\r\n animation: 180,\r\n draggable: 'tr',\r\n handle: `.${ns.e('row-drag-cell')}`,\r\n onStart: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n row: oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n }\r\n\r\n emit('row-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const newIndex = toNullableIndex(event.newIndex)\r\n const row = oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n row\r\n }\r\n\r\n emit('row-drag-end', payload)\r\n\r\n if (row && oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const orderPayload: RowOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n row,\r\n data: reorderRows(sourceData.value, oldIndex, newIndex)\r\n }\r\n emit('row-order-change', orderPayload)\r\n }\r\n }\r\n })\r\n}\r\n\r\nconst initColumnSortable = () => {\r\n destroyColumnSortable()\r\n\r\n if (!props.columnDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n syncVisibleColumnCount(headerRow)\r\n\r\n columnSortable.value = Sortable.create(headerRow, {\r\n animation: 180,\r\n draggable: 'th.el-table__cell',\r\n sort: false,\r\n onStart: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n return\r\n }\r\n\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n isColumnDragging.value = true\r\n draggingColumnOldDisplayIndex.value = oldIndex\r\n updateColumnDragState(null)\r\n startColumnDragPointerTracking(oldIndex)\r\n const count = resolveColumnCount(headerRow, (oldIndex ?? -1) + 1)\r\n columnDragCount.value = count\r\n const activeOrder = resolveColumnOrder(count)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n columnIndex: oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n }\r\n\r\n emit('column-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n return\r\n }\r\n\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n const oldIndex = toNullableIndex(event.oldIndex) ?? draggingColumnOldDisplayIndex.value\r\n const fallbackNewIndex = toNullableIndex(event.newIndex)\r\n const originalEvent = (event as { originalEvent?: Event }).originalEvent\r\n const point = originalEvent ? readClientPointFromEvent(originalEvent) : null\r\n const pointerState =\r\n point === null\r\n ? null\r\n : resolveColumnDropStateByClientPoint(point, draggingColumnOldDisplayIndex.value)\r\n const newIndex =\r\n pointerState?.dropDisplayIndex ?? pendingColumnDropDisplayIndex.value ?? fallbackNewIndex\r\n const maxDragIndex = Math.max(oldIndex ?? -1, newIndex ?? -1)\r\n const latestHeaderRow = getTableElement()?.querySelector('.el-table__header-wrapper thead tr')\r\n const count = Math.max(\r\n columnDragCount.value ?? 0,\r\n resolveColumnCount(\r\n latestHeaderRow instanceof HTMLElement ? latestHeaderRow : headerRow,\r\n maxDragIndex + 1\r\n )\r\n )\r\n const activeOrder = resolveColumnOrder(count)\r\n const columnIndex = oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex\r\n }\r\n\r\n emit('column-drag-end', payload)\r\n\r\n if (oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const nextOrder = reorderColumnOrder(activeOrder, oldIndex, newIndex)\r\n const movedColumnSourceIndex = activeOrder[oldIndex] ?? oldIndex\r\n columnOrder.value = nextOrder\r\n\r\n const orderPayload: ColumnOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex: movedColumnSourceIndex,\r\n order: nextOrder\r\n }\r\n\r\n emit('column-order-change', orderPayload)\r\n\r\n void nextTick(() => {\r\n const tableElement = getTableElement()\r\n const latestHeaderRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (latestHeaderRow instanceof HTMLElement) {\r\n syncVisibleColumnCount(latestHeaderRow)\r\n }\r\n })\r\n }\r\n\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n updateColumnDragState(null)\r\n }\r\n })\r\n\r\n bindColumnResizeGuard(headerRow)\r\n}\r\n\r\nconst refreshSortables = async () => {\r\n await nextTick()\r\n initRowSortable()\r\n initColumnSortable()\r\n}\r\n\r\nconst mergedTableAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n class: [ns.b(), readAttr('class')],\r\n data: tableData.value,\r\n border: resolveBooleanAttr(true, 'border'),\r\n stripe: resolveBooleanAttr(true, 'stripe'),\r\n highlightCurrentRow: resolveBooleanAttr(true, 'highlightCurrentRow', 'highlight-current-row'),\r\n headerRowClassName: resolveHeaderRowClassName(),\r\n cellClassName: resolveCellClassName(),\r\n headerCellClassName: resolveHeaderCellClassName(),\r\n onCellClick: handleCellClick,\r\n onRowClick: handleRowClick,\r\n onSelect: handleSelect,\r\n onSelectAll: handleSelectAll\r\n}))\r\n\r\nwatch(columnStoreSignature, (next, prev) => {\r\n if (prev !== undefined && next !== prev) {\r\n editorRegistry.invalidate()\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n scheduleActiveCellClassSync(true)\r\n }\r\n})\r\n\r\nwatch(\r\n () => [sourceData.value.length, props.rowKeyField],\r\n () => {\r\n editorRegistry.invalidate()\r\n if (!activeCell.value) {\r\n scheduleActiveCellClassSync(true)\r\n return\r\n }\r\n\r\n const hasActiveRow = sourceData.value.some(\r\n (row) => readRowKey(row) === activeCell.value?.rowKey\r\n )\r\n if (!hasActiveRow) {\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n scheduleActiveCellClassSync(true)\r\n }\r\n)\r\n\r\nwatch(\r\n sourceData,\r\n () => {\r\n editorRegistry.invalidate()\r\n scheduleActiveCellClassSync(true)\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(\r\n () => props.crossHighlight,\r\n () => {\r\n scheduleActiveCellClassSync()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(activeCell, (nextActiveCell) => {\r\n if (!nextActiveCell) {\r\n isEditing.value = false\r\n }\r\n})\r\n\r\nonMounted(() => {\r\n bindEditorRegistryHost()\r\n bindOutsidePointerDown()\r\n bindKeyboardListener()\r\n bindEditorFocusTracking()\r\n scheduleActiveCellClassSync(true)\r\n void refreshSortables()\r\n})\r\n\r\nwatch(\r\n () => [\r\n props.rowDraggable,\r\n props.columnDraggable,\r\n props.rowDragHandleColumnIndex,\r\n sourceData.value.length\r\n ],\r\n () => {\r\n void refreshSortables()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n clearActiveCellClasses()\r\n unbindEditorRegistryHost()\r\n unbindOutsidePointerDown()\r\n unbindKeyboardListener()\r\n unbindEditorFocusTracking()\r\n destroyRowSortable()\r\n destroyColumnSortable()\r\n})\r\n\r\ndefineExpose({} as FlTableExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElTable, { ...mergedTableAttrs, ref: setTableRef }, tableSlots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport Sortable from 'sortablejs'\r\nimport type { SortableEvent } from 'sortablejs'\r\nimport { ElTable } from 'element-plus'\r\nimport type { VNode } from 'vue'\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n cloneVNode,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n shallowRef,\r\n useAttrs,\r\n useSlots,\r\n h,\r\n watch\r\n} from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type {\r\n CellChangeEvent,\r\n ColumnDragEvent,\r\n ColumnOrderChangeEvent,\r\n FlTableExpose,\r\n RowData,\r\n RowDragEvent,\r\n RowOrderChangeEvent,\r\n SelectionRowToggleEvent\r\n} from './table'\r\nimport { tableEmits, tableProps } from './table'\r\nimport { createTableProxyDataBuilder } from './proxy-data'\r\nimport type { TableEditorEndpoint, TableEditorRegistry } from './editor-registry'\r\nimport { createTableEditorRegistry, tableEditorRegistryDomKey } from './editor-registry'\r\n\r\ndefineOptions({\r\n name: 'FlTable',\r\n inheritAttrs: false\r\n})\r\n\r\ntype CellClassNameScope = {\r\n row: RowData\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype HeaderCellClassNameScope = {\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype ColumnState = {\r\n type?: string\r\n columnKey?: string\r\n rawColumnKey?: string\r\n}\r\n\r\ntype ActiveCell = {\r\n rowKey: string | number\r\n columnKey: string\r\n}\r\n\r\ntype ClientPoint = {\r\n x: number\r\n y: number\r\n}\r\n\r\ntype ColumnDragIndicatorSide = 'left' | 'right'\r\n\r\ntype ColumnDropState = {\r\n dropDisplayIndex: number\r\n targetDisplayIndex: number\r\n side: ColumnDragIndicatorSide\r\n}\r\n\r\ntype DirectionKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight'\r\n\r\ntype VisibleColumnEntry = {\r\n displayIndex: number\r\n columnKey: string\r\n column: ColumnState\r\n}\r\n\r\ntype ActiveCellPosition = {\r\n rowIndex: number\r\n row: RowData\r\n column: VisibleColumnEntry\r\n columns: VisibleColumnEntry[]\r\n}\r\n\r\nconst COLUMN_RESIZE_HOTZONE_PX = 8\r\nconst ROW_DRAG_HANDLE_HOTZONE_PX = 24\r\nconst CONTROL_COLUMN_TYPES = new Set(['selection', 'index', 'expand'])\r\n\r\nconst props = defineProps(tableProps)\r\nconst emit = defineEmits(tableEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('table')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst tableRef = shallowRef<FlTableExpose | null>(null)\r\nconst rowSortable = shallowRef<Sortable | null>(null)\r\nconst columnSortable = shallowRef<Sortable | null>(null)\r\nconst columnOrder = ref<number[]>([])\r\nconst columnDragCount = ref<number | null>(null)\r\nconst visibleColumnCount = ref<number>(0)\r\nconst draggingColumnOldDisplayIndex = ref<number | null>(null)\r\nconst pendingColumnDropDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorSide = ref<ColumnDragIndicatorSide | null>(null)\r\nconst isColumnDragging = ref<boolean>(false)\r\nconst columnDragPointerMoveListener = ref<((event: Event) => void) | null>(null)\r\nconst isColumnResizeGesture = ref<boolean>(false)\r\nconst columnResizeGuardHeaderRow = shallowRef<HTMLElement | null>(null)\r\nconst columnResizePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst columnResizePointerUpListener = ref<((event: Event) => void) | null>(null)\r\nconst activeCell = ref<ActiveCell | null>(null)\r\nconst isEditing = ref(false)\r\nconst outsidePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst keyboardListener = ref<((event: KeyboardEvent) => void) | null>(null)\r\nconst editorFocusInListener = ref<((event: FocusEvent) => void) | null>(null)\r\nconst buildProxyData = createTableProxyDataBuilder()\r\nconst editorRegistry = createTableEditorRegistry()\r\n\r\nlet activeCellClassSnapshot: ActiveCell | null = null\r\nlet renderedActiveCell: ActiveCell | null = null\r\nlet renderedCrossHighlight = props.crossHighlight\r\nlet activeCellClassSyncVersion = 0\r\nlet shouldResetActiveCellClasses = false\r\n\r\nconst { changeRef } = useMergedExpose({})\r\n\r\nconst setTableRef = (instance: unknown) => {\r\n tableRef.value = instance as FlTableExpose | null\r\n changeRef(instance)\r\n}\r\n\r\nconst flattenSlotNodes = (nodes: unknown): VNode[] => {\r\n const flatNodes: VNode[] = []\r\n const list = Array.isArray(nodes) ? nodes : []\r\n\r\n const visit = (node: unknown) => {\r\n if (!isVNode(node)) {\r\n return\r\n }\r\n\r\n if (node.type === Comment || node.type === Text) {\r\n return\r\n }\r\n\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n visit(child)\r\n }\r\n return\r\n }\r\n\r\n flatNodes.push(node)\r\n }\r\n\r\n for (const node of list) {\r\n visit(node)\r\n }\r\n\r\n return flatNodes\r\n}\r\n\r\nconst getInternalColumnKey = (sourceIndex: number) => `column-${sourceIndex}`\r\n\r\nconst createColumnOrder = (count: number): number[] =>\r\n Array.from({ length: count }, (_, index) => index)\r\n\r\nconst resolveColumnOrder = (\r\n count: number,\r\n currentOrder: number[] = columnOrder.value\r\n): number[] => {\r\n if (\r\n count <= 0 ||\r\n currentOrder.length !== count ||\r\n new Set(currentOrder).size !== count ||\r\n currentOrder.some((index) => index < 0 || index >= count)\r\n ) {\r\n return createColumnOrder(count)\r\n }\r\n\r\n return currentOrder\r\n}\r\n\r\nconst reorderColumnOrder = (order: number[], oldIndex: number, newIndex: number): number[] => {\r\n if (oldIndex === newIndex) {\r\n return [...order]\r\n }\r\n\r\n const nextOrder = [...order]\r\n const [moved] = nextOrder.splice(oldIndex, 1)\r\n if (moved === undefined) {\r\n return [...order]\r\n }\r\n\r\n nextOrder.splice(newIndex, 0, moved)\r\n return nextOrder\r\n}\r\n\r\nconst tableSlots = computed(() => {\r\n const orderSnapshot = columnOrder.value\r\n const userDefaultSlot = slots.default\r\n\r\n if (!userDefaultSlot) {\r\n return slots\r\n }\r\n\r\n return {\r\n ...slots,\r\n default: (...args: unknown[]) => {\r\n const rawNodes = userDefaultSlot(...args)\r\n const columnNodes = flattenSlotNodes(rawNodes)\r\n if (columnNodes.length === 0) {\r\n return rawNodes\r\n }\r\n\r\n const activeOrder = resolveColumnOrder(columnNodes.length, orderSnapshot)\r\n return activeOrder\r\n .map((sourceIndex) => {\r\n const node = columnNodes[sourceIndex]\r\n if (!node) {\r\n return null\r\n }\r\n\r\n return cloneVNode(node, {\r\n key: node.key ?? `fl-table-column-${sourceIndex}`,\r\n columnKey: getInternalColumnKey(sourceIndex)\r\n })\r\n })\r\n .filter((node): node is VNode => node !== null)\r\n }\r\n }\r\n})\r\n\r\nconst controlledAttrKeys = [\r\n 'class',\r\n 'data',\r\n 'border',\r\n 'stripe',\r\n 'highlightCurrentRow',\r\n 'highlight-current-row',\r\n 'headerRowClassName',\r\n 'header-row-class-name',\r\n 'cellClassName',\r\n 'cell-class-name',\r\n 'headerCellClassName',\r\n 'header-cell-class-name',\r\n 'onCellClick',\r\n 'onCell-click',\r\n 'onRowClick',\r\n 'onSelect',\r\n 'onSelectAll'\r\n]\r\n\r\nconst readAttr = <T = unknown,>(...keys: string[]): T | undefined => {\r\n for (const key of keys) {\r\n if (key in rawAttrs) {\r\n return rawAttrs[key] as T\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nconst normalizeClass = (value: unknown): string[] => {\r\n if (!value) {\r\n return []\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.flatMap((item) => normalizeClass(item))\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value as Record<string, unknown>)\r\n .filter(([, enabled]) => Boolean(enabled))\r\n .map(([name]) => name)\r\n }\r\n\r\n return []\r\n}\r\n\r\nconst mergeClass = (...values: unknown[]): string => {\r\n const classSet = new Set<string>()\r\n for (const item of values.flatMap((value) => normalizeClass(value))) {\r\n classSet.add(item)\r\n }\r\n\r\n return Array.from(classSet).join(' ')\r\n}\r\n\r\nconst resolveBooleanAttr = (defaultValue: boolean, ...keys: string[]): boolean => {\r\n const value = readAttr(...keys)\r\n if (value === undefined) {\r\n return defaultValue\r\n }\r\n\r\n if (value === '') {\r\n return true\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\nconst toNullableIndex = (value: unknown): number | null =>\r\n typeof value === 'number' && Number.isInteger(value) ? value : null\r\n\r\nconst reorderRows = (rows: RowData[], oldIndex: number, newIndex: number): RowData[] => {\r\n if (oldIndex === newIndex) {\r\n return [...rows]\r\n }\r\n\r\n const next = [...rows]\r\n const [moved] = next.splice(oldIndex, 1)\r\n if (!moved) {\r\n return [...rows]\r\n }\r\n\r\n next.splice(newIndex, 0, moved)\r\n return next\r\n}\r\n\r\nconst getTableElement = (): HTMLElement | null => {\r\n const candidate = (tableRef.value as unknown as { $el?: Element | null })?.$el\r\n return candidate instanceof HTMLElement ? candidate : null\r\n}\r\n\r\nconst bindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement) {\r\n tableElement[tableEditorRegistryDomKey] = editorRegistry\r\n }\r\n}\r\n\r\nconst unbindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement?.[tableEditorRegistryDomKey]) {\r\n delete tableElement[tableEditorRegistryDomKey]\r\n }\r\n}\r\n\r\nconst hasSelectionColumn = (): boolean => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n return (\r\n tableElement.querySelector('.el-table__header-wrapper th.el-table-column--selection') !== null\r\n )\r\n}\r\n\r\nconst getSelectionRows = (): RowData[] => {\r\n const rows = tableRef.value?.getSelectionRows?.()\r\n return Array.isArray(rows) ? (rows as RowData[]) : []\r\n}\r\n\r\nconst sourceData = computed<RowData[]>(() => props.data)\r\n\r\nconst tableData = computed<RowData[]>(() => {\r\n if (!props.isEdit) {\r\n return sourceData.value\r\n }\r\n\r\n return buildProxyData({\r\n data: sourceData.value,\r\n rowKeyField: props.rowKeyField,\r\n maxDepth: props.cellProxyMaxDepth,\r\n resolveRowIndex: (row) => sourceData.value.indexOf(row),\r\n onCellChange: (payload: CellChangeEvent) => {\r\n emit('cell-change', payload)\r\n }\r\n })\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next = { ...rawAttrs }\r\n for (const key of controlledAttrKeys) {\r\n delete next[key]\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst readRowKey = (row: RowData): string | number | null => {\r\n const candidate = row[props.rowKeyField]\r\n return typeof candidate === 'string' || typeof candidate === 'number' ? candidate : null\r\n}\r\n\r\nconst isControlColumn = (column: ColumnState | null | undefined): boolean =>\r\n typeof column?.type === 'string' && CONTROL_COLUMN_TYPES.has(column.type)\r\n\r\nconst resolveColumnKey = (\r\n column: ColumnState | null | undefined,\r\n displayIndex: number | null = null\r\n): string | null => {\r\n if (typeof column?.columnKey === 'string' && column.columnKey) {\r\n return column.columnKey\r\n }\r\n\r\n if (typeof column?.rawColumnKey === 'string' && column.rawColumnKey) {\r\n return column.rawColumnKey\r\n }\r\n\r\n if (displayIndex === null) {\r\n return null\r\n }\r\n\r\n const count = Math.max(columnOrder.value.length, displayIndex + 1, visibleColumnCount.value)\r\n const activeOrder = resolveColumnOrder(count)\r\n const sourceIndex = activeOrder[displayIndex] ?? displayIndex\r\n return getInternalColumnKey(sourceIndex)\r\n}\r\n\r\nconst resolveCellDisplayIndex = (cell: Element | null): number | null => {\r\n if (\r\n !(cell instanceof HTMLTableCellElement) ||\r\n !(cell.parentElement instanceof HTMLTableRowElement)\r\n ) {\r\n return null\r\n }\r\n\r\n return Array.from(cell.parentElement.children).indexOf(cell)\r\n}\r\n\r\nconst isRowDragHandleHotzone = (\r\n cell: Element | null,\r\n event: Event,\r\n displayIndex: number | null\r\n) => {\r\n if (\r\n !props.rowDraggable ||\r\n displayIndex !== props.rowDragHandleColumnIndex ||\r\n !(cell instanceof HTMLElement)\r\n ) {\r\n return false\r\n }\r\n\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return false\r\n }\r\n\r\n const rect = cell.getBoundingClientRect()\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return false\r\n }\r\n\r\n return point.x - rect.left <= Math.min(ROW_DRAG_HANDLE_HOTZONE_PX, rect.width)\r\n}\r\n\r\nconst commitActiveCell = (nextActiveCell: ActiveCell | null) => {\r\n activeCellClassSnapshot = nextActiveCell ? { ...nextActiveCell } : null\r\n activeCell.value = nextActiveCell ? { ...nextActiveCell } : null\r\n scheduleActiveCellClassSync()\r\n}\r\n\r\nconst setActiveCell = (\r\n row: RowData,\r\n column: ColumnState | null | undefined,\r\n displayIndex: number\r\n) => {\r\n if (isControlColumn(column)) {\r\n return\r\n }\r\n\r\n const rowKey = readRowKey(row)\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n\r\n if (rowKey === null || !columnKey) {\r\n return\r\n }\r\n\r\n commitActiveCell({\r\n rowKey,\r\n columnKey\r\n })\r\n}\r\n\r\nconst resolveVisibleColumns = (): VisibleColumnEntry[] => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return []\r\n }\r\n\r\n return columns.flatMap((item, displayIndex) => {\r\n const column = item as ColumnState\r\n if (isControlColumn(column)) {\r\n return []\r\n }\r\n\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n if (!columnKey) {\r\n return []\r\n }\r\n\r\n return [\r\n {\r\n displayIndex,\r\n columnKey,\r\n column\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst resolveCellPosition = (\r\n cell: ActiveCell | null,\r\n rows: RowData[] = sourceData.value\r\n): ActiveCellPosition | null => {\r\n if (!cell) {\r\n return null\r\n }\r\n\r\n const rowIndex = rows.findIndex((row) => readRowKey(row) === cell.rowKey)\r\n if (rowIndex < 0) {\r\n return null\r\n }\r\n\r\n const columns = resolveVisibleColumns()\r\n const column = columns.find((item) => item.columnKey === cell.columnKey)\r\n if (!column) {\r\n return null\r\n }\r\n\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n return {\r\n rowIndex,\r\n row,\r\n column,\r\n columns\r\n }\r\n}\r\n\r\nconst resolveActiveCellPosition = (): ActiveCellPosition | null =>\r\n resolveCellPosition(activeCell.value)\r\n\r\nconst getBodyWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__body-wrapper, .el-table__fixed-body-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst isFixedCloneElement = (element: Element | null): boolean =>\r\n Boolean(element?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n\r\nconst resolveBodyCellsByPosition = (rowIndex: number, displayIndex: number): HTMLElement[] =>\r\n getBodyWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr')\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return []\r\n }\r\n\r\n const cell = row.querySelectorAll<HTMLElement>('td.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst pickPrimaryCell = (cells: HTMLElement[]): HTMLElement | null =>\r\n cells.find((cell) => !isFixedCloneElement(cell)) ?? cells[0] ?? null\r\n\r\nconst activeCellClassNames = {\r\n active: ns.e('cross-active'),\r\n row: ns.e('cross-row'),\r\n column: ns.e('cross-column'),\r\n control: ns.e('cross-control-cell')\r\n} as const\r\n\r\ntype ActiveCellClassState = Map<HTMLElement, Set<string>>\r\n\r\nconst getHeaderWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__header-wrapper, .el-table__fixed-header-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst resolveHeaderCellsByPosition = (displayIndex: number): HTMLElement[] =>\r\n getHeaderWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('thead tr')\r\n const row = rows[rows.length - 1]\r\n const cell = row?.querySelectorAll<HTMLElement>('th.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst createActiveCellDomLookup = () => {\r\n const bodyWrappers = getBodyWrappers().map((wrapper) => ({\r\n rows: wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr'),\r\n rowCells: new Map<number, HTMLElement[]>()\r\n }))\r\n\r\n const readRowCells = (\r\n wrapper: (typeof bodyWrappers)[number],\r\n rowIndex: number\r\n ): HTMLElement[] | null => {\r\n const cached = wrapper.rowCells.get(rowIndex)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const row = wrapper.rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n wrapper.rowCells.set(rowIndex, cells)\r\n return cells\r\n }\r\n\r\n return {\r\n resolveBodyCells(rowIndex: number, displayIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) => {\r\n const cell = readRowCells(wrapper, rowIndex)?.[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n },\r\n resolveBodyRowCells(rowIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(readRowCells(wrapper, rowIndex) ?? []).map((cell, displayIndex) => ({\r\n cell,\r\n displayIndex\r\n }))\r\n )\r\n },\r\n resolveBodyColumnCells(displayIndex: number) {\r\n const selector = `tr > td.el-table__cell:nth-child(${displayIndex + 1})`\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(wrapper.rows[0]?.parentElement?.querySelectorAll<HTMLElement>(selector) ?? [])\r\n )\r\n },\r\n resolveHeaderCells: resolveHeaderCellsByPosition\r\n }\r\n}\r\n\r\nconst addActiveCellClass = (\r\n state: ActiveCellClassState,\r\n elements: Iterable<HTMLElement>,\r\n className: string\r\n) => {\r\n for (const element of elements) {\r\n const classes = state.get(element) ?? new Set<string>()\r\n classes.add(className)\r\n state.set(element, classes)\r\n }\r\n}\r\n\r\nconst collectActiveCellClasses = (\r\n cell: ActiveCell | null,\r\n crossHighlight: boolean,\r\n lookup: ReturnType<typeof createActiveCellDomLookup>\r\n): ActiveCellClassState => {\r\n const state: ActiveCellClassState = new Map()\r\n const storeData = readStoreData()\r\n const position = resolveCellPosition(\r\n cell,\r\n Array.isArray(storeData) ? (storeData as RowData[]) : sourceData.value\r\n )\r\n if (!position) {\r\n return state\r\n }\r\n\r\n const activeCells = lookup.resolveBodyCells(position.rowIndex, position.column.displayIndex)\r\n addActiveCellClass(state, activeCells, activeCellClassNames.active)\r\n\r\n if (!crossHighlight) {\r\n return state\r\n }\r\n\r\n const columns = readStoreColumns()\r\n if (Array.isArray(columns)) {\r\n for (const { cell: rowCell, displayIndex } of lookup.resolveBodyRowCells(position.rowIndex)) {\r\n if (displayIndex === position.column.displayIndex) {\r\n continue\r\n }\r\n\r\n addActiveCellClass(\r\n state,\r\n [rowCell],\r\n isControlColumn(columns[displayIndex] as ColumnState)\r\n ? activeCellClassNames.control\r\n : activeCellClassNames.row\r\n )\r\n }\r\n }\r\n\r\n const activeCellSet = new Set(activeCells)\r\n addActiveCellClass(\r\n state,\r\n lookup\r\n .resolveBodyColumnCells(position.column.displayIndex)\r\n .filter((columnCell) => !activeCellSet.has(columnCell)),\r\n activeCellClassNames.column\r\n )\r\n addActiveCellClass(\r\n state,\r\n lookup.resolveHeaderCells(position.column.displayIndex),\r\n activeCellClassNames.column\r\n )\r\n\r\n return state\r\n}\r\n\r\nconst applyActiveCellClassDelta = (previous: ActiveCellClassState, next: ActiveCellClassState) => {\r\n for (const [element, classes] of previous) {\r\n const nextClasses = next.get(element)\r\n for (const className of classes) {\r\n if (!nextClasses?.has(className)) {\r\n element.classList.remove(className)\r\n }\r\n }\r\n }\r\n\r\n for (const [element, classes] of next) {\r\n const previousClasses = previous.get(element)\r\n for (const className of classes) {\r\n if (!previousClasses?.has(className)) {\r\n element.classList.add(className)\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst clearActiveCellClasses = () => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n const selector = Object.values(activeCellClassNames)\r\n .map((className) => `.${className}`)\r\n .join(',')\r\n for (const element of tableElement.querySelectorAll<HTMLElement>(selector)) {\r\n element.classList.remove(...Object.values(activeCellClassNames))\r\n }\r\n}\r\n\r\nconst syncActiveCellClasses = () => {\r\n const nextActiveCell = activeCellClassSnapshot ? { ...activeCellClassSnapshot } : null\r\n const nextCrossHighlight = props.crossHighlight\r\n const lookup = createActiveCellDomLookup()\r\n const nextClasses = collectActiveCellClasses(nextActiveCell, nextCrossHighlight, lookup)\r\n\r\n if (shouldResetActiveCellClasses) {\r\n clearActiveCellClasses()\r\n applyActiveCellClassDelta(new Map(), nextClasses)\r\n } else {\r\n const previousClasses = collectActiveCellClasses(\r\n renderedActiveCell,\r\n renderedCrossHighlight,\r\n lookup\r\n )\r\n applyActiveCellClassDelta(previousClasses, nextClasses)\r\n }\r\n\r\n renderedActiveCell = nextActiveCell\r\n renderedCrossHighlight = nextCrossHighlight\r\n shouldResetActiveCellClasses = false\r\n}\r\n\r\nfunction scheduleActiveCellClassSync(shouldReset = false) {\r\n shouldResetActiveCellClasses ||= shouldReset\r\n const version = ++activeCellClassSyncVersion\r\n void nextTick(() => {\r\n if (version === activeCellClassSyncVersion) {\r\n syncActiveCellClasses()\r\n }\r\n })\r\n}\r\n\r\nconst sortEditorCandidates = (items: TableEditorEndpoint[]): TableEditorEndpoint[] =>\r\n [...items].sort((left, right) => {\r\n const fixedDelta = Number(Boolean(left.isFixedClone)) - Number(Boolean(right.isFixedClone))\r\n if (fixedDelta !== 0) {\r\n return fixedDelta\r\n }\r\n\r\n return (right.priority ?? 0) - (left.priority ?? 0)\r\n })\r\n\r\nconst findEditorsInCells = (cells: HTMLElement[]): TableEditorEndpoint[] =>\r\n sortEditorCandidates(editorRegistry.getEditorsInCells(cells))\r\n\r\nconst findEditorForActiveCell = (): TableEditorEndpoint | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n const cells = resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n return findEditorsInCells(cells)[0] ?? null\r\n}\r\n\r\nconst resolveNextActiveCell = (direction: DirectionKey): ActiveCell | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n if (direction === 'ArrowUp' || direction === 'ArrowDown') {\r\n const nextRowIndex = position.rowIndex + (direction === 'ArrowDown' ? 1 : -1)\r\n const nextRow = sourceData.value[nextRowIndex]\r\n const nextRowKey = nextRow ? readRowKey(nextRow) : null\r\n if (nextRowIndex < 0 || !nextRow || nextRowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey: nextRowKey,\r\n columnKey: position.column.columnKey\r\n }\r\n }\r\n\r\n const currentColumnIndex = position.columns.findIndex(\r\n (item) => item.columnKey === position.column.columnKey\r\n )\r\n if (currentColumnIndex < 0) {\r\n return null\r\n }\r\n\r\n const nextColumnIndex = currentColumnIndex + (direction === 'ArrowRight' ? 1 : -1)\r\n const nextColumn = position.columns[nextColumnIndex]\r\n if (!nextColumn) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(position.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey,\r\n columnKey: nextColumn.columnKey\r\n }\r\n}\r\n\r\nconst scrollActiveCellIntoView = () => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return\r\n }\r\n\r\n const targetCell = pickPrimaryCell(\r\n resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n )\r\n targetCell?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest'\r\n })\r\n}\r\n\r\nconst blurActiveEditor = async () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n await Promise.resolve(editor.close?.())\r\n await Promise.resolve(editor.blur())\r\n isEditing.value = false\r\n}\r\n\r\nconst isActiveEditorPanelOpen = () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor?.isPanelOpen) {\r\n return false\r\n }\r\n\r\n return Boolean(editor.isPanelOpen())\r\n}\r\n\r\nconst resolveSelectionTogglePayload = (\r\n row: RowData,\r\n selectionBefore: RowData[],\r\n selectionAfter: RowData[],\r\n trigger: SelectionRowToggleEvent['trigger']\r\n): SelectionRowToggleEvent => ({\r\n row,\r\n rowIndex: sourceData.value.indexOf(row),\r\n selected: selectionAfter.includes(row),\r\n selectionBefore,\r\n selectionAfter,\r\n trigger\r\n})\r\n\r\nconst handleRowClick = (row: RowData, column: unknown, event: Event) => {\r\n if (props.selectionRowClick && hasSelectionColumn() && tableRef.value) {\r\n const selectionBefore = getSelectionRows()\r\n\r\n if (props.selectionSingle) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n } else {\r\n const nextSelected = !selectionBefore.includes(row)\r\n tableRef.value.toggleRowSelection(row, nextSelected)\r\n }\r\n\r\n const selectionAfter = getSelectionRows()\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selectionBefore, selectionAfter, 'row-click')\r\n )\r\n }\r\n\r\n invokeListener(readAttr('onRowClick'), row, column, event)\r\n}\r\n\r\nconst handleCellClick = (row: RowData, column: ColumnState, cell: Element, event: Event) => {\r\n const displayIndex = resolveCellDisplayIndex(cell)\r\n const isHandleHotzone = isRowDragHandleHotzone(cell, event, displayIndex)\r\n\r\n if (!isHandleHotzone && displayIndex !== null) {\r\n setActiveCell(row, column, displayIndex)\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n invokeListener(readAttr('onCellClick', 'onCell-click'), row, column, cell, event)\r\n}\r\n\r\nconst handleSelect = (selection: RowData[], row: RowData) => {\r\n if (props.selectionSingle && tableRef.value && selection.length > 1) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n\r\n const nextSelection = getSelectionRows()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'multiple-selected',\r\n selection\r\n })\r\n\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selection, nextSelection, 'selection-change')\r\n )\r\n\r\n invokeListener(readAttr('onSelect'), nextSelection, row)\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelect'), selection, row)\r\n}\r\n\r\nconst handleSelectAll = (selection: RowData[]) => {\r\n if (props.selectionSingle && tableRef.value) {\r\n tableRef.value.clearSelection()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'select-all-disabled',\r\n selection\r\n })\r\n\r\n invokeListener(readAttr('onSelectAll'), [])\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelectAll'), selection)\r\n}\r\n\r\nconst resolveHeaderRowClassName = () => {\r\n const baseClass = ns.e('header-row')\r\n const userClassName = readAttr('headerRowClassName', 'header-row-class-name')\r\n\r\n if (typeof userClassName === 'function') {\r\n return (...args: unknown[]) => mergeClass(userClassName(...args), baseClass)\r\n }\r\n\r\n return mergeClass(userClassName, baseClass)\r\n}\r\n\r\nconst resolveCellClassName = () => {\r\n const userCellClassName = readAttr('cellClassName', 'cell-class-name')\r\n\r\n const resolveCrossClass = (scope: CellClassNameScope): string | null => {\r\n const focusCell = activeCellClassSnapshot\r\n if (!focusCell) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(scope.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n if (isControlColumn(scope.column)) {\r\n return props.crossHighlight && rowKey === focusCell.rowKey ? ns.e('cross-control-cell') : null\r\n }\r\n\r\n const columnKey = resolveColumnKey(scope.column, scope.columnIndex)\r\n if (!columnKey) {\r\n return null\r\n }\r\n\r\n const isActiveRow = rowKey === focusCell.rowKey\r\n const isActiveColumn = columnKey === focusCell.columnKey\r\n\r\n if (isActiveRow && isActiveColumn) {\r\n return ns.e('cross-active')\r\n }\r\n\r\n if (!props.crossHighlight) {\r\n return null\r\n }\r\n\r\n if (isActiveRow) {\r\n return ns.e('cross-row')\r\n }\r\n\r\n if (isActiveColumn) {\r\n return ns.e('cross-column')\r\n }\r\n\r\n return null\r\n }\r\n\r\n const resolveByScope = (scope: CellClassNameScope) =>\r\n mergeClass(\r\n typeof userCellClassName === 'function' ? userCellClassName(scope) : userCellClassName,\r\n props.rowDraggable &&\r\n scope.columnIndex === props.rowDragHandleColumnIndex &&\r\n ns.e('row-drag-cell'),\r\n resolveCrossClass(scope)\r\n )\r\n\r\n return (scope: CellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst resolveHeaderCellClassName = () => {\r\n const userHeaderCellClassName = readAttr('headerCellClassName', 'header-cell-class-name')\r\n\r\n const resolveByScope = (scope: HeaderCellClassNameScope) => {\r\n const focusCell = activeCellClassSnapshot\r\n const columnClass =\r\n props.crossHighlight &&\r\n focusCell &&\r\n !isControlColumn(scope.column) &&\r\n resolveColumnKey(scope.column, scope.columnIndex) === focusCell.columnKey\r\n ? ns.e('cross-column')\r\n : null\r\n\r\n return mergeClass(\r\n typeof userHeaderCellClassName === 'function'\r\n ? userHeaderCellClassName(scope)\r\n : userHeaderCellClassName,\r\n columnClass\r\n )\r\n }\r\n\r\n return (scope: HeaderCellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst syncVisibleColumnCount = (headerRow: HTMLElement) => {\r\n const cells = headerRow.querySelectorAll<HTMLElement>('th.el-table__cell')\r\n visibleColumnCount.value = cells.length\r\n}\r\n\r\nconst readStoreColumns = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n columns?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.columns?.value\r\n\r\nconst readStoreData = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n data?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.data?.value\r\n\r\nconst columnStoreSignature = computed(() => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return ''\r\n }\r\n\r\n return columns\r\n .map((column, index) => {\r\n const current = column as ColumnState & { label?: unknown; property?: unknown }\r\n return [\r\n index,\r\n String(current.columnKey ?? ''),\r\n String(current.type ?? ''),\r\n String(current.label ?? ''),\r\n String(current.property ?? '')\r\n ].join(':')\r\n })\r\n .join('|')\r\n})\r\n\r\nconst readStoreColumnCount = (): number => {\r\n const columns = readStoreColumns()\r\n\r\n return Array.isArray(columns) ? columns.length : 0\r\n}\r\n\r\nconst resolveColumnCount = (headerRow: HTMLElement | null, minimumCount = 0): number => {\r\n const headerCount = headerRow?.querySelectorAll<HTMLElement>('th.el-table__cell').length ?? 0\r\n\r\n return Math.max(minimumCount, columnOrder.value.length, readStoreColumnCount(), headerCount)\r\n}\r\n\r\nconst destroyRowSortable = () => {\r\n rowSortable.value?.destroy()\r\n rowSortable.value = null\r\n}\r\n\r\nconst stopColumnResizeGestureReleaseTracking = () => {\r\n if (!columnResizePointerUpListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerup', columnResizePointerUpListener.value)\r\n document.removeEventListener('mouseup', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchend', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchcancel', columnResizePointerUpListener.value)\r\n document.removeEventListener('dragend', columnResizePointerUpListener.value)\r\n columnResizePointerUpListener.value = null\r\n}\r\n\r\nconst clearColumnResizeGesture = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n columnSortable.value?.option?.('disabled', false)\r\n isColumnResizeGesture.value = false\r\n}\r\n\r\nconst unbindColumnResizeGuard = () => {\r\n if (columnResizeGuardHeaderRow.value && columnResizePointerDownListener.value) {\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'pointerdown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'mousedown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'touchstart',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = null\r\n columnResizePointerDownListener.value = null\r\n}\r\n\r\nconst destroyColumnSortable = () => {\r\n clearColumnResizeGesture()\r\n unbindColumnResizeGuard()\r\n columnSortable.value?.destroy()\r\n columnSortable.value = null\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n}\r\n\r\nconst unbindOutsidePointerDown = () => {\r\n if (!outsidePointerDownListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('mousedown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('touchstart', outsidePointerDownListener.value, true)\r\n outsidePointerDownListener.value = null\r\n}\r\n\r\nconst bindOutsidePointerDown = () => {\r\n unbindOutsidePointerDown()\r\n\r\n const listener = (event: Event) => {\r\n if (!activeCell.value) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const target = event.target\r\n const isOverlayTarget =\r\n target instanceof Element &&\r\n Boolean(target.closest('.el-select__popper, .el-picker__popper, .el-popper'))\r\n\r\n if (\r\n !tableElement ||\r\n !(target instanceof Node) ||\r\n tableElement.contains(target) ||\r\n (isEditing.value && isOverlayTarget)\r\n ) {\r\n return\r\n }\r\n\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n outsidePointerDownListener.value = listener\r\n document.addEventListener('pointerdown', listener, true)\r\n document.addEventListener('mousedown', listener, true)\r\n document.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst isDirectionKey = (value: string): value is DirectionKey =>\r\n value === 'ArrowUp' || value === 'ArrowDown' || value === 'ArrowLeft' || value === 'ArrowRight'\r\n\r\nconst isInputActivationKey = (event: KeyboardEvent) =>\r\n event.key.length === 1 ||\r\n event.key === 'Backspace' ||\r\n event.key === 'Delete' ||\r\n event.key === 'Enter' ||\r\n event.key === 'F2'\r\n\r\nconst canHandleKeyEvent = (event: KeyboardEvent) => {\r\n if (!activeCell.value || event.isComposing || event.ctrlKey || event.metaKey || event.altKey) {\r\n return false\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n if (isEditing.value) {\r\n return true\r\n }\r\n\r\n const target = event.target\r\n if (target instanceof Node && tableElement.contains(target)) {\r\n return true\r\n }\r\n\r\n const activeElement = document.activeElement\r\n return (\r\n activeElement === null ||\r\n activeElement === document.body ||\r\n activeElement === document.documentElement ||\r\n (activeElement instanceof Node && tableElement.contains(activeElement))\r\n )\r\n}\r\n\r\nconst syncEditingStateFromTarget = (target: EventTarget | null) => {\r\n if (!activeCell.value) {\r\n isEditing.value = false\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n const root = editor?.getRootEl()\r\n if (root && target instanceof Node && root.contains(target)) {\r\n isEditing.value = true\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (tableElement && target instanceof Node && tableElement.contains(target)) {\r\n isEditing.value = false\r\n }\r\n}\r\n\r\nconst unbindKeyboardListener = () => {\r\n if (!keyboardListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('keydown', keyboardListener.value, true)\r\n keyboardListener.value = null\r\n}\r\n\r\nconst bindKeyboardListener = () => {\r\n unbindKeyboardListener()\r\n\r\n const listener = async (event: KeyboardEvent) => {\r\n if (!canHandleKeyEvent(event)) {\r\n return\r\n }\r\n\r\n if (isDirectionKey(event.key)) {\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n const nextActive = resolveNextActiveCell(event.key)\r\n if (!nextActive) {\r\n return\r\n }\r\n\r\n await blurActiveEditor()\r\n commitActiveCell(nextActive)\r\n await nextTick()\r\n scrollActiveCellIntoView()\r\n return\r\n }\r\n\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n if (!isInputActivationKey(event) || isEditing.value) {\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n const handled = await editor.handoffFirstKey(event)\r\n if (handled) {\r\n isEditing.value = true\r\n }\r\n }\r\n\r\n keyboardListener.value = listener\r\n document.addEventListener('keydown', listener, true)\r\n}\r\n\r\nconst unbindEditorFocusTracking = () => {\r\n if (!editorFocusInListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('focusin', editorFocusInListener.value, true)\r\n editorFocusInListener.value = null\r\n}\r\n\r\nconst bindEditorFocusTracking = () => {\r\n unbindEditorFocusTracking()\r\n\r\n const listener = (event: FocusEvent) => {\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n editorFocusInListener.value = listener\r\n document.addEventListener('focusin', listener, true)\r\n}\r\n\r\nconst readClientPointFromEvent = (event: Event): ClientPoint | null => {\r\n const pointEvent = event as { clientX?: unknown; clientY?: unknown }\r\n if (typeof pointEvent.clientX === 'number' && typeof pointEvent.clientY === 'number') {\r\n return { x: pointEvent.clientX, y: pointEvent.clientY }\r\n }\r\n\r\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\r\n return { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\r\n const touch = event.touches[0] ?? event.changedTouches[0]\r\n return touch\r\n ? {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n : null\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveHeaderCellFromEvent = (event: Event): HTMLElement | null => {\r\n const target = event.target\r\n if (!(target instanceof Element)) {\r\n return null\r\n }\r\n\r\n const headerCell = target.closest('th.el-table__cell')\r\n return headerCell instanceof HTMLElement ? headerCell : null\r\n}\r\n\r\nconst isColumnResizeHotzone = (headerCell: HTMLElement, clientX: number): boolean => {\r\n const rect = headerCell.getBoundingClientRect()\r\n if (rect.width <= 0) {\r\n return false\r\n }\r\n\r\n const hotzoneWidth = Math.min(COLUMN_RESIZE_HOTZONE_PX, rect.width / 2)\r\n return clientX - rect.left <= hotzoneWidth || rect.right - clientX <= hotzoneWidth\r\n}\r\n\r\nconst startColumnResizeGestureReleaseTracking = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n\r\n const listener = () => {\r\n clearColumnResizeGesture()\r\n }\r\n\r\n columnResizePointerUpListener.value = listener\r\n document.addEventListener('pointerup', listener)\r\n document.addEventListener('mouseup', listener)\r\n document.addEventListener('touchend', listener)\r\n document.addEventListener('touchcancel', listener)\r\n document.addEventListener('dragend', listener)\r\n}\r\n\r\nconst bindColumnResizeGuard = (headerRow: HTMLElement) => {\r\n unbindColumnResizeGuard()\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n const headerCell = resolveHeaderCellFromEvent(event)\r\n const hitResizeHotzone =\r\n point !== null && headerCell !== null && isColumnResizeHotzone(headerCell, point.x)\r\n\r\n if (!hitResizeHotzone) {\r\n if (!isColumnDragging.value && isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n }\r\n return\r\n }\r\n\r\n isColumnResizeGesture.value = true\r\n updateColumnDragState(null)\r\n columnSortable.value?.option?.('disabled', true)\r\n startColumnResizeGestureReleaseTracking()\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = headerRow\r\n columnResizePointerDownListener.value = listener\r\n headerRow.addEventListener('pointerdown', listener, true)\r\n headerRow.addEventListener('mousedown', listener, true)\r\n headerRow.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst updateColumnDragState = (state: ColumnDropState | null) => {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n if (!state) {\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n return\r\n }\r\n pendingColumnDropDisplayIndex.value = state.dropDisplayIndex\r\n columnDragIndicatorDisplayIndex.value = state.targetDisplayIndex\r\n columnDragIndicatorSide.value = state.side\r\n if (!tableElement) {\r\n return\r\n }\r\n const indicatorClass = state.side === 'left' ? leftClass : rightClass\r\n const headerCells = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__header-wrapper th.el-table__cell')\r\n )\r\n const headerCell = headerCells[state.targetDisplayIndex]\r\n headerCell?.classList.add(indicatorClass)\r\n\r\n const bodyRows = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__body-wrapper tbody tr')\r\n )\r\n for (const row of bodyRows) {\r\n const bodyCells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n bodyCells[state.targetDisplayIndex]?.classList.add(indicatorClass)\r\n }\r\n}\r\n\r\nconst resolveColumnDropStateByClientPoint = (\r\n point: ClientPoint,\r\n oldIndex: number | null\r\n): ColumnDropState | null => {\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return null\r\n }\r\n\r\n const headerRowRect = headerRow.getBoundingClientRect()\r\n if (\r\n point.x < headerRowRect.left ||\r\n point.x > headerRowRect.right ||\r\n point.y < headerRowRect.top ||\r\n point.y > headerRowRect.bottom\r\n ) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLElement>('th.el-table__cell'))\r\n if (cells.length === 0) {\r\n return null\r\n }\r\n\r\n let targetDisplayIndex = cells.length - 1\r\n for (let index = 0; index < cells.length; index += 1) {\r\n const rect = cells[index].getBoundingClientRect()\r\n if (point.x <= rect.right) {\r\n targetDisplayIndex = index\r\n break\r\n }\r\n }\r\n\r\n const targetCellRect = cells[targetDisplayIndex]?.getBoundingClientRect()\r\n if (!targetCellRect) {\r\n return null\r\n }\r\n\r\n const targetCenterX = targetCellRect.left + targetCellRect.width / 2\r\n const side: ColumnDragIndicatorSide = point.x < targetCenterX ? 'left' : 'right'\r\n\r\n let dropDisplayIndex = targetDisplayIndex + (side === 'right' ? 1 : 0)\r\n if (oldIndex !== null && dropDisplayIndex > oldIndex) {\r\n dropDisplayIndex -= 1\r\n }\r\n const maxIndex = cells.length - 1\r\n return {\r\n dropDisplayIndex: Math.min(Math.max(dropDisplayIndex, 0), maxIndex),\r\n targetDisplayIndex,\r\n side\r\n }\r\n}\r\n\r\nconst startColumnDragPointerTracking = (oldIndex: number | null) => {\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n }\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return\r\n }\r\n\r\n updateColumnDragState(resolveColumnDropStateByClientPoint(point, oldIndex))\r\n }\r\n\r\n columnDragPointerMoveListener.value = listener\r\n document.addEventListener('dragover', listener)\r\n document.addEventListener('pointermove', listener)\r\n document.addEventListener('mousemove', listener)\r\n document.addEventListener('touchmove', listener)\r\n}\r\n\r\nconst initRowSortable = () => {\r\n destroyRowSortable()\r\n\r\n if (!props.rowDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const body = tableElement?.querySelector('.el-table__body-wrapper tbody')\r\n\r\n if (!(body instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n rowSortable.value = Sortable.create(body, {\r\n animation: 180,\r\n draggable: 'tr',\r\n handle: `.${ns.e('row-drag-cell')}`,\r\n onStart: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n row: oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n }\r\n\r\n emit('row-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const newIndex = toNullableIndex(event.newIndex)\r\n const row = oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n row\r\n }\r\n\r\n emit('row-drag-end', payload)\r\n\r\n if (row && oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const orderPayload: RowOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n row,\r\n data: reorderRows(sourceData.value, oldIndex, newIndex)\r\n }\r\n emit('row-order-change', orderPayload)\r\n }\r\n }\r\n })\r\n}\r\n\r\nconst initColumnSortable = () => {\r\n destroyColumnSortable()\r\n\r\n if (!props.columnDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n syncVisibleColumnCount(headerRow)\r\n\r\n columnSortable.value = Sortable.create(headerRow, {\r\n animation: 180,\r\n draggable: 'th.el-table__cell',\r\n sort: false,\r\n onStart: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n return\r\n }\r\n\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n isColumnDragging.value = true\r\n draggingColumnOldDisplayIndex.value = oldIndex\r\n updateColumnDragState(null)\r\n startColumnDragPointerTracking(oldIndex)\r\n const count = resolveColumnCount(headerRow, (oldIndex ?? -1) + 1)\r\n columnDragCount.value = count\r\n const activeOrder = resolveColumnOrder(count)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n columnIndex: oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n }\r\n\r\n emit('column-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n return\r\n }\r\n\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n const oldIndex = toNullableIndex(event.oldIndex) ?? draggingColumnOldDisplayIndex.value\r\n const fallbackNewIndex = toNullableIndex(event.newIndex)\r\n const originalEvent = (event as { originalEvent?: Event }).originalEvent\r\n const point = originalEvent ? readClientPointFromEvent(originalEvent) : null\r\n const pointerState =\r\n point === null\r\n ? null\r\n : resolveColumnDropStateByClientPoint(point, draggingColumnOldDisplayIndex.value)\r\n const newIndex =\r\n pointerState?.dropDisplayIndex ?? pendingColumnDropDisplayIndex.value ?? fallbackNewIndex\r\n const maxDragIndex = Math.max(oldIndex ?? -1, newIndex ?? -1)\r\n const latestHeaderRow = getTableElement()?.querySelector('.el-table__header-wrapper thead tr')\r\n const count = Math.max(\r\n columnDragCount.value ?? 0,\r\n resolveColumnCount(\r\n latestHeaderRow instanceof HTMLElement ? latestHeaderRow : headerRow,\r\n maxDragIndex + 1\r\n )\r\n )\r\n const activeOrder = resolveColumnOrder(count)\r\n const columnIndex = oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex\r\n }\r\n\r\n emit('column-drag-end', payload)\r\n\r\n if (oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const nextOrder = reorderColumnOrder(activeOrder, oldIndex, newIndex)\r\n const movedColumnSourceIndex = activeOrder[oldIndex] ?? oldIndex\r\n columnOrder.value = nextOrder\r\n\r\n const orderPayload: ColumnOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex: movedColumnSourceIndex,\r\n order: nextOrder\r\n }\r\n\r\n emit('column-order-change', orderPayload)\r\n\r\n void nextTick(() => {\r\n const tableElement = getTableElement()\r\n const latestHeaderRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (latestHeaderRow instanceof HTMLElement) {\r\n syncVisibleColumnCount(latestHeaderRow)\r\n }\r\n })\r\n }\r\n\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n updateColumnDragState(null)\r\n }\r\n })\r\n\r\n bindColumnResizeGuard(headerRow)\r\n}\r\n\r\nconst refreshSortables = async () => {\r\n await nextTick()\r\n initRowSortable()\r\n initColumnSortable()\r\n}\r\n\r\nconst mergedTableAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n class: [ns.b(), readAttr('class')],\r\n data: tableData.value,\r\n border: resolveBooleanAttr(true, 'border'),\r\n stripe: resolveBooleanAttr(true, 'stripe'),\r\n highlightCurrentRow: resolveBooleanAttr(true, 'highlightCurrentRow', 'highlight-current-row'),\r\n headerRowClassName: resolveHeaderRowClassName(),\r\n cellClassName: resolveCellClassName(),\r\n headerCellClassName: resolveHeaderCellClassName(),\r\n onCellClick: handleCellClick,\r\n onRowClick: handleRowClick,\r\n onSelect: handleSelect,\r\n onSelectAll: handleSelectAll\r\n}))\r\n\r\nwatch(columnStoreSignature, (next, prev) => {\r\n if (prev !== undefined && next !== prev) {\r\n editorRegistry.invalidate()\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n scheduleActiveCellClassSync(true)\r\n }\r\n})\r\n\r\nwatch(\r\n () => [sourceData.value.length, props.rowKeyField],\r\n () => {\r\n editorRegistry.invalidate()\r\n if (!activeCell.value) {\r\n scheduleActiveCellClassSync(true)\r\n return\r\n }\r\n\r\n const hasActiveRow = sourceData.value.some(\r\n (row) => readRowKey(row) === activeCell.value?.rowKey\r\n )\r\n if (!hasActiveRow) {\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n scheduleActiveCellClassSync(true)\r\n }\r\n)\r\n\r\nwatch(\r\n sourceData,\r\n () => {\r\n editorRegistry.invalidate()\r\n scheduleActiveCellClassSync(true)\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(\r\n () => props.crossHighlight,\r\n () => {\r\n scheduleActiveCellClassSync()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(activeCell, (nextActiveCell) => {\r\n if (!nextActiveCell) {\r\n isEditing.value = false\r\n }\r\n})\r\n\r\nonMounted(() => {\r\n bindEditorRegistryHost()\r\n bindOutsidePointerDown()\r\n bindKeyboardListener()\r\n bindEditorFocusTracking()\r\n scheduleActiveCellClassSync(true)\r\n void refreshSortables()\r\n})\r\n\r\nwatch(\r\n () => [\r\n props.rowDraggable,\r\n props.columnDraggable,\r\n props.rowDragHandleColumnIndex,\r\n sourceData.value.length\r\n ],\r\n () => {\r\n void refreshSortables()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n clearActiveCellClasses()\r\n unbindEditorRegistryHost()\r\n unbindOutsidePointerDown()\r\n unbindKeyboardListener()\r\n unbindEditorFocusTracking()\r\n destroyRowSortable()\r\n destroyColumnSortable()\r\n})\r\n\r\ndefineExpose({} as FlTableExpose)\r\n</script>\r\n","import type { ExtractPublicPropTypes, PropType, Ref } from 'vue'\r\nimport type { TableEditorMode, TableEditorTarget } from './editor-registry'\r\n\r\nexport const tableEditorProps = {\r\n mode: {\r\n type: String as PropType<TableEditorMode>,\r\n required: true\r\n },\r\n targetRef: {\r\n type: Object as PropType<Ref<TableEditorTarget>>,\r\n default: undefined\r\n },\r\n priority: {\r\n type: Number,\r\n default: 0\r\n }\r\n} as const\r\n\r\nexport type TableEditorProps = ExtractPublicPropTypes<typeof tableEditorProps>\r\n\r\nexport type { TableEditorMode, TableEditorTarget }\r\n","<template>\r\n <span ref=\"hostRef\" style=\"display: contents\">\r\n <slot />\r\n </span>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport type { ComponentPublicInstance } from 'vue'\r\nimport { nextTick, onBeforeUnmount, onMounted, ref } from 'vue'\r\nimport type { TableEditorEndpoint, TableEditorRegistry, TableEditorTarget } from './editor-registry'\r\nimport { tableEditorRegistryDomKey } from './editor-registry'\r\nimport { tableEditorProps } from './table-editor'\r\n\r\ndefineOptions({\r\n name: 'FlTableEditor'\r\n})\r\n\r\nconst props = defineProps(tableEditorProps)\r\nconst hostRef = ref<HTMLElement | null>(null)\r\n\r\nconst isTextInput = (\r\n element: Element | null\r\n): element is HTMLInputElement | HTMLTextAreaElement => {\r\n if (!element) {\r\n return false\r\n }\r\n\r\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\r\n return false\r\n }\r\n\r\n return element.type !== 'hidden' && !element.readOnly && !element.disabled\r\n}\r\n\r\nconst resolveTargetValue = (): TableEditorTarget => props.targetRef?.value ?? null\r\n\r\nconst resolveRootFromTarget = (target: TableEditorTarget): HTMLElement | null => {\r\n if (target instanceof HTMLElement) {\r\n return target\r\n }\r\n\r\n const componentTarget = target as (ComponentPublicInstance & { $el?: unknown }) | null\r\n if (componentTarget?.$el instanceof HTMLElement) {\r\n return componentTarget.$el\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveRootEl = (): HTMLElement | null =>\r\n resolveRootFromTarget(resolveTargetValue()) ?? hostRef.value\r\n\r\nconst resolveTextInputFromRoot = (root: HTMLElement | null) => {\r\n if (!root) {\r\n return null\r\n }\r\n\r\n if (isTextInput(root)) {\r\n return root\r\n }\r\n\r\n return root.querySelector<HTMLInputElement | HTMLTextAreaElement>(\r\n 'input:not([type=\"hidden\"]):not([readonly]):not([disabled]), textarea:not([readonly]):not([disabled])'\r\n )\r\n}\r\n\r\nconst resolveFocusableTarget = (root: HTMLElement | null): HTMLElement | null => {\r\n if (!root) {\r\n return null\r\n }\r\n\r\n if (root.tabIndex >= 0) {\r\n return root\r\n }\r\n\r\n return root.querySelector<HTMLElement>(\r\n [\r\n '[role=\"combobox\"]',\r\n '.el-select__wrapper',\r\n '.el-date-editor .el-input__wrapper',\r\n '.el-date-editor input',\r\n 'input:not([type=\"hidden\"])',\r\n 'textarea',\r\n 'button',\r\n '[tabindex]:not([tabindex=\"-1\"])'\r\n ].join(',')\r\n )\r\n}\r\n\r\nconst getInstanceMethod = <TArgs extends unknown[]>(\r\n name: string\r\n): ((...args: TArgs) => unknown) | null => {\r\n const target = resolveTargetValue()\r\n if (!target || target instanceof HTMLElement) {\r\n return null\r\n }\r\n\r\n const candidate = (target as ComponentPublicInstance & Record<string, unknown>)[name]\r\n return typeof candidate === 'function' ? (candidate as (...args: TArgs) => unknown) : null\r\n}\r\n\r\nconst getInstanceBoolean = (name: string): boolean | null => {\r\n const target = resolveTargetValue()\r\n if (!target || target instanceof HTMLElement) {\r\n return null\r\n }\r\n\r\n const candidate = (target as ComponentPublicInstance & Record<string, unknown>)[name]\r\n if (typeof candidate === 'boolean') {\r\n return candidate\r\n }\r\n\r\n if (\r\n typeof candidate === 'object' &&\r\n candidate !== null &&\r\n 'value' in candidate &&\r\n typeof (candidate as { value?: unknown }).value === 'boolean'\r\n ) {\r\n return (candidate as { value: boolean }).value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst hasExpandedTrigger = (root: HTMLElement | null) => {\r\n if (!root) {\r\n return false\r\n }\r\n\r\n if (root.getAttribute('aria-expanded') === 'true') {\r\n return true\r\n }\r\n\r\n return (\r\n root.querySelector(\r\n '[aria-expanded=\"true\"], .el-date-editor.is-focus, .el-range-editor.is-active'\r\n ) !== null\r\n )\r\n}\r\n\r\nconst cloneKeyboardEventInit = (event: KeyboardEvent) => ({\r\n key: event.key,\r\n code: event.code,\r\n location: event.location,\r\n repeat: event.repeat,\r\n ctrlKey: event.ctrlKey,\r\n shiftKey: event.shiftKey,\r\n altKey: event.altKey,\r\n metaKey: event.metaKey,\r\n bubbles: true,\r\n cancelable: true,\r\n composed: true\r\n})\r\n\r\nconst dispatchKeyboardEvent = (target: HTMLElement, event: KeyboardEvent) =>\r\n target.dispatchEvent(new KeyboardEvent('keydown', cloneKeyboardEventInit(event)))\r\n\r\nconst waitForNextMacroTask = () =>\r\n new Promise<void>((resolve) => {\r\n window.setTimeout(resolve, 0)\r\n })\r\n\r\nconst dispatchInputEvents = (\r\n target: HTMLInputElement | HTMLTextAreaElement,\r\n inputType: string,\r\n data: string | null\r\n) => {\r\n target.dispatchEvent(\r\n new InputEvent('input', {\r\n bubbles: true,\r\n data,\r\n inputType\r\n })\r\n )\r\n target.dispatchEvent(new Event('input', { bubbles: true }))\r\n}\r\n\r\nconst insertText = (target: HTMLInputElement | HTMLTextAreaElement, text: string) => {\r\n const start = target.selectionStart ?? target.value.length\r\n const end = target.selectionEnd ?? target.value.length\r\n\r\n target.setRangeText(text, start, end, 'end')\r\n dispatchInputEvents(target, 'insertText', text)\r\n}\r\n\r\nconst deleteText = (\r\n target: HTMLInputElement | HTMLTextAreaElement,\r\n direction: 'backward' | 'forward'\r\n) => {\r\n const start = target.selectionStart ?? target.value.length\r\n const end = target.selectionEnd ?? target.value.length\r\n\r\n if (start !== end) {\r\n target.setRangeText('', start, end, 'start')\r\n } else if (direction === 'backward' && start > 0) {\r\n target.setRangeText('', start - 1, start, 'start')\r\n } else if (direction === 'forward' && end < target.value.length) {\r\n target.setRangeText('', start, start + 1, 'start')\r\n }\r\n\r\n dispatchInputEvents(\r\n target,\r\n direction === 'backward' ? 'deleteContentBackward' : 'deleteContentForward',\r\n null\r\n )\r\n}\r\n\r\nconst focusTextTarget = () => {\r\n const input = resolveTextInputFromRoot(resolveRootEl())\r\n input?.focus()\r\n return input\r\n}\r\n\r\nconst focusControlledTarget = async () => {\r\n const instanceFocus = getInstanceMethod<[]>('focus')\r\n if (instanceFocus) {\r\n await Promise.resolve(instanceFocus())\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n focusTarget?.focus()\r\n return focusTarget\r\n}\r\n\r\nconst focusEditor = async () => {\r\n if (props.mode === 'text') {\r\n focusTextTarget()\r\n return\r\n }\r\n\r\n await focusControlledTarget()\r\n}\r\n\r\nconst blurEditor = async () => {\r\n const activeElement = document.activeElement\r\n const root = resolveRootEl()\r\n\r\n if (activeElement instanceof HTMLElement && root?.contains(activeElement)) {\r\n activeElement.blur()\r\n }\r\n\r\n const instanceBlur = getInstanceMethod<[]>('blur')\r\n if (instanceBlur) {\r\n await Promise.resolve(instanceBlur())\r\n }\r\n}\r\n\r\nconst openEditor = async () => {\r\n const handleOpen = getInstanceMethod<[]>('handleOpen')\r\n if (handleOpen) {\r\n await Promise.resolve(handleOpen())\r\n return\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n if (!focusTarget) {\r\n return\r\n }\r\n\r\n focusTarget.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }))\r\n focusTarget.click()\r\n}\r\n\r\nconst closeEditor = async () => {\r\n const handleClose = getInstanceMethod<[]>('handleClose')\r\n if (handleClose) {\r\n await Promise.resolve(handleClose())\r\n return\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n if (focusTarget) {\r\n focusTarget.dispatchEvent(\r\n new KeyboardEvent('keydown', {\r\n key: 'Escape',\r\n code: 'Escape',\r\n bubbles: true,\r\n cancelable: true\r\n })\r\n )\r\n }\r\n}\r\n\r\nconst isPanelOpen = () => {\r\n const getPanelState = getInstanceMethod<[]>('isPanelOpen')\r\n if (getPanelState) {\r\n return Boolean(getPanelState())\r\n }\r\n\r\n for (const key of ['expanded', 'pickerVisible', 'dropdownMenuVisible', 'visible']) {\r\n const state = getInstanceBoolean(key)\r\n if (state !== null) {\r\n return state\r\n }\r\n }\r\n\r\n return hasExpandedTrigger(resolveRootEl())\r\n}\r\n\r\nconst handoffTextKey = async (event: KeyboardEvent) => {\r\n const input = focusTextTarget()\r\n if (!input) {\r\n return false\r\n }\r\n\r\n dispatchKeyboardEvent(input, event)\r\n\r\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\r\n insertText(input, event.key)\r\n return true\r\n }\r\n\r\n if (event.key === 'Backspace') {\r\n deleteText(input, 'backward')\r\n return true\r\n }\r\n\r\n if (event.key === 'Delete') {\r\n deleteText(input, 'forward')\r\n return true\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === 'F2') {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nconst handoffControlledKey = async (event: KeyboardEvent) => {\r\n const focusTarget = await focusControlledTarget()\r\n await openEditor()\r\n await nextTick()\r\n await waitForNextMacroTask()\r\n\r\n const input = resolveTextInputFromRoot(resolveRootEl())\r\n if (input) {\r\n return handoffTextKey(event)\r\n }\r\n\r\n const target = (document.activeElement as HTMLElement | null) ?? focusTarget\r\n if (!target) {\r\n return false\r\n }\r\n\r\n dispatchKeyboardEvent(target, event)\r\n return true\r\n}\r\n\r\nconst endpoint: TableEditorEndpoint = {\r\n id: Symbol('table-editor'),\r\n getRootEl: () => resolveRootEl(),\r\n focus: () => focusEditor(),\r\n blur: () => blurEditor(),\r\n handoffFirstKey: (event) =>\r\n props.mode === 'text' ? handoffTextKey(event) : handoffControlledKey(event),\r\n isPanelOpen: () => (props.mode === 'controlled' ? isPanelOpen() : false),\r\n open: () => openEditor(),\r\n close: () => closeEditor(),\r\n get isFixedClone() {\r\n return Boolean(resolveRootEl()?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n },\r\n priority: props.priority\r\n}\r\n\r\nlet unregister: (() => void) | null = null\r\n\r\nconst resolveRegistry = async (): Promise<TableEditorRegistry | null> => {\r\n for (let attempt = 0; attempt < 2; attempt += 1) {\r\n const tableRoot = resolveRootEl()?.closest('.fl-table') as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableRoot?.[tableEditorRegistryDomKey]) {\r\n return tableRoot[tableEditorRegistryDomKey] ?? null\r\n }\r\n\r\n await nextTick()\r\n }\r\n\r\n return null\r\n}\r\n\r\nonMounted(() => {\r\n void (async () => {\r\n const registry = await resolveRegistry()\r\n if (!registry) {\r\n return\r\n }\r\n\r\n unregister = registry.register(endpoint)\r\n })()\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n unregister?.()\r\n unregister = null\r\n})\r\n</script>\r\n","<template>\r\n <span ref=\"hostRef\" style=\"display: contents\">\r\n <slot />\r\n </span>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport type { ComponentPublicInstance } from 'vue'\r\nimport { nextTick, onBeforeUnmount, onMounted, ref } from 'vue'\r\nimport type { TableEditorEndpoint, TableEditorRegistry, TableEditorTarget } from './editor-registry'\r\nimport { tableEditorRegistryDomKey } from './editor-registry'\r\nimport { tableEditorProps } from './table-editor'\r\n\r\ndefineOptions({\r\n name: 'FlTableEditor'\r\n})\r\n\r\nconst props = defineProps(tableEditorProps)\r\nconst hostRef = ref<HTMLElement | null>(null)\r\n\r\nconst isTextInput = (\r\n element: Element | null\r\n): element is HTMLInputElement | HTMLTextAreaElement => {\r\n if (!element) {\r\n return false\r\n }\r\n\r\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\r\n return false\r\n }\r\n\r\n return element.type !== 'hidden' && !element.readOnly && !element.disabled\r\n}\r\n\r\nconst resolveTargetValue = (): TableEditorTarget => props.targetRef?.value ?? null\r\n\r\nconst resolveRootFromTarget = (target: TableEditorTarget): HTMLElement | null => {\r\n if (target instanceof HTMLElement) {\r\n return target\r\n }\r\n\r\n const componentTarget = target as (ComponentPublicInstance & { $el?: unknown }) | null\r\n if (componentTarget?.$el instanceof HTMLElement) {\r\n return componentTarget.$el\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveRootEl = (): HTMLElement | null =>\r\n resolveRootFromTarget(resolveTargetValue()) ?? hostRef.value\r\n\r\nconst resolveTextInputFromRoot = (root: HTMLElement | null) => {\r\n if (!root) {\r\n return null\r\n }\r\n\r\n if (isTextInput(root)) {\r\n return root\r\n }\r\n\r\n return root.querySelector<HTMLInputElement | HTMLTextAreaElement>(\r\n 'input:not([type=\"hidden\"]):not([readonly]):not([disabled]), textarea:not([readonly]):not([disabled])'\r\n )\r\n}\r\n\r\nconst resolveFocusableTarget = (root: HTMLElement | null): HTMLElement | null => {\r\n if (!root) {\r\n return null\r\n }\r\n\r\n if (root.tabIndex >= 0) {\r\n return root\r\n }\r\n\r\n return root.querySelector<HTMLElement>(\r\n [\r\n '[role=\"combobox\"]',\r\n '.el-select__wrapper',\r\n '.el-date-editor .el-input__wrapper',\r\n '.el-date-editor input',\r\n 'input:not([type=\"hidden\"])',\r\n 'textarea',\r\n 'button',\r\n '[tabindex]:not([tabindex=\"-1\"])'\r\n ].join(',')\r\n )\r\n}\r\n\r\nconst getInstanceMethod = <TArgs extends unknown[]>(\r\n name: string\r\n): ((...args: TArgs) => unknown) | null => {\r\n const target = resolveTargetValue()\r\n if (!target || target instanceof HTMLElement) {\r\n return null\r\n }\r\n\r\n const candidate = (target as ComponentPublicInstance & Record<string, unknown>)[name]\r\n return typeof candidate === 'function' ? (candidate as (...args: TArgs) => unknown) : null\r\n}\r\n\r\nconst getInstanceBoolean = (name: string): boolean | null => {\r\n const target = resolveTargetValue()\r\n if (!target || target instanceof HTMLElement) {\r\n return null\r\n }\r\n\r\n const candidate = (target as ComponentPublicInstance & Record<string, unknown>)[name]\r\n if (typeof candidate === 'boolean') {\r\n return candidate\r\n }\r\n\r\n if (\r\n typeof candidate === 'object' &&\r\n candidate !== null &&\r\n 'value' in candidate &&\r\n typeof (candidate as { value?: unknown }).value === 'boolean'\r\n ) {\r\n return (candidate as { value: boolean }).value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst hasExpandedTrigger = (root: HTMLElement | null) => {\r\n if (!root) {\r\n return false\r\n }\r\n\r\n if (root.getAttribute('aria-expanded') === 'true') {\r\n return true\r\n }\r\n\r\n return (\r\n root.querySelector(\r\n '[aria-expanded=\"true\"], .el-date-editor.is-focus, .el-range-editor.is-active'\r\n ) !== null\r\n )\r\n}\r\n\r\nconst cloneKeyboardEventInit = (event: KeyboardEvent) => ({\r\n key: event.key,\r\n code: event.code,\r\n location: event.location,\r\n repeat: event.repeat,\r\n ctrlKey: event.ctrlKey,\r\n shiftKey: event.shiftKey,\r\n altKey: event.altKey,\r\n metaKey: event.metaKey,\r\n bubbles: true,\r\n cancelable: true,\r\n composed: true\r\n})\r\n\r\nconst dispatchKeyboardEvent = (target: HTMLElement, event: KeyboardEvent) =>\r\n target.dispatchEvent(new KeyboardEvent('keydown', cloneKeyboardEventInit(event)))\r\n\r\nconst waitForNextMacroTask = () =>\r\n new Promise<void>((resolve) => {\r\n window.setTimeout(resolve, 0)\r\n })\r\n\r\nconst dispatchInputEvents = (\r\n target: HTMLInputElement | HTMLTextAreaElement,\r\n inputType: string,\r\n data: string | null\r\n) => {\r\n target.dispatchEvent(\r\n new InputEvent('input', {\r\n bubbles: true,\r\n data,\r\n inputType\r\n })\r\n )\r\n target.dispatchEvent(new Event('input', { bubbles: true }))\r\n}\r\n\r\nconst insertText = (target: HTMLInputElement | HTMLTextAreaElement, text: string) => {\r\n const start = target.selectionStart ?? target.value.length\r\n const end = target.selectionEnd ?? target.value.length\r\n\r\n target.setRangeText(text, start, end, 'end')\r\n dispatchInputEvents(target, 'insertText', text)\r\n}\r\n\r\nconst deleteText = (\r\n target: HTMLInputElement | HTMLTextAreaElement,\r\n direction: 'backward' | 'forward'\r\n) => {\r\n const start = target.selectionStart ?? target.value.length\r\n const end = target.selectionEnd ?? target.value.length\r\n\r\n if (start !== end) {\r\n target.setRangeText('', start, end, 'start')\r\n } else if (direction === 'backward' && start > 0) {\r\n target.setRangeText('', start - 1, start, 'start')\r\n } else if (direction === 'forward' && end < target.value.length) {\r\n target.setRangeText('', start, start + 1, 'start')\r\n }\r\n\r\n dispatchInputEvents(\r\n target,\r\n direction === 'backward' ? 'deleteContentBackward' : 'deleteContentForward',\r\n null\r\n )\r\n}\r\n\r\nconst focusTextTarget = () => {\r\n const input = resolveTextInputFromRoot(resolveRootEl())\r\n input?.focus()\r\n return input\r\n}\r\n\r\nconst focusControlledTarget = async () => {\r\n const instanceFocus = getInstanceMethod<[]>('focus')\r\n if (instanceFocus) {\r\n await Promise.resolve(instanceFocus())\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n focusTarget?.focus()\r\n return focusTarget\r\n}\r\n\r\nconst focusEditor = async () => {\r\n if (props.mode === 'text') {\r\n focusTextTarget()\r\n return\r\n }\r\n\r\n await focusControlledTarget()\r\n}\r\n\r\nconst blurEditor = async () => {\r\n const activeElement = document.activeElement\r\n const root = resolveRootEl()\r\n\r\n if (activeElement instanceof HTMLElement && root?.contains(activeElement)) {\r\n activeElement.blur()\r\n }\r\n\r\n const instanceBlur = getInstanceMethod<[]>('blur')\r\n if (instanceBlur) {\r\n await Promise.resolve(instanceBlur())\r\n }\r\n}\r\n\r\nconst openEditor = async () => {\r\n const handleOpen = getInstanceMethod<[]>('handleOpen')\r\n if (handleOpen) {\r\n await Promise.resolve(handleOpen())\r\n return\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n if (!focusTarget) {\r\n return\r\n }\r\n\r\n focusTarget.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }))\r\n focusTarget.click()\r\n}\r\n\r\nconst closeEditor = async () => {\r\n const handleClose = getInstanceMethod<[]>('handleClose')\r\n if (handleClose) {\r\n await Promise.resolve(handleClose())\r\n return\r\n }\r\n\r\n const focusTarget = resolveFocusableTarget(resolveRootEl())\r\n if (focusTarget) {\r\n focusTarget.dispatchEvent(\r\n new KeyboardEvent('keydown', {\r\n key: 'Escape',\r\n code: 'Escape',\r\n bubbles: true,\r\n cancelable: true\r\n })\r\n )\r\n }\r\n}\r\n\r\nconst isPanelOpen = () => {\r\n const getPanelState = getInstanceMethod<[]>('isPanelOpen')\r\n if (getPanelState) {\r\n return Boolean(getPanelState())\r\n }\r\n\r\n for (const key of ['expanded', 'pickerVisible', 'dropdownMenuVisible', 'visible']) {\r\n const state = getInstanceBoolean(key)\r\n if (state !== null) {\r\n return state\r\n }\r\n }\r\n\r\n return hasExpandedTrigger(resolveRootEl())\r\n}\r\n\r\nconst handoffTextKey = async (event: KeyboardEvent) => {\r\n const input = focusTextTarget()\r\n if (!input) {\r\n return false\r\n }\r\n\r\n dispatchKeyboardEvent(input, event)\r\n\r\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\r\n insertText(input, event.key)\r\n return true\r\n }\r\n\r\n if (event.key === 'Backspace') {\r\n deleteText(input, 'backward')\r\n return true\r\n }\r\n\r\n if (event.key === 'Delete') {\r\n deleteText(input, 'forward')\r\n return true\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === 'F2') {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nconst handoffControlledKey = async (event: KeyboardEvent) => {\r\n const focusTarget = await focusControlledTarget()\r\n await openEditor()\r\n await nextTick()\r\n await waitForNextMacroTask()\r\n\r\n const input = resolveTextInputFromRoot(resolveRootEl())\r\n if (input) {\r\n return handoffTextKey(event)\r\n }\r\n\r\n const target = (document.activeElement as HTMLElement | null) ?? focusTarget\r\n if (!target) {\r\n return false\r\n }\r\n\r\n dispatchKeyboardEvent(target, event)\r\n return true\r\n}\r\n\r\nconst endpoint: TableEditorEndpoint = {\r\n id: Symbol('table-editor'),\r\n getRootEl: () => resolveRootEl(),\r\n focus: () => focusEditor(),\r\n blur: () => blurEditor(),\r\n handoffFirstKey: (event) =>\r\n props.mode === 'text' ? handoffTextKey(event) : handoffControlledKey(event),\r\n isPanelOpen: () => (props.mode === 'controlled' ? isPanelOpen() : false),\r\n open: () => openEditor(),\r\n close: () => closeEditor(),\r\n get isFixedClone() {\r\n return Boolean(resolveRootEl()?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n },\r\n priority: props.priority\r\n}\r\n\r\nlet unregister: (() => void) | null = null\r\n\r\nconst resolveRegistry = async (): Promise<TableEditorRegistry | null> => {\r\n for (let attempt = 0; attempt < 2; attempt += 1) {\r\n const tableRoot = resolveRootEl()?.closest('.fl-table') as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableRoot?.[tableEditorRegistryDomKey]) {\r\n return tableRoot[tableEditorRegistryDomKey] ?? null\r\n }\r\n\r\n await nextTick()\r\n }\r\n\r\n return null\r\n}\r\n\r\nonMounted(() => {\r\n void (async () => {\r\n const registry = await resolveRegistry()\r\n if (!registry) {\r\n return\r\n }\r\n\r\n unregister = registry.register(endpoint)\r\n })()\r\n})\r\n\r\nonBeforeUnmount(() => {\r\n unregister?.()\r\n unregister = null\r\n})\r\n</script>\r\n","import Table from './src/table.vue'\r\nimport TableEditor from './src/table-editor.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\nimport type { SFCWithInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlTable: SFCWithInstall<typeof Table> = withInstall(Table)\r\nexport const FlTableEditor: SFCWithInstall<typeof TableEditor> = withInstall(TableEditor)\r\n\r\nexport default FlTable\r\n\r\nexport type {\r\n CellChangeEvent,\r\n ColumnDragEvent,\r\n ColumnOrderChangeEvent,\r\n EmitTrigger,\r\n FlTableExpose,\r\n RowData,\r\n RowDragEvent,\r\n RowOrderChangeEvent,\r\n SelectionRowToggleEvent,\r\n SelectionSingleConflictEvent,\r\n TableExpose,\r\n TableEmits,\r\n TableProps\r\n} from './src/table'\r\nexport type { TableEditorMode, TableEditorProps } from './src/table-editor'\r\n"],"x_google_ignoreList":[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,106],"mappings":";;;;AAAA,IAAM,mBAAmB;AACzB,IAAM,cAAc;AAEpB,IAAM,gBACJ,WACA,OACA,cAAc,IACd,UAAU,IACV,WAAW,OACR;CACH,IAAI,YAAY,GAAG,UAAU,GAAG;AAEhC,KAAI,YACF,cAAa,IAAI;AAGnB,KAAI,QACF,cAAa,KAAK;AAGpB,KAAI,SACF,cAAa,KAAK;AAGpB,QAAO;;AAGT,MAAa,gBAAgB,OAAe,YAAY,qBAAqB;CAC3E,MAAM,KAAK,cAAc,OAAO,aAAa,WAAW,OAAO,YAAY;CAE3E,MAAM,KAAK,YAAsB,UAAU,aAAa,WAAW,OAAO,IAAI,QAAQ,GAAG;CAEzF,MAAM,KAAK,aACT,WAAW,aAAa,WAAW,OAAO,IAAI,IAAI,SAAS,GAAG;CAEhE,MAAM,MAAM,aAAsB,YAAqB;AACrD,MAAI,CAAC,eAAe,CAAC,QACnB,QAAO;AAGT,SAAO,aAAa,WAAW,OAAO,aAAa,QAAQ;;CAG7D,MAAM,MAAM,SAAkB,aAAsB;AAClD,MAAI,CAAC,WAAW,CAAC,SACf,QAAO;AAGT,SAAO,aAAa,WAAW,OAAO,IAAI,SAAS,SAAS;;CAG9D,MAAM,MAAM,aAAsB,aAAsB;AACtD,MAAI,CAAC,eAAe,CAAC,SACnB,QAAO;AAGT,SAAO,aAAa,WAAW,OAAO,aAAa,IAAI,SAAS;;CAGlE,MAAM,OAAO,aAAsB,SAAkB,aAAsB;AACzE,MAAI,CAAC,eAAe,CAAC,WAAW,CAAC,SAC/B,QAAO,GAAG;AAGZ,SAAO,aAAa,WAAW,OAAO,aAAa,SAAS,SAAS;;CAGvE,MAAM,MAAM,MAAc,QAAQ,SAAU,QAAQ,GAAG,cAAc,SAAS;AAE9E,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AC3EH,MAAa,wBACX,IACA,SACA,SAAkC,EAAE,KACjC;AACH,KAAI,CAAC,IAAI,WAAW,CAAC,WAAY,OAAO,YAAY,YAAY,OAAO,YAAY,WACjF;AAGF,QAAO,OAAO,GAAG,SAAS,QAAQ,QAAQ;;AAG5C,MAAa,kBAAkB,UAAmB,GAAG,SAAoB;AACvE,KAAI,OAAO,aAAa,YAAY;AAClC,WAAS,GAAG,KAAK;AACjB;;AAGF,KAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B;AAGF,MAAK,MAAM,QAAQ,SACjB,KAAI,OAAO,SAAS,WAClB,MAAK,GAAG,KAAK;;ACxBnB,MAAa,eAA4C,cAAoC;CAC3F,MAAM,cAAc;AAEpB,aAAY,WAAW,QAAa;AAClC,MAAI,CAAC,UAAU,KACb;AAGF,MAAI,UAAU,UAAU,MAAM,UAA+B;;AAG/D,QAAO;;ACLT,MAAa,kBAAkB,EAC7B,OACA,OACA,cACA,iBAC2B;CAE3B,MAAM,YADK,aAAa,MAAM,CACT,GAAG;AAexB,QAAO,EACL,aAdkB,eAAe;EACjC,MAAM,OAAO,EAAE,GAAG,OAAO;EACzB,MAAM,mBAAmB,KAAK;AAC9B,OAAK,QAAQ,CAAC,WAAW,KAAK,MAAM;AAEpC,OAAK,iBAAiB,GAAG,SAAoB;AAC3C,gBAAa,GAAG,KAAK;AACrB,kBAAe,kBAAkB,GAAG,KAAK;;AAG3C,SAAO;GACP,EAID;;AAGH,MAAa,mBAA4D,WAAoB;CAC3F,MAAM,KAAK,oBAAoB;CAE/B,MAAM,aAAa,YAAqB;AACtC,uBAAqB,IAAI,SAAS,OAAO;;AAG3C,QAAO,EACL,WACD;;ACnCH,MAAa,qBAAqB,EAChC,OACA,SACA,0BAA0B,KAAA,QACI;CAC9B,MAAM,yBAAkC;EACtC,MAAM,YAAY,MAAM;AACxB,MAAI,OAAO,cAAc,UACvB,QAAO;AAGT,SAAO;;CAGT,MAAM,wBAAwB;AAC5B,iBAAe,MAAM,wBAAwB,mBAAmB,CAAC;;AAGnE,OACE,UACC,QAAQ,mBAAmB;AAC1B,MAAI,UAAU,mBAAmB,KAC/B,kBAAiB;IAGrB,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL;EACA;EACD;;AIvCH,MAAa,WAAW;;;;QHDK;EAI3B,YAAY;GACV,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS;GACV;EACF;QAS4B,EAI3B,gBAAgB,YAAkC,OAAO,QAAQ,UAAU,UAC5E;;ECfD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EASxB,MAAM,EAAE,cAAc,gBAPJ,EAIhB,WAAW,UACZ,CAE+C;EAChD,MAAM,EAAE,gBAAgB,eAAe;GAC9B;GACP,OAAO;GACP,cAAc;GACd,kBAAkB;AAChB,QAAI,MAAM,UACR,MAAK,eAAe,EAClB,OAAO,MAAM,YACd,CAAC;;GAGP,CAAC;AAEF,WAAa,EAAE,CAA0D;;uBAzCvE,YAA0E,wBAA1D,EAAE,MAAA,SAAQ,EAAA;IAAA,GAAO,MAAA,YAAW;IAAA,KAAO,MAAA,UAAS;IAAA,EAAI,MAAA,MAAK,CAAA,CAAA,CAAA;;;GEE5B;ACD3C,MAAa,gBAAgB;CAI3B,YAAY;EACV,MAAM,CAAC,QAAQ,OAAO;EACtB,SAAS,KAAA;EACV;CAID,gBAAgB;EACd,MAAM;EACN,SAAS;EACV;CAID,YAAY;EACV,MAAM;EACN,SAAS;EACV;CAID,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CAID,aAAa;EACX,MAAM;EACN,SAAS;EACV;CAID,YAAY;EACV,MAAM;EACN,SAAS;EACV;CAID,YAAY;EACV,MAAM;EACN,SAAS;EACV;CACF;AAED,MAAa,gBAAgB;CAI3B,cAAc;CAId,eAAe;CAIf,sBAAsB,UAAmB,OAAO,UAAU;CAC3D;;AGhED,MAAa,WAAW;;;;;;;EFmExB,MAAM,eAAe,IAAI,IAAI;GAC3B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAEF,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,KAAK,aAAa,SAAS;EACjC,MAAM,eAAe,IAAI,MAAM;EAE/B,MAAM,sBAAsB,UAA8B;AACxD,OAAI,CAAC,MACH,QAAO;AAGT,OAAI,OAAO,UAAU,SACnB,QAAO,MACJ,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ,CACf,KAAK,IAAI;AAGd,OAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MACJ,KAAK,SAAS,mBAAmB,KAAK,CAAC,CACvC,OAAO,QAAQ,CACf,KAAK,IAAI,CACT,MAAM;AAGX,UAAO,OAAO,QAAQ,MAAM,CACzB,QAAQ,GAAG,aAAa,QAAQ,CAChC,KAAK,CAAC,eAAe,UAAU,CAC/B,KAAK,IAAI;;EAGd,MAAM,kBAAkB,GAAG,WACzB,OACG,KAAK,SAAS,mBAAmB,KAAK,CAAC,CACvC,OAAO,QAAQ,CACf,KAAK,IAAI,CACT,MAAM;EAEX,MAAM,gBAAgB,eAAuB,gBAAgB,kBAC3D,MAAM,kBAAkB,MAAM;EAEhC,MAAM,sBAAsB,OAAgB,aAA+B;AACzE,OAAI,UAAU,KAAA,EACZ,QAAO;AAGT,OAAI,OAAO,UAAU,UACnB,QAAO;AAGT,OAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,MACH,QAAO;AAGT,WAAO,UAAU;;AAGnB,UAAO,QAAQ,MAAM;;EAMvB,MAAM,oBAAoB;AACxB,QAAK,qBAAqB,MAAM;;EAMlC,MAAM,yBAAyB;AAC7B,gBAAa,QAAQ,CAAC,aAAa;;EAGrC,MAAM,qBAAqB;AACzB,QAAK,SAAS;AACd,gBAAa;;EAGf,MAAM,sBAAsB;AAC1B,QAAK,UAAU;AACf,gBAAa;;EAGf,MAAM,0BAA0B,UAAmB;AACjD,QAAK,qBAAqB,MAAM;AAChC,kBAAe,MAAM,wBAAwB,MAAM;;EAGrD,MAAM,cAAc,eAAe,eAAe,GAAG,GAAG,EAAE,MAAM,MAAoB,CAAC;EACrF,MAAM,oBAAoB,eACxB,eAAe,GAAG,EAAE,SAAS,EAAE,aAAa,gBAAgB,cAAc,CAAe,CAC1F;EACD,MAAM,kBAAkB,eACtB,eAAe,GAAG,EAAE,OAAO,EAAE,aAAa,cAAc,YAAY,CAAe,CACpF;EACD,MAAM,oBAAoB,eACxB,eAAe,GAAG,EAAE,SAAS,EAAE,aAAa,gBAAgB,cAAc,CAAe,CAC1F;EAED,MAAM,YAAY,eAA0C;AAC1D,OAAI,aAAa,MACf;AAGF,OAAI,MAAM,eAAe,KAAA,KAAa,MAAM,eAAe,QAAQ,MAAM,eAAe,GACtF;AAIF,UAAO;IACL,QAFa,OAAO,MAAM,eAAe,WAAW,GAAG,MAAM,WAAW,MAAM,MAAM;IAGpF,WAAW;IACZ;IACD;EAEF,MAAM,gBAAgB,eAAe;GACnC,MAAM,QAAQ,MAAM;AACpB,UAAO,OAAO,UAAU,WAAW,QAAQ;IAC3C;EAEF,MAAM,sBAAsB,eAC1B,mBAAmB,aAAa,gBAAgB,cAAc,EAAE,KAAK,CACtE;EACD,MAAM,yBAAyB,eAC7B,mBAAmB,aAAa,oBAAoB,iBAAiB,EAAE,KAAK,CAC7E;EACD,MAAM,oBAAoB,eAAe,mBAAmB,aAAa,YAAY,EAAE,KAAK,CAAC;EAC7F,MAAM,oBAAoB,eACxB,mBAAmB,aAAa,cAAc,YAAY,EAAE,MAAM,CACnE;EACD,MAAM,qBAAqB,eAAe;GACxC,MAAM,aAAa,aAAa,aAAa;AAC7C,UAAO,OAAO,eAAe,YAAY,aAAa,aAAa;IACnE;EAEF,MAAM,iBAAiB,eAAe;GACpC,MAAM,OAAgC,EAAE;AAExC,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,CAAC,aAAa,IAAI,IAAI,CACxB,MAAK,OAAO;AAIhB,UAAO;IACP;EAEF,MAAM,cAAc,gBAAgB;GAClC,GAAG,eAAe;GAClB,aAAa,oBAAoB;GACjC,WAAW,gBAAgB;GAC3B,OAAO,YAAY;GACnB,gBAAgB,uBAAuB;GACvC,WAAW,kBAAkB;GAC7B,aAAa,kBAAkB;GAC/B,YAAY,aAAa;GACzB,aAAa,kBAAkB;GAC/B,YAAY,MAAM;GAClB,WAAW,kBAAkB;GAC7B,YAAY,mBAAmB;GAC/B,uBAAuB;GACxB,EAAE;EAEH,MAAM,qBAAqB,GAAG,EAAE,iBAAiB;EACjD,MAAM,mBAAmB,GAAG,EAAE,eAAe;EAC7C,MAAM,qBAAqB,GAAG,EAAE,iBAAiB;EACjD,MAAM,wBAAwB,GAAG,EAAE,qBAAqB;EACxD,MAAM,iBAAiB,GAAG,EAAE,aAAa;EACzC,MAAM,qBAAqB,GAAG,EAAE,iBAAiB;EAajD,MAAM,EAAE,cAAc,gBAXJ;GAIhB;GAIA;GACD,CAE+C;AAEhD,WAAa,EAAE,CAA0D;;uBApRvE,YAiDY,wBAjDI,MAAA,SAAQ,CAAA,EAAxB,WAAkC,YAiDtB,OAjDiC,EAAG,KAAK,MAAA,UAAS,EAAA,CAAA,EAAA,YAAA;IACjD,QAAM,cA8BT,CA7BN,mBA6BM,OAAA,EA7BA,OAAK,eAAE,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAC7B,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,iBAAgB,CAAA,EAAA,EAAA,CACf,MAAA,MAAK,CAAC,SAAlB,WAA0C,KAAA,QAAA,UAAA,EAAA,KAAA,GAAA,CAAA,GACzB,MAAA,MAAK,CAAC,QAAvB,WAA6C,KAAA,QAAA,SAAA,EAAA,KAAA,GAAA,CAAA,IAAA,WAAA,EAC7C,mBAA+C,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAAA,gBAA3B,cAAA,MAAa,EAAA,EAAA,CAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAEnC,mBAsBM,OAAA,EAtBA,OAAK,eAAE,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAC7B,mBAYO,QAAA;KAXJ,OAAK,eAAE,MAAA,sBAAqB,CAAA;KAC7B,cAAW;KACX,MAAK;KACL,UAAS;KACT,OAAM;KACL,SAAO;KACP,WAAO,CAAA,SAAA,cAAgB,kBAAgB,CAAA,UAAA,CAAA,EAAA,CAAA,QAAA,CAAA,EAAA,SAAA,cAChB,kBAAgB,CAAA,UAAA,CAAA,EAAA,CAAA,QAAA,CAAA,CAAA;QACxC,YAES,MAAA,OAAA,EAAA,MAAA;4BADO,CAAd,YAAc,MAAA,WAAA,CAAA,CAAA,CAAA;;4BAGlB,YAOyB,MAAA,SAAA,EAAA;KANtB,MAAM,MAAA,MAAK;KACX,OAAK,eAAE,MAAA,sBAAqB,CAAA;KAC7B,cAAW;KACX,MAAA;KACA,OAAM;KACN,MAAK;KACJ,SAAO;;2BAOV,CAFN,mBAEM,OAAA;KAFA,OAAK,eAAE,MAAA,eAAc,CAAA;KAAG,OAAK,eAAE,UAAA,MAAS;QAC5C,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA,CAAA,CAAA;;OAGM,MAAA,MAAK,CAAC,UAAU,MAAM,aAAA;UAAa;sBACP,CAA9B,MAAA,MAAK,CAAC,SAAlB,WAA0C,KAAA,QAAA,UAAA,EAAA,KAAA,GAAA,CAAA,IAAA,WAAA,EAC1C,mBAOM,OAAA;;KAPO,OAAK,eAAE,MAAA,mBAAkB,CAAA;QACpC,YAEY,MAAA,SAAA,EAAA;KAFA,UAAU,MAAM;KAAiB,SAAO;;4BAC5B,CAAA,gBAAA,gBAAnB,MAAM,WAAU,EAAA,EAAA,CAAA,CAAA;;yBAErB,YAEY,MAAA,SAAA,EAAA;KAFA,UAAU,MAAM;KAAiB,MAAK;KAAW,SAAO;;4BAC3C,CAAA,gBAAA,gBAApB,MAAM,YAAW,EAAA,EAAA,CAAA,CAAA;;;;;;;GE3Ca;AIA3C,MAAa,UAAU;;;;QHDK;EAI1B,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,YAAY;GACV,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS;GACV;EACF;QAwB2B;EAI1B,iBAAiB,YACf,OAAO,QAAQ,UAAU,YAAY,OAAO,QAAQ,WAAW;EAIjE,gBAAgB,YACd,OAAO,QAAQ,UAAU,YAAY,OAAO,QAAQ,UAAU;EACjE;;ECjDD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,WAAW;EAgBjB,MAAM,EAAE,cAAc,gBAbJ;GAIhB,WAAW;AACT,YAAQ,IAAI,aAAa;;GAK3B,SAAS;GACV,CAE+C;EAChD,MAAM,EAAE,gBAAgB,eAAe;GACrC,OAAO;GACP,OAAO;GACP,cAAc;GACd,aAAa,GAAG,SAAoB;IAClC,MAAM,QAAQ,KAAK;AACnB,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAK,gBAAgB;MACnB;MACA,QAAQ,MAAM;MACf,CAAC;AAEF,SAAI,MAAM,UACR,MAAK,eAAe;MAClB,OAAO,MAAM;MACb;MACD,CAAC;;;GAIT,CAAC;EAEF,MAAM,mBAAmB,gBAAgB;GACvC,GAAG,YAAY;GACf,OAAO,CAAC,YAAY,MAAM,OAAO;IAAE,YAAY,MAAM;IAAS,YAAY,MAAM;IAAS,CAAC;GAC3F,EAAE;EAEH,MAAM,wBAAwB;AAC5B,kBAAe,SAAS,wBAAwB,GAAG;;AAGrD,cACQ,MAAM,UACX,SAAS,oBAAoB;AAC5B,OAAI,WAAW,oBAAoB,KACjC,kBAAiB;KAGrB,EAAE,WAAW,MAAM,CACpB;AAED,WAAa,EAAE,CAAyD;;uBA9EtE,YAA8E,wBAA9D,EAAE,MAAA,QAAO,EAAA;IAAA,GAAO,iBAAA;IAAgB,KAAO,MAAA,UAAS;IAAA,EAAI,MAAA,MAAK,CAAA,CAAA,CAAA;;;GEElC;AIAzC,MAAa,gBAAgB;;;;QHSK;EAIhC,YAAY;GACV,MAAM,CAAC,QAAQ,OAAO;GACtB,SAAS;GACV;EAID,OAAO;GACL,MAAM;GACN,SAAS;GACV;EAID,UAAU;GACR,MAAM;GACN,SAAS,KAAA;GACV;EAID,WAAW;GACT,MAAM;GACN,UAAU;GACX;EAID,aAAa;GACX,MAAM;GACN,SAAS;GACV;EAID,UAAU;GACR,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,wBAAwB;GACtB,MAAM;GACN,SAAS;GACV;EACF;QAyBiC;EAIhC,sBAAsB,UACpB,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU;EAIlE,iBAAiB,UAAkB,OAAO,UAAU;EAIpD,aAAa,YACX,OAAO,QAAQ,YAAY,aAC1B,QAAQ,WAAW,YAAY,QAAQ,WAAW,mBAClD,QAAQ,YAAY,KAAA,KAAa,MAAM,QAAQ,QAAQ,QAAQ;EAIlE,qBAAqB,YACnB,OAAO,QAAQ,UAAU,YACzB,QAAQ,WAAW,YAClB,QAAQ,UAAU,QACjB,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,UAAU;EAI7B,iBAAiB,YAA6C,OAAO,QAAQ,YAAY;EAIzF,QAAQ,YACN,QAAQ,WAAW,kBACnB,QAAQ,WAAW,sBACnB,QAAQ,WAAW;EACtB;;ECjGD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,KAAK,aAAa,eAAe;EAEvC,MAAM,WAAW,IAA0B,KAAK;EAChD,MAAM,aAAa,IAAI,MAAM,MAAM;EACnC,MAAM,YAAY,IAAI,MAAM;EAC5B,MAAM,oBAAoB,IAAI,EAAE;EAChC,MAAM,iBAAiB,IAAI,MAAM,MAAM;EACvC,MAAM,iBAAiB,IAAwB,MAAM,WAAW;EAEhE,MAAM,aAAa,eAAe,CAChC,GAAG,GAAG,EACN;GACE,YAAY,MAAM;GAClB,YAAY,MAAM;GACnB,CACF,CAAC;EAEF,MAAM,qBAAqB,GAAG,EAAE,UAAU;EAE1C,MAAM,kBAAkB,UAA4B,OAAO,UAAU,WAAW,QAAQ;EAExF,MAAM,kBAAkB,UAAuC;AAC7D,OAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,SAClE,QAAO;AAGT,UAAO;;EAGT,MAAM,gBAAgB,OAA2B,UAAkB;AACjE,kBAAe,QAAQ;AACvB,kBAAe,QAAQ;;EAGzB,MAAM,kBAAkB,WAA0D;AAChF,cAAW,QAAQ;AACnB,gBAAa,MAAM,GAAG;AAEtB,QAAK,qBAAqB,KAAK;AAC/B,QAAK,gBAAgB,GAAG;AACxB,QAAK,SAAS,EAAE,QAAQ,CAAC;;EAG3B,MAAM,mBAAmB,WAAsC;GAC7D,MAAM,YAAY,eAAe,OAAO,MAAM;GAC9C,MAAM,YAAY,eAAe,OAAO,MAAM;AAE9C,cAAW,QAAQ;AACnB,gBAAa,WAAW,UAAU;AAElC,QAAK,qBAAqB,UAAU;AACpC,QAAK,gBAAgB,UAAU;AAC/B,QAAK,oBAAoB;IACvB,OAAO;IACP,OAAO;IACP,QAAQ;IACT,CAAC;;EAGJ,MAAM,eAAe,UAAkB;GACrC,MAAM,YAAY,eAAe,MAAM;AACvC,cAAW,QAAQ;AACnB,QAAK,gBAAgB,UAAU;;EAGjC,MAAM,2BAA2B;AAC/B,QAAK,cAAc;IACjB,SAAS,WAAW,MAAM,MAAM;IAChC,QAAQ;IACT,CAAC;;EAGJ,MAAM,cAAc,YAAY;AAC9B,OAAI,UAAU,MACZ;GAGF,MAAM,UAAU,WAAW,MAAM,MAAM;AACvC,OAAI,CAAC,QACH;AAGF,OAAI,CAAC,MAAM,UAAU;AACnB,SAAK,cAAc;KACjB;KACA,QAAQ;KACT,CAAC;AACF;;GAGF,MAAM,eAAe,kBAAkB,QAAQ;AAC/C,qBAAkB,QAAQ;AAC1B,aAAU,QAAQ;AAElB,OAAI;IACF,MAAM,WAAW,MAAM,MAAM,SAAS,QAAQ;AAC9C,QAAI,iBAAiB,kBAAkB,MACrC;IAGF,MAAM,UAAU,MAAM,QAAQ,SAAS,GAAG,WAAW,EAAE;AAEvD,QAAI,QAAQ,WAAW,GAAG;AACxB,qBAAgB,MAAM,UAAU,QAAQ,GAAG,CAAC;AAC5C;;AAGF,QAAI,QAAQ,SAAS,EACnB,MAAK,cAAc;KACjB;KACA,QAAQ;KACR;KACD,CAAC;YAEG,OAAO;AACd,QAAI,iBAAiB,kBAAkB,MACrC;AAGF,SAAK,gBAAgB;KACnB;KACA;KACD,CAAC;aACM;AACR,QAAI,iBAAiB,kBAAkB,MACrC,WAAU,QAAQ;;;EAKxB,MAAM,0BAA0B;AAC9B,kBAAe,eAAe;;EAGhC,MAAM,mBAAmB;AACvB,OAAI,UAAU,MACZ;GAGF,MAAM,eAAe,WAAW;AAChC,OAAI,iBAAiB,eAAe,MAClC;AAGF,OAAI,CAAC,cAAc;AACjB,mBAAe,eAAe;AAC9B;;AAGF,OAAI,MAAM,uBACR,gBAAe,mBAAmB;;EAItC,MAAM,cAAc;AAClB,YAAS,OAAO,OAAO;;EAGzB,MAAM,aAAa;AACjB,YAAS,OAAO,MAAM;;EAGxB,MAAM,cAAc;AAClB,YAAS,OAAO,OAAO;;AAGzB,cACQ,MAAM,QACX,UAAU;AACT,cAAW,QAAQ;IAEtB;AAED,cACQ,MAAM,aACX,UAAU;AACT,OAAI,UAAU,eAAe,MAC3B;AAGF,gBAAa,eAAe,MAAM,EAAE,MAAM,MAAM;IAEnD;AAED,cACQ,MAAM,UACX,SAAS,oBAAoB;AAC5B,OAAI,WAAW,oBAAoB,KACjC,gBAAe,QAAQ;KAG3B,EAAE,WAAW,MAAM,CACpB;AAED,WAAa;GACX;GACA;GACA;GACD,CAAC;;uBAvPA,YAyBW,MAAA,QAAA,EAAA;aAxBL;IAAJ,KAAI;IACH,OAAK,eAAE,WAAA,MAAU;IACjB,WAAW,MAAM;IACjB,UAAU,MAAM,YAAY,UAAA;IAC5B,eAAa,WAAA;IACb,aAAa,MAAM;IACnB,QAAM;IACN,SAAO;IACP,WAAO,SAAA,cAAgB,aAAW,CAAA,UAAA,CAAA,EAAA,CAAA,QAAA,CAAA;IAClC,uBAAoB;;IACV,QAAM,cAYR,CAXP,mBAWO,QAAA;KAVJ,OAAK,eAAE,MAAA,mBAAkB,CAAA;KAC1B,cAAW;KACX,MAAK;KACL,UAAS;KACR,SAAO;KACP,aAAS,OAAA,OAAA,OAAA,KAAA,oBAAV,IAAkB,CAAA,UAAA,CAAA;QAClB,YAGU,MAAA,OAAA,EAAA,EAHA,OAAK,eAAE,MAAA,GAAE,CAAC,GAAE,WAAY,UAAA,MAAS,CAAA,EAAA,EAAA;4BACb,CAAb,UAAA,SAAA,WAAA,EAAf,YAA4B,MAAA,QAAA,EAAA,EAAA,KAAA,GAAA,CAAA,KAAA,WAAA,EAC5B,YAAiB,MAAA,OAAA,EAAA,EAAA,KAAA,GAAA,CAAA,EAAA,CAAA;;;;;;;;;;;;;;GEnB0B;ACDrD,MAAa,8BAA8B;CAAC;CAAS;CAAS;CAAS;AGCvE,MAAa,gBAAgB;;;;QHGK;EAIhC,YAAY;GACV,MAAM,CAAC,QAAQ,OAAO;GACtB,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS;GACV;EAID,eAAe;GACb,MAAM;GACN,SAAS;GACT,YAAY,UACV,4BAA4B,SAAS,MAAoC;GAC5E;EAID,UAAU;GACR,MAAM;GACN,SAAS;GACV;EAID,wBAAwB;GACtB,MAAM;GACN,SAAS;GACV;EACF;QA4BiC;EAIhC,sBAAsB,UAAyB,UAAU,QAAQ,OAAO,UAAU;EAIlF,mBAAmB,UAAmB,OAAO,UAAU;EAIvD,iBAAiB,YACf,OAAO,QAAQ,aAAa,aAC3B,QAAQ,UAAU,QAAQ,OAAO,QAAQ,UAAU;EAItD,iBAAiB,YACf,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,cAAc,YAC7B,OAAO,QAAQ,oBAAoB;EACtC;;ECjFD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,KAAK,aAAa,eAAe;EACvC,MAAM,WAAW;EAEjB,MAAM,eAAe,IAAI,GAAG;EAC5B,MAAM,oBAAoB,IAAI,MAAM;EACpC,MAAM,YAAY,IAAI,MAAM;EAE5B,MAAM,iBAAiB,eAAe;AACpC,OAAI,CAAC,OAAO,SAAS,MAAM,UAAU,IAAI,MAAM,YAAY,EACzD,QAAO;AAGT,UAAO,KAAK,MAAM,MAAM,UAAU;IAClC;EAEF,MAAM,sBAAsB,eAAe;AACzC,OAAI,kBAAkB,MACpB,QAAO,MAAM;GAGf,MAAM,YAAY,SAAS;AAC3B,UAAO,OAAO,cAAc,WAAW,YAAY,KAAA;IACnD;EAEF,MAAM,gBAAgB,eAAe,MAAM,WAAW,kBAAkB,MAAM;EAE9E,MAAM,kBAAkB,IAAI,IAAe;GACzC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAEF,MAAM,yBAAyB,IAAI,KAAK,aAAa,SAAS;GAC5D,aAAa;GACb,uBAAuB;GACxB,CAAC;EAEF,MAAM,aAAa,UAAqC;AACtD,OAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU,GACrD,QAAO;AAGT,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,SAAS,MAAM,GAAG,QAAQ;AAG1C,OAAI,OAAO,UAAU,SACnB,QAAO;GAGT,MAAM,UAAU,MAAM,MAAM;AAC5B,OAAI,CAAC,QACH,QAAO;AAGT,OAAI,CAAC,0BAA0B,KAAK,QAAQ,CAC1C,QAAO;GAGT,MAAM,OAAO,OAAO,QAAQ;AAC5B,UAAO,OAAO,SAAS,KAAK,GAAG,OAAO;;EAGxC,MAAM,eAAe,UAA0B;AAC7C,OAAI,OAAO,GAAG,OAAO,GAAG,CACtB,QAAO;AAGT,UAAO,GAAG;;EAGZ,MAAM,2BAAwC,UAAU;GACtD,MAAM,eAAe,UAAU,MAAM;AACrC,OAAI,iBAAiB,KACnB,QAAO;AAGT,UAAO,uBAAuB,OAAO,aAAa;;EAGpD,MAAM,wBAAkC,UAAU,MAAM,QAAQ,MAAM,GAAG,CAAC,MAAM;EAEhF,MAAM,wBAAwB,UAA0B;AACtD,OAAI,CAAC,MACH,QAAO;GAGT,IAAI,WAAW,MAAM,QAAQ,YAAY,GAAG;GAC5C,MAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,cAAW,SAAS,QAAQ,MAAM,GAAG;GAErC,MAAM,WAAW,SAAS,QAAQ,IAAI;AACtC,OAAI,aAAa,GAGf,YAAW,GAFS,SAAS,MAAM,GAAG,SAAS,CAErB,GADN,SAAS,MAAM,WAAW,EAAE,CAAC,QAAQ,OAAO,GAAG;AAIrE,UAAO,GAAG,aAAa,MAAM,KAAK;;EAGpC,MAAM,mBAAmB,UAA2B,UAAU,OAAO,UAAU,OAAO,UAAU;EAEhG,MAAM,uBAAuB,UAA0B;GACrD,MAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,OAAI,WAAW,EACb,QAAO;AAGT,UAAO,MAAM,MAAM,WAAW,EAAE,CAAC;;EAGnC,MAAM,kBACJ,OACA,MACA,cACW;AACX,OAAI,YAAY,EACd,QAAO;AAGT,OAAI,SAAS,QACX,QAAO,OAAO,MAAM,QAAQ,UAAU,CAAC;AAGzC,OAAI,SAAS,SAAS;IACpB,MAAM,SAAS,MAAM;AACrB,WAAO,KAAK,MAAM,QAAQ,OAAO,GAAG;;AAGtC,UAAO;;EAGT,MAAM,kBAAkB,UAAyB;AAC/C,QAAK,qBAAqB,MAAM;;EAGlC,MAAM,wBAAwB,WAAoB;AAChD,OAAI,kBAAkB,UAAU,OAC9B;AAGF,qBAAkB,QAAQ;AAC1B,QAAK,kBAAkB,OAAO;;EAGhC,MAAM,wBAAwB;AAC5B,kBAAe,KAAK;AACpB,gBAAa,QAAQ;;EAGvB,MAAM,wBAAwB,UAAyB;AACrD,OAAI,UAAU,MAAM;AAClB,iBAAa,QAAQ;AACrB;;AAGF,gBAAa,QAAQ,YAAY,MAAM;;EAGzC,MAAM,uBAAuB,UAAkB,UAAyB;AACtE,QAAK,gBAAgB;IAAE;IAAU;IAAO,CAAC;;EAG3C,MAAM,eAAe,UAAmB;GAEtC,MAAM,YAAY,qBADJ,OAAO,UAAU,WAAW,QAAQ,GACL;AAC7C,gBAAa,QAAQ;AAErB,OAAI,kBAAkB,MACpB,sBAAqB,MAAM;AAG7B,OAAI,CAAC,aAAa,gBAAgB,UAAU,EAAE;AAC5C,mBAAe,KAAK;AACpB,wBAAoB,WAAW,KAAK;AACpC;;GAGF,MAAM,eAAe,UAAU,UAAU;AACzC,OAAI,iBAAiB,MAAM;AACzB,qBAAiB;AACjB,wBAAoB,IAAI,KAAK;AAC7B;;AAGF,kBAAe,aAAa;AAC5B,uBAAoB,WAAW,aAAa;;EAG9C,MAAM,qBAAqB,UAAkB,oBAA4B;AACvE,QAAK,gBAAgB;IACnB;IACA,WAAW,eAAe;IAC1B;IACD,CAAC;AACF,wBAAqB,KAAK;AAC1B,oBAAiB;;EAGnB,MAAM,gBAAgB,UAAmB;GACvC,MAAM,QAAQ,OAAO,UAAU,WAAW,qBAAqB,MAAM,GAAG;AAExE,OAAI,CAAC,SAAS,gBAAgB,MAAM,EAAE;AACpC,qBAAiB;AACjB;;GAGF,MAAM,eAAe,UAAU,MAAM;AACrC,OAAI,iBAAiB,MAAM;AACzB,qBAAiB;AACjB;;GAGF,MAAM,kBAAkB,oBAAoB,MAAM;AAClD,OAAI,kBAAkB,eAAe,SAAS,MAAM,kBAAkB,UAAU;AAC9E,sBAAkB,OAAO,gBAAgB;AACzC;;GAGF,MAAM,YAAY,eAAe,cAAc,MAAM,eAAe,eAAe,MAAM;AACzF,kBAAe,UAAU;AACzB,wBAAqB,MAAM;AAC3B,wBAAqB,UAAU;;EAGjC,MAAM,eAAe,QAAoB;AACvC,aAAU,QAAQ;GAElB,MAAM,UAAU,UAAU,MAAM,WAAW;AAC3C,OAAI,YAAY,KACd,cAAa,QAAQ,YAAY,QAAQ;AAG3C,kBAAe,SAAS,SAAS,IAAI;;EAGvC,MAAM,cAAc,QAAoB;AACtC,aAAU,QAAQ;AAGlB,wBADgB,UAAU,MAAM,WAAW,CACd;AAC7B,kBAAe,SAAS,QAAQ,IAAI;;EAGtC,MAAM,yBAAoC;GACxC,MAAM,YAAY,SAAS;AAC3B,OAAI,OAAO,cAAc,YAAY,gBAAgB,IAAI,UAAuB,CAC9E,QAAO;AAGT,UAAO;;EAGT,MAAM,yBAAkD;AACtD,OAAI,CAAC,MAAM,YAAY,UAAU,MAC/B;GAGF,MAAM,YAAY,SAAS;AAC3B,OAAI,OAAO,cAAc,WACvB,QAAO;AAGT,UAAO;;EAGT,MAAM,sBAA4C;AAChD,OAAI,CAAC,MAAM,YAAY,UAAU,MAC/B;GAGF,MAAM,SAAS,SAAS;AACxB,OAAI,OAAO,WAAW,WACpB,QAAO;AAGT,OAAI,OAAO,SAAS,cAAc,WAChC;AAGF,UAAO;;EAGT,MAAM,mBAAmB,eAAe;GACtC,MAAM,wBAAwB,SAAS;GACvC,MAAM,yBAAyB,SAAS;AAExC,UAAO;IACL,GAAG;IACH,OAAO;KACL,GAAG,GAAG;KACN,SAAS;KACT;MACE,YAAY,cAAc;MAC1B,YAAY,MAAM;MACnB;KACF;IACD,YAAY,aAAa;IACzB,aAAa,oBAAoB;IACjC,WAAW,kBAAkB;IAC7B,WAAW,kBAAkB;IAC7B,QAAQ,eAAe;IACvB,uBAAuB,KAAA;IACvB,UAAU,UAAkB;AAC1B,iBAAY,MAAM;AAClB,oBAAe,uBAAuB,MAAM;;IAE9C,WAAW,UAAkB;AAC3B,kBAAa,MAAM;AACnB,oBAAe,wBAAwB,MAAM;;IAE/C,SAAS;IACT,QAAQ;IACT;IACD;AAEF,cACQ,MAAM,aACX,UAAU;GACT,MAAM,eAAe,UAAU,MAAM;AAErC,OAAI,iBAAiB,MAAM;AACzB,iBAAa,QAAQ;AACrB,QAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,UAAU,GACrD,gBAAe,KAAK;AAEtB;;AAGF,OAAI,OAAO,UAAU,SACnB,gBAAe,aAAa;AAG9B,wBAAqB,aAAa;KAEpC,EAAE,WAAW,MAAM,CACpB;AAED,cACQ,MAAM,UACX,SAAS,oBAAoB;AAC5B,OAAI,WAAW,oBAAoB,KACjC,kBAAiB;KAGrB,EAAE,WAAW,MAAM,CACpB;AAED,cACQ,MAAM,gBACN;AAEJ,wBADqB,UAAU,MAAM,WAAW,CACd;IAErC;EAeD,MAAM,EAAE,cAAc,gBAbJ;GAIhB,WAAW;AACT,YAAQ,IAAI,aAAa;;GAK3B,SAAS;GACV,CAE+C;AAEhD,WAAa,EAAE,CAAyD;;uBAvZtE,YAIY,wBAJI,MAAA,QAAO,CAAA,EAAvB,WAAiC,iBAIrB,OAJqC,EAAG,KAAK,MAAA,UAAS,EAAA,CAAA,EAAA,YAAA,EAAA,GAAA,GAAA,EAAA,CAAA,WAC9B,MAAA,MAAK,GAArB,GAAG,aAAQ;;WAAqC;kBAAY,cAAS,CACrF,WAAkD,KAAA,QAArC,UAAQ,eAAA,mBAAU,aAAS,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;GEAO;AIArD,MAAa,eAAe;;;;QHCK;EAI/B,YAAY;GACV,MAAM;IAAC;IAAQ;IAAQ;IAAM;IAAM;GACnC,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EACF;QAEgC,EAI/B,sBAAsB,WAA8B,MACrD;;EChBD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,WAAW;EAEjB,MAAM,EAAE,cAAc,gBAAgB,EAAE,CAAC;EACzC,MAAM,EAAE,gBAAgB,eAAe;GACrC,OAAO;GACP,OAAO;GACP,cAAc;GACf,CAAC;EAEF,MAAM,oBAAoB,UAA6B;AACrD,OAAI,MAAM,SAAS;AACjB,SAAK,qBAAqB,KAAK;AAC/B;;AAGF,QAAK,qBAAqB,MAAM;;EAGlC,MAAM,wBAAwB,gBAAgB;GAC5C,GAAG,YAAY;GACf,YAAY,MAAM;GAClB,uBAAuB;GACvB,OAAO,CAAC,YAAY,MAAM,OAAO;IAAE,YAAY,MAAM;IAAS,YAAY,MAAM;IAAS,CAAC;GAC3F,EAAE;EAEH,MAAM,wBAAwB;AAC5B,QAAK,qBAAqB,KAAK;;AAGjC,cACQ,MAAM,UACX,SAAS,oBAAoB;AAC5B,OAAI,WAAW,oBAAoB,KACjC,kBAAiB;KAGrB,EAAE,WAAW,MAAM,CACpB;AAED,WAAa,EAAE,CAA2C;;uBA3DxD,YAAwF,wBAAxE,EAAE,MAAA,aAAY,EAAA;IAAA,GAAO,sBAAA;IAAqB,KAAO,MAAA,UAAS;IAAA,EAAI,MAAA,MAAK,CAAA,CAAA,CAAA;;;GEElC;;ACCnD,QAAO,UAAU,WAAY;AAC3B,SAAO,OAAO,YAAY,cAAc,QAAQ,aAAa,QAAQ,UAAU;;;;CCLjF,IAAI;CACJ,IAAM,kBAAkB;EACtB;EACA;EAAI;EAAI;EAAI;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC1C;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC7C;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EACtD;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EACvD;AAQD,SAAQ,gBAAgB,SAASA,gBAAe,WAAS;AACvD,MAAI,CAACC,UAAS,OAAM,IAAI,MAAM,0CAAwC;AACtE,MAAIA,YAAU,KAAKA,YAAU,GAAI,OAAM,IAAI,MAAM,8CAA4C;AAC7F,SAAOA,YAAU,IAAI;;AASvB,SAAQ,0BAA0B,SAAS,wBAAyB,WAAS;AAC3E,SAAO,gBAAgBA;;AASzB,SAAQ,cAAc,SAAU,MAAM;EACpC,IAAI,QAAQ;AAEZ,SAAO,SAAS,GAAG;AACjB;AACA,aAAU;;AAGZ,SAAO;;AAGT,SAAQ,oBAAoB,SAAS,kBAAmB,GAAG;AACzD,MAAI,OAAO,MAAM,WACf,OAAM,IAAI,MAAM,0CAAwC;AAG1D,mBAAiB;;AAGnB,SAAQ,qBAAqB,WAAY;AACvC,SAAO,OAAO,mBAAmB;;AAGnC,SAAQ,SAAS,SAAS,OAAQ,SAAO;AACvC,SAAO,eAAeC,QAAM;;;;AC7D9B,SAAQ,IAAI,EAAE,KAAK,GAAG;AACtB,SAAQ,IAAI,EAAE,KAAK,GAAG;AACtB,SAAQ,IAAI,EAAE,KAAK,GAAG;AACtB,SAAQ,IAAI,EAAE,KAAK,GAAG;CAEtB,SAASC,aAAY,QAAQ;AAC3B,MAAI,OAAO,WAAW,SACpB,OAAM,IAAI,MAAM,wBAAwB;AAK1C,UAFc,OAAO,aAAa,EAElC;GACE,KAAK;GACL,KAAK,MACH,QAAO,QAAQ;GAEjB,KAAK;GACL,KAAK,SACH,QAAO,QAAQ;GAEjB,KAAK;GACL,KAAK,WACH,QAAO,QAAQ;GAEjB,KAAK;GACL,KAAK,OACH,QAAO,QAAQ;GAEjB,QACE,OAAM,IAAI,MAAM,uBAAuB,OAAO;;;AAIpD,SAAQ,UAAU,SAAS,QAAS,OAAO;AACzC,SAAO,SAAS,OAAO,MAAM,QAAQ,eACnC,MAAM,OAAO,KAAK,MAAM,MAAM;;AAGlC,SAAQ,OAAO,SAAS,KAAM,OAAO,cAAc;AACjD,MAAI,QAAQ,QAAQ,MAAM,CACxB,QAAO;AAGT,MAAI;AACF,UAAOA,aAAW,MAAM;WACjB,GAAG;AACV,UAAO;;;;;CC/CX,SAASC,cAAa;AACpB,OAAK,SAAS,EAAE;AAChB,OAAK,SAAS;;AAGhB,aAAU,YAAY;EAEpB,KAAK,SAAU,SAAO;GACpB,MAAM,WAAW,KAAK,MAAMC,UAAQ,EAAE;AACtC,WAAS,KAAK,OAAO,cAAe,IAAIA,UAAQ,IAAM,OAAO;;EAG/D,KAAK,SAAU,KAAK,QAAQ;AAC1B,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,MAAK,QAAS,QAAS,SAAS,IAAI,IAAM,OAAO,EAAE;;EAIvD,iBAAiB,WAAY;AAC3B,UAAO,KAAK;;EAGd,QAAQ,SAAU,KAAK;GACrB,MAAM,WAAW,KAAK,MAAM,KAAK,SAAS,EAAE;AAC5C,OAAI,KAAK,OAAO,UAAU,SACxB,MAAK,OAAO,KAAK,EAAE;AAGrB,OAAI,IACF,MAAK,OAAO,aAAc,QAAU,KAAK,SAAS;AAGpD,QAAK;;EAER;AAED,QAAO,UAAUD;;;CC/BjB,SAASE,YAAW,MAAM;AACxB,MAAI,CAAC,QAAQ,OAAO,EAClB,OAAM,IAAI,MAAM,oDAAoD;AAGtE,OAAK,OAAO;AACZ,OAAK,OAAO,IAAI,WAAW,OAAO,KAAK;AACvC,OAAK,cAAc,IAAI,WAAW,OAAO,KAAK;;AAYhD,aAAU,UAAU,MAAM,SAAU,KAAK,KAAK,OAAO,UAAU;EAC7D,MAAMC,UAAQ,MAAM,KAAK,OAAO;AAChC,OAAK,KAAKA,WAAS;AACnB,MAAI,SAAU,MAAK,YAAYA,WAAS;;AAU1C,aAAU,UAAU,MAAM,SAAU,KAAK,KAAK;AAC5C,SAAO,KAAK,KAAK,MAAM,KAAK,OAAO;;AAWrC,aAAU,UAAU,MAAM,SAAU,KAAK,KAAK,OAAO;AACnD,OAAK,KAAK,MAAM,KAAK,OAAO,QAAQ;;AAUtC,aAAU,UAAU,aAAa,SAAU,KAAK,KAAK;AACnD,SAAO,KAAK,YAAY,MAAM,KAAK,OAAO;;AAG5C,QAAO,UAAUD;;;CCtDjB,IAAME,kBAAAA,iBAAAA,CAAmC;AAgBzC,SAAQ,kBAAkB,SAAS,gBAAiB,WAAS;AAC3D,MAAIC,cAAY,EAAG,QAAO,EAAE;EAE5B,MAAM,WAAW,KAAK,MAAMA,YAAU,EAAE,GAAG;EAC3C,MAAM,OAAOD,gBAAcC,UAAQ;EACnC,MAAM,YAAY,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO,OAAO,IAAI,WAAW,GAAG,GAAG;EACpF,MAAM,YAAY,CAAC,OAAO,EAAE;AAE5B,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,GAAG,IAChC,WAAU,KAAK,UAAU,IAAI,KAAK;AAGpC,YAAU,KAAK,EAAE;AAEjB,SAAO,UAAU,SAAS;;AAuB5B,SAAQ,eAAe,SAAS,aAAc,WAAS;EACrD,MAAM,SAAS,EAAE;EACjB,MAAM,MAAM,QAAQ,gBAAgBA,UAAQ;EAC5C,MAAM,YAAY,IAAI;AAEtB,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAC7B,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;AAElC,OAAK,MAAM,KAAK,MAAM,KACjB,MAAM,KAAK,MAAM,YAAY,KAC7B,MAAM,YAAY,KAAK,MAAM,EAChC;AAGF,UAAO,KAAK,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC;;AAIjC,SAAO;;;;CCjFT,IAAM,gBAAA,iBAAA,CAAmC;CACzC,IAAM,sBAAsB;AAS5B,SAAQ,eAAe,SAAS,aAAc,WAAS;EACrD,MAAM,OAAO,cAAcC,UAAQ;AAEnC,SAAO;GAEL,CAAC,GAAG,EAAE;GAEN,CAAC,OAAO,qBAAqB,EAAE;GAE/B,CAAC,GAAG,OAAO,oBAAoB;GAChC;;;;AChBH,SAAQ,WAAW;EACjB,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACb;CAMD,IAAM,gBAAgB;EACpB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL;AAQD,SAAQ,UAAU,SAAS,QAAS,MAAM;AACxC,SAAO,QAAQ,QAAQ,SAAS,MAAM,CAAC,MAAM,KAAK,IAAI,QAAQ,KAAK,QAAQ;;AAU7E,SAAQ,OAAO,SAAS,KAAM,OAAO;AACnC,SAAO,QAAQ,QAAQ,MAAM,GAAG,SAAS,OAAO,GAAG,GAAG,KAAA;;AAUxD,SAAQ,eAAe,SAAS,aAAc,MAAM;EAClD,MAAM,OAAO,KAAK;EAClB,IAAI,SAAS;EACb,IAAI,eAAe;EACnB,IAAI,eAAe;EACnB,IAAI,UAAU;EACd,IAAI,UAAU;AAEd,OAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,kBAAe,eAAe;AAC9B,aAAU,UAAU;AAEpB,QAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;IACnC,IAAIC,WAAS,KAAK,IAAI,KAAK,IAAI;AAC/B,QAAIA,aAAW,QACb;SACK;AACL,SAAI,gBAAgB,EAAG,WAAU,cAAc,MAAM,eAAe;AACpE,eAAUA;AACV,oBAAe;;AAGjB,eAAS,KAAK,IAAI,KAAK,IAAI;AAC3B,QAAIA,aAAW,QACb;SACK;AACL,SAAI,gBAAgB,EAAG,WAAU,cAAc,MAAM,eAAe;AACpE,eAAUA;AACV,oBAAe;;;AAInB,OAAI,gBAAgB,EAAG,WAAU,cAAc,MAAM,eAAe;AACpE,OAAI,gBAAgB,EAAG,WAAU,cAAc,MAAM,eAAe;;AAGtE,SAAO;;AAQT,SAAQ,eAAe,SAAS,aAAc,MAAM;EAClD,MAAM,OAAO,KAAK;EAClB,IAAI,SAAS;AAEb,OAAK,IAAI,MAAM,GAAG,MAAM,OAAO,GAAG,MAChC,MAAK,IAAI,MAAM,GAAG,MAAM,OAAO,GAAG,OAAO;GACvC,MAAM,OAAO,KAAK,IAAI,KAAK,IAAI,GAC7B,KAAK,IAAI,KAAK,MAAM,EAAE,GACtB,KAAK,IAAI,MAAM,GAAG,IAAI,GACtB,KAAK,IAAI,MAAM,GAAG,MAAM,EAAE;AAE5B,OAAI,SAAS,KAAK,SAAS,EAAG;;AAIlC,SAAO,SAAS,cAAc;;AAShC,SAAQ,eAAe,SAAS,aAAc,MAAM;EAClD,MAAM,OAAO,KAAK;EAClB,IAAI,SAAS;EACb,IAAI,UAAU;EACd,IAAI,UAAU;AAEd,OAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,aAAU,UAAU;AACpB,QAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,cAAY,WAAW,IAAK,OAAS,KAAK,IAAI,KAAK,IAAI;AACvD,QAAI,OAAO,OAAO,YAAY,QAAS,YAAY,IAAQ;AAE3D,cAAY,WAAW,IAAK,OAAS,KAAK,IAAI,KAAK,IAAI;AACvD,QAAI,OAAO,OAAO,YAAY,QAAS,YAAY,IAAQ;;;AAI/D,SAAO,SAAS,cAAc;;AAWhC,SAAQ,eAAe,SAAS,aAAc,MAAM;EAClD,IAAI,YAAY;EAChB,MAAM,eAAe,KAAK,KAAK;AAE/B,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK,cAAa,KAAK,KAAK;AAI9D,SAFU,KAAK,IAAI,KAAK,KAAM,YAAY,MAAM,eAAgB,EAAE,GAAG,GAAG,GAE7D,cAAc;;CAW3B,SAAS,UAAW,aAAa,GAAG,GAAG;AACrC,UAAQ,aAAR;GACE,KAAK,QAAQ,SAAS,WAAY,SAAQ,IAAI,KAAK,MAAM;GACzD,KAAK,QAAQ,SAAS,WAAY,QAAO,IAAI,MAAM;GACnD,KAAK,QAAQ,SAAS,WAAY,QAAO,IAAI,MAAM;GACnD,KAAK,QAAQ,SAAS,WAAY,SAAQ,IAAI,KAAK,MAAM;GACzD,KAAK,QAAQ,SAAS,WAAY,SAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE,IAAI,MAAM;GACzF,KAAK,QAAQ,SAAS,WAAY,QAAQ,IAAI,IAAK,IAAK,IAAI,IAAK,MAAM;GACvE,KAAK,QAAQ,SAAS,WAAY,SAAS,IAAI,IAAK,IAAK,IAAI,IAAK,KAAK,MAAM;GAC7E,KAAK,QAAQ,SAAS,WAAY,SAAS,IAAI,IAAK,KAAK,IAAI,KAAK,KAAK,MAAM;GAE7E,QAAS,OAAM,IAAI,MAAM,qBAAqB,YAAY;;;AAU9D,SAAQ,YAAY,SAAS,UAAW,SAAS,MAAM;EACrD,MAAM,OAAO,KAAK;AAElB,OAAK,IAAI,MAAM,GAAG,MAAM,MAAM,MAC5B,MAAK,IAAI,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,OAAI,KAAK,WAAW,KAAK,IAAI,CAAE;AAC/B,QAAK,IAAI,KAAK,KAAK,UAAU,SAAS,KAAK,IAAI,CAAC;;;AAWtD,SAAQ,cAAc,SAAS,YAAa,MAAM,iBAAiB;EACjE,MAAM,cAAc,OAAO,KAAK,QAAQ,SAAS,CAAC;EAClD,IAAI,cAAc;EAClB,IAAI,eAAe;AAEnB,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,mBAAgB,EAAE;AAClB,WAAQ,UAAU,GAAG,KAAK;GAG1B,MAAM,UACJ,QAAQ,aAAa,KAAK,GAC1B,QAAQ,aAAa,KAAK,GAC1B,QAAQ,aAAa,KAAK,GAC1B,QAAQ,aAAa,KAAK;AAG5B,WAAQ,UAAU,GAAG,KAAK;AAE1B,OAAI,UAAU,cAAc;AAC1B,mBAAe;AACf,kBAAc;;;AAIlB,SAAO;;;;CCxOT,IAAMC,YAAAA,gCAAAA;CAEN,IAAM,kBAAkB;EAEtB;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAG;EACT;EAAG;EAAG;EAAI;EACV;EAAG;EAAG;EAAI;EACV;EAAG;EAAG;EAAI;EACV;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAG;EAAI;EAAI;EACX;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACb;CAED,IAAM,qBAAqB;EAEzB;EAAG;EAAI;EAAI;EACX;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAI;EACZ;EAAI;EAAI;EAAK;EACb;EAAI;EAAI;EAAK;EACb;EAAI;EAAK;EAAK;EACd;EAAI;EAAK;EAAK;EACd;EAAI;EAAK;EAAK;EACd;EAAI;EAAK;EAAK;EACd;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAK;EACf;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAK;EAAM;EAChB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EACjB;EAAK;EAAM;EAAM;EAClB;AAUD,SAAQ,iBAAiB,SAAS,eAAgB,WAAS,sBAAsB;AAC/E,UAAQ,sBAAR;GACE,KAAKA,UAAQ,EACX,QAAO,iBAAiBC,YAAU,KAAK,IAAI;GAC7C,KAAKD,UAAQ,EACX,QAAO,iBAAiBC,YAAU,KAAK,IAAI;GAC7C,KAAKD,UAAQ,EACX,QAAO,iBAAiBC,YAAU,KAAK,IAAI;GAC7C,KAAKD,UAAQ,EACX,QAAO,iBAAiBC,YAAU,KAAK,IAAI;GAC7C,QACE;;;AAYN,SAAQ,yBAAyB,SAAS,uBAAwB,WAAS,sBAAsB;AAC/F,UAAQ,sBAAR;GACE,KAAKD,UAAQ,EACX,QAAO,oBAAoBC,YAAU,KAAK,IAAI;GAChD,KAAKD,UAAQ,EACX,QAAO,oBAAoBC,YAAU,KAAK,IAAI;GAChD,KAAKD,UAAQ,EACX,QAAO,oBAAoBC,YAAU,KAAK,IAAI;GAChD,KAAKD,UAAQ,EACX,QAAO,oBAAoBC,YAAU,KAAK,IAAI;GAChD,QACE;;;;;CCpIN,IAAM,YAAY,IAAI,WAAW,IAAI;CACrC,IAAM,YAAY,IAAI,WAAW,IAAI;AASpC,EAAC,SAAS,aAAc;EACvB,IAAI,IAAI;AACR,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,aAAU,KAAK;AACf,aAAU,KAAK;AAEf,SAAM;AAIN,OAAI,IAAI,IACN,MAAK;;AAQT,OAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IACzB,WAAU,KAAK,UAAU,IAAI;KAE9B;AAQH,SAAQ,MAAM,SAAS,IAAK,GAAG;AAC7B,MAAI,IAAI,EAAG,OAAM,IAAI,MAAM,SAAS,IAAI,IAAI;AAC5C,SAAO,UAAU;;AASnB,SAAQ,MAAM,SAAS,IAAK,GAAG;AAC7B,SAAO,UAAU;;AAUnB,SAAQ,MAAM,SAAS,IAAK,GAAG,GAAG;AAChC,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAI/B,SAAO,UAAU,UAAU,KAAK,UAAU;;;;CCnE5C,IAAM,KAAA,sBAAA;AASN,SAAQ,MAAM,SAAS,IAAK,IAAI,IAAI;EAClC,MAAM,QAAQ,IAAI,WAAW,GAAG,SAAS,GAAG,SAAS,EAAE;AAEvD,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,IAC7B,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,IAC7B,OAAM,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG;AAIxC,SAAO;;AAUT,SAAQ,MAAM,SAAS,IAAK,UAAU,SAAS;EAC7C,IAAI,SAAS,IAAI,WAAW,SAAS;AAErC,SAAQ,OAAO,SAAS,QAAQ,UAAW,GAAG;GAC5C,MAAM,QAAQ,OAAO;AAErB,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,QAAO,MAAM,GAAG,IAAI,QAAQ,IAAI,MAAM;GAIxC,IAAI,SAAS;AACb,UAAO,SAAS,OAAO,UAAU,OAAO,YAAY,EAAG;AACvD,YAAS,OAAO,MAAM,OAAO;;AAG/B,SAAO;;AAUT,SAAQ,uBAAuB,SAAS,qBAAsB,QAAQ;EACpE,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC;AAC9B,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,QAAO,QAAQ,IAAI,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAG1D,SAAO;;;;CC5DT,IAAM,aAAA,oBAAA;CAEN,SAASC,qBAAoB,QAAQ;AACnC,OAAK,UAAU,KAAA;AACf,OAAK,SAAS;AAEd,MAAI,KAAK,OAAQ,MAAK,WAAW,KAAK,OAAO;;AAS/C,sBAAmB,UAAU,aAAa,SAAS,WAAY,QAAQ;AAErE,OAAK,SAAS;AACd,OAAK,UAAU,WAAW,qBAAqB,KAAK,OAAO;;AAS7D,sBAAmB,UAAU,SAAS,SAAS,OAAQ,MAAM;AAC3D,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0BAA0B;EAK5C,MAAM,aAAa,IAAI,WAAW,KAAK,SAAS,KAAK,OAAO;AAC5D,aAAW,IAAI,KAAK;EAIpB,MAAM,YAAY,WAAW,IAAI,YAAY,KAAK,QAAQ;EAK1D,MAAM,QAAQ,KAAK,SAAS,UAAU;AACtC,MAAI,QAAQ,GAAG;GACb,MAAM,OAAO,IAAI,WAAW,KAAK,OAAO;AACxC,QAAK,IAAI,WAAW,MAAM;AAE1B,UAAO;;AAGT,SAAO;;AAGT,QAAO,UAAUA;;;ACjDjB,SAAQ,UAAU,SAAS,QAAS,WAAS;AAC3C,SAAO,CAAC,MAAMC,UAAQ,IAAIA,aAAW,KAAKA,aAAW;;;;CCPvD,IAAM,UAAU;CAChB,IAAM,eAAe;CACrB,IAAI,QAAQ;AAIZ,SAAQ,MAAM,QAAQ,MAAM,MAAM;CAElC,IAAM,OAAO,+BAA+B,QAAQ;AAEpD,SAAQ,QAAQ,IAAI,OAAO,OAAO,IAAI;AACtC,SAAQ,aAAa,IAAI,OAAO,yBAAyB,IAAI;AAC7D,SAAQ,OAAO,IAAI,OAAO,MAAM,IAAI;AACpC,SAAQ,UAAU,IAAI,OAAO,SAAS,IAAI;AAC1C,SAAQ,eAAe,IAAI,OAAO,cAAc,IAAI;CAEpD,IAAM,6BAAa,IAAI,OAAO,MAAM,QAAQ,IAAI;CAChD,IAAM,+BAAe,IAAI,OAAO,MAAM,UAAU,IAAI;CACpD,IAAM,oCAAoB,IAAI,OAAO,yBAAyB;AAE9D,SAAQ,YAAY,SAAS,UAAW,KAAK;AAC3C,SAAO,WAAW,KAAK,IAAI;;AAG7B,SAAQ,cAAc,SAAS,YAAa,KAAK;AAC/C,SAAO,aAAa,KAAK,IAAI;;AAG/B,SAAQ,mBAAmB,SAAS,iBAAkB,KAAK;AACzD,SAAO,kBAAkB,KAAK,IAAI;;;;CC7BpC,IAAMC,iBAAAA,uBAAAA;CACN,IAAMC,UAAAA,eAAAA;AASN,SAAQ,UAAU;EAChB,IAAI;EACJ,KAAK;EACL,QAAQ;GAAC;GAAI;GAAI;GAAG;EACrB;AAWD,SAAQ,eAAe;EACrB,IAAI;EACJ,KAAK;EACL,QAAQ;GAAC;GAAG;GAAI;GAAG;EACpB;AAOD,SAAQ,OAAO;EACb,IAAI;EACJ,KAAK;EACL,QAAQ;GAAC;GAAG;GAAI;GAAG;EACpB;AAWD,SAAQ,QAAQ;EACd,IAAI;EACJ,KAAK;EACL,QAAQ;GAAC;GAAG;GAAI;GAAG;EACpB;AAQD,SAAQ,QAAQ,EACd,KAAK,IACN;AAUD,SAAQ,wBAAwB,SAAS,sBAAuB,MAAM,WAAS;AAC7E,MAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,mBAAmB,KAAK;AAE1D,MAAI,CAACD,eAAa,QAAQE,UAAQ,CAChC,OAAM,IAAI,MAAM,sBAAsBA,UAAQ;AAGhD,MAAIA,aAAW,KAAKA,YAAU,GAAI,QAAO,KAAK,OAAO;WAC5CA,YAAU,GAAI,QAAO,KAAK,OAAO;AAC1C,SAAO,KAAK,OAAO;;AASrB,SAAQ,qBAAqB,SAAS,mBAAoB,SAAS;AACjE,MAAID,QAAM,YAAY,QAAQ,CAAE,QAAO,QAAQ;WACtCA,QAAM,iBAAiB,QAAQ,CAAE,QAAO,QAAQ;WAChDA,QAAM,UAAU,QAAQ,CAAE,QAAO,QAAQ;MAC7C,QAAO,QAAQ;;AAStB,SAAQ,WAAW,SAAS,SAAU,MAAM;AAC1C,MAAI,QAAQ,KAAK,GAAI,QAAO,KAAK;AACjC,QAAM,IAAI,MAAM,eAAe;;AASjC,SAAQ,UAAU,SAAS,QAAS,MAAM;AACxC,SAAO,QAAQ,KAAK,OAAO,KAAK;;CASlC,SAAS,WAAY,QAAQ;AAC3B,MAAI,OAAO,WAAW,SACpB,OAAM,IAAI,MAAM,wBAAwB;AAK1C,UAFc,OAAO,aAAa,EAElC;GACE,KAAK,UACH,QAAO,QAAQ;GACjB,KAAK,eACH,QAAO,QAAQ;GACjB,KAAK,QACH,QAAO,QAAQ;GACjB,KAAK,OACH,QAAO,QAAQ;GACjB,QACE,OAAM,IAAI,MAAM,mBAAmB,OAAO;;;AAYhD,SAAQ,OAAO,SAAS,KAAM,OAAO,cAAc;AACjD,MAAI,QAAQ,QAAQ,MAAM,CACxB,QAAO;AAGT,MAAI;AACF,UAAO,WAAW,MAAM;WACjB,GAAG;AACV,UAAO;;;;;CCpKX,IAAME,UAAAA,iBAAAA;CACN,IAAMC,WAAAA,+BAAAA;CACN,IAAMC,YAAAA,gCAAAA;CACN,IAAMC,SAAAA,cAAAA;CACN,IAAM,eAAA,uBAAA;CAGN,IAAM,MAAM;CACZ,IAAM,UAAUH,QAAM,YAAY,IAAI;CAEtC,SAAS,4BAA6B,MAAM,QAAQ,sBAAsB;AACxE,OAAK,IAAI,iBAAiB,GAAG,kBAAkB,IAAI,iBACjD,KAAI,UAAU,QAAQ,YAAY,gBAAgB,sBAAsB,KAAK,CAC3E,QAAO;;CAOb,SAAS,qBAAsB,MAAM,WAAS;AAE5C,SAAOG,OAAK,sBAAsB,MAAMC,UAAQ,GAAG;;CAGrD,SAAS,0BAA2B,UAAU,WAAS;EACrD,IAAI,YAAY;AAEhB,WAAS,QAAQ,SAAU,MAAM;GAC/B,MAAM,eAAe,qBAAqB,KAAK,MAAMA,UAAQ;AAC7D,gBAAa,eAAe,KAAK,eAAe;IAChD;AAEF,SAAO;;CAGT,SAAS,2BAA4B,UAAU,sBAAsB;AACnE,OAAK,IAAI,iBAAiB,GAAG,kBAAkB,IAAI,iBAEjD,KADe,0BAA0B,UAAU,eAAe,IACpD,QAAQ,YAAY,gBAAgB,sBAAsBD,OAAK,MAAM,CACjF,QAAO;;AAeb,SAAQ,OAAO,SAAS,KAAM,OAAO,cAAc;AACjD,MAAI,aAAa,QAAQ,MAAM,CAC7B,QAAO,SAAS,OAAO,GAAG;AAG5B,SAAO;;AAYT,SAAQ,cAAc,SAAS,YAAa,WAAS,sBAAsB,MAAM;AAC/E,MAAI,CAAC,aAAa,QAAQC,UAAQ,CAChC,OAAM,IAAI,MAAM,0BAA0B;AAI5C,MAAI,OAAO,SAAS,YAAa,QAAOD,OAAK;EAS7C,MAAM,0BANiBH,QAAM,wBAAwBI,UAAQ,GAGpCH,SAAO,uBAAuBG,WAAS,qBAAqB,IAGhB;AAErE,MAAI,SAASD,OAAK,MAAO,QAAO;EAEhC,MAAM,aAAa,yBAAyB,qBAAqB,MAAMC,UAAQ;AAG/E,UAAQ,MAAR;GACE,KAAKD,OAAK,QACR,QAAO,KAAK,MAAO,aAAa,KAAM,EAAE;GAE1C,KAAKA,OAAK,aACR,QAAO,KAAK,MAAO,aAAa,KAAM,EAAE;GAE1C,KAAKA,OAAK,MACR,QAAO,KAAK,MAAM,aAAa,GAAG;GAEpC,KAAKA,OAAK;GACV,QACE,QAAO,KAAK,MAAM,aAAa,EAAE;;;AAYvC,SAAQ,wBAAwB,SAAS,sBAAuB,MAAM,sBAAsB;EAC1F,IAAI;EAEJ,MAAM,MAAMD,UAAQ,KAAK,sBAAsBA,UAAQ,EAAE;AAEzD,MAAI,MAAM,QAAQ,KAAK,EAAE;AACvB,OAAI,KAAK,SAAS,EAChB,QAAO,2BAA2B,MAAM,IAAI;AAG9C,OAAI,KAAK,WAAW,EAClB,QAAO;AAGT,SAAM,KAAK;QAEX,OAAM;AAGR,SAAO,4BAA4B,IAAI,MAAM,IAAI,WAAW,EAAE,IAAI;;AAapE,SAAQ,iBAAiB,SAAS,eAAgB,WAAS;AACzD,MAAI,CAAC,aAAa,QAAQE,UAAQ,IAAIA,YAAU,EAC9C,OAAM,IAAI,MAAM,0BAA0B;EAG5C,IAAI,IAAIA,aAAW;AAEnB,SAAOJ,QAAM,YAAY,EAAE,GAAG,WAAW,EACvC,MAAM,OAAQA,QAAM,YAAY,EAAE,GAAG;AAGvC,SAAQI,aAAW,KAAM;;;;CCjK3B,IAAMC,UAAAA,iBAAAA;CAEN,IAAM,MAAM;CACZ,IAAM,WAAW;CACjB,IAAM,UAAUA,QAAM,YAAY,IAAI;AAYtC,SAAQ,iBAAiB,SAAS,eAAgB,sBAAsB,MAAM;EAC5E,MAAM,OAAS,qBAAqB,OAAO,IAAK;EAChD,IAAI,IAAI,QAAQ;AAEhB,SAAOA,QAAM,YAAY,EAAE,GAAG,WAAW,EACvC,MAAM,OAAQA,QAAM,YAAY,EAAE,GAAG;AAMvC,UAAS,QAAQ,KAAM,KAAK;;;;CC3B9B,IAAMC,SAAAA,cAAAA;CAEN,SAASC,cAAa,MAAM;AAC1B,OAAK,OAAOD,OAAK;AACjB,OAAK,OAAO,KAAK,UAAU;;AAG7B,eAAY,gBAAgB,SAAS,cAAe,QAAQ;AAC1D,SAAO,KAAK,KAAK,MAAM,SAAS,EAAE,IAAK,SAAS,IAAO,SAAS,IAAK,IAAI,IAAK;;AAGhF,eAAY,UAAU,YAAY,SAAS,YAAa;AACtD,SAAO,KAAK,KAAK;;AAGnB,eAAY,UAAU,gBAAgB,SAAS,gBAAiB;AAC9D,SAAOC,cAAY,cAAc,KAAK,KAAK,OAAO;;AAGpD,eAAY,UAAU,QAAQ,SAAS,MAAO,WAAW;EACvD,IAAI,GAAG,OAAO;AAId,OAAK,IAAI,GAAG,IAAI,KAAK,KAAK,KAAK,QAAQ,KAAK,GAAG;AAC7C,WAAQ,KAAK,KAAK,OAAO,GAAG,EAAE;AAC9B,WAAQ,SAAS,OAAO,GAAG;AAE3B,aAAU,IAAI,OAAO,GAAG;;EAK1B,MAAM,eAAe,KAAK,KAAK,SAAS;AACxC,MAAI,eAAe,GAAG;AACpB,WAAQ,KAAK,KAAK,OAAO,EAAE;AAC3B,WAAQ,SAAS,OAAO,GAAG;AAE3B,aAAU,IAAI,OAAO,eAAe,IAAI,EAAE;;;AAI9C,QAAO,UAAUA;;;CC1CjB,IAAMC,SAAAA,cAAAA;CAWN,IAAM,kBAAkB;EACtB;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC7C;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC5D;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAC5D;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EACzC;CAED,SAASC,mBAAkB,MAAM;AAC/B,OAAK,OAAOD,OAAK;AACjB,OAAK,OAAO;;AAGd,oBAAiB,gBAAgB,SAAS,cAAe,QAAQ;AAC/D,SAAO,KAAK,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,SAAS;;AAGrD,oBAAiB,UAAU,YAAY,SAAS,YAAa;AAC3D,SAAO,KAAK,KAAK;;AAGnB,oBAAiB,UAAU,gBAAgB,SAAS,gBAAiB;AACnE,SAAOC,mBAAiB,cAAc,KAAK,KAAK,OAAO;;AAGzD,oBAAiB,UAAU,QAAQ,SAAS,MAAO,WAAW;EAC5D,IAAI;AAIJ,OAAK,IAAI,GAAG,IAAI,KAAK,KAAK,KAAK,QAAQ,KAAK,GAAG;GAE7C,IAAI,QAAQ,gBAAgB,QAAQ,KAAK,KAAK,GAAG,GAAG;AAGpD,YAAS,gBAAgB,QAAQ,KAAK,KAAK,IAAI,GAAG;AAGlD,aAAU,IAAI,OAAO,GAAG;;AAK1B,MAAI,KAAK,KAAK,SAAS,EACrB,WAAU,IAAI,gBAAgB,QAAQ,KAAK,KAAK,GAAG,EAAE,EAAE;;AAI3D,QAAO,UAAUA;;;CC1DjB,IAAMC,SAAAA,cAAAA;CAEN,SAASC,WAAU,MAAM;AACvB,OAAK,OAAOD,OAAK;AACjB,MAAI,OAAQ,SAAU,SACpB,MAAK,OAAO,IAAI,aAAa,CAAC,OAAO,KAAK;MAE1C,MAAK,OAAO,IAAI,WAAW,KAAK;;AAIpC,YAAS,gBAAgB,SAAS,cAAe,QAAQ;AACvD,SAAO,SAAS;;AAGlB,YAAS,UAAU,YAAY,SAAS,YAAa;AACnD,SAAO,KAAK,KAAK;;AAGnB,YAAS,UAAU,gBAAgB,SAAS,gBAAiB;AAC3D,SAAOC,WAAS,cAAc,KAAK,KAAK,OAAO;;AAGjD,YAAS,UAAU,QAAQ,SAAU,WAAW;AAC9C,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,IAAI,GAAG,IAC3C,WAAU,IAAI,KAAK,KAAK,IAAI,EAAE;;AAIlC,QAAO,UAAUA;;;CC7BjB,IAAMC,SAAAA,cAAAA;CACN,IAAMC,UAAAA,iBAAAA;CAEN,SAASC,YAAW,MAAM;AACxB,OAAK,OAAOF,OAAK;AACjB,OAAK,OAAO;;AAGd,aAAU,gBAAgB,SAAS,cAAe,QAAQ;AACxD,SAAO,SAAS;;AAGlB,aAAU,UAAU,YAAY,SAAS,YAAa;AACpD,SAAO,KAAK,KAAK;;AAGnB,aAAU,UAAU,gBAAgB,SAAS,gBAAiB;AAC5D,SAAOE,YAAU,cAAc,KAAK,KAAK,OAAO;;AAGlD,aAAU,UAAU,QAAQ,SAAU,WAAW;EAC/C,IAAI;AAKJ,OAAK,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK;GACrC,IAAI,QAAQD,QAAM,OAAO,KAAK,KAAK,GAAG;AAGtC,OAAI,SAAS,SAAU,SAAS,MAE9B,UAAS;YAGA,SAAS,SAAU,SAAS,MAErC,UAAS;OAET,OAAM,IAAI,MACR,6BAA6B,KAAK,KAAK,KAAK,oCACV;AAKtC,YAAW,UAAU,IAAK,OAAQ,OAAS,QAAQ;AAGnD,aAAU,IAAI,OAAO,GAAG;;;AAI5B,QAAO,UAAUC;;;CC9BjB,IAAIC,aAAW;EACb,8BAA8B,SAAS,OAAO,GAAG,GAAG;GAGlD,IAAI,eAAe,EAAE;GAIrB,IAAI,QAAQ,EAAE;AACd,SAAM,KAAK;GAMX,IAAI,OAAOA,WAAS,cAAc,MAAM;AACxC,QAAK,KAAK,GAAG,EAAE;GAEf,IAAIC,WACA,GAAG,GACH,gBACA,gBACA,WACA,+BACA,gBACA;AACJ,UAAO,CAAC,KAAK,OAAO,EAAE;AAGpB,gBAAU,KAAK,KAAK;AACpB,QAAIA,UAAQ;AACZ,qBAAiBA,UAAQ;AAGzB,qBAAiB,MAAM,MAAM,EAAE;AAK/B,SAAK,KAAK,eACR,KAAI,eAAe,eAAe,EAAE,EAAE;AAEpC,iBAAY,eAAe;AAK3B,qCAAgC,iBAAiB;AAMjD,sBAAiB,MAAM;AACvB,mBAAe,OAAO,MAAM,OAAO;AACnC,SAAI,eAAe,iBAAiB,+BAA+B;AACjE,YAAM,KAAK;AACX,WAAK,KAAK,GAAG,8BAA8B;AAC3C,mBAAa,KAAK;;;;AAM1B,OAAI,OAAO,MAAM,eAAe,OAAO,MAAM,OAAO,aAAa;IAC/D,IAAI,MAAM;KAAC;KAA+B;KAAG;KAAQ;KAAG;KAAI,CAAC,KAAK,GAAG;AACrE,UAAM,IAAI,MAAM,IAAI;;AAGtB,UAAO;;EAGT,6CAA6C,SAAS,cAAc,GAAG;GACrE,IAAI,QAAQ,EAAE;GACd,IAAI,IAAI;AAER,UAAO,GAAG;AACR,UAAM,KAAK,EAAE;AACC,iBAAa;AAC3B,QAAI,aAAa;;AAEnB,SAAM,SAAS;AACf,UAAO;;EAGT,WAAW,SAAS,OAAO,GAAG,GAAG;GAC/B,IAAI,eAAeD,WAAS,6BAA6B,OAAO,GAAG,EAAE;AACrE,UAAOA,WAAS,4CACd,cAAc,EAAE;;EAMpB,eAAe;GACb,MAAM,SAAU,MAAM;IACpB,IAAI,IAAIA,WAAS,eACb,IAAI,EAAE,EACN;AACJ,WAAO,QAAQ,EAAE;AACjB,SAAK,OAAO,EACV,KAAI,EAAE,eAAe,IAAI,CACvB,GAAE,OAAO,EAAE;AAGf,MAAE,QAAQ,EAAE;AACZ,MAAE,SAAS,KAAK,UAAU,EAAE;AAC5B,WAAO;;GAGT,gBAAgB,SAAU,GAAG,GAAG;AAC9B,WAAO,EAAE,OAAO,EAAE;;GAOpB,MAAM,SAAU,OAAO,MAAM;IAC3B,IAAI,OAAO;KAAQ;KAAa;KAAK;AACrC,SAAK,MAAM,KAAK,KAAK;AACrB,SAAK,MAAM,KAAK,KAAK,OAAO;;GAM9B,KAAK,WAAY;AACf,WAAO,KAAK,MAAM,OAAO;;GAG3B,OAAO,WAAY;AACjB,WAAO,KAAK,MAAM,WAAW;;GAEhC;EACF;AAID,KAAI,OAAO,WAAW,YACpB,QAAO,UAAUA;;;CCnKnB,IAAME,SAAAA,cAAAA;CACN,IAAM,cAAA,sBAAA;CACN,IAAM,mBAAA,2BAAA;CACN,IAAM,WAAA,mBAAA;CACN,IAAM,YAAA,oBAAA;CACN,IAAM,QAAA,eAAA;CACN,IAAMC,UAAAA,iBAAAA;CACN,IAAM,WAAA,kBAAA;CAQN,SAAS,oBAAqB,KAAK;AACjC,SAAO,SAAS,mBAAmB,IAAI,CAAC,CAAC;;CAW3C,SAAS,YAAa,OAAO,MAAM,KAAK;EACtC,MAAM,WAAW,EAAE;EACnB,IAAI;AAEJ,UAAQ,SAAS,MAAM,KAAK,IAAI,MAAM,KACpC,UAAS,KAAK;GACZ,MAAM,OAAO;GACb,OAAO,OAAO;GACR;GACN,QAAQ,OAAO,GAAG;GACnB,CAAC;AAGJ,SAAO;;CAUT,SAAS,sBAAuB,SAAS;EACvC,MAAM,UAAU,YAAY,MAAM,SAASD,OAAK,SAAS,QAAQ;EACjE,MAAM,eAAe,YAAY,MAAM,cAAcA,OAAK,cAAc,QAAQ;EAChF,IAAI;EACJ,IAAI;AAEJ,MAAIC,QAAM,oBAAoB,EAAE;AAC9B,cAAW,YAAY,MAAM,MAAMD,OAAK,MAAM,QAAQ;AACtD,eAAY,YAAY,MAAM,OAAOA,OAAK,OAAO,QAAQ;SACpD;AACL,cAAW,YAAY,MAAM,YAAYA,OAAK,MAAM,QAAQ;AAC5D,eAAY,EAAE;;AAKhB,SAFa,QAAQ,OAAO,cAAc,UAAU,UAAU,CAG3D,KAAK,SAAU,IAAI,IAAI;AACtB,UAAO,GAAG,QAAQ,GAAG;IACrB,CACD,IAAI,SAAU,KAAK;AAClB,UAAO;IACL,MAAM,IAAI;IACV,MAAM,IAAI;IACV,QAAQ,IAAI;IACb;IACD;;CAWN,SAAS,qBAAsB,QAAQ,MAAM;AAC3C,UAAQ,MAAR;GACE,KAAKA,OAAK,QACR,QAAO,YAAY,cAAc,OAAO;GAC1C,KAAKA,OAAK,aACR,QAAO,iBAAiB,cAAc,OAAO;GAC/C,KAAKA,OAAK,MACR,QAAO,UAAU,cAAc,OAAO;GACxC,KAAKA,OAAK,KACR,QAAO,SAAS,cAAc,OAAO;;;CAU3C,SAAS,cAAe,MAAM;AAC5B,SAAO,KAAK,OAAO,SAAU,KAAK,MAAM;GACtC,MAAM,UAAU,IAAI,SAAS,KAAK,IAAI,IAAI,IAAI,SAAS,KAAK;AAC5D,OAAI,WAAW,QAAQ,SAAS,KAAK,MAAM;AACzC,QAAI,IAAI,SAAS,GAAG,QAAQ,KAAK;AACjC,WAAO;;AAGT,OAAI,KAAK,KAAK;AACd,UAAO;KACN,EAAE,CAAC;;CAmBR,SAAS,WAAY,MAAM;EACzB,MAAM,QAAQ,EAAE;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,MAAM,KAAK;AAEjB,WAAQ,IAAI,MAAZ;IACE,KAAKA,OAAK;AACR,WAAM,KAAK;MAAC;MACV;OAAE,MAAM,IAAI;OAAM,MAAMA,OAAK;OAAc,QAAQ,IAAI;OAAQ;MAC/D;OAAE,MAAM,IAAI;OAAM,MAAMA,OAAK;OAAM,QAAQ,IAAI;OAAQ;MACxD,CAAC;AACF;IACF,KAAKA,OAAK;AACR,WAAM,KAAK,CAAC,KACV;MAAE,MAAM,IAAI;MAAM,MAAMA,OAAK;MAAM,QAAQ,IAAI;MAAQ,CACxD,CAAC;AACF;IACF,KAAKA,OAAK;AACR,WAAM,KAAK,CAAC,KACV;MAAE,MAAM,IAAI;MAAM,MAAMA,OAAK;MAAM,QAAQ,oBAAoB,IAAI,KAAK;MAAE,CAC3E,CAAC;AACF;IACF,KAAKA,OAAK,KACR,OAAM,KAAK,CACT;KAAE,MAAM,IAAI;KAAM,MAAMA,OAAK;KAAM,QAAQ,oBAAoB,IAAI,KAAK;KAAE,CAC3E,CAAC;;;AAIR,SAAO;;CAeT,SAAS,WAAY,OAAO,WAAS;EACnC,MAAM,QAAQ,EAAE;EAChB,MAAM,QAAQ,EAAE,OAAO,EAAE,EAAE;EAC3B,IAAI,cAAc,CAAC,QAAQ;AAE3B,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,YAAY,MAAM;GACxB,MAAM,iBAAiB,EAAE;AAEzB,QAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;IACzC,MAAM,OAAO,UAAU;IACvB,MAAM,MAAM,KAAK,IAAI;AAErB,mBAAe,KAAK,IAAI;AACxB,UAAM,OAAO;KAAQ;KAAM,WAAW;KAAG;AACzC,UAAM,OAAO,EAAE;AAEf,SAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;KAC3C,MAAM,aAAa,YAAY;AAE/B,SAAI,MAAM,eAAe,MAAM,YAAY,KAAK,SAAS,KAAK,MAAM;AAClE,YAAM,YAAY,OAChB,qBAAqB,MAAM,YAAY,YAAY,KAAK,QAAQ,KAAK,KAAK,GAC1E,qBAAqB,MAAM,YAAY,WAAW,KAAK,KAAK;AAE9D,YAAM,YAAY,aAAa,KAAK;YAC/B;AACL,UAAI,MAAM,YAAa,OAAM,YAAY,YAAY,KAAK;AAE1D,YAAM,YAAY,OAAO,qBAAqB,KAAK,QAAQ,KAAK,KAAK,GACnE,IAAIA,OAAK,sBAAsB,KAAK,MAAME,UAAQ;;;;AAK1D,iBAAc;;AAGhB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,IACtC,OAAM,YAAY,IAAI,MAAM;AAG9B,SAAO;GAAE,KAAK;GAAc;GAAO;;CAWrC,SAAS,mBAAoB,MAAM,WAAW;EAC5C,IAAI;EACJ,MAAM,WAAWF,OAAK,mBAAmB,KAAK;AAE9C,SAAOA,OAAK,KAAK,WAAW,SAAS;AAGrC,MAAI,SAASA,OAAK,QAAQ,KAAK,MAAM,SAAS,IAC5C,OAAM,IAAI,MAAM,OAAM,OAAO,oCACOA,OAAK,SAAS,KAAK,GACrD,4BAA4BA,OAAK,SAAS,SAAS,CAAC;AAIxD,MAAI,SAASA,OAAK,SAAS,CAACC,QAAM,oBAAoB,CACpD,QAAOD,OAAK;AAGd,UAAQ,MAAR;GACE,KAAKA,OAAK,QACR,QAAO,IAAI,YAAY,KAAK;GAE9B,KAAKA,OAAK,aACR,QAAO,IAAI,iBAAiB,KAAK;GAEnC,KAAKA,OAAK,MACR,QAAO,IAAI,UAAU,KAAK;GAE5B,KAAKA,OAAK,KACR,QAAO,IAAI,SAAS,KAAK;;;AAmB/B,SAAQ,YAAY,SAAS,UAAW,OAAO;AAC7C,SAAO,MAAM,OAAO,SAAU,KAAK,KAAK;AACtC,OAAI,OAAO,QAAQ,SACjB,KAAI,KAAK,mBAAmB,KAAK,KAAK,CAAC;YAC9B,IAAI,KACb,KAAI,KAAK,mBAAmB,IAAI,MAAM,IAAI,KAAK,CAAC;AAGlD,UAAO;KACN,EAAE,CAAC;;AAWR,SAAQ,aAAa,SAASG,aAAY,MAAM,WAAS;EAIvD,MAAM,QAAQ,WADA,WAFD,sBAAsB,MAAMF,QAAM,oBAAoB,CAAC,CAEtC,EACEC,UAAQ;EACxC,MAAM,OAAO,SAAS,UAAU,MAAM,KAAK,SAAS,MAAM;EAE1D,MAAM,gBAAgB,EAAE;AACxB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,IACnC,eAAc,KAAK,MAAM,MAAM,KAAK,IAAI,KAAK;AAG/C,SAAO,QAAQ,UAAU,cAAc,cAAc,CAAC;;AAaxD,SAAQ,WAAW,SAAS,SAAU,MAAM;AAC1C,SAAO,QAAQ,UACb,sBAAsB,MAAMD,QAAM,oBAAoB,CAAC,CACxD;;;;CCxUH,IAAMG,UAAAA,iBAAAA;CACN,IAAM,UAAA,gCAAA;CACN,IAAM,YAAA,oBAAA;CACN,IAAM,YAAA,oBAAA;CACN,IAAM,mBAAA,2BAAA;CACN,IAAM,gBAAA,wBAAA;CACN,IAAM,cAAA,sBAAA;CACN,IAAM,SAAA,+BAAA;CACN,IAAM,qBAAA,8BAAA;CACN,IAAM,UAAA,iBAAA;CACN,IAAM,aAAA,qBAAA;CACN,IAAM,OAAA,cAAA;CACN,IAAM,WAAA,kBAAA;CAkCN,SAAS,mBAAoB,UAAQ,WAAS;EAC5C,MAAM,OAAOC,SAAO;EACpB,MAAM,MAAM,cAAc,aAAaC,UAAQ;AAE/C,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GACnC,MAAM,MAAM,IAAI,GAAG;GACnB,MAAM,MAAM,IAAI,GAAG;AAEnB,QAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK;AAC5B,QAAI,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAG;AAEtC,SAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK;AAC5B,SAAI,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAG;AAEtC,SAAK,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,MACxC,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,MACtC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EACpC,UAAO,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK;SAExC,UAAO,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK;;;;;CAcnD,SAAS,mBAAoB,UAAQ;EACnC,MAAM,OAAOD,SAAO;AAEpB,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK;GACjC,MAAM,QAAQ,IAAI,MAAM;AACxB,YAAO,IAAI,GAAG,GAAG,OAAO,KAAK;AAC7B,YAAO,IAAI,GAAG,GAAG,OAAO,KAAK;;;CAYjC,SAAS,sBAAuB,UAAQ,WAAS;EAC/C,MAAM,MAAM,iBAAiB,aAAaC,UAAQ;AAElD,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GACnC,MAAM,MAAM,IAAI,GAAG;GACnB,MAAM,MAAM,IAAI,GAAG;AAEnB,QAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IACvB,MAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IACvB,KAAI,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,KAC1C,MAAM,KAAK,MAAM,EAClB,UAAO,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK;OAExC,UAAO,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK;;;CAanD,SAAS,iBAAkB,UAAQ,WAAS;EAC1C,MAAM,OAAOD,SAAO;EACpB,MAAM,OAAO,QAAQ,eAAeC,UAAQ;EAC5C,IAAI,KAAK,KAAK;AAEd,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,SAAM,KAAK,MAAM,IAAI,EAAE;AACvB,SAAM,IAAI,IAAI,OAAO,IAAI;AACzB,UAAQ,QAAQ,IAAK,OAAO;AAE5B,YAAO,IAAI,KAAK,KAAK,KAAK,KAAK;AAC/B,YAAO,IAAI,KAAK,KAAK,KAAK,KAAK;;;CAWnC,SAAS,gBAAiB,UAAQ,sBAAsB,aAAa;EACnE,MAAM,OAAOD,SAAO;EACpB,MAAM,OAAO,WAAW,eAAe,sBAAsB,YAAY;EACzE,IAAI,GAAG;AAEP,OAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AACvB,UAAQ,QAAQ,IAAK,OAAO;AAG5B,OAAI,IAAI,EACN,UAAO,IAAI,GAAG,GAAG,KAAK,KAAK;YAClB,IAAI,EACb,UAAO,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK;OAE/B,UAAO,IAAI,OAAO,KAAK,GAAG,GAAG,KAAK,KAAK;AAIzC,OAAI,IAAI,EACN,UAAO,IAAI,GAAG,OAAO,IAAI,GAAG,KAAK,KAAK;YAC7B,IAAI,EACb,UAAO,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;OAExC,UAAO,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK;;AAKxC,WAAO,IAAI,OAAO,GAAG,GAAG,GAAG,KAAK;;CASlC,SAAS,UAAW,UAAQ,MAAM;EAChC,MAAM,OAAOA,SAAO;EACpB,IAAI,MAAM;EACV,IAAI,MAAM,OAAO;EACjB,IAAI,WAAW;EACf,IAAI,YAAY;AAEhB,OAAK,IAAI,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG;AAC1C,OAAI,QAAQ,EAAG;AAEf,UAAO,MAAM;AACX,SAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,KAAI,CAACA,SAAO,WAAW,KAAK,MAAM,EAAE,EAAE;KACpC,IAAI,OAAO;AAEX,SAAI,YAAY,KAAK,OACnB,SAAU,KAAK,eAAe,WAAY,OAAO;AAGnD,cAAO,IAAI,KAAK,MAAM,GAAG,KAAK;AAC9B;AAEA,SAAI,aAAa,IAAI;AACnB;AACA,iBAAW;;;AAKjB,WAAO;AAEP,QAAI,MAAM,KAAK,QAAQ,KAAK;AAC1B,YAAO;AACP,WAAM,CAAC;AACP;;;;;CAcR,SAAS,WAAY,WAAS,sBAAsB,UAAU;EAE5D,MAAM,SAAS,IAAI,WAAW;AAE9B,WAAS,QAAQ,SAAU,MAAM;AAE/B,UAAO,IAAI,KAAK,KAAK,KAAK,EAAE;AAS5B,UAAO,IAAI,KAAK,WAAW,EAAE,KAAK,sBAAsB,KAAK,MAAMC,UAAQ,CAAC;AAG5E,QAAK,MAAM,OAAO;IAClB;EAKF,MAAM,0BAFiBF,QAAM,wBAAwBE,UAAQ,GACpC,OAAO,uBAAuBA,WAAS,qBAAqB,IAChB;AAOrE,MAAI,OAAO,iBAAiB,GAAG,KAAK,uBAClC,QAAO,IAAI,GAAG,EAAE;AAQlB,SAAO,OAAO,iBAAiB,GAAG,MAAM,EACtC,QAAO,OAAO,EAAE;EAOlB,MAAM,iBAAiB,yBAAyB,OAAO,iBAAiB,IAAI;AAC5E,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,IACjC,QAAO,IAAI,IAAI,IAAI,KAAO,KAAM,EAAE;AAGpC,SAAO,gBAAgB,QAAQA,WAAS,qBAAqB;;CAY/D,SAAS,gBAAiB,WAAW,WAAS,sBAAsB;EAElE,MAAM,iBAAiBF,QAAM,wBAAwBE,UAAQ;EAM7D,MAAM,qBAAqB,iBAHF,OAAO,uBAAuBA,WAAS,qBAAqB;EAMrF,MAAM,gBAAgB,OAAO,eAAeA,WAAS,qBAAqB;EAI1E,MAAM,iBAAiB,gBADA,iBAAiB;EAGxC,MAAM,yBAAyB,KAAK,MAAM,iBAAiB,cAAc;EAEzE,MAAM,wBAAwB,KAAK,MAAM,qBAAqB,cAAc;EAC5E,MAAM,wBAAwB,wBAAwB;EAGtD,MAAM,UAAU,yBAAyB;EAGzC,MAAM,KAAK,IAAI,mBAAmB,QAAQ;EAE1C,IAAI,SAAS;EACb,MAAM,SAAS,IAAI,MAAM,cAAc;EACvC,MAAM,SAAS,IAAI,MAAM,cAAc;EACvC,IAAI,cAAc;EAClB,MAAM,SAAS,IAAI,WAAW,UAAU,OAAO;AAG/C,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK;GACtC,MAAM,WAAW,IAAI,iBAAiB,wBAAwB;AAG9D,UAAO,KAAK,OAAO,MAAM,QAAQ,SAAS,SAAS;AAGnD,UAAO,KAAK,GAAG,OAAO,OAAO,GAAG;AAEhC,aAAU;AACV,iBAAc,KAAK,IAAI,aAAa,SAAS;;EAK/C,MAAM,OAAO,IAAI,WAAW,eAAe;EAC3C,IAAIC,UAAQ;EACZ,IAAI,GAAG;AAGP,OAAK,IAAI,GAAG,IAAI,aAAa,IAC3B,MAAK,IAAI,GAAG,IAAI,eAAe,IAC7B,KAAI,IAAI,OAAO,GAAG,OAChB,MAAK,aAAW,OAAO,GAAG;AAMhC,OAAK,IAAI,GAAG,IAAI,SAAS,IACvB,MAAK,IAAI,GAAG,IAAI,eAAe,IAC7B,MAAK,aAAW,OAAO,GAAG;AAI9B,SAAO;;CAYT,SAAS,aAAc,MAAM,WAAS,sBAAsB,aAAa;EACvE,IAAI;AAEJ,MAAI,MAAM,QAAQ,KAAK,CACrB,YAAW,SAAS,UAAU,KAAK;WAC1B,OAAO,SAAS,UAAU;GACnC,IAAI,mBAAmBD;AAEvB,OAAI,CAAC,kBAAkB;IACrB,MAAM,cAAc,SAAS,SAAS,KAAK;AAG3C,uBAAmB,QAAQ,sBAAsB,aAAa,qBAAqB;;AAKrF,cAAW,SAAS,WAAW,MAAM,oBAAoB,GAAG;QAE5D,OAAM,IAAI,MAAM,eAAe;EAIjC,MAAM,cAAc,QAAQ,sBAAsB,UAAU,qBAAqB;AAGjF,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,0DAA0D;AAI5E,MAAI,CAACA,UACH,aAAU;WAGDA,YAAU,YACnB,OAAM,IAAI,MAAM,0HAE0C,cAAc,MACvE;EAGH,MAAM,WAAW,WAAWA,WAAS,sBAAsB,SAAS;EAIpE,MAAM,UAAU,IAAI,UADAF,QAAM,cAAcE,UAAQ,CACN;AAG1C,qBAAmB,SAASA,UAAQ;AACpC,qBAAmB,QAAQ;AAC3B,wBAAsB,SAASA,UAAQ;AAMvC,kBAAgB,SAAS,sBAAsB,EAAE;AAEjD,MAAIA,aAAW,EACb,kBAAiB,SAASA,UAAQ;AAIpC,YAAU,SAAS,SAAS;AAE5B,MAAI,MAAM,YAAY,CAEpB,eAAc,YAAY,YAAY,SACpC,gBAAgB,KAAK,MAAM,SAAS,qBAAqB,CAAC;AAI9D,cAAY,UAAU,aAAa,QAAQ;AAG3C,kBAAgB,SAAS,sBAAsB,YAAY;AAE3D,SAAO;GACI;GACT,SAASA;GACa;GACT;GACH;GACX;;AAYH,SAAQ,SAAS,SAAS,OAAQ,MAAM,SAAS;AAC/C,MAAI,OAAO,SAAS,eAAe,SAAS,GAC1C,OAAM,IAAI,MAAM,gBAAgB;EAGlC,IAAI,uBAAuB,QAAQ;EACnC,IAAIA;EACJ,IAAI;AAEJ,MAAI,OAAO,YAAY,aAAa;AAElC,0BAAuB,QAAQ,KAAK,QAAQ,sBAAsB,QAAQ,EAAE;AAC5E,eAAU,QAAQ,KAAK,QAAQ,QAAQ;AACvC,UAAO,YAAY,KAAK,QAAQ,YAAY;AAE5C,OAAI,QAAQ,WACV,SAAM,kBAAkB,QAAQ,WAAW;;AAI/C,SAAO,aAAa,MAAMA,WAAS,sBAAsB,KAAK;;;;CC7ehE,SAAS,SAAU,KAAK;AACtB,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,UAAU;AAGtB,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,MAAM,wCAAwC;EAG1D,IAAI,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,GAAG;AACpD,MAAI,QAAQ,SAAS,KAAK,QAAQ,WAAW,KAAK,QAAQ,SAAS,EACjE,OAAM,IAAI,MAAM,wBAAwB,IAAI;AAI9C,MAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,EAC7C,WAAU,MAAM,UAAU,OAAO,MAAM,EAAE,EAAE,QAAQ,IAAI,SAAU,GAAG;AAClE,UAAO,CAAC,GAAG,EAAE;IACb,CAAC;AAIL,MAAI,QAAQ,WAAW,EAAG,SAAQ,KAAK,KAAK,IAAI;EAEhD,MAAM,WAAW,SAAS,QAAQ,KAAK,GAAG,EAAE,GAAG;AAE/C,SAAO;GACL,GAAI,YAAY,KAAM;GACtB,GAAI,YAAY,KAAM;GACtB,GAAI,YAAY,IAAK;GACrB,GAAG,WAAW;GACd,KAAK,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG;GACxC;;AAGH,SAAQ,aAAa,SAAS,WAAY,SAAS;AACjD,MAAI,CAAC,QAAS,WAAU,EAAE;AAC1B,MAAI,CAAC,QAAQ,MAAO,SAAQ,QAAQ,EAAE;EAEtC,MAAM,SAAS,OAAO,QAAQ,WAAW,eACvC,QAAQ,WAAW,QACnB,QAAQ,SAAS,IACf,IACA,QAAQ;EAEZ,MAAM,QAAQ,QAAQ,SAAS,QAAQ,SAAS,KAAK,QAAQ,QAAQ,KAAA;EACrE,MAAM,QAAQ,QAAQ,SAAS;AAE/B,SAAO;GACE;GACP,OAAO,QAAQ,IAAI;GACX;GACR,OAAO;IACL,MAAM,SAAS,QAAQ,MAAM,QAAQ,YAAY;IACjD,OAAO,SAAS,QAAQ,MAAM,SAAS,YAAY;IACpD;GACD,MAAM,QAAQ;GACd,cAAc,QAAQ,gBAAgB,EAAE;GACzC;;AAGH,SAAQ,WAAW,SAAS,SAAU,QAAQ,MAAM;AAClD,SAAO,KAAK,SAAS,KAAK,SAAS,SAAS,KAAK,SAAS,IACtD,KAAK,SAAS,SAAS,KAAK,SAAS,KACrC,KAAK;;AAGX,SAAQ,gBAAgB,SAAS,cAAe,QAAQ,MAAM;EAC5D,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK;AAC5C,SAAO,KAAK,OAAO,SAAS,KAAK,SAAS,KAAK,MAAM;;AAGvD,SAAQ,gBAAgB,SAAS,cAAe,SAAS,IAAI,MAAM;EACjE,MAAM,OAAO,GAAG,QAAQ;EACxB,MAAM,OAAO,GAAG,QAAQ;EACxB,MAAM,QAAQ,QAAQ,SAAS,MAAM,KAAK;EAC1C,MAAM,aAAa,KAAK,OAAO,OAAO,KAAK,SAAS,KAAK,MAAM;EAC/D,MAAM,eAAe,KAAK,SAAS;EACnC,MAAM,UAAU,CAAC,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK;AAEnD,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAC9B,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;GACnC,IAAI,UAAU,IAAI,aAAa,KAAK;GACpC,IAAI,UAAU,KAAK,MAAM;AAEzB,OAAI,KAAK,gBAAgB,KAAK,gBAC5B,IAAI,aAAa,gBAAgB,IAAI,aAAa,cAAc;IAChE,MAAM,OAAO,KAAK,OAAO,IAAI,gBAAgB,MAAM;IACnD,MAAM,OAAO,KAAK,OAAO,IAAI,gBAAgB,MAAM;AACnD,cAAU,QAAQ,KAAK,OAAO,OAAO,QAAQ,IAAI;;AAGnD,WAAQ,YAAY,QAAQ;AAC5B,WAAQ,YAAY,QAAQ;AAC5B,WAAQ,YAAY,QAAQ;AAC5B,WAAQ,UAAU,QAAQ;;;;;CC/FhC,IAAME,UAAAA,eAAAA;CAEN,SAAS,YAAa,KAAK,QAAQ,MAAM;AACvC,MAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,OAAO;AAEhD,MAAI,CAAC,OAAO,MAAO,QAAO,QAAQ,EAAE;AACpC,SAAO,SAAS;AAChB,SAAO,QAAQ;AACf,SAAO,MAAM,SAAS,OAAO;AAC7B,SAAO,MAAM,QAAQ,OAAO;;CAG9B,SAAS,mBAAoB;AAC3B,MAAI;AACF,UAAO,SAAS,cAAc,SAAS;WAChC,GAAG;AACV,SAAM,IAAI,MAAM,uCAAuC;;;AAI3D,SAAQ,SAAS,SAAS,OAAQ,QAAQ,QAAQ,SAAS;EACzD,IAAI,OAAO;EACX,IAAI,WAAW;AAEf,MAAI,OAAO,SAAS,gBAAgB,CAAC,UAAU,CAAC,OAAO,aAAa;AAClE,UAAO;AACP,YAAS,KAAA;;AAGX,MAAI,CAAC,OACH,YAAW,kBAAkB;AAG/B,SAAOA,QAAM,WAAW,KAAK;EAC7B,MAAM,OAAOA,QAAM,cAAc,OAAO,QAAQ,MAAM,KAAK;EAE3D,MAAM,MAAM,SAAS,WAAW,KAAK;EACrC,MAAM,QAAQ,IAAI,gBAAgB,MAAM,KAAK;AAC7C,UAAM,cAAc,MAAM,MAAM,QAAQ,KAAK;AAE7C,cAAY,KAAK,UAAU,KAAK;AAChC,MAAI,aAAa,OAAO,GAAG,EAAE;AAE7B,SAAO;;AAGT,SAAQ,kBAAkB,SAAS,gBAAiB,QAAQ,QAAQ,SAAS;EAC3E,IAAI,OAAO;AAEX,MAAI,OAAO,SAAS,gBAAgB,CAAC,UAAU,CAAC,OAAO,aAAa;AAClE,UAAO;AACP,YAAS,KAAA;;AAGX,MAAI,CAAC,KAAM,QAAO,EAAE;EAEpB,MAAM,WAAW,QAAQ,OAAO,QAAQ,QAAQ,KAAK;EAErD,MAAM,OAAO,KAAK,QAAQ;EAC1B,MAAM,eAAe,KAAK,gBAAgB,EAAE;AAE5C,SAAO,SAAS,UAAU,MAAM,aAAa,QAAQ;;;;CC7DvD,IAAM,QAAA,eAAA;CAEN,SAAS,eAAgB,OAAO,QAAQ;EACtC,MAAM,QAAQ,MAAM,IAAI;EACxB,MAAM,MAAM,SAAS,QAAO,MAAM,MAAM;AAExC,SAAO,QAAQ,IACX,MAAM,MAAM,SAAS,gBAAe,MAAM,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,OAChE;;CAGN,SAAS,OAAQ,KAAK,GAAG,GAAG;EAC1B,IAAI,MAAM,MAAM;AAChB,MAAI,OAAO,MAAM,YAAa,QAAO,MAAM;AAE3C,SAAO;;CAGT,SAAS,SAAU,MAAM,MAAM,QAAQ;EACrC,IAAI,OAAO;EACX,IAAI,SAAS;EACb,IAAI,SAAS;EACb,IAAI,aAAa;AAEjB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK;GAChC,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK;AAEhC,OAAI,CAAC,OAAO,CAAC,OAAQ,UAAS;AAE9B,OAAI,KAAK,IAAI;AACX;AAEA,QAAI,EAAE,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK;AACtC,aAAQ,SACJ,OAAO,KAAK,MAAM,QAAQ,KAAM,MAAM,OAAO,GAC7C,OAAO,KAAK,QAAQ,EAAE;AAE1B,cAAS;AACT,cAAS;;AAGX,QAAI,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,KAAK;AACpC,aAAQ,OAAO,KAAK,WAAW;AAC/B,kBAAa;;SAGf;;AAIJ,SAAO;;AAGT,SAAQ,SAAS,SAAS,OAAQ,QAAQ,SAAS,IAAI;EACrD,MAAM,OAAO,MAAM,WAAW,QAAQ;EACtC,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,aAAa,OAAO,KAAK,SAAS;EAExC,MAAM,KAAK,CAAC,KAAK,MAAM,MAAM,IACzB,KACA,WAAW,eAAe,KAAK,MAAM,OAAO,OAAO,GACnD,eAAc,aAAa,MAAM,aAAa;EAElD,MAAM,OACJ,WAAW,eAAe,KAAK,MAAM,MAAM,SAAS,GACpD,UAAS,SAAS,MAAM,MAAM,KAAK,OAAO,GAAG;EAE/C,MAAM,UAAU,mBAAuB,aAAa,MAAM,aAAa;EAIvE,MAAM,SAAS,gDAFD,CAAC,KAAK,QAAQ,KAAK,aAAY,KAAK,QAAQ,iBAAe,KAAK,QAAQ,SAElB,UAAU,qCAAmC,KAAK,OAAO;AAE7H,MAAI,OAAO,OAAO,WAChB,IAAG,MAAM,OAAO;AAGlB,SAAO;;;;CC9ET,IAAM,aAAA,qBAAA;CAEN,IAAM,SAAA,gBAAA;CACN,IAAM,iBAAA,gBAAA;CACN,IAAM,cAAA,iBAAA;CAEN,SAAS,aAAc,YAAY,QAAQ,MAAM,MAAM,IAAI;EACzD,MAAM,OAAO,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE;EACxC,MAAM,UAAU,KAAK;EACrB,MAAM,cAAc,OAAO,KAAK,UAAU,OAAO;AAEjD,MAAI,CAAC,eAAe,CAAC,YAAY,CAC/B,OAAM,IAAI,MAAM,qCAAqC;AAGvD,MAAI,aAAa;AACf,OAAI,UAAU,EACZ,OAAM,IAAI,MAAM,6BAA6B;AAG/C,OAAI,YAAY,GAAG;AACjB,SAAK;AACL,WAAO;AACP,aAAS,OAAO,KAAA;cACP,YAAY,EACrB,KAAI,OAAO,cAAc,OAAO,OAAO,aAAa;AAClD,SAAK;AACL,WAAO,KAAA;UACF;AACL,SAAK;AACL,WAAO;AACP,WAAO;AACP,aAAS,KAAA;;SAGR;AACL,OAAI,UAAU,EACZ,OAAM,IAAI,MAAM,6BAA6B;AAG/C,OAAI,YAAY,GAAG;AACjB,WAAO;AACP,aAAS,OAAO,KAAA;cACP,YAAY,KAAK,CAAC,OAAO,YAAY;AAC9C,WAAO;AACP,WAAO;AACP,aAAS,KAAA;;AAGX,UAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;AAC5C,QAAI;AAEF,aAAQ,WADK,OAAO,OAAO,MAAM,KAAK,EACb,QAAQ,KAAK,CAAC;aAChC,GAAG;AACV,YAAO,EAAE;;KAEX;;AAGJ,MAAI;GACF,MAAM,OAAO,OAAO,OAAO,MAAM,KAAK;AACtC,MAAG,MAAM,WAAW,MAAM,QAAQ,KAAK,CAAC;WACjC,GAAG;AACV,MAAG,EAAE;;;AAIT,SAAQ,SAAS,OAAO;AACxB,SAAQ,WAAW,aAAa,KAAK,MAAM,eAAe,OAAO;AACjE,SAAQ,YAAY,aAAa,KAAK,MAAM,eAAe,gBAAgB;AAG3E,SAAQ,WAAW,aAAa,KAAK,MAAM,SAAU,MAAM,GAAG,MAAM;AAClE,SAAO,YAAY,OAAO,MAAM,KAAK;GACrC;;ACzEF,MAAA,gCAAA;;;;;;AAIA,MAAA,gBAAA,CAAA,UAAA,MAAA;AAIA,MAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AGPA,MAAa,WAAW;;;;;;EFkBxB,MAAM,QAAQ;EACd,MAAM,QAAQ,UAAU;EAExB,MAAM,YAAY,IAA2B,KAAK;EAClD,MAAM,YAAY,IAAI,MAAM;EAC5B,MAAM,cAAc,IAAI,MAAM;EAC9B,IAAI,cAAc;EAElB,MAAM,eAAe,eACnB,OAAO,SAAS,MAAM,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK,MAAM,MAAM,KAAK,GAAG,EAC1E;EACD,MAAM,kBAAkB,eACtB,OAAO,SAAS,MAAM,QAAQ,IAAI,MAAM,WAAW,IAAI,KAAK,MAAM,MAAM,QAAQ,GAAG,GACpF;EACD,MAAM,qBAAqB,eAAe,aAAa,QAAQ,gBAAgB,QAAQ,EAAE;EACzF,MAAM,mBAAmB,eACvB,OAAO,SAAS,MAAM,SAAS,IAAI,MAAM,WAAW,IAAI,KAAK,MAAM,MAAM,SAAS,GAAG,EACtF;EAED,MAAM,YAAY,gBAA+B;GAC/C,OAAO,GAAG,aAAa,MAAM;GAC7B,QAAQ,GAAG,aAAa,MAAM;GAC9B,UAAU;GACV,SAAS;GACT,UAAU;GACV,iBAAiB,MAAM;GACxB,EAAE;EAEH,MAAM,cAAc,gBAA+B;GACjD,UAAU;GACV,OAAO,GAAG,gBAAgB,MAAM;GAChC,OAAO;GACP,QAAQ;GACT,EAAE;EAEH,MAAM,iBAAiB,eAAe,YAAY,SAAS,QAAQ,MAAM,QAAQ,CAAC;EAElF,MAAM,gBAAgB,gBAA+B;GACnD,UAAU;GACV,MAAM;GACN,KAAK;GACL,OAAO,GAAG,iBAAiB,MAAM;GACjC,QAAQ,GAAG,iBAAiB,MAAM;GAClC,WAAW;GACX,UAAU;GACV,cAAc,GAAG,MAAM,iBAAiB;GACxC,iBAAiB,MAAM;GACvB,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,eAAe;GAChB,EAAE;EAEH,MAAM,iBAAiB,gBAA+B;GACpD,OAAO;GACP,QAAQ;GACR,SAAS;GACT,WAAW;GACZ,EAAE;EAEH,MAAM,oBAAoB;GACxB,MAAM,YAAY,UAAU;AAC5B,OAAI,CAAC,UAAW;AAEhB,aAAU,YAAY;AACtB,eAAY,QAAQ;;EAGtB,MAAM,4BAAoD;GACxD,OAAO,mBAAmB;GAC1B,QAAQ;GACR,sBAAsB,MAAM;GAC5B,OAAO;IACL,MAAM,MAAM;IACZ,OAAO,MAAM;IACd;GACF;EAED,MAAM,iBAAe,OAAO,UAAkB;GAC5C,MAAM,YAAY,UAAU;AAC5B,OAAI,CAAC,UAAW;AAEhB,aAAU,YAAY;GACtB,MAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,aAAU,YAAY,OAAO;AAE7B,SAAA,eAAa,SAAS,QAAQ,MAAM,OAAO,oBAAoB,CAAC;AAChE,OAAI,UAAU,YACZ;AAGF,eAAY,QAAQ;;EAGtB,MAAM,YAAY,OAAO,UAAkB;GACzC,MAAM,YAAY,UAAU;AAC5B,OAAI,CAAC,UAAW;GAEhB,MAAM,MAAM,MAAA,eAAa,SAAS,MAAM,OAAO;IAC7C,GAAG,oBAAoB;IACvB,MAAM;IACP,CAAC;AACF,OAAI,UAAU,YACZ;AAGF,aAAU,YAAY;AACtB,eAAY,QAAQ;;EAGtB,MAAM,gBAAgB,YAAY;AAChC,OAAI,CAAC,UAAU,MAAO;GAEtB,MAAM,QAAQ,EAAE;AAEhB,OAAI,CADc,UAAU,MACZ;AAEhB,gBAAa;AAEb,OAAI,CAAC,MAAM,MAAO;AAClB,OAAI,aAAa,SAAS,EACxB,OAAM,IAAI,WAAW,eAAe;AAEtC,OAAI,gBAAgB,QAAQ,EAC1B,OAAM,IAAI,WAAW,kBAAkB;AAEzC,OAAI,gBAAgB,QAAQ,KAAK,aAAa,MAC5C,OAAM,IAAI,WAAW,uBAAuB;AAG9C,OAAI,MAAM,SAAS,SACjB,OAAM,eAAa,MAAM;OAEzB,OAAM,UAAU,MAAM;;AAI1B,cACQ;GACJ,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACP,QACK;AACJ,OAAI,CAAC,UAAU,MAAO;AACjB,kBAAe;KAEtB,EAAE,OAAO,QAAQ,CAClB;AAED,kBAAgB;AACd,aAAU,QAAQ;AACb,kBAAe;IACpB;AAEF,wBAAsB;AACpB,kBAAe;AACf,gBAAa;IACb;;uBAtLA,mBAKM,OALN,WAKM,EALD,OAAM,cAAY,EAAS,MAAA,MAAK,EAAA;IAAG,OAAO,UAAA;IAAW,MAAK;QAC7D,mBAAuE,OAAA;aAA9D;IAAJ,KAAI;IAAY,OAAM;IAAsB,OAAK,eAAE,YAAA,MAAW;gBACxD,eAAA,SAAA,WAAA,EAAX,mBAEM,OAAA;;IAFqB,OAAM;IAAoB,OAAK,eAAE,cAAA,MAAa;OACvE,mBAA0F,OAAA;IAApF,KAAK,MAAM;IAAS,KAAI;IAAG,OAAM;IAA0B,OAAK,eAAE,eAAA,MAAc;;;;GEDjD;ACD3C,MAAa,mBAAmB;CAAC;CAAW;CAAU;CAAS;CAAQ;CAAQ;CAAO;AAItF,MAAa,sBAAsB;CAAC;CAAQ;CAAU;CAAQ;AAI9D,MAAa,yBAAyB,CAAC,OAAO,SAAS;AGPvD,MAAa,YAAY;;;;QHWK;EAI5B,OAAO;GACL,MAAM;GACN,SAAS;GACV;EAID,QAAQ;GACN,MAAM;GACN,SAAS;GACT,YAAY,UAAkB,iBAAiB,SAAS,MAAyB;GAClF;EAID,OAAO;GACL,MAAM;GACN,SAAS;GACV;EAID,QAAQ;GACN,MAAM;GACN,SAAS;GACV;EAID,OAAO;GACL,MAAM;GACN,SAAS;GACV;EAID,iBAAiB;GACf,MAAM;GACN,SAAS;GACV;EAID,cAAc;GACZ,MAAM;GACN,SAAS;GACV;EAID,MAAM;GACJ,MAAM;GACN,SAAS;GACV;EAID,MAAM;GACJ,MAAM;GACN,SAAS;GACV;EAID,aAAa;GACX,MAAM;GACN,SAAS;GACV;EAID,UAAU;GACR,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS;GACT,YAAY,UAAkB,oBAAoB,SAAS,MAA4B;GACxF;EAID,cAAc;GACZ,MAAM;GACN,SAAS;GACT,YAAY,UAAkB,uBAAuB,SAAS,MAA+B;GAC9F;EAID,YAAY;GACV,MAAM;GACN,SAAS;GACV;EAID,QAAQ;GACN,MAAM;GACN,SAAS;GACV;EAID,WAAW;GACT,MAAM;GACN,SAAS,KAAA;GACV;EAID,aAAa;GACX,MAAM;GACN,SAAS,KAAA;GACV;EAID,cAAc;GACZ,MAAM;GACN,SAAS,KAAA;GACV;EAID,YAAY;GACV,MAAM;GACN,SAAS,KAAA;GACV;EACF;;EC/HD,MAAM,QAAQ;EACd,MAAM,QAAQ,UAAU;EACxB,MAAM,SAAS,IAA0B,KAAK;EAE9C,IAAI,gBAAgB;EACpB,IAAI,yBAA0D;EAE9D,MAAM,YAAY,QAAuB;AACvC,OAAI,YAAY;;EAGlB,MAAM,iBAAiB,WAAoC;GACzD,MAAM,aAAa,OAAO,OAAO,CAAC,aAAa;AAE/C,OAAI,eAAe,OACjB,QAAO;AAGT,UAAO;;EAGT,MAAM,qBAA8C;GAClD,MAAM,UAAmC;IACvC,QAAQ,cAAc,MAAM,OAAO;IACnC,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,YAAY,MAAM;IAClB,cAAc,MAAM;IACpB,MAAM,MAAM,SAAS,KAAK,KAAA,IAAY,MAAM;IAC5C,MAAM,MAAM;IACZ,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,WAAW,MAAM;IACjB,cAAc,MAAM;IACpB,YAAY,MAAM;IAClB,QAAQ,MAAM;IACf;AAED,OAAI,MAAM,cAAc,KAAA,EACtB,SAAQ,YAAY,MAAM;AAG5B,OAAI,MAAM,gBAAgB,KAAA,EACxB,SAAQ,cAAc,MAAM;AAG9B,OAAI,MAAM,iBAAiB,KAAA,EACzB,SAAQ,eAAe,MAAM;AAG/B,OAAI,MAAM,eAAe,KAAA,EACvB,SAAQ,aAAa,MAAM;AAG7B,UAAO;;EAGT,MAAM,gBAAgB,YAAwC;AAC5D,OAAI,CAAC,uBACH,0BAAyB,OAAO,2BAAA,KAAA,sBAAA,CAAA;AAIlC,WADe,MAAM,wBACP;;EAGhB,MAAM,gBAAgB,YAAY;GAChC,MAAM,iBAAiB,EAAE;GACzB,MAAM,MAAM,OAAO;AAEnB,OAAI,CAAC,IACH;AAGF,YAAS,IAAI;AAEb,OAAI,MAAM,UAAU,GAClB;GAGF,MAAM,YAAY,MAAM,eAAe;AACvC,OAAI,mBAAmB,cACrB;AAGF,aAAU,KAAK,MAAM,OAAO,cAAc,CAAC;;EAG7C,MAAM,qBAAqB;GACzB,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACP;AAED,kBAAgB;AACT,kBAAe;IACpB;AAEF,QACE,oBACM;AACC,kBAAe;KAEtB,EAAE,OAAO,QAAQ,CAClB;AAED,wBAAsB;AACpB,oBAAiB;IACjB;;uBApJA,mBAA0D,OAA1D,WAA0D;aAAjD;IAAJ,KAAI;IAAS,OAAM;MAAqB,MAAA,MAAK,CAAA,EAAA,MAAA,GAAA;;;GEEP;AIC7C,MAAaC,WAA0C;;;;QHF1B;EAI3B,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EACF;QAE4B,EAAE;;ECH/B,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,WAAW;EAEjB,MAAM,EAAE,cAAc,gBAAgB,EAAE,CAAC;EACzC,MAAM,EAAE,gBAAgB,eAAe;GACrC,OAAO;GACP,OAAO;GACP,cAAc;GACf,CAAC;EAEF,MAAM,uBAAuB,SAAS,aAAa,QAAQ,SAAS,aAAa;EAEjF,MAAM,EAAE,qBAAqB,kBAAkB;GAC7C,OAAO;GACP,eAAe,MAAM;GACrB,yBAA0B,gBAAgB,GAAG,EAAE,GAAG,KAAA;GACnD,CAAC;EAEF,MAAM,oBAAoB,gBAAgB;GACxC,GAAG,YAAY;GACf,WAAW,kBAAkB;GAC7B,OAAO,CAAC,YAAY,MAAM,OAAO;IAAE,YAAY,MAAM;IAAS,YAAY,MAAM;IAAS,CAAC;GAC3F,EAAE;AAEH,WAAa,EAAE,CAAmB;;uBA1ChC,YAAgF,wBAAhE,EAAE,MAAA,SAAQ,EAAA;IAAA,GAAO,kBAAA;IAAiB,KAAO,MAAA,UAAS;IAAA,EAAI,MAAA,MAAK,CAAA,CAAA,CAAA;;;GEGH;AIA1E,MAAaC,eAAkD;;;;QHDhC;EAI7B,SAAS;GACP,MAAM;GACN,SAAS;GACV;EAID,SAAS;GACP,MAAM;GACN,SAAS;GACV;EACF;QAE8B,EAAE;;ECJjC,MAAM,QAAQ;EAEd,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,WAAW;EAEjB,MAAM,EAAE,cAAc,gBAAgB,EAAE,CAAC;EACzC,MAAM,EAAE,gBAAgB,eAAe;GACrC,OAAO;GACP,OAAO;GACP,cAAc;GACf,CAAC;EAEF,MAAM,uBAAuB,SAAS,aAAa,QAAQ,SAAS,aAAa;EAEjF,MAAM,EAAE,qBAAqB,kBAAkB;GAC7C,OAAO;GACP,eAAe,MAAM;GACrB,yBAA0B,gBAAgB,GAAG,EAAE,GAAG,KAAA;GACnD,CAAC;EAEF,MAAM,wBAAwB,gBAAgB;GAC5C,GAAG,YAAY;GACf,WAAW,kBAAkB;GAC7B,OAAO,CAAC,YAAY,MAAM,OAAO;IAAE,YAAY,MAAM;IAAS,YAAY,MAAM;IAAS,CAAC;GAC3F,EAAE;AAEH,WAAa,EAAE,CAAqB;;uBA1ClC,YAAwF,wBAAxE,EAAE,MAAA,aAAY,EAAA;IAAA,GAAO,sBAAA;IAAqB,KAAO,MAAA,UAAS;IAAA,EAAI,MAAA,MAAK,CAAA,CAAA,CAAA;;;GEGC;ACgGtF,MAAaC,wBAAiD;CAC5D,OAAO;CACP,UAAU;CACV,QAAQ;CACT;AAKD,MAAa,YAAY;CACvB,MAAM;EACJ,MAAM;EACN,eAAe,EAAE;EAClB;CACD,UAAU;EACR,MAAM,CAAC,SAAS,OAAO;EACvB,SAAS;EACV;CACD,cAAc;EACZ,MAAM;EACN,SAAS;EACV;CACD,qBAAqB;EACnB,MAAM,CAAC,QAAQ,SAAS;EACxB,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,SAAS;EACV;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACV;CACD,WAAW;EACT,MAAM;EACN,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,SAAS;EACV;CACD,OAAO;EACL,MAAM;EACN,gBAAgB,EAAE,GAAG,uBAAuB;EAC7C;CACD,YAAY,EACV,MAAM,CAAC,QAAQ,SAAS,EACzB;CACD,eAAe,EACb,MAAM,UACP;CACD,QAAQ,EACN,MAAM,CAAC,QAAQ,SAAS,EACzB;CACD,kBAAkB;EAChB,MAAM;EACN,SAAS;EACV;CACD,qBAAqB,EACnB,MAAM,OACP;CACD,cAAc,EACZ,MAAM,OACP;CACD,kBAAkB;EAChB,MAAM;EACN,SAAS;EACV;CACD,qBAAqB;EACnB,MAAM;EACN,SAAS;EACV;CACD,WAAW;EACT,MAAM;EACN,SAAS;EACV;CACD,qBAAqB,EACnB,MAAM,OACP;CACD,cAAc,EACZ,MAAM,OACP;CACD,cAAc,EACZ,MAAM,OACP;CACD,kBAAkB,EAChB,MAAM,OACP;CACD,oBAAoB,EAClB,MAAM,OACP;CACD,aAAa,EACX,MAAM,CAAC,OAAO,OAAO,EACtB;CACD,sBAAsB,EACpB,MAAM,OACP;CACD,oBAAoB,EAClB,MAAM,OACP;CACD,UAAU,EACR,MAAM,UACP;CACD,YAAY,EACV,MAAM,OACP;CACD,WAAW;EACT,MAAM;EACN,SAAS;EACV;CACD,WAAW,EACT,MAAM,UACP;CACD,WAAW,EACT,MAAM,UACP;CACD,gBAAgB,EACd,MAAM,UACP;CACF;AAyID,IAAM,cAAY,UAChB,UAAU,QAAQ,OAAO,UAAU;AAKrC,MAAa,aAAa,UACxB,OAAO,UAAU,YAAY,OAAO,UAAU;AAKhD,MAAa,2BAA2B,UACtC,WAAS,MAAM,IACf,MAAM,QAAQ,MAAM,QAAQ,IAC5B,MAAM,QAAQ,OAAO,SAAS,UAAU,KAAK,CAAC,IAC9C,MAAM,QAAQ,MAAM,YAAY,IAChC,MAAM,YAAY,OAAO,SAAS,UAAU,KAAK,CAAC;AAKpD,MAAa,qBAAqB,UAC/B,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAO,SAAS,UAAU,KAAK,CAAC,IAAK,wBAAwB,MAAM;AAKpG,IAAM,sBAAsB,UAC1B,UAAU,QAAQ,WAAS,MAAM;AAKnC,IAAM,cAAc,UAClB,WAAS,MAAM,IACf,UAAU,MAAM,IAAI,IACpB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,aAAa,aAC1B,OAAO,MAAM,eAAe,aAC5B,OAAO,MAAM,qBAAqB,aAClC,OAAO,MAAM,oBAAoB,aACjC,OAAO,MAAM,WAAW,aACxB,MAAM,QAAQ,MAAM,WAAW,IAC/B,UAAU;AAKZ,IAAM,uBACJ,MACA,MACA,WACA,UAEA,WAAS,KAAK,IACd,WAAW,KAAK,IAChB,mBAAmB,UAAU,IAC7B,WAAS,MAAM,IACf,OAAO,MAAM,SAAS;AAKxB,IAAM,0BACJ,MACA,MACA,WACA,UAEA,WAAS,KAAK,IACd,WAAW,KAAK,IAChB,mBAAmB,UAAU,IAC7B,WAAS,MAAM,IACf,OAAO,MAAM,SAAS;AAExB,IAAM,2BAA2B;AAKjC,IAAM,wBAAwB,MAAgB,MAAwB,aACpE,WAAS,KAAK,IACd,WAAW,KAAK,IAChB,OAAO,KAAK,aAAa,aACzB,mBAAmB,SAAS;AAK9B,IAAM,oBAAoB,cAAyB,UACjD,MAAM,QAAQ,aAAa,IAC3B,aAAa,OAAO,SAAS,UAAU,KAAK,CAAC,IAC7C,OAAO,MAAM,aAAa,aAC1B,UAAU,MAAM,IAAI,IACpB,WAAW,MAAM,KAAK,IACtB,MAAM,QAAQ,MAAM,cAAc,IAClC,MAAM,cAAc,OAAO,SAAS,WAAW,KAAK,CAAC,IACrD,WAAS,MAAM,MAAM,IACrB,OAAO,MAAM,MAAM,SAAS;AAK9B,IAAM,mBAAmB,aAA8B,UACrD,kBAAkB,YAAY,IAC9B,OAAO,MAAM,YAAY,aACzB,UAAU,MAAM,IAAI,IACpB,WAAW,MAAM,KAAK,IACtB,MAAM,QAAQ,MAAM,aAAa,IACjC,MAAM,aAAa,OAAO,SAAS,WAAW,KAAK,CAAC,IACpD,MAAM,QAAQ,MAAM,gBAAgB,IACpC,MAAM,gBAAgB,OAAO,SAAS,UAAU,KAAK,CAAC,IACtD,WAAS,MAAM,MAAM,IACrB,OAAO,MAAM,MAAM,SAAS;AAK9B,IAAM,kBAAkB,YAAuB,UAC7C,MAAM,QAAQ,WAAW,IACzB,WAAW,OAAO,SAAS,UAAU,KAAK,CAAC,IAC3C,UAAU,MAAM,IAAI,IACpB,WAAW,MAAM,KAAK,IACtB,MAAM,QAAQ,MAAM,WAAW,IAC/B,MAAM,WAAW,OAAO,SAAS,UAAU,KAAK,CAAC;AAEnD,IAAM,mBAAmB,UAAqB,WAAS,MAAM,IAAI,OAAO,MAAM,SAAS;AAEvF,IAAM,sBAAsB,aAC1B,aAAa,YAAY,aAAa,WAAW,aAAa,WAAW,aAAa;AAExF,IAAM,6BACJ,aAEA,aAAa,YAAY,aAAa,WAAW,aAAa;AAEhE,IAAM,2BAA2B,MAAgB,UAC/C,WAAW,KAAK,IAAI,gBAAgB,MAAM;AAE5C,IAAM,4BAA4B,cAAwB,UAAoB,UAC5E,WAAW,aAAa,IAAI,WAAW,SAAS,IAAI,gBAAgB,MAAM;AAE5E,IAAM,yBACJ,cACA,UACA,UACA,UAEA,WAAW,aAAa,KACvB,aAAa,QAAQ,WAAW,SAAS,KAC1C,mBAAmB,SAAS,IAC5B,gBAAgB,MAAM;AAExB,IAAM,sBACJ,cACA,UACA,UACA,UAEA,WAAW,aAAa,IACxB,WAAW,SAAS,IACpB,0BAA0B,SAAS,IACnC,gBAAgB,MAAM;AAKxB,MAAa,YAAY;CAIvB,wBAAwB,UACtB,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAO,SAAS,UAAU,KAAK,CAAC;CAIhE,wBAAwB,UACtB,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAO,SAAS,UAAU,KAAK,CAAC;CAIhE,uBAAuB,UAA2B,kBAAkB,MAAM;CAI1E,sBAAsB,UACpB,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAO,SAAS,UAAU,KAAK,CAAC;CAIhE,SAAS,UACP,OAAO,MAAM,aAAa,aAC1B,UAAU,MAAM,IAAI,IACpB,MAAM,QAAQ,MAAM,aAAa,IACjC,MAAM,aAAa,OAAO,SAAS,UAAU,KAAK,CAAC,IACnD,MAAM,SAAS,QACf,OAAO,MAAM,SAAS;CAIxB,eAAe,GAAG,SAA4B,oBAAoB,GAAG,KAAK;CAI1E,WAAW,GAAG,SAA+B,uBAAuB,GAAG,KAAK;CAC5E,gBAAgB,GAAG,SAAiC,yBAAyB,GAAG,KAAK;CAIrF,SAAS,GAAG,SAAyB,iBAAiB,GAAG,KAAK;CAI9D,QAAQ,GAAG,SAAwB,gBAAgB,GAAG,KAAK;CAI3D,OAAO,GAAG,SAAuB,eAAe,GAAG,KAAK;CAIxD,gBAAgB,GAAG,SAA6B,qBAAqB,GAAG,KAAK;CAI7E,kBAAkB,GAAG,SAA6B,qBAAqB,GAAG,KAAK;CAI/E,oBAAoB,GAAG,SAAgC,wBAAwB,GAAG,KAAK;CAIvF,oBAAoB,GAAG,SAAiC,yBAAyB,GAAG,KAAK;CAIzF,mBAAmB,GAAG,SAAiC,yBAAyB,GAAG,KAAK;CAIxF,oBAAoB,GAAG,SAAiC,yBAAyB,GAAG,KAAK;CAIzF,kBAAkB,GAAG,SAA8B,sBAAsB,GAAG,KAAK;CAIjF,cAAc,GAAG,SAA2B,mBAAmB,GAAG,KAAK;CACxE;AAOD,MAAa,8BACX,iBAC6B;CAC7B,GAAG;CACH,GAAG;CACJ;AAKD,IAAM,oBAAoB,SAA8C;AACtE,KAAI,CAAC,MAAM,QAAQ,KAAK,CACtB,wBAAO,IAAI,KAAK;CAGlB,MAAM,yBAAS,IAAI,KAAc;AAEjC,MAAK,MAAM,OAAO,KAChB,KAAI,UAAU,IAAI,CAChB,QAAO,IAAI,IAAI;AAInB,QAAO;;AAGT,IAAM,kCAAkC,EACtC,cACA,kBACA,sBACA,uBAC8B,EAAE,MAAgC;CAChE,gBAAgB,iBAAiB,aAAa;CAC9C,oBAAoB,iBAAiB,iBAAiB;CACtD,wBAAwB,iBAAiB,qBAAqB;CAC9D,sBAAsB,iBAAiB,mBAAmB;CAC3D;AAKD,IAAM,iBAAiB,MAAgB,cAA+B,KAAK;AAK3E,MAAa,qBACX,SACA,OACA,aACA,uBAAiD,gCAAgC,EACjF,SAA+B,MAC/B,gBAAgB,MAChB,gBAA2B,EAAE,KACX;CAClB,MAAM,cAAc,2BAA2B,YAAY;CAC3D,MAAM,gBAAgB,cAAc,SAAS,YAAY,SAAS;CAClE,MAAM,aAAa,MAAM,QAAQ,cAAc,GAAI,gBAA+B,EAAE;CAEpF,MAAM,aAAa,cAAc,SAAS,YAAY,MAAM;CAC5D,MAAM,cAAc,cAAc,SAAS,YAAY,OAAO;AAE9D,KAAI,QAAQ,QAAQ,KAAA,KAAa,QAAQ,QAAQ,KAC/C,OAAM,IAAI,MAAM,mDAAmD;CAGrE,MAAM,WAAW,qBAAqB,eAAe,IAAI,QAAQ,IAAI;CAErE,MAAMC,WAA0B;EAC9B,KAAK,QAAQ;EACb;EACA,MAAM;EACN,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW;EACnD;EACA,YAAY,CAAC,YAAY,CAAC,qBAAqB,mBAAmB,IAAI,QAAQ,IAAI;EAClF,kBAAkB,YAAY,qBAAqB,uBAAuB,IAAI,QAAQ,IAAI;EAC1F,iBAAiB,CAAC,qBAAqB,qBAAqB,IAAI,QAAQ,IAAI;EAC5E,QAAQ,QAAQ,YAAY;EAC5B;EACA;EACA;EACA,YAAY,EAAE;EACf;AAED,UAAS,aAAa,WAAW,KAAK,WAAW,YAC/C,kBACE,WACA,QAAQ,GACR,aACA,sBACA,UACA,YAAU,WAAW,SAAS,GAC9B,CAAC,GAAG,eAAe,cAAc,CAClC,CACF;AAED,QAAO;;AAMT,MAAa,kBACX,MACA,aACA,2BACc;CACd,MAAM,6BAAa,IAAI,KAA6B;CACpD,MAAM,+BAAe,IAAI,KAA8B;CACvD,MAAM,iCAAiB,IAAI,KAAyB;CACpD,MAAMC,kBAA6B,EAAE;CACrC,MAAM,uBAAuB,+BAA+B,uBAAuB;CACnF,MAAM,kBAAkB,KAAK,KAAK,MAAM,YACtC,kBAAkB,MAAM,GAAG,aAAa,sBAAsB,MAAM,YAAU,KAAK,SAAS,EAAE,CAC/F;CAKD,MAAM,SAAS,OAAwB,cAA8B;AACnE,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,WAAW,IAAI,KAAK,IAAI,CAC1B,OAAM,IAAI,MAAM,yCAAyC,OAAO,KAAK,IAAI,GAAG;AAG9E,cAAW,IAAI,KAAK,KAAK,KAAK;AAC9B,gBAAa,IAAI,KAAK,KAAK,UAAU;AACrC,mBAAgB,KAAK,KAAK,IAAI;AAC9B,kBAAe,IACb,KAAK,KACL,KAAK,WAAW,KAAK,cAAc,UAAU,IAAI,CAClD;AAED,OAAI,KAAK,WAAW,SAAS,EAC3B,OAAM,KAAK,YAAY,KAAK,IAAI;;;AAKtC,OAAM,iBAAiB,KAAK;AAE5B,QAAO;EACL,OAAO;EACP;EACA;EACA;EACA;EACD;;AAMH,MAAa,0BACX,MACA,eACc;AACd,KAAI,CAAC,MAAM,QAAQ,KAAK,CACtB,QAAO,EAAE;CAGX,MAAMC,mBAA8B,EAAE;CACtC,MAAM,8BAAc,IAAI,KAAc;AAEtC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CACjE;AAGF,cAAY,IAAI,IAAI;AACpB,mBAAiB,KAAK,IAAI;;AAG5B,QAAO;;AAGT,MAAa,kCACX,cACA,iBACc;CACd,MAAM,4CAA4B,IAAI,KAA8B;AAEpE,MAAK,MAAM,OAAO,aAChB,2BAA0B,IAAI,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI;AAGnE,QAAO,aAAa,QACjB,QAAQ,0BAA0B,IAAI,aAAa,IAAI,IAAI,IAAI,KAAK,KAAK,IAC3E;;AAMH,MAAa,0BACX,MACA,eACc;AACd,KAAI,CAAC,MAAM,QAAQ,KAAK,CACtB,QAAO,EAAE;CAGX,MAAMC,mBAA8B,EAAE;CACtC,MAAM,8BAAc,IAAI,KAAc;AAEtC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CACjE;AAGF,cAAY,IAAI,IAAI;AACpB,mBAAiB,KAAK,IAAI;;AAG5B,QAAO;;AAgCT,MAAa,wBACX,MACA,eACc;AACd,KAAI,CAAC,MAAM,QAAQ,KAAK,CACtB,QAAO,EAAE;CAGX,MAAME,iBAA4B,EAAE;CACpC,MAAM,8BAAc,IAAI,KAAc;AAEtC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CACjE;AAGF,cAAY,IAAI,IAAI;AACpB,iBAAe,KAAK,IAAI;;AAG1B,QAAO;;AAMT,MAAa,mBACX,MACA,eACiB;CACjB,MAAM,2BAAW,IAAI,KAAc;AAEnC,MAAK,MAAM,OAAO,KAChB,KAAI,WAAW,IAAI,IAAI,CACrB,UAAS,IAAI,IAAI;AAIrB,QAAO;;AAMT,MAAa,6BAA6B,UAAsC;CAC9E,MAAMC,eAA0B,EAAE;CAKlC,MAAM,SAAS,iBAAkC;AAC/C,OAAK,MAAM,QAAQ,cAAc;AAC/B,OAAI,KAAK,WAAW,WAAW,EAC7B;AAGF,gBAAa,KAAK,KAAK,IAAI;AAC3B,SAAM,KAAK,WAAW;;;AAI1B,OAAM,MAAM;AAEZ,QAAO;;AAMT,MAAa,+BACX,oBACA,iBACiB;CACjB,MAAM,+BAAe,IAAI,KAAc;AAEvC,MAAK,MAAM,OAAO,oBAAoB;EACpC,IAAI,YAAY,aAAa,IAAI,IAAI,IAAI;AAEzC,SAAO,cAAc,MAAM;AACzB,gBAAa,IAAI,UAAU;AAC3B,eAAY,aAAa,IAAI,UAAU,IAAI;;;AAI/C,QAAO;;AAMT,MAAa,iCAAiC,EAC5C,oBACA,cACA,qBACA,YAAY,YAMM;AAClB,KAAI,WAAW;EACb,MAAMC,sBAAiC,EAAE;EACzC,MAAM,8BAAc,IAAI,KAAc;EACtC,MAAM,kBAAkB,QAAiB;AACvC,OAAI,CAAC,YAAY,IAAI,IAAI,EAAE;AACzB,gBAAY,IAAI,IAAI;AACpB,wBAAoB,KAAK,IAAI;;;AAIjC,OAAK,MAAM,OAAO,oBAAoB;AACpC,OAAI,qBAAqB;IACvB,IAAI,YAAY,aAAa,IAAI,IAAI,IAAI;AAEzC,WAAO,cAAc,MAAM;AACzB,oBAAe,UAAU;AACzB,iBAAY,aAAa,IAAI,UAAU,IAAI;;;AAI/C,kBAAe,IAAI;;AAGrB,SAAO,IAAI,IAAI,+BAA+B,qBAAqB,aAAa,CAAC;;CAGnF,MAAM,wBAAwB,IAAI,IAAa,mBAAmB;AAElE,KAAI,qBAAqB;EACvB,MAAM,eAAe,4BAA4B,oBAAoB,aAAa;AAElF,OAAK,MAAM,OAAO,aAChB,uBAAsB,IAAI,IAAI;;AAIlC,QAAO;;AAkBT,SAAgB,oBAAoB,EAClC,MACA,mBAC+F;CAC/F,MAAM,8BAAc,IAAI,KAA2C;CAKnE,MAAM,SAAS,gBAA4D;EACzE,MAAM,aAAa,YAAY,IAAI,YAAY,IAAI;AAEnD,MAAI,WACF,QAAO;EAGT,MAAMC,YAAsB;GAC1B,KAAK,YAAY;GACjB,OAAO,YAAY;GACnB,MAAM,YAAY;GAClB,OAAO,YAAY;GACnB,UAAU,YAAY;GACtB,YAAY,YAAY;GACxB,kBAAkB,YAAY;GAC9B,iBAAiB,YAAY;GAC7B,QAAQ,YAAY;GACpB,QAAQ;GACR,YAAY,EAAE;GACf;AAED,MAAI,iBAAiB;GACnB,MAAM,oBAAoB;AAE1B,qBAAkB,WAAW,gBAAgB,YAAY,IAAI;;AAG/D,cAAY,IAAI,YAAY,KAAK,UAAU;AAC3C,YAAU,SAAS,YAAY,SAAS,MAAM,YAAY,OAAO,GAAG;AACpE,YAAU,aAAa,YAAY,WAAW,KAAK,cAAc,MAAM,UAAU,CAAC;AAElF,SAAO;;AAGT,QAAO,MAAM,KAAK;;AAMpB,MAAa,6BACX,QACA,SAC0B;AAC1B,KAAI,OAAO,WAAW,WACpB,QAAO,OAAO,KAAK,IAAI,EAAE;AAG3B,QAAO,UAAU,EAAE;;;;;;;;;;;uBCjjCnB,mBAIM,OAJN,cAIM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAHJ,mBAEuR,QAAA;IADrR,MAAK;IACL,GAAE;;;;;;;;;;;;;;uBEHN,mBAOM,OAPN,cAOM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CANJ,mBAI6H,QAAA;IAH3H,MAAK;IACL,aAAU;IACV,aAAU;IACV,GAAE;iBACJ,mBAAmF,QAAA;IAA7E,MAAK;IAAe,GAAE;;;;;;;;;AIFhC,MAAa,qBAAqB;;;;;uBFJhC,mBAQM,OARN,cAQM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA;IAPJ,mBAI6H,QAAA;KAH3H,MAAK;KACL,aAAU;KACV,aAAU;KACV,GAAE;;IACJ,mBAAmF,QAAA;KAA7E,MAAK;KAAe,GAAE;;IAC5B,mBAAmF,QAAA;KAA7E,MAAK;KAAe,GAAE;;;;;GEH0C;AAC1E,MAAa,sBAAsB,YAAY,8BAA6B;AAC9C,YAAY,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECmQlE,MAAM,QAAQ;EACd,MAAM,QAAQ,UAEV;EACJ,MAAM,kBAAkB,oBAAoB;EAC5C,MAAM,iBAAiB,IAAwB,KAAK;EACpD,MAAM,KAAK,aAAa,OAAO;EAC/B,MAAM,gBAAgB,GAAG,EAAE,OAAO;EAClC,MAAM,uBAAuB,GAAG,EAAE,eAAe;EACjD,MAAM,kBAAkB,GAAG,EAAE,SAAS;EACtC,MAAM,sBAAsB,GAAG,EAAE,cAAc;EAC/C,MAAM,oBAAoB,GAAG,EAAE,YAAY;EAC3C,MAAM,wBAAwB,GAAG,EAAE,gBAAgB;EACnD,MAAM,oBAAoB,GAAG,EAAE,WAAW;EAC1C,MAAM,wBAAwB,GAAG,GAAG,YAAY,OAAO;EACvD,MAAM,0BAA0B,GAAG,EAAE,kBAAkB;EACvD,MAAM,uBAAuB,GAAG,EAAE,eAAe;EACjD,MAAM,wBAAwB,GAAG,EAAE,gBAAgB;EACnD,MAAM,4BAA4B,GAAG,EAAE,qBAAqB;EAC5D,MAAM,4BAA4B,GAAG,EAAE,qBAAqB;EAC5D,MAAM,qBAAqB,GAAG,EAAE,aAAa;EAC7C,MAAM,oBAAoB,GAAG,EAAE,WAAW;EAC1C,MAAM,yBAAyB,GAAG,EAAE,iBAAiB;EAKrD,MAAM,wBAA0C,iBAAiB,SAAS;EAK1E,MAAM,yBACH,EACC,mBAAmB,OAAO,MAAM,KAAK,MAAM,EAC5C;EAKH,MAAM,mCAAmC,MAAM,iBAAiB,MAAM,KAAK;EAK3E,MAAM,kCAAkC,MAAM,KAAK,WAAW,SAAS;EAKvE,MAAM,iCACJ,4BAA4B,IAAI,MAAM,eAAe,MAAM,KAAK,IAAI;EAKtE,MAAM,6BAA6B,CAAC,4BAA4B;EAKhE,MAAM,gCAAgC,MAAM,cAAc,MAAM,KAAK,IAAI;EAKzE,MAAM,6BAA6B,MAAM,KAAK;EAK9C,MAAM,oCAAoC,MAAM,KAAK;EAKrD,MAAM,kCAAkC,MAAM,gBAAgB,MAAM,KAAK;EAKzE,MAAM,iCAAiC,MAAM,eAAe,MAAM,KAAK,IAAI;EAK3E,MAAM,mCAAmC,MAAM,iBAAiB,MAAM,KAAK,IAAI;EAK/E,MAAM,oCAAoC,MAAM,kBAAkB,MAAM,KAAK,IAAI;EAKjF,MAAM,4BAA4B,MAAM,gBAAgB,MAAM,KAAK,IAAI;EAKvE,MAAM,mCACJ,MAAM,kBAAkB,MAAM,KAAK,cAAc,CAAC,MAAM,KAAK;EAK/D,MAAM,iCAAiC,MAAM,eAAe,MAAM,KAAK,IAAI;EAK3E,MAAM,gCAAgC,MAAM,cAAc,MAAM,KAAK,IAAI;EAEzE,MAAM,iCAAiC,MAAM,eAAe,MAAM,KAAK;EAKvE,MAAM,gCAAgC,MAAM,cAAc,MAAM,KAAK,IAAI;EAKzE,MAAM,oCAAoC,MAAM,kBAAkB,MAAM,KAAK,IAAI;EAKjF,MAAM,qCAAqC,MAAM,mBAAmB,MAAM,KAAK;EAK/E,MAAM,oCACJ,MAAM,iBAAiB,MAAM,qBAAqB,MAAM,KAAK;EAK/D,MAAM,gCAAgC;AACpC,OAAI,CAAC,6BAA6B,CAChC;AAGF,OAAI,6BAA6B,CAC/B,QAAO;AAGT,UAAO,yBAAyB,GAAG,SAAS;;EAM9C,MAAM,0BAA0B,UAAsB;AACpD,OAAI,MAAM,SAAS,EACjB;AAGF,SAAM,mBAAmB;IACvB,MAAM,MAAM;IACZ,WAAW,iBAAiB;IAC5B;IACD,CAAC;;EAMJ,MAAM,6BAA6B,UAAsB;AACvD,SAAM,sBAAsB;IAC1B,MAAM,MAAM;IACZ,WAAW,iBAAiB;IAC5B;IACD,CAAC;;EAGJ,MAAM,gCAAgC,UAAsB;AAC1D,SAAM,yBAAyB;IAC7B,MAAM,MAAM;IACZ,WAAW,iBAAiB;IAC5B;IACD,CAAC;;EAMJ,MAAM,uBAAuB,UAAsB;AACjD,OAAI,CAAC,6BAA6B,IAAI,MAAM,mBAAmB,MAAM,KAAK,CACxE;AAGF,SAAM,kBAAkB;IACtB,MAAM,MAAM;IACZ;IACD,CAAC;;EAMJ,MAAM,4BAA4B;AAChC,OAAI,CAAC,4BAA4B,IAAI,yBAAyB,CAC5D;AAGF,SAAM,oBAAoB;IACxB,MAAM,MAAM;IACZ,UAAU,iBAAiB;IAC5B,CAAC;;EAMJ,MAAM,uBAAuB,UAAqB,MAAM;EAKxD,MAAM,mBAAmB,UAAqB;AAC5C,SAAM,oBAAoB;IACxB,MAAM,MAAM;IACZ;IACD,CAAC;;EAMJ,MAAM,mBAAmB,UAAqB;AAC5C,SAAM,oBAAoB;IACxB,MAAM,MAAM;IACZ;IACA,SAAS,oBAAoB,MAAM;IACpC,CAAC;;EAMJ,MAAM,kBAAkB,UAAqB;AAC3C,SAAM,mBAAmB;IACvB,MAAM,MAAM;IACZ;IACA,SAAS,oBAAoB,MAAM;IACpC,CAAC;;EAMJ,MAAM,mBAAmB,UAAqB;AAC5C,SAAM,oBAAoB;IACxB,MAAM,MAAM;IACZ;IACA,SAAS,oBAAoB,MAAM;IACpC,CAAC;;EAMJ,MAAM,cAAc,UAAqB;AACvC,SAAM,eAAe;IACnB,MAAM,MAAM;IACZ;IACA,SAAS,oBAAoB,MAAM;IACpC,CAAC;;EAMJ,MAAM,iBAAiB,UAAqB;AAC1C,SAAM,kBAAkB;IACtB,MAAM,MAAM;IACZ;IACD,CAAC;;EAMJ,MAAM,8BAA8B,MAAM;EAK1C,MAAM,mCACJ,MAAM,gBAAgB;GACpB,MAAM,SAAS;GACf,MAAM,MAAM,KAAK;GAClB,CAAC;EAKJ,MAAM,0BAA0B,MAAM;EAEtC,MAAM,SAAS,eAAe,MAAM,UAAU,MAAM,KAAK,IAAI,CAAC;EAC9D,MAAM,YAAY,SAAS,gBAAgB;EAC3C,MAAM,iBAAiB,eAAe,QAAQ,MAAM,QAAQ,CAAC;EAC7D,MAAM,mBAAmB,SAAS,2BAA2B;EAC7D,MAAM,gBAAgB,SAAS,0BAA0B;EACzD,MAAM,iBAAiB,SAAS,yBAAyB;EACzD,MAAM,aAAa,SAAS,qBAAqB;EACjD,MAAM,gBAAgB,SAAS,wBAAwB;EACvD,MAAM,gBAAgB,SAAS,qBAAqB;EACpD,MAAM,oBAAoB,SAAS,4BAA4B;EAC/D,MAAM,kBAAkB,SAAS,0BAA0B;EAC3D,MAAM,iBAAiB,SAAS,yBAAyB;EACzD,MAAM,mBAAmB,SAAS,2BAA2B;EAC7D,MAAM,oBAAoB,SAAS,4BAA4B;EAC/D,MAAM,eAAe,SAAS,oBAAoB;EAClD,MAAM,sBAAsB,eAAe,iBAAiB,SAAS,CAAC,kBAAkB,MAAM;EAC9F,MAAM,mBAAmB,eAAe,iBAAiB,SAAS,aAAa,UAAU,SAAS;EAClG,MAAM,mBAAmB,eAAe,iBAAiB,SAAS,aAAa,UAAU,QAAQ;EACjG,MAAM,kBAAkB,eAAe,iBAAiB,SAAS,aAAa,UAAU,QAAQ;EAChG,MAAM,gBAAgB,SAAS,wBAAwB;EACvD,MAAM,oBAAoB,SAAS,4BAA4B;EAC/D,MAAM,4BAA4B,SAAS,6BAA6B;EACxE,MAAM,qBAAqB,SAAS,4BAA4B;EAChE,MAAM,mBAAmB,SAAS,2BAA2B;EAC7D,MAAM,iBAAiB,SAAS,yBAAyB;EACzD,MAAM,gBAAgB,SAAS,wBAAwB;EACvD,MAAM,iBAAiB,SAAS,yBAAyB;EACzD,MAAM,kBAAkB,SAAS,wBAAwB;EACzD,MAAM,WAAW,eAAe,oBAAoB,EAAE,MAAM,MAAM,MAAM,CAAC,CAAC;EAC1E,MAAM,qBAAqB,SAAS,sBAAsB;EAC1D,MAAM,sBAAsB,SAAS,2BAA2B;EAChE,MAAM,iBAAiB,SAAS,kBAAkB;AAElD,kBAAgB;AACd,SAAM,oBAAoB,MAAM,KAAK,KAAK,eAAe,MAAM;IAC/D;AAEF,wBAAsB;AACpB,SAAM,sBAAsB,MAAM,KAAK,KAAK,eAAe,MAAM;IACjE;;;2DA9lBA,mBAAA,8CAAkD,EAClD,mBAgKM,OAAA;IA/JH,IAAI,OAAA;IACJ,OAAK,eAAA;KAAW,MAAA,cAAa;KAAS,mBAAA,MAAmB;KAAa,oBAAA;KAA4B,MAAA,GAAE,CAAC,GAAE,aAAc,QAAA,SAAQ;KAAU,MAAA,GAAE,CAAC,GAAE,QAAS,WAAA,MAAU;KAAU,MAAA,GAAE,CAAC,GAAE,QAAS,kBAAA,MAAiB;;IAQxM,OAAK,eAAA,CAAG,eAAA,MAAe,MAAM,UAAA,MAAS,CAAA;IACvC,MAAK;IACJ,iBAAe,iBAAA,QAAmB,eAAA,QAAiB,KAAA;IACnD,gBAAc,gBAAA;IACd,iBAAe,iBAAA,QAAmB,eAAA,QAAiB,KAAA;IACnD,iBAAe,QAAA,KAAK,WAAQ,SAAY,KAAA;IACxC,cAAY,QAAA,KAAK;OAClB,mBA0FM,OAAA;aAzFA;IAAJ,KAAI;IACH,OAAK,eAAA;KAAa,MAAA,qBAAoB;KAAW,MAAA,GAAE,CAAC,GAAE,YAAa,eAAA,MAAc;KAAY,MAAA,GAAE,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAY,MAAA,GAAE,CAAC,GAAE,aAAc,QAAA,SAAQ;KAAY,MAAA,GAAE,CAAC,GAAE,WAAY,cAAA,MAAa;KAAY,MAAA,GAAE,CAAC,GAAE,YAAa,eAAA,MAAc;KAAY,MAAA,GAAE,CAAC,GAAE,aAAc,gBAAA,MAAe;KAAY,MAAA,GAAE,CAAC,GAAE,YAAa,eAAA,MAAc;KAAY,MAAA,GAAE,CAAC,GAAE,eAAgB,iBAAA,MAAgB;KAAY,MAAA,GAAE,CAAC,GAAE,gBAAiB,kBAAA,MAAiB;KAAY,MAAA,GAAE,CAAC,GAAE,kBAAmB,oBAAA,MAAmB;KAAY,MAAA,GAAE,CAAC,GAAE,eAAgB,iBAAA,MAAgB;KAAY,MAAA,GAAE,CAAC,GAAE,eAAgB,iBAAA,MAAgB;KAAY,MAAA,GAAE,CAAC,GAAE,cAAe,gBAAA,MAAe;;IAgB/nB,WAAW,gBAAA,QAAe,OAAU,KAAA;IACpC,SAAO;IACP,YAAU;IACV,eAAa;IACb,aAAS,cAAO,iBAAe,CAAA,OAAA,CAAA;IAC/B,aAAS,cAAO,iBAAe,CAAA,OAAA,CAAA;IAC/B,YAAQ,cAAO,gBAAc,CAAA,OAAA,CAAA;IAC7B,aAAS,cAAO,iBAAe,CAAA,OAAA,CAAA;IAC/B,QAAI,cAAO,YAAU,CAAA,OAAA,CAAA;IACrB,WAAO,cAAO,eAAa,CAAA,OAAA,CAAA;;IAChB,cAAA,MAAc,SAAM,KAAA,WAAA,EAAhC,mBAKO,QAAA;;KALgC,OAAK,eAAE,MAAA,gBAAe,CAAA;KAAE,eAAY;0BACzE,mBAG6D,UAAA,MAAA,WAF7B,cAAA,QAAtB,YAAY,YAAK;yBAD3B,mBAG6D,QAAA;MAD1D,KAAG,GAAK,OAAO,QAAA,KAAK,IAAG,CAAA,GAAK;MAC5B,OAAK,eAAA,CAAG,MAAA,oBAAmB,EAAE,MAAA,GAAE,CAAC,GAAE,OAAQ,WAAU,CAAA,CAAA;;;IAEzD,mBAsCO,QAAA,EAtCA,OAAK,eAAA,CAAG,MAAA,kBAAiB,EAAE,MAAA,GAAE,CAAC,GAAE,QAAS,WAAA,MAAU,CAAA,CAAA,EAAA,EAAA,CAEhD,WAAA,SAAc,QAAA,YAAA,WAAA,EADtB,mBAMO,QAAA;;KAJJ,OAAK,eAAA,CAAG,MAAA,kBAAiB,EAAE,MAAA,sBAAqB,CAAA,CAAA;KACjD,eAAY;QACZ,mBAA2C,QAAA,EAApC,OAAK,eAAE,MAAA,0BAAyB,CAAA,EAAA,EAAA,MAAA,EAAA,EAC3B,QAAA,gBAAA,WAAA,EAAZ,mBAA+D,QAAA;;KAApC,OAAK,eAAE,MAAA,0BAAyB,CAAA;4DAE5C,WAAA,SAAA,WAAA,EAAjB,mBAAgF,QAAA;;KAAlD,OAAK,eAAE,MAAA,qBAAoB,CAAA;KAAE,eAAY;iCACvE,mBA4BO,QAAA;;KA5BO,OAAK,eAAE,MAAA,kBAAiB,CAAA;QACpC,mBA0BS,UAAA;KAzBP,MAAK;KACJ,OAAK,eAAE,MAAA,wBAAuB,CAAA;KAC9B,cAAY,eAAA,QAAc,SAAA;KAC1B,UAAU,cAAA;KACX,UAAS;KACR,SAAK,cAAO,qBAAmB,CAAA,OAAA,CAAA;KAC/B,YAAQ,OAAA,OAAA,OAAA,KAAA,oBAAT,IAAc,CAAA,OAAA,CAAA;KACb,WAAO,OAAA,OAAA,OAAA,KAAA,oBAAR,IAAa,CAAA,OAAA,CAAA;QACb,YAgBS,MAAA,OAAA,EAAA;KAfN,OAAK,eAAA,CAAG,MAAA,sBAAqB,EAAE,MAAA,GAAE,CAAC,GAAE,WAAY,cAAA,MAAa,CAAA,CAAA;KAC9D,eAAY;;4BACgD,CAAjB,cAAA,SAAA,WAAA,EAA3C,YAA4D,wBAA5C,QAAA,oBAAmB,EAAA,EAAA,KAAA,GAAA,CAAA,IACd,QAAA,iBAAY,gBAAA,WAAA,EAAjC,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAFkB,eAAA,SAAA,WAAA,EAA3B,YAA6C,MAAA,oBAAA,EAAA,EAAA,KAAA,GAAA,CAAA,KAAA,WAAA,EAC7C,YAA6B,MAAA,mBAAA,EAAA,EAAA,KAAA,GAAA,CAAA,EAAA,EAAA,GAAA,IAEV,QAAA,iBAAY,YAAA,WAAA,EAAjC,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAFW,eAAA,SAAA,WAAA,EAApB,YAAsC,MAAA,aAAA,EAAA,EAAA,KAAA,GAAA,CAAA,KAAA,WAAA,EACtC,YAAiB,MAAA,OAAA,EAAA,EAAA,KAAA,GAAA,CAAA,EAAA,EAAA,GAAA,KAAA,WAAA,EAEnB,mBAGW,UAAA,EAAA,KAAA,GAAA,EAAA,CAFU,eAAA,SAAA,WAAA,EAAnB,YAAqC,MAAA,YAAA,EAAA,EAAA,KAAA,GAAA,CAAA,KAAA,WAAA,EACrC,YAAqB,MAAA,WAAA,EAAA,EAAA,KAAA,GAAA,CAAA,EAAA,EAAA,GAAA,EAAA,CAAA;;;IAOvB,mBAAA,SAAA,WAAA,EADR,mBAYO,QAAA;;KAVJ,OAAK,eAAE,MAAA,sBAAqB,CAAA;KAC5B,SAAK,cAAO,qBAAmB,CAAA,OAAA,CAAA;KAC/B,YAAQ,OAAA,OAAA,OAAA,KAAA,oBAAT,IAAc,CAAA,OAAA,CAAA;KACb,WAAO,OAAA,OAAA,OAAA,KAAA,oBAAR,IAAa,CAAA,OAAA,CAAA;QACb,YAKkC,MAAA,WAAA,EAAA;KAJ/B,eAAa,cAAA;KACb,eAAe,kBAAA;KACf,UAAU,0BAAA;KACX,UAAS;KACT,cAAW;;;;;;IAEf,mBAGO,QAAA,EAHA,OAAK,eAAE,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAClB,eAAA,QAAZ,WAAiE,KAAA,QAAA,WAAA;;KAApC,MAAM,SAAA;KAAW,MAAM,QAAA,KAAK;uBACzD,mBAA4C,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAAA,gBAAxB,QAAA,KAAK,MAAK,EAAA,EAAA,CAAA,EAAA,GAAA,EAAA,EAAA,EAAA;yBAGlC,YAmDa,YAAA,EAnDD,MAAK,oBAAkB,EAAA;2BAkD3B,CAjDK,cAAA,SAAiB,eAAA,SAAA,WAAA,EAA5B,mBAiDM,OAAA;;KAjDuC,OAAK,eAAE,MAAA,kBAAiB,CAAA;KAAE,MAAK;QAC1E,mBA+CM,OAAA;KA/CA,OAAK,eAAE,MAAA,uBAAsB,CAAA;KAAE,MAAK;0BACxC,mBA6Ca,UAAA,MAAA,WA5CS,QAAA,KAAK,aAAlB,cAAS;yBADlB,YA6Ca,uBAAA;MA3CV,KAAK,UAAU;MACf,MAAM;MACN,eAAa,QAAA;MACb,yBAAuB,QAAA;MACvB,2BAAyB,QAAA;MACzB,yBAAuB,QAAA;MACvB,4BAA0B,QAAA;MAC1B,+BAA6B,QAAA;MAC7B,oBAAkB,QAAA;MAClB,mBAAiB,QAAA;MACjB,wBAAsB,QAAA;MACtB,oBAAkB,QAAA;MAClB,mBAAiB,QAAA;MACjB,oBAAkB,QAAA;MAClB,mBAAiB,QAAA;MACjB,sBAAoB,QAAA;MACpB,qBAAmB,QAAA;MACnB,oBAAkB,QAAA;MAClB,uBAAqB,QAAA;MACrB,wBAAsB,QAAA;MACtB,sBAAoB,QAAA;MACpB,kBAAgB,QAAA;MAChB,mBAAiB,QAAA;MACjB,aAAW,QAAA;MACX,kBAAgB,QAAA;MAChB,iBAAe,QAAA;MACf,yBAAuB,QAAA;MACvB,wBAAsB,QAAA;MACtB,0BAAwB,QAAA;MACxB,uBAAqB,QAAA;MACrB,yBAAuB,QAAA;MACvB,0BAAwB,QAAA;MACxB,0BAAwB,QAAA;MACxB,yBAAuB,QAAA;MACvB,0BAAwB,QAAA;MACxB,oBAAkB,QAAA;MAClB,wBAAsB,QAAA;MACtB,wBAAsB,QAAA;MACtB,mBAAiB,QAAA;MACjB,mBAAiB,QAAA;+BACF,eAAA,QAAA;YAAiB;mBAAS,cAAS,CACjD,WAA2B,KAAA,QAAA,WAA3B,WAA2B,EAAA,SAAA,MAAA,EAAb,UAAS,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEtIrC,IAAM,mBAAmB,SAAwB,KAAK;AAKtD,IAAM,iBAAiB,QAAsB,cAC3C,UAAU,gBAAgB,QAAQ,QAAQ,OAAO,IAAI,IAAI,CAAC;AAS5D,IAAM,+BACJ,MACA,cACc;AACd,KAAI,CAAC,MAAM,QAAQ,KAAK,CACtB,QAAO,EAAE;CAGX,MAAMC,iBAA4B,EAAE;CACpC,MAAM,8BAAc,IAAI,KAAc;AAEtC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,UAAU,IAAI,IAAI,YAAY,IAAI,IAAI,CACzC;EAGF,MAAM,OAAO,UAAU,WAAW,IAAI,IAAI;AAE1C,MAAI,CAAC,QAAQ,CAAC,gBAAgB,KAAK,CACjC;AAGF,cAAY,IAAI,IAAI;AACpB,iBAAe,KAAK,IAAI;;AAG1B,QAAO;;AAMT,IAAM,kCACJ,MACA,aACA,cACG;CACH,MAAM,gBAAgB,IAAI,IAAa,YAAY;AAEnD,QAAO,4BAA4B,MAAM,UAAU,CAAC,QAAQ,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC;;AAO9F,IAAM,4BAA4B,SAAwB;CACxD,MAAM,+BAAe,IAAI,KAAc;CAEvC,MAAM,SAAS,gBAA+B;AAC5C,MAAI,YAAY,SACd;AAGF,MAAI,gBAAgB,YAAY,CAC9B,cAAa,IAAI,YAAY,IAAI;AAGnC,OAAK,MAAM,aAAa,YAAY,WAClC,OAAM,UAAU;;AAIpB,OAAM,KAAK;AAEX,QAAO;;AAOT,IAAM,8BAA8B,SAAwB;CAC1D,MAAM,iCAAiB,IAAI,KAAc;CACzC,IAAI,gBAAgB,KAAK;AAEzB,QAAO,eAAe;AACpB,MAAI,cAAc,SAChB;AAGF,MAAI,gBAAgB,cAAc,CAChC,gBAAe,IAAI,cAAc,IAAI;AAGvC,kBAAgB,cAAc;;AAGhC,QAAO;;AAMT,IAAM,gCAAgC,mBAA8B,cAAyB;CAC3F,MAAM,yCAAyB,IAAI,KAAc;AAEjD,MAAK,MAAM,OAAO,4BAA4B,mBAAmB,UAAU,EAAE;EAC3E,MAAM,OAAO,UAAU,WAAW,IAAI,IAAI;AAE1C,MAAI,CAAC,KACH;AAGF,MAAI,KAAK,UAAU;AACjB,0BAAuB,IAAI,KAAK,IAAI;AACpC;;AAGF,OAAK,MAAM,aAAa,yBAAyB,KAAK,CACpD,wBAAuB,IAAI,UAAU;;AAIzC,QAAO;;AAQT,IAAM,mCACJ,qBACA,cACqB;CACrB,MAAM,gCAAgB,IAAI,KAAc;CACxC,MAAM,oCAAoB,IAAI,KAAc;CAE5C,MAAM,SAAS,SAA0C;AACvD,MAAI,KAAK,UAAU;AACjB,QAAK,MAAM,aAAa,KAAK,WAC3B,OAAM,UAAU;AAGlB,OAAI,gBAAgB,KAAK,IAAI,oBAAoB,IAAI,KAAK,IAAI,CAC5D,eAAc,IAAI,KAAK,IAAI;AAG7B,UAAO;;EAGT,MAAM,cAAc,KAAK,WACtB,KAAK,cAAc,MAAM,UAAU,CAAC,CACpC,QAAQ,UAAU,UAAU,OAAO;EACtC,MAAM,uBAAuB,YAAY,SAAS;EAClD,MAAM,qBACJ,wBAAwB,YAAY,OAAO,UAAU,UAAU,OAAO;EACxE,MAAM,uBAAuB,YAAY,MACtC,UAAU,UAAU,UAAU,UAAU,UAC1C;EACD,MAAM,cAAc,gBAAgB,KAAK,IAAI,oBAAoB,IAAI,KAAK,IAAI;AAE9E,MAAI,CAAC,gBAAgB,KAAK,EAAE;AAC1B,OAAI,mBACF,QAAO;AAGT,OAAI,qBACF,QAAO;AAGT,UAAO;;AAGT,MAAI,wBAAwB,oBAAoB;AAC9C,iBAAc,IAAI,KAAK,IAAI;AAC3B,UAAO;;AAGT,MAAI,sBAAsB;AACxB,qBAAkB,IAAI,KAAK,IAAI;AAC/B,UAAO;;AAGT,MAAI,aAAa;AACf,iBAAc,IAAI,KAAK,IAAI;AAC3B,UAAO;;AAGT,SAAO;;AAGT,MAAK,MAAM,QAAQ,UAAU,MAC3B,OAAM,KAAK;AAGb,QAAO;EACL,aAAa,cAAc,eAAe,UAAU;EACpD,iBAAiB,cAAc,mBAAmB,UAAU;EAC7D;;AAMH,MAAa,2BACX,mBACA,cAEA,gCACE,6BAA6B,qBAAqB,EAAE,EAAE,UAAU,EAChE,UACD;AAKH,MAAa,mCACX,aACA,cACqB;CACrB,MAAM,wBAAwB,4BAC5B,wBAAwB,YAAY,GAAG,YAAY,UAAU,aAC7D,UACD;AAKD,QAAO;EACL,aAAa;EACb,iBANgC,wBAAwB,YAAY,GAClE,+BAA+B,YAAY,aAAa,uBAAuB,UAAU,GACzF,EAAE;EAKL;;AAMH,MAAa,6BAA6B,EACxC,aACA,WACA,aAMA,SACI,gCAAgC,aAAa,UAAU,GACvD,wBACE,wBAAwB,YAAY,GAAG,YAAY,UAAU,aAC7D,UACD;AAQP,MAAa,mCAAmC,EAC9C,MACA,aACA,gBAKsB;CACtB,MAAM,oBAAoB,IAAI,IAAa,YAAY;CACvD,MAAM,eAAe,yBAAyB,KAAK;AAEnD,KAAI,kBAAkB,IAAI,KAAK,IAAI,EAAE;AACnC,OAAK,MAAM,OAAO,aAChB,mBAAkB,OAAO,IAAI;AAG/B,OAAK,MAAM,OAAO,2BAA2B,KAAK,CAChD,mBAAkB,OAAO,IAAI;OAG/B,MAAK,MAAM,OAAO,aAChB,mBAAkB,IAAI,IAAI;AAI9B,QAAO,wBAAwB,MAAM,KAAK,kBAAkB,EAAE,UAAU;;AAM1E,MAAa,8BAA8B,EACzC,QACA,aACA,sBAMA,SACI;CACE,SAAS;CACT,aAAa;CACd,GACD;ACtSN,MAAa,uBAAuB,EAAE,OAAO,WAAW,WAAuC;CAC7F,MAAM,2BAA2B,WAA6B;EAC5D,aAAa,EAAE;EACf,iBAAiB,EAAE;EACpB,CAAC;CACF,MAAM,kCAAkC,IAAI,MAAM;CAKlD,MAAM,eAAe,eAAe,MAAM,gBAAgB,KAAA,EAAU;CAKpE,MAAM,kBAAkB,eAAe,MAAM,cAAc,KAAK;CAKhE,MAAM,eAAe,eAAe,MAAM,kBAAkB,KAAK;CAKjE,MAAM,yBAAyB,eAC7B,0BAA0B;EACxB,aAAa,MAAM;EACnB,WAAW,UAAU;EACrB,QAAQ,aAAa;EACtB,CAAC,CACH;CAKD,MAAM,+BACJ,aAAa,QAAQ,uBAAuB,QAAQ,yBAAyB;CAK/E,MAAM,8BAA8B,wBAAwB,CAAC;CAK7D,MAAM,kCAAkC,wBAAwB,CAAC;CAQjE,MAAM,qCAAqC;AACzC,MAAI,CAAC,gCAAgC,OAAO;AAC1C,4BAAyB,QAAQ,0BAA0B;IACzD,aAAa,MAAM;IACnB,WAAW,UAAU;IACrB,QAAQ,aAAa;IACtB,CAAC;AACF,mCAAgC,QAAQ;AACxC;;AAGF,2BAAyB,QAAQ,0BAA0B;GACzD,aAAa,2BAA2B;IACtC,QAAQ,aAAa;IACrB,aAAa,yBAAyB,MAAM;IAC5C,iBAAiB,yBAAyB,MAAM;IACjD,CAAC;GACF,WAAW,UAAU;GACrB,QAAQ,aAAa;GACtB,CAAC;;CAMJ,MAAM,iBAAiB,YAAqB,uBAAuB,CAAC,SAAS,QAAQ;CAKrF,MAAM,qBAAqB,YAAqB,2BAA2B,CAAC,SAAS,QAAQ;CAK7F,MAAM,wBAAwB,SAAwB,KAAK;CAK3D,MAAM,sBAAsB,SAAwB,KAAK;CAKzD,MAAM,iBAAiB,SACrB,gBAAgB,SAAS,qBAAqB,KAAK,IAAI,CAAC,mBAAmB,KAAK;CAKlF,MAAM,gCAAgC,YAAuC;EAC3E,MAAM,sBAAsB,wBAAwB;EACpD,MAAM,kBAAkB,oBAAoB,YAAY,SAAS,QAAQ,GACrE,oBAAoB,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,GAChE,CAAC,GAAG,oBAAoB,aAAa,QAAQ;EACjD,MAAM,oBAAoB,IAAI,IAAa,gBAAgB;AAE3D,SAAO;GACL,aAAa;GACb,iBAAiB,oBAAoB,gBAAgB,QAClD,QAAQ,QAAQ,WAAW,CAAC,kBAAkB,IAAI,IAAI,CACxD;GACF;;CAMH,MAAM,0BAA0B,SAC9B,aAAa,QACT,6BAA6B,KAAK,IAAI,GACtC,gCAAgC;EAC9B;EACA,aAAa,uBAAuB;EACpC,WAAW,UAAU;EACtB,CAAC;CAKR,MAAM,0BAA0B,EAC9B,MACA,OACA,uBAKI;EACJ,MAAM,uBAAuB,2BAA2B;GACtD,QAAQ,aAAa;GACrB,aAAa,iBAAiB;GAC9B,iBAAiB,iBAAiB;GACnC,CAAC;AAEF,OAAK,sBAAsB,qBAAqB;AAChD,OAAK,SAAS,sBAAsB;GAClC,SAAS,iBAAiB,YAAY,SAAS,KAAK,IAAI;GACxD,MAAM,oBAAoB,EAAE,MAAM,CAAC;GACnC,cAAc,iBAAiB,YAC5B,KAAK,QAAQ,UAAU,MAAM,WAAW,IAAI,IAAI,CAAC,CACjD,QAAQ,SAAgC,SAAS,KAAA,EAAU,CAC3D,KAAK,gBAAgB,oBAAoB,EAAE,MAAM,aAAa,CAAC,CAAC;GACnE,iBAAiB,iBAAiB;GAClC,KAAK,KAAK;GACV;GACD,CAAC;;CAMJ,MAAM,qBAAqB,EAAE,MAAM,YAAsC;AACvE,MAAI,CAAC,cAAc,KAAK,CACtB;EAGF,MAAM,mBAAmB,uBAAuB,KAAK;AAErD,MAAI,CAAC,aAAa,MAChB,0BAAyB,QAAQ;AAGnC,yBAAuB;GACrB;GACA;GACA;GACD,CAAC;;AAGJ,OACE;EAAC;EAAW;EAAc;EAAa,QACjC;AACJ,MAAI,CAAC,aAAa,MAChB,+BAA8B;IAGlC,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL,aAAa,SAAS,sBAAsB;EAC5C,iBAAiB,SAAS,0BAA0B;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;ACvLH,IAAM,oBAAoB,QAAuB,WAC/C,OAAO,WAAW,MACf,cAAc,UAAU,QAAQ,OAAO,OAAO,iBAAiB,WAAW,OAAO,CACnF;AAKH,IAAM,mBAAmB,MAAgB,sBAA0C;CACjF,MAAM,gBAAgB,KAAK;AAE3B,QAAO,MAAM,QAAQ,cAAc,GAAI,gBAA+B,EAAE;;AAM1E,IAAM,qBAAqB,MAAgB,sBAA0C;CACnF,MAAM,gBAAgB,KAAK;AAE3B,KAAI,MAAM,QAAQ,cAAc,CAC9B,QAAO;CAGT,MAAMC,eAA2B,EAAE;AACnC,MAAK,qBAAqB;AAE1B,QAAO;;AAMT,IAAM,wBACJ,OACA,WACA,sBACiC;AACjC,MAAK,IAAI,UAAQ,GAAG,UAAQ,MAAM,QAAQ,WAAS,GAAG;EACpD,MAAM,OAAO,MAAM;AAEnB,MAAI,KAAK,QAAQ,UACf,QAAO;GACL,QAAQ;GACR,OAAA;GACA;GACD;EAGH,MAAM,gBAAgB,qBACpB,gBAAgB,MAAM,kBAAkB,EACxC,WACA,kBACD;AAED,MAAI,cACF,QAAO;;;AAUb,IAAM,mBAAmB,EACvB,OACA,SACA,iBAKsB;CACtB,MAAM,OAAO,QAAQ,uBAAuB;AAE5C,KAAI,KAAK,UAAU,EACjB,QAAO,WAAW,QAAQ,UAAU;CAGtC,MAAM,cAAc,WAAW,OAC3B,WAAW,QACT,MACA,WAAW,OACT,MACA,IACJ,OAAO;CACX,MAAM,cAAc,WAAW,OAC3B,WAAW,QACT,MACA,WAAW,OACT,MACA,IACJ,OAAO;CACX,MAAM,WAAW,MAAM,UAAU,KAAK;AAEtC,KAAI,WAAW,KAAK,SAAS,YAC3B,QAAO;AAGT,KAAI,WAAW,KAAK,SAAS,YAC3B,QAAO;AAGT,QAAO,WAAW,QAAQ,UAAU;;AAStC,MAAa,oBAAoB,EAC/B,OACA,WACA,MACA,uBAC6B;CAC7B,MAAM,cAAc,WAA2B,KAAK;CACpD,MAAM,kBAAkB,WAAuC,KAAK;CAEpE,MAAM,kBAAkB,eAAe,MAAM,cAAc,KAAK;CAEhE,MAAM,oBAAoB;AACxB,MAAI,YAAY,UAAU,KACxB;AAGF,SAAO,UAAU,MAAM,WAAW,IAAI,YAAY,MAAM;;CAG1D,MAAM,oBAAoB;EACxB,MAAM,cAAc,gBAAgB,OAAO;AAE3C,MAAI,gBAAgB,KAAA,EAClB;AAGF,SAAO,UAAU,MAAM,WAAW,IAAI,YAAY;;CAGpD,MAAM,mBAAmB,SAAkC,oBAAoB,EAAE,MAAM,CAAC;CAExF,MAAM,wBAAwB,gBAAgB;CAE9C,MAAM,eAAe,SACnB,KAAK,SAAS,KAAK,OAAO,aAAa,UAAU,MAAM;CAEzD,MAAM,yBACJ,YACA,cACA,aACuB;EACvB,MAAM,iBAAiB,EAAE,GAAG,YAAY;EACxC,MAAM,WAAW,YAAY,SAAS;EACtC,MAAM,gBAAgB,SAAS,WAAW,SAAS,KAAK,QAAQ,SAAS,IAAI;AAE7E,MAAI,SAAS,gBAAgB,IAAI,QAAQ,aAAa,IACpD,gBAAe,OAAO;AAGxB,MAAI,SAAS,gBAAgB,IAAI,QAAQ,aAAa,IACpD,gBAAe,OAAO;AAGxB,MAAI,SAAS,WAAW,MAAM,cAAc,UAAU,QAAQ,aAAa,IAAI,CAC7E,gBAAe,QAAQ;AAGzB,MAAI,aAAa,QAAQ,SAAS,OAAO,iBAAiB,cAAc,SAAS,EAAE;AACjF,kBAAe,OAAO;AACtB,kBAAe,QAAQ;AACvB,kBAAe,OAAO;;AAGxB,SAAO;;CAGT,MAAM,4BACJ,cACA,aACuB;AACvB,MAAI,OAAO,MAAM,cAAc,WAC7B,QAAO;GACL,MAAM;GACN,OAAO;GACP,MAAM;GACP;EAGH,MAAM,oBAAoB,gBAAgB,aAAa;EACvD,MAAM,gBAAgB,gBAAgB,SAAS;AAE/C,SAAO;GACL,MAAM,MAAM,UAAU,mBAAmB,eAAe,OAAO,KAAK;GACpE,OAAO,MAAM,UAAU,mBAAmB,eAAe,QAAQ,KAAK;GACtE,MAAM,MAAM,UAAU,mBAAmB,eAAe,OAAO,KAAK;GACrE;;CAGH,MAAM,wBACJ,cACA,aAEA,sBAAsB,yBAAyB,cAAc,SAAS,EAAE,cAAc,SAAS;CAEjG,MAAM,yBAAyB,EAC7B,MACA,OACA,cAMU;EACV,MAAM,eAAe,aAAa;AAElC,MAAI,CAAC,aACH,QAAO;EAGT,MAAM,mBAAmB,aAAa;EACtC,MAAM,WAAW,gBAAgB;GAC/B;GACA;GACA,YAAY,qBAAqB,cAAc,KAAK;GACrD,CAAC;AAEF,kBAAgB,QAAQ;GACtB,KAAK,KAAK;GACV;GACD;AAED,SAAO;GACL;GACA,UAAU;GACV;GACA;GACD;;CAGH,MAAM,qBAAqB,UAAqB;AAC9C,MAAI,CAAC,MAAM,aACT;AAGF,QAAM,aAAa,gBAAgB;AAEnC,MAAI;AACF,SAAM,aAAa,QAAQ,cAAc,GAAG;UACtC;;CAOV,MAAM,gBAAgB,EACpB,SACA,SACA,eAKI;EACJ,MAAM,oBAAoB,2BAA2B,MAAM,MAAM,CAAC;EAClE,MAAM,WAAW,MAAM,QAAQ,EAAE;EACjC,MAAM,eAAe,qBAAqB,UAAU,SAAS,kBAAkB;AAE/E,MAAI,CAAC,aACH,QAAO;EAGT,MAAM,CAAC,YAAY,aAAa,OAAO,OAAO,aAAa,OAAO,EAAE;EACpE,MAAM,eAAe,qBAAqB,UAAU,SAAS,kBAAkB;AAE/E,MAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,OAAI,SACF,cAAa,OAAO,OAClB,KAAK,IAAI,aAAa,OAAO,aAAa,OAAO,OAAO,EACxD,GACA,SACD;AAGH,UAAO;;AAGT,MAAI,aAAa,SAAS;AACxB,qBAAkB,aAAa,MAAM,kBAAkB,CAAC,KAAK,SAAS;AACtE,UAAO;;EAGT,MAAM,cAAc,aAAa,WAAW,aAAa,QAAQ,aAAa,QAAQ;AACtF,eAAa,OAAO,OAAO,aAAa,GAAG,SAAS;AAEpD,SAAO;;CAGT,MAAM,uBAAuB,EAAE,MAAM,YAAiC;AACpE,MAAI,CAAC,MAAM,UACT;AAGF,MAAI,OAAO,MAAM,cAAc,cAAc,CAAC,MAAM,UAAU,gBAAgB,KAAK,CAAC,EAAE;AACpF,SAAM,gBAAgB;AACtB;;AAGF,cAAY,QAAQ,KAAK;AACzB,kBAAgB,QAAQ;AACxB,oBAAkB,MAAM;AACxB,OAAK,mBAAmB,gBAAgB,KAAK,EAAE,MAAM;;CAGvD,MAAM,uBAAuB,YAAmC;AAC9D,MAAI,CAAC,aAAa,CAChB;AAGF,UAAQ,MAAM,gBAAgB;EAE9B,MAAM,gBAAgB,sBAAsB,QAAQ;AAEpD,MAAI,cACF,MACE,mBACA,gBAAgB,cAAc,aAAa,EAC3C,gBAAgB,cAAc,SAAS,EACvC,QAAQ,MACT;;CAIL,MAAM,sBAAsB,YAAmC;AAC7D,MAAI,CAAC,aAAa,CAChB;AAGF,UAAQ,MAAM,gBAAgB;EAE9B,MAAM,oBAAoB,gBAAgB,OAAO;EACjD,MAAM,gBAAgB,sBAAsB,QAAQ;AAEpD,MAAI,CAAC,cACH;AAGF,MAAI,QAAQ,MAAM,aAChB,SAAQ,MAAM,aAAa,aAAa,cAAc,aAAa,SAAS,SAAS;AAGvF,MAAI,sBAAsB,cAAc,SAAS,KAAK;AACpD,OAAI,cAAc,iBAChB,MACE,mBACA,gBAAgB,cAAc,aAAa,EAC3C,gBAAgB,cAAc,iBAAiB,EAC/C,QAAQ,MACT;AAGH,QACE,mBACA,gBAAgB,cAAc,aAAa,EAC3C,gBAAgB,cAAc,SAAS,EACvC,QAAQ,MACT;;AAGH,OACE,kBACA,gBAAgB,cAAc,aAAa,EAC3C,gBAAgB,cAAc,SAAS,EACvC,QAAQ,MACT;;CAGH,MAAM,uBAAuB,EAAE,MAAM,YAAmC;EACtE,MAAM,eAAe,aAAa;AAElC,MAAI,CAAC,gBAAgB,gBAAgB,OAAO,QAAQ,KAAK,IACvD;AAGF,kBAAgB,QAAQ;AACxB,OAAK,mBAAmB,gBAAgB,aAAa,EAAE,gBAAgB,KAAK,EAAE,MAAM;;CAGtF,MAAM,kBAAkB,EAAE,YAAmC;AAC3D,MAAI,CAAC,aAAa,CAChB;AAGF,QAAM,gBAAgB;;CAGxB,MAAM,qBAAqB,EAAE,MAAM,YAAiC;EAClE,MAAM,eAAe,aAAa,IAAI;EACtC,MAAM,WAAW,aAAa;EAE9B,IAAI,gBADgB,gBAAgB,OACH,YAAY;EAC7C,IAAI,UAAQ;AAEZ,QAAM,gBAAgB;AAEtB,MAAI,MAAM,aACR,OAAM,aAAa,aAAa,kBAAkB,SAAS,SAAS;AAGtE,MAAI,YAAY,kBAAkB,QAAQ;AACxC,aAAQ,aAAa;IACnB,SAAS,aAAa;IACtB,SAAS,SAAS;IAClB,UAAU;IACX,CAAC;AAEF,OAAI,QACF,mBAAkB;OAElB,iBAAgB;;EAIpB,MAAM,qBAAqB,UAAU,MAAM,WAAW,IAAI,aAAa,IAAI,IAAI;EAC/E,MAAM,iBAAiB,WAClB,UAAU,MAAM,WAAW,IAAI,SAAS,IAAI,IAAI,WACjD;AAEJ,MAAI,YAAY,UAAU,MAAM;AAC9B,QACE,iBACA,gBAAgB,mBAAmB,EACnC,iBAAiB,gBAAgB,eAAe,GAAG,MACnD,eACA,MACD;AAED,OAAI,WAAS,kBAAkB,kBAAkB,OAC/C,MACE,aACA,gBAAgB,mBAAmB,EACnC,gBAAgB,eAAe,EAC/B,eACA,MACD;;AAIL,cAAY,QAAQ;AACpB,kBAAgB,QAAQ;;CAG1B,MAAM,kBAAkB,YAAqB,YAAY,UAAU;CAEnE,MAAM,oBAAoB,YAAqB,gBAAgB,OAAO,QAAQ;CAE9E,MAAM,qBAAqB,YACzB,gBAAgB,OAAO,QAAQ,WAAW,gBAAgB,MAAM,aAAa;CAE/E,MAAM,mBAAmB,YACvB,gBAAgB,OAAO,QAAQ,UAAU,gBAAgB,MAAM,WAAW,KAAA;CAE5E,MAAM,sBAAsB;AAC1B,MAAI,YAAY,UAAU,QAAQ,CAAC,UAAU,MAAM,WAAW,IAAI,YAAY,MAAM,CAClF,aAAY,QAAQ;EAGtB,MAAM,YAAY,gBAAgB,OAAO;AAEzC,MAAI,cAAc,KAAA,KAAa,CAAC,UAAU,MAAM,WAAW,IAAI,UAAU,CACvE,iBAAgB,QAAQ;;AAI5B,OAAM,WAAW,cAAc;AAE/B,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AClfH,IAAM,qBAAqB,cAAyB,YAAgC;AAClF,KAAI,aAAa,SAAS,QAAQ,CAChC,QAAO,aAAa,QAAQ,QAAQ,QAAQ,QAAQ;AAGtD,QAAO,CAAC,GAAG,cAAc,QAAQ;;AAGnC,IAAM,+BACJ,cACA,OACA,cAEA,MAAM,YACF,+BAA+B,cAAc,UAAU,aAAa,GACpE;AAKN,IAAM,mCAAmC,OAAkB,cAAoC;CAC7F,IAAIC;AAEJ,KAAI,MAAM,wBAAwB,KAAA,GAAW;AAC3C,wBAAsB,uBAAuB,MAAM,qBAAqB,UAAU,WAAW;AAC7F,SAAO,4BAA4B,qBAAqB,OAAO,UAAU;;AAG3E,KAAI,MAAM,kBAAkB;AAC1B,wBAAsB,0BAA0B,UAAU,MAAM;AAChE,SAAO,4BAA4B,qBAAqB,OAAO,UAAU;;AAG3E,QAAO,EAAE;;AAMX,IAAM,wCACJ,OACA,WACA,uBACiB;AACjB,KAAI,MAAM,wBAAwB,KAAA,KAAa,CAAC,MAAM,oBACpD,wBAAO,IAAI,KAAc;CAG3B,MAAM,uBAAuB,4BAC3B,oBACA,UAAU,aACX;AAED,MAAK,MAAM,OAAO,mBAChB,sBAAqB,OAAO,IAAI;AAGlC,QAAO;;AAMT,IAAM,6CAA6C,EACjD,oBACA,yBACA,0BACA,cACA,gBAOkB;CAClB,MAAM,wBAAwB,CAAC,GAAG,wBAAwB,CAAC,QACxD,QAAQ,CAAC,yBAAyB,IAAI,IAAI,CAC5C;AAED,KAAI,WAAW;EACb,MAAMC,sBAAiC,EAAE;EACzC,MAAM,8BAAc,IAAI,KAAc;EACtC,MAAM,kBAAkB,QAAiB;AACvC,OAAI,CAAC,YAAY,IAAI,IAAI,EAAE;AACzB,gBAAY,IAAI,IAAI;AACpB,wBAAoB,KAAK,IAAI;;;AAIjC,OAAK,MAAM,OAAO,oBAAoB;GACpC,IAAI,YAAY,aAAa,IAAI,IAAI,IAAI;AAEzC,UAAO,cAAc,MAAM;AACzB,QAAI,wBAAwB,IAAI,UAAU,IAAI,CAAC,yBAAyB,IAAI,UAAU,CACpF,gBAAe,UAAU;AAG3B,gBAAY,aAAa,IAAI,UAAU,IAAI;;AAG7C,kBAAe,IAAI;;AAGrB,SAAO,IAAI,IAAI,+BAA+B,qBAAqB,aAAa,CAAC;;CAGnF,MAAM,wBAAwB,IAAI,IAAa,mBAAmB;AAElE,MAAK,MAAM,OAAO,sBAChB,uBAAsB,IAAI,IAAI;AAGhC,QAAO;;AAST,MAAa,wBAAwB,EACnC,OACA,WACA,MACA,uBACiC;CACjC,MAAM,iCAAiC,WAAsB,EAAE,CAAC;CAChE,MAAM,0BAA0B,2BAAW,IAAI,KAAc,CAAC;CAC9D,MAAM,2BAA2B,2BAAW,IAAI,KAAc,CAAC;CAC/D,MAAM,kCAAkC,IAAI,MAAM;CAClD,MAAM,yBACJ,sBAAsB,SAAwB,KAAK,WAAW,SAAS;CAKzE,MAAM,eAAe,eAAe,MAAM,iBAAiB,KAAA,EAAU;CAKrE,MAAM,+BAA+B,eACnC,4BACE,uBAAuB,MAAM,cAAc,UAAU,MAAM,WAAW,EACtE,OACA,UAAU,MACX,CACF;CAKD,MAAM,qCACJ,aAAa,QAAQ,6BAA6B,QAAQ,+BAA+B;CAK3F,MAAM,sCAAsC;AAC1C,MAAI,CAAC,gCAAgC,OAAO;GAC1C,MAAM,4BAA4B,gCAAgC,OAAO,UAAU,MAAM;AAEzF,kCAA+B,QAAQ;AACvC,2BAAwB,QAAQ,qCAC9B,OACA,UAAU,OACV,0BACD;AACD,4BAAyB,wBAAQ,IAAI,KAAc;AACnD,mCAAgC,QAAQ;AACxC;;AAGF,iCAA+B,QAAQ,4BACrC,uBAAuB,+BAA+B,OAAO,UAAU,MAAM,WAAW,EACxF,OACA,UAAU,MACX;AACD,0BAAwB,QAAQ,gBAC9B,wBAAwB,OACxB,UAAU,MAAM,WACjB;AACD,2BAAyB,QAAQ,gBAC/B,yBAAyB,OACzB,UAAU,MAAM,WACjB;;CAMH,MAAM,gDACJ,8BAA8B;EAC5B,oBAAoB,6BAA6B;EACjD,cAAc,UAAU,MAAM;EAC9B,qBAAqB,QAAQ,MAAM,iBAAiB;EACpD,WAAW,QAAQ,MAAM,UAAU;EACpC,CAAC;CAKJ,MAAM,2CACJ,0CAA0C;EACxC,oBAAoB,+BAA+B;EACnD,yBAAyB,wBAAwB;EACjD,0BAA0B,yBAAyB;EACnD,cAAc,UAAU,MAAM;EAC9B,WAAW,QAAQ,MAAM,UAAU;EACpC,CAAC;CAKJ,MAAM,0BAA0B,eAC9B,aAAa,QACT,yCAAyC,GACzC,oCAAoC,CACzC;CAKD,MAAM,kBAAkB,YAAqB,wBAAwB,MAAM,IAAI,QAAQ;CAKvF,MAAM,uBAAuB,EAC3B,MACA,UACA,kCAKI;EACJ,MAAM,YAAY,oBAAoB;GACpC;GACA,kBAAkB,YAAY,4BAA4B,IAAI,QAAQ;GACvE,CAAC;AAEF,MAAI,4BAA4B,IAAI,KAAK,IAAI,EAAE;AAC7C,QAAK,eAAe,KAAK,MAAM,WAAW,SAAS;AACnD;;AAGF,OAAK,iBAAiB,KAAK,MAAM,WAAW,SAAS;;CAMvD,MAAM,2BAA2B,EAC/B,MACA,UACA,wBACA,kCAMI;AACJ,OAAK,uBAAuB,uBAAuB;AACnD,sBAAoB;GAClB;GACA;GACA;GACD,CAAC;AACF,OAAK,UAAU;GACb,UAAU,4BAA4B,IAAI,KAAK,IAAI;GACnD,MAAM,KAAK;GACX,KAAK,KAAK;GACV,cAAc;GACf,CAAC;;CAQJ,MAAM,uBAAuB,EAAE,MAAM,eAA2C;AAC9E,MAAI,CAAC,uBAAuB,KAAK,CAC/B;AAGF,MAAI,aAAa,OAAO;GACtB,MAAM,2BAAyB,4BAC7B,kBAAkB,6BAA6B,OAAO,KAAK,IAAI,EAC/D,OACA,UAAU,MACX;AAQD,2BAAwB;IACtB;IACA;IACA,wBAAA;IACA,6BAXkC,8BAA8B;KAChE,oBAAoB;KACpB,cAAc,UAAU,MAAM;KAC9B,qBAAqB,QAAQ,MAAM,iBAAiB;KACpD,WAAW,QAAQ,MAAM,UAAU;KACpC,CAAC;IAOD,CAAC;AACF;;EAGF,IAAI,yBAAyB,+BAA+B;EAC5D,IAAI,+BAA+B,yBAAyB;AAE5D,MAAI,+BAA+B,MAAM,SAAS,KAAK,IAAI,CACzD,0BAAyB,kBAAkB,+BAA+B,OAAO,KAAK,IAAI;WACjF,wBAAwB,MAAM,IAAI,KAAK,IAAI,EAAE;AACtD,kCAA+B,IAAI,IAAa,yBAAyB,MAAM;AAE/E,OAAI,6BAA6B,IAAI,KAAK,IAAI,CAC5C,8BAA6B,OAAO,KAAK,IAAI;OAE7C,8BAA6B,IAAI,KAAK,IAAI;QAG5C,0BAAyB,kBAAkB,+BAA+B,OAAO,KAAK,IAAI;AAG5F,2BAAyB,4BACvB,wBACA,OACA,UAAU,MACX;AACD,iCAA+B,QAAQ;AACvC,2BAAyB,QAAQ;EAEjC,MAAM,8BAA8B,0CAA0C;GAC5E,oBAAoB;GACpB,yBAAyB,wBAAwB;GACjD,0BAA0B;GAC1B,cAAc,UAAU,MAAM;GAC9B,WAAW,QAAQ,MAAM,UAAU;GACpC,CAAC;AAEF,0BAAwB;GACtB;GACA;GACA;GACA;GACD,CAAC;;AAGJ,OACE,CAAC,WAAW,aAAa,QACnB;AACJ,MAAI,CAAC,aAAa,MAChB,gCAA+B;IAGnC,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL;EACA;EACA;EACA,oBAAoB,SAAS,6BAA6B;EAC1D;EACD;;AClaH,IAAI,aAAa;AAEjB,IAAM,qBAAqB;AACzB,eAAc;AACd,QAAO,WAAW;;AAGpB,IAAM,iBAAiB,QAAiB,mBAAmB,OAAO,IAAI,CAAC;AAEvE,IAAM,oBAAoB,QAAgB,QACxC,GAAG,OAAO,QAAQ,OAAO,IAAI,GAAG,cAAc,IAAI;AAEpD,MAAa,wBAAwB,EACnC,WACA,cACA,gBACA,uBACiC;CACjC,MAAM,SAAS,cAAc;CAC7B,MAAM,aAAa,KAAc;CAEjC,MAAM,kBAAkB,eAAe;EACrC,MAAMC,sBAAiC,EAAE;EAEzC,MAAM,SAAS,UAA2B;AACxC,QAAK,MAAM,QAAQ,OAAO;AACxB,wBAAoB,KAAK,KAAK,IAAI;AAElC,QAAI,iBAAiB,KAAK,IAAI,eAAe,KAAK,IAAI,CACpD,OAAM,KAAK,WAAW;;;AAK5B,QAAM,UAAU,MAAM,MAAM;AAE5B,SAAO;GACP;CAEF,MAAM,oBAAoB,eAAe,IAAI,IAAa,gBAAgB,MAAM,CAAC;CAEjF,MAAM,aAAa,YAAqB,iBAAiB,QAAQ,QAAQ;CAEzE,MAAM,qBAAqB,eACzB,WAAW,UAAU,KAAA,IAAY,KAAA,IAAY,UAAU,WAAW,MAAM,CACzE;CAED,MAAM,uBACJ,WAAW,UAAU,KAAA,IAAY,KAAA,IAAY,UAAU,MAAM,WAAW,IAAI,WAAW,MAAM;CAE/F,MAAM,iBAAiB,YAAqB,WAAW,UAAU;CAEjE,MAAM,aAAa,YAAqB;AACtC,MAAI,CAAC,UAAU,MAAM,WAAW,IAAI,QAAQ,CAC1C;AAGF,aAAW,QAAQ;;CAGrB,MAAM,0BAA0B,YAAqB;EACnD,IAAI,cAAc,UAAU,MAAM,WAAW,IAAI,QAAQ,EAAE,UAAU;AAErE,SAAO,aAAa;AAClB,OAAI,kBAAkB,MAAM,IAAI,YAAY,IAAI,CAC9C,QAAO,YAAY;AAGrB,iBAAc,YAAY;;;CAM9B,MAAM,8BAA8B;AAGlC,SAF2B,aAAa,MAAM,MAAM,QAAQ,kBAAkB,MAAM,IAAI,IAAI,CAAC,IAEhE,gBAAgB,MAAM;;CAGrD,MAAM,uBAAuB;AAC3B,MAAI,gBAAgB,MAAM,WAAW,GAAG;AACtC,cAAW,QAAQ,KAAA;AACnB;;AAGF,MAAI,WAAW,UAAU,KAAA,KAAa,kBAAkB,MAAM,IAAI,WAAW,MAAM,CACjF;AAGF,aAAW,QACT,WAAW,UAAU,KAAA,IACjB,uBAAuB,GACtB,uBAAuB,WAAW,MAAM,IAAI,uBAAuB;;CAG5E,MAAM,eAAe,WAAmB;AACtC,MAAI,gBAAgB,MAAM,WAAW,GAAG;AACtC,cAAW,QAAQ,KAAA;AACnB;;EAGF,MAAM,eACJ,WAAW,UAAU,KAAA,IAAY,KAAK,gBAAgB,MAAM,QAAQ,WAAW,MAAM;EACvF,MAAM,gBAAgB,SAAS,IAAI,IAAI,gBAAgB,MAAM,SAAS;EACtE,MAAM,YACJ,iBAAiB,KACb,gBACA,KAAK,IAAI,KAAK,IAAI,eAAe,QAAQ,EAAE,EAAE,gBAAgB,MAAM,SAAS,EAAE;AAEpF,aAAW,QAAQ,gBAAgB,MAAM;;CAG3C,MAAM,qBAAqB,SAAwB;AACjD,MAAI,KAAK,OACP,YAAW,QAAQ,KAAK,OAAO;;CAInC,MAAM,yBAAyB,SAAwB;EACrD,MAAM,oBAAoB,KAAK,WAAW,MAAM,cAC9C,kBAAkB,MAAM,IAAI,UAAU,IAAI,CAC3C;AAED,MAAI,kBACF,YAAW,QAAQ,kBAAkB;;AAIzC,OAAM;EAAC;EAAiB;EAAmB;EAAa,EAAE,gBAAgB,EACxE,WAAW,MACZ,CAAC;AAEF,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AC7HH,MAAa,oBAAoB,EAAE,OAAO,WAAW,WAAoC;CACvF,MAAM,yBAAyB,WAAsB,EAAE,CAAC;CACxD,MAAM,gBAAgB,2BAAW,IAAI,KAAc,CAAC;CAKpD,MAAM,eAAe,eAAe,MAAM,eAAe,KAAA,EAAU;CAKnE,MAAM,uBAAuB,eAC3B,qBAAqB,MAAM,YAAY,UAAU,MAAM,WAAW,CACnE;CAKD,MAAM,6BACJ,aAAa,QAAQ,qBAAqB,QAAQ,uBAAuB;CAK3E,MAAM,0BAA0B;AAC9B,MAAI,CAAC,aAAa,MAChB,wBAAuB,QAAQ,qBAC7B,uBAAuB,OACvB,UAAU,MAAM,WACjB;AAGH,gBAAc,QAAQ,gBAAgB,cAAc,OAAO,UAAU,MAAM,WAAW;;CAMxF,MAAM,gBAAgB,YAAqB,sBAAsB,CAAC,SAAS,QAAQ;CAKnF,MAAM,iBAAiB,YAAqB,cAAc,MAAM,IAAI,QAAQ;CAK5E,MAAM,eAAe,SACnB,OAAO,MAAM,aAAa,cAC1B,CAAC,KAAK,UACN,CAAC,aAAa,KAAK,IAAI,IACvB,CAAC,cAAc,KAAK,IAAI;CAK1B,MAAM,kBAAkB,SAAkB,YAAqB;EAC7D,MAAM,oBAAoB,IAAI,IAAa,cAAc,MAAM;AAE/D,MAAI,QACF,mBAAkB,IAAI,QAAQ;MAE9B,mBAAkB,OAAO,QAAQ;AAGnC,gBAAc,QAAQ;;CAMxB,MAAM,wBAAwB,YAC5B,qBAAqB,CAAC,GAAG,sBAAsB,EAAE,QAAQ,EAAE,UAAU,MAAM,WAAW;CAKxF,MAAM,WAAW,OAAO,SAAwB;AAC9C,MAAI,CAAC,YAAY,KAAK,IAAI,OAAO,MAAM,aAAa,WAClD;AAGF,iBAAe,KAAK,KAAK,KAAK;AAE9B,MAAI;AACF,SAAM,MAAM,SAAS,oBAAoB,EAAE,MAAM,CAAC,CAAC;GAEnD,MAAM,iBAAiB,qBAAqB,KAAK,IAAI;GACrD,MAAM,aAAa,UAAU,MAAM,WAAW,IAAI,KAAK,IAAI,IAAI;AAE/D,OAAI,CAAC,aAAa,MAChB,wBAAuB,QAAQ;AAGjC,QAAK,qBAAqB,eAAe;AACzC,QAAK,QAAQ,gBAAgB;IAC3B,MAAM,oBAAoB,EAAE,MAAM,YAAY,CAAC;IAC/C,KAAK,KAAK;IACV,YAAY;IACb,CAAC;UACI,WAIE;AACR,kBAAe,KAAK,KAAK,MAAM;;;AAInC,OAAM,CAAC,WAAW,aAAa,EAAE,mBAAmB,EAAE,WAAW,MAAM,CAAC;AAExE,QAAO;EACL;EACA;EACA;EACA;EACA,YAAY,SAAS,qBAAqB;EAC3C;;AC7IH,IAAM,4BAA4B;AAElC,IAAM,kBAAkB,OAAO,WAAW,eAAe,OAAO,aAAa;AAE7E,IAAM,yBAAyB,YAC7B,YAAY,SAAS,oBACrB,YAAY,SAAS,mBACrB,YAAY,SAAS;AAEvB,IAAM,4BAA4B;AAGhC,QAAO;EACL,KAAK;EACL,QAJqB,OAAO,eAAe,SAAS,gBAAgB;EAKrE;;AAGH,IAAM,oBAAoB,cAA2B;AACnD,KAAI,sBAAsB,UAAU,CAClC,QAAO,qBAAqB;CAG9B,MAAM,OAAO,UAAU,uBAAuB;AAE9C,QAAO;EACL,KAAK,KAAK;EACV,QAAQ,KAAK;EACd;;AAGH,IAAM,uBAAuB,YAAyB;CACpD,MAAM,QAAQ,OAAO,iBAAiB,QAAQ;CAC9C,MAAM,YAAY,MAAM,aAAa,MAAM;AAE3C,QAAO,0BAA0B,KAAK,UAAU,IAAI,QAAQ,eAAe,QAAQ;;AAGrF,IAAM,+BACH,SAAS,oBAA2C,SAAS;AAEhE,IAAM,uBAAuB,YAAyB;CACpD,IAAI,iBAAiB,QAAQ;AAE7B,QAAO,gBAAgB;AACrB,MAAI,oBAAoB,eAAe,CACrC,QAAO;AAGT,mBAAiB,eAAe;;AAGlC,QAAO,wBAAwB;;AAGjC,IAAM,2BAA2B,EAC/B,OACA,WACA,QACA,aAMI;CACJ,MAAM,gBAAgB,iBAAiB,UAAU;CACjD,MAAM,aAAa,OAAO,uBAAuB;AAEjD,KAAI,UAAU,MACZ,QAAO,UAAU,YAAY,WAAW,MAAM,cAAc,MAAM;AAGpE,KAAI,UAAU,SACZ,QAAO,UAAU,YAAY,WAAW,SAAS,cAAc,SAAS;AAG1E,KAAI,WAAW,MAAM,cAAc,MAAM,OACvC,QAAO,UAAU,YAAY,WAAW,MAAM,cAAc,MAAM;AAGpE,KAAI,WAAW,SAAS,cAAc,SAAS,OAC7C,QAAO,UAAU,YAAY,WAAW,SAAS,cAAc,SAAS;AAG1E,QAAO,UAAU;;AASnB,MAAa,sBAAsB,EAAE,gBAA2C;CAC9E,MAAM,iCAAiB,IAAI,KAA2B;CAEtD,MAAM,uBAAuB,SAAkB,YAAgC;AAC7E,MAAI,CAAC,SAAS;AACZ,kBAAe,OAAO,QAAQ;AAC9B;;AAGF,iBAAe,IAAI,SAAS,QAAQ;;CAGtC,MAAM,yBAAyB,SAAkB,YAAgC;AAC/E,MAAI,CAAC,WAAW,eAAe,IAAI,QAAQ,KAAK,QAC9C,gBAAe,OAAO,QAAQ;;CAIlC,MAAM,YAAY,EAAE,KAAK,QAAQ,QAAQ,SAAS,QAA6B;AAC7E,MAAI,CAAC,WAAW,IAAI,CAAC,UAAU,MAAM,WAAW,IAAI,IAAI,CACtD;EAGF,MAAM,gBAAgB,eAAe,IAAI,IAAI;AAE7C,MAAI,CAAC,cACH;EAGF,MAAM,kBAAkB,oBAAoB,cAAc;AAQ1D,kBAAgB,YAPM,wBAAwB;GAC5C;GACA,WAAW;GACX;GACA,QAAQ;GACT,CAAC;;AAKJ,QAAO;EACL;EACA;EACA;EACD;;AClHH,IAAM,yBAAyB,MAA6B,cAC1D,uBAAuB,MAAM,UAAU,WAAW,CAAC,QAAQ,QAAQ;CACjE,MAAM,OAAO,UAAU,WAAW,IAAI,IAAI;AAE1C,KAAI,CAAC,KACH,QAAO;AAGT,QAAO,CAAC,KAAK,YAAY,KAAK;EAC9B;AAQJ,MAAa,wBAAwB,EAAE,OAAO,WAAW,WAAwC;CAC/F,MAAM,2BAA2B,WAAsB,EAAE,CAAC;CAC1D,MAAM,kCAAkC,IAAI,MAAM;CAKlD,MAAM,mBAAmB,eAAe,MAAM,eAAe,MAAM;CAKnE,MAAM,eAAe,eAAe,MAAM,iBAAiB,KAAA,EAAU;CAKrE,MAAM,aAAa,eAAe,MAAM,aAAa,KAAK;CAQ1D,MAAM,yBAAyB,SAA2C;AACxE,MAAI,CAAC,iBAAiB,MACpB,QAAO,EAAE;EAGX,MAAM,iBAAiB,sBAAsB,MAAM,UAAU,MAAM;AAEnE,MAAI,WAAW,MACb,QAAO;AAGT,SAAO,eAAe,SAAS,IAAI,CAAC,eAAe,GAAI,GAAG,EAAE;;CAM9D,MAAM,yBAAyB,eAAe,sBAAsB,MAAM,aAAa,CAAC;CAKxF,MAAM,+BACJ,aAAa,QAAQ,uBAAuB,QAAQ,yBAAyB;CAK/E,MAAM,sCAAsC;AAC1C,MAAI,CAAC,gCAAgC,OAAO;AAC1C,4BAAyB,QAAQ,sBAAsB,MAAM,oBAAoB;AACjF,mCAAgC,QAAQ;AACxC;;AAGF,2BAAyB,QAAQ,sBAAsB,yBAAyB,MAAM;;CAMxF,MAAM,iBAAiB,SACrB,iBAAiB,SAAS,CAAC,KAAK,YAAY,KAAK;CAKnD,MAAM,kBAAkB,YAAqB,wBAAwB,CAAC,SAAS,QAAQ;CAKvF,MAAM,2BAA2B,EAC/B,MACA,OACA,uBAKI;AACJ,OAAK,uBAAuB,iBAAiB;AAC7C,OAAK,UAAU,kBAAkB;GAC/B,UAAU,iBAAiB,SAAS,KAAK,IAAI;GAC7C,MAAM,oBAAoB,EAAE,MAAM,CAAC;GAKnC,eAAe,iBACZ,KAAK,QAAQ,UAAU,MAAM,WAAW,IAAI,IAAI,CAAC,CACjD,QAAQ,SAAgC,SAAS,KAAA,EAAU,CAC3D,KAAK,iBAAiB,oBAAoB,EAAE,MAAM,cAAc,CAAC,CAAC;GACrE,KAAK,KAAK;GACV;GACD,CAAC;;CAQJ,MAAM,0BAA0B,YAAgC;EAC9D,MAAM,sBAAsB,wBAAwB;AAEpD,MAAI,CAAC,WAAW,MACd,QAAO,oBAAoB,SAAS,QAAQ,GAAG,EAAE,GAAG,CAAC,QAAQ;AAG/D,MAAI,oBAAoB,SAAS,QAAQ,CACvC,QAAO,oBAAoB,QAAQ,QAAQ,QAAQ,QAAQ;AAG7D,SAAO,CAAC,GAAG,qBAAqB,QAAQ;;CAM1C,MAAM,cAAc,EAAE,MAAM,YAA+B;AACzD,MAAI,CAAC,cAAc,KAAK,CACtB;EAGF,MAAM,mBAAmB,uBAAuB,KAAK,IAAI;AAEzD,MAAI,CAAC,aAAa,MAChB,0BAAyB,QAAQ;AAGnC,0BAAwB;GACtB;GACA;GACA;GACD,CAAC;;AAGJ,OACE;EAAC;EAAW;EAAc;EAAkB;EAAW,QACjD;AACJ,MAAI,CAAC,aAAa,MAChB,gCAA+B;IAGnC,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL;EACA;EACA;EACA;EACA,cAAc,SAAS,uBAAuB;EAC/C;;;AG3MH,MAAaC,SAAsC;;;;;;;EFuFnD,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAEV;EACJ,MAAM,QAAQ,UAAU;EACxB,MAAM,KAAK,aAAa,OAAO;EAC/B,MAAM,gBAAgB,GAAG,GAAG;EAC5B,MAAM,kBAAkB,IAAI,EAAE;EAE9B,MAAM,6BAA6B;AACjC,mBAAgB,SAAS;;EAM3B,MAAM,+BAA+B;AAC9B,mBAAgB;AACrB,UAAO,eAAe,MAAM,MAAM,MAAM,OAAO;IAC7C,cAAc,MAAM;IACpB,kBAAkB,MAAM;IACxB,sBAAsB,MAAM;IAC5B,oBAAoB,MAAM;IAC3B,CAAC;;EAMJ,MAAM,iCACJ,0BAA0B,MAAM,YAAY,EAC1C,OACD,CAAC;EAKJ,MAAM,6BACJ,0BAA0B,MAAM,QAAQ,EACtC,OACD,CAAC;EAEJ,MAAM,YAAY,SAAS,uBAAuB;EAClD,MAAM,iBAAiB,eAAe,QAAQ,MAAM,QAAQ,CAAC;EAC7D,MAAM,qBAAqB,SAA6C,yBAAyB;EACjG,MAAM,iBAAiB,SAA4C,qBAAqB;EACxF,MAAM,kBAAkB,eAAe,QAAQ,MAAM,SAAS,CAAC;EAC/D,MAAM,eAAe,eACnB,OAAO,MAAM,aAAa,YAAY,MAAM,aAAa,OACrD,MAAM,SAAS,iBAAiB,QAChC,MACL;EACD,MAAM,eAAe,eAAe;GAClC,MAAM,WAAW,MAAM,YAAY,MAAM;AAEzC,UAAO,aAAa,KAAA,IAAY,IAAK;IACrC;EAKF,MAAM,iBAAiB,EACrB,MACA,WACA,YAKI;AACJ,QAAK,cAAc,KAAK,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,MAAM;;EAMhF,MAAM,oBAAoB,EACxB,MACA,WACA,YAKI;AACJ,QAAK,YAAY,KAAK,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,MAAM;;EAG9E,MAAM,sBAAsB,EAC1B,MACA,WACA,YAKI;AACJ,QAAK,eAAe,KAAK,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,MAAM;;EAGjF,MAAM,EAAE,cAAc,eAAe,aAAa,iBAAiB;GACjE;GACA;GACM;GACP,CAAC;EAEF,MAAM,EAAE,qBAAqB,UAAU,0BAA0B,mBAAmB,EAClF,WACD,CAAC;EAKF,MAAM,oBAAoB,SACxB,CAAC,KAAK,WACL,KAAK,WAAW,SAAS,KACxB,cAAc,KAAK,IAAI,IACtB,QAAQ,MAAM,SAAS,IAAI,CAAC,aAAa,KAAK,IAAI;EAEvD,MAAM,EAAE,gBAAgB,qBAAqB,uBAAuB,qBAAqB;GACvF;GACA;GACM;GACN;GACD,CAAC;EAEF,MAAM,kBAAkB,SACtB,QACE,MAAM,iBACJ,oBAAoB;GAClB;GACA,iBAAiB;GAClB,CAAC,CACH,CACF;EAEH,MAAM,EAAE,gBAAgB,kBAAkB,YAAY,iBAAiB,qBAAqB;GAC1F;GACA;GACM;GACP,CAAC;EAEF,MAAM,EACJ,oBACA,eACA,mBACA,iBACA,sBACA,sBACE,oBAAoB;GACtB;GACA;GACM;GACP,CAAC;EAEF,MAAM,EACJ,iBACA,mBACA,qBACA,qBACA,oBACA,qBACA,gBACA,iBACA,gBACA,mBACA,qBACE,iBAAiB;GACnB;GACA;GACM;GACN,kBAAkB;GACnB,CAAC;EAEF,MAAM,EACJ,oBACA,WACA,gBACA,WACA,eACA,aACA,uBACA,sBACE,qBAAqB;GACvB;GACA;GACA;GACA;GACD,CAAC;EAKF,MAAM,uBAAuB,YAAiE;AAC5F,aAAU,QAAQ,KAAK,IAAI;GAE3B,MAAM,cAAc,eAAe,QAAQ,KAAK,IAAI;AAEpD,sBAAmB,QAAQ;AAE3B,OAAI,CAAC,YACE,UAAS,QAAQ,KAAK;;EAI/B,MAAM,qBAAqB,YAAkE;AAC3F,aAAU,QAAQ,KAAK,IAAI;AAC3B,qBAAkB,QAAQ;;EAM5B,MAAM,0BAA0B,EAC9B,MACA,WACA,YAKI;AACJ,aAAU,KAAK,IAAI;AACnB,iBAAc;IACZ;IACA;IACA;IACD,CAAC;AACF,cAAW;IACT;IACA;IACD,CAAC;;EAMJ,MAAM,6BAA6B,EACjC,MACA,WACA,YAKI;AACJ,aAAU,KAAK,IAAI;AACnB,oBAAiB;IACf;IACA;IACA;IACD,CAAC;AAEF,OAAI,CAAC,iBAAiB,KAAK,IAAI,cAAc,KAAK,IAAI,CACpD;AAGF,uBAAoB;IAClB;IACA,UAAU;IACX,CAAC;;EAGJ,MAAM,gCAAgC,EACpC,MACA,WACA,YAKI;AACJ,aAAU,KAAK,IAAI;AACnB,sBAAmB;IACjB;IACA;IACA;IACD,CAAC;;EAGJ,MAAM,2BAA2B,MAAqB,UAAyB;AAC7E,0BAAuB;IACrB;IACA,WAAW;IACX;IACD,CAAC;;EAGJ,MAAM,qBAAqB,UAAyB;GAClD,MAAM,cAAc,gBAAgB;AAEpC,OAAI,CAAC,YACH;AAGF,OAAI,MAAM,QAAQ,aAAa;AAC7B,UAAM,gBAAgB;AACtB,gBAAY,EAAE;AACd;;AAGF,OAAI,MAAM,QAAQ,WAAW;AAC3B,UAAM,gBAAgB;AACtB,gBAAY,GAAG;AACf;;AAGF,OAAI,MAAM,QAAQ,cAAc;AAC9B,UAAM,gBAAgB;AAEtB,QAAI,CAAC,iBAAiB,YAAY,CAChC;AAGF,QAAI,CAAC,eAAe,YAAY,IAAI,EAAE;AACpC,yBAAoB;MAClB,MAAM;MACN,UAAU;MACX,CAAC;AACF;;AAGF,0BAAsB,YAAY;AAClC;;AAGF,OAAI,MAAM,QAAQ,aAAa;AAC7B,UAAM,gBAAgB;AAEtB,QAAI,iBAAiB,YAAY,IAAI,eAAe,YAAY,IAAI,EAAE;AACpE,yBAAoB;MAClB,MAAM;MACN,UAAU;MACX,CAAC;AACF;;AAGF,sBAAkB,YAAY;AAC9B;;AAGF,OAAI,MAAM,QAAQ,SAAS;AACzB,UAAM,gBAAgB;AACtB,4BAAwB,aAAa,MAAM;AAC3C;;AAGF,OAAI,MAAM,QAAQ,KAAK;AACrB,UAAM,gBAAgB;AAEtB,QAAI,gBAAgB,OAAO;AACzB,uBAAkB;MAChB,MAAM;MACN;MACD,CAAC;AACF;;AAGF,4BAAwB,aAAa,MAAM;;;AAQ/C,WAJ4B,EAC1B,UACD,CAEoB;;2DAzcnB,mBAAA,0CAA8C,EAC9C,mBAsDM,OAtDN,WACU,MAqDJ,MArDS,EAAA;IACZ,OAAK;KAAG,MAAA,cAAa;KAAE,mBAAA,MAAmB;KAAM,MAAA,GAAE,CAAC,GAAE,aAAc,gBAAA,MAAe;KAAA;IAClF,OAAO,eAAA,MAAe;IACtB,UAAU,aAAA;IACX,MAAK;IACJ,yBAAuB,MAAA,mBAAkB;IACzC,WAAS;0BACV,mBA6Ca,UAAA,MAAA,WA5CI,UAAA,MAAU,QAAlB,SAAI;wBADb,YA6Ca,mBAAA;KA3CV,KAAK,KAAK;KACJ;KACN,eAAa,MAAA,UAAS;KACtB,yBAAuB,MAAA,oBAAmB;KAC1C,2BAAyB,MAAA,sBAAqB;KAC9C,yBAAuB;KACvB,4BAA0B;KAC1B,+BAA6B;KAC7B,oBAAkB,MAAA,eAAc;KAChC,mBAAiB,MAAA,cAAa;KAC9B,wBAAsB,MAAA,kBAAiB;KACvC,oBAAkB,MAAA,eAAc;KAChC,mBAAiB,MAAA,cAAa;KAC9B,oBAAkB;KAClB,mBAAiB,MAAA,cAAa;KAC9B,sBAAoB;KACpB,qBAAmB,MAAA,gBAAe;KAClC,oBAAkB,MAAA,eAAc;KAChC,uBAAqB,MAAA,iBAAgB;KACrC,wBAAsB,MAAA,kBAAiB;KACvC,sBAAoB,MAAA,gBAAe;KACnC,kBAAgB,MAAA,gBAAe;KAC/B,mBAAiB,MAAA,iBAAgB;KACjC,aAAW,gBAAA;KACX,kBAAgB,aAAA;KAChB,iBAAe,MAAM;KACrB,yBAAuB,MAAM;KAC7B,wBAAsB,MAAA,mBAAkB;KACxC,0BAAwB,MAAA,qBAAoB;KAC5C,uBAAqB;KACrB,yBAAuB;KACvB,0BAAwB,MAAA,oBAAmB;KAC3C,0BAAwB,MAAA,oBAAmB;KAC3C,yBAAuB,MAAA,mBAAkB;KACzC,0BAAwB,MAAA,oBAAmB;KAC3C,oBAAkB,MAAA,eAAc;KAChC,wBAAsB,MAAA,kBAAiB;KACvC,wBAAsB,mBAAA;KACtB,mBAAiB,MAAM;KACvB,mBAAiB,eAAA;8BACF,eAAA,QAAA;WAAiB;kBAAS,cAAS,CACjD,WAA2B,KAAA,QAAA,WAA3B,WAA2B,EAAA,SAAA,MAAA,EAAb,UAAS,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GEjDqC;ACWpE,IAAMC,kBAAsC;CAAC;CAAS;CAAU;CAAQ;AACxE,IAAMC,sBAA8C,CAAC,UAAU,SAAS;AAExE,MAAa,oBAAoB;CAC/B,OAAO;EACL,MAAM;EACN,eAAe,EAAE;EAClB;CACD,MAAM;EACJ,MAAM;EACN,SAAS;EACV;CACD,SAAS;EACP,MAAM;EACN,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,SAAS,KAAA;EACV;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACV;CACD,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CACD,YAAY;EACV,MAAM,CAAC,QAAQ,OAAO;EACtB,SAAS,KAAA;EACV;CACD,aAAa;EACX,MAAM;EACN,SAAS;EACV;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACV;CACD,cAAc;EACZ,MAAM;EACN,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,SAAS;EACV;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACV;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACV;CACD,uBAAuB;EACrB,MAAM;EACN,SAAS;EACV;CACD,MAAM;EACJ,MAAM;EACN,SAAS,KAAA;EACT,YAAY,UAAkB,gBAAgB,SAAS,MAA0B;EAClF;CACD,UAAU;EACR,MAAM;EACN,SAAS;EACT,YAAY,UAAkB,oBAAoB,SAAS,MAA8B;EAC1F;CACD,UAAU;EACR,MAAM,CAAC,SAAS,OAAO;EACvB,SAAS;EACV;CACD,QAAQ;EACN,MAAM;EACN,SAAS;EACV;CACF;AAED,MAAa,oBAAoB;CAC/B,sBAAsB,WAAoB,OAAO,WAAW;CAC5D,OAAO,WAAmC,OAAO,WAAW;CAC5D,QAAQ,WAAoC,OAAO,WAAW;CAC9D,SACE,SACA,WACA,MACA,YAEA,OAAO,YAAU,YACjB,MAAM,QAAQ,UAAU,IACxB,UAAU,OAAO,SAAS,OAAO,SAAS,SAAS,IACnD,SAAS,KAAA,KACT,YAAY,KAAA;CACd,kBAAkB,SAA0C,SAAS,QAAQ,SAAS,KAAA;CACtF,mBAAmB;CACnB,oBAAoB;CACrB;AC1FD,MAAa,sBAAsB,iBAAyB;AAC1D,KAAI,CAAC,OAAO,SAAS,aAAa,CAChC,QAAO;AAGT,QAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,aAAa,EAAE,EAAE,EAAE,EAAE;;AAG3D,MAAa,8BAA8B,SAA+B;CACxE,MAAM,WAAW,KAAK,SAAS,KAAK;AAEpC,KAAI,aAAa,KAAA,KAAa,aAAa,QAAQ,aAAa,GAC9D,QAAO;AAGT,QAAO,OAAO,SAAS;;AAGzB,MAAa,4BACX,OACA,UAA2C,EAAE,KACd;CAC/B,MAAM,8BAAc,IAAI,KAAa;CACrC,MAAMC,kBAA8C,EAAE;AAEtD,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAQ,2BAA2B,KAAK;AAE9C,MAAI,CAAC,SAAO;AACV,WAAQ,OAAO,mCAAiC;AAChD;;AAGF,MAAI,YAAY,IAAI,QAAM,EAAE;AAC1B,WAAQ,OAAO,kCAAkC,UAAQ;AACzD;;AAGF,cAAY,IAAI,QAAM;AACtB,kBAAgB,KAAK;GACnB,GAAG;GACH,OAAA;GACD,CAAC;;AAGJ,QAAO;;AAGT,MAAa,wBACX,OACA,iBAC4B;CAC5B,MAAM,YAAY,mBAAmB,aAAa;CAClD,MAAM,eAAe,MAAM,QAAQ,SAAS,CAAC,KAAK,OAAO;AAEzD,QAAO;EACL;EACA,WAAW,aAAa,MAAM,GAAG,UAAU;EAC3C,WAAW,aAAa,MAAM,UAAU;EACxC;EACD;;ACtEH,IAAM,wBACJ,OACA,cACA,cACG;AACH,KAAI,MAAM,WAAW,EACnB,QAAO;AAGT,MAAK,IAAI,OAAO,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG;EAClD,MAAM,aAAa,eAAe,OAAO,YAAY,MAAM,UAAU,MAAM;AAC3E,MAAI,CAAC,MAAM,YAAY,SACrB,QAAO;;AAIX,QAAO;;AAGT,MAAa,yBAAyB,EACpC,WACA,WACA,UACA,UACA,WACA,WACA,sBACkC;CAClC,MAAM,iBAAiB,YAAkB;AACvC,WAAS,MAAM,UAAQ,OAAO;;CAGhC,MAAM,oCAAoC;EACxC,MAAM,UAAQ,qBAAqB,UAAU,OAAO,IAAI,EAAE;AAC1D,MAAI,WAAS,EACX,eAAc,QAAM;;CAIxB,MAAM,qBAAqB,OAAsB,YAAkB;AACjE,MAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;AAC3D,SAAM,gBAAgB;GACtB,MAAM,YAAY,qBAAqB,UAAU,OAAO,SAAO,EAAE;AACjE,OAAI,aAAa,EACf,eAAc,UAAU;AAE1B;;AAGF,MAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACxD,SAAM,gBAAgB;GACtB,MAAM,YAAY,qBAAqB,UAAU,OAAO,SAAO,GAAG;AAClE,OAAI,aAAa,EACf,eAAc,UAAU;AAE1B;;AAGF,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,SAAM,gBAAgB;AACtB,mBAAgB,MAAM;;;CAI1B,MAAM,qBAAqB,OAAsB,YAAkB;AACjE,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;GACtB,MAAM,YAAY,qBAAqB,UAAU,OAAO,SAAO,EAAE;AACjE,YAAS,MAAM,YAAY,OAAO;AAClC;;AAGF,MAAI,MAAM,QAAQ,WAAW;AAC3B,SAAM,gBAAgB;GACtB,MAAM,YAAY,qBAAqB,UAAU,OAAO,SAAO,GAAG;AAClE,YAAS,MAAM,YAAY,OAAO;AAClC;;AAGF,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,SAAM,gBAAgB;AACtB,mBAAgB,MAAM;;;CAI1B,MAAM,qBAAqB,UAAyB;AAClD,MAAI,MAAM,QAAQ,UAAU;AAC1B,SAAM,gBAAgB;AACtB,cAAW;AACX,cAAW;;;AAIf,QAAO;EACL;EACA;EACA;EACA;EACD;;ACrEH,IAAM,aAAa,WAAoB,SAAS,KAAK,KAAM;AAC3D,IAAM,6BAA6B,UAAmB,KAAK,IAAI,MAAM,GAAG,OAAQ,IAAI;AAEpF,MAAa,4BAA4B,UAAkB;CACzD,MAAM,aAAa,QAAQ;AAE3B,QAAO,aAAa,IAAI,aAAa,MAAM;;AAG7C,IAAM,iBAAiB,QAAgB,UAAkB;CACvD,MAAM,UAAU,UAAU,MAAM;AAEhC,QAAO;EACL,GAAG,0BAA0B,KAAK,IAAI,QAAQ,GAAG,OAAO;EACxD,GAAG,0BAA0B,KAAK,IAAI,QAAQ,GAAG,OAAO;EACzD;;AAGH,MAAa,mCAAmC,EAC9C,QACA,aACA,aAAa,GACb,QAAQ,QACiC;CACzC,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,MAAM,EAAE,EAAE;CAChD,MAAM,uBAAuB,yBAAyB,WAAW;CACjE,MAAM,iBAAiB,yBAAyB,cAAc,qBAAqB;AAEnF,QAAO,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,GAAG,YAAU;AAGrD,SAAO,cAAc,QAAQ,uBAAuB,kBAFnC,WAAS,YAAY,IAEwC;GAC9E;;AAGJ,MAAa,oCACX,SACA,EAAE,aAAa,MAA4C,EAAE,KAC1D;CACH,MAAM,uBAAuB,yBAAyB,WAAW;AAEjE,QAAO,QACJ,KAAK,QAAQ,aAAW;EACvB,OAAA;EACA,UAAU,yBAAyB,OAAO,QAAQ,qBAAqB;EACxE,EAAE,CACF,MAAM,SAAS,SAAS,KAAK,WAAW,QAAQ,YAAY,QAAQ,QAAQ,KAAK,MAAM,CACvF,KAAK,EAAE,OAAA,cAAY,QAAM;;AAG9B,IAAM,6BAA6B,EACjC,aACA,OACA,aAAa,UACkE;CAE/E,MAAM,cAAc,MADF,KAAK,IAAI,OAAO,EAAE;CAEpC,MAAM,MAAM,KAAK,IAAI,GAAG,cAAc,EAAE;CACxC,MAAM,cAAc,aAAa,cAAc;CAC/C,MAAM,QAAQ,cAAc,cAAc,IAAI;CAC9C,MAAM,MAAM,cAAc,cAAc,IAAI;AAE5C,QAAO;EACL;EACA;EACA,cAAc,MAAM,QAAQ,MAAM,IAAI;EACvC;;AAGH,MAAa,2BAA2B,EACtC,OACA,OAAA,SACA,QACA,aAAa,UAC0C;CAEvD,MAAM,QAAQ,aAAc,MADV,KAAK,IAAI,OAAO,EAAE,GACW;CAC/C,MAAM,QAAQ,cAAc,QAAQ,MAAM;AAE1C,QAAO;EACL;EACA,GAAG,MAAM;EACT,GAAG,MAAM;EACV;;AAGH,MAAa,2BAA2B,EACtC,aACA,OACA,aACA,aACA,aAAa,UACoB;AACjC,KAAI,eAAe,YACjB,QAAO;CAGT,MAAM,EAAE,OAAO,KAAK,iBAAiB,0BAA0B;EAC7D;EACA;EACA;EACD,CAAC;CACF,MAAM,aAAa,cAAc,aAAa,MAAM;CACpD,MAAM,WAAW,cAAc,aAAa,IAAI;CAChD,MAAM,WAAW,cAAc,aAAa,IAAI;CAChD,MAAM,aAAa,cAAc,aAAa,MAAM;AAEpD,QAAO;EACL,KAAK,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,QAAQ,EAAE;EACvD,KAAK,YAAY,GAAG,YAAY,KAAK,aAAa,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE;EACrG,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE;EACnD,KAAK,YAAY,GAAG,YAAY,KAAK,aAAa,KAAK,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,QAAQ,EAAE;EACzG;EACD,CAAC,KAAK,IAAI;;AAGb,MAAa,6BAA6B,EACxC,aACA,OACA,QACA,cAAc,GACd,aAAa,UACsB;AACnC,KAAI,UAAU,YACZ,QAAO;CAGT,MAAM,EAAE,OAAO,KAAK,iBAAiB,0BAA0B;EAC7D;EACA;EACA;EACD,CAAC;CACF,MAAM,WAAW,cAAc,QAAQ,MAAM;CAC7C,MAAM,SAAS,cAAc,QAAQ,IAAI;AAEzC,QAAO,CACL,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,IACnD,KAAK,OAAO,GAAG,OAAO,KAAK,aAAa,KAAK,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,GACxF,CAAC,KAAK,IAAI;;AAGb,MAAa,6BAA6B,EACxC,GACA,QACmE;AACnE,KAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAC3B,QAAO,IAAI,IAAI,SAAS;AAG1B,QAAO,IAAI,IAAI,QAAQ;;ACtLzB,IAAM,eAAe,IAAI,IAAI;CAAC;CAAO;CAAQ;CAAW;CAAQ;CAAQ,CAAC;AAEzE,IAAM,oBAAoB,WAA+B;AACvD,KAAI,EAAE,kBAAkB,aACtB,QAAO;CAGT,MAAM,UAAU,OAAO,QAAQ,aAAa;AAC5C,QACE,YAAY,WACZ,YAAY,cACZ,YAAY,YACZ,OAAO;;AAIX,IAAM,qBAAqB,UACzB,MACG,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,aAAa,CAAC,CACxC,OAAO,QAAQ;AAEpB,IAAM,mBAAmB,OAAsB,aAAqB;CAClE,MAAM,QAAQ,kBAAkB,SAAS;AACzC,KAAI,MAAM,WAAW,EACnB,QAAO;CAGT,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,aAAa,IAAI,KAAK,CAAC;CACzD,MAAM,aAAa,MAAM,SAAS,MAAM;CACxC,MAAM,cAAc,MAAM,SAAS,OAAO,IAAI,MAAM,SAAS,UAAU;CACvE,MAAM,cAAc,MAAM,SAAS,OAAO;CAC1C,MAAM,eAAe,MAAM,SAAS,QAAQ;AAE5C,QACE,MAAM,WAAW,cACjB,MAAM,YAAY,eAClB,MAAM,YAAY,eAClB,MAAM,aAAa,gBACnB,MAAM,IAAI,aAAa,KAAK;;AAIhC,IAAM,2BAA2B;CAC/B,GAAG,OAAO,WAAW,cAAc,IAAI,OAAO,aAAa;CAC3D,GAAG,OAAO,WAAW,cAAc,IAAI,OAAO,cAAc;CAC7D;AAED,MAAa,yBAAyB,EACpC,UACA,SACA,WACkC;CAClC,MAAM,SAAS,mBAAmB;CAClC,IAAI,aAAa,OAAO;CACxB,IAAI,aAAa,OAAO;CAExB,MAAM,mBAAmB,UAAsB;AAC7C,eAAa,MAAM;AACnB,eAAa,MAAM;;CAGrB,MAAM,iBAAiB,UAAyB;AAC9C,MACE,CAAC,QAAQ,SACT,CAAC,gBAAgB,OAAO,SAAS,MAAM,IACvC,iBAAiB,MAAM,OAAO,CAE9B;AAGF,QAAM,gBAAgB;AACtB,OAAK;GACH,GAAG;GACH,GAAG;GACH,QAAQ;GACT,CAAC;;AAGJ,iBAAgB;AACd,SAAO,iBAAiB,aAAa,gBAAgB;AACrD,SAAO,iBAAiB,WAAW,cAAc;GACjD;AAEF,mBAAkB;AAChB,SAAO,oBAAoB,aAAa,gBAAgB;AACxD,SAAO,oBAAoB,WAAW,cAAc;GACpD;;ACvFJ,MAAa,sBAAsB,EACjC,YACA,UACA,iBAC+B;CAC/B,MAAM,qBAAqB,IAAI,MAAM;CACrC,MAAM,YAAY,KAAyB;CAC3C,MAAM,YAAY,KAAyB;CAC3C,MAAM,eAAe,eAAe,WAAW,UAAU,KAAA,EAAU;CACnE,MAAM,SAAS,eACb,aAAa,QAAQ,WAAW,UAAU,OAAO,mBAAmB,MACrE;CAED,MAAM,aAAa,eAAwB;AACzC,MAAI,SAAS,SAAS,WACpB;AAGF,MAAI,CAAC,aAAa,MAChB,oBAAmB,QAAQ;AAG7B,aAAW,WAAW;;CAGxB,MAAM,QAAQ,UAAmC,EAAE,KAAK;AACtD,MAAI,QAAQ,MAAM,KAAA,EAChB,WAAU,QAAQ,QAAQ;AAG5B,MAAI,QAAQ,MAAM,KAAA,EAChB,WAAU,QAAQ,QAAQ;AAG5B,YAAU,KAAK;;CAGjB,MAAM,SAAS,UAAmC,aAAa;AAC7D,YAAU,MAAM;;CAGlB,MAAM,UAAU,UAAmC,EAAE,KAAK;AACxD,MAAI,OAAO,MACT,OAAM,SAAS;MAEf,MAAK,QAAQ;;AAIjB,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqHH,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;AACvC,IAAM,iCAAiC;AACvC,IAAM,6BAA6B;AACnC,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAClC,IAAM,wBAAwB;;;;;;;EAvB9B,MAAM,QAAQ;EACd,MAAM,OAAO;EAKb,MAAM,KAAK,aAAa,cAAc;EACtC,MAAM,QAAQ,UAAU;EACxB,MAAM,UAAU,eAA+B,UAAU;EACzD,MAAM,YAAY,eAAkC,YAAY;EAChE,MAAM,kBAAkB,IAAmB,KAAK;EAChD,MAAM,aAAa,IAAI,MAAM;EAC7B,MAAM,mBAAmB,IAAI,MAAM;EACnC,MAAM,iBAAiB,IAAyB,EAAE,CAAC;EACnD,MAAM,iBAAiB,IAAyB,EAAE,CAAC;EACnD,MAAM,iCAAiB,IAAI,KAAa;EACxC,MAAM,aAAa,eAAe;EAQlC,MAAM,2BAA2B;GAC/B,OAAO;IACL,QAAQ;IACR,YAAY;IACb;GACD,QAAQ;IACN,QAAQ;IACR,YAAY;IACb;GACD,OAAO;IACL,QAAQ;IACR,YAAY;IACb;GACF;EAED,MAAM,iBAAiB,SAA+D;AACpF,OAAI,SAAS,WAAW,SAAS,QAC/B,QAAO;AAGT,OAAI,SAAS,UACX,QAAO;AAGT,UAAO;;EAGT,MAAM,kBAAkB,YAAoB;AAC1C,OAAI,eAAe,IAAI,QAAQ,CAC7B;AAGF,kBAAe,IAAI,QAAQ;AAC3B,WAAQ,KAAK,kBAAkB,UAAU;;EAG3C,MAAM,qBAAqB,aAA0C;GACnE,MAAM,SAAkB,EAAE;AAE1B,QAAK,MAAM,SAAS,UAAU;AAC5B,QAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,YAAO,KAAK,GAAG,kBAAkB,MAA4B,CAAC;AAC9D;;AAGF,QAAI,CAAC,QAAQ,MAAM,CACjB;AAGF,QAAI,MAAM,SAAS,YAAY,MAAM,QAAQ,MAAM,SAAS,EAAE;AAC5D,YAAO,KAAK,GAAG,kBAAkB,MAAM,SAA+B,CAAC;AACvE;;AAGF,WAAO,KAAK,MAAM;;AAGpB,UAAO;;EAGT,MAAM,yBAAyB,UAC7B,OAAO,MAAM,SAAS,YAAY,UAAU,MAAM,QAAQ,MAAM,KAAK,SAAS;EAEhF,MAAM,uBAAuB,UAAmB,UAAU,QAAQ,UAAU;EAE5E,MAAM,+BAA+B,UACnC,UAAU,KAAA,IAAY,KAAA,IAAY,oBAAoB,MAAM;EAE9D,MAAM,qBAAqB,aAAgC;AACzD,OAAI,CAAC,YAAY,MAAM,QAAQ,SAAS,IAAI,OAAO,aAAa,SAC9D;AAGF,UAAO;;EAGT,MAAM,qBAAqB,UAA6C;GACtE,MAAM,aAAc,MAAM,SAAS,EAAE;GACrC,MAAM,aAAa,kBAAkB,MAAM,SAAS;AAEpD,UAAO;IACL,OAAO,OAAO,WAAW,UAAU,WAAW,WAAW,QAAQ,KAAA;IACjE,OAAO,OAAO,WAAW,UAAU,WAAW,WAAW,QAAQ;IACjE,MAAM,WAAW;IACjB,UAAU,OAAO,WAAW,aAAa,WAAW,WAAW,WAAW,KAAA;IAC1E,UAAU,oBAAoB,WAAW,SAAS;IAClD,QAAQ,oBAAoB,WAAW,OAAO;IAC9C,SAAS,oBAAoB,WAAW,QAAQ;IAChD,eAAe,4BAA4B,WAAW,cAAc;IACpE,MACE,WAAW,QAAQ,OAAO,WAAW,SAAS,WACzC,WAAW,OACZ,KAAA;IACN,UAAU,YAAY;IACtB,WAAW,YAAY;IACxB;;EAGH,MAAM,YAAY,eAChB,kBAAkB,MAAM,WAAW,IAAI,EAAE,CAAC,CACvC,OAAO,sBAAsB,CAC7B,IAAI,kBAAkB,CAC1B;EACD,MAAM,gBAAgB,eACpB,yBAAyB,UAAU,MAAM,SAAS,IAAI,UAAU,QAAQ,MAAM,OAAO,EACnF,MAAM,gBACP,CAAC,CACH;EACD,MAAM,aAAa,eAAe,qBAAqB,cAAc,OAAO,MAAM,aAAa,CAAC;EAChG,MAAM,YAAY,eAAe,WAAW,MAAM,UAAU;EAC5D,MAAM,YAAY,eAAe,WAAW,MAAM,UAAU;EAC5D,MAAM,eAAe,eAAe,MAAM,QAAQ,cAAc,WAAW,MAAM,CAAC;EAClF,MAAM,eAAe,eAAe,yBAAyB,aAAa,OAAO;EACjF,MAAM,iBAAiB,eAAe,aAAa,MAAM,OAAO;EAChE,MAAM,qBAAqB,eAAe,aAAa,MAAM,WAAW;EACxE,MAAM,aAAa,eACjB,gBAAgB,UAAU,OAAO,OAAQ,UAAU,MAAM,gBAAgB,UAAU,KACpF;EACD,MAAM,oBAAoB,eAAe,mBAAmB,QAAQ,IAAI,EAAE;EAC1E,MAAM,aAAa,eAAe;AAChC,OAAI,gBAAgB,UAAU,QAAQ,UAAU,MAAM,WAAW,EAC/D,QAAO;AAGT,UAAO,wBAAwB;IAC7B,aAAa,gBAAgB;IAC7B,OAAO,UAAU,MAAM;IACvB,aAAa,kBAAkB;IAC/B,aAAa,eAAe;IAC7B,CAAC;IACF;EACF,MAAM,kBAAkB,eAAe;AACrC,OAAI,gBAAgB,UAAU,QAAQ,UAAU,MAAM,WAAW,EAC/D,QAAO;AAGT,UAAO,0BAA0B;IAC/B,aAAa,gBAAgB;IAC7B,OAAO,UAAU,MAAM;IACvB,QAAQ,eAAe;IACvB,aAAa,kBAAkB;IAChC,CAAC;IACF;EAEF,MAAM,EAAE,QAAQ,WAAW,WAAW,MAAM,OAAO,WAAW,mBAAmB;GAC/E,YAAY,MAAM,OAAO,aAAa;GACtC,UAAU,MAAM,OAAO,WAAW;GAClC,aAAa,eAAe,KAAK,qBAAqB,WAAW;GAClE,CAAC;AAEF,wBAAsB;GACpB,UAAU,MAAM,OAAO,WAAW;GAClC,SAAS,eAAe,MAAM,mBAAmB,QAAQ,MAAM,SAAS,CAAC;GACzE;GACD,CAAC;EAEF,MAAM,YAAY,eAAe;GAC/B,GAAG,GAAG;GACN,GAAG,EAAE,MAAM,KAAK;GAChB,GAAG,EAAE,aAAa,MAAM;GACxB,GAAG,EAAE,QAAQ,MAAM,WAAW;GAC9B,GAAG,GAAG,UAAU,OAAO,MAAM;GAC7B,GAAG,GAAG,YAAY,iBAAiB,MAAM;GACzC,GAAG,GAAG,YAAY,MAAM,SAAS;GAClC,CAAC;EAEF,MAAM,YAAY,gBAAgB;GAChC,+BAA+B,GAAG,UAAU,UAAU,OAAO,WAAW,cAAc,IAAI,OAAO,aAAa,GAAG;GACjH,+BAA+B,GAAG,UAAU,UAAU,OAAO,WAAW,cAAc,IAAI,OAAO,cAAc,GAAG;GAClH,4BAA4B,OAAO,MAAM,OAAO;GAChD,qCAAqC,GAAG,4BAA4B,KAAK,IAAI,UAAU,MAAM,SAAS,GAAG,EAAE,GAAG,2BAA2B;GAC1I,EAAE;EAEH,MAAM,eAAe,SAAmC,KAAK,YAAY,KAAK;EAC9E,MAAM,uBAAuB,EAAE,WAC7B,KAAK,aAAa,IAAI,KAAK;EAE7B,MAAM,iBAAiB,YACrB,wBAAwB;GACtB,OAAO,UAAU,MAAM;GACvB,OAAA;GACA,QAAQ,eAAe;GACxB,CAAC;EAEJ,MAAM,yBAAyB,UAAkB;AAG/C,UAAO,GAFS,KAAK,IAAI,MAAM,GAAG,OAAQ,IAAI,OAAO,MAAM,QAAQ,EAAE,CAAC,CAEpD;;EAGpB,MAAM,qBAAqB,GAAW,GAAW,QAAQ,MACvD,yBAAyB,sBAAsB,EAAE,CAAC,iBAAiB,sBAAsB,EAAE,CAAC,WAAW,MAAM;EAE/G,MAAM,6BACJ,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,cAC7B,OAAO,WAAW,mCAAmC,CAAC;EAExD,MAAM,4BACJ,OAAO,gBAAgB,eAAe,OAAO,YAAY,UAAU,YAAY;EAEjF,MAAM,qBAAqB,YAAyB,OAAO,QAAQ,YAAY;EAE/E,MAAM,gBAAgB,YAAkB;GACtC,MAAM,SAAS,cAAc,QAAM;AAEnC,UAAO;IACL,2BAA2B,GAAG,OAAO,EAAE;IACvC,2BAA2B,GAAG,OAAO,EAAE;IACvC,+BAA+B,OAAO,QAAM;IAC7C;;EAGH,MAAM,qBAAqB,YAAkB;GAC3C,MAAM,YAAY,0BAA0B,cAAc,QAAM,CAAC;AAEjE,UAAO;IACL,GAAG,EAAE,aAAa;IAClB,GAAG,GAAG,cAAc,OAAO,YAAY;IACvC,UAAU,MAAM,SAAS,KAAK,cAAc,WACxC,GAAG,GAAG,cAAc,iBAAiB,GACrC;IACL;;EAGH,MAAM,YAAY,eAAe;AAC/B,OAAI,MAAM,aAAa,WACrB,QAAO;AAGT,OAAI,MAAM,aAAa,OACrB,QAAO,MAAM;AAGf,UAAO,GAAG,MAAM,SAAS;IACzB;EAEF,MAAM,sBAAsB,YAAyB;AACnD,mBAAgB,QAAQ;AACxB,QAAK,iBAAiB,WAAW,MAAM;;EAGzC,MAAM,oBAAoB,SAAmD,YAAkB;AAC7F,OAAI,mBAAmB,kBACrB,gBAAe,MAAM,WAAS;OAE9B,QAAO,eAAe,MAAM;;EAIhC,MAAM,oBAAoB,SAAmD,YAAkB;AAC7F,OAAI,mBAAmB,kBACrB,gBAAe,MAAM,WAAS;OAE9B,QAAO,eAAe,MAAM;;EAIhC,MAAM,iBAAiB,eAAwB;AAC7C,cAAW,QAAQ;AACnB,OAAI,WACF,MAAK,YAAY;OAEjB,MAAK,aAAa;;EAItB,IAAI,6BAA6B;EAEjC,MAAM,kCAAkC;AACtC,OAAI,CAAC,8BAA8B,OAAO,aAAa,YACrD;AAGF,YAAS,oBAAoB,eAAe,0BAA0B;AACtE,gCAA6B;;EAG/B,MAAM,+BAA+B;AACnC,OAAI,8BAA8B,OAAO,aAAa,YACpD;AAGF,YAAS,iBAAiB,eAAe,0BAA0B;AACnE,gCAA6B;;EAG/B,MAAM,6BAA6B,UAAwB;GACzD,MAAM,EAAE,WAAW;AAEnB,OAAI,EAAE,kBAAkB,MACtB;AAGF,OAAI,QAAQ,OAAO,SAAS,OAAO,CACjC;AAGF,cAAW,QAAQ;AACnB,SAAM,gBAAgB;;EAGxB,MAAM,gBACJ,MACA,QACA,SACA,UACG;AACH,OAAI,KAAK,SACP;AAGF,QAAK,UAAU,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,MAAM;IAAE;IAAQ,OAAA;IAAO;IAAO,CAAC;AAGxE,OADoB,KAAK,iBAAiB,MAAM,eAC/B;AACf,eAAW,QAAQ;AACnB,UAAM,SAAS;;;EAInB,MAAM,wBAAwB,UAAyB;GACrD,MAAM,SAAS,MAAM;AACrB,OAAI,EAAE,kBAAkB,aACtB;AAGF,UAAO,OAAO;;EAGhB,MAAM,EAAE,6BAA6B,mBAAmB,mBAAmB,sBACzE,sBAAsB;GACpB;GACA;GACA,UAAU;GACV,UAAU;GACV,iBAAiB,MAAM,SAAS;GAChC,iBAAiB;AACf,eAAW,QAAQ;;GAErB,iBAAiB;GAClB,CAAC;EAEJ,IAAI,kBAA+B,EAAE;EACrC,IAAI,sBAAsB;EAC1B,IAAI;EAEJ,MAAM,8BAA8B;AAClC,OAAI,qBAAqB,KAAA,EACvB;AAGF,gBAAa,iBAAiB;AAC9B,sBAAmB,KAAA;;EAGrB,MAAM,8BAA8B;AAClC,0BAAuB;AACvB,0BAAuB;AAEvB,QAAK,MAAM,aAAa,gBACtB,WAAU,QAAQ;AAGpB,qBAAkB,EAAE;AACpB,oBAAiB,QAAQ;;EAG3B,MAAM,yBAAyB,UAAkB;AAC/C,OAAI,UAAU,oBACZ;AAGF,0BAAuB;AAEvB,QAAK,MAAM,aAAa,gBACtB,WAAU,QAAQ;AAGpB,qBAAkB,EAAE;AACpB,oBAAiB,QAAQ;;EAG3B,MAAM,6BAA6B;GAEjC,MAAM,aAAa,iCADH,UAAU,MAAM,KAAK,GAAG,YAAU,cAAc,QAAM,CAAC,EACV,EAC3D,YAAY,2BACb,CAAC;AAEF,UAAO,IAAI,IAAI,WAAW,KAAK,WAAW,eAAe,CAAC,WAAW,WAAW,CAAC,CAAC;;EAGpF,MAAM,4BAA4B,YAChC,yBAAyB,cAAc,QAAM,CAAC,QAAQ,0BAA0B;EAElF,MAAM,4BAA4B,YAAkB;GAClD,MAAM,gBAAgB,KAAK,IAAI,yBAAyB,QAAM,EAAE,IAAI,GAAG;AAEvE,UACE,kCACC,iCAAiC,kCAAkC;;EAIxE,MAAM,6BAA6B,YAA6C;GAC9E,MAAM,SAAS,cAAc,QAAM;GACnC,MAAM,eAAe,UAAU,MAAM,UAAQ,WAAW,KAAM;GAC9D,MAAM,SAAS,gCAAgC;IAC7C,QAAQ,eAAe;IACvB,YAAY;IACZ,aAAa,OAAO;IACpB,OAAO;IACR,CAAC;AAEF,UAAO,OAAO,KAAK,OAAO,gBAAgB;IACxC,QAAQ,cAAc,OAAO,SAAS;IACtC,SAAS,eAAe,IAAI,IAAI;IAChC,WAAW,kBAAkB,MAAM,GAAG,MAAM,GAAG,eAAe,IAAI,MAAO,EAAE;IAC5E,EAAE;;EAGL,MAAM,4BAA4B;AAChC,OAAI,sBAAsB,IAAI,UAAU,MAAM,WAAW,GAAG;AAC1D,qBAAiB,QAAQ;AACzB;;GAGF,MAAM,cAAc,eAAe,MAAM,MAAM,GAAG,UAAU,MAAM,OAAO;GACzE,MAAM,oBAAoB,sBAAsB;GAChD,MAAM,aAA0B,EAAE;GAClC,IAAI,kBAAkB;AAEtB,eAAY,SAAS,QAAQ,YAAU;AACrC,QAAI,CAAC,UAAU,CAAC,kBAAkB,OAAO,CACvC;IAIF,MAAM,QAAQ,6BADK,kBAAkB,IAAI,QAAM,IAAI,WACI;IACvD,MAAM,WAAW,yBAAyB,QAAM;IAChD,MAAM,YAAY,OAAO,QAAQ,0BAA0B,QAAM,EAAE;KACjE;KACA;KACA,QAAQ;KACR,MAAM;KACP,CAAC;AAEF,sBAAkB,KAAK,IAAI,iBAAiB,QAAQ,SAAS;AAC7D,eAAW,KAAK,UAAU;KAC1B;AAEF,OAAI,WAAW,WAAW,GAAG;AAC3B,qBAAiB,QAAQ;AACzB;;AAGF,0BAAuB;GACvB,MAAM,QAAQ;AAEd,qBAAkB;AAClB,oBAAiB,QAAQ;AACzB,sBAAmB,iBAAiB,sBAAsB,MAAM,EAAE,KAAK,KAAK,gBAAgB,GAAG,GAAG;;AAGpG,QAAM,QAAQ,OAAO,eAAe;AAClC,0BAAuB;AAEvB,OAAI,CAAC,WACH;AAGF,oBAAiB,QACf,qBAAqB,IAAI,CAAC,sBAAsB,IAAI,UAAU,MAAM,SAAS;AAE/E,SAAM,UAAU;AAChB,OAAI,CAAC,OAAO,MACV;AAGF,wBAAqB;AACrB,gCAA6B;IAC7B;AAEF,QACE,SACC,eAAe;AACd,OAAI,WACF,yBAAwB;OAExB,4BAA2B;KAG/B,EAAE,WAAW,MAAM,CACpB;AAED,wBAAsB;AACpB,8BAA2B;AAC3B,0BAAuB;IACvB;EAEF,MAAM,0BAA0B;AAC9B,OAAI,MAAM,YAAY,MAAM,YAAY,QACtC;AAGF,UAAO,EAAE,QAAQ,SAAS,CAAC;;EAG7B,MAAM,yBAAyB;AAC7B,OAAI,MAAM,YAAY,MAAM,YAAY,QACtC;AAGF,QAAK,EAAE,QAAQ,SAAS,CAAC;;EAG3B,MAAM,yBAAyB;AAC7B,OAAI,MAAM,YAAY,QACpB;AAGF,SAAM,cAAc;;EAGtB,MAAM,cAAc;AAClB,aAAU,OAAO,OAAO;;AAG1B,WAAiC;GAC/B,OAAO,YAAsC,KAAK,QAAQ;GAC1D;GACA;GACA;GACD,CAAC;;uBAjtBA,mBA6GM,OAAA;aA5GA;IAAJ,KAAI;IACH,OAAK,eAAE,UAAA,MAAS;IAChB,OAAK,eAAE,UAAA,MAAS;IAChB,cAAY;IACZ,cAAY;OACb,mBAiBS,UAAA;aAhBH;IAAJ,KAAI;IACJ,MAAK;IACJ,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,SAAA,CAAA;IACX,UAAU,MAAM;IAChB,iBAAe,MAAA,OAAM;IACtB,iBAAc;IACb,SAAO;OACR,WAQO,KAAA,QAAA,UAAA,EAAA,QAAA,CALG,MAAM,cAAU,OAAW,MAAM,eAAU,YAAA,WAAA,EAFnD,YAEoE,wBAD7D,MAAM,WAAU,EAAA,EAAA,KAAA,GAAA,CAAA,IAEN,MAAM,cAAA,WAAA,EAAvB,mBAEO,QAAA;;IAF6B,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,cAAA,CAAA;sBAC1C,MAAM,WAAU,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,EAET,MAAM,eAAA,WAAA,EAAlB,mBAA2F,QAAA;;IAA3D,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,eAAA,CAAA;sBAAqB,MAAM,YAAW,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,CAAA,CAAA,EAAA,IAAA,WAAA,EAI1E,MAAA,OAAM,IAAA,WAAA,EAAjB,mBAmFM,OAAA;;IAnFc,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,QAAA,CAAA;IAAW,MAAK;IAAQ,WAAO,OAAA,OAAA,OAAA,MAAA,GAAA,SAAE,MAAA,kBAAA,IAAA,MAAA,kBAAA,CAAA,GAAA,KAAiB;;kBAC/E,mBAIM,OAAA;KAJA,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,SAAA,CAAA;KAAY,SAAQ;KAAoB,eAAY;;KACnE,mBAAmE,UAAA;MAA1D,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,QAAA,CAAA;MAAW,IAAG;MAAI,IAAG;MAAK,GAAG,eAAA;;KACrC,WAAA,SAAA,WAAA,EAAZ,mBAAuE,QAAA;;MAA9C,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,cAAA,CAAA;MAAkB,GAAG,WAAA;;KAC7C,gBAAA,SAAA,WAAA,EAAZ,mBAAkF,QAAA;;MAApD,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,eAAA,CAAA;MAAmB,GAAG,gBAAA;;;sBAGjE,mBA+BS,UAAA,MAAA,WA9BiB,UAAA,QAAhB,MAAM,YAAK;yBADrB,mBA+BS,UAAA;MA7BN,KAAK,KAAK;;MACV,MAAM,YAAY,iBAAiB,SAAS,QAAK;MAClD,MAAK;MACL,MAAK;MACJ,OAAK,eAAA;OAAe,MAAA,GAAE,CAAC,EAAC,OAAA;OAAqB,MAAA,GAAE,CAAC,GAAE,UAAW,gBAAA,UAAoB,QAAK;OAAc,MAAA,GAAE,CAAC,GAAE,YAAa,KAAK,aAAQ,KAAA;;MAKnI,OAAK,eAAE,aAAa,QAAK,CAAA;MACzB,UAAU,KAAK;MACf,UAAU,KAAK,WAAQ,KAAA;MACvB,iBAAe,KAAK,aAAQ;MAC5B,cAAY,KAAK;MACjB,0BAAwB,KAAK;MAC7B,eAAU,WAAE,mBAAmB,QAAK;MACpC,UAAK,WAAE,mBAAmB,QAAK;MAC/B,cAAU,OAAA,OAAA,OAAA,MAAA,WAAE,mBAAkB,KAAA;MAC9B,UAAK,WAAE,aAAa,MAAI,QAAU,SAAO,OAAM;MAC/C,YAAO,WAAE,MAAA,kBAAiB,CAAC,QAAQ,QAAK;SAGjC,YAAY,KAAI,IAAA,OAAY,YAAY,KAAI,KAAA,YAAA,WAAA,EAFpD,YAEsE,wBAD/D,YAAY,KAAI,CAAA,EAAA,EAAA,KAAA,GAAA,CAAA,IAEN,YAAY,KAAI,IAAA,WAAA,EAAjC,mBAEO,QAAA;;MAF8B,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,YAAA,CAAA;wBAC3C,YAAY,KAAI,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,EAErB,mBAEO,QAAA,EAFA,OAAK,eAAE,kBAAkB,QAAK,CAAA,EAAA,EAAA,CACnC,YAAoC,qBAAA,EAAR,MAAI,EAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAAA,IAAA,WAAA;;IAK5B,UAAA,MAAU,SAAM,KAAA,WAAA,EADxB,mBAQS,UAAA;;KANP,MAAK;KACJ,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,OAAA,CAAA;KACZ,iBAAc;KACb,iBAAe,WAAA;KACf,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,cAAa,CAAE,WAAA,MAAU;uBAC9B,UAAA,MAAS,EAAA,IAAA,WAAA,IAAA,mBAAA,QAAA,KAAA;IAIN,WAAA,SAAA,WAAA,EADR,mBAgCM,OAAA;;KA9BH,OAAK,eAAA,CAAG,MAAA,GAAE,CAAC,EAAC,gBAAA,EAAmB,MAAA,GAAE,CAAC,EAAC,QAAS,MAAM,wBAAqB,CAAA,CAAA;KACxE,MAAK;0BACL,mBA2BS,UAAA,MAAA,WA1BiB,UAAA,QAAhB,MAAM,YAAK;yBADrB,mBA2BS,UAAA;MAzBN,KAAK,KAAK;;MACV,MAAM,YAAY,iBAAiB,SAAS,QAAK;MAClD,MAAK;MACL,MAAK;MACJ,OAAK,eAAA,CAAG,MAAA,GAAE,CAAC,EAAC,YAAA,EAAe,MAAA,GAAE,CAAC,GAAE,YAAa,KAAK,aAAQ,KAAA,CAAA,CAAA;MAC1D,UAAU,KAAK;MACf,UAAU,KAAK,WAAQ,KAAA;MACvB,iBAAe,KAAK,aAAQ;MAC5B,cAAY,KAAK;MACjB,+BAA6B,KAAK;MAClC,UAAK,WAAE,aAAa,MAAI,QAAU,SAAO,OAAM;MAC/C,YAAO,WAAE,MAAA,kBAAiB,CAAC,QAAQ,QAAK;SACzC,mBAWO,QAAA,EAXA,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,eAAA,CAAA,EAAA,EAAA,CAGR,YAAY,KAAI,IAAA,OAAY,YAAY,KAAI,KAAA,YAAA,WAAA,EAFpD,YAG+B,wBAFxB,YAAY,KAAI,CAAA,EAAA;;MAEpB,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,YAAA,CAAA;+BACG,YAAY,KAAI,IAAA,WAAA,EAAjC,mBAEO,QAAA;;MAF8B,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,YAAA,CAAA;wBAC3C,YAAY,KAAI,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,EAErB,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,aAAA,CAAA,EAAA,EAAA,CAChB,YAAoC,qBAAA,EAAR,MAAI,EAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA,EAGxB,KAAK,YAAA,WAAA,EAAjB,mBAA+E,QAAA;;MAAnD,OAAK,eAAE,MAAA,GAAE,CAAC,EAAC,WAAA,CAAA;wBAAiB,KAAK,SAAQ,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA,CAAA,EAAA,IAAA,WAAA;;;;;;;;;QExG1C;EACnC,OAAO;GACL,MAAM;GACN,UAAU;GACX;EACD,OAAO;GACL,MAAM;GACN,UAAU;GACX;EACD,MAAM;GACJ,MAAM,CAAC,QAAQ,SAAS;GACxB,SAAS,KAAA;GACV;EACD,UAAU;GACR,MAAM;GACN,SAAS;GACV;EACD,UAAU;GACR,MAAM;GACN,SAAS;GACV;EACD,QAAQ;GACN,MAAM;GACN,SAAS;GACV;EACD,SAAS;GACP,MAAM;GACN,SAAS;GACV;EACD,eAAe;GACb,MAAM;GACN,SAAS,KAAA;GACV;EACD,MAAM;GACJ,MAAM;GACN,SAAS,KAAA;GACV;EACF;;;;;;;AGnCD,MAAa,eAAe,YAAY,oBAAmD;AAC3F,MAAa,mBAAmB,YAC9B,yBACD;ACOD,SAAS,gBAAgB,GAAG,GAAG,GAAG;AAChC,SAAQ,IAAI,eAAe,EAAE,KAAK,IAAI,OAAO,eAAe,GAAG,GAAG;EAChE,OAAO;EACP,YAAY,CAAC;EACb,cAAc,CAAC;EACf,UAAU,CAAC;EACZ,CAAC,GAAG,EAAE,KAAK,GAAG;;AAEjB,SAAS,WAAW;AAClB,QAAO,WAAW,OAAO,SAAS,OAAO,OAAO,MAAM,GAAG,SAAU,GAAG;AACpE,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;GACzC,IAAI,IAAI,UAAU;AAClB,QAAK,IAAI,KAAK,EAAG,EAAC,EAAE,EAAE,eAAe,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;;AAE/D,SAAO;IACN,SAAS,MAAM,MAAM,UAAU;;AAQpC,SAAS,QAAQ,GAAG,GAAG;CACrB,IAAI,IAAI,OAAO,KAAK,EAAE;AACtB,KAAI,OAAO,uBAAuB;EAChC,IAAI,IAAI,OAAO,sBAAsB,EAAE;AACvC,QAAM,IAAI,EAAE,OAAO,SAAU,KAAG;AAC9B,UAAO,OAAO,yBAAyB,GAAGC,IAAE,CAAC;IAC7C,GAAG,EAAE,KAAK,MAAM,GAAG,EAAE;;AAEzB,QAAO;;AAET,SAAS,eAAe,GAAG;AACzB,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,IAAI,IAAI,QAAQ,UAAU,KAAK,UAAU,KAAK,EAAE;AAChD,MAAI,IAAI,QAAQ,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,SAAU,KAAG;AAClD,mBAAgB,GAAGA,KAAG,EAAEA,KAAG;IAC3B,GAAG,OAAO,4BAA4B,OAAO,iBAAiB,GAAG,OAAO,0BAA0B,EAAE,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,SAAU,KAAG;AAChJ,UAAO,eAAe,GAAGA,KAAG,OAAO,yBAAyB,GAAGA,IAAE,CAAC;IAClE;;AAEJ,QAAO;;AAET,SAAS,yBAAyB,GAAG,GAAG;AACtC,KAAI,QAAQ,EAAG,QAAO,EAAE;CACxB,IAAI,GACF,GACA,IAAI,8BAA8B,GAAG,EAAE;AACzC,KAAI,OAAO,uBAAuB;EAChC,IAAI,IAAI,OAAO,sBAAsB,EAAE;AACvC,OAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAI,EAAE,IAAI,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,qBAAqB,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;;AAElH,QAAO;;AAET,SAAS,8BAA8B,GAAG,GAAG;AAC3C,KAAI,QAAQ,EAAG,QAAO,EAAE;CACxB,IAAI,IAAI,EAAE;AACV,MAAK,IAAI,KAAK,EAAG,KAAI,EAAE,CAAC,eAAe,KAAK,GAAG,EAAE,EAAE;AACjD,MAAI,OAAO,EAAE,QAAQ,EAAE,CAAE;AACzB,IAAE,KAAK,EAAE;;AAEX,QAAO;;AAKT,SAAS,aAAa,GAAG,GAAG;AAC1B,KAAI,YAAY,OAAO,KAAK,CAAC,EAAG,QAAO;CACvC,IAAI,IAAI,EAAE,OAAO;AACjB,KAAI,KAAK,MAAM,GAAG;EAChB,IAAI,IAAI,EAAE,KAAK,GAAG,KAAK,UAAU;AACjC,MAAI,YAAY,OAAO,EAAG,QAAO;AACjC,QAAM,IAAI,UAAU,+CAA+C;;AAErE,SAAQ,aAAa,IAAI,SAAS,QAAQ,EAAE;;AAE9C,SAAS,eAAe,GAAG;CACzB,IAAI,IAAI,aAAa,GAAG,SAAS;AACjC,QAAO,YAAY,OAAO,IAAI,IAAI,IAAI;;AAExC,SAAS,QAAQ,GAAG;AAClB;AAEA,QAAO,UAAU,cAAc,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,SAAU,KAAG;AAChG,SAAO,OAAOC;KACZ,SAAU,KAAG;AACf,SAAOA,OAAK,cAAc,OAAO,UAAUA,IAAE,gBAAgB,UAAUA,QAAM,OAAO,YAAY,WAAW,OAAOA;IACjH,QAAQ,EAAE;;AAUf,IAAI,UAAU;AAEd,SAAS,UAAU,SAAS;AAC1B,KAAI,OAAO,WAAW,eAAe,OAAO,UAC1C,QAAO,CAAC,CAAe,0BAAU,UAAU,MAAM,QAAQ;;AAG7D,IAAI,aAAa,UAAU,wDAAwD;AACnF,IAAI,OAAO,UAAU,QAAQ;AAC7B,IAAI,UAAU,UAAU,WAAW;AACnC,IAAI,SAAS,UAAU,UAAU,IAAI,CAAC,UAAU,UAAU,IAAI,CAAC,UAAU,WAAW;AACpF,IAAI,MAAM,UAAU,kBAAkB;AACtC,IAAI,mBAAmB,UAAU,UAAU,IAAI,UAAU,WAAW;AAEpE,IAAI,cAAc;CAChB,SAAS;CACT,SAAS;CACV;AACD,SAAS,GAAG,IAAI,OAAO,IAAI;AACzB,IAAG,iBAAiB,OAAO,IAAI,CAAC,cAAc,YAAY;;AAE5D,SAAS,IAAI,IAAI,OAAO,IAAI;AAC1B,IAAG,oBAAoB,OAAO,IAAI,CAAC,cAAc,YAAY;;AAE/D,SAAS,QAAyB,IAAe,UAAU;AACzD,KAAI,CAAC,SAAU;AACf,UAAS,OAAO,QAAQ,WAAW,SAAS,UAAU,EAAE;AACxD,KAAI,GACF,KAAI;AACF,MAAI,GAAG,QACL,QAAO,GAAG,QAAQ,SAAS;WAClB,GAAG,kBACZ,QAAO,GAAG,kBAAkB,SAAS;WAC5B,GAAG,sBACZ,QAAO,GAAG,sBAAsB,SAAS;UAEpC,GAAG;AACV,SAAO;;AAGX,QAAO;;AAET,SAAS,gBAAgB,IAAI;AAC3B,QAAO,GAAG,QAAQ,OAAO,YAAY,GAAG,KAAK,YAAY,GAAG,SAAS,KAAK,GAAG,OAAO,GAAG;;AAEzF,SAAS,QAAyB,IAAe,UAA0B,KAAK,YAAY;AAC1F,KAAI,IAAI;AACN,QAAM,OAAO;AACb,KAAG;AACD,OAAI,YAAY,SAAS,SAAS,OAAO,MAAM,GAAG,eAAe,OAAO,QAAQ,IAAI,SAAS,GAAG,QAAQ,IAAI,SAAS,KAAK,cAAc,OAAO,IAC7I,QAAO;AAET,OAAI,OAAO,IAAK;WAET,KAAK,gBAAgB,GAAG;;AAEnC,QAAO;;AAET,IAAI,UAAU;AACd,SAAS,YAAY,IAAI,MAAM,OAAO;AACpC,KAAI,MAAM,KACR,KAAI,GAAG,UACL,IAAG,UAAU,QAAQ,QAAQ,UAAU,KAAK;KAG5C,IAAG,cADc,MAAM,GAAG,YAAY,KAAK,QAAQ,SAAS,IAAI,CAAC,QAAQ,MAAM,OAAO,KAAK,IAAI,IAClE,QAAQ,MAAM,OAAO,KAAK,QAAQ,SAAS,IAAI;;AAIlF,SAAS,IAAI,IAAI,MAAM,KAAK;CAC1B,IAAI,QAAQ,MAAM,GAAG;AACrB,KAAI,MACF,KAAI,QAAQ,KAAK,GAAG;AAClB,MAAI,SAAS,eAAe,SAAS,YAAY,iBAC/C,OAAM,SAAS,YAAY,iBAAiB,IAAI,GAAG;WAC1C,GAAG,aACZ,OAAM,GAAG;AAEX,SAAO,SAAS,KAAK,IAAI,MAAM,IAAI;QAC9B;AACL,MAAI,EAAE,QAAQ,UAAU,KAAK,QAAQ,SAAS,KAAK,GACjD,QAAO,aAAa;AAEtB,QAAM,QAAQ,OAAO,OAAO,QAAQ,WAAW,KAAK;;;AAI1D,SAAS,OAAO,IAAI,UAAU;CAC5B,IAAI,oBAAoB;AACxB,KAAI,OAAO,OAAO,SAChB,qBAAoB;KAEpB,IAAG;EACD,IAAI,YAAY,IAAI,IAAI,YAAY;AACpC,MAAI,aAAa,cAAc,OAC7B,qBAAoB,YAAY,MAAM;UAGjC,CAAC,aAAa,KAAK,GAAG;CAEjC,IAAI,WAAW,OAAO,aAAa,OAAO,mBAAmB,OAAO,aAAa,OAAO;AAExF,QAAO,YAAY,IAAI,SAAS,kBAAkB;;AAEpD,SAAS,KAAK,KAAK,SAAS,UAAU;AACpC,KAAI,KAAK;EACP,IAAI,OAAO,IAAI,qBAAqB,QAAQ,EAC1C,IAAI,GACJ,IAAI,KAAK;AACX,MAAI,SACF,QAAO,IAAI,GAAG,IACZ,UAAS,KAAK,IAAI,EAAE;AAGxB,SAAO;;AAET,QAAO,EAAE;;AAEX,SAAS,4BAA4B;CACnC,IAAI,mBAAmB,SAAS;AAChC,KAAI,iBACF,QAAO;KAEP,QAAO,SAAS;;AAapB,SAAS,QAAQ,IAAI,2BAA2B,2BAA2B,WAAW,WAAW;AAC/F,KAAI,CAAC,GAAG,yBAAyB,OAAO,OAAQ;CAChD,IAAI,QAAQ,KAAK,MAAM,QAAQ,OAAO,QAAQ;AAC9C,KAAI,OAAO,UAAU,GAAG,cAAc,OAAO,2BAA2B,EAAE;AACxE,WAAS,GAAG,uBAAuB;AACnC,QAAM,OAAO;AACb,SAAO,OAAO;AACd,WAAS,OAAO;AAChB,UAAQ,OAAO;AACf,WAAS,OAAO;AAChB,UAAQ,OAAO;QACV;AACL,QAAM;AACN,SAAO;AACP,WAAS,OAAO;AAChB,UAAQ,OAAO;AACf,WAAS,OAAO;AAChB,UAAQ,OAAO;;AAEjB,MAAK,6BAA6B,8BAA8B,OAAO,QAAQ;AAE7E,cAAY,aAAa,GAAG;AAI5B,MAAI,CAAC,WACH;AACE,OAAI,aAAa,UAAU,0BAA0B,IAAI,WAAW,YAAY,KAAK,UAAU,6BAA6B,IAAI,WAAW,WAAW,KAAK,WAAW;IACpK,IAAI,gBAAgB,UAAU,uBAAuB;AAGrD,WAAO,cAAc,MAAM,SAAS,IAAI,WAAW,mBAAmB,CAAC;AACvE,YAAQ,cAAc,OAAO,SAAS,IAAI,WAAW,oBAAoB,CAAC;AAC1E,aAAS,MAAM,OAAO;AACtB,YAAQ,OAAO,OAAO;AACtB;;SAGK,YAAY,UAAU;;AAGnC,KAAI,aAAa,OAAO,QAAQ;EAE9B,IAAI,WAAW,OAAO,aAAa,GAAG,EACpC,SAAS,YAAY,SAAS,GAC9B,SAAS,YAAY,SAAS;AAChC,MAAI,UAAU;AACZ,UAAO;AACP,WAAQ;AACR,YAAS;AACT,aAAU;AACV,YAAS,MAAM;AACf,WAAQ,OAAO;;;AAGnB,QAAO;EACA;EACC;EACE;EACD;EACA;EACC;EACT;;AAUH,SAAS,eAAe,IAAI,QAAQ,YAAY;CAC9C,IAAI,SAAS,2BAA2B,IAAI,KAAK,EAC/C,YAAY,QAAQ,GAAG,CAAC;AAG1B,QAAO,QAAQ;EACb,IAAI,gBAAgB,QAAQ,OAAO,CAAC,aAClC,UAAU,KAAK;AACjB,MAAI,eAAe,SAAS,eAAe,OACzC,WAAU,aAAa;MAEvB,WAAU,aAAa;AAEzB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,WAAW,2BAA2B,CAAE;AAC5C,WAAS,2BAA2B,QAAQ,MAAM;;AAEpD,QAAO;;AAWT,SAAS,SAAS,IAAI,UAAU,SAAS,eAAe;CACtD,IAAI,eAAe,GACjB,IAAI,GACJ,WAAW,GAAG;AAChB,QAAO,IAAI,SAAS,QAAQ;AAC1B,MAAI,SAAS,GAAG,MAAM,YAAY,UAAU,SAAS,OAAO,SAAS,UAAU,iBAAiB,SAAS,OAAO,SAAS,YAAY,QAAQ,SAAS,IAAI,QAAQ,WAAW,IAAI,MAAM,EAAE;AACvL,OAAI,iBAAiB,SACnB,QAAO,SAAS;AAElB;;AAEF;;AAEF,QAAO;;AAST,SAAS,UAAU,IAAI,UAAU;CAC/B,IAAI,OAAO,GAAG;AACd,QAAO,SAAS,SAAS,SAAS,SAAS,IAAI,MAAM,UAAU,KAAK,UAAU,YAAY,CAAC,QAAQ,MAAM,SAAS,EAChH,QAAO,KAAK;AAEd,QAAO,QAAQ;;AAUjB,SAAS,MAAM,IAAI,UAAU;CAC3B,IAAIC,UAAQ;AACZ,KAAI,CAAC,MAAM,CAAC,GAAG,WACb,QAAO;AAIT,QAAO,KAAK,GAAG,uBACb,KAAI,GAAG,SAAS,aAAa,KAAK,cAAc,OAAO,SAAS,UAAU,CAAC,YAAY,QAAQ,IAAI,SAAS,EAC1G;AAGJ,QAAOA;;AAST,SAAS,wBAAwB,IAAI;CACnC,IAAI,aAAa,GACf,YAAY,GACZ,cAAc,2BAA2B;AAC3C,KAAI,GACF,IAAG;EACD,IAAI,WAAW,OAAO,GAAG,EACvB,SAAS,SAAS,GAClB,SAAS,SAAS;AACpB,gBAAc,GAAG,aAAa;AAC9B,eAAa,GAAG,YAAY;UACrB,OAAO,gBAAgB,KAAK,GAAG;AAE1C,QAAO,CAAC,YAAY,UAAU;;AAShC,SAAS,cAAc,KAAK,KAAK;AAC/B,MAAK,IAAI,KAAK,KAAK;AACjB,MAAI,CAAC,IAAI,eAAe,EAAE,CAAE;AAC5B,OAAK,IAAI,OAAO,IACd,KAAI,IAAI,eAAe,IAAI,IAAI,IAAI,SAAS,IAAI,GAAG,KAAM,QAAO,OAAO,EAAE;;AAG7E,QAAO;;AAET,SAAS,2BAA2B,IAAI,aAAa;AAEnD,KAAI,CAAC,MAAM,CAAC,GAAG,sBAAuB,QAAO,2BAA2B;CACxE,IAAI,OAAO;CACX,IAAI,UAAU;AACd;AAEE,MAAI,KAAK,cAAc,KAAK,eAAe,KAAK,eAAe,KAAK,cAAc;GAChF,IAAI,UAAU,IAAI,KAAK;AACvB,OAAI,KAAK,cAAc,KAAK,gBAAgB,QAAQ,aAAa,UAAU,QAAQ,aAAa,aAAa,KAAK,eAAe,KAAK,iBAAiB,QAAQ,aAAa,UAAU,QAAQ,aAAa,WAAW;AACpN,QAAI,CAAC,KAAK,yBAAyB,SAAS,SAAS,KAAM,QAAO,2BAA2B;AAC7F,QAAI,WAAW,YAAa,QAAO;AACnC,cAAU;;;QAIP,OAAO,KAAK;AACrB,QAAO,2BAA2B;;AAEpC,SAAS,OAAO,KAAK,KAAK;AACxB,KAAI,OAAO;OACJ,IAAI,OAAO,IACd,KAAI,IAAI,eAAe,IAAI,CACzB,KAAI,OAAO,IAAI;;AAIrB,QAAO;;AAET,SAAS,YAAY,OAAO,OAAO;AACjC,QAAO,KAAK,MAAM,MAAM,IAAI,KAAK,KAAK,MAAM,MAAM,IAAI,IAAI,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,OAAO,IAAI,KAAK,MAAM,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM;;AAE7N,IAAI;AACJ,SAAS,SAAS,UAAU,IAAI;AAC9B,QAAO,WAAY;AACjB,MAAI,CAAC,kBAAkB;GACrB,IAAI,OAAO,WACT,QAAQ;AACV,OAAI,KAAK,WAAW,EAClB,UAAS,KAAK,OAAO,KAAK,GAAG;OAE7B,UAAS,MAAM,OAAO,KAAK;AAE7B,sBAAmB,WAAW,WAAY;AACxC,uBAAmB,KAAK;MACvB,GAAG;;;;AAIZ,SAAS,iBAAiB;AACxB,cAAa,iBAAiB;AAC9B,oBAAmB,KAAK;;AAE1B,SAAS,SAAS,IAAI,GAAG,GAAG;AAC1B,IAAG,cAAc;AACjB,IAAG,aAAa;;AAElB,SAAS,MAAM,IAAI;CACjB,IAAI,UAAU,OAAO;CACrB,IAAI,IAAI,OAAO,UAAU,OAAO;AAChC,KAAI,WAAW,QAAQ,IACrB,QAAO,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK;UAC7B,EACT,QAAO,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC;KAEzB,QAAO,GAAG,UAAU,KAAK;;AAiB7B,SAAS,kCAAkC,WAAW,SAAS,WAAS;CACtE,IAAI,OAAO,EAAE;AACb,OAAM,KAAK,UAAU,SAAS,CAAC,QAAQ,SAAU,OAAO;EACtD,IAAI,YAAY,WAAW,aAAa;AACxC,MAAI,CAAC,QAAQ,OAAO,QAAQ,WAAW,WAAW,MAAM,IAAI,MAAM,YAAY,UAAUC,UAAS;EACjG,IAAI,YAAY,QAAQ,MAAM;AAC9B,OAAK,OAAO,KAAK,KAAK,aAAa,KAAK,UAAU,QAAQ,eAAe,KAAK,IAAI,aAAa,UAAU,UAAU,KAAK;AACxH,OAAK,MAAM,KAAK,KAAK,YAAY,KAAK,SAAS,QAAQ,cAAc,KAAK,IAAI,YAAY,UAAU,UAAU,IAAI;AAClH,OAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,WAAW,QAAQ,gBAAgB,KAAK,IAAI,cAAc,WAAW,UAAU,MAAM;AAC/H,OAAK,SAAS,KAAK,KAAK,eAAe,KAAK,YAAY,QAAQ,iBAAiB,KAAK,IAAI,eAAe,WAAW,UAAU,OAAO;GACrI;AACF,MAAK,QAAQ,KAAK,QAAQ,KAAK;AAC/B,MAAK,SAAS,KAAK,SAAS,KAAK;AACjC,MAAK,IAAI,KAAK;AACd,MAAK,IAAI,KAAK;AACd,QAAO;;AAET,IAAI,UAAU,8BAAa,IAAI,MAAM,EAAC,SAAS;AAE/C,SAAS,wBAAwB;CAC/B,IAAI,kBAAkB,EAAE,EACtB;AACF,QAAO;EACL,uBAAuB,SAAS,wBAAwB;AACtD,qBAAkB,EAAE;AACpB,OAAI,CAAC,KAAK,QAAQ,UAAW;AACd,KAAE,CAAC,MAAM,KAAK,KAAK,GAAG,SAAS,CACrC,QAAQ,SAAU,OAAO;AAChC,QAAI,IAAI,OAAO,UAAU,KAAK,UAAU,UAAU,SAAS,MAAO;AAClE,oBAAgB,KAAK;KACnB,QAAQ;KACR,MAAM,QAAQ,MAAM;KACrB,CAAC;IACF,IAAI,WAAW,eAAe,EAAE,EAAE,gBAAgB,gBAAgB,SAAS,GAAG,KAAK;AAGnF,QAAI,MAAM,uBAAuB;KAC/B,IAAI,cAAc,OAAO,OAAO,KAAK;AACrC,SAAI,aAAa;AACf,eAAS,OAAO,YAAY;AAC5B,eAAS,QAAQ,YAAY;;;AAGjC,UAAM,WAAW;KACjB;;EAEJ,mBAAmB,SAAS,kBAAkB,OAAO;AACnD,mBAAgB,KAAK,MAAM;;EAE7B,sBAAsB,SAAS,qBAAqB,QAAQ;AAC1D,mBAAgB,OAAO,cAAc,iBAAiB,EAC5C,QACT,CAAC,EAAE,EAAE;;EAER,YAAY,SAAS,WAAW,UAAU;GACxC,IAAI,QAAQ;AACZ,OAAI,CAAC,KAAK,QAAQ,WAAW;AAC3B,iBAAa,oBAAoB;AACjC,QAAI,OAAO,aAAa,WAAY,WAAU;AAC9C;;GAEF,IAAI,YAAY,OACd,gBAAgB;AAClB,mBAAgB,QAAQ,SAAU,OAAO;IACvC,IAAI,OAAO,GACT,SAAS,MAAM,QACf,WAAW,OAAO,UAClB,SAAS,QAAQ,OAAO,EACxB,eAAe,OAAO,cACtB,aAAa,OAAO,YACpB,gBAAgB,MAAM,MACtB,eAAe,OAAO,QAAQ,KAAK;AACrC,QAAI,cAAc;AAEhB,YAAO,OAAO,aAAa;AAC3B,YAAO,QAAQ,aAAa;;AAE9B,WAAO,SAAS;AAChB,QAAI,OAAO;SAEL,YAAY,cAAc,OAAO,IAAI,CAAC,YAAY,UAAU,OAAO,KAEtE,cAAc,MAAM,OAAO,QAAQ,cAAc,OAAO,OAAO,WAAW,SAAS,MAAM,OAAO,QAAQ,SAAS,OAAO,OAAO,MAE9H,QAAO,kBAAkB,eAAe,cAAc,YAAY,MAAM,QAAQ;;AAKpF,QAAI,CAAC,YAAY,QAAQ,SAAS,EAAE;AAClC,YAAO,eAAe;AACtB,YAAO,aAAa;AACpB,SAAI,CAAC,KACH,QAAO,MAAM,QAAQ;AAEvB,WAAM,QAAQ,QAAQ,eAAe,QAAQ,KAAK;;AAEpD,QAAI,MAAM;AACR,iBAAY;AACZ,qBAAgB,KAAK,IAAI,eAAe,KAAK;AAC7C,kBAAa,OAAO,oBAAoB;AACxC,YAAO,sBAAsB,WAAW,WAAY;AAClD,aAAO,gBAAgB;AACvB,aAAO,eAAe;AACtB,aAAO,WAAW;AAClB,aAAO,aAAa;AACpB,aAAO,wBAAwB;QAC9B,KAAK;AACR,YAAO,wBAAwB;;KAEjC;AACF,gBAAa,oBAAoB;AACjC,OAAI,CAAC;QACC,OAAO,aAAa,WAAY,WAAU;SAE9C,uBAAsB,WAAW,WAAY;AAC3C,QAAI,OAAO,aAAa,WAAY,WAAU;MAC7C,cAAc;AAEnB,qBAAkB,EAAE;;EAEtB,SAAS,SAAS,QAAQ,QAAQ,aAAa,QAAQ,UAAU;AAC/D,OAAI,UAAU;AACZ,QAAI,QAAQ,cAAc,GAAG;AAC7B,QAAI,QAAQ,aAAa,GAAG;IAC5B,IAAI,WAAW,OAAO,KAAK,GAAG,EAC5B,SAAS,YAAY,SAAS,GAC9B,SAAS,YAAY,SAAS,GAC9B,cAAc,YAAY,OAAO,OAAO,SAAS,UAAU,IAC3D,cAAc,YAAY,MAAM,OAAO,QAAQ,UAAU;AAC3D,WAAO,aAAa,CAAC,CAAC;AACtB,WAAO,aAAa,CAAC,CAAC;AACtB,QAAI,QAAQ,aAAa,iBAAiB,aAAa,QAAQ,aAAa,QAAQ;AACpF,SAAK,kBAAkB,QAAQ,OAAO;AAEtC,QAAI,QAAQ,cAAc,eAAe,WAAW,QAAQ,KAAK,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,IAAI;AAClH,QAAI,QAAQ,aAAa,qBAAqB;AAC9C,WAAO,OAAO,aAAa,YAAY,aAAa,OAAO,SAAS;AACpE,WAAO,WAAW,WAAW,WAAY;AACvC,SAAI,QAAQ,cAAc,GAAG;AAC7B,SAAI,QAAQ,aAAa,GAAG;AAC5B,YAAO,WAAW;AAClB,YAAO,aAAa;AACpB,YAAO,aAAa;OACnB,SAAS;;;EAGjB;;AAEH,SAAS,QAAQ,QAAQ;AACvB,QAAO,OAAO;;AAEhB,SAAS,kBAAkB,eAAe,UAAU,QAAQ,SAAS;AACnE,QAAO,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,cAAc,KAAK,EAAE,GAAG,KAAK,IAAI,SAAS,OAAO,cAAc,MAAM,EAAE,CAAC,GAAG,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,OAAO,KAAK,EAAE,GAAG,KAAK,IAAI,SAAS,OAAO,OAAO,MAAM,EAAE,CAAC,GAAG,QAAQ;;AAG7N,IAAI,UAAU,EAAE;AAChB,IAAI,WAAW,EACb,qBAAqB,MACtB;AACD,IAAI,gBAAgB;CAClB,OAAO,SAAS,MAAM,QAAQ;AAE5B,OAAK,IAAI,UAAU,SACjB,KAAI,SAAS,eAAe,OAAO,IAAI,EAAE,UAAU,QACjD,QAAO,UAAU,SAAS;AAG9B,UAAQ,QAAQ,SAAU,GAAG;AAC3B,OAAI,EAAE,eAAe,OAAO,WAC1B,OAAM,iCAAiC,OAAO,OAAO,YAAY,kBAAkB;IAErF;AACF,UAAQ,KAAK,OAAO;;CAEtB,aAAa,SAASC,cAAY,WAAW,UAAU,KAAK;EAC1D,IAAI,QAAQ;AACZ,OAAK,gBAAgB;AACrB,MAAI,SAAS,WAAY;AACvB,SAAM,gBAAgB;;EAExB,IAAI,kBAAkB,YAAY;AAClC,UAAQ,QAAQ,SAAU,QAAQ;AAChC,OAAI,CAAC,SAAS,OAAO,YAAa;AAElC,OAAI,SAAS,OAAO,YAAY,iBAC9B,UAAS,OAAO,YAAY,iBAAiB,eAAe,EAChD,UACX,EAAE,IAAI,CAAC;AAKV,OAAI,SAAS,QAAQ,OAAO,eAAe,SAAS,OAAO,YAAY,WACrE,UAAS,OAAO,YAAY,WAAW,eAAe,EAC1C,UACX,EAAE,IAAI,CAAC;IAEV;;CAEJ,mBAAmB,SAAS,kBAAkB,UAAU,IAAI,YAAU,SAAS;AAC7E,UAAQ,QAAQ,SAAU,QAAQ;GAChC,IAAI,aAAa,OAAO;AACxB,OAAI,CAAC,SAAS,QAAQ,eAAe,CAAC,OAAO,oBAAqB;GAClE,IAAI,cAAc,IAAI,OAAO,UAAU,IAAI,SAAS,QAAQ;AAC5D,eAAY,WAAW;AACvB,eAAY,UAAU,SAAS;AAC/B,YAAS,cAAc;AAGvB,YAASC,YAAU,YAAY,SAAS;IACxC;AACF,OAAK,IAAI,UAAU,SAAS,SAAS;AACnC,OAAI,CAAC,SAAS,QAAQ,eAAe,OAAO,CAAE;GAC9C,IAAI,WAAW,KAAK,aAAa,UAAU,QAAQ,SAAS,QAAQ,QAAQ;AAC5E,OAAI,OAAO,aAAa,YACtB,UAAS,QAAQ,UAAU;;;CAIjC,oBAAoB,SAAS,mBAAmB,MAAM,UAAU;EAC9D,IAAI,kBAAkB,EAAE;AACxB,UAAQ,QAAQ,SAAU,QAAQ;AAChC,OAAI,OAAO,OAAO,oBAAoB,WAAY;AAClD,YAAS,iBAAiB,OAAO,gBAAgB,KAAK,SAAS,OAAO,aAAa,KAAK,CAAC;IACzF;AACF,SAAO;;CAET,cAAc,SAAS,aAAa,UAAU,MAAM,OAAO;EACzD,IAAI;AACJ,UAAQ,QAAQ,SAAU,QAAQ;AAEhC,OAAI,CAAC,SAAS,OAAO,YAAa;AAGlC,OAAI,OAAO,mBAAmB,OAAO,OAAO,gBAAgB,UAAU,WACpE,iBAAgB,OAAO,gBAAgB,MAAM,KAAK,SAAS,OAAO,aAAa,MAAM;IAEvF;AACF,SAAO;;CAEV;AAED,SAAS,cAAc,MAAM;CAC3B,IAAI,WAAW,KAAK,UAClBC,WAAS,KAAK,QACd,OAAO,KAAK,MACZ,WAAW,KAAK,UAChBC,YAAU,KAAK,SACf,OAAO,KAAK,MACZ,SAAS,KAAK,QACdC,aAAW,KAAK,UAChBC,aAAW,KAAK,UAChBC,sBAAoB,KAAK,mBACzBC,sBAAoB,KAAK,mBACzB,gBAAgB,KAAK,eACrBC,gBAAc,KAAK,aACnB,uBAAuB,KAAK;AAC9B,YAAW,YAAYN,YAAUA,SAAO;AACxC,KAAI,CAAC,SAAU;CACf,IAAI,KACF,UAAU,SAAS,SACnB,SAAS,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,OAAO,EAAE;AAE/D,KAAI,OAAO,eAAe,CAAC,cAAc,CAAC,KACxC,OAAM,IAAI,YAAY,MAAM;EAC1B,SAAS;EACT,YAAY;EACb,CAAC;MACG;AACL,QAAM,SAAS,YAAY,QAAQ;AACnC,MAAI,UAAU,MAAM,MAAM,KAAK;;AAEjC,KAAI,KAAK,QAAQA;AACjB,KAAI,OAAO,UAAUA;AACrB,KAAI,OAAO,YAAYA;AACvB,KAAI,QAAQC;AACZ,KAAI,WAAWC;AACf,KAAI,WAAWC;AACf,KAAI,oBAAoBC;AACxB,KAAI,oBAAoBC;AACxB,KAAI,gBAAgB;AACpB,KAAI,WAAWC,gBAAcA,cAAY,cAAc,KAAA;CACvD,IAAI,qBAAqB,eAAe,eAAe,EAAE,EAAE,qBAAqB,EAAE,cAAc,mBAAmB,MAAM,SAAS,CAAC;AACnI,MAAK,IAAI,UAAU,mBACjB,KAAI,UAAU,mBAAmB;AAEnC,KAAIN,SACF,UAAO,cAAc,IAAI;AAE3B,KAAI,QAAQ,QACV,SAAQ,QAAQ,KAAK,UAAU,IAAI;;AAIvC,IAAI,YAAY,CAAC,MAAM;AACvB,IAAI,cAAc,SAASF,cAAY,WAAW,UAAU;CAC1D,IAAI,OAAO,UAAU,SAAS,KAAK,UAAU,OAAO,KAAA,IAAY,UAAU,KAAK,EAAE,EAC/E,gBAAgB,KAAK,KACrB,OAAO,yBAAyB,MAAM,UAAU;AAClD,eAAc,YAAY,KAAK,SAAS,CAAC,WAAW,UAAU,eAAe;EACnE;EACE;EACD;EACD;EACA;EACI;EACH;EACI;EACb,aAAa;EACA;EACb,gBAAgB,SAAS;EACV;EACL;EACS;EACT;EACS;EACnB,oBAAoB;EACpB,sBAAsB;EACtB,gBAAgB,SAAS,iBAAiB;AACxC,iBAAc;;EAEhB,eAAe,SAAS,gBAAgB;AACtC,iBAAc;;EAEhB,uBAAuB,SAAS,sBAAsB,MAAM;AAC1D,kBAAe;IACH;IACJ;IACS;IAChB,CAAC;;EAEL,EAAE,KAAK,CAAC;;AAEX,SAAS,eAAe,MAAM;AAC5B,eAAc,eAAe;EACd;EACJ;EACT,UAAU;EACF;EACE;EACS;EACT;EACS;EACpB,EAAE,KAAK,CAAC;;AAEX,IAAI,QACF,UACA,SACA,QACA,QACA,YACA,SACA,aACA,UACA,UACA,mBACA,mBACA,aACA,aACA,sBAAsB,OACtB,kBAAkB,OAClB,YAAY,EAAE,EACd,QACA,UACA,QACA,QACA,iBACA,gBACA,OACA,YACA,eACA,wBAAwB,OACxB,yBAAyB,OACzB,oBAEA,qBACA,mCAAmC,EAAE,EAGrC,UAAU,OACV,oBAAoB,EAAE;AAGxB,IAAI,iBAAiB,OAAO,aAAa,aACvC,0BAA0B,KAC1B,mBAAmB,QAAQ,aAAa,aAAa,SAErD,mBAAmB,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,eAAe,SAAS,cAAc,MAAM,EAC9G,0BAA0B,WAAY;AACpC,KAAI,CAAC,eAAgB;AAErB,KAAI,WACF,QAAO;CAET,IAAI,KAAK,SAAS,cAAc,IAAI;AACpC,IAAG,MAAM,UAAU;AACnB,QAAO,GAAG,MAAM,kBAAkB;GACjC,EACH,mBAAmB,SAASS,mBAAiB,IAAI,SAAS;CACxD,IAAI,QAAQ,IAAI,GAAG,EACjB,UAAU,SAAS,MAAM,MAAM,GAAG,SAAS,MAAM,YAAY,GAAG,SAAS,MAAM,aAAa,GAAG,SAAS,MAAM,gBAAgB,GAAG,SAAS,MAAM,iBAAiB,EACjK,SAAS,SAAS,IAAI,GAAG,QAAQ,EACjC,SAAS,SAAS,IAAI,GAAG,QAAQ,EACjC,gBAAgB,UAAU,IAAI,OAAO,EACrC,iBAAiB,UAAU,IAAI,OAAO,EACtC,kBAAkB,iBAAiB,SAAS,cAAc,WAAW,GAAG,SAAS,cAAc,YAAY,GAAG,QAAQ,OAAO,CAAC,OAC9H,mBAAmB,kBAAkB,SAAS,eAAe,WAAW,GAAG,SAAS,eAAe,YAAY,GAAG,QAAQ,OAAO,CAAC;AACpI,KAAI,MAAM,YAAY,OACpB,QAAO,MAAM,kBAAkB,YAAY,MAAM,kBAAkB,mBAAmB,aAAa;AAErG,KAAI,MAAM,YAAY,OACpB,QAAO,MAAM,oBAAoB,MAAM,IAAI,CAAC,UAAU,IAAI,aAAa;AAEzE,KAAI,UAAU,cAAc,YAAY,cAAc,aAAa,QAAQ;EACzE,IAAI,qBAAqB,cAAc,aAAa,SAAS,SAAS;AACtE,SAAO,WAAW,eAAe,UAAU,UAAU,eAAe,UAAU,sBAAsB,aAAa;;AAEnH,QAAO,WAAW,cAAc,YAAY,WAAW,cAAc,YAAY,UAAU,cAAc,YAAY,WAAW,cAAc,YAAY,UAAU,mBAAmB,WAAW,MAAM,sBAAsB,UAAU,UAAU,MAAM,sBAAsB,UAAU,kBAAkB,mBAAmB,WAAW,aAAa;GAEvV,qBAAqB,SAASC,qBAAmB,UAAU,YAAY,UAAU;CAC/E,IAAI,cAAc,WAAW,SAAS,OAAO,SAAS,KACpD,cAAc,WAAW,SAAS,QAAQ,SAAS,QACnD,kBAAkB,WAAW,SAAS,QAAQ,SAAS,QACvD,cAAc,WAAW,WAAW,OAAO,WAAW,KACtD,cAAc,WAAW,WAAW,QAAQ,WAAW,QACvD,kBAAkB,WAAW,WAAW,QAAQ,WAAW;AAC7D,QAAO,gBAAgB,eAAe,gBAAgB,eAAe,cAAc,kBAAkB,MAAM,cAAc,kBAAkB;GAQ7I,8BAA8B,SAASC,8BAA4B,GAAG,GAAG;CACvE,IAAI;AACJ,WAAU,KAAK,SAAU,UAAU;EACjC,IAAI,YAAY,SAAS,SAAS,QAAQ;AAC1C,MAAI,CAAC,aAAa,UAAU,SAAS,CAAE;EACvC,IAAI,OAAO,QAAQ,SAAS,EAC1B,qBAAqB,KAAK,KAAK,OAAO,aAAa,KAAK,KAAK,QAAQ,WACrE,mBAAmB,KAAK,KAAK,MAAM,aAAa,KAAK,KAAK,SAAS;AACrE,MAAI,sBAAsB,iBACxB,QAAO,MAAM;GAEf;AACF,QAAO;GAET,gBAAgB,SAASC,gBAAc,SAAS;CAC9C,SAAS,KAAK,OAAO,MAAM;AACzB,SAAO,SAAU,IAAI,MAAM,UAAQ,KAAK;GACtC,IAAI,YAAY,GAAG,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM;AACjH,OAAI,SAAS,SAAS,QAAQ,WAG5B,QAAO;YACE,SAAS,QAAQ,UAAU,MACpC,QAAO;YACE,QAAQ,UAAU,QAC3B,QAAO;YACE,OAAO,UAAU,WAC1B,QAAO,KAAK,MAAM,IAAI,MAAMC,UAAQ,IAAI,EAAE,KAAK,CAAC,IAAI,MAAMA,UAAQ,IAAI;QACjE;IACL,IAAI,cAAc,OAAO,KAAK,MAAM,QAAQ,MAAM;AAClD,WAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,UAAU,cAAc,MAAM,QAAQ,MAAM,QAAQ,WAAW,GAAG;;;;CAI9H,IAAI,QAAQ,EAAE;CACd,IAAI,gBAAgB,QAAQ;AAC5B,KAAI,CAAC,iBAAiB,QAAQ,cAAc,IAAI,SAC9C,iBAAgB,EACd,MAAM,eACP;AAEH,OAAM,OAAO,cAAc;AAC3B,OAAM,YAAY,KAAK,cAAc,MAAM,KAAK;AAChD,OAAM,WAAW,KAAK,cAAc,IAAI;AACxC,OAAM,cAAc,cAAc;AAClC,SAAQ,QAAQ;GAElB,sBAAsB,SAASC,wBAAsB;AACnD,KAAI,CAAC,2BAA2B,QAC9B,KAAI,SAAS,WAAW,OAAO;GAGnC,wBAAwB,SAASC,0BAAwB;AACvD,KAAI,CAAC,2BAA2B,QAC9B,KAAI,SAAS,WAAW,GAAG;;AAKjC,IAAI,kBAAkB,CAAC,iBACrB,UAAS,iBAAiB,SAAS,SAAU,KAAK;AAChD,KAAI,iBAAiB;AACnB,MAAI,gBAAgB;AACpB,MAAI,mBAAmB,IAAI,iBAAiB;AAC5C,MAAI,4BAA4B,IAAI,0BAA0B;AAC9D,oBAAkB;AAClB,SAAO;;GAER,KAAK;AAEV,IAAI,gCAAgC,SAASC,gCAA8B,KAAK;AAC9E,KAAI,QAAQ;AACV,QAAM,IAAI,UAAU,IAAI,QAAQ,KAAK;EACrC,IAAI,UAAU,4BAA4B,IAAI,SAAS,IAAI,QAAQ;AACnE,MAAI,SAAS;GAEX,IAAI,QAAQ,EAAE;AACd,QAAK,IAAI,KAAK,IACZ,KAAI,IAAI,eAAe,EAAE,CACvB,OAAM,KAAK,IAAI;AAGnB,SAAM,SAAS,MAAM,SAAS;AAC9B,SAAM,iBAAiB,KAAK;AAC5B,SAAM,kBAAkB,KAAK;AAC7B,WAAQ,SAAS,YAAY,MAAM;;;;AAIzC,IAAI,wBAAwB,SAASC,wBAAsB,KAAK;AAC9D,KAAI,OACF,QAAO,WAAW,SAAS,iBAAiB,IAAI,OAAO;;AAS3D,SAAS,SAAS,IAAI,SAAS;AAC7B,KAAI,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GACzC,OAAM,8CAA8C,OAAO,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC;AAElF,MAAK,KAAK;AACV,MAAK,UAAU,UAAU,SAAS,EAAE,EAAE,QAAQ;AAG9C,IAAG,WAAW;CACd,IAAIhB,aAAW;EACb,OAAO;EACP,MAAM;EACN,UAAU;EACV,OAAO;EACP,QAAQ;EACR,WAAW,WAAW,KAAK,GAAG,SAAS,GAAG,QAAQ;EAClD,eAAe;EAEf,YAAY;EAEZ,uBAAuB;EAEvB,mBAAmB;EACnB,WAAW,SAAS,YAAY;AAC9B,UAAO,iBAAiB,IAAI,KAAK,QAAQ;;EAE3C,YAAY;EACZ,aAAa;EACb,WAAW;EACX,QAAQ;EACR,QAAQ;EACR,iBAAiB;EACjB,WAAW;EACX,QAAQ;EACR,SAAS,SAAS,QAAQ,cAAc,UAAQ;AAC9C,gBAAa,QAAQ,QAAQY,SAAO,YAAY;;EAElD,YAAY;EACZ,gBAAgB;EAChB,YAAY;EACZ,OAAO;EACP,kBAAkB;EAClB,sBAAsB,OAAO,WAAW,SAAS,QAAQ,SAAS,OAAO,kBAAkB,GAAG,IAAI;EAClG,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,mBAAmB;EACnB,gBAAgB;GACd,GAAG;GACH,GAAG;GACJ;EAED,gBAAgB,SAAS,mBAAmB,SAAS,kBAAkB,WAAW,CAAC,UAAU;EAC7F,sBAAsB;EACvB;AACD,eAAc,kBAAkB,MAAM,IAAIZ,WAAS;AAGnD,MAAK,IAAI,QAAQA,WACf,GAAE,QAAQ,aAAa,QAAQ,QAAQA,WAAS;AAElD,eAAc,QAAQ;AAGtB,MAAK,IAAI,MAAM,KACb,KAAI,GAAG,OAAO,EAAE,KAAK,OAAO,OAAO,KAAK,QAAQ,WAC9C,MAAK,MAAM,KAAK,IAAI,KAAK,KAAK;AAKlC,MAAK,kBAAkB,QAAQ,gBAAgB,QAAQ;AACvD,KAAI,KAAK,gBAEP,MAAK,QAAQ,sBAAsB;AAIrC,KAAI,QAAQ,eACV,IAAG,IAAI,eAAe,KAAK,YAAY;MAClC;AACL,KAAG,IAAI,aAAa,KAAK,YAAY;AACrC,KAAG,IAAI,cAAc,KAAK,YAAY;;AAExC,KAAI,KAAK,iBAAiB;AACxB,KAAG,IAAI,YAAY,KAAK;AACxB,KAAG,IAAI,aAAa,KAAK;;AAE3B,WAAU,KAAK,KAAK,GAAG;AAGvB,SAAQ,SAAS,QAAQ,MAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AAG9E,UAAS,MAAM,uBAAuB,CAAC;;AAEzC,SAAS,YAA4C;CACnD,aAAa;CACb,kBAAkB,SAAS,iBAAiB,QAAQ;AAClD,MAAI,CAAC,KAAK,GAAG,SAAS,OAAO,IAAI,WAAW,KAAK,GAC/C,cAAa;;CAGjB,eAAe,SAAS,cAAc,KAAK,QAAQ;AACjD,SAAO,OAAO,KAAK,QAAQ,cAAc,aAAa,KAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ;;CAE9H,aAAa,SAAS,YAAoC,KAAK;AAC7D,MAAI,CAAC,IAAI,WAAY;EACrB,IAAI,QAAQ,MACV,KAAK,KAAK,IACV,UAAU,KAAK,SACf,kBAAkB,QAAQ,iBAC1B,OAAO,IAAI,MACX,QAAQ,IAAI,WAAW,IAAI,QAAQ,MAAM,IAAI,eAAe,IAAI,gBAAgB,WAAW,KAC3F,UAAU,SAAS,KAAK,QACxB,iBAAiB,IAAI,OAAO,eAAe,IAAI,QAAQ,IAAI,KAAK,MAAM,IAAI,gBAAgB,IAAI,cAAc,CAAC,OAAO,QACpH,SAAS,QAAQ;AACnB,yBAAuB,GAAG;AAG1B,MAAI,OACF;AAEF,MAAI,wBAAwB,KAAK,KAAK,IAAI,IAAI,WAAW,KAAK,QAAQ,SACpE;AAIF,MAAI,eAAe,kBACjB;AAIF,MAAI,CAAC,KAAK,mBAAmB,UAAU,UAAU,OAAO,QAAQ,aAAa,KAAK,SAChF;AAEF,WAAS,QAAQ,QAAQ,QAAQ,WAAW,IAAI,MAAM;AACtD,MAAI,UAAU,OAAO,SACnB;AAEF,MAAI,eAAe,OAEjB;AAIF,aAAW,MAAM,OAAO;AACxB,sBAAoB,MAAM,QAAQ,QAAQ,UAAU;AAGpD,MAAI,OAAO,WAAW;OAChB,OAAO,KAAK,MAAM,KAAK,QAAQ,KAAK,EAAE;AACxC,mBAAe;KACb,UAAU;KACV,QAAQ;KACR,MAAM;KACN,UAAU;KACV,MAAM;KACN,QAAQ;KACT,CAAC;AACF,gBAAY,UAAU,OAAO,EACtB,KACN,CAAC;AACF,uBAAmB,IAAI,gBAAgB;AACvC;;aAEO,QAAQ;AACjB,YAAS,OAAO,MAAM,IAAI,CAAC,KAAK,SAAU,UAAU;AAClD,eAAW,QAAQ,gBAAgB,SAAS,MAAM,EAAE,IAAI,MAAM;AAC9D,QAAI,UAAU;AACZ,oBAAe;MACb,UAAU;MACV,QAAQ;MACR,MAAM;MACN,UAAU;MACV,QAAQ;MACR,MAAM;MACP,CAAC;AACF,iBAAY,UAAU,OAAO,EACtB,KACN,CAAC;AACF,YAAO;;KAET;AACF,OAAI,QAAQ;AACV,uBAAmB,IAAI,gBAAgB;AACvC;;;AAGJ,MAAI,QAAQ,UAAU,CAAC,QAAQ,gBAAgB,QAAQ,QAAQ,IAAI,MAAM,CACvE;AAIF,OAAK,kBAAkB,KAAK,OAAO,OAAO;;CAE5C,mBAAmB,SAAS,kBAA+B,KAAiB,OAAyB,QAAQ;EAC3G,IAAI,QAAQ,MACV,KAAK,MAAM,IACX,UAAU,MAAM,SAChB,gBAAgB,GAAG,eACnB;AACF,MAAI,UAAU,CAAC,UAAU,OAAO,eAAe,IAAI;GACjD,IAAI,WAAW,QAAQ,OAAO;AAC9B,YAAS;AACT,YAAS;AACT,cAAW,OAAO;AAClB,YAAS,OAAO;AAChB,gBAAa;AACb,iBAAc,QAAQ;AACtB,YAAS,UAAU;AACnB,YAAS;IACP,QAAQ;IACR,UAAU,SAAS,KAAK;IACxB,UAAU,SAAS,KAAK;IACzB;AACD,qBAAkB,OAAO,UAAU,SAAS;AAC5C,oBAAiB,OAAO,UAAU,SAAS;AAC3C,QAAK,UAAU,SAAS,KAAK;AAC7B,QAAK,UAAU,SAAS,KAAK;AAC7B,UAAO,MAAM,iBAAiB;AAC9B,iBAAc,SAASiB,gBAAc;AACnC,gBAAY,cAAc,OAAO,EAC1B,KACN,CAAC;AACF,QAAI,SAAS,eAAe;AAC1B,WAAM,SAAS;AACf;;AAIF,UAAM,2BAA2B;AACjC,QAAI,CAAC,WAAW,MAAM,gBACpB,QAAO,YAAY;AAIrB,UAAM,kBAAkB,KAAK,MAAM;AAGnC,mBAAe;KACb,UAAU;KACV,MAAM;KACN,eAAe;KAChB,CAAC;AAGF,gBAAY,QAAQ,QAAQ,aAAa,KAAK;;AAIhD,WAAQ,OAAO,MAAM,IAAI,CAAC,QAAQ,SAAU,UAAU;AACpD,SAAK,QAAQ,SAAS,MAAM,EAAE,kBAAkB;KAChD;AACF,MAAG,eAAe,YAAY,8BAA8B;AAC5D,MAAG,eAAe,aAAa,8BAA8B;AAC7D,MAAG,eAAe,aAAa,8BAA8B;AAC7D,OAAI,QAAQ,gBAAgB;AAC1B,OAAG,eAAe,aAAa,MAAM,QAAQ;AAE7C,KAAC,KAAK,mBAAmB,GAAG,eAAe,iBAAiB,MAAM,QAAQ;UACrE;AACL,OAAG,eAAe,WAAW,MAAM,QAAQ;AAC3C,OAAG,eAAe,YAAY,MAAM,QAAQ;AAC5C,OAAG,eAAe,eAAe,MAAM,QAAQ;;AAIjD,OAAI,WAAW,KAAK,iBAAiB;AACnC,SAAK,QAAQ,sBAAsB;AACnC,WAAO,YAAY;;AAErB,eAAY,cAAc,MAAM,EACzB,KACN,CAAC;AAGF,OAAI,QAAQ,UAAU,CAAC,QAAQ,oBAAoB,WAAW,CAAC,KAAK,mBAAmB,EAAE,QAAQ,cAAc;AAC7G,QAAI,SAAS,eAAe;AAC1B,UAAK,SAAS;AACd;;AAKF,QAAI,QAAQ,gBAAgB;AAC1B,QAAG,eAAe,aAAa,MAAM,oBAAoB;AACzD,QAAG,eAAe,iBAAiB,MAAM,oBAAoB;WACxD;AACL,QAAG,eAAe,WAAW,MAAM,oBAAoB;AACvD,QAAG,eAAe,YAAY,MAAM,oBAAoB;AACxD,QAAG,eAAe,eAAe,MAAM,oBAAoB;;AAE7D,OAAG,eAAe,aAAa,MAAM,6BAA6B;AAClE,OAAG,eAAe,aAAa,MAAM,6BAA6B;AAClE,YAAQ,kBAAkB,GAAG,eAAe,eAAe,MAAM,6BAA6B;AAC9F,UAAM,kBAAkB,WAAW,aAAa,QAAQ,MAAM;SAE9D,cAAa;;;CAInB,8BAA8B,SAAS,6BAA6D,GAAG;EACrG,IAAI,QAAQ,EAAE,UAAU,EAAE,QAAQ,KAAK;AACvC,MAAI,KAAK,IAAI,KAAK,IAAI,MAAM,UAAU,KAAK,OAAO,EAAE,KAAK,IAAI,MAAM,UAAU,KAAK,OAAO,CAAC,IAAI,KAAK,MAAM,KAAK,QAAQ,uBAAuB,KAAK,mBAAmB,OAAO,oBAAoB,GAAG,CACjM,MAAK,qBAAqB;;CAG9B,qBAAqB,SAAS,sBAAsB;AAClD,YAAU,kBAAkB,OAAO;AACnC,eAAa,KAAK,gBAAgB;AAClC,OAAK,2BAA2B;;CAElC,2BAA2B,SAAS,4BAA4B;EAC9D,IAAI,gBAAgB,KAAK,GAAG;AAC5B,MAAI,eAAe,WAAW,KAAK,oBAAoB;AACvD,MAAI,eAAe,YAAY,KAAK,oBAAoB;AACxD,MAAI,eAAe,eAAe,KAAK,oBAAoB;AAC3D,MAAI,eAAe,aAAa,KAAK,oBAAoB;AACzD,MAAI,eAAe,iBAAiB,KAAK,oBAAoB;AAC7D,MAAI,eAAe,aAAa,KAAK,6BAA6B;AAClE,MAAI,eAAe,aAAa,KAAK,6BAA6B;AAClE,MAAI,eAAe,eAAe,KAAK,6BAA6B;;CAEtE,mBAAmB,SAAS,kBAA+B,KAAiB,OAAO;AACjF,UAAQ,SAAS,IAAI,eAAe,WAAW;AAC/C,MAAI,CAAC,KAAK,mBAAmB,MAC3B,KAAI,KAAK,QAAQ,eACf,IAAG,UAAU,eAAe,KAAK,aAAa;WACrC,MACT,IAAG,UAAU,aAAa,KAAK,aAAa;MAE5C,IAAG,UAAU,aAAa,KAAK,aAAa;OAEzC;AACL,MAAG,QAAQ,WAAW,KAAK;AAC3B,MAAG,QAAQ,aAAa,KAAK,aAAa;;AAE5C,MAAI;AACF,OAAI,SAAS,UACX,WAAU,WAAY;AACpB,aAAS,UAAU,OAAO;KAC1B;OAEF,QAAO,cAAc,CAAC,iBAAiB;WAElC,KAAK;;CAEhB,cAAc,SAAS,aAAa,UAAU,KAAK;AACjD,wBAAsB;AACtB,MAAI,UAAU,QAAQ;AACpB,eAAY,eAAe,MAAM,EAC1B,KACN,CAAC;AACF,OAAI,KAAK,gBACP,IAAG,UAAU,YAAY,sBAAsB;GAEjD,IAAI,UAAU,KAAK;AAGnB,IAAC,YAAY,YAAY,QAAQ,QAAQ,WAAW,MAAM;AAC1D,eAAY,QAAQ,QAAQ,YAAY,KAAK;AAC7C,YAAS,SAAS;AAClB,eAAY,KAAK,cAAc;AAG/B,kBAAe;IACb,UAAU;IACV,MAAM;IACN,eAAe;IAChB,CAAC;QAEF,MAAK,UAAU;;CAGnB,kBAAkB,SAAS,mBAAmB;AAC5C,MAAI,UAAU;AACZ,QAAK,SAAS,SAAS;AACvB,QAAK,SAAS,SAAS;AACvB,wBAAqB;GACrB,IAAI,SAAS,SAAS,iBAAiB,SAAS,SAAS,SAAS,QAAQ;GAC1E,IAAI,SAAS;AACb,UAAO,UAAU,OAAO,YAAY;AAClC,aAAS,OAAO,WAAW,iBAAiB,SAAS,SAAS,SAAS,QAAQ;AAC/E,QAAI,WAAW,OAAQ;AACvB,aAAS;;AAEX,UAAO,WAAW,SAAS,iBAAiB,OAAO;AACnD,OAAI,OACF,IAAG;AACD,QAAI,OAAO,UAAU;KACnB,IAAI,WAAW,KAAK;AACpB,gBAAW,OAAO,SAAS,YAAY;MACrC,SAAS,SAAS;MAClB,SAAS,SAAS;MACV;MACR,QAAQ;MACT,CAAC;AACF,SAAI,YAAY,CAAC,KAAK,QAAQ,eAC5B;;AAGJ,aAAS;YAEmB,SAAS,gBAAgB,OAAO;AAEhE,0BAAuB;;;CAG3B,cAAc,SAAS,aAA6B,KAAK;AACvD,MAAI,QAAQ;GACV,IAAI,UAAU,KAAK,SACjB,oBAAoB,QAAQ,mBAC5B,iBAAiB,QAAQ,gBACzB,QAAQ,IAAI,UAAU,IAAI,QAAQ,KAAK,KACvC,cAAc,WAAW,OAAO,SAAS,KAAK,EAC9C,SAAS,WAAW,eAAe,YAAY,GAC/C,SAAS,WAAW,eAAe,YAAY,GAC/C,uBAAuB,2BAA2B,uBAAuB,wBAAwB,oBAAoB,EACrH,MAAM,MAAM,UAAU,OAAO,UAAU,eAAe,MAAM,UAAU,MAAM,uBAAuB,qBAAqB,KAAK,iCAAiC,KAAK,MAAM,UAAU,IACnL,MAAM,MAAM,UAAU,OAAO,UAAU,eAAe,MAAM,UAAU,MAAM,uBAAuB,qBAAqB,KAAK,iCAAiC,KAAK,MAAM,UAAU;AAGrL,OAAI,CAAC,SAAS,UAAU,CAAC,qBAAqB;AAC5C,QAAI,qBAAqB,KAAK,IAAI,KAAK,IAAI,MAAM,UAAU,KAAK,OAAO,EAAE,KAAK,IAAI,MAAM,UAAU,KAAK,OAAO,CAAC,GAAG,kBAChH;AAEF,SAAK,aAAa,KAAK,KAAK;;AAE9B,OAAI,SAAS;AACX,QAAI,aAAa;AACf,iBAAY,KAAK,MAAM,UAAU;AACjC,iBAAY,KAAK,MAAM,UAAU;UAEjC,eAAc;KACZ,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACJ;IAEH,IAAI,YAAY,UAAU,OAAO,YAAY,GAAG,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI,CAAC,OAAO,YAAY,GAAG,IAAI;AAC3L,QAAI,SAAS,mBAAmB,UAAU;AAC1C,QAAI,SAAS,gBAAgB,UAAU;AACvC,QAAI,SAAS,eAAe,UAAU;AACtC,QAAI,SAAS,aAAa,UAAU;AACpC,aAAS;AACT,aAAS;AACT,eAAW;;AAEb,OAAI,cAAc,IAAI,gBAAgB;;;CAG1C,cAAc,SAAS,eAAe;AAGpC,MAAI,CAAC,SAAS;GACZ,IAAI,YAAY,KAAK,QAAQ,iBAAiB,SAAS,OAAO,QAC5D,OAAO,QAAQ,QAAQ,MAAM,yBAAyB,MAAM,UAAU,EACtE,UAAU,KAAK;AAGjB,OAAI,yBAAyB;AAE3B,0BAAsB;AACtB,WAAO,IAAI,qBAAqB,WAAW,KAAK,YAAY,IAAI,qBAAqB,YAAY,KAAK,UAAU,wBAAwB,SACtI,uBAAsB,oBAAoB;AAE5C,QAAI,wBAAwB,SAAS,QAAQ,wBAAwB,SAAS,iBAAiB;AAC7F,SAAI,wBAAwB,SAAU,uBAAsB,2BAA2B;AACvF,UAAK,OAAO,oBAAoB;AAChC,UAAK,QAAQ,oBAAoB;UAEjC,uBAAsB,2BAA2B;AAEnD,uCAAmC,wBAAwB,oBAAoB;;AAEjF,aAAU,OAAO,UAAU,KAAK;AAChC,eAAY,SAAS,QAAQ,YAAY,MAAM;AAC/C,eAAY,SAAS,QAAQ,eAAe,KAAK;AACjD,eAAY,SAAS,QAAQ,WAAW,KAAK;AAC7C,OAAI,SAAS,cAAc,GAAG;AAC9B,OAAI,SAAS,aAAa,GAAG;AAC7B,OAAI,SAAS,cAAc,aAAa;AACxC,OAAI,SAAS,UAAU,EAAE;AACzB,OAAI,SAAS,OAAO,KAAK,IAAI;AAC7B,OAAI,SAAS,QAAQ,KAAK,KAAK;AAC/B,OAAI,SAAS,SAAS,KAAK,MAAM;AACjC,OAAI,SAAS,UAAU,KAAK,OAAO;AACnC,OAAI,SAAS,WAAW,MAAM;AAC9B,OAAI,SAAS,YAAY,0BAA0B,aAAa,QAAQ;AACxE,OAAI,SAAS,UAAU,SAAS;AAChC,OAAI,SAAS,iBAAiB,OAAO;AACrC,YAAS,QAAQ;AACjB,aAAU,YAAY,QAAQ;AAG9B,OAAI,SAAS,oBAAoB,kBAAkB,SAAS,QAAQ,MAAM,MAAM,GAAG,MAAM,OAAO,iBAAiB,SAAS,QAAQ,MAAM,OAAO,GAAG,MAAM,IAAI;;;CAGhK,cAAc,SAAS,aAAwB,KAAiB,UAAU;EACxE,IAAI,QAAQ;EACZ,IAAI,eAAe,IAAI;EACvB,IAAI,UAAU,MAAM;AACpB,cAAY,aAAa,MAAM,EACxB,KACN,CAAC;AACF,MAAI,SAAS,eAAe;AAC1B,QAAK,SAAS;AACd;;AAEF,cAAY,cAAc,KAAK;AAC/B,MAAI,CAAC,SAAS,eAAe;AAC3B,aAAU,MAAM,OAAO;AACvB,WAAQ,gBAAgB,KAAK;AAC7B,WAAQ,YAAY;AACpB,WAAQ,MAAM,iBAAiB;AAC/B,QAAK,YAAY;AACjB,eAAY,SAAS,KAAK,QAAQ,aAAa,MAAM;AACrD,YAAS,QAAQ;;AAInB,QAAM,UAAU,UAAU,WAAY;AACpC,eAAY,SAAS,MAAM;AAC3B,OAAI,SAAS,cAAe;AAC5B,OAAI,CAAC,MAAM,QAAQ,kBACjB,QAAO,aAAa,SAAS,OAAO;AAEtC,SAAM,YAAY;AAClB,kBAAe;IACb,UAAU;IACV,MAAM;IACP,CAAC;IACF;AACF,GAAC,YAAY,YAAY,QAAQ,QAAQ,WAAW,KAAK;AAGzD,MAAI,UAAU;AACZ,qBAAkB;AAClB,SAAM,UAAU,YAAY,MAAM,kBAAkB,GAAG;SAClD;AAEL,OAAI,UAAU,WAAW,MAAM,QAAQ;AACvC,OAAI,UAAU,YAAY,MAAM,QAAQ;AACxC,OAAI,UAAU,eAAe,MAAM,QAAQ;AAC3C,OAAI,cAAc;AAChB,iBAAa,gBAAgB;AAC7B,YAAQ,WAAW,QAAQ,QAAQ,KAAK,OAAO,cAAc,OAAO;;AAEtE,MAAG,UAAU,QAAQ,MAAM;AAG3B,OAAI,QAAQ,aAAa,gBAAgB;;AAE3C,wBAAsB;AACtB,QAAM,eAAe,UAAU,MAAM,aAAa,KAAK,OAAO,UAAU,IAAI,CAAC;AAC7E,KAAG,UAAU,eAAe,MAAM;AAClC,UAAQ;AACR,SAAO,cAAc,CAAC,iBAAiB;AACvC,MAAI,OACF,KAAI,SAAS,MAAM,eAAe,OAAO;;CAI7C,aAAa,SAAS,YAAuB,KAAK;EAChD,IAAI,KAAK,KAAK,IACZ,SAAS,IAAI,QACb,UACA,YACA,QACA,UAAU,KAAK,SACf,QAAQ,QAAQ,OAChB,iBAAiB,SAAS,QAC1B,UAAU,gBAAgB,OAC1B,UAAU,QAAQ,MAClB,eAAe,eAAe,gBAC9B,UACA,QAAQ,MACR,iBAAiB;AACnB,MAAI,QAAS;EACb,SAAS,cAAc,MAAM,OAAO;AAClC,eAAY,MAAM,OAAO,eAAe;IACjC;IACI;IACT,MAAM,WAAW,aAAa;IACtB;IACE;IACE;IACH;IACK;IACN;IACG;IACX,QAAQ,SAAS,OAAO,UAAQ,SAAO;AACrC,YAAO,QAAQ,QAAQ,IAAI,QAAQ,UAAUC,UAAQ,QAAQA,SAAO,EAAE,KAAKC,QAAM;;IAE1E;IACV,EAAE,MAAM,CAAC;;EAIZ,SAAS,UAAU;AACjB,iBAAc,2BAA2B;AACzC,SAAM,uBAAuB;AAC7B,OAAI,UAAU,aACZ,cAAa,uBAAuB;;EAKxC,SAAS,UAAU,WAAW;AAC5B,iBAAc,qBAAqB,EACtB,WACZ,CAAC;AACF,OAAI,WAAW;AAEb,QAAI,QACF,gBAAe,YAAY;QAE3B,gBAAe,WAAW,MAAM;AAElC,QAAI,UAAU,cAAc;AAE1B,iBAAY,QAAQ,cAAc,YAAY,QAAQ,aAAa,eAAe,QAAQ,YAAY,MAAM;AAC5G,iBAAY,QAAQ,QAAQ,YAAY,KAAK;;AAE/C,QAAI,gBAAgB,SAAS,UAAU,SAAS,OAC9C,eAAc;aACL,UAAU,SAAS,UAAU,YACtC,eAAc;AAIhB,QAAI,iBAAiB,MACnB,OAAM,wBAAwB;AAEhC,UAAM,WAAW,WAAY;AAC3B,mBAAc,4BAA4B;AAC1C,WAAM,wBAAwB;MAC9B;AACF,QAAI,UAAU,cAAc;AAC1B,kBAAa,YAAY;AACzB,kBAAa,wBAAwB;;;AAKzC,OAAI,WAAW,UAAU,CAAC,OAAO,YAAY,WAAW,MAAM,CAAC,OAAO,SACpE,cAAa;AAIf,OAAI,CAAC,QAAQ,kBAAkB,CAAC,IAAI,UAAU,WAAW,UAAU;AACjE,WAAO,WAAW,SAAS,iBAAiB,IAAI,OAAO;AAGvD,KAAC,aAAa,8BAA8B,IAAI;;AAElD,IAAC,QAAQ,kBAAkB,IAAI,mBAAmB,IAAI,iBAAiB;AACvE,UAAO,iBAAiB;;EAI1B,SAAS,UAAU;AACjB,cAAW,MAAM,OAAO;AACxB,uBAAoB,MAAM,QAAQ,QAAQ,UAAU;AACpD,kBAAe;IACb,UAAU;IACV,MAAM;IACN,MAAM;IACI;IACS;IACnB,eAAe;IAChB,CAAC;;AAEJ,MAAI,IAAI,mBAAmB,KAAK,EAC9B,KAAI,cAAc,IAAI,gBAAgB;AAExC,WAAS,QAAQ,QAAQ,QAAQ,WAAW,IAAI,KAAK;AACrD,gBAAc,WAAW;AACzB,MAAI,SAAS,cAAe,QAAO;AACnC,MAAI,OAAO,SAAS,IAAI,OAAO,IAAI,OAAO,YAAY,OAAO,cAAc,OAAO,cAAc,MAAM,0BAA0B,OAC9H,QAAO,UAAU,MAAM;AAEzB,oBAAkB;AAClB,MAAI,kBAAkB,CAAC,QAAQ,aAAa,UAAU,YAAY,SAAS,aAAa,UACtF,gBAAgB,SAAS,KAAK,cAAc,YAAY,UAAU,MAAM,gBAAgB,QAAQ,IAAI,KAAK,MAAM,SAAS,MAAM,gBAAgB,QAAQ,IAAI,GAAG;AAC7J,cAAW,KAAK,cAAc,KAAK,OAAO,KAAK;AAC/C,cAAW,QAAQ,OAAO;AAC1B,iBAAc,gBAAgB;AAC9B,OAAI,SAAS,cAAe,QAAO;AACnC,OAAI,QAAQ;AACV,eAAW;AACX,aAAS;AACT,SAAK,YAAY;AACjB,kBAAc,SAAS;AACvB,QAAI,CAAC,SAAS,cACZ,KAAI,OACF,QAAO,aAAa,QAAQ,OAAO;QAEnC,QAAO,YAAY,OAAO;AAG9B,WAAO,UAAU,KAAK;;GAExB,IAAI,cAAc,UAAU,IAAI,QAAQ,UAAU;AAClD,OAAI,CAAC,eAAe,aAAa,KAAK,UAAU,KAAK,IAAI,CAAC,YAAY,UAAU;AAI9E,QAAI,gBAAgB,OAClB,QAAO,UAAU,MAAM;AAIzB,QAAI,eAAe,OAAO,IAAI,OAC5B,UAAS;AAEX,QAAI,OACF,cAAa,QAAQ,OAAO;AAE9B,QAAI,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ,YAAY,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO;AACtF,cAAS;AACT,SAAI,eAAe,YAAY,YAE7B,IAAG,aAAa,QAAQ,YAAY,YAAY;SAEhD,IAAG,YAAY,OAAO;AAExB,gBAAW;AAEX,cAAS;AACT,YAAO,UAAU,KAAK;;cAEf,eAAe,cAAc,KAAK,UAAU,KAAK,EAAE;IAE5D,IAAI,aAAa,SAAS,IAAI,GAAG,SAAS,KAAK;AAC/C,QAAI,eAAe,OACjB,QAAO,UAAU,MAAM;AAEzB,aAAS;AACT,iBAAa,QAAQ,OAAO;AAC5B,QAAI,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ,YAAY,KAAK,MAAM,KAAK,OAAO;AACnF,cAAS;AACT,QAAG,aAAa,QAAQ,WAAW;AACnC,gBAAW;AAEX,cAAS;AACT,YAAO,UAAU,KAAK;;cAEf,OAAO,eAAe,IAAI;AACnC,iBAAa,QAAQ,OAAO;IAC5B,IAAI,YAAY,GACd,uBACA,iBAAiB,OAAO,eAAe,IACvC,kBAAkB,CAAC,mBAAmB,OAAO,YAAY,OAAO,UAAU,UAAU,OAAO,YAAY,OAAO,UAAU,YAAY,SAAS,EAC7I,QAAQ,WAAW,QAAQ,QAC3B,kBAAkB,eAAe,QAAQ,OAAO,MAAM,IAAI,eAAe,QAAQ,OAAO,MAAM,EAC9F,eAAe,kBAAkB,gBAAgB,YAAY,KAAK;AACpE,QAAI,eAAe,QAAQ;AACzB,6BAAwB,WAAW;AACnC,6BAAwB;AACxB,8BAAyB,CAAC,mBAAmB,QAAQ,cAAc;;AAErE,gBAAY,kBAAkB,KAAK,QAAQ,YAAY,UAAU,kBAAkB,IAAI,QAAQ,eAAe,QAAQ,yBAAyB,OAAO,QAAQ,gBAAgB,QAAQ,uBAAuB,wBAAwB,eAAe,OAAO;IAC3P,IAAI;AACJ,QAAI,cAAc,GAAG;KAEnB,IAAI,YAAY,MAAM,OAAO;AAC7B,QAAG;AACD,mBAAa;AACb,gBAAU,SAAS,SAAS;cACrB,YAAY,IAAI,SAAS,UAAU,KAAK,UAAU,YAAY;;AAGzE,QAAI,cAAc,KAAK,YAAY,OACjC,QAAO,UAAU,MAAM;AAEzB,iBAAa;AACb,oBAAgB;IAChB,IAAI,cAAc,OAAO,oBACvB,QAAQ;AACV,YAAQ,cAAc;IACtB,IAAI,aAAa,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ,YAAY,KAAK,MAAM;AACtF,QAAI,eAAe,OAAO;AACxB,SAAI,eAAe,KAAK,eAAe,GACrC,SAAQ,eAAe;AAEzB,eAAU;AACV,gBAAW,WAAW,GAAG;AACzB,cAAS;AACT,SAAI,SAAS,CAAC,YACZ,IAAG,YAAY,OAAO;SAEtB,QAAO,WAAW,aAAa,QAAQ,QAAQ,cAAc,OAAO;AAItE,SAAI,gBACF,UAAS,iBAAiB,GAAG,eAAe,gBAAgB,UAAU;AAExE,gBAAW,OAAO;AAGlB,SAAI,0BAA0B,KAAA,KAAa,CAAC,uBAC1C,sBAAqB,KAAK,IAAI,wBAAwB,QAAQ,OAAO,CAAC,OAAO;AAE/E,cAAS;AACT,YAAO,UAAU,KAAK;;;AAG1B,OAAI,GAAG,SAAS,OAAO,CACrB,QAAO,UAAU,MAAM;;AAG3B,SAAO;;CAET,uBAAuB;CACvB,gBAAgB,SAAS,iBAAiB;AACxC,MAAI,UAAU,aAAa,KAAK,aAAa;AAC7C,MAAI,UAAU,aAAa,KAAK,aAAa;AAC7C,MAAI,UAAU,eAAe,KAAK,aAAa;AAC/C,MAAI,UAAU,YAAY,8BAA8B;AACxD,MAAI,UAAU,aAAa,8BAA8B;AACzD,MAAI,UAAU,aAAa,8BAA8B;;CAE3D,cAAc,SAAS,eAAe;EACpC,IAAI,gBAAgB,KAAK,GAAG;AAC5B,MAAI,eAAe,WAAW,KAAK,QAAQ;AAC3C,MAAI,eAAe,YAAY,KAAK,QAAQ;AAC5C,MAAI,eAAe,aAAa,KAAK,QAAQ;AAC7C,MAAI,eAAe,iBAAiB,KAAK,QAAQ;AACjD,MAAI,eAAe,eAAe,KAAK,QAAQ;AAC/C,MAAI,UAAU,eAAe,KAAK;;CAEpC,SAAS,SAAS,QAAmB,KAAK;EACxC,IAAI,KAAK,KAAK,IACZ,UAAU,KAAK;AAGjB,aAAW,MAAM,OAAO;AACxB,sBAAoB,MAAM,QAAQ,QAAQ,UAAU;AACpD,cAAY,QAAQ,MAAM,EACnB,KACN,CAAC;AACF,aAAW,UAAU,OAAO;AAG5B,aAAW,MAAM,OAAO;AACxB,sBAAoB,MAAM,QAAQ,QAAQ,UAAU;AACpD,MAAI,SAAS,eAAe;AAC1B,QAAK,UAAU;AACf;;AAEF,wBAAsB;AACtB,2BAAyB;AACzB,0BAAwB;AACxB,gBAAc,KAAK,QAAQ;AAC3B,eAAa,KAAK,gBAAgB;AAClC,kBAAgB,KAAK,QAAQ;AAC7B,kBAAgB,KAAK,aAAa;AAGlC,MAAI,KAAK,iBAAiB;AACxB,OAAI,UAAU,QAAQ,KAAK;AAC3B,OAAI,IAAI,aAAa,KAAK,aAAa;;AAEzC,OAAK,gBAAgB;AACrB,OAAK,cAAc;AACnB,MAAI,OACF,KAAI,SAAS,MAAM,eAAe,GAAG;AAEvC,MAAI,QAAQ,aAAa,GAAG;AAC5B,MAAI,KAAK;AACP,OAAI,OAAO;AACT,QAAI,cAAc,IAAI,gBAAgB;AACtC,KAAC,QAAQ,cAAc,IAAI,iBAAiB;;AAE9C,cAAW,QAAQ,cAAc,QAAQ,WAAW,YAAY,QAAQ;AACxE,OAAI,WAAW,YAAY,eAAe,YAAY,gBAAgB,QAEpE,YAAW,QAAQ,cAAc,QAAQ,WAAW,YAAY,QAAQ;AAE1E,OAAI,QAAQ;AACV,QAAI,KAAK,gBACP,KAAI,QAAQ,WAAW,KAAK;AAE9B,sBAAkB,OAAO;AACzB,WAAO,MAAM,iBAAiB;AAI9B,QAAI,SAAS,CAAC,oBACZ,aAAY,QAAQ,cAAc,YAAY,QAAQ,aAAa,KAAK,QAAQ,YAAY,MAAM;AAEpG,gBAAY,QAAQ,KAAK,QAAQ,aAAa,MAAM;AAGpD,mBAAe;KACb,UAAU;KACV,MAAM;KACN,MAAM;KACN,UAAU;KACV,mBAAmB;KACnB,eAAe;KAChB,CAAC;AACF,QAAI,WAAW,UAAU;AACvB,SAAI,YAAY,GAAG;AAEjB,qBAAe;OACb,QAAQ;OACR,MAAM;OACN,MAAM;OACN,QAAQ;OACR,eAAe;OAChB,CAAC;AAGF,qBAAe;OACb,UAAU;OACV,MAAM;OACN,MAAM;OACN,eAAe;OAChB,CAAC;AAGF,qBAAe;OACb,QAAQ;OACR,MAAM;OACN,MAAM;OACN,QAAQ;OACR,eAAe;OAChB,CAAC;AACF,qBAAe;OACb,UAAU;OACV,MAAM;OACN,MAAM;OACN,eAAe;OAChB,CAAC;;AAEJ,oBAAe,YAAY,MAAM;eAE7B,aAAa;SACX,YAAY,GAAG;AAEjB,qBAAe;OACb,UAAU;OACV,MAAM;OACN,MAAM;OACN,eAAe;OAChB,CAAC;AACF,qBAAe;OACb,UAAU;OACV,MAAM;OACN,MAAM;OACN,eAAe;OAChB,CAAC;;;AAIR,QAAI,SAAS,QAAQ;AAEnB,SAAI,YAAY,QAAQ,aAAa,IAAI;AACvC,iBAAW;AACX,0BAAoB;;AAEtB,oBAAe;MACb,UAAU;MACV,MAAM;MACN,MAAM;MACN,eAAe;MAChB,CAAC;AAGF,UAAK,MAAM;;;;AAIjB,OAAK,UAAU;;CAEjB,UAAU,SAAS,WAAW;AAC5B,cAAY,WAAW,KAAK;AAC5B,WAAS,SAAS,WAAW,UAAU,SAAS,UAAU,aAAa,cAAc,SAAS,WAAW,QAAQ,WAAW,oBAAoB,WAAW,oBAAoB,aAAa,gBAAgB,cAAc,cAAc,SAAS,UAAU,SAAS,QAAQ,SAAS,QAAQ,SAAS,SAAS;EAC/S,IAAI,KAAK,KAAK;AACd,oBAAkB,QAAQ,SAAU,SAAS;AAC3C,OAAI,GAAG,SAAS,QAAQ,CACtB,SAAQ,UAAU;IAEpB;AACF,oBAAkB,SAAS,SAAS,SAAS;;CAE/C,aAAa,SAAS,YAAuB,KAAK;AAChD,UAAQ,IAAI,MAAZ;GACE,KAAK;GACL,KAAK;AACH,SAAK,QAAQ,IAAI;AACjB;GACF,KAAK;GACL,KAAK;AACH,QAAI,QAAQ;AACV,UAAK,YAAY,IAAI;AACrB,qBAAgB,IAAI;;AAEtB;GACF,KAAK;AACH,QAAI,gBAAgB;AACpB;;;CAON,SAAS,SAAS,UAAU;EAC1B,IAAI,QAAQ,EAAE,EACZ,IACA,WAAW,KAAK,GAAG,UACnB,IAAI,GACJ,IAAI,SAAS,QACb,UAAU,KAAK;AACjB,SAAO,IAAI,GAAG,KAAK;AACjB,QAAK,SAAS;AACd,OAAI,QAAQ,IAAI,QAAQ,WAAW,KAAK,IAAI,MAAM,CAChD,OAAM,KAAK,GAAG,aAAa,QAAQ,WAAW,IAAI,YAAY,GAAG,CAAC;;AAGtE,SAAO;;CAMT,MAAM,SAAS,KAAK,OAAO,cAAc;EACvC,IAAI,QAAQ,EAAE,EACZlB,WAAS,KAAK;AAChB,OAAK,SAAS,CAAC,QAAQ,SAAU,IAAI,GAAG;GACtC,IAAI,KAAKA,SAAO,SAAS;AACzB,OAAI,QAAQ,IAAI,KAAK,QAAQ,WAAWA,UAAQ,MAAM,CACpD,OAAM,MAAM;KAEb,KAAK;AACR,kBAAgB,KAAK,uBAAuB;AAC5C,QAAM,QAAQ,SAAU,IAAI;AAC1B,OAAI,MAAM,KAAK;AACb,aAAO,YAAY,MAAM,IAAI;AAC7B,aAAO,YAAY,MAAM,IAAI;;IAE/B;AACF,kBAAgB,KAAK,YAAY;;CAKnC,MAAM,SAAS,OAAO;EACpB,IAAI,QAAQ,KAAK,QAAQ;AACzB,WAAS,MAAM,OAAO,MAAM,IAAI,KAAK;;CAQvC,SAAS,SAAS,UAAU,IAAI,UAAU;AACxC,SAAO,QAAQ,IAAI,YAAY,KAAK,QAAQ,WAAW,KAAK,IAAI,MAAM;;CAQxE,QAAQ,SAAS,OAAO,MAAM,OAAO;EACnC,IAAI,UAAU,KAAK;AACnB,MAAI,UAAU,KAAK,EACjB,QAAO,QAAQ;OACV;GACL,IAAI,gBAAgB,cAAc,aAAa,MAAM,MAAM,MAAM;AACjE,OAAI,OAAO,kBAAkB,YAC3B,SAAQ,QAAQ;OAEhB,SAAQ,QAAQ;AAElB,OAAI,SAAS,QACX,eAAc,QAAQ;;;CAO5B,SAAS,SAAS,UAAU;AAC1B,cAAY,WAAW,KAAK;EAC5B,IAAI,KAAK,KAAK;AACd,KAAG,WAAW;AACd,MAAI,IAAI,aAAa,KAAK,YAAY;AACtC,MAAI,IAAI,cAAc,KAAK,YAAY;AACvC,MAAI,IAAI,eAAe,KAAK,YAAY;AACxC,MAAI,KAAK,iBAAiB;AACxB,OAAI,IAAI,YAAY,KAAK;AACzB,OAAI,IAAI,aAAa,KAAK;;AAG5B,QAAM,UAAU,QAAQ,KAAK,GAAG,iBAAiB,cAAc,EAAE,SAAU,MAAI;AAC7E,QAAG,gBAAgB,YAAY;IAC/B;AACF,OAAK,SAAS;AACd,OAAK,2BAA2B;AAChC,YAAU,OAAO,UAAU,QAAQ,KAAK,GAAG,EAAE,EAAE;AAC/C,OAAK,KAAK,KAAK;;CAEjB,YAAY,SAAS,aAAa;AAChC,MAAI,CAAC,aAAa;AAChB,eAAY,aAAa,KAAK;AAC9B,OAAI,SAAS,cAAe;AAC5B,OAAI,SAAS,WAAW,OAAO;AAC/B,OAAI,KAAK,QAAQ,qBAAqB,QAAQ,WAC5C,SAAQ,WAAW,YAAY,QAAQ;AAEzC,iBAAc;;;CAGlB,YAAY,SAAS,WAAW,eAAa;AAC3C,MAAIM,cAAY,gBAAgB,SAAS;AACvC,QAAK,YAAY;AACjB;;AAEF,MAAI,aAAa;AACf,eAAY,aAAa,KAAK;AAC9B,OAAI,SAAS,cAAe;AAG5B,OAAI,OAAO,cAAc,UAAU,CAAC,KAAK,QAAQ,MAAM,YACrD,QAAO,aAAa,SAAS,OAAO;YAC3B,OACT,QAAO,aAAa,SAAS,OAAO;OAEpC,QAAO,YAAY,QAAQ;AAE7B,OAAI,KAAK,QAAQ,MAAM,YACrB,MAAK,QAAQ,QAAQ,QAAQ;AAE/B,OAAI,SAAS,WAAW,GAAG;AAC3B,iBAAc;;;CAGnB;AACD,SAAS,gBAA2B,KAAK;AACvC,KAAI,IAAI,aACN,KAAI,aAAa,aAAa;AAEhC,KAAI,cAAc,IAAI,gBAAgB;;AAExC,SAAS,QAAQ,QAAQ,MAAM,UAAQ,UAAU,UAAU,YAAY,eAAe,iBAAiB;CACrG,IAAI,KACF,WAAW,OAAO,UAClB,WAAW,SAAS,QAAQ,QAC5B;AAEF,KAAI,OAAO,eAAe,CAAC,cAAc,CAAC,KACxC,OAAM,IAAI,YAAY,QAAQ;EAC5B,SAAS;EACT,YAAY;EACb,CAAC;MACG;AACL,QAAM,SAAS,YAAY,QAAQ;AACnC,MAAI,UAAU,QAAQ,MAAM,KAAK;;AAEnC,KAAI,KAAK;AACT,KAAI,OAAO;AACX,KAAI,UAAUK;AACd,KAAI,cAAc;AAClB,KAAI,UAAU,YAAY;AAC1B,KAAI,cAAc,cAAc,QAAQ,KAAK;AAC7C,KAAI,kBAAkB;AACtB,KAAI,gBAAgB;AACpB,QAAO,cAAc,IAAI;AACzB,KAAI,SACF,UAAS,SAAS,KAAK,UAAU,KAAK,cAAc;AAEtD,QAAO;;AAET,SAAS,kBAAkB,IAAI;AAC7B,IAAG,YAAY;;AAEjB,SAAS,YAAY;AACnB,WAAU;;AAEZ,SAAS,cAAc,KAAK,UAAU,UAAU;CAC9C,IAAI,cAAc,QAAQ,SAAS,SAAS,IAAI,GAAG,SAAS,SAAS,KAAK,CAAC;CAC3E,IAAI,sBAAsB,kCAAkC,SAAS,IAAI,SAAS,SAAS,QAAQ;CACnG,IAAI,SAAS;AACb,QAAO,WAAW,IAAI,UAAU,oBAAoB,OAAO,UAAU,IAAI,UAAU,YAAY,OAAO,IAAI,UAAU,YAAY,QAAQ,IAAI,UAAU,oBAAoB,MAAM,UAAU,IAAI,UAAU,YAAY,UAAU,IAAI,UAAU,YAAY;;AAE1P,SAAS,aAAa,KAAK,UAAU,UAAU;CAC7C,IAAI,aAAa,QAAQ,UAAU,SAAS,IAAI,SAAS,QAAQ,UAAU,CAAC;CAC5E,IAAI,sBAAsB,kCAAkC,SAAS,IAAI,SAAS,SAAS,QAAQ;CACnG,IAAI,SAAS;AACb,QAAO,WAAW,IAAI,UAAU,oBAAoB,QAAQ,UAAU,IAAI,UAAU,WAAW,UAAU,IAAI,UAAU,WAAW,OAAO,IAAI,UAAU,oBAAoB,SAAS,UAAU,IAAI,UAAU,WAAW,SAAS,IAAI,UAAU,WAAW;;AAE3P,SAAS,kBAAkB,KAAK,QAAQ,YAAY,UAAU,eAAe,uBAAuB,YAAY,cAAc;CAC5H,IAAI,cAAc,WAAW,IAAI,UAAU,IAAI,SAC7C,eAAe,WAAW,WAAW,SAAS,WAAW,OACzD,WAAW,WAAW,WAAW,MAAM,WAAW,MAClD,WAAW,WAAW,WAAW,SAAS,WAAW,OACrD,SAAS;AACX,KAAI,CAAC;MAEC,gBAAgB,qBAAqB,eAAe,eAAe;AAGrE,OAAI,CAAC,0BAA0B,kBAAkB,IAAI,cAAc,WAAW,eAAe,wBAAwB,IAAI,cAAc,WAAW,eAAe,wBAAwB,GAEvL,yBAAwB;AAE1B,OAAI,CAAC;QAEC,kBAAkB,IAAI,cAAc,WAAW,qBACjD,cAAc,WAAW,mBACzB,QAAO,CAAC;SAGV,UAAS;aAIP,cAAc,WAAW,gBAAgB,IAAI,iBAAiB,KAAK,cAAc,WAAW,gBAAgB,IAAI,iBAAiB,EACnI,QAAO,oBAAoB,OAAO;;AAIxC,UAAS,UAAU;AACnB,KAAI;MAEE,cAAc,WAAW,eAAe,wBAAwB,KAAK,cAAc,WAAW,eAAe,wBAAwB,EACvI,QAAO,cAAc,WAAW,eAAe,IAAI,IAAI;;AAG3D,QAAO;;AAST,SAAS,oBAAoB,QAAQ;AACnC,KAAI,MAAM,OAAO,GAAG,MAAM,OAAO,CAC/B,QAAO;KAEP,QAAO;;AAUX,SAAS,YAAY,IAAI;CACvB,IAAI,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,aAC1D,IAAI,IAAI,QACR,MAAM;AACR,QAAO,IACL,QAAO,IAAI,WAAW,EAAE;AAE1B,QAAO,IAAI,SAAS,GAAG;;AAEzB,SAAS,uBAAuB,MAAM;AACpC,mBAAkB,SAAS;CAC3B,IAAI,SAAS,KAAK,qBAAqB,QAAQ;CAC/C,IAAI,MAAM,OAAO;AACjB,QAAO,OAAO;EACZ,IAAI,KAAK,OAAO;AAChB,KAAG,WAAW,kBAAkB,KAAK,GAAG;;;AAG5C,SAAS,UAAU,IAAI;AACrB,QAAO,WAAW,IAAI,EAAE;;AAE1B,SAAS,gBAAgB,IAAI;AAC3B,QAAO,aAAa,GAAG;;AAIzB,IAAI,eACF,IAAG,UAAU,aAAa,SAAU,KAAK;AACvC,MAAK,SAAS,UAAU,wBAAwB,IAAI,WAClD,KAAI,gBAAgB;EAEtB;AAIJ,SAAS,QAAQ;CACX;CACC;CACA;CACC;CACN,IAAI,SAAS,GAAG,IAAI,UAAU;AAC5B,SAAO,CAAC,CAAC,QAAQ,IAAI,UAAU,IAAI,MAAM;;CAEnC;CACE;CACD;CACI;CACN;CACA;CACP,UAAU;CACV,gBAAgB;CAChB,iBAAiB;CACP;CACD;CACV;AAOD,SAAS,MAAM,SAAU,SAAS;AAChC,QAAO,QAAQ;;AAOjB,SAAS,QAAQ,WAAY;AAC3B,MAAK,IAAI,OAAO,UAAU,QAAQQ,YAAU,IAAI,MAAM,KAAK,EAAE,OAAO,GAAG,OAAO,MAAM,OAClF,WAAQ,QAAQ,UAAU;AAE5B,KAAIA,UAAQ,GAAG,gBAAgB,MAAO,aAAUA,UAAQ;AACxD,WAAQ,QAAQ,SAAU,QAAQ;AAChC,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,UAAU,YACzC,OAAM,gEAAgE,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC;AAExG,MAAI,OAAO,MAAO,UAAS,QAAQ,eAAe,eAAe,EAAE,EAAE,SAAS,MAAM,EAAE,OAAO,MAAM;AACnG,gBAAc,MAAM,OAAO;GAC3B;;AAQJ,SAAS,SAAS,SAAU,IAAI,SAAS;AACvC,QAAO,IAAI,SAAS,IAAI,QAAQ;;AAIlC,SAAS,UAAU;AAEnB,IAAI,cAAc,EAAE,EAClB,UACA,cACA,YAAY,OACZ,iBACA,iBACA,YACA;AACF,SAAS,mBAAmB;CAC1B,SAAS,aAAa;AACpB,OAAK,WAAW;GACd,QAAQ;GACR,yBAAyB;GACzB,mBAAmB;GACnB,aAAa;GACb,cAAc;GACf;AAGD,OAAK,IAAI,MAAM,KACb,KAAI,GAAG,OAAO,EAAE,KAAK,OAAO,OAAO,KAAK,QAAQ,WAC9C,MAAK,MAAM,KAAK,IAAI,KAAK,KAAK;;AAIpC,YAAW,YAAY;EACrB,aAAa,SAAS,YAAY,MAAM;GACtC,IAAI,gBAAgB,KAAK;AACzB,OAAI,KAAK,SAAS,gBAChB,IAAG,UAAU,YAAY,KAAK,kBAAkB;YAE5C,KAAK,QAAQ,eACf,IAAG,UAAU,eAAe,KAAK,0BAA0B;YAClD,cAAc,QACvB,IAAG,UAAU,aAAa,KAAK,0BAA0B;OAEzD,IAAG,UAAU,aAAa,KAAK,0BAA0B;;EAI/D,mBAAmB,SAAS,kBAAkB,OAAO;GACnD,IAAI,gBAAgB,MAAM;AAE1B,OAAI,CAAC,KAAK,QAAQ,kBAAkB,CAAC,cAAc,OACjD,MAAK,kBAAkB,cAAc;;EAGzC,MAAM,SAASC,SAAO;AACpB,OAAI,KAAK,SAAS,gBAChB,KAAI,UAAU,YAAY,KAAK,kBAAkB;QAC5C;AACL,QAAI,UAAU,eAAe,KAAK,0BAA0B;AAC5D,QAAI,UAAU,aAAa,KAAK,0BAA0B;AAC1D,QAAI,UAAU,aAAa,KAAK,0BAA0B;;AAE5D,oCAAiC;AACjC,qBAAkB;AAClB,mBAAgB;;EAElB,SAAS,SAAS,UAAU;AAC1B,gBAAa,eAAe,WAAW,YAAY,6BAA6B,kBAAkB,kBAAkB;AACpH,eAAY,SAAS;;EAEvB,2BAA2B,SAAS,0BAA0B,KAAK;AACjE,QAAK,kBAAkB,KAAK,KAAK;;EAEnC,mBAAmB,SAAS,kBAAkB,KAAK,UAAU;GAC3D,IAAI,QAAQ;GACZ,IAAI,KAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK,SAC3C,KAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK,SACzC,OAAO,SAAS,iBAAiB,GAAG,EAAE;AACxC,gBAAa;AAMb,OAAI,YAAY,KAAK,QAAQ,2BAA2B,QAAQ,cAAc,QAAQ;AACpF,eAAW,KAAK,KAAK,SAAS,MAAM,SAAS;IAG7C,IAAI,iBAAiB,2BAA2B,MAAM,KAAK;AAC3D,QAAI,cAAc,CAAC,8BAA8B,MAAM,mBAAmB,MAAM,kBAAkB;AAChG,mCAA8B,iCAAiC;AAE/D,kCAA6B,YAAY,WAAY;MACnD,IAAI,UAAU,2BAA2B,SAAS,iBAAiB,GAAG,EAAE,EAAE,KAAK;AAC/E,UAAI,YAAY,gBAAgB;AAC9B,wBAAiB;AACjB,yBAAkB;;AAEpB,iBAAW,KAAK,MAAM,SAAS,SAAS,SAAS;QAChD,GAAG;AACN,uBAAkB;AAClB,uBAAkB;;UAEf;AAEL,QAAI,CAAC,KAAK,QAAQ,gBAAgB,2BAA2B,MAAM,KAAK,KAAK,2BAA2B,EAAE;AACxG,uBAAkB;AAClB;;AAEF,eAAW,KAAK,KAAK,SAAS,2BAA2B,MAAM,MAAM,EAAE,MAAM;;;EAGlF;AACD,QAAO,SAAS,YAAY;EAC1B,YAAY;EACZ,qBAAqB;EACtB,CAAC;;AAEJ,SAAS,mBAAmB;AAC1B,aAAY,QAAQ,SAAU,cAAY;AACxC,gBAAcC,aAAW,IAAI;GAC7B;AACF,eAAc,EAAE;;AAElB,SAAS,kCAAkC;AACzC,eAAc,2BAA2B;;AAE3C,IAAI,aAAa,SAAS,SAAU,KAAK,SAAS,UAAQ,YAAY;AAEpE,KAAI,CAAC,QAAQ,OAAQ;CACrB,IAAI,KAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK,SAC3C,KAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK,SACzC,OAAO,QAAQ,mBACf,QAAQ,QAAQ,aAChB,cAAc,2BAA2B;CAC3C,IAAI,qBAAqB,OACvB;AAGF,KAAI,iBAAiBrB,UAAQ;AAC3B,iBAAeA;AACf,oBAAkB;AAClB,aAAW,QAAQ;AACnB,mBAAiB,QAAQ;AACzB,MAAI,aAAa,KACf,YAAW,2BAA2BA,UAAQ,KAAK;;CAGvD,IAAI,YAAY;CAChB,IAAI,gBAAgB;AACpB,IAAG;EACD,IAAI,KAAK,eACP,OAAO,QAAQ,GAAG,EAClB,MAAM,KAAK,KACX,SAAS,KAAK,QACd,OAAO,KAAK,MACZ,QAAQ,KAAK,OACb,QAAQ,KAAK,OACb,SAAS,KAAK,QACd,aAAa,KAAK,GAClB,aAAa,KAAK,GAClB,cAAc,GAAG,aACjB,eAAe,GAAG,cAClB,QAAQ,IAAI,GAAG,EACf,aAAa,GAAG,YAChB,aAAa,GAAG;AAClB,MAAI,OAAO,aAAa;AACtB,gBAAa,QAAQ,gBAAgB,MAAM,cAAc,UAAU,MAAM,cAAc,YAAY,MAAM,cAAc;AACvH,gBAAa,SAAS,iBAAiB,MAAM,cAAc,UAAU,MAAM,cAAc,YAAY,MAAM,cAAc;SACpH;AACL,gBAAa,QAAQ,gBAAgB,MAAM,cAAc,UAAU,MAAM,cAAc;AACvF,gBAAa,SAAS,iBAAiB,MAAM,cAAc,UAAU,MAAM,cAAc;;EAE3F,IAAI,KAAK,eAAe,KAAK,IAAI,QAAQ,EAAE,IAAI,QAAQ,aAAa,QAAQ,gBAAgB,KAAK,IAAI,OAAO,EAAE,IAAI,QAAQ,CAAC,CAAC;EAC5H,IAAI,KAAK,eAAe,KAAK,IAAI,SAAS,EAAE,IAAI,QAAQ,aAAa,SAAS,iBAAiB,KAAK,IAAI,MAAM,EAAE,IAAI,QAAQ,CAAC,CAAC;AAC9H,MAAI,CAAC,YAAY;QACV,IAAI,IAAI,GAAG,KAAK,WAAW,IAC9B,KAAI,CAAC,YAAY,GACf,aAAY,KAAK,EAAE;;AAIzB,MAAI,YAAY,WAAW,MAAM,MAAM,YAAY,WAAW,MAAM,MAAM,YAAY,WAAW,OAAO,IAAI;AAC1G,eAAY,WAAW,KAAK;AAC5B,eAAY,WAAW,KAAK;AAC5B,eAAY,WAAW,KAAK;AAC5B,iBAAc,YAAY,WAAW,IAAI;AACzC,OAAI,MAAM,KAAK,MAAM,GAAG;AACtB,yBAAqB;AAErB,gBAAY,WAAW,MAAM,YAAY,WAAY;AAEnD,SAAI,cAAc,KAAK,UAAU,EAC/B,UAAS,OAAO,aAAa,WAAW;KAE1C,IAAI,gBAAgB,YAAY,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,KAAK,QAAQ;KACtF,IAAI,gBAAgB,YAAY,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,KAAK,QAAQ;AACtF,SAAI,OAAO,mBAAmB;UACxB,eAAe,KAAK,SAAS,QAAQ,WAAW,UAAU,eAAe,eAAe,KAAK,YAAY,YAAY,KAAK,OAAO,GAAG,KAAK,WAC3I;;AAGJ,cAAS,YAAY,KAAK,OAAO,IAAI,eAAe,cAAc;MAClE,KAAK,EACL,OAAO,WACR,CAAC,EAAE,GAAG;;;AAGX;UACO,QAAQ,gBAAgB,kBAAkB,gBAAgB,gBAAgB,2BAA2B,eAAe,MAAM;AACnI,aAAY;GACX,GAAG;AAEN,IAAI,OAAO,SAASoB,OAAK,MAAM;CAC7B,IAAI,gBAAgB,KAAK,eACvBd,gBAAc,KAAK,aACnBK,WAAS,KAAK,QACd,iBAAiB,KAAK,gBACtB,wBAAwB,KAAK,uBAC7B,qBAAqB,KAAK,oBAC1B,uBAAuB,KAAK;AAC9B,KAAI,CAAC,cAAe;CACpB,IAAI,aAAaL,iBAAe;AAChC,qBAAoB;CACpB,IAAI,QAAQ,cAAc,kBAAkB,cAAc,eAAe,SAAS,cAAc,eAAe,KAAK;CACpH,IAAI,SAAS,SAAS,iBAAiB,MAAM,SAAS,MAAM,QAAQ;AACpE,uBAAsB;AACtB,KAAI,cAAc,CAAC,WAAW,GAAG,SAAS,OAAO,EAAE;AACjD,wBAAsB,QAAQ;AAC9B,OAAK,QAAQ;GACX,QAAQK;GACR,aAAaL;GACd,CAAC;;;AAGN,SAAS,SAAS;AAClB,OAAO,YAAY;CACjB,YAAY;CACZ,WAAW,SAAS,UAAU,OAAO;AAEnC,OAAK,aADmB,MAAM;;CAGhC,SAAS,SAAS,QAAQ,OAAO;EAC/B,IAAIK,WAAS,MAAM,QACjBL,gBAAc,MAAM;AACtB,OAAK,SAAS,uBAAuB;AACrC,MAAIA,cACF,eAAY,uBAAuB;EAErC,IAAI,cAAc,SAAS,KAAK,SAAS,IAAI,KAAK,YAAY,KAAK,QAAQ;AAC3E,MAAI,YACF,MAAK,SAAS,GAAG,aAAaK,UAAQ,YAAY;MAElD,MAAK,SAAS,GAAG,YAAYA,SAAO;AAEtC,OAAK,SAAS,YAAY;AAC1B,MAAIL,cACF,eAAY,YAAY;;CAGtB;CACP;AACD,SAAS,QAAQ,EACf,YAAY,iBACb,CAAC;AACF,SAAS,SAAS;AAClB,OAAO,YAAY;CACjB,SAAS,SAAS,QAAQ,OAAO;EAC/B,IAAIK,WAAS,MAAM;EAEnB,IAAI,iBADY,MAAM,eACc,KAAK;AACzC,iBAAe,uBAAuB;AACtC,WAAO,cAAcA,SAAO,WAAW,YAAYA,SAAO;AAC1D,iBAAe,YAAY;;CAEvB;CACP;AACD,SAAS,QAAQ,EACf,YAAY,iBACb,CAAC;AAkqBF,SAAS,MAAM,IAAI,kBAAkB,CAAC;AACtC,SAAS,MAAM,QAAQ,OAAO;AAE9B,IAAA,uBAAe;ACttGf,MAAa,aAAa;CAIxB,mBAAmB;EACjB,MAAM;EACN,SAAS;EACV;CAID,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CAID,QAAQ;EACN,MAAM;EACN,SAAS;EACV;CAID,mBAAmB;EACjB,MAAM;EACN,SAAS;EACT,YAAY,UAAkB,OAAO,UAAU,MAAM,IAAI,SAAS;EACnE;CAID,gBAAgB;EACd,MAAM;EACN,SAAS;EACV;CAID,cAAc;EACZ,MAAM;EACN,SAAS;EACV;CAID,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CAID,0BAA0B;EACxB,MAAM;EACN,SAAS;EACT,YAAY,UAAkB,OAAO,UAAU,MAAM,IAAI,SAAS;EACnE;CAID,aAAa;EACX,MAAM;EACN,SAAS;EACV;CAID,MAAM;EACJ,MAAM;EACN,eAAe,EAAE;EAClB;CACF;AAED,IAAM,YAAY,UAChB,UAAU,QAAQ,OAAO,UAAU;AAErC,IAAM,YAAY,UAAoC,OAAO,UAAU;AAEvE,MAAa,aAAa;CAIxB,yBAAyB,YACvB,SAAS,QAAQ,IACjB,SAAS,QAAQ,IAAI,IACrB,SAAS,QAAQ,SAAS,IAC1B,OAAO,QAAQ,aAAa,aAC5B,MAAM,QAAQ,QAAQ,gBAAgB,IACtC,MAAM,QAAQ,QAAQ,eAAe,KACpC,QAAQ,YAAY,eAAe,QAAQ,YAAY;CAI1D,8BAA8B,YAC5B,SAAS,QAAQ,KAChB,QAAQ,WAAW,uBAAuB,QAAQ,WAAW,0BAC9D,MAAM,QAAQ,QAAQ,UAAU;CAIlC,gBAAgB,YACd,SAAS,QAAQ,IACjB,SAAS,QAAQ,SAAS,KACzB,OAAO,QAAQ,WAAW,YAAY,OAAO,QAAQ,WAAW,aACjE,OAAO,QAAQ,cAAc,YAC7B,OAAO,QAAQ,SAAS,YACxB,QAAQ,YAAY;CAItB,mBAAmB,YACjB,SAAS,QAAQ,KAChB,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS;CAI1D,iBAAiB,YACf,SAAS,QAAQ,KAChB,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS;CAI1D,qBAAqB,YACnB,SAAS,QAAQ,IACjB,SAAS,QAAQ,SAAS,IAC1B,SAAS,QAAQ,SAAS,IAC1B,SAAS,QAAQ,IAAI,IACrB,MAAM,QAAQ,QAAQ,KAAK;CAI7B,sBAAsB,YACpB,SAAS,QAAQ,KAChB,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,gBAAgB,QAAQ,SAAS,QAAQ,YAAY;CAIhE,oBAAoB,YAClB,SAAS,QAAQ,KAChB,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,MACvD,QAAQ,gBAAgB,QAAQ,SAAS,QAAQ,YAAY;CAIhE,wBAAwB,YACtB,SAAS,QAAQ,IACjB,SAAS,QAAQ,SAAS,IAC1B,SAAS,QAAQ,SAAS,IAC1B,SAAS,QAAQ,YAAY,IAC7B,MAAM,QAAQ,QAAQ,MAAM;CAC/B;ACrND,IAAM,gBAAgB,UACpB,UAAU,QAAQ,OAAO,UAAU;AAErC,IAAM,eAAe,MAAc,QAAqB;CACtD,MAAM,UAAU,OAAO,QAAQ,WAAW,KAAK,OAAO,IAAI;AAC1D,KAAI,CAAC,QACH,QAAO;AAGT,QAAO,OAAO,GAAG,KAAK,GAAG,YAAY;;AAGvC,IAAM,iBAAiB,KAAc,UAAkB,gBAAyC;CAC9F,MAAM,YAAY,IAAI;AACtB,KAAI,OAAO,cAAc,YAAY,OAAO,cAAc,SACxD,QAAO;AAGT,QAAO;;AAGT,IAAM,oBAAoB,SAAyB;AACjD,KAAI,CAAC,KACH,QAAO;CAGT,MAAM,CAAC,SAAS,KAAK,MAAM,IAAI;AAC/B,QAAO,SAAS;;AAGlB,MAAa,oCAAoC;CAC/C,MAAMW,wBAAwB,IAAI,SAAS;CAE3C,MAAMC,UAAwB;EAC5B,oBAAoB,KAAA;EACpB,uBAAuB;EACvB,aAAa;EACb,UAAU;EACX;CAED,MAAM,kBAAkB,QAAgB,SAAiB,MAAM,IAAI,OAAO,EAAE,IAAI,KAAK;CAErF,MAAM,kBAAkB,QAAgB,MAAc,UAAmB;AACvE,MAAI,CAAC,MAAM,IAAI,OAAO,CACpB,OAAM,IAAI,wBAAQ,IAAI,KAAK,CAAC;AAG9B,QAAM,IAAI,OAAO,EAAE,IAAI,MAAM,MAAM;;CAGrC,MAAM,iBAAiB,UAAmC;AACxD,MAAI,CAAC,aAAa,MAAM,CACtB,QAAO;AAGT,SAAO;;CAGT,MAAM,eACJ,QACA,SACA,MACA,UACY;EACZ,MAAM,SAAS,eAAe,QAAQ,KAAK;AAC3C,MAAI,OACF,QAAO;EAGT,MAAM,QAAQ,IAAI,MAAM,QAAQ;GAC9B,IAAI,eAAe,KAAK;IACtB,MAAM,QAAQ,QAAQ,IAAI,eAAe,IAAI;AAE7C,QAAI,CAAC,aAAa,MAAM,CACtB,QAAO;AAGT,QAAI,SAAS,QAAQ,SACnB,QAAO;AAIT,WAAO,YAAY,OAAO,SADT,YAAY,MAAM,IAAI,EACM,QAAQ,EAAE;;GAEzD,IAAI,eAAe,KAAK,OAAO;IAC7B,MAAM,gBAAgB,QAAQ,IAAI,eAAe,IAAI;IACrD,MAAM,SAAS,QAAQ,IAAI,eAAe,KAAK,MAAM;AAErD,QAAI,CAAC,UAAU,OAAO,QAAQ,YAAY,OAAO,GAAG,eAAe,MAAM,CACvE,QAAO;IAGT,MAAM,WAAW,YAAY,MAAM,IAAI;IACvC,MAAM,WAAW,QAAQ,gBAAgB,QAAQ;AAEjD,YAAQ,aAAa;KACnB;KACA,QAAQ,cAAc,SAAS,UAAU,QAAQ,YAAY;KAC7D,WAAW,iBAAiB,SAAS;KACrC,MAAM;KACN,WAAW;KACX,WAAW;KACX,SAAS;KACV,CAAC;AAEF,WAAO;;GAEV,CAAC;AAEF,iBAAe,QAAQ,MAAM,MAAM;AACnC,SAAO;;AAGT,SAAQ,EACN,MACA,cACA,iBACA,aACA,eAC2B;AAC3B,UAAQ,eAAe;AACvB,UAAQ,kBAAkB;AAC1B,UAAQ,cAAc;AACtB,UAAQ,WAAW;AAEnB,SAAO,KAAK,KAAK,QAAQ;GACvB,MAAM,SAAS,cAAc,IAAI;AACjC,OAAI,CAAC,OACH,QAAO;AAGT,UAAO,YAAY,QAAQ,QAAQ,IAAI,EAAE;IACzC;;;AC5HN,MAAa,4BAA4B,OAAO,2BAA2B;AAO3E,IAAM,qBAAqB,aAAsD;CAC/E,MAAM,OAAO,SAAS,WAAW,EAAE,QAAQ,oBAAoB;AAC/D,QAAO,gBAAgB,cAAc,OAAO;;AAG9C,MAAa,kCAAuD;CAClE,MAAM,0BAAU,IAAI,KAA2B;CAC/C,MAAM,+BAAe,IAAI,KAAa;CACtC,IAAI,4BAAY,IAAI,SAAmC;CACvD,IAAI,eAAe;CAEnB,MAAM,gBAAgB,WAAyB;AAC7C,MAAI,CAAC,OAAO,MAAM;AAChB,gBAAa,OAAO,OAAO,SAAS,GAAG;AACvC;;EAGF,MAAM,MAAM,UAAU,IAAI,OAAO,KAAK;AACtC,OAAK,OAAO,OAAO,SAAS,GAAG;AAC/B,MAAI,KAAK,SAAS,EAChB,WAAU,OAAO,OAAO,KAAK;AAE/B,SAAO,OAAO;;CAGhB,MAAM,eAAe,WAAyB;AAC5C,eAAa,OAAO;EACpB,MAAM,OAAO,kBAAkB,OAAO,SAAS;AAC/C,SAAO,OAAO;AAEd,MAAI,CAAC,MAAM;AACT,gBAAa,IAAI,OAAO,SAAS,GAAG;AACpC;;EAGF,MAAM,MAAM,UAAU,IAAI,KAAK,oBAAI,IAAI,KAAa;AACpD,MAAI,IAAI,OAAO,SAAS,GAAG;AAC3B,YAAU,IAAI,MAAM,IAAI;;CAG1B,MAAM,gBAAgB;AACpB,8BAAY,IAAI,SAAmC;AACnD,eAAa,OAAO;AACpB,OAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,UAAO,OAAO;AACd,eAAY,OAAO;;AAErB,iBAAe;;CAGjB,MAAM,yBAAyB;AAC7B,OAAK,MAAM,MAAM,CAAC,GAAG,aAAa,EAAE;GAClC,MAAM,SAAS,QAAQ,IAAI,GAAG;AAC9B,OAAI,OACF,aAAY,OAAO;OAEnB,cAAa,OAAO,GAAG;;;AAK7B,QAAO;EACL,SAAS,UAAU;GACjB,MAAM,WAAW,QAAQ,IAAI,SAAS,GAAG;AACzC,OAAI,SACF,cAAa,SAAS;GAGxB,MAAMC,SAAuB;IAAE;IAAU,MAAM;IAAM;AACrD,WAAQ,IAAI,SAAS,IAAI,OAAO;AAChC,eAAY,OAAO;AAEnB,gBAAa;IACX,MAAM,UAAU,QAAQ,IAAI,SAAS,GAAG;AACxC,QAAI,SAAS,aAAa,SACxB;AAGF,iBAAa,QAAQ;AACrB,YAAQ,OAAO,SAAS,GAAG;;;EAG/B,kBAAkB,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC,KAAK,WAAW,OAAO,SAAS;EACxE,kBAAkB,OAAO;AACvB,OAAI,MAAM,WAAW,EACnB,QAAO,EAAE;AAEX,OAAI,aACF,UAAS;YACA,aAAa,OAAO,EAC7B,mBAAkB;GAGpB,MAAM,UAAU,IAAI,IAAI,MAAM;GAC9B,MAAM,+BAAe,IAAI,KAAa;AACtC,QAAK,MAAM,QAAQ,MACjB,MAAK,MAAM,MAAM,UAAU,IAAI,KAAK,IAAI,EAAE,CACxC,cAAa,IAAI,GAAG;GAIxB,MAAMC,aAAoC,EAAE;AAC5C,QAAK,MAAM,MAAM,cAAc;IAC7B,MAAM,SAAS,QAAQ,IAAI,GAAG;AAC9B,QAAI,CAAC,OACH;IAGF,MAAM,OAAO,OAAO,SAAS,WAAW;AACxC,QAAI,QAAQ,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE;AACrD,gBAAW,KAAK,OAAO,SAAS;AAChC;;AAGF,gBAAY,OAAO;AACnB,QAAI,OAAO,QAAQ,QAAQ,IAAI,OAAO,KAAK,CACzC,YAAW,KAAK,OAAO,SAAS;;AAIpC,UAAO;;EAET,kBAAkB;AAChB,kBAAe;;EAEjB;EACD;;AC5DH,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;;;;;;;;EACnC,MAAM,uBAAuB,IAAI,IAAI;GAAC;GAAa;GAAS;GAAS,CAAC;EAEtE,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,MAAM,QAAQ,UAAU;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,KAAK,aAAa,QAAQ;EAChC,MAAM,WAAW;EAEjB,MAAM,WAAW,WAAiC,KAAK;EACvD,MAAM,cAAc,WAA4B,KAAK;EACrD,MAAM,iBAAiB,WAA4B,KAAK;EACxD,MAAM,cAAc,IAAc,EAAE,CAAC;EACrC,MAAM,kBAAkB,IAAmB,KAAK;EAChD,MAAM,qBAAqB,IAAY,EAAE;EACzC,MAAM,gCAAgC,IAAmB,KAAK;EAC9D,MAAM,gCAAgC,IAAmB,KAAK;EAC9D,MAAM,kCAAkC,IAAmB,KAAK;EAChE,MAAM,0BAA0B,IAAoC,KAAK;EACzE,MAAM,mBAAmB,IAAa,MAAM;EAC5C,MAAM,gCAAgC,IAAqC,KAAK;EAChF,MAAM,wBAAwB,IAAa,MAAM;EACjD,MAAM,6BAA6B,WAA+B,KAAK;EACvE,MAAM,kCAAkC,IAAqC,KAAK;EAClF,MAAM,gCAAgC,IAAqC,KAAK;EAChF,MAAM,aAAa,IAAuB,KAAK;EAC/C,MAAM,YAAY,IAAI,MAAM;EAC5B,MAAM,6BAA6B,IAAqC,KAAK;EAC7E,MAAM,mBAAmB,IAA6C,KAAK;EAC3E,MAAM,wBAAwB,IAA0C,KAAK;EAC7E,MAAM,iBAAiB,6BAA6B;EACpD,MAAM,iBAAiB,2BAA2B;EAElD,IAAI,0BAA6C;EACjD,IAAI,qBAAwC;EAC5C,IAAI,yBAAyB,MAAM;EACnC,IAAI,6BAA6B;EACjC,IAAI,+BAA+B;EAEnC,MAAM,EAAE,cAAc,gBAAgB,EAAE,CAAC;EAEzC,MAAM,eAAe,aAAsB;AACzC,YAAS,QAAQ;AACjB,aAAU,SAAS;;EAGrB,MAAM,oBAAoB,UAA4B;GACpD,MAAM,YAAqB,EAAE;GAC7B,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE;GAE9C,MAAM,SAAS,SAAkB;AAC/B,QAAI,CAAC,QAAQ,KAAK,CAChB;AAGF,QAAI,KAAK,SAAS,WAAW,KAAK,SAAS,KACzC;AAGF,QAAI,KAAK,SAAS,YAAY,MAAM,QAAQ,KAAK,SAAS,EAAE;AAC1D,UAAK,MAAM,SAAS,KAAK,SACvB,OAAM,MAAM;AAEd;;AAGF,cAAU,KAAK,KAAK;;AAGtB,QAAK,MAAM,QAAQ,KACjB,OAAM,KAAK;AAGb,UAAO;;EAGT,MAAM,wBAAwB,gBAAwB,UAAU;EAEhE,MAAM,qBAAqB,UACzB,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,GAAG,YAAU,QAAM;EAEpD,MAAM,sBACJ,OACA,eAAyB,YAAY,UACxB;AACb,OACE,SAAS,KACT,aAAa,WAAW,SACxB,IAAI,IAAI,aAAa,CAAC,SAAS,SAC/B,aAAa,MAAM,YAAU,UAAQ,KAAK,WAAS,MAAM,CAEzD,QAAO,kBAAkB,MAAM;AAGjC,UAAO;;EAGT,MAAM,sBAAsB,OAAiB,YAAkB,eAA+B;AAC5F,OAAI,eAAa,WACf,QAAO,CAAC,GAAG,MAAM;GAGnB,MAAM,YAAY,CAAC,GAAG,MAAM;GAC5B,MAAM,CAAC,WAAS,UAAU,OAAO,YAAU,EAAE;AAC7C,OAAI,YAAU,KAAA,EACZ,QAAO,CAAC,GAAG,MAAM;AAGnB,aAAU,OAAO,YAAU,GAAG,QAAM;AACpC,UAAO;;EAGT,MAAM,aAAa,eAAe;GAChC,MAAM,gBAAgB,YAAY;GAClC,MAAM,kBAAkB,MAAM;AAE9B,OAAI,CAAC,gBACH,QAAO;AAGT,UAAO;IACL,GAAG;IACH,UAAU,GAAG,SAAoB;KAC/B,MAAM,WAAW,gBAAgB,GAAG,KAAK;KACzC,MAAM,cAAc,iBAAiB,SAAS;AAC9C,SAAI,YAAY,WAAW,EACzB,QAAO;AAIT,YADoB,mBAAmB,YAAY,QAAQ,cAAc,CAEtE,KAAK,gBAAgB;MACpB,MAAM,OAAO,YAAY;AACzB,UAAI,CAAC,KACH,QAAO;AAGT,aAAO,WAAW,MAAM;OACtB,KAAK,KAAK,OAAO,mBAAmB;OACpC,WAAW,qBAAqB,YAAY;OAC7C,CAAC;OACF,CACD,QAAQ,SAAwB,SAAS,KAAK;;IAEpD;IACD;EAEF,MAAM,qBAAqB;GACzB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAED,MAAM,YAA0B,GAAG,SAAkC;AACnE,QAAK,MAAM,OAAO,KAChB,KAAI,OAAO,SACT,QAAO,SAAS;;EAOtB,MAAM,oBAAkB,UAA6B;AACnD,OAAI,CAAC,MACH,QAAO,EAAE;AAGX,OAAI,OAAO,UAAU,SACnB,QAAO,MACJ,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ;AAGpB,OAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,SAAS,SAAS,iBAAe,KAAK,CAAC;AAGtD,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,QAAQ,MAAiC,CACpD,QAAQ,GAAG,aAAa,QAAQ,QAAQ,CAAC,CACzC,KAAK,CAAC,UAAU,KAAK;AAG1B,UAAO,EAAE;;EAGX,MAAM,cAAc,GAAG,WAA8B;GACnD,MAAM,2BAAW,IAAI,KAAa;AAClC,QAAK,MAAM,QAAQ,OAAO,SAAS,UAAU,iBAAe,MAAM,CAAC,CACjE,UAAS,IAAI,KAAK;AAGpB,UAAO,MAAM,KAAK,SAAS,CAAC,KAAK,IAAI;;EAGvC,MAAM,sBAAsB,cAAuB,GAAG,SAA4B;GAChF,MAAM,QAAQ,SAAS,GAAG,KAAK;AAC/B,OAAI,UAAU,KAAA,EACZ,QAAO;AAGT,OAAI,UAAU,GACZ,QAAO;AAGT,OAAI,OAAO,UAAU,UACnB,QAAO;AAGT,UAAO,QAAQ,MAAM;;EAGvB,MAAM,mBAAmB,UACvB,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,GAAG,QAAQ;EAEjE,MAAM,eAAe,MAAiB,YAAkB,eAAgC;AACtF,OAAI,eAAa,WACf,QAAO,CAAC,GAAG,KAAK;GAGlB,MAAM,OAAO,CAAC,GAAG,KAAK;GACtB,MAAM,CAAC,WAAS,KAAK,OAAO,YAAU,EAAE;AACxC,OAAI,CAAC,QACH,QAAO,CAAC,GAAG,KAAK;AAGlB,QAAK,OAAO,YAAU,GAAG,QAAM;AAC/B,UAAO;;EAGT,MAAM,wBAA4C;GAChD,MAAM,YAAa,SAAS,OAA+C;AAC3E,UAAO,qBAAqB,cAAc,YAAY;;EAGxD,MAAM,+BAA+B;GACnC,MAAM,eAAe,iBAAiB;AAItC,OAAI,aACF,cAAa,6BAA6B;;EAI9C,MAAM,iCAAiC;GACrC,MAAM,eAAe,iBAAiB;AAItC,OAAI,eAAe,2BACjB,QAAO,aAAa;;EAIxB,MAAM,2BAAoC;GACxC,MAAM,eAAe,iBAAiB;AACtC,OAAI,CAAC,aACH,QAAO;AAGT,UACE,aAAa,cAAc,0DAA0D,KAAK;;EAI9F,MAAM,yBAAoC;GACxC,MAAM,OAAO,SAAS,OAAO,oBAAoB;AACjD,UAAO,MAAM,QAAQ,KAAK,GAAI,OAAqB,EAAE;;EAGvD,MAAM,aAAa,eAA0B,MAAM,KAAK;EAExD,MAAM,YAAY,eAA0B;AAC1C,OAAI,CAAC,MAAM,OACT,QAAO,WAAW;AAGpB,UAAO,eAAe;IACpB,MAAM,WAAW;IACjB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,kBAAkB,QAAQ,WAAW,MAAM,QAAQ,IAAI;IACvD,eAAe,YAA6B;AAC1C,UAAK,eAAe,QAAQ;;IAE/B,CAAC;IACF;EAEF,MAAM,iBAAiB,eAAe;GACpC,MAAM,OAAO,EAAE,GAAG,UAAU;AAC5B,QAAK,MAAM,OAAO,mBAChB,QAAO,KAAK;AAGd,UAAO;IACP;EAEF,MAAM,cAAc,QAAyC;GAC3D,MAAM,YAAY,IAAI,MAAM;AAC5B,UAAO,OAAO,cAAc,YAAY,OAAO,cAAc,WAAW,YAAY;;EAGtF,MAAM,mBAAmB,WACvB,OAAO,QAAQ,SAAS,YAAY,qBAAqB,IAAI,OAAO,KAAK;EAE3E,MAAM,sBACJ,QACA,eAA8B,SACZ;AAClB,OAAI,OAAO,QAAQ,cAAc,YAAY,OAAO,UAClD,QAAO,OAAO;AAGhB,OAAI,OAAO,QAAQ,iBAAiB,YAAY,OAAO,aACrD,QAAO,OAAO;AAGhB,OAAI,iBAAiB,KACnB,QAAO;AAMT,UAAO,qBAFa,mBADN,KAAK,IAAI,YAAY,MAAM,QAAQ,eAAe,GAAG,mBAAmB,MAAM,CAC/C,CACb,iBAAiB,aACT;;EAG1C,MAAM,2BAA2B,SAAwC;AACvE,OACE,EAAE,gBAAgB,yBAClB,EAAE,KAAK,yBAAyB,qBAEhC,QAAO;AAGT,UAAO,MAAM,KAAK,KAAK,cAAc,SAAS,CAAC,QAAQ,KAAK;;EAG9D,MAAM,0BACJ,MACA,OACA,iBACG;AACH,OACE,CAAC,MAAM,gBACP,iBAAiB,MAAM,4BACvB,EAAE,gBAAgB,aAElB,QAAO;GAGT,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,OAAI,CAAC,MACH,QAAO;GAGT,MAAM,OAAO,KAAK,uBAAuB;AACzC,OAAI,KAAK,SAAS,KAAK,KAAK,UAAU,EACpC,QAAO;AAGT,UAAO,MAAM,IAAI,KAAK,QAAQ,KAAK,IAAI,4BAA4B,KAAK,MAAM;;EAGhF,MAAM,oBAAoB,mBAAsC;AAC9D,6BAA0B,iBAAiB,EAAE,GAAG,gBAAgB,GAAG;AACnE,cAAW,QAAQ,iBAAiB,EAAE,GAAG,gBAAgB,GAAG;AAC5D,gCAA6B;;EAG/B,MAAM,iBACJ,KACA,QACA,iBACG;AACH,OAAI,gBAAgB,OAAO,CACzB;GAGF,MAAM,SAAS,WAAW,IAAI;GAC9B,MAAM,YAAY,mBAAiB,QAAQ,aAAa;AAExD,OAAI,WAAW,QAAQ,CAAC,UACtB;AAGF,oBAAiB;IACf;IACA;IACD,CAAC;;EAGJ,MAAM,8BAAoD;GACxD,MAAM,UAAU,kBAAkB;AAClC,OAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO,EAAE;AAGX,UAAO,QAAQ,SAAS,MAAM,iBAAiB;IAC7C,MAAM,SAAS;AACf,QAAI,gBAAgB,OAAO,CACzB,QAAO,EAAE;IAGX,MAAM,YAAY,mBAAiB,QAAQ,aAAa;AACxD,QAAI,CAAC,UACH,QAAO,EAAE;AAGX,WAAO,CACL;KACE;KACA;KACA;KACD,CACF;KACD;;EAGJ,MAAM,uBACJ,MACA,OAAkB,WAAW,UACC;AAC9B,OAAI,CAAC,KACH,QAAO;GAGT,MAAM,WAAW,KAAK,WAAW,UAAQ,WAAW,MAAI,KAAK,KAAK,OAAO;AACzE,OAAI,WAAW,EACb,QAAO;GAGT,MAAM,UAAU,uBAAuB;GACvC,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAK,cAAc,KAAK,UAAU;AACxE,OAAI,CAAC,OACH,QAAO;GAGT,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,IACH,QAAO;AAGT,UAAO;IACL;IACA;IACA;IACA;IACD;;EAGH,MAAM,kCACJ,oBAAoB,WAAW,MAAM;EAEvC,MAAM,wBAAuC;GAC3C,MAAM,eAAe,iBAAiB;AACtC,OAAI,CAAC,aACH,QAAO,EAAE;AAGX,UAAO,MAAM,KACX,aAAa,iBACX,yDACD,CACF;;EAGH,MAAM,uBAAuB,YAC3B,QAAQ,SAAS,QAAQ,2CAA2C,CAAC;EAEvE,MAAM,8BAA8B,UAAkB,iBACpD,iBAAiB,CAAC,SAAS,YAAY;GAErC,MAAM,MADO,QAAQ,iBAAsC,WAAW,CACrD;AACjB,OAAI,CAAC,IACH,QAAO,EAAE;GAGX,MAAM,OAAO,IAAI,iBAA8B,oBAAoB,CAAC;AACpE,UAAO,OAAO,CAAC,KAAK,GAAG,EAAE;IACzB;EAEJ,MAAM,mBAAmB,UACvB,MAAM,MAAM,SAAS,CAAC,oBAAoB,KAAK,CAAC,IAAI,MAAM,MAAM;EAElE,MAAM,uBAAuB;GAC3B,QAAQ,GAAG,EAAE,eAAe;GAC5B,KAAK,GAAG,EAAE,YAAY;GACtB,QAAQ,GAAG,EAAE,eAAe;GAC5B,SAAS,GAAG,EAAE,qBAAqB;GACpC;EAID,MAAM,0BAAyC;GAC7C,MAAM,eAAe,iBAAiB;AACtC,OAAI,CAAC,aACH,QAAO,EAAE;AAGX,UAAO,MAAM,KACX,aAAa,iBACX,6DACD,CACF;;EAGH,MAAM,gCAAgC,iBACpC,mBAAmB,CAAC,SAAS,YAAY;GACvC,MAAM,OAAO,QAAQ,iBAAsC,WAAW;GAEtE,MAAM,OADM,KAAK,KAAK,SAAS,IACb,iBAA8B,oBAAoB,CAAC;AACrE,UAAO,OAAO,CAAC,KAAK,GAAG,EAAE;IACzB;EAEJ,MAAM,kCAAkC;GACtC,MAAM,eAAe,iBAAiB,CAAC,KAAK,aAAa;IACvD,MAAM,QAAQ,iBAAsC,WAAW;IAC/D,0BAAU,IAAI,KAA4B;IAC3C,EAAE;GAEH,MAAM,gBACJ,SACA,aACyB;IACzB,MAAM,SAAS,QAAQ,SAAS,IAAI,SAAS;AAC7C,QAAI,OACF,QAAO;IAGT,MAAM,MAAM,QAAQ,KAAK;AACzB,QAAI,CAAC,IACH,QAAO;IAGT,MAAM,QAAQ,MAAM,KAAK,IAAI,iBAA8B,oBAAoB,CAAC;AAChF,YAAQ,SAAS,IAAI,UAAU,MAAM;AACrC,WAAO;;AAGT,UAAO;IACL,iBAAiB,UAAkB,cAAsB;AACvD,YAAO,aAAa,SAAS,YAAY;MACvC,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAC/C,aAAO,OAAO,CAAC,KAAK,GAAG,EAAE;OACzB;;IAEJ,oBAAoB,UAAkB;AACpC,YAAO,aAAa,SAAS,YAC3B,MAAM,KAAK,aAAa,SAAS,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,kBAAkB;MAC7E;MACA;MACD,EAAE,CACJ;;IAEH,uBAAuB,cAAsB;KAC3C,MAAM,WAAW,oCAAoC,eAAe,EAAE;AACtE,YAAO,aAAa,SAAS,YAC3B,MAAM,KAAK,QAAQ,KAAK,IAAI,eAAe,iBAA8B,SAAS,IAAI,EAAE,CAAC,CAC1F;;IAEH,oBAAoB;IACrB;;EAGH,MAAM,sBACJ,OACA,UACA,cACG;AACH,QAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,UAAU,MAAM,IAAI,QAAQ,oBAAI,IAAI,KAAa;AACvD,YAAQ,IAAI,UAAU;AACtB,UAAM,IAAI,SAAS,QAAQ;;;EAI/B,MAAM,4BACJ,MACA,gBACA,WACyB;GACzB,MAAM,wBAA8B,IAAI,KAAK;GAC7C,MAAM,YAAY,eAAe;GACjC,MAAM,WAAW,oBACf,MACA,MAAM,QAAQ,UAAU,GAAI,YAA0B,WAAW,MAClE;AACD,OAAI,CAAC,SACH,QAAO;GAGT,MAAM,cAAc,OAAO,iBAAiB,SAAS,UAAU,SAAS,OAAO,aAAa;AAC5F,sBAAmB,OAAO,aAAa,qBAAqB,OAAO;AAEnE,OAAI,CAAC,eACH,QAAO;GAGT,MAAM,UAAU,kBAAkB;AAClC,OAAI,MAAM,QAAQ,QAAQ,CACxB,MAAK,MAAM,EAAE,MAAM,SAAS,kBAAkB,OAAO,oBAAoB,SAAS,SAAS,EAAE;AAC3F,QAAI,iBAAiB,SAAS,OAAO,aACnC;AAGF,uBACE,OACA,CAAC,QAAQ,EACT,gBAAgB,QAAQ,cAA6B,GACjD,qBAAqB,UACrB,qBAAqB,IAC1B;;GAIL,MAAM,gBAAgB,IAAI,IAAI,YAAY;AAC1C,sBACE,OACA,OACG,uBAAuB,SAAS,OAAO,aAAa,CACpD,QAAQ,eAAe,CAAC,cAAc,IAAI,WAAW,CAAC,EACzD,qBAAqB,OACtB;AACD,sBACE,OACA,OAAO,mBAAmB,SAAS,OAAO,aAAa,EACvD,qBAAqB,OACtB;AAED,UAAO;;EAGT,MAAM,6BAA6B,UAAgC,SAA+B;AAChG,QAAK,MAAM,CAAC,SAAS,YAAY,UAAU;IACzC,MAAM,cAAc,KAAK,IAAI,QAAQ;AACrC,SAAK,MAAM,aAAa,QACtB,KAAI,CAAC,aAAa,IAAI,UAAU,CAC9B,SAAQ,UAAU,OAAO,UAAU;;AAKzC,QAAK,MAAM,CAAC,SAAS,YAAY,MAAM;IACrC,MAAM,kBAAkB,SAAS,IAAI,QAAQ;AAC7C,SAAK,MAAM,aAAa,QACtB,KAAI,CAAC,iBAAiB,IAAI,UAAU,CAClC,SAAQ,UAAU,IAAI,UAAU;;;EAMxC,MAAM,+BAA+B;GACnC,MAAM,eAAe,iBAAiB;AACtC,OAAI,CAAC,aACH;GAGF,MAAM,WAAW,OAAO,OAAO,qBAAqB,CACjD,KAAK,cAAc,IAAI,YAAY,CACnC,KAAK,IAAI;AACZ,QAAK,MAAM,WAAW,aAAa,iBAA8B,SAAS,CACxE,SAAQ,UAAU,OAAO,GAAG,OAAO,OAAO,qBAAqB,CAAC;;EAIpE,MAAM,8BAA8B;GAClC,MAAM,iBAAiB,0BAA0B,EAAE,GAAG,yBAAyB,GAAG;GAClF,MAAM,qBAAqB,MAAM;GACjC,MAAM,SAAS,2BAA2B;GAC1C,MAAM,cAAc,yBAAyB,gBAAgB,oBAAoB,OAAO;AAExF,OAAI,8BAA8B;AAChC,4BAAwB;AACxB,8CAA0B,IAAI,KAAK,EAAE,YAAY;SAOjD,2BALwB,yBACtB,oBACA,wBACA,OACD,EAC0C,YAAY;AAGzD,wBAAqB;AACrB,4BAAyB;AACzB,kCAA+B;;EAGjC,SAAS,4BAA4B,cAAc,OAAO;AACxD,oCAAiC;GACjC,MAAM,YAAU,EAAE;AACb,kBAAe;AAClB,QAAI,cAAY,2BACd,wBAAuB;KAEzB;;EAGJ,MAAM,wBAAwB,UAC5B,CAAC,GAAG,MAAM,CAAC,MAAM,MAAM,UAAU;GAC/B,MAAM,aAAa,OAAO,QAAQ,KAAK,aAAa,CAAC,GAAG,OAAO,QAAQ,MAAM,aAAa,CAAC;AAC3F,OAAI,eAAe,EACjB,QAAO;AAGT,WAAQ,MAAM,YAAY,MAAM,KAAK,YAAY;IACjD;EAEJ,MAAM,sBAAsB,UAC1B,qBAAqB,eAAe,kBAAkB,MAAM,CAAC;EAE/D,MAAM,gCAA4D;GAChE,MAAM,WAAW,2BAA2B;AAC5C,OAAI,CAAC,SACH,QAAO;AAIT,UAAO,mBADO,2BAA2B,SAAS,UAAU,SAAS,OAAO,aAAa,CACzD,CAAC,MAAM;;EAGzC,MAAM,yBAAyB,cAA+C;GAC5E,MAAM,WAAW,2BAA2B;AAC5C,OAAI,CAAC,SACH,QAAO;AAGT,OAAI,cAAc,aAAa,cAAc,aAAa;IACxD,MAAM,eAAe,SAAS,YAAY,cAAc,cAAc,IAAI;IAC1E,MAAM,UAAU,WAAW,MAAM;IACjC,MAAM,aAAa,UAAU,WAAW,QAAQ,GAAG;AACnD,QAAI,eAAe,KAAK,CAAC,WAAW,eAAe,KACjD,QAAO;AAGT,WAAO;KACL,QAAQ;KACR,WAAW,SAAS,OAAO;KAC5B;;GAGH,MAAM,qBAAqB,SAAS,QAAQ,WACzC,SAAS,KAAK,cAAc,SAAS,OAAO,UAC9C;AACD,OAAI,qBAAqB,EACvB,QAAO;GAGT,MAAM,kBAAkB,sBAAsB,cAAc,eAAe,IAAI;GAC/E,MAAM,aAAa,SAAS,QAAQ;AACpC,OAAI,CAAC,WACH,QAAO;GAGT,MAAM,SAAS,WAAW,SAAS,IAAI;AACvC,OAAI,WAAW,KACb,QAAO;AAGT,UAAO;IACL;IACA,WAAW,WAAW;IACvB;;EAGH,MAAM,iCAAiC;GACrC,MAAM,WAAW,2BAA2B;AAC5C,OAAI,CAAC,SACH;AAGiB,mBACjB,2BAA2B,SAAS,UAAU,SAAS,OAAO,aAAa,CAC5E,EACW,eAAe;IACzB,OAAO;IACP,QAAQ;IACT,CAAC;;EAGJ,MAAM,mBAAmB,YAAY;GACnC,MAAM,SAAS,yBAAyB;AACxC,OAAI,CAAC,OACH;AAGF,SAAM,QAAQ,QAAQ,OAAO,SAAS,CAAC;AACvC,SAAM,QAAQ,QAAQ,OAAO,MAAM,CAAC;AACpC,aAAU,QAAQ;;EAGpB,MAAM,gCAAgC;GACpC,MAAM,SAAS,yBAAyB;AACxC,OAAI,CAAC,QAAQ,YACX,QAAO;AAGT,UAAO,QAAQ,OAAO,aAAa,CAAC;;EAGtC,MAAM,iCACJ,KACA,iBACA,gBACA,aAC6B;GAC7B;GACA,UAAU,WAAW,MAAM,QAAQ,IAAI;GACvC,UAAU,eAAe,SAAS,IAAI;GACtC;GACA;GACA;GACD;EAED,MAAM,kBAAkB,KAAc,QAAiB,UAAiB;AACtE,OAAI,MAAM,qBAAqB,oBAAoB,IAAI,SAAS,OAAO;IACrE,MAAM,kBAAkB,kBAAkB;AAE1C,QAAI,MAAM,iBAAiB;AACzB,cAAS,MAAM,gBAAgB;AAC/B,cAAS,MAAM,mBAAmB,KAAK,KAAK;WACvC;KACL,MAAM,eAAe,CAAC,gBAAgB,SAAS,IAAI;AACnD,cAAS,MAAM,mBAAmB,KAAK,aAAa;;AAItD,SACE,wBACA,8BAA8B,KAAK,iBAHd,kBAAkB,EAG6B,YAAY,CACjF;;AAGH,kBAAe,SAAS,aAAa,EAAE,KAAK,QAAQ,MAAM;;EAG5D,MAAM,mBAAmB,KAAc,QAAqB,MAAe,UAAiB;GAC1F,MAAM,eAAe,wBAAwB,KAAK;AAGlD,OAAI,CAFoB,uBAAuB,MAAM,OAAO,aAAa,IAEjD,iBAAiB,MAAM;AAC7C,kBAAc,KAAK,QAAQ,aAAa;AACxC,+BAA2B,MAAM,OAAO;;AAG1C,kBAAe,SAAS,eAAe,eAAe,EAAE,KAAK,QAAQ,MAAM,MAAM;;EAGnF,MAAM,gBAAgB,WAAsB,QAAiB;AAC3D,OAAI,MAAM,mBAAmB,SAAS,SAAS,UAAU,SAAS,GAAG;AACnE,aAAS,MAAM,gBAAgB;AAC/B,aAAS,MAAM,mBAAmB,KAAK,KAAK;IAE5C,MAAM,gBAAgB,kBAAkB;AAExC,SAAK,6BAA6B;KAChC,QAAQ;KACR;KACD,CAAC;AAEF,SACE,wBACA,8BAA8B,KAAK,WAAW,eAAe,mBAAmB,CACjF;AAED,mBAAe,SAAS,WAAW,EAAE,eAAe,IAAI;AACxD;;AAGF,kBAAe,SAAS,WAAW,EAAE,WAAW,IAAI;;EAGtD,MAAM,mBAAmB,cAAyB;AAChD,OAAI,MAAM,mBAAmB,SAAS,OAAO;AAC3C,aAAS,MAAM,gBAAgB;AAE/B,SAAK,6BAA6B;KAChC,QAAQ;KACR;KACD,CAAC;AAEF,mBAAe,SAAS,cAAc,EAAE,EAAE,CAAC;AAC3C;;AAGF,kBAAe,SAAS,cAAc,EAAE,UAAU;;EAGpD,MAAM,kCAAkC;GACtC,MAAM,YAAY,GAAG,EAAE,aAAa;GACpC,MAAM,gBAAgB,SAAS,sBAAsB,wBAAwB;AAE7E,OAAI,OAAO,kBAAkB,WAC3B,SAAQ,GAAG,SAAoB,WAAW,cAAc,GAAG,KAAK,EAAE,UAAU;AAG9E,UAAO,WAAW,eAAe,UAAU;;EAG7C,MAAM,6BAA6B;GACjC,MAAM,oBAAoB,SAAS,iBAAiB,kBAAkB;GAEtE,MAAM,qBAAqB,UAA6C;IACtE,MAAM,YAAY;AAClB,QAAI,CAAC,UACH,QAAO;IAGT,MAAM,SAAS,WAAW,MAAM,IAAI;AACpC,QAAI,WAAW,KACb,QAAO;AAGT,QAAI,gBAAgB,MAAM,OAAO,CAC/B,QAAO,MAAM,kBAAkB,WAAW,UAAU,SAAS,GAAG,EAAE,qBAAqB,GAAG;IAG5F,MAAM,YAAY,mBAAiB,MAAM,QAAQ,MAAM,YAAY;AACnE,QAAI,CAAC,UACH,QAAO;IAGT,MAAM,cAAc,WAAW,UAAU;IACzC,MAAM,iBAAiB,cAAc,UAAU;AAE/C,QAAI,eAAe,eACjB,QAAO,GAAG,EAAE,eAAe;AAG7B,QAAI,CAAC,MAAM,eACT,QAAO;AAGT,QAAI,YACF,QAAO,GAAG,EAAE,YAAY;AAG1B,QAAI,eACF,QAAO,GAAG,EAAE,eAAe;AAG7B,WAAO;;GAGT,MAAM,kBAAkB,UACtB,WACE,OAAO,sBAAsB,aAAa,kBAAkB,MAAM,GAAG,mBACrE,MAAM,gBACJ,MAAM,gBAAgB,MAAM,4BAC5B,GAAG,EAAE,gBAAgB,EACvB,kBAAkB,MAAM,CACzB;AAEH,WAAQ,UAA8B,eAAe,MAAM;;EAG7D,MAAM,mCAAmC;GACvC,MAAM,0BAA0B,SAAS,uBAAuB,yBAAyB;GAEzF,MAAM,kBAAkB,UAAoC;IAC1D,MAAM,YAAY;IAClB,MAAM,cACJ,MAAM,kBACN,aACA,CAAC,gBAAgB,MAAM,OAAO,IAC9B,mBAAiB,MAAM,QAAQ,MAAM,YAAY,KAAK,UAAU,YAC5D,GAAG,EAAE,eAAe,GACpB;AAEN,WAAO,WACL,OAAO,4BAA4B,aAC/B,wBAAwB,MAAM,GAC9B,yBACJ,YACD;;AAGH,WAAQ,UAAoC,eAAe,MAAM;;EAGnE,MAAM,0BAA0B,cAA2B;AAEzD,sBAAmB,QADL,UAAU,iBAA8B,oBAAoB,CACzC;;EAGnC,MAAM,yBAEF,SAAS,OASR,OAAO,QAAQ,SAAS;EAE7B,MAAM,sBAEF,SAAS,OASR,OAAO,QAAQ,MAAM;EAE1B,MAAM,uBAAuB,eAAe;GAC1C,MAAM,UAAU,kBAAkB;AAClC,OAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAGT,UAAO,QACJ,KAAK,QAAQ,YAAU;IACtB,MAAM,UAAU;AAChB,WAAO;KACL;KACA,OAAO,QAAQ,aAAa,GAAG;KAC/B,OAAO,QAAQ,QAAQ,GAAG;KAC1B,OAAO,QAAQ,SAAS,GAAG;KAC3B,OAAO,QAAQ,YAAY,GAAG;KAC/B,CAAC,KAAK,IAAI;KACX,CACD,KAAK,IAAI;IACZ;EAEF,MAAM,6BAAqC;GACzC,MAAM,UAAU,kBAAkB;AAElC,UAAO,MAAM,QAAQ,QAAQ,GAAG,QAAQ,SAAS;;EAGnD,MAAM,sBAAsB,WAA+B,eAAe,MAAc;GACtF,MAAM,cAAc,WAAW,iBAA8B,oBAAoB,CAAC,UAAU;AAE5F,UAAO,KAAK,IAAI,cAAc,YAAY,MAAM,QAAQ,sBAAsB,EAAE,YAAY;;EAG9F,MAAM,2BAA2B;AAC/B,eAAY,OAAO,SAAS;AAC5B,eAAY,QAAQ;;EAGtB,MAAM,+CAA+C;AACnD,OAAI,CAAC,8BAA8B,MACjC;AAGF,YAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,YAAS,oBAAoB,WAAW,8BAA8B,MAAM;AAC5E,YAAS,oBAAoB,YAAY,8BAA8B,MAAM;AAC7E,YAAS,oBAAoB,eAAe,8BAA8B,MAAM;AAChF,YAAS,oBAAoB,WAAW,8BAA8B,MAAM;AAC5E,iCAA8B,QAAQ;;EAGxC,MAAM,iCAAiC;AACrC,2CAAwC;AACxC,kBAAe,OAAO,SAAS,YAAY,MAAM;AACjD,yBAAsB,QAAQ;;EAGhC,MAAM,gCAAgC;AACpC,OAAI,2BAA2B,SAAS,gCAAgC,OAAO;AAC7E,+BAA2B,MAAM,oBAC/B,eACA,gCAAgC,OAChC,KACD;AACD,+BAA2B,MAAM,oBAC/B,aACA,gCAAgC,OAChC,KACD;AACD,+BAA2B,MAAM,oBAC/B,cACA,gCAAgC,OAChC,KACD;;AAGH,8BAA2B,QAAQ;AACnC,mCAAgC,QAAQ;;EAG1C,MAAM,8BAA8B;AAClC,6BAA0B;AAC1B,4BAAyB;AACzB,kBAAe,OAAO,SAAS;AAC/B,kBAAe,QAAQ;AACvB,OAAI,8BAA8B,OAAO;AACvC,aAAS,oBAAoB,YAAY,8BAA8B,MAAM;AAC7E,aAAS,oBAAoB,eAAe,8BAA8B,MAAM;AAChF,aAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,aAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,kCAA8B,QAAQ;;AAExC,oBAAiB,QAAQ;AACzB,mBAAgB,QAAQ;AACxB,iCAA8B,QAAQ;AACtC,iCAA8B,QAAQ;AACtC,mCAAgC,QAAQ;AACxC,2BAAwB,QAAQ;GAChC,MAAM,eAAe,iBAAiB;AACtC,OAAI,cAAc;IAChB,MAAM,YAAY,GAAG,EAAE,6BAA6B;IACpD,MAAM,aAAa,GAAG,EAAE,8BAA8B;AACtD,iBACG,iBAA8B,uCAAuC,CACrE,SAAS,SAAS;AACjB,UAAK,UAAU,OAAO,WAAW,WAAW;MAC5C;;;EAIR,MAAM,iCAAiC;AACrC,OAAI,CAAC,2BAA2B,MAC9B;AAGF,YAAS,oBAAoB,eAAe,2BAA2B,OAAO,KAAK;AACnF,YAAS,oBAAoB,aAAa,2BAA2B,OAAO,KAAK;AACjF,YAAS,oBAAoB,cAAc,2BAA2B,OAAO,KAAK;AAClF,8BAA2B,QAAQ;;EAGrC,MAAM,+BAA+B;AACnC,6BAA0B;GAE1B,MAAM,YAAY,UAAiB;AACjC,QAAI,CAAC,WAAW,MACd;IAGF,MAAM,eAAe,iBAAiB;IACtC,MAAM,SAAS,MAAM;IACrB,MAAM,kBACJ,kBAAkB,WAClB,QAAQ,OAAO,QAAQ,qDAAqD,CAAC;AAE/E,QACE,CAAC,gBACD,EAAE,kBAAkB,SACpB,aAAa,SAAS,OAAO,IAC5B,UAAU,SAAS,gBAEpB;AAGG,sBAAkB;AACvB,cAAU,QAAQ;AAClB,qBAAiB,KAAK;;AAGxB,8BAA2B,QAAQ;AACnC,YAAS,iBAAiB,eAAe,UAAU,KAAK;AACxD,YAAS,iBAAiB,aAAa,UAAU,KAAK;AACtD,YAAS,iBAAiB,cAAc,UAAU,KAAK;;EAGzD,MAAM,kBAAkB,UACtB,UAAU,aAAa,UAAU,eAAe,UAAU,eAAe,UAAU;EAErF,MAAM,wBAAwB,UAC5B,MAAM,IAAI,WAAW,KACrB,MAAM,QAAQ,eACd,MAAM,QAAQ,YACd,MAAM,QAAQ,WACd,MAAM,QAAQ;EAEhB,MAAM,qBAAqB,UAAyB;AAClD,OAAI,CAAC,WAAW,SAAS,MAAM,eAAe,MAAM,WAAW,MAAM,WAAW,MAAM,OACpF,QAAO;GAGT,MAAM,eAAe,iBAAiB;AACtC,OAAI,CAAC,aACH,QAAO;AAGT,OAAI,UAAU,MACZ,QAAO;GAGT,MAAM,SAAS,MAAM;AACrB,OAAI,kBAAkB,QAAQ,aAAa,SAAS,OAAO,CACzD,QAAO;GAGT,MAAM,gBAAgB,SAAS;AAC/B,UACE,kBAAkB,QAClB,kBAAkB,SAAS,QAC3B,kBAAkB,SAAS,mBAC1B,yBAAyB,QAAQ,aAAa,SAAS,cAAc;;EAI1E,MAAM,8BAA8B,WAA+B;AACjE,OAAI,CAAC,WAAW,OAAO;AACrB,cAAU,QAAQ;AAClB;;GAIF,MAAM,OADS,yBAAyB,EACnB,WAAW;AAChC,OAAI,QAAQ,kBAAkB,QAAQ,KAAK,SAAS,OAAO,EAAE;AAC3D,cAAU,QAAQ;AAClB;;GAGF,MAAM,eAAe,iBAAiB;AACtC,OAAI,gBAAgB,kBAAkB,QAAQ,aAAa,SAAS,OAAO,CACzE,WAAU,QAAQ;;EAItB,MAAM,+BAA+B;AACnC,OAAI,CAAC,iBAAiB,MACpB;AAGF,YAAS,oBAAoB,WAAW,iBAAiB,OAAO,KAAK;AACrE,oBAAiB,QAAQ;;EAG3B,MAAM,6BAA6B;AACjC,2BAAwB;GAExB,MAAM,WAAW,OAAO,UAAyB;AAC/C,QAAI,CAAC,kBAAkB,MAAM,CAC3B;AAGF,QAAI,eAAe,MAAM,IAAI,EAAE;AAC7B,SAAI,yBAAyB,CAC3B;AAGF,WAAM,gBAAgB;AACtB,WAAM,iBAAiB;KAEvB,MAAM,aAAa,sBAAsB,MAAM,IAAI;AACnD,SAAI,CAAC,WACH;AAGF,WAAM,kBAAkB;AACxB,sBAAiB,WAAW;AAC5B,WAAM,UAAU;AAChB,+BAA0B;AAC1B;;AAGF,QAAI,yBAAyB,CAC3B;AAGF,QAAI,CAAC,qBAAqB,MAAM,IAAI,UAAU,MAC5C;IAGF,MAAM,SAAS,yBAAyB;AACxC,QAAI,CAAC,OACH;AAGF,UAAM,gBAAgB;AAEtB,QADgB,MAAM,OAAO,gBAAgB,MAAM,CAEjD,WAAU,QAAQ;;AAItB,oBAAiB,QAAQ;AACzB,YAAS,iBAAiB,WAAW,UAAU,KAAK;;EAGtD,MAAM,kCAAkC;AACtC,OAAI,CAAC,sBAAsB,MACzB;AAGF,YAAS,oBAAoB,WAAW,sBAAsB,OAAO,KAAK;AAC1E,yBAAsB,QAAQ;;EAGhC,MAAM,gCAAgC;AACpC,8BAA2B;GAE3B,MAAM,YAAY,UAAsB;AACtC,+BAA2B,MAAM,OAAO;;AAG1C,yBAAsB,QAAQ;AAC9B,YAAS,iBAAiB,WAAW,UAAU,KAAK;;EAGtD,MAAM,4BAA4B,UAAqC;GACrE,MAAM,aAAa;AACnB,OAAI,OAAO,WAAW,YAAY,YAAY,OAAO,WAAW,YAAY,SAC1E,QAAO;IAAE,GAAG,WAAW;IAAS,GAAG,WAAW;IAAS;AAGzD,OAAI,OAAO,eAAe,eAAe,iBAAiB,WACxD,QAAO;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;IAAS;AAG/C,OAAI,OAAO,eAAe,eAAe,iBAAiB,YAAY;IACpE,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,eAAe;AACvD,WAAO,QACH;KACE,GAAG,MAAM;KACT,GAAG,MAAM;KACV,GACD;;AAGN,UAAO;;EAGT,MAAM,8BAA8B,UAAqC;GACvE,MAAM,SAAS,MAAM;AACrB,OAAI,EAAE,kBAAkB,SACtB,QAAO;GAGT,MAAM,aAAa,OAAO,QAAQ,oBAAoB;AACtD,UAAO,sBAAsB,cAAc,aAAa;;EAG1D,MAAM,yBAAyB,YAAyB,YAA6B;GACnF,MAAM,OAAO,WAAW,uBAAuB;AAC/C,OAAI,KAAK,SAAS,EAChB,QAAO;GAGT,MAAM,eAAe,KAAK,IAAI,0BAA0B,KAAK,QAAQ,EAAE;AACvE,UAAO,UAAU,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,WAAW;;EAGxE,MAAM,gDAAgD;AACpD,2CAAwC;GAExC,MAAM,iBAAiB;AACrB,8BAA0B;;AAG5B,iCAA8B,QAAQ;AACtC,YAAS,iBAAiB,aAAa,SAAS;AAChD,YAAS,iBAAiB,WAAW,SAAS;AAC9C,YAAS,iBAAiB,YAAY,SAAS;AAC/C,YAAS,iBAAiB,eAAe,SAAS;AAClD,YAAS,iBAAiB,WAAW,SAAS;;EAGhD,MAAM,yBAAyB,cAA2B;AACxD,4BAAyB;GAEzB,MAAM,YAAY,UAAiB;IACjC,MAAM,QAAQ,yBAAyB,MAAM;IAC7C,MAAM,aAAa,2BAA2B,MAAM;AAIpD,QAAI,EAFF,UAAU,QAAQ,eAAe,QAAQ,sBAAsB,YAAY,MAAM,EAAE,GAE9D;AACrB,SAAI,CAAC,iBAAiB,SAAS,sBAAsB,MACnD,2BAA0B;AAE5B;;AAGF,0BAAsB,QAAQ;AAC9B,0BAAsB,KAAK;AAC3B,mBAAe,OAAO,SAAS,YAAY,KAAK;AAChD,6CAAyC;;AAG3C,8BAA2B,QAAQ;AACnC,mCAAgC,QAAQ;AACxC,aAAU,iBAAiB,eAAe,UAAU,KAAK;AACzD,aAAU,iBAAiB,aAAa,UAAU,KAAK;AACvD,aAAU,iBAAiB,cAAc,UAAU,KAAK;;EAG1D,MAAM,yBAAyB,UAAkC;GAC/D,MAAM,YAAY,GAAG,EAAE,6BAA6B;GACpD,MAAM,aAAa,GAAG,EAAE,8BAA8B;GACtD,MAAM,eAAe,iBAAiB;AACtC,OAAI,aACF,cACG,iBAA8B,uCAAuC,CACrE,SAAS,SAAS;AACjB,SAAK,UAAU,OAAO,WAAW,WAAW;KAC5C;AAEN,OAAI,CAAC,OAAO;AACV,kCAA8B,QAAQ;AACtC,oCAAgC,QAAQ;AACxC,4BAAwB,QAAQ;AAChC;;AAEF,iCAA8B,QAAQ,MAAM;AAC5C,mCAAgC,QAAQ,MAAM;AAC9C,2BAAwB,QAAQ,MAAM;AACtC,OAAI,CAAC,aACH;GAEF,MAAM,iBAAiB,MAAM,SAAS,SAAS,YAAY;AACvC,SAAM,KACxB,aAAa,iBAA8B,8CAA8C,CAC1F,CAC8B,MAAM,qBACzB,UAAU,IAAI,eAAe;GAEzC,MAAM,WAAW,MAAM,KACrB,aAAa,iBAA8B,mCAAmC,CAC/E;AACD,QAAK,MAAM,OAAO,SACE,OAAM,KAAK,IAAI,iBAA8B,oBAAoB,CAAC,CAC1E,MAAM,qBAAqB,UAAU,IAAI,eAAe;;EAItE,MAAM,uCACJ,OACA,eAC2B;GAE3B,MAAM,YADe,iBAAiB,EACN,cAAc,qCAAqC;AACnF,OAAI,EAAE,qBAAqB,aACzB,QAAO;GAGT,MAAM,gBAAgB,UAAU,uBAAuB;AACvD,OACE,MAAM,IAAI,cAAc,QACxB,MAAM,IAAI,cAAc,SACxB,MAAM,IAAI,cAAc,OACxB,MAAM,IAAI,cAAc,OAExB,QAAO;GAGT,MAAM,QAAQ,MAAM,KAAK,UAAU,iBAA8B,oBAAoB,CAAC;AACtF,OAAI,MAAM,WAAW,EACnB,QAAO;GAGT,IAAI,qBAAqB,MAAM,SAAS;AACxC,QAAK,IAAI,UAAQ,GAAG,UAAQ,MAAM,QAAQ,WAAS,GAAG;IACpD,MAAM,OAAO,MAAM,SAAO,uBAAuB;AACjD,QAAI,MAAM,KAAK,KAAK,OAAO;AACzB,0BAAqB;AACrB;;;GAIJ,MAAM,iBAAiB,MAAM,qBAAqB,uBAAuB;AACzE,OAAI,CAAC,eACH,QAAO;GAGT,MAAM,gBAAgB,eAAe,OAAO,eAAe,QAAQ;GACnE,MAAM,OAAgC,MAAM,IAAI,gBAAgB,SAAS;GAEzE,IAAI,mBAAmB,sBAAsB,SAAS,UAAU,IAAI;AACpE,OAAI,eAAa,QAAQ,mBAAmB,WAC1C,qBAAoB;GAEtB,MAAM,WAAW,MAAM,SAAS;AAChC,UAAO;IACL,kBAAkB,KAAK,IAAI,KAAK,IAAI,kBAAkB,EAAE,EAAE,SAAS;IACnE;IACA;IACD;;EAGH,MAAM,kCAAkC,eAA4B;AAClE,OAAI,8BAA8B,OAAO;AACvC,aAAS,oBAAoB,YAAY,8BAA8B,MAAM;AAC7E,aAAS,oBAAoB,eAAe,8BAA8B,MAAM;AAChF,aAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,aAAS,oBAAoB,aAAa,8BAA8B,MAAM;;GAGhF,MAAM,YAAY,UAAiB;IACjC,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,QAAI,CAAC,MACH;AAGF,0BAAsB,oCAAoC,OAAO,WAAS,CAAC;;AAG7E,iCAA8B,QAAQ;AACtC,YAAS,iBAAiB,YAAY,SAAS;AAC/C,YAAS,iBAAiB,eAAe,SAAS;AAClD,YAAS,iBAAiB,aAAa,SAAS;AAChD,YAAS,iBAAiB,aAAa,SAAS;;EAGlD,MAAM,wBAAwB;AAC5B,uBAAoB;AAEpB,OAAI,CAAC,MAAM,aACT;GAIF,MAAM,OADe,iBAAiB,EACX,cAAc,gCAAgC;AAEzE,OAAI,EAAE,gBAAgB,aACpB;AAGF,eAAY,QAAQ,qBAAS,OAAO,MAAM;IACxC,WAAW;IACX,WAAW;IACX,QAAQ,IAAI,GAAG,EAAE,gBAAgB;IACjC,UAAU,UAAyB;KACjC,MAAM,aAAW,gBAAgB,MAAM,SAAS;AAOhD,UAAK,kBANyB;MAC5B,UAAA;MACA,UAAU;MACV,KAAK,eAAa,OAAO,OAAQ,WAAW,MAAM,eAAa;MAChE,CAE8B;;IAEjC,QAAQ,UAAyB;KAC/B,MAAM,aAAW,gBAAgB,MAAM,SAAS;KAChD,MAAM,aAAW,gBAAgB,MAAM,SAAS;KAChD,MAAM,MAAM,eAAa,OAAO,OAAQ,WAAW,MAAM,eAAa;AAOtE,UAAK,gBANyB;MAC5B,UAAA;MACA,UAAA;MACA;MACD,CAE4B;AAE7B,SAAI,OAAO,eAAa,QAAQ,eAAa,QAAQ,eAAa,WAOhE,MAAK,oBANqC;MACxC,UAAA;MACA,UAAA;MACA;MACA,MAAM,YAAY,WAAW,OAAO,YAAU,WAAS;MACxD,CACqC;;IAG3C,CAAC;;EAGJ,MAAM,2BAA2B;AAC/B,0BAAuB;AAEvB,OAAI,CAAC,MAAM,gBACT;GAIF,MAAM,YADe,iBAAiB,EACN,cAAc,qCAAqC;AAEnF,OAAI,EAAE,qBAAqB,aACzB;AAGF,0BAAuB,UAAU;AAEjC,kBAAe,QAAQ,qBAAS,OAAO,WAAW;IAChD,WAAW;IACX,WAAW;IACX,MAAM;IACN,UAAU,UAAyB;AACjC,SAAI,sBAAsB,MACxB;KAGF,MAAM,aAAW,gBAAgB,MAAM,SAAS;AAChD,sBAAiB,QAAQ;AACzB,mCAA8B,QAAQ;AACtC,2BAAsB,KAAK;AAC3B,oCAA+B,WAAS;KACxC,MAAM,QAAQ,mBAAmB,YAAY,cAAY,MAAM,EAAE;AACjE,qBAAgB,QAAQ;KACxB,MAAM,cAAc,mBAAmB,MAAM;AAO7C,UAAK,qBAN4B;MAC/B,UAAA;MACA,UAAU;MACV,aAAa,eAAa,OAAO,OAAQ,YAAY,eAAa;MACnE,CAEiC;;IAEpC,QAAQ,UAAyB;AAC/B,SAAI,sBAAsB,OAAO;AAC/B,gCAA0B;AAC1B;;AAGF,SAAI,8BAA8B,OAAO;AACvC,eAAS,oBAAoB,YAAY,8BAA8B,MAAM;AAC7E,eAAS,oBAAoB,eAAe,8BAA8B,MAAM;AAChF,eAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,eAAS,oBAAoB,aAAa,8BAA8B,MAAM;AAC9E,oCAA8B,QAAQ;;KAExC,MAAM,aAAW,gBAAgB,MAAM,SAAS,IAAI,8BAA8B;KAClF,MAAM,mBAAmB,gBAAgB,MAAM,SAAS;KACxD,MAAM,gBAAiB,MAAoC;KAC3D,MAAM,QAAQ,gBAAgB,yBAAyB,cAAc,GAAG;KAKxE,MAAM,cAHJ,UAAU,OACN,OACA,oCAAoC,OAAO,8BAA8B,MAAM,GAErE,oBAAoB,8BAA8B,SAAS;KAC3E,MAAM,eAAe,KAAK,IAAI,cAAY,IAAI,cAAY,GAAG;KAC7D,MAAM,kBAAkB,iBAAiB,EAAE,cAAc,qCAAqC;KAQ9F,MAAM,cAAc,mBAPN,KAAK,IACjB,gBAAgB,SAAS,GACzB,mBACE,2BAA2B,cAAc,kBAAkB,WAC3D,eAAe,EAChB,CACF,CAC4C;AAQ7C,UAAK,mBAN4B;MAC/B,UAAA;MACA,UAAA;MACA,aAJkB,eAAa,OAAO,OAAQ,YAAY,eAAa;MAKxE,CAE+B;AAEhC,SAAI,eAAa,QAAQ,eAAa,QAAQ,eAAa,YAAU;MACnE,MAAM,YAAY,mBAAmB,aAAa,YAAU,WAAS;MACrE,MAAM,yBAAyB,YAAY,eAAa;AACxD,kBAAY,QAAQ;AASpB,WAAK,uBAPwC;OAC3C,UAAA;OACA,UAAA;OACA,aAAa;OACb,OAAO;OACR,CAEwC;AAEpC,qBAAe;OAElB,MAAM,oBADe,iBAAiB,EACA,cAAc,qCAAqC;AACzF,WAAI,6BAA2B,YAC7B,wBAAuB,kBAAgB;QAEzC;;AAGJ,sBAAiB,QAAQ;AACzB,qBAAgB,QAAQ;AACxB,mCAA8B,QAAQ;AACtC,2BAAsB,KAAK;;IAE9B,CAAC;AAEF,yBAAsB,UAAU;;EAGlC,MAAM,mBAAmB,YAAY;AACnC,SAAM,UAAU;AAChB,oBAAiB;AACjB,uBAAoB;;EAGtB,MAAM,mBAAmB,gBAAgB;GACvC,GAAG,eAAe;GAClB,OAAO,CAAC,GAAG,GAAG,EAAE,SAAS,QAAQ,CAAC;GAClC,MAAM,UAAU;GAChB,QAAQ,mBAAmB,MAAM,SAAS;GAC1C,QAAQ,mBAAmB,MAAM,SAAS;GAC1C,qBAAqB,mBAAmB,MAAM,uBAAuB,wBAAwB;GAC7F,oBAAoB,2BAA2B;GAC/C,eAAe,sBAAsB;GACrC,qBAAqB,4BAA4B;GACjD,aAAa;GACb,YAAY;GACZ,UAAU;GACV,aAAa;GACd,EAAE;AAEH,QAAM,uBAAuB,MAAM,SAAS;AAC1C,OAAI,SAAS,KAAA,KAAa,SAAS,MAAM;AACvC,mBAAe,YAAY;AACtB,sBAAkB;AACvB,cAAU,QAAQ;AAClB,qBAAiB,KAAK;AACtB,gCAA4B,KAAK;;IAEnC;AAEF,cACQ,CAAC,WAAW,MAAM,QAAQ,MAAM,YAAY,QAC5C;AACJ,kBAAe,YAAY;AAC3B,OAAI,CAAC,WAAW,OAAO;AACrB,gCAA4B,KAAK;AACjC;;AAMF,OAAI,CAHiB,WAAW,MAAM,MACnC,QAAQ,WAAW,IAAI,KAAK,WAAW,OAAO,OAChD,EACkB;AACZ,sBAAkB;AACvB,cAAU,QAAQ;AAClB,qBAAiB,KAAK;;AAGxB,+BAA4B,KAAK;IAEpC;AAED,QACE,kBACM;AACJ,kBAAe,YAAY;AAC3B,+BAA4B,KAAK;KAEnC,EAAE,OAAO,QAAQ,CAClB;AAED,cACQ,MAAM,sBACN;AACJ,gCAA6B;KAE/B,EAAE,OAAO,QAAQ,CAClB;AAED,QAAM,aAAa,mBAAmB;AACpC,OAAI,CAAC,eACH,WAAU,QAAQ;IAEpB;AAEF,kBAAgB;AACd,2BAAwB;AACxB,2BAAwB;AACxB,yBAAsB;AACtB,4BAAyB;AACzB,+BAA4B,KAAK;AAC5B,qBAAkB;IACvB;AAEF,cACQ;GACJ,MAAM;GACN,MAAM;GACN,MAAM;GACN,WAAW,MAAM;GAClB,QACK;AACC,qBAAkB;KAEzB,EAAE,OAAO,QAAQ,CAClB;AAED,wBAAsB;AACpB,2BAAwB;AACxB,6BAA0B;AAC1B,6BAA0B;AAC1B,2BAAwB;AACxB,8BAA2B;AAC3B,uBAAoB;AACpB,0BAAuB;IACvB;AAEF,WAAa,EAAE,CAAkB;;uBAj3D/B,YAAqF,wBAArE,EAAE,MAAA,QAAO,EAAA;IAAA,GAAO,iBAAA;IAAgB,KAAO;IAAW,EAAI,WAAA,MAAU,CAAA,CAAA;;;;;;;QEElD;EAC9B,MAAM;GACJ,MAAM;GACN,UAAU;GACX;EACD,WAAW;GACT,MAAM;GACN,SAAS,KAAA;GACV;EACD,UAAU;GACR,MAAM;GACN,SAAS;GACV;EACF;;ECCD,MAAM,QAAQ;EACd,MAAM,UAAU,IAAwB,KAAK;EAE7C,MAAM,eACJ,YACsD;AACtD,OAAI,CAAC,QACH,QAAO;AAGT,OAAI,EAAE,mBAAmB,oBAAoB,mBAAmB,qBAC9D,QAAO;AAGT,UAAO,QAAQ,SAAS,YAAY,CAAC,QAAQ,YAAY,CAAC,QAAQ;;EAGpE,MAAM,2BAA8C,MAAM,WAAW,SAAS;EAE9E,MAAM,yBAAyB,WAAkD;AAC/E,OAAI,kBAAkB,YACpB,QAAO;GAGT,MAAM,kBAAkB;AACxB,OAAI,iBAAiB,eAAe,YAClC,QAAO,gBAAgB;AAGzB,UAAO;;EAGT,MAAM,sBACJ,sBAAsB,oBAAoB,CAAC,IAAI,QAAQ;EAEzD,MAAM,4BAA4B,SAA6B;AAC7D,OAAI,CAAC,KACH,QAAO;AAGT,OAAI,YAAY,KAAK,CACnB,QAAO;AAGT,UAAO,KAAK,cACV,yGACD;;EAGH,MAAM,0BAA0B,SAAiD;AAC/E,OAAI,CAAC,KACH,QAAO;AAGT,OAAI,KAAK,YAAY,EACnB,QAAO;AAGT,UAAO,KAAK,cACV;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,IAAI,CACZ;;EAGH,MAAM,qBACJ,SACyC;GACzC,MAAM,SAAS,oBAAoB;AACnC,OAAI,CAAC,UAAU,kBAAkB,YAC/B,QAAO;GAGT,MAAM,YAAa,OAA6D;AAChF,UAAO,OAAO,cAAc,aAAc,YAA4C;;EAGxF,MAAM,sBAAsB,SAAiC;GAC3D,MAAM,SAAS,oBAAoB;AACnC,OAAI,CAAC,UAAU,kBAAkB,YAC/B,QAAO;GAGT,MAAM,YAAa,OAA6D;AAChF,OAAI,OAAO,cAAc,UACvB,QAAO;AAGT,OACE,OAAO,cAAc,YACrB,cAAc,QACd,WAAW,aACX,OAAQ,UAAkC,UAAU,UAEpD,QAAQ,UAAiC;AAG3C,UAAO;;EAGT,MAAM,sBAAsB,SAA6B;AACvD,OAAI,CAAC,KACH,QAAO;AAGT,OAAI,KAAK,aAAa,gBAAgB,KAAK,OACzC,QAAO;AAGT,UACE,KAAK,cACH,iFACD,KAAK;;EAIV,MAAM,0BAA0B,WAA0B;GACxD,KAAK,MAAM;GACX,MAAM,MAAM;GACZ,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,SAAS;GACT,YAAY;GACZ,UAAU;GACX;EAED,MAAM,yBAAyB,QAAqB,UAClD,OAAO,cAAc,IAAI,cAAc,WAAW,uBAAuB,MAAM,CAAC,CAAC;EAEnF,MAAM,6BACJ,IAAI,SAAe,YAAY;AAC7B,UAAO,WAAW,SAAS,EAAE;IAC7B;EAEJ,MAAM,uBACJ,QACA,WACA,SACG;AACH,UAAO,cACL,IAAI,WAAW,SAAS;IACtB,SAAS;IACT;IACA;IACD,CAAC,CACH;AACD,UAAO,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,MAAM,CAAC,CAAC;;EAG7D,MAAM,cAAc,QAAgD,SAAiB;GACnF,MAAM,QAAQ,OAAO,kBAAkB,OAAO,MAAM;GACpD,MAAM,MAAM,OAAO,gBAAgB,OAAO,MAAM;AAEhD,UAAO,aAAa,MAAM,OAAO,KAAK,MAAM;AAC5C,uBAAoB,QAAQ,cAAc,KAAK;;EAGjD,MAAM,cACJ,QACA,cACG;GACH,MAAM,QAAQ,OAAO,kBAAkB,OAAO,MAAM;GACpD,MAAM,MAAM,OAAO,gBAAgB,OAAO,MAAM;AAEhD,OAAI,UAAU,IACZ,QAAO,aAAa,IAAI,OAAO,KAAK,QAAQ;YACnC,cAAc,cAAc,QAAQ,EAC7C,QAAO,aAAa,IAAI,QAAQ,GAAG,OAAO,QAAQ;YACzC,cAAc,aAAa,MAAM,OAAO,MAAM,OACvD,QAAO,aAAa,IAAI,OAAO,QAAQ,GAAG,QAAQ;AAGpD,uBACE,QACA,cAAc,aAAa,0BAA0B,wBACrD,KACD;;EAGH,MAAM,wBAAwB;GAC5B,MAAM,QAAQ,yBAAyB,eAAe,CAAC;AACvD,UAAO,OAAO;AACd,UAAO;;EAGT,MAAM,wBAAwB,YAAY;GACxC,MAAM,gBAAgB,kBAAsB,QAAQ;AACpD,OAAI,cACF,OAAM,QAAQ,QAAQ,eAAe,CAAC;GAGxC,MAAM,cAAc,uBAAuB,eAAe,CAAC;AAC3D,gBAAa,OAAO;AACpB,UAAO;;EAGT,MAAM,cAAc,YAAY;AAC9B,OAAI,MAAM,SAAS,QAAQ;AACzB,qBAAiB;AACjB;;AAGF,SAAM,uBAAuB;;EAG/B,MAAM,aAAa,YAAY;GAC7B,MAAM,gBAAgB,SAAS;GAC/B,MAAM,OAAO,eAAe;AAE5B,OAAI,yBAAyB,eAAe,MAAM,SAAS,cAAc,CACvE,eAAc,MAAM;GAGtB,MAAM,eAAe,kBAAsB,OAAO;AAClD,OAAI,aACF,OAAM,QAAQ,QAAQ,cAAc,CAAC;;EAIzC,MAAM,aAAa,YAAY;GAC7B,MAAM,aAAa,kBAAsB,aAAa;AACtD,OAAI,YAAY;AACd,UAAM,QAAQ,QAAQ,YAAY,CAAC;AACnC;;GAGF,MAAM,cAAc,uBAAuB,eAAe,CAAC;AAC3D,OAAI,CAAC,YACH;AAGF,eAAY,cAAc,IAAI,WAAW,aAAa;IAAE,SAAS;IAAM,YAAY;IAAM,CAAC,CAAC;AAC3F,eAAY,OAAO;;EAGrB,MAAM,cAAc,YAAY;GAC9B,MAAM,cAAc,kBAAsB,cAAc;AACxD,OAAI,aAAa;AACf,UAAM,QAAQ,QAAQ,aAAa,CAAC;AACpC;;GAGF,MAAM,cAAc,uBAAuB,eAAe,CAAC;AAC3D,OAAI,YACF,aAAY,cACV,IAAI,cAAc,WAAW;IAC3B,KAAK;IACL,MAAM;IACN,SAAS;IACT,YAAY;IACb,CAAC,CACH;;EAIL,MAAM,oBAAoB;GACxB,MAAM,gBAAgB,kBAAsB,cAAc;AAC1D,OAAI,cACF,QAAO,QAAQ,eAAe,CAAC;AAGjC,QAAK,MAAM,OAAO;IAAC;IAAY;IAAiB;IAAuB;IAAU,EAAE;IACjF,MAAM,QAAQ,mBAAmB,IAAI;AACrC,QAAI,UAAU,KACZ,QAAO;;AAIX,UAAO,mBAAmB,eAAe,CAAC;;EAG5C,MAAM,iBAAiB,OAAO,UAAyB;GACrD,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,CAAC,MACH,QAAO;AAGT,yBAAsB,OAAO,MAAM;AAEnC,OAAI,MAAM,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,WAAW,CAAC,MAAM,QAAQ;AAC/E,eAAW,OAAO,MAAM,IAAI;AAC5B,WAAO;;AAGT,OAAI,MAAM,QAAQ,aAAa;AAC7B,eAAW,OAAO,WAAW;AAC7B,WAAO;;AAGT,OAAI,MAAM,QAAQ,UAAU;AAC1B,eAAW,OAAO,UAAU;AAC5B,WAAO;;AAGT,OAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KACzC,QAAO;AAGT,UAAO;;EAGT,MAAM,uBAAuB,OAAO,UAAyB;GAC3D,MAAM,cAAc,MAAM,uBAAuB;AACjD,SAAM,YAAY;AAClB,SAAM,UAAU;AAChB,SAAM,sBAAsB;AAG5B,OADc,yBAAyB,eAAe,CAAC,CAErD,QAAO,eAAe,MAAM;GAG9B,MAAM,SAAU,SAAS,iBAAwC;AACjE,OAAI,CAAC,OACH,QAAO;AAGT,yBAAsB,QAAQ,MAAM;AACpC,UAAO;;EAGT,MAAM,WAAgC;GACpC,IAAI,OAAO,eAAe;GAC1B,iBAAiB,eAAe;GAChC,aAAa,aAAa;GAC1B,YAAY,YAAY;GACxB,kBAAkB,UAChB,MAAM,SAAS,SAAS,eAAe,MAAM,GAAG,qBAAqB,MAAM;GAC7E,mBAAoB,MAAM,SAAS,eAAe,aAAa,GAAG;GAClE,YAAY,YAAY;GACxB,aAAa,aAAa;GAC1B,IAAI,eAAe;AACjB,WAAO,QAAQ,eAAe,EAAE,QAAQ,2CAA2C,CAAC;;GAEtF,UAAU,MAAM;GACjB;EAED,IAAI,aAAkC;EAEtC,MAAM,kBAAkB,YAAiD;AACvE,QAAK,IAAI,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;IAC/C,MAAM,YAAY,eAAe,EAAE,QAAQ,YAAY;AAIvD,QAAI,YAAY,2BACd,QAAO,UAAU,8BAA8B;AAGjD,UAAM,UAAU;;AAGlB,UAAO;;AAGT,kBAAgB;AACd,IAAM,YAAY;IAChB,MAAM,WAAW,MAAM,iBAAiB;AACxC,QAAI,CAAC,SACH;AAGF,iBAAa,SAAS,SAAS,SAAS;OACtC;IACJ;AAEF,wBAAsB;AACpB,iBAAc;AACd,gBAAa;IACb;;uBA5YA,mBAEO,QAAA;aAFG;IAAJ,KAAI;IAAU,OAAA,EAAA,WAAA,YAAyB;OAC3C,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,IAAA;;;;AEGZ,MAAaC,UAAwC,YAAY,cAAM;AACvE,MAAaC,gBAAoD,YAAY,qBAAY"}