@atlashub/smartstack 3.29.0 → 3.30.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 (320) hide show
  1. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
  58. package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
  60. package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
  62. package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
  64. package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
  86. package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
  88. package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
  122. package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
  130. package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
  132. package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
  146. package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
  148. package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
  162. package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
  164. package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
  174. package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
  176. package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
  178. package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
  179. package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
  180. package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
  181. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
  186. package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
  188. package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
  198. package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
  200. package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
  206. package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
  207. package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
  208. package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
  213. package/dist/chunks/auth-Ca2Rn6on.js +2 -0
  214. package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
  215. package/dist/chunks/auth-ClNTDOqm.js +18 -0
  216. package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
  217. package/dist/chunks/auth-DECnMZjF.js +18 -0
  218. package/dist/chunks/auth-DECnMZjF.js.map +1 -0
  219. package/dist/chunks/auth-DPvxdqy4.js +18 -0
  220. package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
  221. package/dist/chunks/auth-HzvnTaOm.js +2 -0
  222. package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
  223. package/dist/chunks/auth-M6aNTKCH.js +2 -0
  224. package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
  225. package/dist/chunks/auth-UHnAu6_e.js +2 -0
  226. package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
  227. package/dist/chunks/auth-YrujJY7m.js +18 -0
  228. package/dist/chunks/auth-YrujJY7m.js.map +1 -0
  229. package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
  230. package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
  231. package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
  232. package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
  233. package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
  234. package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
  235. package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
  236. package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
  237. package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
  238. package/dist/chunks/index-CN2WRyg1.js.map +1 -0
  239. package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
  240. package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
  241. package/dist/chunks/index-CUICSveU.js +2 -0
  242. package/dist/chunks/index-CUICSveU.js.map +1 -0
  243. package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
  244. package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
  245. package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
  246. package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
  247. package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
  248. package/dist/chunks/index-DEtq-xUL.js.map +1 -0
  249. package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
  250. package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
  251. package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
  252. package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
  253. package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
  254. package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
  255. package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
  256. package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
  257. package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
  258. package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
  259. package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
  260. package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
  261. package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
  262. package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
  263. package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
  264. package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
  265. package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
  266. package/dist/chunks/index-cAikSVW0.js.map +1 -0
  267. package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
  268. package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
  269. package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
  270. package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
  271. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
  272. package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
  273. package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
  274. package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
  275. package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
  276. package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
  277. package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
  278. package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
  279. package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
  280. package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
  281. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
  282. package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
  283. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
  284. package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
  285. package/dist/contexts/AuthContext.d.ts.map +1 -1
  286. package/dist/pages/LoginPage.d.ts.map +1 -1
  287. package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
  288. package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
  289. package/dist/services/api/apiClient.d.ts.map +1 -1
  290. package/dist/services/support/ticketDraftService.d.ts.map +1 -1
  291. package/dist/smartstack.cjs +1 -1
  292. package/dist/smartstack.js +6 -6
  293. package/dist/utils/permissions.generated.d.ts +288 -0
  294. package/dist/utils/permissions.generated.d.ts.map +1 -0
  295. package/dist/utils/uuid.d.ts +6 -0
  296. package/dist/utils/uuid.d.ts.map +1 -0
  297. package/package.json +1 -1
  298. package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
  299. package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
  300. package/dist/chunks/auth-B-hELPDB.js +0 -2
  301. package/dist/chunks/auth-B-hELPDB.js.map +0 -1
  302. package/dist/chunks/auth-BYaMuq7D.js +0 -16
  303. package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
  304. package/dist/chunks/auth-C5zpZ9k7.js +0 -2
  305. package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
  306. package/dist/chunks/auth-CDpRMVv1.js +0 -16
  307. package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
  308. package/dist/chunks/auth-CyPkCta2.js +0 -2
  309. package/dist/chunks/auth-CyPkCta2.js.map +0 -1
  310. package/dist/chunks/auth-DL47kvnl.js +0 -2
  311. package/dist/chunks/auth-DL47kvnl.js.map +0 -1
  312. package/dist/chunks/auth-Diiv90i1.js +0 -16
  313. package/dist/chunks/auth-Diiv90i1.js.map +0 -1
  314. package/dist/chunks/auth-rog9MvUr.js +0 -16
  315. package/dist/chunks/auth-rog9MvUr.js.map +0 -1
  316. package/dist/chunks/index-BIqcvvbh.js.map +0 -1
  317. package/dist/chunks/index-DA5VyW0k.js.map +0 -1
  318. package/dist/chunks/index-Dht6EQW1.js +0 -2
  319. package/dist/chunks/index-Dht6EQW1.js.map +0 -1
  320. package/dist/chunks/index-vXiLh35n.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DEtq-xUL.js","sources":["../../src/hooks/useTenantFilters.ts","../../src/pages/platform/administration/tenants/TenantsPage.tsx","../../src/hooks/useTenantDetail.ts","../../src/hooks/useTenantMembers.ts","../../src/hooks/useTenantGroups.ts","../../src/hooks/useTenantApplications.ts","../../src/hooks/useTenantOrganisation.ts","../../src/hooks/useTenantRoles.ts","../../src/components/platform/administration/tenants/TenantOverviewTab.tsx","../../src/components/platform/administration/tenants/TenantMembersTab.tsx","../../src/components/platform/administration/tenants/TenantGroupsTab.tsx","../../src/components/platform/administration/tenants/TenantRolesTab.tsx","../../src/components/platform/administration/ApplicationAccessCustomizeDrawer.tsx","../../src/components/platform/administration/tenants/TenantApplicationsTab.tsx","../../src/pages/platform/administration/tenants/TenantDetailPage.tsx","../../src/pages/platform/administration/tenants/TenantCreatePage.tsx","../../src/components/dashboard/TenantActivityPieChart.tsx","../../src/components/dashboard/TenantUsageTrendChart.tsx","../../src/components/dashboard/TenantPopularityChart.tsx","../../src/pages/platform/administration/tenants/TenantsDashboardPage.tsx","../../src/hooks/useTemplateApplications.ts","../../src/pages/platform/administration/tenants/TenantTemplateDetailPage.tsx","../../src/pages/platform/administration/tenants/TenantsTemplatePage.tsx","../../src/pages/platform/administration/tenants/TenantTemplateCreatePage.tsx","../../src/pages/platform/administration/tenants/TenantsBusinessPage.tsx","../../src/pages/platform/administration/tenants/TenantsPersonalPage.tsx","../../src/pages/platform/administration/tenants/TenantsOtherPage.tsx","../../src/pages/platform/administration/tenants/TenantAccessRequestsPage.tsx","../../src/components/platform/administration/TenantEntraTab.tsx","../../src/components/platform/administration/tenants/TenantSupportSettingsTab.tsx","../../src/pages/platform/administration/tenants/TenantSettingsPage.tsx","../../src/pages/platform/administration/tenants/TenantTypeSettingsPage.tsx","../../src/pages/platform/administration/tenants/OrganisationsListPage.tsx","../../src/pages/platform/administration/tenants/OrganisationDetailPage.tsx","../../src/components/platform/administration/organisations/CreateOrganisationForm.tsx","../../src/pages/platform/administration/tenants/OrganisationCreatePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\r\nimport type { TenantStatus, TenantType } from '@/services/api/adminApi';\r\n\r\ninterface FilterState {\r\n search: string;\r\n status: TenantStatus | '';\r\n type: TenantType | '';\r\n}\r\n\r\nconst VALID_STATUSES: TenantStatus[] = ['Pending', 'Active', 'Suspended', 'Archived'];\r\nconst VALID_TYPES: TenantType[] = ['Personal', 'Business', 'System'];\r\n\r\nconst defaultFilters: FilterState = {\r\n search: '',\r\n status: '',\r\n type: 'Business',\r\n};\r\n\r\nexport const validateStatus = (value: string | null): TenantStatus | '' => {\r\n if (!value) return '';\r\n return VALID_STATUSES.includes(value as TenantStatus) ? (value as TenantStatus) : '';\r\n};\r\n\r\nexport const validateType = (value: string | null): TenantType | '' => {\r\n if (!value) return '';\r\n return VALID_TYPES.includes(value as TenantType) ? (value as TenantType) : '';\r\n};\r\n\r\nexport const validatePage = (value: string | null): number => {\r\n const parsed = parseInt(value || '1', 10);\r\n return isNaN(parsed) || parsed < 1 ? 1 : parsed;\r\n};\r\n\r\nexport const getDefaultFilters = (lockedType?: TenantType, excludeTypes?: TenantType[]): FilterState => ({\r\n ...defaultFilters,\r\n type: lockedType || (excludeTypes ? '' as const : 'Business' as const),\r\n});\r\n\r\nexport function useActiveFilterCount(\r\n filters: FilterState,\r\n lockedType?: TenantType,\r\n excludeTypes?: TenantType[]\r\n): number {\r\n return useMemo(() => {\r\n let count = 0;\r\n if (filters.status) count++;\r\n if (!lockedType && !excludeTypes && filters.type) count++;\r\n return count;\r\n }, [filters, lockedType, excludeTypes]);\r\n}\r\n","import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Search,\r\n Edit2,\r\n MoreHorizontal,\r\n Building2,\r\n Users,\r\n Boxes,\r\n PlayCircle,\r\n PauseCircle,\r\n Archive,\r\n Loader2,\r\n Building,\r\n User,\r\n Filter,\r\n RotateCcw,\r\n ChevronDown,\r\n Eye,\r\n AlertCircle,\r\n Layers,\r\n Clock,\r\n ArrowUpDown,\r\n ArrowUp,\r\n ArrowDown,\r\n Server\r\n} from 'lucide-react';\r\nimport { adminApi, type TenantListDto, type TenantStatus, type TenantType } from '@/services/api/adminApi';\r\nimport { useTenantTypeSettings } from '@/hooks/useTenantTypeSettings';\r\nimport { getLucideIcon, getColorClasses } from '@/utils/tenantIconMap';\r\nimport { ViewToggle, StatusBadge, Pagination, type ViewMode } from '@/components/ui/DataView';\r\nimport { EntityCard, type EntityCardAction, type EntityCardTag } from '@/components/ui/EntityCard';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ConfirmModal, type ConfirmVariant } from '@/components/ui/ConfirmModal';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useTenantUrl } from '@/utils/tenantUrl';\r\n\r\n// Debounce hook for search\r\nfunction useDebounce<T>(value: T, delay: number): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n useEffect(() => {\r\n const handler = setTimeout(() => setDebouncedValue(value), delay);\r\n return () => clearTimeout(handler);\r\n }, [value, delay]);\r\n return debouncedValue;\r\n}\r\n\r\n// Status configuration with CSS variables for theme compliance\r\nconst STATUS_CONFIG: Record<TenantStatus, { color: string; bgColor: string; borderColor: string; statusBadge: 'active' | 'inactive' | 'pending' | 'warning' | 'error' }> = {\r\n Pending: {\r\n color: 'text-[var(--info-text)]',\r\n bgColor: 'bg-[var(--info-bg)]',\r\n borderColor: 'border-[var(--info-border)]',\r\n statusBadge: 'pending'\r\n },\r\n Active: {\r\n color: 'text-[var(--success-text)]',\r\n bgColor: 'bg-[var(--success-bg)]',\r\n borderColor: 'border-[var(--success-border)]',\r\n statusBadge: 'active'\r\n },\r\n Suspended: {\r\n color: 'text-[var(--warning-text)]',\r\n bgColor: 'bg-[var(--warning-bg)]',\r\n borderColor: 'border-[var(--warning-border)]',\r\n statusBadge: 'warning'\r\n },\r\n Archived: {\r\n color: 'text-[var(--text-tertiary)]',\r\n bgColor: 'bg-[var(--bg-tertiary)]',\r\n borderColor: 'border-[var(--border-color)]',\r\n statusBadge: 'inactive'\r\n }\r\n};\r\n\r\nconst TYPE_CONFIG: Record<TenantType, { icon: typeof Building2; label: string }> = {\r\n Personal: { icon: User, label: 'tenants.type.personal' },\r\n Business: { icon: Building, label: 'tenants.type.business' },\r\n System: { icon: Server, label: 'tenants.type.system' }\r\n};\r\n\r\nimport {\r\n validateStatus,\r\n validateType,\r\n validatePage,\r\n getDefaultFilters,\r\n useActiveFilterCount,\r\n} from '@/hooks/useTenantFilters';\r\n\r\ninterface FilterState {\r\n search: string;\r\n status: TenantStatus | '';\r\n type: TenantType | '';\r\n}\r\n\r\n// Props interface for the component\r\ninterface TenantsPageProps {\r\n readonly lockedType?: TenantType;\r\n readonly excludeTypes?: TenantType[];\r\n}\r\n\r\nexport function TenantsPage({ lockedType, excludeTypes }: TenantsPageProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const { currentTenant, isGlobalView, refreshTenants } = useTenant();\r\n const buildTenantUrl = useTenantUrl();\r\n const { getIconForType } = useTenantTypeSettings();\r\n\r\n // Initialize filters from URL params (only on mount) - F1: validated\r\n const initialFilters: FilterState = useMemo(\r\n () => ({\r\n search: searchParams.get('search') || '',\r\n status: validateStatus(searchParams.get('status')),\r\n type: lockedType || validateType(searchParams.get('type')) || (excludeTypes ? '' : 'Business')\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n []\r\n );\r\n\r\n const [tenants, setTenants] = useState<TenantListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [filters, setFilters] = useState<FilterState>(initialFilters);\r\n const [showFilters, setShowFilters] = useState(false);\r\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState<string | null>(null);\r\n const [confirmAction, setConfirmAction] = useState<{ tenant: TenantListDto; action: 'activate' | 'suspend' | 'archive' } | null>(null);\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(validatePage(searchParams.get('page')));\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [error, setError] = useState<string | null>(null);\r\n const [sortKey, setSortKey] = useState<string>('name');\r\n const [sortDesc, setSortDesc] = useState(false);\r\n\r\n // Debounce search input\r\n const debouncedSearch = useDebounce(filters.search, 300);\r\n\r\n // Count active filters (exclude lockedType since it's not user-resettable)\r\n const activeFilterCount = useActiveFilterCount(filters, lockedType, excludeTypes);\r\n\r\n const loadTenants = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const result = await adminApi.tenants.getAll({\r\n page,\r\n pageSize: 20,\r\n search: debouncedSearch || undefined,\r\n status: filters.status || undefined,\r\n type: filters.type || undefined,\r\n sortBy: sortKey,\r\n sortDesc,\r\n excludeTypes,\r\n });\r\n setTenants(result.items);\r\n setTotalCount(result.totalCount);\r\n setTotalPages(result.totalPages);\r\n } catch (err) {\r\n console.error('Failed to load tenants:', err);\r\n setError(t('tenants.loadError'));\r\n setTenants([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [page, debouncedSearch, filters.status, filters.type, sortKey, sortDesc, t, currentTenant?.id, isGlobalView, excludeTypes]);\r\n\r\n // Update URL params when filters change\r\n useEffect(() => {\r\n const params = new URLSearchParams();\r\n if (filters.search) params.set('search', filters.search);\r\n if (filters.status) params.set('status', filters.status);\r\n if (filters.type) params.set('type', filters.type);\r\n if (page > 1) params.set('page', page.toString());\r\n setSearchParams(params, { replace: true });\r\n }, [filters, page, setSearchParams]);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n const handleResetFilters = () => {\r\n setFilters(getDefaultFilters(lockedType, excludeTypes));\r\n setPage(1);\r\n };\r\n\r\n const updateFilter = <K extends keyof FilterState>(key: K, value: FilterState[K]) => {\r\n // If lockedType is set and trying to change type, prevent the change\r\n if (lockedType && key === 'type') {\r\n return;\r\n }\r\n setFilters(prev => ({ ...prev, [key]: value }));\r\n setPage(1);\r\n };\r\n\r\n const handleActivate = (tenant: TenantListDto) => {\r\n setMenuOpen(null);\r\n setConfirmAction({ tenant, action: 'activate' });\r\n };\r\n\r\n const handleSuspend = (tenant: TenantListDto) => {\r\n setMenuOpen(null);\r\n setConfirmAction({ tenant, action: 'suspend' });\r\n };\r\n\r\n const handleArchive = (tenant: TenantListDto) => {\r\n setMenuOpen(null);\r\n setConfirmAction({ tenant, action: 'archive' });\r\n };\r\n\r\n const handleConfirmAction = async () => {\r\n if (!confirmAction) return;\r\n const { tenant, action } = confirmAction;\r\n setActionLoading(tenant.id);\r\n try {\r\n if (action === 'activate') await adminApi.tenants.activate(tenant.id);\r\n else if (action === 'suspend') await adminApi.tenants.suspend(tenant.id);\r\n else if (action === 'archive') await adminApi.tenants.archive(tenant.id);\r\n await refreshTenants();\r\n loadTenants();\r\n } catch (err) {\r\n console.error(`Failed to ${action} tenant:`, err);\r\n } finally {\r\n setActionLoading(null);\r\n setConfirmAction(null);\r\n }\r\n };\r\n\r\n const getConfirmModalMessage = (action: 'activate' | 'suspend' | 'archive', tenantName: string): string => {\r\n switch (action) {\r\n case 'activate':\r\n return t('tenants.confirmActivate', { name: tenantName });\r\n case 'suspend':\r\n return t('tenants.confirmSuspend', { name: tenantName });\r\n case 'archive':\r\n return t('tenants.confirmArchive', { name: tenantName });\r\n }\r\n };\r\n\r\n const getConfirmModalLabel = (action: 'activate' | 'suspend' | 'archive'): string => {\r\n switch (action) {\r\n case 'activate':\r\n return t('tenants.actions.activate');\r\n case 'suspend':\r\n return t('tenants.actions.suspend');\r\n case 'archive':\r\n return t('tenants.actions.archive');\r\n }\r\n };\r\n\r\n const getConfirmModalVariant = (action: 'activate' | 'suspend' | 'archive'): ConfirmVariant => {\r\n switch (action) {\r\n case 'activate':\r\n return 'info';\r\n case 'suspend':\r\n return 'warning';\r\n case 'archive':\r\n return 'danger';\r\n }\r\n };\r\n\r\n const getConfirmModalProps = () => {\r\n if (!confirmAction) return null;\r\n const { tenant, action } = confirmAction;\r\n return {\r\n message: getConfirmModalMessage(action, tenant.name),\r\n label: getConfirmModalLabel(action),\r\n variant: getConfirmModalVariant(action),\r\n };\r\n };\r\n\r\n // Stats computed from tenants\r\n const stats = useMemo(() => ({\r\n active: tenants.filter(t => t.status === 'Active').length,\r\n suspended: tenants.filter(t => t.status === 'Suspended').length,\r\n members: tenants.reduce((sum, t) => sum + (t.memberCount ?? 0), 0),\r\n pendingRequests: tenants.reduce((sum, t) => sum + (t.pendingAccessRequestCount ?? 0), 0)\r\n }), [tenants]);\r\n\r\n // Data is already sorted and paginated by the server\r\n const paginatedTenants = tenants;\r\n\r\n const toggleSort = (key: string) => {\r\n if (sortKey === key) {\r\n setSortDesc(!sortDesc);\r\n } else {\r\n setSortKey(key);\r\n setSortDesc(false);\r\n }\r\n setPage(1);\r\n };\r\n\r\n const SortIcon = ({ column }: { column: string }) => {\r\n if (sortKey !== column) return <ArrowUpDown className=\"w-3.5 h-3.5 text-[var(--text-muted)] opacity-0 group-hover/th:opacity-100 transition-opacity\" />;\r\n return sortDesc\r\n ? <ArrowDown className=\"w-3.5 h-3.5 text-[var(--color-accent-500)]\" />\r\n : <ArrowUp className=\"w-3.5 h-3.5 text-[var(--color-accent-500)]\" />;\r\n };\r\n\r\n const getTenantStatusVariant = (status: TenantStatus): 'success' | 'warning' | 'info' | 'default' => {\r\n if (status === 'Active') return 'success';\r\n if (status === 'Suspended') return 'warning';\r\n if (status === 'Pending') return 'info';\r\n return 'default';\r\n };\r\n\r\n const getPageTitle = (): string => {\r\n if (excludeTypes) return t('tenants.other.title');\r\n switch (lockedType) {\r\n case 'Business':\r\n return t('tenants.enterprise.title');\r\n case 'Personal':\r\n return t('tenants.personal.title');\r\n default:\r\n return t('tenants.title');\r\n }\r\n };\r\n\r\n const getPageSubtitle = (): string => {\r\n if (excludeTypes) return t('tenants.other.subtitle');\r\n switch (lockedType) {\r\n case 'Business':\r\n return t('tenants.enterprise.subtitle');\r\n case 'Personal':\r\n return t('tenants.personal.subtitle');\r\n default:\r\n return t('tenants.subtitle');\r\n }\r\n };\r\n\r\n const getPageIcon = () => {\r\n if (excludeTypes) return Server;\r\n switch (lockedType) {\r\n case 'Business':\r\n return Building;\r\n case 'Personal':\r\n return User;\r\n default:\r\n return Building2;\r\n }\r\n };\r\n\r\n const pageTitle = getPageTitle();\r\n const pageSubtitle = getPageSubtitle();\r\n const PageIcon = getPageIcon();\r\n\r\n const hideTypeColumn = !!lockedType || !!excludeTypes;\r\n // Calculate column count dynamically\r\n const columnCount = 5 + (!hideTypeColumn ? 1 : 0) + 1; // name + status + template + members + requests + actions, optionally type\r\n\r\n const renderTableHeader = (columnLabel: string, columnKey: string, hidden: string = '') => (\r\n <th\r\n className={`text-left px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider cursor-pointer select-none group/th hover:text-[var(--text-primary)] transition-colors ${hidden}`}\r\n onClick={() => toggleSort(columnKey)}\r\n >\r\n <span className=\"inline-flex items-center gap-1.5\">\r\n {columnLabel}\r\n <SortIcon column={columnKey} />\r\n </span>\r\n </th>\r\n );\r\n\r\n const renderTableActionsMenu = (tenant: TenantListDto) => (\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()} role=\"presentation\">\r\n <div className=\"relative\">\r\n <button\r\n onClick={() => setMenuOpen(menuOpen === tenant.id ? null : tenant.id)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:bg-[var(--bg-tertiary)] transition-all\"\r\n >\r\n {actionLoading === tenant.id ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <MoreHorizontal className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n\r\n {menuOpen === tenant.id && (\r\n <div className=\"absolute right-0 mt-1 w-48 bg-[var(--bg-card)] border border-[var(--border-color)] shadow-lg z-50\" style={{ borderRadius: 'var(--radius-card)' }}>\r\n <button\r\n onClick={() => {\r\n setMenuOpen(null);\r\n navigate(buildTenantUrl(`/administration/tenants/${tenant.id}`));\r\n }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n {t('tenants.view')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n setMenuOpen(null);\r\n navigate(buildTenantUrl(`/administration/tenants/${tenant.id}`));\r\n }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n setMenuOpen(null);\r\n navigate(buildTenantUrl(`/administration/tenants/${tenant.id}/members`));\r\n }}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <Users className=\"w-4 h-4\" />\r\n {t('tenants.actions.viewMembers')}\r\n </button>\r\n <div className=\"border-t border-[var(--border-color)] my-1\" />\r\n {tenant.status !== 'Active' && tenant.status !== 'Archived' && (\r\n <button\r\n onClick={() => handleActivate(tenant)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm text-[var(--success-text)] hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <PlayCircle className=\"w-4 h-4\" />\r\n {t('tenants.actions.activate')}\r\n </button>\r\n )}\r\n {tenant.status === 'Active' && (\r\n <button\r\n onClick={() => handleSuspend(tenant)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm text-[var(--warning-text)] hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <PauseCircle className=\"w-4 h-4\" />\r\n {t('tenants.actions.suspend')}\r\n </button>\r\n )}\r\n {tenant.status !== 'Archived' && (\r\n <button\r\n onClick={() => handleArchive(tenant)}\r\n className=\"w-full flex items-center gap-2 px-4 py-2 text-sm text-[var(--error-text)] hover:bg-[var(--bg-secondary)] transition-colors\"\r\n >\r\n <Archive className=\"w-4 h-4\" />\r\n {t('tenants.actions.archive')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n const renderTableRow = (tenant: TenantListDto) => {\r\n const typeInfo = getIconForType(tenant.type);\r\n const RowIcon = getLucideIcon(typeInfo.icon);\r\n const rowColors = getColorClasses(typeInfo.color);\r\n const statusConfig = STATUS_CONFIG[tenant.status];\r\n\r\n return (\r\n <tr\r\n key={tenant.id}\r\n className={`group hover:bg-[var(--bg-hover)] transition-all cursor-pointer ${menuOpen === tenant.id ? 'relative z-10' : ''}`}\r\n onClick={() => navigate(buildTenantUrl(`/administration/tenants/${tenant.id}`))}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-10 h-10 flex items-center justify-center ${rowColors.bg}`} style={{ borderRadius: 'var(--radius-card)' }}>\r\n <RowIcon className={`w-5 h-5 ${rowColors.text}`} />\r\n </div>\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] group-hover:text-[var(--color-accent-600)] transition-colors truncate\">\r\n {tenant.name}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-tertiary)] truncate\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n </td>\r\n {!hideTypeColumn && (\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n <div className=\"flex items-center gap-2\">\r\n <RowIcon className={`w-4 h-4 ${rowColors.text}`} />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n {t(TYPE_CONFIG[tenant.type].label)}\r\n </span>\r\n </div>\r\n {tenant.organisation?.name && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5 truncate\">{tenant.organisation.name}</p>\r\n )}\r\n </td>\r\n )}\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={statusConfig.statusBadge}\r\n label={t(`tenants.status.${tenant.status.toLowerCase()}`)}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3 hidden md:table-cell\">\r\n {tenant.templateName ? (\r\n <div className=\"flex items-center gap-2\">\r\n <Layers className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{tenant.templateName}</span>\r\n </div>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n <span className=\"text-sm text-[var(--text-primary)]\">{tenant.memberCount ?? 0}</span>\r\n </td>\r\n <td className=\"px-4 py-3 text-center hidden lg:table-cell\">\r\n {(tenant.pendingAccessRequestCount ?? 0) > 0 ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]\">\r\n <Clock className=\"w-3 h-3\" />\r\n {tenant.pendingAccessRequestCount}\r\n </span>\r\n ) : (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">-</span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n {renderTableActionsMenu(tenant)}\r\n </td>\r\n </tr>\r\n );\r\n };\r\n\r\n const renderLoadingRow = () => (\r\n <tr>\r\n <td colSpan={columnCount} className=\"text-center py-8\">\r\n <div className=\"w-6 h-6 border-2 border-[var(--color-accent-500)] border-t-transparent rounded-full animate-spin mx-auto\" />\r\n </td>\r\n </tr>\r\n );\r\n\r\n const renderEmptyRow = () => (\r\n <tr>\r\n <td colSpan={columnCount} className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('tenants.empty')}\r\n </td>\r\n </tr>\r\n );\r\n\r\n const renderTableView = () => (\r\n <div className=\"card\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)]\" style={{ borderRadius: 'var(--radius-card) var(--radius-card) 0 0' }}>\r\n <tr>\r\n {renderTableHeader(t('tenants.columns.name'), 'name')}\r\n {!hideTypeColumn && renderTableHeader(t('tenants.columns.type'), 'type', 'hidden md:table-cell')}\r\n {renderTableHeader(t('tenants.columns.status'), 'status')}\r\n {renderTableHeader(t('tenants.columns.template'), 'template', 'hidden md:table-cell')}\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('tenants.columns.members')}\r\n </th>\r\n <th className=\"text-center px-4 py-3 text-xs font-semibold text-[var(--text-tertiary)] uppercase tracking-wider hidden lg:table-cell\">\r\n {t('tenants.columns.requests')}\r\n </th>\r\n <th className=\"w-24 px-4 py-3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && renderLoadingRow()}\r\n {!loading && paginatedTenants.length === 0 && renderEmptyRow()}\r\n {!loading && paginatedTenants.length > 0 && paginatedTenants.map(renderTableRow)}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const buildCardTags = (tenant: TenantListDto): EntityCardTag[] => [\r\n {\r\n label: t(`tenants.type.${tenant.type.toLowerCase()}`),\r\n variant: tenant.type === 'Business' ? 'info' : 'primary'\r\n },\r\n {\r\n label: t(`tenants.status.${tenant.status.toLowerCase()}`),\r\n variant: getTenantStatusVariant(tenant.status)\r\n }\r\n ];\r\n\r\n const buildCardActions = (tenant: TenantListDto): EntityCardAction[] => [\r\n {\r\n label: t('common.edit'),\r\n onClick: () => navigate(buildTenantUrl(`/administration/tenants/${tenant.id}`)),\r\n variant: 'primary',\r\n icon: Edit2\r\n },\r\n {\r\n label: t('tenants.actions.viewMembers'),\r\n onClick: () => navigate(buildTenantUrl(`/administration/tenants/${tenant.id}/members`)),\r\n variant: 'ghost',\r\n icon: Users\r\n }\r\n ];\r\n\r\n const buildCardStats = (tenant: TenantListDto) => (\r\n <div className=\"flex items-center gap-4\">\r\n <div className=\"flex items-center gap-1.5\">\r\n <Users className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span>{tenant.memberCount ?? 0} {t('tenants.members')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-1.5\">\r\n <Boxes className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span>{tenant.applicationCount ?? 0} {t('tenants.applications')}</span>\r\n </div>\r\n </div>\r\n );\r\n\r\n const mapTenantToCardProps = (tenant: TenantListDto) => {\r\n const isB2B = tenant.type === 'Business';\r\n const avatarColor = isB2B ? '#3b82f6' : '#8b5cf6';\r\n\r\n return {\r\n avatar: {\r\n letter: tenant.name.at(0)?.toUpperCase() ?? '',\r\n color: avatarColor\r\n },\r\n title: tenant.name,\r\n subtitle: tenant.slug,\r\n description: tenant.organisation?.name || undefined,\r\n stats: buildCardStats(tenant),\r\n tags: buildCardTags(tenant),\r\n actions: buildCardActions(tenant),\r\n onClick: () => navigate(buildTenantUrl(`/administration/tenants/${tenant.id}`))\r\n };\r\n };\r\n\r\n // Render cards view - using EntityCard component\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6\">\r\n {loading && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n <span className=\"mt-3 text-sm text-[var(--text-secondary)]\">{t('common.loading')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedTenants.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Building2 className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('tenants.noTenants')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedTenants.length > 0 && (\r\n paginatedTenants.map((tenant) => (\r\n <EntityCard key={tenant.id} {...mapTenantToCardProps(tenant)} />\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: buildTenantUrl('/administration') },\r\n ...(lockedType || excludeTypes\r\n ? [\r\n { label: t('tenants.title'), href: buildTenantUrl('/administration/tenants/list') },\r\n { label: (() => {\r\n if (excludeTypes) return t('tenants.other.title');\r\n return lockedType === 'Business' ? t('tenants.enterprise.title') : t('tenants.personal.title');\r\n })() }\r\n ]\r\n : [{ label: t('tenants.title') }]\r\n ),\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <PageHeader\r\n title={pageTitle}\r\n subtitle={pageSubtitle}\r\n icon={<PageIcon className=\"w-6 h-6 text-[var(--color-accent-500)]\" />}\r\n actions={\r\n <>\r\n {!excludeTypes && (!lockedType || lockedType === 'Personal') && (\r\n <button\r\n onClick={() => navigate(buildTenantUrl('/administration/tenants/create') + '?type=b2c')}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <User className=\"w-4 h-4\" />\r\n {t('tenants.createB2C')}\r\n </button>\r\n )}\r\n {!excludeTypes && (!lockedType || lockedType === 'Business') && (\r\n <button\r\n onClick={() => navigate(buildTenantUrl('/administration/tenants/create') + '?type=b2b')}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Building className=\"w-4 h-4\" />\r\n {t('tenants.createB2B')}\r\n </button>\r\n )}\r\n </>\r\n }\r\n />\r\n\r\n {/* Error display - F6 */}\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] flex items-center gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-[var(--error-dot)] flex-shrink-0\" />\r\n <span className=\"text-[var(--error-text)]\">{error}</span>\r\n <button\r\n onClick={loadTenants}\r\n className=\"ml-auto text-sm text-[var(--error-text)] hover:underline\"\r\n >\r\n {t('common.retry')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Toolbar */}\r\n <div className=\"card p-4 mb-6\">\r\n <div className=\"flex flex-col gap-4\">\r\n {/* Search row */}\r\n <div className=\"flex items-center gap-3 flex-wrap\">\r\n <div className=\"relative flex-1 min-w-[200px] max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={filters.search}\r\n onChange={(e) => updateFilter('search', e.target.value)}\r\n placeholder={t('common.search')}\r\n className=\"input !pl-10 w-full\"\r\n />\r\n </div>\r\n\r\n {/* Status filter inline when lockedType or excludeTypes (only 1 filter) */}\r\n {(lockedType || excludeTypes) ? (\r\n <div className=\"relative\">\r\n <select\r\n value={filters.status}\r\n onChange={(e) => updateFilter('status', e.target.value as TenantStatus | '')}\r\n className=\"input appearance-none pr-8 min-w-[160px]\"\r\n >\r\n <option value=\"\">{t('tenants.columns.status')}: {t('common.all')}</option>\r\n <option value=\"Pending\">{t('tenants.status.pending')}</option>\r\n <option value=\"Active\">{t('tenants.status.active')}</option>\r\n <option value=\"Suspended\">{t('tenants.status.suspended')}</option>\r\n <option value=\"Archived\">{t('tenants.status.archived')}</option>\r\n </select>\r\n <ChevronDown className=\"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none text-[var(--text-tertiary)]\" />\r\n </div>\r\n ) : (\r\n <>\r\n <button\r\n onClick={() => setShowFilters(!showFilters)}\r\n className={`flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] transition-colors ${activeFilterCount > 0 ? 'ring-2 ring-[var(--color-accent-500)]' : ''}`}\r\n >\r\n <Filter className=\"w-4 h-4\" />\r\n {t('common.filters')}\r\n {activeFilterCount > 0 && (\r\n <span className=\"ml-1 px-1.5 py-0.5 text-xs rounded-full bg-[var(--color-accent-500)] text-white\">\r\n {activeFilterCount}\r\n </span>\r\n )}\r\n <ChevronDown className={`w-4 h-4 transition-transform ${showFilters ? 'rotate-180' : ''}`} />\r\n </button>\r\n\r\n {activeFilterCount > 0 && (\r\n <button\r\n onClick={handleResetFilters}\r\n className=\"flex items-center gap-1.5 px-4 py-2 rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n {t('common.reset')}\r\n </button>\r\n )}\r\n </>\r\n )}\r\n\r\n <div className=\"flex-1\" />\r\n\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n showTable={true}\r\n showCards={true}\r\n showKanban={false}\r\n tableLabel={t('common.table')}\r\n cardsLabel={t('common.cards')}\r\n />\r\n </div>\r\n\r\n {/* Filters panel (only for non-locked type - multiple filters) */}\r\n {!lockedType && !excludeTypes && showFilters && (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 pt-4 border-t border-[var(--border-color)]\">\r\n <div>\r\n <label className=\"block text-xs font-medium text-[var(--text-tertiary)] mb-1.5\">\r\n {t('tenants.columns.status')}\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n value={filters.status}\r\n onChange={(e) => updateFilter('status', e.target.value as TenantStatus | '')}\r\n className=\"input w-full appearance-none pr-8\"\r\n >\r\n <option value=\"\">{t('common.all')}</option>\r\n <option value=\"Pending\">{t('tenants.status.pending')}</option>\r\n <option value=\"Active\">{t('tenants.status.active')}</option>\r\n <option value=\"Suspended\">{t('tenants.status.suspended')}</option>\r\n <option value=\"Archived\">{t('tenants.status.archived')}</option>\r\n </select>\r\n <ChevronDown className=\"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none text-[var(--text-tertiary)]\" />\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium text-[var(--text-tertiary)] mb-1.5\">\r\n {t('tenants.columns.type')}\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n value={filters.type}\r\n onChange={(e) => updateFilter('type', e.target.value as TenantType | '')}\r\n className=\"input w-full appearance-none pr-8\"\r\n >\r\n <option value=\"\">{t('common.all')}</option>\r\n <option value=\"Personal\">{t('tenants.type.personal')}</option>\r\n <option value=\"Business\">{t('tenants.type.business')}</option>\r\n <option value=\"System\">{t('tenants.type.system')}</option>\r\n </select>\r\n <ChevronDown className=\"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none text-[var(--text-tertiary)]\" />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Stats */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-6\">\r\n <div className=\"card p-4 border bg-[var(--success-bg)] border-[var(--success-border)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <Building2 className=\"w-8 h-8 text-[var(--success-text)]\" />\r\n <div>\r\n <p className=\"text-2xl font-bold text-[var(--success-text)]\">{stats.active}</p>\r\n <p className=\"text-sm text-[var(--success-text)]\">{t('tenants.status.active')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"card p-4 border bg-[var(--warning-bg)] border-[var(--warning-border)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <PauseCircle className=\"w-8 h-8 text-[var(--warning-text)]\" />\r\n <div>\r\n <p className=\"text-2xl font-bold text-[var(--warning-text)]\">{stats.suspended}</p>\r\n <p className=\"text-sm text-[var(--warning-text)]\">{t('tenants.status.suspended')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"card p-4 border bg-[var(--bg-secondary)] border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <Users className=\"w-8 h-8 text-[var(--text-secondary)]\" />\r\n <div>\r\n <p className=\"text-2xl font-bold text-[var(--text-primary)]\">{stats.members}</p>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('tenants.columns.members')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className={`card p-4 border ${stats.pendingRequests > 0 ? 'bg-[var(--warning-bg)] border-[var(--warning-border)]' : 'bg-[var(--bg-secondary)] border-[var(--border-color)]'}`}>\r\n <div className=\"flex items-center gap-3\">\r\n <Clock className={`w-8 h-8 ${stats.pendingRequests > 0 ? 'text-[var(--warning-text)]' : 'text-[var(--text-secondary)]'}`} />\r\n <div>\r\n <p className={`text-2xl font-bold ${stats.pendingRequests > 0 ? 'text-[var(--warning-text)]' : 'text-[var(--text-primary)]'}`}>{stats.pendingRequests}</p>\r\n <p className={`text-sm ${stats.pendingRequests > 0 ? 'text-[var(--warning-text)]' : 'text-[var(--text-secondary)]'}`}>{t('tenants.columns.requests')}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content */}\r\n {viewMode === 'table' ? renderTableView() : renderCardsView()}\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"mt-6\">\r\n <Pagination\r\n page={page}\r\n totalPages={totalPages}\r\n totalCount={totalCount}\r\n pageSize={20}\r\n onPageChange={setPage}\r\n itemLabel={t('tenants.title').toLowerCase()}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Confirm Modal */}\r\n {(() => {\r\n const props = getConfirmModalProps();\r\n return props ? (\r\n <ConfirmModal\r\n isOpen={!!confirmAction}\r\n title={props.label}\r\n message={props.message}\r\n confirmLabel={props.label}\r\n variant={props.variant}\r\n loading={!!actionLoading}\r\n onConfirm={handleConfirmAction}\r\n onCancel={() => setConfirmAction(null)}\r\n />\r\n ) : null;\r\n })()}\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n adminApi,\r\n type TenantDetailDto,\r\n} from '@/services/api/adminApi';\r\n\r\nexport interface UseTenantDetailReturn {\r\n tenant: TenantDetailDto | null;\r\n setTenant: (tenant: TenantDetailDto | null) => void;\r\n loading: boolean;\r\n setLoading: (loading: boolean) => void;\r\n error: string | null;\r\n setError: (error: string | null) => void;\r\n loadTenant: () => Promise<void>;\r\n editingGeneralInfo: boolean;\r\n setEditingGeneralInfo: (editing: boolean) => void;\r\n editName: string;\r\n setEditName: (name: string) => void;\r\n editDescription: string;\r\n setEditDescription: (description: string) => void;\r\n savingGeneralInfo: boolean;\r\n setSavingGeneralInfo: (saving: boolean) => void;\r\n handleSaveGeneralInfo: () => Promise<void>;\r\n openEditGeneralInfo: () => void;\r\n closeEditGeneralInfo: () => void;\r\n}\r\n\r\nexport function useTenantDetail(tenantId: string | undefined): UseTenantDetailReturn {\r\n const { t } = useTranslation(['admin', 'common']);\r\n\r\n const [tenant, setTenant] = useState<TenantDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [editingGeneralInfo, setEditingGeneralInfo] = useState(false);\r\n const [editName, setEditName] = useState('');\r\n const [editDescription, setEditDescription] = useState('');\r\n const [savingGeneralInfo, setSavingGeneralInfo] = useState(false);\r\n\r\n const loadTenant = useCallback(async () => {\r\n if (!tenantId) return;\r\n try {\r\n setError(null);\r\n const data = await adminApi.tenants.getById(tenantId);\r\n setTenant(data);\r\n } catch (err) {\r\n console.error('Failed to load tenant:', err);\r\n setError(t('admin:tenants.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [tenantId, t]);\r\n\r\n const openEditGeneralInfo = useCallback(() => {\r\n if (!tenant) return;\r\n setEditName(tenant.name);\r\n setEditDescription(tenant.description || '');\r\n setEditingGeneralInfo(true);\r\n }, [tenant]);\r\n\r\n const closeEditGeneralInfo = useCallback(() => {\r\n setEditingGeneralInfo(false);\r\n setEditName('');\r\n setEditDescription('');\r\n }, []);\r\n\r\n const handleSaveGeneralInfo = useCallback(async () => {\r\n if (!tenant) return;\r\n setSavingGeneralInfo(true);\r\n try {\r\n await adminApi.tenants.update(tenant.id, {\r\n name: editName,\r\n description: editDescription || undefined,\r\n });\r\n await loadTenant();\r\n closeEditGeneralInfo();\r\n } catch (err) {\r\n console.error('Failed to update tenant:', err);\r\n } finally {\r\n setSavingGeneralInfo(false);\r\n }\r\n }, [tenant, editName, editDescription, loadTenant, closeEditGeneralInfo]);\r\n\r\n return {\r\n tenant,\r\n setTenant,\r\n loading,\r\n setLoading,\r\n error,\r\n setError,\r\n loadTenant,\r\n editingGeneralInfo,\r\n setEditingGeneralInfo,\r\n editName,\r\n setEditName,\r\n editDescription,\r\n setEditDescription,\r\n savingGeneralInfo,\r\n setSavingGeneralInfo,\r\n handleSaveGeneralInfo,\r\n openEditGeneralInfo,\r\n closeEditGeneralInfo,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport {\r\n adminApi,\r\n type TenantMemberDto,\r\n type RoleListDto,\r\n type UserListDto,\r\n} from '@/services/api/adminApi';\r\n\r\nexport interface UseTenantMembersReturn {\r\n members: TenantMemberDto[] | null;\r\n setMembers: (members: TenantMemberDto[] | null) => void;\r\n loadingMembers: boolean;\r\n setLoadingMembers: (loading: boolean) => void;\r\n addingMember: boolean;\r\n setAddingMember: (adding: boolean) => void;\r\n availableUsers: UserListDto[];\r\n setAvailableUsers: (users: UserListDto[]) => void;\r\n loadingUsers: boolean;\r\n setLoadingUsers: (loading: boolean) => void;\r\n userSearchTerm: string;\r\n setUserSearchTerm: (term: string) => void;\r\n selectedUserId: string | null;\r\n setSelectedUserId: (userId: string | null) => void;\r\n addingMemberLoading: boolean;\r\n setAddingMemberLoading: (loading: boolean) => void;\r\n selectedMemberForRoles: TenantMemberDto | null;\r\n setSelectedMemberForRoles: (member: TenantMemberDto | null) => void;\r\n availableRoles: RoleListDto[];\r\n setAvailableRoles: (roles: RoleListDto[]) => void;\r\n selectedRoleIds: string[];\r\n setSelectedRoleIds: (roleIds: string[]) => void;\r\n loadingRoles: boolean;\r\n setLoadingRoles: (loading: boolean) => void;\r\n savingRoles: boolean;\r\n setSavingRoles: (saving: boolean) => void;\r\n loadMembers: () => Promise<void>;\r\n loadAvailableUsers: () => Promise<void>;\r\n handleAddMember: () => Promise<void>;\r\n handleRemoveMember: (userId: string) => Promise<void>;\r\n openRoleModal: (member: TenantMemberDto) => Promise<void>;\r\n closeRoleModal: () => void;\r\n handleSaveRoles: () => Promise<void>;\r\n handleRoleToggle: (roleId: string) => void;\r\n}\r\n\r\nexport function useTenantMembers(tenantId: string | undefined): UseTenantMembersReturn {\r\n const [members, setMembers] = useState<TenantMemberDto[] | null>(null);\r\n const [loadingMembers, setLoadingMembers] = useState(false);\r\n\r\n const [addingMember, setAddingMember] = useState(false);\r\n const [availableUsers, setAvailableUsers] = useState<UserListDto[]>([]);\r\n const [loadingUsers, setLoadingUsers] = useState(false);\r\n const [userSearchTerm, setUserSearchTerm] = useState('');\r\n const [selectedUserId, setSelectedUserId] = useState<string | null>(null);\r\n const [addingMemberLoading, setAddingMemberLoading] = useState(false);\r\n\r\n const [selectedMemberForRoles, setSelectedMemberForRoles] = useState<TenantMemberDto | null>(null);\r\n const [availableRoles, setAvailableRoles] = useState<RoleListDto[]>([]);\r\n const [selectedRoleIds, setSelectedRoleIds] = useState<string[]>([]);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [savingRoles, setSavingRoles] = useState(false);\r\n\r\n const loadMembers = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLoadingMembers(true);\r\n try {\r\n const data = await adminApi.tenants.getMembers(tenantId);\r\n setMembers(data);\r\n } catch (err) {\r\n console.error('Failed to load members:', err);\r\n } finally {\r\n setLoadingMembers(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const loadAvailableUsers = useCallback(async () => {\r\n setLoadingUsers(true);\r\n try {\r\n const result = await adminApi.users.getAll({ pageSize: 50 });\r\n const memberUserIds = new Set((members ?? []).map(m => m.userId));\r\n setAvailableUsers(result.items.filter(u => !memberUserIds.has(u.id)));\r\n } catch (err) {\r\n console.error('Failed to load users:', err);\r\n } finally {\r\n setLoadingUsers(false);\r\n }\r\n }, [members]);\r\n\r\n const handleAddMember = useCallback(async () => {\r\n if (!tenantId || !selectedUserId) return;\r\n setAddingMemberLoading(true);\r\n try {\r\n await adminApi.tenants.addMember(tenantId, { userId: selectedUserId });\r\n await loadMembers();\r\n setAddingMember(false);\r\n setSelectedUserId(null);\r\n setUserSearchTerm('');\r\n } catch (err) {\r\n console.error('Failed to add member:', err);\r\n } finally {\r\n setAddingMemberLoading(false);\r\n }\r\n }, [tenantId, selectedUserId, loadMembers]);\r\n\r\n const handleRemoveMember = useCallback(async (userId: string) => {\r\n if (!tenantId) return;\r\n try {\r\n await adminApi.tenants.removeMember(tenantId, userId);\r\n await loadMembers();\r\n } catch (err) {\r\n console.error('Failed to remove member:', err);\r\n }\r\n }, [tenantId, loadMembers]);\r\n\r\n const loadAvailableRoles = useCallback(async () => {\r\n setLoadingRoles(true);\r\n try {\r\n const data = await adminApi.roles.getAssignable();\r\n setAvailableRoles(data);\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n } finally {\r\n setLoadingRoles(false);\r\n }\r\n }, []);\r\n\r\n const openRoleModal = useCallback(async (member: TenantMemberDto) => {\r\n setSelectedMemberForRoles(member);\r\n setSelectedRoleIds(member.roles.map(r => r.roleId));\r\n if (availableRoles.length === 0) {\r\n await loadAvailableRoles();\r\n }\r\n }, [availableRoles.length, loadAvailableRoles]);\r\n\r\n const closeRoleModal = useCallback(() => {\r\n setSelectedMemberForRoles(null);\r\n setSelectedRoleIds([]);\r\n }, []);\r\n\r\n const handleRoleToggle = useCallback((roleId: string) => {\r\n setSelectedRoleIds(prev =>\r\n prev.includes(roleId)\r\n ? prev.filter(id => id !== roleId)\r\n : [...prev, roleId]\r\n );\r\n }, []);\r\n\r\n const handleSaveRoles = useCallback(async () => {\r\n if (!tenantId || !selectedMemberForRoles) return;\r\n setSavingRoles(true);\r\n try {\r\n await adminApi.tenants.assignMemberRoles(tenantId, selectedMemberForRoles.userId, selectedRoleIds);\r\n await loadMembers();\r\n closeRoleModal();\r\n } catch (err) {\r\n console.error('Failed to save roles:', err);\r\n } finally {\r\n setSavingRoles(false);\r\n }\r\n }, [tenantId, selectedMemberForRoles, selectedRoleIds, loadMembers, closeRoleModal]);\r\n\r\n return {\r\n members,\r\n setMembers,\r\n loadingMembers,\r\n setLoadingMembers,\r\n addingMember,\r\n setAddingMember,\r\n availableUsers,\r\n setAvailableUsers,\r\n loadingUsers,\r\n setLoadingUsers,\r\n userSearchTerm,\r\n setUserSearchTerm,\r\n selectedUserId,\r\n setSelectedUserId,\r\n addingMemberLoading,\r\n setAddingMemberLoading,\r\n selectedMemberForRoles,\r\n setSelectedMemberForRoles,\r\n availableRoles,\r\n setAvailableRoles,\r\n selectedRoleIds,\r\n setSelectedRoleIds,\r\n loadingRoles,\r\n setLoadingRoles,\r\n savingRoles,\r\n setSavingRoles,\r\n loadMembers,\r\n loadAvailableUsers,\r\n handleAddMember,\r\n handleRemoveMember,\r\n openRoleModal,\r\n closeRoleModal,\r\n handleSaveRoles,\r\n handleRoleToggle,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n adminApi,\r\n type TenantGroupDto,\r\n type AvailableGroupDto,\r\n} from '@/services/api/adminApi';\r\n\r\nexport interface UseTenantGroupsReturn {\r\n groups: TenantGroupDto[] | null;\r\n setGroups: (groups: TenantGroupDto[] | null) => void;\r\n loadingGroups: boolean;\r\n setLoadingGroups: (loading: boolean) => void;\r\n addingGroup: boolean;\r\n setAddingGroup: (adding: boolean) => void;\r\n availableGroupsForTenant: AvailableGroupDto[];\r\n setAvailableGroupsForTenant: (groups: AvailableGroupDto[]) => void;\r\n loadingAvailableGroups: boolean;\r\n setLoadingAvailableGroups: (loading: boolean) => void;\r\n selectedGroupIds: string[];\r\n setSelectedGroupIds: (groupIds: string[]) => void;\r\n assigningGroups: boolean;\r\n setAssigningGroups: (assigning: boolean) => void;\r\n groupSearchTerm: string;\r\n setGroupSearchTerm: (term: string) => void;\r\n removingGroupId: string | null;\r\n setRemovingGroupId: (groupId: string | null) => void;\r\n loadGroups: () => Promise<void>;\r\n loadAvailableGroups: () => Promise<void>;\r\n handleAssignGroups: () => Promise<void>;\r\n handleRemoveGroup: (groupId: string) => Promise<void>;\r\n}\r\n\r\nexport function useTenantGroups(tenantId: string | undefined): UseTenantGroupsReturn {\r\n const { t } = useTranslation('admin');\r\n\r\n const [groups, setGroups] = useState<TenantGroupDto[] | null>(null);\r\n const [loadingGroups, setLoadingGroups] = useState(false);\r\n\r\n const [addingGroup, setAddingGroup] = useState(false);\r\n const [availableGroupsForTenant, setAvailableGroupsForTenant] = useState<AvailableGroupDto[]>([]);\r\n const [loadingAvailableGroups, setLoadingAvailableGroups] = useState(false);\r\n const [selectedGroupIds, setSelectedGroupIds] = useState<string[]>([]);\r\n const [assigningGroups, setAssigningGroups] = useState(false);\r\n const [groupSearchTerm, setGroupSearchTerm] = useState('');\r\n const [removingGroupId, setRemovingGroupId] = useState<string | null>(null);\r\n\r\n const loadGroups = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLoadingGroups(true);\r\n try {\r\n const data = await adminApi.tenants.getGroups(tenantId);\r\n setGroups(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load groups:', err);\r\n setGroups([]);\r\n } finally {\r\n setLoadingGroups(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const loadAvailableGroups = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLoadingAvailableGroups(true);\r\n try {\r\n const data = await adminApi.tenants.getAvailableGroups(tenantId);\r\n setAvailableGroupsForTenant(data);\r\n } catch (err) {\r\n console.error('Failed to load available groups:', err);\r\n setAvailableGroupsForTenant([]);\r\n } finally {\r\n setLoadingAvailableGroups(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const handleAssignGroups = useCallback(async () => {\r\n if (!tenantId || selectedGroupIds.length === 0) return;\r\n setAssigningGroups(true);\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const groupId of selectedGroupIds) {\r\n try {\r\n await adminApi.tenants.addGroupToTenant(tenantId, groupId);\r\n succeeded.push(groupId);\r\n } catch (err) {\r\n console.error(`Failed to add group ${groupId}:`, err);\r\n failed.push(groupId);\r\n }\r\n }\r\n\r\n await loadGroups();\r\n\r\n if (failed.length === 0) {\r\n setAddingGroup(false);\r\n setSelectedGroupIds([]);\r\n } else if (succeeded.length === 0) {\r\n // Error occurred\r\n } else {\r\n setSelectedGroupIds(failed);\r\n }\r\n\r\n setAssigningGroups(false);\r\n }, [tenantId, selectedGroupIds, loadGroups, t]);\r\n\r\n const handleRemoveGroup = useCallback(async (groupId: string) => {\r\n if (!tenantId) return;\r\n setRemovingGroupId(groupId);\r\n try {\r\n await adminApi.tenants.removeGroupFromTenant(tenantId, groupId);\r\n await loadGroups();\r\n } catch (err: unknown) {\r\n console.error('Failed to remove group:', err);\r\n } finally {\r\n setRemovingGroupId(null);\r\n }\r\n }, [tenantId, loadGroups]);\r\n\r\n return {\r\n groups,\r\n setGroups,\r\n loadingGroups,\r\n setLoadingGroups,\r\n addingGroup,\r\n setAddingGroup,\r\n availableGroupsForTenant,\r\n setAvailableGroupsForTenant,\r\n loadingAvailableGroups,\r\n setLoadingAvailableGroups,\r\n selectedGroupIds,\r\n setSelectedGroupIds,\r\n assigningGroups,\r\n setAssigningGroups,\r\n groupSearchTerm,\r\n setGroupSearchTerm,\r\n removingGroupId,\r\n setRemovingGroupId,\r\n loadGroups,\r\n loadAvailableGroups,\r\n handleAssignGroups,\r\n handleRemoveGroup,\r\n };\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport {\r\n adminApi,\r\n type TenantApplicationDto,\r\n type AvailableApplicationDto,\r\n type ApplicationAccessLevel,\r\n type SaveOverridesRequest,\r\n} from '@/services/api/adminApi';\r\n\r\nconst updateModuleAssignment = (module: BulkModuleNode, moduleId: string): BulkModuleNode => {\r\n if (module.id !== moduleId) return module;\r\n const newIsAssigned = !module.isAssigned;\r\n return {\r\n ...module,\r\n isAssigned: newIsAssigned,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: newIsAssigned })),\r\n };\r\n};\r\n\r\nconst updateSectionAssignment = (module: BulkModuleNode, moduleId: string, sectionId: string): BulkModuleNode => {\r\n if (module.id !== moduleId) return module;\r\n const newSections = module.sections.map(s =>\r\n s.id === sectionId ? { ...s, isAssigned: !s.isAssigned } : s\r\n );\r\n const anySectionAssigned = newSections.some(s => s.isAssigned);\r\n return {\r\n ...module,\r\n isAssigned: anySectionAssigned,\r\n sections: newSections,\r\n };\r\n};\r\n\r\nconst assignAllSections = (module: BulkModuleNode): BulkModuleNode => ({\r\n ...module,\r\n isAssigned: true,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: true })),\r\n});\r\n\r\nconst clearAllSections = (module: BulkModuleNode): BulkModuleNode => ({\r\n ...module,\r\n isAssigned: false,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: false })),\r\n});\r\n\r\nexport type BulkAccessMode = 'full' | 'custom';\r\n\r\nexport interface BulkModuleNode {\r\n id: string;\r\n label: string;\r\n code: string;\r\n icon: string | null;\r\n isAssigned: boolean;\r\n sections: BulkSectionNode[];\r\n}\r\n\r\nexport interface BulkSectionNode {\r\n id: string;\r\n label: string;\r\n code: string;\r\n icon: string | null;\r\n isAssigned: boolean;\r\n}\r\n\r\nexport interface UseTenantApplicationsReturn {\r\n applications: TenantApplicationDto[] | null;\r\n setApplications: (apps: TenantApplicationDto[] | null) => void;\r\n loadingApps: boolean;\r\n setLoadingApps: (loading: boolean) => void;\r\n addingApplication: boolean;\r\n setAddingApplication: (adding: boolean) => void;\r\n availableApps: AvailableApplicationDto[];\r\n setAvailableApps: (apps: AvailableApplicationDto[]) => void;\r\n loadingAvailableApps: boolean;\r\n setLoadingAvailableApps: (loading: boolean) => void;\r\n selectedAppIds: string[];\r\n setSelectedAppIds: (appIds: string[]) => void;\r\n assigningApps: boolean;\r\n setAssigningApps: (assigning: boolean) => void;\r\n appSearchTerm: string;\r\n setAppSearchTerm: (term: string) => void;\r\n selectedAccessLevel: ApplicationAccessLevel;\r\n setSelectedAccessLevel: (level: ApplicationAccessLevel) => void;\r\n bulkAccessMode: BulkAccessMode;\r\n setBulkAccessMode: (mode: BulkAccessMode) => void;\r\n bulkModules: BulkModuleNode[];\r\n setBulkModules: (modules: BulkModuleNode[]) => void;\r\n bulkExpandedModules: Set<string>;\r\n setBulkExpandedModules: (modules: Set<string>) => void;\r\n loadingBulkModules: boolean;\r\n setLoadingBulkModules: (loading: boolean) => void;\r\n showCustomizeDrawer: boolean;\r\n setShowCustomizeDrawer: (show: boolean) => void;\r\n customizingApp: TenantApplicationDto | null;\r\n setCustomizingApp: (app: TenantApplicationDto | null) => void;\r\n loadApplications: () => Promise<void>;\r\n availableAppsError: string | null;\r\n loadAvailableApps: () => Promise<void>;\r\n handleAssignApplications: () => Promise<void>;\r\n handleRemoveApplication: (appId: string) => Promise<void>;\r\n handleUpdateAccessLevel: (appId: string, accessLevel: ApplicationAccessLevel) => Promise<void>;\r\n openCustomizeDrawer: (app: TenantApplicationDto) => void;\r\n closeCustomizeDrawer: () => void;\r\n filteredAvailableApps: AvailableApplicationDto[];\r\n handleAppToggle: (appId: string) => void;\r\n selectAllFilteredApps: () => void;\r\n clearAppSelection: () => void;\r\n loadBulkModulesForApp: (appId: string) => Promise<void>;\r\n toggleBulkModuleExpand: (moduleId: string) => void;\r\n toggleBulkModule: (moduleId: string) => void;\r\n toggleBulkSection: (moduleId: string, sectionId: string) => void;\r\n getBulkModuleCheckState: (module: BulkModuleNode) => 'checked' | 'unchecked' | 'indeterminate';\r\n getBulkStats: () => { totalModules: number; assignedModules: number; totalSections: number; assignedSections: number };\r\n selectAllBulkModules: () => void;\r\n clearBulkModules: () => void;\r\n handleSaveOverrides: (appId: string, request: SaveOverridesRequest) => Promise<void>;\r\n handleResetOverrides: (appId: string) => Promise<void>;\r\n}\r\n\r\nexport interface UseTenantApplicationsOptions {\r\n /** Called after any mutation that changes tenant application assignments (assign, remove, update, override). */\r\n onApplicationsChanged?: () => void;\r\n}\r\n\r\nexport function useTenantApplications(tenantId: string | undefined, options?: UseTenantApplicationsOptions): UseTenantApplicationsReturn {\r\n const [applications, setApplications] = useState<TenantApplicationDto[] | null>(null);\r\n const [loadingApps, setLoadingApps] = useState(false);\r\n\r\n const [addingApplication, setAddingApplication] = useState(false);\r\n const [availableApps, setAvailableApps] = useState<AvailableApplicationDto[]>([]);\r\n const [loadingAvailableApps, setLoadingAvailableApps] = useState(false);\r\n const [selectedAppIds, setSelectedAppIds] = useState<string[]>([]);\r\n const [assigningApps, setAssigningApps] = useState(false);\r\n const [appSearchTerm, setAppSearchTerm] = useState('');\r\n const [availableAppsError, setAvailableAppsError] = useState<string | null>(null);\r\n\r\n const [selectedAccessLevel, setSelectedAccessLevel] = useState<ApplicationAccessLevel>('FullAccess');\r\n const [bulkAccessMode, setBulkAccessMode] = useState<BulkAccessMode>('full');\r\n const [bulkModules, setBulkModules] = useState<BulkModuleNode[]>([]);\r\n const [bulkExpandedModules, setBulkExpandedModules] = useState<Set<string>>(new Set());\r\n const [loadingBulkModules, setLoadingBulkModules] = useState(false);\r\n\r\n const [showCustomizeDrawer, setShowCustomizeDrawer] = useState(false);\r\n const [customizingApp, setCustomizingApp] = useState<TenantApplicationDto | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLoadingApps(true);\r\n try {\r\n const data = await adminApi.tenants.getApplications(tenantId);\r\n setApplications(Array.isArray(data) ? data : []);\r\n } catch (err) {\r\n console.error('Failed to load applications:', err);\r\n setApplications([]);\r\n } finally {\r\n setLoadingApps(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const loadAvailableApps = useCallback(async () => {\r\n if (!tenantId) return;\r\n setAddingApplication(true);\r\n setSelectedAppIds([]);\r\n setLoadingAvailableApps(true);\r\n setAvailableAppsError(null);\r\n try {\r\n const availableAppsResult = await adminApi.tenants.getAvailableApplications(tenantId);\r\n setAvailableApps(availableAppsResult.filter(a => !a.isAssigned));\r\n } catch (err) {\r\n console.error('Failed to load available applications:', err);\r\n const isForbidden = err instanceof Error && err.name === 'ForbiddenError';\r\n setAvailableAppsError(isForbidden ? 'forbidden' : 'generic');\r\n } finally {\r\n setLoadingAvailableApps(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const closeAddApplication = useCallback(() => {\r\n setAddingApplication(false);\r\n setSelectedAppIds([]);\r\n setAppSearchTerm('');\r\n setSelectedAccessLevel('FullAccess');\r\n setBulkAccessMode('full');\r\n setBulkModules([]);\r\n setBulkExpandedModules(new Set());\r\n }, []);\r\n\r\n const handleAssignApplications = useCallback(async () => {\r\n if (!tenantId || selectedAppIds.length === 0) return;\r\n setAssigningApps(true);\r\n try {\r\n const request = {\r\n applicationIds: selectedAppIds,\r\n accessLevel: selectedAccessLevel,\r\n accessMode: bulkAccessMode,\r\n moduleIds: bulkAccessMode === 'custom' ? bulkModules.filter(m => m.isAssigned).map(m => m.id) : undefined,\r\n sectionIds: bulkAccessMode === 'custom' ? bulkModules.flatMap(m => m.sections.filter(s => s.isAssigned).map(s => s.id)) : undefined,\r\n };\r\n\r\n await adminApi.tenants.bulkAssignApplications(tenantId, request);\r\n\r\n await loadApplications();\r\n closeAddApplication();\r\n options?.onApplicationsChanged?.();\r\n } catch (err) {\r\n console.error('Failed to assign applications:', err);\r\n } finally {\r\n setAssigningApps(false);\r\n }\r\n }, [tenantId, selectedAppIds, selectedAccessLevel, bulkAccessMode, bulkModules, loadApplications, closeAddApplication, options]);\r\n\r\n const handleRemoveApplication = useCallback(async (appId: string) => {\r\n if (!tenantId) return;\r\n try {\r\n await adminApi.tenants.removeApplication(tenantId, appId);\r\n await loadApplications();\r\n options?.onApplicationsChanged?.();\r\n } catch (err) {\r\n console.error('Failed to remove application:', err);\r\n }\r\n }, [tenantId, loadApplications, options]);\r\n\r\n const handleUpdateAccessLevel = useCallback(async (appId: string, accessLevel: ApplicationAccessLevel) => {\r\n if (!tenantId) return;\r\n try {\r\n await adminApi.tenants.updateApplicationAccessLevel(tenantId, appId, accessLevel);\r\n await loadApplications();\r\n options?.onApplicationsChanged?.();\r\n } catch (err) {\r\n console.error('Failed to update access level:', err);\r\n }\r\n }, [tenantId, loadApplications, options]);\r\n\r\n const openCustomizeDrawer = useCallback((app: TenantApplicationDto) => {\r\n setCustomizingApp(app);\r\n setShowCustomizeDrawer(true);\r\n }, []);\r\n\r\n const closeCustomizeDrawer = useCallback(() => {\r\n setShowCustomizeDrawer(false);\r\n setCustomizingApp(null);\r\n }, []);\r\n\r\n const handleSaveOverrides = useCallback(async (appId: string, request: SaveOverridesRequest) => {\r\n if (!tenantId) return;\r\n try {\r\n await adminApi.tenants.saveOverrides(tenantId, appId, request);\r\n await loadApplications();\r\n options?.onApplicationsChanged?.();\r\n } catch (err) {\r\n console.error('Failed to save overrides:', err);\r\n throw err;\r\n }\r\n }, [tenantId, loadApplications, options]);\r\n\r\n const handleResetOverrides = useCallback(async (appId: string) => {\r\n if (!tenantId) return;\r\n try {\r\n // Reset all overrides by sending empty request\r\n await adminApi.tenants.saveOverrides(tenantId, appId, { modules: [], sections: [] });\r\n await loadApplications();\r\n options?.onApplicationsChanged?.();\r\n } catch (err) {\r\n console.error('Failed to reset overrides:', err);\r\n throw err;\r\n }\r\n }, [tenantId, loadApplications, options]);\r\n\r\n const filteredAvailableApps = useMemo(() => {\r\n if (!appSearchTerm) return availableApps;\r\n\r\n const searchLower = appSearchTerm.toLowerCase();\r\n return availableApps.filter(app =>\r\n app.label.toLowerCase().includes(searchLower) ||\r\n app.code.toLowerCase().includes(searchLower)\r\n );\r\n }, [availableApps, appSearchTerm]);\r\n\r\n const handleAppToggle = useCallback((appId: string) => {\r\n setSelectedAppIds(prev =>\r\n prev.includes(appId)\r\n ? prev.filter(id => id !== appId)\r\n : [...prev, appId]\r\n );\r\n }, []);\r\n\r\n const selectAllFilteredApps = useCallback(() => {\r\n const filteredIds = filteredAvailableApps.map(app => app.id);\r\n setSelectedAppIds(filteredIds);\r\n }, [filteredAvailableApps]);\r\n\r\n const clearAppSelection = useCallback(() => {\r\n setSelectedAppIds([]);\r\n }, []);\r\n\r\n const loadBulkModulesForApp = useCallback(async (appId: string) => {\r\n setLoadingBulkModules(true);\r\n try {\r\n const appModules = await adminApi.applications.getModules(appId);\r\n const moduleNodes: BulkModuleNode[] = [];\r\n\r\n for (const appModule of appModules) {\r\n const sections = await adminApi.applications.getModuleSections(appId, appModule.id);\r\n const sectionNodes: BulkSectionNode[] = sections.map(section => ({\r\n id: section.id,\r\n label: section.label,\r\n code: section.code,\r\n icon: section.icon,\r\n isAssigned: true,\r\n }));\r\n\r\n moduleNodes.push({\r\n id: appModule.id,\r\n label: appModule.label,\r\n code: appModule.code,\r\n icon: appModule.icon,\r\n isAssigned: true,\r\n sections: sectionNodes,\r\n });\r\n }\r\n\r\n setBulkModules(moduleNodes);\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n } finally {\r\n setLoadingBulkModules(false);\r\n }\r\n }, []);\r\n\r\n const toggleBulkModuleExpand = useCallback((moduleId: string) => {\r\n setBulkExpandedModules(prev => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(moduleId)) {\r\n newSet.delete(moduleId);\r\n } else {\r\n newSet.add(moduleId);\r\n }\r\n return newSet;\r\n });\r\n }, []);\r\n\r\n const toggleBulkModule = useCallback((moduleId: string) => {\r\n setBulkModules(prev => prev.map(m => updateModuleAssignment(m, moduleId)));\r\n }, []);\r\n\r\n const toggleBulkSection = useCallback((moduleId: string, sectionId: string) => {\r\n setBulkModules(prev => prev.map(m => updateSectionAssignment(m, moduleId, sectionId)));\r\n }, []);\r\n\r\n const getBulkModuleCheckState = useCallback((module: BulkModuleNode): 'checked' | 'unchecked' | 'indeterminate' => {\r\n if (module.sections.length === 0) {\r\n return module.isAssigned ? 'checked' : 'unchecked';\r\n }\r\n const assignedCount = module.sections.filter(s => s.isAssigned).length;\r\n if (assignedCount === 0) return 'unchecked';\r\n if (assignedCount === module.sections.length) return 'checked';\r\n return 'indeterminate';\r\n }, []);\r\n\r\n const getBulkStats = useCallback(() => {\r\n const totalModules = bulkModules.length;\r\n const assignedModules = bulkModules.filter(m => m.isAssigned || m.sections.some(s => s.isAssigned)).length;\r\n const totalSections = bulkModules.reduce((sum, m) => sum + m.sections.length, 0);\r\n const assignedSections = bulkModules.reduce((sum, m) => sum + m.sections.filter(s => s.isAssigned).length, 0);\r\n return { totalModules, assignedModules, totalSections, assignedSections };\r\n }, [bulkModules]);\r\n\r\n const selectAllBulkModules = useCallback(() => {\r\n setBulkModules(prev => prev.map(m => assignAllSections(m)));\r\n }, []);\r\n\r\n const clearBulkModules = useCallback(() => {\r\n setBulkModules(prev => prev.map(m => clearAllSections(m)));\r\n }, []);\r\n\r\n return {\r\n applications,\r\n setApplications,\r\n loadingApps,\r\n setLoadingApps,\r\n addingApplication,\r\n setAddingApplication,\r\n availableApps,\r\n setAvailableApps,\r\n loadingAvailableApps,\r\n setLoadingAvailableApps,\r\n selectedAppIds,\r\n setSelectedAppIds,\r\n assigningApps,\r\n setAssigningApps,\r\n appSearchTerm,\r\n setAppSearchTerm,\r\n selectedAccessLevel,\r\n setSelectedAccessLevel,\r\n bulkAccessMode,\r\n setBulkAccessMode,\r\n bulkModules,\r\n setBulkModules,\r\n bulkExpandedModules,\r\n setBulkExpandedModules,\r\n loadingBulkModules,\r\n setLoadingBulkModules,\r\n showCustomizeDrawer,\r\n setShowCustomizeDrawer,\r\n customizingApp,\r\n setCustomizingApp,\r\n loadApplications,\r\n availableAppsError,\r\n loadAvailableApps,\r\n handleAssignApplications,\r\n handleRemoveApplication,\r\n handleUpdateAccessLevel,\r\n openCustomizeDrawer,\r\n closeCustomizeDrawer,\r\n filteredAvailableApps,\r\n handleAppToggle,\r\n selectAllFilteredApps,\r\n clearAppSelection,\r\n loadBulkModulesForApp,\r\n toggleBulkModuleExpand,\r\n toggleBulkModule,\r\n toggleBulkSection,\r\n getBulkModuleCheckState,\r\n getBulkStats,\r\n selectAllBulkModules,\r\n clearBulkModules,\r\n handleSaveOverrides,\r\n handleResetOverrides,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n adminApi,\r\n type OrganisationListItemDto,\r\n type CreateOrganisationRequest,\r\n type BusinessIdentifierType,\r\n} from '@/services/api/adminApi';\r\n\r\nexport interface UseTenantOrganisationReturn {\r\n showLinkOrgModal: boolean;\r\n setShowLinkOrgModal: (show: boolean) => void;\r\n availableOrgs: OrganisationListItemDto[];\r\n setAvailableOrgs: (orgs: OrganisationListItemDto[]) => void;\r\n loadingOrgs: boolean;\r\n setLoadingOrgs: (loading: boolean) => void;\r\n selectedOrgId: string | null;\r\n setSelectedOrgId: (orgId: string | null) => void;\r\n linkingOrg: boolean;\r\n setLinkingOrg: (linking: boolean) => void;\r\n orgSearchTerm: string;\r\n setOrgSearchTerm: (term: string) => void;\r\n showCreateOrgForm: boolean;\r\n setShowCreateOrgForm: (show: boolean) => void;\r\n creatingOrg: boolean;\r\n setCreatingOrg: (creating: boolean) => void;\r\n newOrgForm: CreateOrganisationRequest;\r\n setNewOrgForm: (form: CreateOrganisationRequest) => void;\r\n lookupLoading: boolean;\r\n setLookupLoading: (loading: boolean) => void;\r\n lookupError: string | null;\r\n setLookupError: (error: string | null) => void;\r\n lookupSuccess: boolean;\r\n setLookupSuccess: (success: boolean) => void;\r\n loadAvailableOrgs: (search?: string) => Promise<void>;\r\n handleLinkOrganisation: () => Promise<void>;\r\n handleUnlinkOrganisation: () => Promise<void>;\r\n handleCreateAndLinkOrganisation: () => Promise<void>;\r\n formatCheNumber: (value: string) => string;\r\n handleBusinessIdChange: (value: string) => void;\r\n handleZefixLookup: () => Promise<void>;\r\n openLinkOrgModal: () => void;\r\n closeLinkOrgModal: () => void;\r\n handleCountryChange: (countryCode: string) => void;\r\n}\r\n\r\nconst COUNTRY_IDENTIFIER_TYPES: Record<string, { types: BusinessIdentifierType[], defaultType: BusinessIdentifierType, country: string }> = {\r\n FR: { types: ['SIREN', 'SIRET'] as BusinessIdentifierType[], defaultType: 'SIREN' as BusinessIdentifierType, country: 'France' },\r\n CH: { types: ['UID_CHE'] as BusinessIdentifierType[], defaultType: 'UID_CHE' as BusinessIdentifierType, country: 'Switzerland' },\r\n DE: { types: ['HRB', 'HRA'] as BusinessIdentifierType[], defaultType: 'HRB' as BusinessIdentifierType, country: 'Germany' },\r\n BE: { types: ['BCE_KBO'] as BusinessIdentifierType[], defaultType: 'BCE_KBO' as BusinessIdentifierType, country: 'Belgium' },\r\n NL: { types: ['KVK'] as BusinessIdentifierType[], defaultType: 'KVK' as BusinessIdentifierType, country: 'Netherlands' },\r\n ES: { types: ['CIF'] as BusinessIdentifierType[], defaultType: 'CIF' as BusinessIdentifierType, country: 'Spain' },\r\n IT: { types: ['PartitaIVA'] as BusinessIdentifierType[], defaultType: 'PartitaIVA' as BusinessIdentifierType, country: 'Italy' },\r\n GB: { types: ['CRN'] as BusinessIdentifierType[], defaultType: 'CRN' as BusinessIdentifierType, country: 'United Kingdom' },\r\n};\r\n\r\nconst DEFAULT_ORG_FORM: CreateOrganisationRequest = {\r\n name: '',\r\n countryCode: 'CH',\r\n businessIdentifierType: 'UID_CHE' as BusinessIdentifierType,\r\n businessIdentifier: 'CHE-',\r\n address: {\r\n street: '',\r\n postalCode: '',\r\n city: '',\r\n state: undefined,\r\n country: 'Switzerland',\r\n countryCode: 'CH',\r\n },\r\n};\r\n\r\nexport function useTenantOrganisation(tenantId: string | undefined): UseTenantOrganisationReturn {\r\n const { t } = useTranslation('admin');\r\n\r\n const [showLinkOrgModal, setShowLinkOrgModal] = useState(false);\r\n const [availableOrgs, setAvailableOrgs] = useState<OrganisationListItemDto[]>([]);\r\n const [loadingOrgs, setLoadingOrgs] = useState(false);\r\n const [selectedOrgId, setSelectedOrgId] = useState<string | null>(null);\r\n const [linkingOrg, setLinkingOrg] = useState(false);\r\n const [orgSearchTerm, setOrgSearchTerm] = useState('');\r\n\r\n const [showCreateOrgForm, setShowCreateOrgForm] = useState(false);\r\n const [creatingOrg, setCreatingOrg] = useState(false);\r\n const [newOrgForm, setNewOrgForm] = useState<CreateOrganisationRequest>(DEFAULT_ORG_FORM);\r\n\r\n const [lookupLoading, setLookupLoading] = useState(false);\r\n const [lookupError, setLookupError] = useState<string | null>(null);\r\n const [lookupSuccess, setLookupSuccess] = useState(false);\r\n\r\n const loadAvailableOrgs = useCallback(async (search?: string) => {\r\n setLoadingOrgs(true);\r\n try {\r\n const response = await adminApi.organisations.getAvailable(search);\r\n const data = Array.isArray(response) ? response : (response as { items?: OrganisationListItemDto[] }).items ?? [];\r\n setAvailableOrgs(data);\r\n } catch (err) {\r\n console.error('Failed to load available organisations:', err);\r\n setAvailableOrgs([]);\r\n } finally {\r\n setLoadingOrgs(false);\r\n }\r\n }, []);\r\n\r\n const openLinkOrgModal = useCallback(() => {\r\n setShowLinkOrgModal(true);\r\n setSelectedOrgId(null);\r\n setOrgSearchTerm('');\r\n loadAvailableOrgs();\r\n }, [loadAvailableOrgs]);\r\n\r\n const closeLinkOrgModal = useCallback(() => {\r\n setShowLinkOrgModal(false);\r\n setSelectedOrgId(null);\r\n setOrgSearchTerm('');\r\n setShowCreateOrgForm(false);\r\n setNewOrgForm(DEFAULT_ORG_FORM);\r\n setLookupLoading(false);\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n }, []);\r\n\r\n const handleLinkOrganisation = useCallback(async () => {\r\n if (!tenantId || !selectedOrgId) return;\r\n setLinkingOrg(true);\r\n try {\r\n await adminApi.tenants.linkOrganisation(tenantId, selectedOrgId);\r\n // Note: Caller should refresh tenant data\r\n closeLinkOrgModal();\r\n } catch (err) {\r\n console.error('Failed to link organisation:', err);\r\n } finally {\r\n setLinkingOrg(false);\r\n }\r\n }, [tenantId, selectedOrgId, closeLinkOrgModal]);\r\n\r\n const handleUnlinkOrganisation = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLinkingOrg(true);\r\n try {\r\n await adminApi.tenants.unlinkOrganisation(tenantId);\r\n // Note: Caller should refresh tenant data\r\n } catch (err) {\r\n console.error('Failed to unlink organisation:', err);\r\n } finally {\r\n setLinkingOrg(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const handleCreateAndLinkOrganisation = useCallback(async () => {\r\n if (!tenantId) return;\r\n if (!newOrgForm.name || !newOrgForm.businessIdentifier || !newOrgForm.address.street || !newOrgForm.address.city || !newOrgForm.address.postalCode) {\r\n return;\r\n }\r\n setCreatingOrg(true);\r\n try {\r\n const createdOrg = await adminApi.organisations.create(newOrgForm);\r\n await adminApi.tenants.linkOrganisation(tenantId, createdOrg.id);\r\n // Note: Caller should refresh tenant data\r\n closeLinkOrgModal();\r\n } catch (err) {\r\n console.error('Failed to create and link organisation:', err);\r\n } finally {\r\n setCreatingOrg(false);\r\n }\r\n }, [tenantId, newOrgForm, closeLinkOrgModal]);\r\n\r\n const formatCheNumber = useCallback((value: string): string => {\r\n const cleaned = value.toUpperCase().replace(/[^A-Z0-9]/g, '');\r\n let digits = cleaned.startsWith('CHE') ? cleaned.slice(3) : cleaned.replace(/[^0-9]/g, '');\r\n digits = digits.slice(0, 9);\r\n\r\n if (digits.length === 0) return 'CHE-';\r\n if (digits.length <= 3) return `CHE-${digits}`;\r\n if (digits.length <= 6) return `CHE-${digits.slice(0, 3)}.${digits.slice(3)}`;\r\n return `CHE-${digits.slice(0, 3)}.${digits.slice(3, 6)}.${digits.slice(6)}`;\r\n }, []);\r\n\r\n const handleBusinessIdChange = useCallback((value: string) => {\r\n if (newOrgForm.countryCode === 'CH') {\r\n setNewOrgForm(prev => ({ ...prev, businessIdentifier: formatCheNumber(value) }));\r\n } else {\r\n setNewOrgForm(prev => ({ ...prev, businessIdentifier: value }));\r\n }\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n }, [newOrgForm.countryCode, formatCheNumber]);\r\n\r\n const handleZefixLookup = useCallback(async () => {\r\n const cleanedId = newOrgForm.businessIdentifier.replace(/[^0-9]/g, '');\r\n if (!newOrgForm.businessIdentifier || cleanedId.length < 9 || newOrgForm.countryCode !== 'CH') {\r\n setLookupError(t('tenants.organisation.lookupIncomplete'));\r\n return;\r\n }\r\n\r\n setLookupLoading(true);\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n\r\n try {\r\n const result = await adminApi.organisations.lookup(\r\n newOrgForm.countryCode,\r\n newOrgForm.businessIdentifier\r\n );\r\n\r\n setNewOrgForm(prev => ({\r\n ...prev,\r\n name: result.name || prev.name,\r\n legalName: result.legalName || prev.legalName,\r\n vatNumber: result.vatNumber || prev.vatNumber,\r\n address: {\r\n ...prev.address,\r\n street: result.street || prev.address.street,\r\n street2: result.street2 || prev.address.street2 || undefined,\r\n postalCode: result.postalCode || prev.address.postalCode,\r\n city: result.city || prev.address.city,\r\n state: result.state || prev.address.state,\r\n country: result.country || prev.address.country,\r\n countryCode: result.countryCode || prev.address.countryCode,\r\n },\r\n }));\r\n\r\n setLookupSuccess(true);\r\n setTimeout(() => setLookupSuccess(false), 3000);\r\n } catch (err: unknown) {\r\n console.error('[Zefix Lookup] Failed:', err);\r\n const errorMessage = err instanceof Error ? err.message : '';\r\n if (errorMessage.includes('503') || errorMessage.includes('not configured') || errorMessage.includes('Service Unavailable')) {\r\n setLookupError(t('tenants.organisation.lookupServiceUnavailable'));\r\n } else if (errorMessage.includes('credentials') || errorMessage.includes('401')) {\r\n setLookupError(t('tenants.organisation.lookupAuthError'));\r\n } else if (errorMessage.includes('404') || errorMessage.includes('not found')) {\r\n setLookupError(t('tenants.organisation.lookupFailed'));\r\n } else {\r\n setLookupError(t('tenants.organisation.lookupFailed'));\r\n }\r\n } finally {\r\n setLookupLoading(false);\r\n }\r\n }, [newOrgForm.businessIdentifier, newOrgForm.countryCode, t]);\r\n\r\n const handleCountryChange = useCallback((countryCode: string) => {\r\n const config = COUNTRY_IDENTIFIER_TYPES[countryCode];\r\n if (config) {\r\n setNewOrgForm(prev => ({\r\n ...prev,\r\n countryCode,\r\n businessIdentifierType: config.defaultType,\r\n businessIdentifier: countryCode === 'CH' ? 'CHE-' : '',\r\n address: {\r\n ...prev.address,\r\n countryCode,\r\n country: config.country,\r\n },\r\n }));\r\n }\r\n }, []);\r\n\r\n return {\r\n showLinkOrgModal,\r\n setShowLinkOrgModal,\r\n availableOrgs,\r\n setAvailableOrgs,\r\n loadingOrgs,\r\n setLoadingOrgs,\r\n selectedOrgId,\r\n setSelectedOrgId,\r\n linkingOrg,\r\n setLinkingOrg,\r\n orgSearchTerm,\r\n setOrgSearchTerm,\r\n showCreateOrgForm,\r\n setShowCreateOrgForm,\r\n creatingOrg,\r\n setCreatingOrg,\r\n newOrgForm,\r\n setNewOrgForm,\r\n lookupLoading,\r\n setLookupLoading,\r\n lookupError,\r\n setLookupError,\r\n lookupSuccess,\r\n setLookupSuccess,\r\n loadAvailableOrgs,\r\n handleLinkOrganisation,\r\n handleUnlinkOrganisation,\r\n handleCreateAndLinkOrganisation,\r\n formatCheNumber,\r\n handleBusinessIdChange,\r\n handleZefixLookup,\r\n openLinkOrgModal,\r\n closeLinkOrgModal,\r\n handleCountryChange,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { adminApi, type TenantRoleDto } from '@/services/api/adminApi';\r\n\r\nexport interface UseTenantRolesReturn {\r\n roles: TenantRoleDto[] | null;\r\n loadingRoles: boolean;\r\n error: string | null;\r\n loadRoles: () => Promise<void>;\r\n}\r\n\r\nexport function useTenantRoles(tenantId: string | undefined): UseTenantRolesReturn {\r\n const [roles, setRoles] = useState<TenantRoleDto[] | null>(null);\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadRoles = useCallback(async () => {\r\n if (!tenantId) return;\r\n setLoadingRoles(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.tenants.getTenantRoles(tenantId);\r\n setRoles(data);\r\n } catch (err) {\r\n console.error('Failed to load tenant roles:', err);\r\n setError('Failed to load roles');\r\n } finally {\r\n setLoadingRoles(false);\r\n }\r\n }, [tenantId]);\r\n\r\n return { roles, loadingRoles, error, loadRoles };\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\ntype TFunction = ReturnType<typeof useTranslation>['t'];\r\nimport {\r\n Info,\r\n Edit3,\r\n Building2,\r\n Plus,\r\n X,\r\n Settings,\r\n RefreshCw,\r\n PlayCircle,\r\n PauseCircle,\r\n Archive,\r\n Loader2,\r\n Layers,\r\n ArrowRight,\r\n Star,\r\n ExternalLink,\r\n Headphones,\r\n CheckCircle2,\r\n AlertCircle,\r\n} from 'lucide-react';\r\nimport type { TenantDetailDto, TenantStatus, TenantTemplateDto, TenantType } from '@/services/api/adminApi';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { ticketingApi, type TenantTicketingConfigurationDto } from '@/services/api/ticketingApi';\r\n\r\ninterface TenantOverviewTabProps {\r\n readonly tenant: TenantDetailDto;\r\n readonly tenantOwner: { userDisplayName?: string; userEmail?: string } | null;\r\n readonly statusConfig: Record<TenantStatus, { color: string; bgColor: string; borderColor: string }>;\r\n readonly actionLoading: string | null;\r\n readonly onRefresh: () => Promise<void>;\r\n readonly onEditClick: () => void;\r\n readonly onStatusChange: (action: 'activate' | 'suspend' | 'archive') => void;\r\n readonly onMembersTabClick: () => void;\r\n readonly onLinkOrgClick: () => void;\r\n readonly onUnlinkOrg: () => Promise<void>;\r\n}\r\n\r\ninterface EditState {\r\n readonly name: string;\r\n readonly description: string;\r\n readonly type: TenantType;\r\n}\r\n\r\ninterface TemplateModalProps {\r\n readonly show: boolean;\r\n readonly templates: TenantTemplateDto[];\r\n readonly selectedTemplateId: string;\r\n readonly loadingTemplates: boolean;\r\n readonly assigningTemplate: boolean;\r\n readonly onTemplateSelect: (id: string) => void;\r\n readonly onClose: () => void;\r\n readonly onAssign: () => Promise<void>;\r\n readonly tenantTemplateId?: string;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction TemplateSelectionModal({\r\n show, templates, selectedTemplateId, loadingTemplates, assigningTemplate,\r\n onTemplateSelect, onClose, onAssign, tenantTemplateId, t\r\n}: TemplateModalProps) {\r\n if (!show) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('tenants.template.selectTitle')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.template.selectSubtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={onClose}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n {loadingTemplates && (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n )}\r\n {!loadingTemplates && templates.length === 0 && (\r\n <div className=\"p-4 rounded-lg bg-[var(--bg-secondary)] text-center\">\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('tenants.template.noTemplatesAvailable')}</p>\r\n </div>\r\n )}\r\n {!loadingTemplates && templates.length > 0 && (\r\n <div className=\"space-y-2 max-h-[300px] overflow-y-auto mb-6\">\r\n {templates.map(tmpl => (\r\n <button\r\n key={tmpl.id}\r\n onClick={() => onTemplateSelect(tmpl.id)}\r\n className={`w-full p-3 rounded-lg border text-left transition-colors ${\r\n selectedTemplateId === tmpl.id\r\n ? 'border-[var(--primary-color)] bg-[var(--primary-color)]/5'\r\n : 'border-[var(--border-color)] bg-[var(--bg-secondary)] hover:border-[var(--primary-color)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">{tmpl.name}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] font-mono\">{tmpl.code}</p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`px-2 py-0.5 text-xs rounded-[var(--radius-badge)] ${\r\n tmpl.targetTenantType === 'Business'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--accent-bg)] text-[var(--accent-text)]'\r\n }`}>\r\n {t(`tenants.type.${tmpl.targetTenantType.toLowerCase()}`)}\r\n </span>\r\n {tmpl.isDefault && (\r\n <span className=\"px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--success-bg)] text-[var(--success-text)]\">\r\n {t('tenants.template.default')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {tmpl.description && (\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-1\">{tmpl.description}</p>\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3\">\r\n <button\r\n onClick={onClose}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={onAssign}\r\n disabled={assigningTemplate || !selectedTemplateId || selectedTemplateId === tenantTemplateId}\r\n className=\"btn btn-primary\"\r\n >\r\n {assigningTemplate ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n t('tenants.template.confirm')\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TenantGeneralInfoSection({\r\n tenant,\r\n statusConfig,\r\n onEditClick,\r\n t,\r\n}: {\r\n tenant: TenantDetailDto;\r\n statusConfig: Record<TenantStatus, { color: string; bgColor: string; borderColor: string }>;\r\n onEditClick: () => void;\r\n t: TFunction;\r\n}) {\r\n return (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Info className=\"w-5 h-5\" />\r\n {t('tenants.detail.generalInfo')}\r\n </h3>\r\n <button\r\n onClick={onEditClick}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Edit3 className=\"w-4 h-4\" />\r\n {t('common:edit')}\r\n </button>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.name')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">{tenant.name}</p>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.slug')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-mono\">{tenant.slug}</p>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.type')}</p>\r\n <span className={`inline-flex px-2 py-0.5 text-xs rounded-[var(--radius-badge)] ${\r\n tenant.type === 'Business'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--accent-bg)] text-[var(--accent-text)]'\r\n }`}>\r\n {t(`tenants.type.${tenant.type.toLowerCase()}`)}\r\n </span>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.status')}</p>\r\n <span className={`inline-flex px-2 py-0.5 text-xs rounded-[var(--radius-badge)] ${statusConfig[tenant.status].bgColor} ${statusConfig[tenant.status].color}`}>\r\n {t(`tenants.status.${tenant.status.toLowerCase()}`)}\r\n </span>\r\n </div>\r\n {tenant.description && (\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)] sm:col-span-2 lg:col-span-4\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.description')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] whitespace-pre-wrap\">{tenant.description}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TenantTicketingSection({\r\n tenant,\r\n ticketingConfig,\r\n loadingTicketing,\r\n t,\r\n navigate,\r\n}: {\r\n tenant: TenantDetailDto;\r\n ticketingConfig: TenantTicketingConfigurationDto | null;\r\n loadingTicketing: boolean;\r\n t: TFunction;\r\n navigate: ReturnType<typeof useNavigate>;\r\n}) {\r\n return (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Headphones className=\"w-5 h-5\" />\r\n {t('tenants.detail.supportManagement.title')}\r\n </h3>\r\n <button\r\n onClick={() => navigate(`/administration/tenants/${tenant.id}/settings?tab=support`)}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('tenants.detail.supportManagement.configure')}\r\n </button>\r\n </div>\r\n {loadingTicketing && (\r\n <div className=\"flex justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n )}\r\n {!loadingTicketing && ticketingConfig && (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">\r\n {t('tenants.detail.supportManagement.provider')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">\r\n {ticketingConfig.provider === 'Glpi'\r\n ? t('tenants.detail.supportManagement.providerGlpi')\r\n : t('tenants.detail.supportManagement.providerSmartStack')}\r\n </p>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">\r\n {t('tenants.detail.supportManagement.status')}\r\n </p>\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-xs rounded-[var(--radius-badge)] ${\r\n ticketingConfig.isConfigured\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--warning-bg)] text-[var(--warning-text)]'\r\n }`}>\r\n {ticketingConfig.isConfigured\r\n ? <><CheckCircle2 className=\"w-3 h-3\" />{t('tenants.detail.supportManagement.configured')}</>\r\n : <><AlertCircle className=\"w-3 h-3\" />{t('tenants.detail.supportManagement.notConfigured')}</>}\r\n </span>\r\n </div>\r\n {ticketingConfig.provider === 'Glpi' && ticketingConfig.glpiBaseUrl && (\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">\r\n {t('tenants.detail.supportManagement.glpiUrl')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-mono truncate\" title={ticketingConfig.glpiBaseUrl}>\r\n {ticketingConfig.glpiBaseUrl}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {!loadingTicketing && !ticketingConfig && (\r\n <div className=\"p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] text-center\">\r\n <Headphones className=\"w-5 h-5 text-[var(--info-text)] mx-auto mb-2\" />\r\n <p className=\"text-sm text-[var(--info-text)]\">\r\n {t('tenants.detail.supportManagement.noConfiguration')}\r\n </p>\r\n <p className=\"text-xs text-[var(--info-text)] mt-1 opacity-75\">\r\n {t('tenants.detail.supportManagement.noConfigurationHint')}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction TenantTemplateSection({\r\n tenant,\r\n templates,\r\n onOpenTemplateModal,\r\n onRemoveTemplate,\r\n removingTemplate,\r\n navigate,\r\n t,\r\n}: {\r\n tenant: TenantDetailDto;\r\n templates: TenantTemplateDto[];\r\n onOpenTemplateModal: () => void;\r\n onRemoveTemplate: () => Promise<void>;\r\n removingTemplate: boolean;\r\n navigate: ReturnType<typeof useNavigate>;\r\n t: TFunction;\r\n}) {\r\n return (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Layers className=\"w-5 h-5\" />\r\n {t('tenants.templateTenant.title')}\r\n </h3>\r\n <button\r\n onClick={() => navigate('/administration/tenants/template')}\r\n className=\"flex items-center gap-1 text-xs text-[var(--text-tertiary)] hover:text-[var(--primary-color)] transition-colors\"\r\n title={t('tenants.templateTenant.viewAll')}\r\n >\r\n <ExternalLink className=\"w-3 h-3\" />\r\n {t('tenants.templateTenant.viewAll')}\r\n </button>\r\n </div>\r\n {tenant.templateId ? (\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={onOpenTemplateModal}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Edit3 className=\"w-4 h-4\" />\r\n {t('tenants.template.change')}\r\n </button>\r\n <button\r\n onClick={onRemoveTemplate}\r\n disabled={removingTemplate}\r\n className=\"btn btn-secondary text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n >\r\n {removingTemplate ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <X className=\"w-4 h-4\" />}\r\n {t('tenants.template.remove')}\r\n </button>\r\n </div>\r\n ) : (\r\n <button\r\n onClick={onOpenTemplateModal}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.template.assign')}\r\n </button>\r\n )}\r\n </div>\r\n {tenant.templateId ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.template.name')}</p>\r\n <div className=\"flex items-center gap-2\">\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">{tenant.templateName || '-'}</p>\r\n {templates.find(tmpl => tmpl.id === tenant.templateId)?.isDefault && (\r\n <span className=\"flex items-center gap-1 px-1.5 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--accent-bg)] text-[var(--accent-text)]\">\r\n <Star className=\"w-3 h-3\" />\r\n {t('tenants.template.default')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.template.code')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-mono\">{tenant.templateCode || '-'}</p>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)] flex items-center\">\r\n <button\r\n onClick={() => navigate(`/administration/tenants/template/${tenant.templateId}`)}\r\n className=\"flex items-center gap-2 text-sm text-[var(--primary-color)] hover:underline\"\r\n >\r\n {t('tenants.template.viewDetails')}\r\n <ArrowRight className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"p-4 rounded-lg bg-[var(--warning-bg)] border border-[var(--warning-border)] text-center\">\r\n <Layers className=\"w-5 h-5 text-[var(--warning-text)] mx-auto mb-2\" />\r\n <p className=\"text-sm text-[var(--warning-text)]\">\r\n {t('tenants.templateTenant.noLink')}\r\n </p>\r\n <p className=\"text-xs text-[var(--warning-text)] mt-1 opacity-75\">\r\n {t('tenants.templateTenant.noLinkHint')}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport function TenantOverviewTab({\r\n tenant,\r\n tenantOwner,\r\n statusConfig,\r\n actionLoading,\r\n onRefresh,\r\n onEditClick,\r\n onStatusChange,\r\n onMembersTabClick,\r\n onLinkOrgClick,\r\n onUnlinkOrg,\r\n}: TenantOverviewTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [editingGeneralInfo, setEditingGeneralInfo] = useState(false);\r\n const [editState, setEditState] = useState<EditState>({ name: '', description: '', type: 'Business' });\r\n const [savingGeneralInfo, setSavingGeneralInfo] = useState(false);\r\n const [linkingOrg, setLinkingOrg] = useState(false);\r\n\r\n // Template management state\r\n const [showTemplateModal, setShowTemplateModal] = useState(false);\r\n const [templates, setTemplates] = useState<TenantTemplateDto[]>([]);\r\n const [loadingTemplates, setLoadingTemplates] = useState(false);\r\n const [selectedTemplateId, setSelectedTemplateId] = useState<string>('');\r\n const [assigningTemplate, setAssigningTemplate] = useState(false);\r\n const [removingTemplate, setRemovingTemplate] = useState(false);\r\n\r\n // Support management state\r\n const [ticketingConfig, setTicketingConfig] = useState<TenantTicketingConfigurationDto | null>(null);\r\n const [loadingTicketing, setLoadingTicketing] = useState(false);\r\n\r\n const loadTicketingConfig = useCallback(async () => {\r\n setLoadingTicketing(true);\r\n try {\r\n const config = await ticketingApi.getConfiguration(tenant.id);\r\n setTicketingConfig(config);\r\n } catch {\r\n setTicketingConfig(null);\r\n } finally {\r\n setLoadingTicketing(false);\r\n }\r\n }, [tenant.id]);\r\n\r\n useEffect(() => {\r\n loadTicketingConfig();\r\n }, [loadTicketingConfig]);\r\n\r\n const loadTemplates = useCallback(async () => {\r\n setLoadingTemplates(true);\r\n try {\r\n const data = await adminApi.templates.getAll();\r\n setTemplates(data.filter(t => t.isActive));\r\n } catch (err) {\r\n console.error('Failed to load templates:', err);\r\n } finally {\r\n setLoadingTemplates(false);\r\n }\r\n }, []);\r\n\r\n // Eagerly load templates to show default badge\r\n useEffect(() => {\r\n if (tenant.templateId && templates.length === 0) {\r\n loadTemplates();\r\n }\r\n }, [tenant.templateId, templates.length, loadTemplates]);\r\n\r\n const handleOpenTemplateModal = async () => {\r\n setSelectedTemplateId(tenant.templateId || '');\r\n setShowTemplateModal(true);\r\n await loadTemplates();\r\n };\r\n\r\n const handleAssignTemplate = async () => {\r\n if (!selectedTemplateId) return;\r\n setAssigningTemplate(true);\r\n try {\r\n await adminApi.tenants.assignTemplate(tenant.id, selectedTemplateId);\r\n await onRefresh();\r\n setShowTemplateModal(false);\r\n } catch (err) {\r\n console.error('Failed to assign template:', err);\r\n } finally {\r\n setAssigningTemplate(false);\r\n }\r\n };\r\n\r\n const handleRemoveTemplate = async () => {\r\n setRemovingTemplate(true);\r\n try {\r\n await adminApi.tenants.removeTemplate(tenant.id);\r\n await onRefresh();\r\n } catch (err) {\r\n console.error('Failed to remove template:', err);\r\n } finally {\r\n setRemovingTemplate(false);\r\n }\r\n };\r\n\r\n const openEditGeneralInfo = () => {\r\n setEditState({ name: tenant.name, description: tenant.description || '', type: tenant.type as TenantType });\r\n setEditingGeneralInfo(true);\r\n onEditClick();\r\n };\r\n\r\n const closeEditGeneralInfo = () => {\r\n setEditingGeneralInfo(false);\r\n setEditState({ name: '', description: '', type: 'Business' });\r\n };\r\n\r\n const handleSaveGeneralInfo = async () => {\r\n if (!editState.name.trim()) return;\r\n setSavingGeneralInfo(true);\r\n try {\r\n await adminApi.tenants.update(tenant.id, {\r\n name: editState.name,\r\n description: editState.description,\r\n type: editState.type,\r\n });\r\n await onRefresh();\r\n closeEditGeneralInfo();\r\n } catch (err) {\r\n console.error('Failed to save tenant info:', err);\r\n } finally {\r\n setSavingGeneralInfo(false);\r\n }\r\n };\r\n\r\n const handleUnlinkOrganisation = async () => {\r\n setLinkingOrg(true);\r\n try {\r\n await onUnlinkOrg();\r\n } finally {\r\n setLinkingOrg(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <TenantGeneralInfoSection\r\n tenant={tenant}\r\n statusConfig={statusConfig}\r\n onEditClick={openEditGeneralInfo}\r\n t={t}\r\n />\r\n\r\n {/* Owner Card */}\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Info className=\"w-5 h-5\" />\r\n {t('tenants.detail.owner')}\r\n </h3>\r\n <button\r\n onClick={onMembersTabClick}\r\n className=\"btn btn-secondary\"\r\n title={t('tenants.members.transferOwnership.title')}\r\n >\r\n <Edit3 className=\"w-4 h-4\" />\r\n {t('common:edit')}\r\n </button>\r\n </div>\r\n {tenantOwner ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('common:name')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">{tenantOwner.userDisplayName || '-'}</p>\r\n </div>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('common:email')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">{tenantOwner.userEmail || '-'}</p>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"p-4 rounded-lg bg-[var(--bg-secondary)] text-center\">\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('tenants.detail.noOwner')}</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Organisation Card (B2B only) */}\r\n {tenant.type === 'Business' && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Building2 className=\"w-5 h-5\" />\r\n {t('tenants.detail.organisation')}\r\n </h3>\r\n {tenant.organisationId ? (\r\n <button\r\n onClick={handleUnlinkOrganisation}\r\n disabled={linkingOrg}\r\n className=\"btn btn-secondary text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n >\r\n {linkingOrg ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <X className=\"w-4 h-4\" />}\r\n {t('tenants.organisation.unlink')}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={onLinkOrgClick}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.organisation.link')}\r\n </button>\r\n )}\r\n </div>\r\n {tenant.organisationId ? (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)]\">\r\n <p className=\"text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1\">{t('tenants.detail.organisationName')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)] font-medium\">{tenant.organisation?.name || '-'}</p>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"p-4 rounded-lg bg-[var(--info-bg)] border border-[var(--info-border)] text-center\">\r\n <Info className=\"w-5 h-5 text-[var(--info-text)] mx-auto mb-2\" />\r\n <p className=\"text-sm text-[var(--info-text)]\">\r\n {t('tenants.organisation.noOrganisation')}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n <TenantTicketingSection\r\n tenant={tenant}\r\n ticketingConfig={ticketingConfig}\r\n loadingTicketing={loadingTicketing}\r\n t={t}\r\n navigate={navigate}\r\n />\r\n\r\n <TenantTemplateSection\r\n tenant={tenant}\r\n templates={templates}\r\n onOpenTemplateModal={handleOpenTemplateModal}\r\n onRemoveTemplate={handleRemoveTemplate}\r\n removingTemplate={removingTemplate}\r\n navigate={navigate}\r\n t={t}\r\n />\r\n\r\n {/* Actions Card - Status management */}\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Settings className=\"w-5 h-5\" />\r\n {t('tenants.detail.actions')}\r\n </h3>\r\n </div>\r\n <div className=\"flex flex-wrap gap-3\">\r\n {tenant.status !== 'Active' && tenant.status !== 'Archived' && (\r\n <button\r\n onClick={() => onStatusChange('activate')}\r\n disabled={actionLoading !== null}\r\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--success-dot)] text-white hover:opacity-90 transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading === 'activate' ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <PlayCircle className=\"w-4 h-4\" />}\r\n {t('tenants.actions.activate')}\r\n </button>\r\n )}\r\n {tenant.status === 'Active' && (\r\n <button\r\n onClick={() => onStatusChange('suspend')}\r\n disabled={actionLoading !== null}\r\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--warning-dot)] text-white hover:opacity-90 transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading === 'suspend' ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <PauseCircle className=\"w-4 h-4\" />}\r\n {t('tenants.actions.suspend')}\r\n </button>\r\n )}\r\n {tenant.status !== 'Archived' && (\r\n <button\r\n onClick={() => onStatusChange('archive')}\r\n disabled={actionLoading !== null}\r\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--error-dot)] text-white hover:opacity-90 transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading === 'archive' ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Archive className=\"w-4 h-4\" />}\r\n {t('tenants.actions.archive')}\r\n </button>\r\n )}\r\n <button\r\n onClick={onRefresh}\r\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <RefreshCw className=\"w-4 h-4\" />\r\n {t('common:refresh')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <TemplateSelectionModal\r\n show={showTemplateModal}\r\n templates={templates}\r\n selectedTemplateId={selectedTemplateId}\r\n loadingTemplates={loadingTemplates}\r\n assigningTemplate={assigningTemplate}\r\n onTemplateSelect={setSelectedTemplateId}\r\n onClose={() => setShowTemplateModal(false)}\r\n onAssign={handleAssignTemplate}\r\n tenantTemplateId={tenant.templateId ?? undefined}\r\n t={t}\r\n />\r\n\r\n {/* Edit General Info Modal */}\r\n {editingGeneralInfo && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('tenants.edit.generalInfo')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.edit.generalInfoSubtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={closeEditGeneralInfo}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.form.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editState.name}\r\n onChange={(e) => setEditState(prev => ({ ...prev, name: e.target.value }))}\r\n className=\"input w-full\"\r\n placeholder={t('tenants.create.namePlaceholder')}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.form.description')}\r\n </label>\r\n <textarea\r\n value={editState.description}\r\n onChange={(e) => setEditState(prev => ({ ...prev, description: e.target.value }))}\r\n className=\"input w-full min-h-[100px] resize-y\"\r\n placeholder={t('tenants.create.descriptionPlaceholder')}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.form.type')}\r\n </label>\r\n <div className=\"flex gap-3\">\r\n {(['Business', 'Personal'] as const).map((typeOption) => (\r\n <button\r\n key={typeOption}\r\n type=\"button\"\r\n onClick={() => setEditState(prev => ({ ...prev, type: typeOption }))}\r\n className={`flex-1 p-3 rounded-lg border text-center transition-colors ${\r\n editState.type === typeOption\r\n ? 'border-[var(--primary-color)] bg-[var(--primary-color)]/5 text-[var(--primary-color)]'\r\n : 'border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:border-[var(--primary-color)]'\r\n }`}\r\n >\r\n <span className=\"text-sm font-medium\">{t(`tenants.type.${typeOption.toLowerCase()}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n {editState.type === 'Personal' && tenant.organisationId && (\r\n <p className=\"mt-2 text-xs text-[var(--error-text)]\">\r\n {t('tenants.form.typeWarningOrg')}\r\n </p>\r\n )}\r\n {editState.type !== tenant.type && (\r\n <p className=\"mt-2 text-xs text-[var(--warning-text)]\">\r\n {t('tenants.form.typeChangeWarning')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={closeEditGeneralInfo}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveGeneralInfo}\r\n disabled={savingGeneralInfo || !editState.name.trim()}\r\n className=\"btn btn-primary\"\r\n >\r\n {savingGeneralInfo ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n t('common:save')\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link } from 'react-router-dom';\r\nimport {\r\n Shield,\r\n Crown,\r\n User,\r\n Users,\r\n Plus,\r\n X,\r\n UserMinus,\r\n Loader2,\r\n UsersRound,\r\n Link2,\r\n} from 'lucide-react';\r\nimport type { TenantMemberDto, TenantRoleDto, UserListDto } from '@/services/api/adminApi';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { DataTable, type DataTableColumn } from '@/components/ui/DataTable';\r\n\r\ninterface TenantMembersTabProps {\r\n readonly tenantId: string;\r\n readonly members: TenantMemberDto[] | null;\r\n readonly loadingMembers: boolean;\r\n readonly actionLoading: string | null;\r\n readonly onRefresh: () => Promise<void>;\r\n readonly onRemoveMember: (userId: string) => Promise<void>;\r\n}\r\n\r\ninterface ManageRolesState {\r\n readonly member: TenantMemberDto | null;\r\n readonly availableRoles: TenantRoleDto[];\r\n readonly selectedRoleIds: string[];\r\n}\r\n\r\nfunction formatDate(date: string | Date): string {\r\n const d = new Date(date);\r\n return d.toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\n\r\nexport function TenantMembersTab({\r\n tenantId,\r\n members,\r\n loadingMembers,\r\n actionLoading,\r\n onRefresh,\r\n onRemoveMember,\r\n}: TenantMembersTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n\r\n // Manage roles modal state\r\n const [manageRolesState, setManageRolesState] = useState<ManageRolesState>({\r\n member: null,\r\n availableRoles: [],\r\n selectedRoleIds: [],\r\n });\r\n const [loadingRoles, setLoadingRoles] = useState(false);\r\n const [savingRoles, setSavingRoles] = useState(false);\r\n\r\n // Add member modal state\r\n const [addingMember, setAddingMember] = useState(false);\r\n const [availableUsers, setAvailableUsers] = useState<UserListDto[]>([]);\r\n const [loadingUsers, setLoadingUsers] = useState(false);\r\n const [userSearchTerm, setUserSearchTerm] = useState('');\r\n const [selectedUserId, setSelectedUserId] = useState<string | null>(null);\r\n const [addingMemberLoading, setAddingMemberLoading] = useState(false);\r\n\r\n const loadAvailableRoles = useCallback(async () => {\r\n setLoadingRoles(true);\r\n try {\r\n const data = await adminApi.tenants.getTenantRoles(tenantId);\r\n return data;\r\n } catch (err) {\r\n console.error('Failed to load roles:', err);\r\n return [];\r\n } finally {\r\n setLoadingRoles(false);\r\n }\r\n }, [tenantId]);\r\n\r\n const openRolesModal = async (member: TenantMemberDto) => {\r\n setManageRolesState(prev => ({\r\n ...prev,\r\n member,\r\n selectedRoleIds: member.roles.map(r => r.roleId),\r\n }));\r\n const roles = await loadAvailableRoles();\r\n setManageRolesState(prev => ({\r\n ...prev,\r\n availableRoles: roles,\r\n }));\r\n };\r\n\r\n const closeRolesModal = () => {\r\n setManageRolesState({\r\n member: null,\r\n availableRoles: [],\r\n selectedRoleIds: [],\r\n });\r\n };\r\n\r\n const handleRoleToggle = (roleId: string) => {\r\n setManageRolesState(prev => ({\r\n ...prev,\r\n selectedRoleIds: prev.selectedRoleIds.includes(roleId)\r\n ? prev.selectedRoleIds.filter(id => id !== roleId)\r\n : [...prev.selectedRoleIds, roleId]\r\n }));\r\n };\r\n\r\n const handleSaveRoles = async () => {\r\n if (!manageRolesState.member) return;\r\n setSavingRoles(true);\r\n try {\r\n await adminApi.tenants.assignMemberRoles(tenantId, manageRolesState.member.userId, manageRolesState.selectedRoleIds);\r\n await onRefresh();\r\n closeRolesModal();\r\n } catch (err) {\r\n console.error('Failed to save roles:', err);\r\n } finally {\r\n setSavingRoles(false);\r\n }\r\n };\r\n\r\n const loadAvailableUsers = async () => {\r\n setLoadingUsers(true);\r\n try {\r\n const data = await adminApi.users.getAll({ globalScope: true });\r\n setAvailableUsers(data.items);\r\n } catch (err) {\r\n console.error('Failed to load available users:', err);\r\n setAvailableUsers([]);\r\n } finally {\r\n setLoadingUsers(false);\r\n }\r\n };\r\n\r\n const openAddMember = () => {\r\n setAddingMember(true);\r\n setSelectedUserId(null);\r\n setUserSearchTerm('');\r\n loadAvailableUsers();\r\n };\r\n\r\n const closeAddMember = () => {\r\n setAddingMember(false);\r\n setSelectedUserId(null);\r\n setUserSearchTerm('');\r\n setAvailableUsers([]);\r\n };\r\n\r\n const handleAddMember = async () => {\r\n if (!selectedUserId) return;\r\n setAddingMemberLoading(true);\r\n try {\r\n await adminApi.tenants.addMember(tenantId, { userId: selectedUserId });\r\n await onRefresh();\r\n closeAddMember();\r\n } catch (err) {\r\n console.error('Failed to add member:', err);\r\n } finally {\r\n setAddingMemberLoading(false);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<TenantMemberDto>[] = [\r\n {\r\n key: 'userDisplayName',\r\n label: t('common:name'),\r\n sortable: true,\r\n render: (member) => (\r\n <Link\r\n to={`/administration/users/${member.userId}`}\r\n className=\"flex items-center gap-3 hover:text-[var(--color-accent-500)]\"\r\n >\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium ${\r\n member.isOwner\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {member.isOwner ? <Crown className=\"w-4 h-4\" /> : (member.userDisplayName || member.userEmail || '?').charAt(0).toUpperCase()}\r\n </div>\r\n <div className=\"min-w-0\">\r\n <span className=\"font-medium text-[var(--text-primary)] block truncate\">{member.userDisplayName || member.userEmail}</span>\r\n {member.userEmail && member.userDisplayName && (\r\n <span className=\"text-xs text-[var(--text-tertiary)] block truncate\">{member.userEmail}</span>\r\n )}\r\n </div>\r\n </Link>\r\n )\r\n },\r\n {\r\n key: 'roles',\r\n label: t('tenants.members.role'),\r\n render: (member) => (\r\n <div className=\"flex flex-wrap gap-1\">\r\n {member.isOwner && (\r\n <span className=\"inline-flex items-center gap-1.5 px-2 py-1 text-xs rounded-[var(--radius-badge)] bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n <Crown className=\"w-3 h-3\" />\r\n {t('tenants.members.owner')}\r\n </span>\r\n )}\r\n {member.roles.length > 0 && (\r\n member.roles.map(role => (\r\n <span\r\n key={role.roleId}\r\n className=\"inline-flex items-center gap-1.5 px-2 py-1 text-xs rounded-[var(--radius-badge)] bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]\"\r\n >\r\n <Shield className=\"w-3 h-3\" />\r\n {role.roleName}\r\n </span>\r\n ))\r\n )}\r\n {member.roles.length === 0 && !member.isOwner && (\r\n <span className=\"inline-flex items-center gap-1.5 px-2 py-1 text-xs rounded-[var(--radius-badge)] bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">\r\n <User className=\"w-3 h-3\" />\r\n {t('tenants.members.member')}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n },\r\n {\r\n key: 'membershipSource',\r\n label: 'Source',\r\n hideOnMobile: true,\r\n render: (member) => {\r\n const source = member.membershipSource;\r\n if (source === 'Group') {\r\n return (\r\n <div className=\"flex items-center gap-1.5\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-purple-500/10 text-purple-600 dark:text-purple-400\">\r\n <UsersRound className=\"w-3 h-3\" />\r\n {t('tenants.members.source.group')}\r\n </span>\r\n {member.primaryGroupName && (\r\n <Link\r\n to={`/administration/users/groups/${member.primaryGroupId}`}\r\n className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)] hover:text-[var(--color-accent-500)] transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <Link2 className=\"w-3 h-3\" />\r\n {member.primaryGroupName}\r\n </Link>\r\n )}\r\n </div>\r\n );\r\n }\r\n if (source === 'Both') {\r\n return (\r\n <div className=\"flex items-center gap-1.5\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-blue-500/10 text-blue-600 dark:text-blue-400\">\r\n {t('tenants.members.source.both')}\r\n </span>\r\n {member.primaryGroupName && (\r\n <Link\r\n to={`/administration/users/groups/${member.primaryGroupId}`}\r\n className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)] hover:text-[var(--color-accent-500)] transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <Link2 className=\"w-3 h-3\" />\r\n {member.primaryGroupName}\r\n </Link>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs rounded-full bg-green-500/10 text-green-600 dark:text-green-400\">\r\n {t('tenants.members.source.direct')}\r\n </span>\r\n );\r\n }\r\n },\r\n {\r\n key: 'joinedAt',\r\n label: t('tenants.members.joinedAt'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (member) => (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">{member.joinedAt ? formatDate(member.joinedAt) : '-'}</span>\r\n )\r\n },\r\n {\r\n key: 'actions',\r\n label: t('common:actionsColumn'),\r\n align: 'right',\r\n render: (member) => (\r\n <div className=\"flex items-center justify-end gap-1\">\r\n <button\r\n onClick={(e) => { e.stopPropagation(); openRolesModal(member); }}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--color-accent-500)] hover:bg-[var(--color-accent-500)]/10 transition-colors\"\r\n title={t('tenants.members.manageRoles.title')}\r\n >\r\n <Shield className=\"w-4 h-4\" />\r\n </button>\r\n {!member.isOwner && member.membershipSource !== 'Group' && (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); onRemoveMember(member.userId); }}\r\n disabled={actionLoading === member.userId}\r\n className=\"p-2 rounded-[var(--radius-button)] text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-colors disabled:opacity-50\"\r\n title={member.membershipSource === 'Both'\r\n ? t('tenants.members.source.cannotRemoveBoth')\r\n : t('tenants.members.remove')}\r\n >\r\n {actionLoading === member.userId ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <UserMinus className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n )}\r\n {!member.isOwner && member.membershipSource === 'Group' && (\r\n <span\r\n className=\"p-2 text-[var(--text-tertiary)] opacity-40 cursor-not-allowed\"\r\n title={t('tenants.members.source.cannotRemoveGroup')}\r\n >\r\n <UserMinus className=\"w-4 h-4\" />\r\n </span>\r\n )}\r\n </div>\r\n )\r\n }\r\n ];\r\n\r\n return (\r\n <>\r\n <DataTable<TenantMemberDto>\r\n data={members ?? []}\r\n loading={loadingMembers}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('tenants.members.search')}\r\n searchFilter={(member, term) =>\r\n (member.userDisplayName || '').toLowerCase().includes(term.toLowerCase()) ||\r\n (member.userEmail || '').toLowerCase().includes(term.toLowerCase())\r\n }\r\n getRowKey={(member) => member.userId}\r\n emptyMessage={t('tenants.members.empty')}\r\n emptyIcon={<Users className=\"w-12 h-12 mx-auto text-[var(--text-tertiary)]\" />}\r\n headerActions={\r\n <button\r\n onClick={openAddMember}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.members.add')}\r\n </button>\r\n }\r\n pagination={{ pageSize: 10, showSizeSelector: true }}\r\n />\r\n\r\n {/* Manage Roles Modal */}\r\n {manageRolesState.member && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('tenants.members.manageRoles.title')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.members.manageRoles.subtitle', { name: manageRolesState.member.userDisplayName || manageRolesState.member.userEmail })}\r\n </p>\r\n </div>\r\n <button\r\n onClick={closeRolesModal}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n {loadingRoles ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-3 border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-secondary)]\">\r\n {manageRolesState.availableRoles.length === 0 ? (\r\n <p className=\"text-sm text-[var(--text-tertiary)] text-center py-4\">\r\n {t('tenants.members.manageRoles.noRolesAvailable')}\r\n </p>\r\n ) : (\r\n manageRolesState.availableRoles.map(role => (\r\n <label\r\n key={role.id}\r\n className=\"flex items-center gap-3 cursor-pointer p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={manageRolesState.selectedRoleIds.includes(role.id)}\r\n onChange={() => handleRoleToggle(role.id)}\r\n className=\"w-4 h-4 rounded border-[var(--border-color)] text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{role.name}</span>\r\n {role.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{role.description}</p>\r\n )}\r\n </div>\r\n </label>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={closeRolesModal}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveRoles}\r\n disabled={savingRoles || loadingRoles}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50\"\r\n >\r\n {savingRoles ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n t('common:save')\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Add Member Modal */}\r\n {addingMember && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('tenants.members.addTitle')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.members.addSubtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={closeAddMember}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <input\r\n type=\"text\"\r\n value={userSearchTerm}\r\n onChange={(e) => setUserSearchTerm(e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('tenants.members.searchUsers')}\r\n />\r\n </div>\r\n\r\n {loadingUsers ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-3 border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-secondary)]\">\r\n {availableUsers\r\n .filter(u =>\r\n userSearchTerm === '' ||\r\n u.fullName.toLowerCase().includes(userSearchTerm.toLowerCase()) ||\r\n u.email.toLowerCase().includes(userSearchTerm.toLowerCase())\r\n )\r\n .map(user => (\r\n <label\r\n key={user.id}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedUserId === user.id\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"selectedUser\"\r\n checked={selectedUserId === user.id}\r\n onChange={() => setSelectedUserId(user.id)}\r\n className=\"w-4 h-4 text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{user.fullName}</span>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{user.email}</p>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={closeAddMember}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleAddMember}\r\n disabled={!selectedUserId || addingMemberLoading}\r\n className=\"btn btn-primary\"\r\n >\r\n {addingMemberLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n t('common:add')\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n UsersRound,\r\n Plus,\r\n X,\r\n Cloud,\r\n Loader2,\r\n Check,\r\n} from 'lucide-react';\r\nimport type { TenantGroupDto, AvailableGroupDto } from '@/services/api/adminApi';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { groupsApi } from '@/services/api/groupsApi';\r\nimport { DataTable, type DataTableColumn } from '@/components/ui/DataTable';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\n\r\ninterface TenantGroupsTabProps {\r\n readonly tenantId: string;\r\n readonly groups: TenantGroupDto[] | null;\r\n readonly loadingGroups: boolean;\r\n readonly removingGroupId: string | null;\r\n readonly onRefresh: () => Promise<void>;\r\n readonly onRemoveGroup: (groupId: string) => Promise<void>;\r\n}\r\n\r\nfunction formatDate(date: string | Date): string {\r\n const d = new Date(date);\r\n return d.toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\nexport function TenantGroupsTab({\r\n tenantId,\r\n groups,\r\n loadingGroups,\r\n removingGroupId,\r\n onRefresh,\r\n onRemoveGroup,\r\n}: TenantGroupsTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n\r\n // Add group modal state\r\n const [addingGroup, setAddingGroup] = useState(false);\r\n const [availableGroupsForTenant, setAvailableGroupsForTenant] = useState<AvailableGroupDto[]>([]);\r\n const [loadingAvailableGroups, setLoadingAvailableGroups] = useState(false);\r\n const [selectedGroupIds, setSelectedGroupIds] = useState<string[]>([]);\r\n const [assigningGroups, setAssigningGroups] = useState(false);\r\n const [groupSearchTerm, setGroupSearchTerm] = useState('');\r\n\r\n // Remove group confirmation state\r\n const [removeConfirm, setRemoveConfirm] = useState<{ show: boolean; group: TenantGroupDto | null; loading: boolean }>({ show: false, group: null, loading: false });\r\n\r\n // Create group modal state\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [newGroupName, setNewGroupName] = useState('');\r\n const [newGroupDescription, setNewGroupDescription] = useState('');\r\n const [newGroupIsSecurityGroup, setNewGroupIsSecurityGroup] = useState(true);\r\n const [creating, setCreating] = useState(false);\r\n const [createError, setCreateError] = useState<string | null>(null);\r\n\r\n const loadAvailableGroups = async () => {\r\n setLoadingAvailableGroups(true);\r\n try {\r\n const data = await adminApi.tenants.getAvailableGroups(tenantId);\r\n setAvailableGroupsForTenant(data);\r\n } catch (err) {\r\n console.error('Failed to load available groups:', err);\r\n setAvailableGroupsForTenant([]);\r\n } finally {\r\n setLoadingAvailableGroups(false);\r\n }\r\n };\r\n\r\n const openAddGroup = () => {\r\n setAddingGroup(true);\r\n setSelectedGroupIds([]);\r\n setGroupSearchTerm('');\r\n loadAvailableGroups();\r\n };\r\n\r\n const closeAddGroup = () => {\r\n setAddingGroup(false);\r\n setSelectedGroupIds([]);\r\n setGroupSearchTerm('');\r\n };\r\n\r\n const handleGroupToggle = (groupId: string) => {\r\n setSelectedGroupIds(prev =>\r\n prev.includes(groupId)\r\n ? prev.filter(id => id !== groupId)\r\n : [...prev, groupId]\r\n );\r\n };\r\n\r\n const handleAddGroups = async () => {\r\n if (selectedGroupIds.length === 0) return;\r\n setAssigningGroups(true);\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const groupId of selectedGroupIds) {\r\n try {\r\n await adminApi.tenants.addGroupToTenant(tenantId, groupId);\r\n succeeded.push(groupId);\r\n } catch (err) {\r\n console.error(`Failed to add group ${groupId}:`, err);\r\n failed.push(groupId);\r\n }\r\n }\r\n\r\n await onRefresh();\r\n\r\n if (failed.length === 0) {\r\n closeAddGroup();\r\n } else if (succeeded.length > 0) {\r\n setSelectedGroupIds(failed);\r\n }\r\n\r\n setAssigningGroups(false);\r\n };\r\n\r\n const handleCreateGroup = async () => {\r\n if (!newGroupName.trim()) return;\r\n\r\n setCreating(true);\r\n setCreateError(null);\r\n try {\r\n // 1. Create the group\r\n const created = await groupsApi.create({\r\n name: newGroupName.trim(),\r\n description: newGroupDescription.trim() || undefined,\r\n isSecurityGroup: newGroupIsSecurityGroup,\r\n });\r\n\r\n // 2. Automatically add it to this tenant\r\n await adminApi.tenants.addGroupToTenant(tenantId, created.id);\r\n\r\n // 3. Refresh and close\r\n await onRefresh();\r\n setShowCreateModal(false);\r\n setNewGroupName('');\r\n setNewGroupDescription('');\r\n setNewGroupIsSecurityGroup(true);\r\n } catch (err) {\r\n console.error('Failed to create group:', err);\r\n const axiosError = err as { response?: { status?: number; data?: { message?: string } } };\r\n if (axiosError.response?.status === 409) {\r\n setCreateError(axiosError.response.data?.message || t('tenants.groups.createError'));\r\n } else {\r\n setCreateError(t('tenants.groups.createError'));\r\n }\r\n } finally {\r\n setCreating(false);\r\n }\r\n };\r\n\r\n const columns: DataTableColumn<TenantGroupDto>[] = [\r\n {\r\n key: 'name',\r\n label: t('common:name'),\r\n sortable: true,\r\n render: (group) => (\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium ${\r\n group.isSyncedFromEntra\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n <UsersRound className=\"w-4 h-4\" />\r\n </div>\r\n <div>\r\n <span className=\"font-medium text-[var(--color-accent-500)] hover:underline\">{group.name}</span>\r\n {group.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5\">{group.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n },\r\n {\r\n key: 'memberCount',\r\n label: t('tenants.groups.memberCount'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (group) => (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{group.memberCount}</span>\r\n )\r\n },\r\n {\r\n key: 'linkType',\r\n label: t('tenants.groups.linkType'),\r\n render: (group) => (\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isDirect\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n }`}>\r\n {group.isDirect\r\n ? t('tenants.groups.directMember')\r\n : t('tenants.groups.indirectMember', { groupName: group.linkedViaGroupName })}\r\n </span>\r\n )\r\n },\r\n {\r\n key: 'source',\r\n label: t('tenants.groups.source'),\r\n hideOnMobile: true,\r\n render: (group) => (\r\n <span className={`inline-flex items-center gap-1.5 px-2 py-1 text-xs rounded-[var(--radius-badge)] ${\r\n group.isSyncedFromEntra\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {group.isSyncedFromEntra ? (\r\n <>\r\n <Cloud className=\"w-3 h-3\" />\r\n Entra ID\r\n </>\r\n ) : (\r\n <>\r\n <UsersRound className=\"w-3 h-3\" />\r\n {t('tenants.groups.local')}\r\n </>\r\n )}\r\n </span>\r\n )\r\n },\r\n {\r\n key: 'addedAt',\r\n label: t('tenants.members.joinedAt'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (group) => (\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">\r\n {group.addedAt ? formatDate(group.addedAt) : '-'}\r\n </span>\r\n )\r\n },\r\n {\r\n key: 'actions',\r\n label: '',\r\n width: '80px',\r\n render: (group) => group.isDirect ? (\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setRemoveConfirm({ show: true, group, loading: false }); }}\r\n disabled={removingGroupId === group.groupId}\r\n className=\"btn btn-ghost text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n title={t('tenants.groups.remove')}\r\n >\r\n {removingGroupId === group.groupId ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <X className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n ) : null\r\n }\r\n ];\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <DataTable<TenantGroupDto>\r\n data={groups ?? []}\r\n loading={loadingGroups}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('tenants.groups.searchPlaceholder')}\r\n searchFilter={(group, term) =>\r\n group.name.toLowerCase().includes(term.toLowerCase()) ||\r\n (group.description || '').toLowerCase().includes(term.toLowerCase())\r\n }\r\n getRowKey={(group) => group.groupId}\r\n onRowClick={(group) => navigate(`/administration/users/groups/${group.groupId}`)}\r\n emptyMessage={t('tenants.groups.noGroups')}\r\n emptyIcon={<UsersRound className=\"w-12 h-12 mx-auto text-[var(--text-tertiary)]\" />}\r\n headerActions={\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => { setCreateError(null); setShowCreateModal(true); }}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('groups.createGroup')}\r\n </button>\r\n <button\r\n onClick={openAddGroup}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.groups.add')}\r\n </button>\r\n </div>\r\n }\r\n pagination={{ pageSize: 10, showSizeSelector: true }}\r\n />\r\n\r\n {/* Add Group Modal */}\r\n {addingGroup && (\r\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center z-50\">\r\n <div className=\"card w-full max-w-md p-6 m-4 max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <div>\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)]\">\r\n {t('tenants.groups.addTitle')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.groups.addSubtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={closeAddGroup}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <X className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"mb-4\">\r\n <input\r\n type=\"text\"\r\n value={groupSearchTerm}\r\n onChange={(e) => setGroupSearchTerm(e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('tenants.groups.searchGroups')}\r\n />\r\n </div>\r\n\r\n {loadingAvailableGroups ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (() => {\r\n const filteredGroups = availableGroupsForTenant.filter(g =>\r\n groupSearchTerm === '' ||\r\n g.name.toLowerCase().includes(groupSearchTerm.toLowerCase()) ||\r\n (g.description || '').toLowerCase().includes(groupSearchTerm.toLowerCase())\r\n );\r\n\r\n return filteredGroups.length === 0 ? (\r\n <div className=\"p-8 text-center border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-secondary)]\">\r\n <UsersRound className=\"w-12 h-12 mx-auto mb-3 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {availableGroupsForTenant.length === 0\r\n ? t('tenants.groups.noAvailableGroups')\r\n : t('tenants.groups.noMatchingGroups')}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2 max-h-64 overflow-y-auto p-3 border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-secondary)]\">\r\n {filteredGroups.map(group => (\r\n <label\r\n key={group.groupId}\r\n className={`flex items-center gap-3 cursor-pointer p-3 rounded-[var(--radius-button)] transition-colors ${\r\n selectedGroupIds.includes(group.groupId)\r\n ? 'bg-[var(--color-accent-500)]/10 border border-[var(--color-accent-500)]'\r\n : 'hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedGroupIds.includes(group.groupId)}\r\n onChange={() => handleGroupToggle(group.groupId)}\r\n className=\"w-4 h-4 rounded border-[var(--border-color)] text-[var(--color-accent-600)] focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <div className=\"flex-1\">\r\n <span className=\"text-[var(--text-primary)] font-medium\">{group.name}</span>\r\n {group.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{group.description}</p>\r\n )}\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n })()}\r\n\r\n <div className=\"flex justify-end gap-3 mt-6\">\r\n <button\r\n onClick={closeAddGroup}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleAddGroups}\r\n disabled={selectedGroupIds.length === 0 || assigningGroups}\r\n className=\"btn btn-primary\"\r\n >\r\n {assigningGroups ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n t('common:add')\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Remove Group Confirmation */}\r\n {removeConfirm.group && (\r\n <ConfirmModal\r\n isOpen={removeConfirm.show}\r\n title={t('tenants.groups.remove')}\r\n message={t('tenants.groups.confirmRemove', { name: removeConfirm.group.name })}\r\n variant=\"danger\"\r\n confirmLabel={t('tenants.groups.remove')}\r\n loading={removeConfirm.loading}\r\n onConfirm={async () => {\r\n if (!removeConfirm.group) return;\r\n setRemoveConfirm(prev => ({ ...prev, loading: true }));\r\n try {\r\n await onRemoveGroup(removeConfirm.group.groupId);\r\n } finally {\r\n setRemoveConfirm({ show: false, group: null, loading: false });\r\n }\r\n }}\r\n onCancel={() => setRemoveConfirm({ show: false, group: null, loading: false })}\r\n />\r\n )}\r\n\r\n {/* Create Group Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\">\r\n <div className=\"w-full max-w-md rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] shadow-xl m-4\">\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)]\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('tenants.groups.createTitle')}\r\n </h2>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.groups.createSubtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-hover)] text-[var(--text-tertiary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-4 space-y-4\">\r\n {createError && (\r\n <div className=\"p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-sm text-[var(--error-text)]\">\r\n <span>{createError}</span>\r\n <button onClick={() => setCreateError(null)} className=\"ml-auto\">\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('groups.groupName')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={newGroupName}\r\n onChange={(e) => setNewGroupName(e.target.value)}\r\n placeholder={t('groups.groupNamePlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('common:description')}\r\n </label>\r\n <textarea\r\n value={newGroupDescription}\r\n onChange={(e) => setNewGroupDescription(e.target.value)}\r\n placeholder={t('groups.descriptionPlaceholder')}\r\n rows={3}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setNewGroupIsSecurityGroup(!newGroupIsSecurityGroup)}\r\n className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${\r\n newGroupIsSecurityGroup\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${\r\n newGroupIsSecurityGroup ? 'translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n <span className=\"text-sm text-[var(--text-primary)]\">\r\n {t('groups.isSecurityGroup')}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-3 p-4 border-t border-[var(--border-color)]\">\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"btn btn-secondary\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreateGroup}\r\n disabled={!newGroupName.trim() || creating}\r\n className=\"btn btn-primary disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {creating ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('tenants.groups.createAndAdd')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Shield,\r\n Globe,\r\n AppWindow,\r\n Users,\r\n Lock,\r\n} from 'lucide-react';\r\nimport type { TenantRoleDto } from '@/services/api/adminApi';\r\nimport { DataTable, type DataTableColumn } from '@/components/ui/DataTable';\r\n\r\ninterface TenantRolesTabProps {\r\n readonly roles: TenantRoleDto[] | null;\r\n readonly loadingRoles: boolean;\r\n}\r\n\r\nconst CATEGORY_STYLES: Record<string, { bg: string; text: string }> = {\r\n Global: { bg: 'bg-[var(--error-bg)]', text: 'text-[var(--error-text)]' },\r\n Admin: { bg: 'bg-[var(--warning-bg)]', text: 'text-[var(--warning-text)]' },\r\n Manager: { bg: 'bg-[var(--info-bg)]', text: 'text-[var(--info-text)]' },\r\n Contributor: { bg: 'bg-[var(--success-bg)]', text: 'text-[var(--success-text)]' },\r\n Viewer: { bg: 'bg-[var(--accent-bg)]', text: 'text-[var(--accent-text)]' },\r\n};\r\n\r\nexport function TenantRolesTab({\r\n roles,\r\n loadingRoles,\r\n}: Readonly<TenantRolesTabProps>): ReactElement {\r\n const { t } = useTranslation('admin');\r\n\r\n const columns: DataTableColumn<TenantRoleDto>[] = [\r\n {\r\n key: 'name',\r\n label: t('tenants.roles.columns.name'),\r\n sortable: true,\r\n render: (role) => (\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-8 h-8 rounded-full flex items-center justify-center ${\r\n role.isSystem\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]'\r\n : 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n }`}>\r\n {role.isSystem ? <Lock className=\"w-4 h-4\" /> : <Shield className=\"w-4 h-4\" />}\r\n </div>\r\n <div>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{role.name}</span>\r\n {role.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5 line-clamp-1\">{role.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n },\r\n {\r\n key: 'category',\r\n label: t('tenants.roles.columns.category'),\r\n sortable: true,\r\n render: (role) => {\r\n const style = CATEGORY_STYLES[role.category] ?? { bg: 'bg-[var(--bg-tertiary)]', text: 'text-[var(--text-secondary)]' };\r\n return (\r\n <span className={`inline-flex items-center px-2 py-1 text-xs rounded-[var(--radius-badge)] ${style.bg} ${style.text}`}>\r\n {t(`tenants.roles.categories.${role.category}`, { defaultValue: role.category })}\r\n </span>\r\n );\r\n }\r\n },\r\n {\r\n key: 'applicationName',\r\n label: t('tenants.roles.columns.application'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (role) => (\r\n <span className=\"inline-flex items-center gap-1.5 text-sm text-[var(--text-secondary)]\">\r\n {role.applicationId ? (\r\n <>\r\n <AppWindow className=\"w-3.5 h-3.5\" />\r\n {role.applicationName}\r\n </>\r\n ) : (\r\n <>\r\n <Globe className=\"w-3.5 h-3.5\" />\r\n {t('tenants.roles.scope.global')}\r\n </>\r\n )}\r\n </span>\r\n )\r\n },\r\n {\r\n key: 'permissionsCount',\r\n label: t('tenants.roles.columns.permissions'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (role) => (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{role.permissionsCount}</span>\r\n )\r\n },\r\n {\r\n key: 'assignedMembersCount',\r\n label: t('tenants.roles.columns.members'),\r\n sortable: true,\r\n hideOnMobile: true,\r\n render: (role) => (\r\n <span className=\"inline-flex items-center gap-1.5 text-sm text-[var(--text-secondary)]\">\r\n <Users className=\"w-3.5 h-3.5\" />\r\n {role.assignedMembersCount}\r\n </span>\r\n )\r\n },\r\n ];\r\n\r\n return (\r\n <DataTable<TenantRoleDto>\r\n data={roles ?? []}\r\n loading={loadingRoles}\r\n columns={columns}\r\n searchable\r\n searchPlaceholder={t('tenants.roles.search')}\r\n searchFilter={(role, term) =>\r\n role.name.toLowerCase().includes(term.toLowerCase()) ||\r\n (role.description || '').toLowerCase().includes(term.toLowerCase()) ||\r\n (role.applicationName || '').toLowerCase().includes(term.toLowerCase())\r\n }\r\n getRowKey={(role) => role.id}\r\n emptyMessage={t('tenants.roles.empty')}\r\n emptyIcon={<Shield className=\"w-12 h-12 mx-auto text-[var(--text-tertiary)]\" />}\r\n pagination={{ pageSize: 10, showSizeSelector: true }}\r\n />\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Loader2,\r\n ChevronRight,\r\n ChevronDown,\r\n Layers,\r\n Check,\r\n Minus,\r\n Save,\r\n AlertCircle,\r\n CheckCircle,\r\n X,\r\n RotateCcw,\r\n Ban,\r\n} from 'lucide-react';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport type { TenantApplicationDto, OverrideAction } from '@/services/api/adminApi';\r\n\r\ninterface ApplicationAccessCustomizeDrawerProps {\r\n readonly isOpen: boolean;\r\n readonly onClose: () => void;\r\n readonly tenantId: string;\r\n readonly tenantName: string;\r\n readonly application: TenantApplicationDto;\r\n readonly onSaved?: () => void;\r\n /** Mode: 'tenant' for tenant-level customization, 'template' for template-level */\r\n readonly mode?: 'tenant' | 'template';\r\n}\r\n\r\ninterface DrawerModuleNode {\r\n id: string;\r\n label: string;\r\n code: string;\r\n icon: string | null;\r\n source: string;\r\n accessLevel: string;\r\n isEffectivelyActive: boolean;\r\n isChecked: boolean;\r\n originalSource: string;\r\n sections: DrawerSectionNode[];\r\n}\r\n\r\ninterface DrawerSectionNode {\r\n id: string;\r\n label: string;\r\n code: string;\r\n icon: string | null;\r\n source: string;\r\n accessLevel: string;\r\n isEffectivelyActive: boolean;\r\n isChecked: boolean;\r\n originalSource: string;\r\n}\r\n\r\ntype AccessMode = 'full' | 'custom';\r\n\r\nconst SOURCE_COLORS: Record<string, { dot: string; text: string; bg: string; label: string }> = {\r\n Inherited: { dot: 'bg-green-500', text: 'text-green-600 dark:text-green-400', bg: 'bg-green-50 dark:bg-green-900/20', label: 'inheritedLabel' },\r\n Direct: { dot: 'bg-blue-500', text: 'text-blue-600 dark:text-blue-400', bg: 'bg-blue-50 dark:bg-blue-900/20', label: 'directLabel' },\r\n Overridden: { dot: 'bg-orange-500', text: 'text-orange-600 dark:text-orange-400', bg: 'bg-orange-50 dark:bg-orange-900/20', label: 'directLabel' },\r\n Revoked: { dot: 'bg-red-500', text: 'text-red-600 dark:text-red-400', bg: 'bg-red-50 dark:bg-red-900/20', label: 'revokedLabel' },\r\n Unavailable: { dot: 'bg-gray-400', text: 'text-gray-500', bg: '', label: '' },\r\n};\r\n\r\n// Helper to compute module overrides\r\nconst computeModuleOverrides = (modules: DrawerModuleNode[]): { moduleId: string; action: OverrideAction }[] => {\r\n const overrides: { moduleId: string; action: OverrideAction }[] = [];\r\n for (const m of modules) {\r\n const wasActive = m.originalSource !== 'Revoked' && m.originalSource !== 'Unavailable';\r\n const isNowChecked = m.isChecked;\r\n\r\n if (wasActive && !isNowChecked) {\r\n overrides.push({ moduleId: m.id, action: 'revoke' });\r\n } else if (!wasActive && isNowChecked) {\r\n if (m.originalSource === 'Revoked') {\r\n overrides.push({ moduleId: m.id, action: 'remove-override' });\r\n } else {\r\n overrides.push({ moduleId: m.id, action: 'add' });\r\n }\r\n }\r\n }\r\n return overrides;\r\n};\r\n\r\n// Helper to compute section overrides\r\nconst computeSectionOverrides = (modules: DrawerModuleNode[]): { sectionId: string; action: OverrideAction }[] => {\r\n const overrides: { sectionId: string; action: OverrideAction }[] = [];\r\n for (const m of modules) {\r\n for (const s of m.sections) {\r\n const sWasActive = s.originalSource !== 'Revoked' && s.originalSource !== 'Unavailable';\r\n const sIsNowChecked = s.isChecked;\r\n\r\n if (sWasActive && !sIsNowChecked) {\r\n overrides.push({ sectionId: s.id, action: 'revoke' });\r\n } else if (!sWasActive && sIsNowChecked) {\r\n if (s.originalSource === 'Revoked') {\r\n overrides.push({ sectionId: s.id, action: 'remove-override' });\r\n } else {\r\n overrides.push({ sectionId: s.id, action: 'add' });\r\n }\r\n }\r\n }\r\n }\r\n return overrides;\r\n};\r\n\r\n// Pure function to update module check state\r\nconst updateModuleCheckStateHelper = (\r\n prev: DrawerModuleNode[],\r\n moduleId: string,\r\n newChecked: boolean\r\n): DrawerModuleNode[] => {\r\n return prev.map(m => {\r\n if (m.id !== moduleId) return m;\r\n return {\r\n ...m,\r\n isChecked: newChecked,\r\n sections: m.sections.map(s => ({ ...s, isChecked: newChecked })),\r\n };\r\n });\r\n};\r\n\r\n// Pure function to update section check state\r\nconst updateSectionCheckStateHelper = (\r\n prev: DrawerModuleNode[],\r\n moduleId: string,\r\n sectionId: string\r\n): DrawerModuleNode[] => {\r\n return prev.map(m => {\r\n if (m.id !== moduleId) return m;\r\n const newSections = m.sections.map(s =>\r\n s.id === sectionId ? { ...s, isChecked: !s.isChecked } : s\r\n );\r\n return {\r\n ...m,\r\n isChecked: newSections.some(s => s.isChecked),\r\n sections: newSections,\r\n };\r\n });\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype TranslationFn = (...args: any[]) => any;\r\n\r\ninterface SectionItemProps {\r\n readonly section: DrawerSectionNode;\r\n readonly moduleId: string;\r\n readonly renderIcon: (iconName: string | null) => React.ReactNode;\r\n readonly isInheritedRevoked: (originalSource: string, isChecked: boolean) => boolean;\r\n readonly toggleSection: (moduleId: string, sectionId: string) => void;\r\n readonly t: TranslationFn;\r\n}\r\n\r\nconst SectionItem = ({ section, moduleId, renderIcon, isInheritedRevoked: checkRevoked, toggleSection, t }: SectionItemProps) => {\r\n const sectionRevoked = checkRevoked(section.originalSource, section.isChecked);\r\n\r\n return (\r\n <div\r\n key={section.id}\r\n className={`flex items-center gap-2 p-2 rounded ${\r\n sectionRevoked\r\n ? 'bg-red-50/60 dark:bg-red-900/10 hover:bg-red-50 dark:hover:bg-red-900/20'\r\n : 'hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <button\r\n onClick={() => toggleSection(moduleId, section.id)}\r\n className={`w-4 h-4 rounded border-2 flex items-center justify-center flex-shrink-0 transition-colors ${\r\n sectionRevoked\r\n ? 'border-red-500 bg-red-500'\r\n : section.isChecked\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-600)]'\r\n }`}\r\n >\r\n {sectionRevoked && <Ban className=\"w-2.5 h-2.5 text-white\" />}\r\n {!sectionRevoked && section.isChecked && <Check className=\"w-2.5 h-2.5 text-white\" />}\r\n </button>\r\n\r\n <div className={`p-1 rounded ${sectionRevoked ? 'bg-red-100 dark:bg-red-900/30' : 'bg-[var(--bg-tertiary)]'}`}>\r\n {renderIcon(section.icon) || (\r\n <Layers className={`w-3 h-3 ${sectionRevoked ? 'text-red-400' : 'text-[var(--text-muted)]'}`} />\r\n )}\r\n </div>\r\n\r\n <span className={`text-sm flex-1 ${sectionRevoked ? 'line-through text-red-500 dark:text-red-400' : 'text-[var(--text-primary)]'}`}>{section.label}</span>\r\n {sectionRevoked && (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-400 font-medium\">\r\n {t('tenants.applications.customize.revokedLabel')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\ninterface ModuleRowProps {\r\n readonly module: DrawerModuleNode;\r\n readonly isExpanded: boolean;\r\n readonly renderIcon: (iconName: string | null) => React.ReactNode;\r\n readonly isInheritedRevoked: (originalSource: string, isChecked: boolean) => boolean;\r\n readonly getModuleCheckState: (module: DrawerModuleNode) => 'checked' | 'unchecked' | 'indeterminate';\r\n readonly toggleModuleExpand: (moduleId: string) => void;\r\n readonly toggleModule: (moduleId: string) => void;\r\n readonly toggleSection: (moduleId: string, sectionId: string) => void;\r\n readonly mode: 'tenant' | 'template';\r\n readonly t: TranslationFn;\r\n}\r\n\r\nconst ModuleRow = ({\r\n module,\r\n isExpanded,\r\n renderIcon,\r\n isInheritedRevoked: checkRevoked,\r\n getModuleCheckState,\r\n toggleModuleExpand,\r\n toggleModule,\r\n toggleSection,\r\n mode,\r\n t,\r\n}: ModuleRowProps) => {\r\n const checkState = getModuleCheckState(module);\r\n const moduleRevoked = checkRevoked(module.originalSource, module.isChecked);\r\n\r\n return (\r\n <div key={module.id}>\r\n {/* Module Row */}\r\n <div className={`flex items-center gap-2 p-3 ${\r\n moduleRevoked\r\n ? 'bg-red-50/60 dark:bg-red-900/10 hover:bg-red-50 dark:hover:bg-red-900/20'\r\n : 'hover:bg-[var(--bg-hover)]'\r\n }`}>\r\n <button\r\n onClick={() => toggleModuleExpand(module.id)}\r\n className=\"p-1 rounded hover:bg-[var(--bg-tertiary)]\"\r\n >\r\n {isExpanded ? (\r\n <ChevronDown className=\"w-4 h-4 text-[var(--text-muted)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-4 h-4 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => toggleModule(module.id)}\r\n className={`w-5 h-5 rounded border-2 flex items-center justify-center flex-shrink-0 transition-colors ${\r\n moduleRevoked\r\n ? 'border-red-500 bg-red-500'\r\n : checkState === 'checked'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]'\r\n : checkState === 'indeterminate'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-600)]'\r\n }`}\r\n >\r\n {moduleRevoked && <Ban className=\"w-3 h-3 text-white\" />}\r\n {!moduleRevoked && checkState === 'checked' && <Check className=\"w-3 h-3 text-white\" />}\r\n {!moduleRevoked && checkState === 'indeterminate' && <Minus className=\"w-3 h-3 text-white\" />}\r\n </button>\r\n\r\n <div className={`p-1.5 rounded ${moduleRevoked ? 'bg-red-100 dark:bg-red-900/30' : 'bg-[var(--bg-tertiary)]'}`}>\r\n {renderIcon(module.icon) || <Layers className={`w-4 h-4 ${moduleRevoked ? 'text-red-400' : 'text-[var(--text-muted)]'}`} />}\r\n </div>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <p className={`font-medium truncate ${moduleRevoked ? 'line-through text-red-500 dark:text-red-400' : 'text-[var(--text-primary)]'}`}>{module.label}</p>\r\n {mode !== 'template' && module.source !== 'Unavailable' && (\r\n moduleRevoked ? (\r\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-400 font-medium\">\r\n {t('tenants.applications.customize.revokedLabel')}\r\n </span>\r\n ) : (\r\n <span className={`text-[10px] px-1.5 py-0.5 rounded-full ${(SOURCE_COLORS[module.source] || SOURCE_COLORS.Inherited).bg} ${(SOURCE_COLORS[module.source] || SOURCE_COLORS.Inherited).text}`}>\r\n {t(`tenants.applications.customize.${(SOURCE_COLORS[module.source] || SOURCE_COLORS.Inherited).label}`)}\r\n </span>\r\n )\r\n )}\r\n </div>\r\n <p className={`text-xs ml-4 ${moduleRevoked ? 'text-red-400 dark:text-red-500' : 'text-[var(--text-muted)]'}`}>\r\n {module.sections.filter(s => s.isChecked).length}/{module.sections.length}{' '}\r\n {t('tenants.applications.customize.sections', 'sections')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Sections (expandable) */}\r\n {isExpanded && module.sections.length > 0 && (\r\n <div className=\"pl-12 pb-2 space-y-1 bg-[var(--bg-secondary)]\">\r\n {module.sections.map(section => (\r\n <SectionItem\r\n key={section.id}\r\n section={section}\r\n moduleId={module.id}\r\n renderIcon={renderIcon}\r\n isInheritedRevoked={checkRevoked}\r\n toggleSection={toggleSection}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport function ApplicationAccessCustomizeDrawer({\r\n isOpen,\r\n onClose,\r\n tenantId,\r\n tenantName,\r\n application,\r\n onSaved,\r\n mode = 'tenant',\r\n}: ApplicationAccessCustomizeDrawerProps): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n\r\n const [accessMode, setAccessMode] = useState<AccessMode>('full');\r\n const [modules, setModules] = useState<DrawerModuleNode[]>([]);\r\n const [expandedModules, setExpandedModules] = useState<Set<string>>(new Set());\r\n\r\n const renderIcon = (iconName: string | null) => {\r\n if (!iconName) return null;\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const IconComponent = icons[iconName];\r\n if (!IconComponent) return null;\r\n return <IconComponent className=\"w-4 h-4\" />;\r\n };\r\n\r\n const loadData = useCallback(async () => {\r\n if (!isOpen) return;\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n if (mode === 'template') {\r\n // Template mode: unchanged - use existing endpoint\r\n const treeData = await adminApi.templates.getApplicationModules(tenantId, application.applicationId);\r\n const moduleNodes: DrawerModuleNode[] = treeData.map(m => ({\r\n id: m.moduleId,\r\n label: m.label,\r\n code: m.code,\r\n icon: m.icon,\r\n source: m.isAssigned ? 'Direct' : 'Unavailable',\r\n accessLevel: 'FullAccess',\r\n isEffectivelyActive: m.isAssigned,\r\n isChecked: m.isAssigned,\r\n originalSource: m.isAssigned ? 'Direct' : 'Unavailable',\r\n sections: m.sections.map(s => ({\r\n id: s.sectionId,\r\n label: s.label,\r\n code: s.code,\r\n icon: s.icon,\r\n source: s.isAssigned ? 'Direct' : 'Unavailable',\r\n accessLevel: 'FullAccess',\r\n isEffectivelyActive: s.isAssigned,\r\n isChecked: s.isAssigned,\r\n originalSource: s.isAssigned ? 'Direct' : 'Unavailable',\r\n })),\r\n }));\r\n setModules(moduleNodes);\r\n setAccessMode(moduleNodes.some(m => m.isChecked) ? 'custom' : 'full');\r\n const expanded = new Set(moduleNodes.filter(m => m.sections.some(s => s.isChecked)).map(m => m.id));\r\n setExpandedModules(expanded);\r\n } else {\r\n // Tenant mode: use effective-tree endpoint\r\n const tree = await adminApi.tenants.getEffectiveTree(tenantId, application.applicationId);\r\n const moduleNodes: DrawerModuleNode[] = tree.map(m => ({\r\n id: m.moduleId,\r\n label: m.label,\r\n code: m.code,\r\n icon: m.icon,\r\n source: m.source,\r\n accessLevel: m.accessLevel,\r\n isEffectivelyActive: m.isEffectivelyActive,\r\n isChecked: m.source !== 'Revoked' && m.source !== 'Unavailable',\r\n originalSource: m.source,\r\n sections: m.sections.map(s => ({\r\n id: s.sectionId,\r\n label: s.label,\r\n code: s.code,\r\n icon: s.icon,\r\n source: s.source,\r\n accessLevel: s.accessLevel,\r\n isEffectivelyActive: s.isEffectivelyActive,\r\n isChecked: s.source !== 'Revoked' && s.source !== 'Unavailable',\r\n originalSource: s.source,\r\n })),\r\n }));\r\n setModules(moduleNodes);\r\n\r\n // Determine access mode\r\n const hasAnyOverride = moduleNodes.some(m =>\r\n m.source === 'Direct' || m.source === 'Overridden' || m.source === 'Revoked' ||\r\n m.sections.some(s => s.source === 'Direct' || s.source === 'Overridden' || s.source === 'Revoked')\r\n );\r\n setAccessMode(hasAnyOverride ? 'custom' : 'full');\r\n\r\n // Expand modules that have interesting content\r\n const expanded = new Set(moduleNodes\r\n .filter(m => m.sections.some(s => s.source !== 'Inherited' || !s.isEffectivelyActive))\r\n .map(m => m.id));\r\n setExpandedModules(expanded);\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load data');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [isOpen, application.applicationId, tenantId, mode]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const preCheckAllModules = (mods: DrawerModuleNode[]): DrawerModuleNode[] => {\r\n return mods.map(m => ({\r\n ...m,\r\n isChecked: true,\r\n sections: m.sections.map(s => ({ ...s, isChecked: true })),\r\n }));\r\n };\r\n\r\n const handleAccessModeChange = (newMode: AccessMode) => {\r\n if (newMode === 'custom' && accessMode === 'full') {\r\n const hasAnyChecked = modules.some(m => m.isChecked || m.sections.some(s => s.isChecked));\r\n if (!hasAnyChecked) {\r\n setModules(preCheckAllModules);\r\n }\r\n }\r\n setAccessMode(newMode);\r\n };\r\n\r\n const toggleModuleExpand = (moduleId: string) => {\r\n setExpandedModules(prev => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(moduleId)) {\r\n newSet.delete(moduleId);\r\n } else {\r\n newSet.add(moduleId);\r\n }\r\n return newSet;\r\n });\r\n };\r\n\r\n const toggleModule = (moduleId: string) => {\r\n setModules(prev => {\r\n const target = prev.find(m => m.id === moduleId);\r\n const newChecked = !target?.isChecked;\r\n return updateModuleCheckStateHelper(prev, moduleId, newChecked);\r\n });\r\n };\r\n\r\n const toggleSection = (moduleId: string, sectionId: string) => {\r\n setModules(prev => updateSectionCheckStateHelper(prev, moduleId, sectionId));\r\n };\r\n\r\n /** Returns true if this item was inherited (from template/group) and is now revoked by the user */\r\n const isInheritedRevoked = (originalSource: string, isChecked: boolean) =>\r\n (originalSource === 'Inherited' || originalSource === 'Revoked') && !isChecked;\r\n\r\n const getModuleCheckState = (module: DrawerModuleNode): 'checked' | 'unchecked' | 'indeterminate' => {\r\n if (module.sections.length === 0) {\r\n return module.isChecked ? 'checked' : 'unchecked';\r\n }\r\n const checkedCount = module.sections.filter(s => s.isChecked).length;\r\n if (checkedCount === 0) return 'unchecked';\r\n if (checkedCount === module.sections.length) return 'checked';\r\n return 'indeterminate';\r\n };\r\n\r\n const saveTemplateMode = async () => {\r\n if (accessMode === 'full') {\r\n await adminApi.templates.updateApplicationModules(tenantId, application.applicationId, {\r\n accessMode: 'full',\r\n });\r\n } else {\r\n const moduleIds = modules.filter(m => m.isChecked || m.sections.some(s => s.isChecked)).map(m => m.id);\r\n const sectionIds = modules.flatMap(m => m.sections.filter(s => s.isChecked).map(s => s.id));\r\n await adminApi.templates.updateApplicationModules(tenantId, application.applicationId, {\r\n accessMode: 'custom',\r\n moduleIds,\r\n sectionIds,\r\n });\r\n }\r\n };\r\n\r\n const saveTenantMode = async () => {\r\n const moduleOverrides = computeModuleOverrides(modules);\r\n const sectionOverrides = computeSectionOverrides(modules);\r\n\r\n if (moduleOverrides.length > 0 || sectionOverrides.length > 0) {\r\n await adminApi.tenants.saveOverrides(tenantId, application.applicationId, {\r\n modules: moduleOverrides.length > 0 ? moduleOverrides : undefined,\r\n sections: sectionOverrides.length > 0 ? sectionOverrides : undefined,\r\n });\r\n }\r\n };\r\n\r\n const handleSave = async () => {\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n try {\r\n if (mode === 'template') {\r\n await saveTemplateMode();\r\n } else {\r\n await saveTenantMode();\r\n }\r\n\r\n setSuccess(t('tenants.applications.customize.saved', 'Access customization saved'));\r\n onSaved?.();\r\n setTimeout(() => onClose(), 1000);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to save');\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleReset = async () => {\r\n setSaving(true);\r\n setError(null);\r\n try {\r\n // Remove all tenant-level overrides for modules and sections of this app\r\n const resetAction: OverrideAction = 'remove-override';\r\n const moduleOverrides = modules\r\n .filter(m => m.originalSource === 'Direct' || m.originalSource === 'Overridden' || m.originalSource === 'Revoked')\r\n .map(m => ({ moduleId: m.id, action: resetAction }));\r\n const sectionOverrides = modules.flatMap(m =>\r\n m.sections\r\n .filter(s => s.originalSource === 'Direct' || s.originalSource === 'Overridden' || s.originalSource === 'Revoked')\r\n .map(s => ({ sectionId: s.id, action: resetAction }))\r\n );\r\n\r\n if (moduleOverrides.length > 0 || sectionOverrides.length > 0) {\r\n await adminApi.tenants.saveOverrides(tenantId, application.applicationId, {\r\n modules: moduleOverrides.length > 0 ? moduleOverrides : undefined,\r\n sections: sectionOverrides.length > 0 ? sectionOverrides : undefined,\r\n });\r\n }\r\n\r\n setSuccess(t('tenants.applications.customize.resetSuccess', 'Customizations reset'));\r\n onSaved?.();\r\n setTimeout(() => onClose(), 1000);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to reset');\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const getStats = () => {\r\n const totalModules = modules.length;\r\n const checkedModules = modules.filter(m => m.isChecked).length;\r\n const totalSections = modules.reduce((sum, m) => sum + m.sections.length, 0);\r\n const checkedSections = modules.reduce((sum, m) => sum + m.sections.filter(s => s.isChecked).length, 0);\r\n const inheritedCount = modules.filter(m => m.source === 'Inherited').length;\r\n const directCount = modules.filter(m => m.source === 'Direct' || m.source === 'Overridden').length;\r\n const revokedCount = modules.filter(m => m.source === 'Revoked').length;\r\n const revokedInheritedModules = modules.filter(m => isInheritedRevoked(m.originalSource, m.isChecked)).length;\r\n const revokedInheritedSections = modules.reduce((sum, m) => sum + m.sections.filter(s => isInheritedRevoked(s.originalSource, s.isChecked)).length, 0);\r\n return { totalModules, checkedModules, totalSections, checkedSections, inheritedCount, directCount, revokedCount, revokedInheritedModules, revokedInheritedSections };\r\n };\r\n\r\n const stats = getStats();\r\n\r\n // Handle escape key\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && isOpen) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener('keydown', handleEscape);\r\n return () => document.removeEventListener('keydown', handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n // Lock body scroll when open\r\n useEffect(() => {\r\n if (isOpen) {\r\n document.body.style.overflow = 'hidden';\r\n } else {\r\n document.body.style.overflow = '';\r\n }\r\n return () => {\r\n document.body.style.overflow = '';\r\n };\r\n }, [isOpen]);\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\r\n {/* Backdrop */}\r\n <button\r\n type=\"button\"\r\n className=\"absolute inset-0 bg-black/50\"\r\n onClick={onClose}\r\n aria-label=\"Close modal\"\r\n />\r\n\r\n {/* Modal */}\r\n <div className=\"relative w-full max-w-2xl max-h-[90vh] bg-[var(--bg-card)] rounded-[var(--radius-card)] shadow-xl border border-[var(--border-color)] flex flex-col\">\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between p-4 border-b border-[var(--border-color)]\">\r\n <div>\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('tenants.applications.customize.title', 'Customize Access')}\r\n </h2>\r\n <p className=\"mt-1 text-sm text-[var(--text-muted)]\">\r\n {application.label} - {tenantName}\r\n </p>\r\n </div>\r\n <button\r\n onClick={onClose}\r\n className=\"p-1 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-muted)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto p-4\">\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n ) : (\r\n <div className=\"space-y-6\">\r\n {/* Alerts */}\r\n {error && (\r\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <AlertCircle className=\"w-4 h-4 text-[var(--error-text)]\" />\r\n <p className=\"text-sm text-[var(--error-text)]\">{error}</p>\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n <p className=\"text-sm text-[var(--success-text)]\">{success}</p>\r\n </div>\r\n )}\r\n\r\n {/* Access Mode Selection */}\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('tenants.applications.customize.accessMode', 'Access Mode')}\r\n </label>\r\n\r\n {/* Full Access Option */}\r\n <button\r\n type=\"button\"\r\n onClick={() => handleAccessModeChange('full')}\r\n className={`w-full flex items-start gap-3 p-4 rounded-[var(--radius-card)] border text-left transition-colors ${\r\n accessMode === 'full'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]/5'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div\r\n className={`w-5 h-5 mt-0.5 rounded-full border-2 flex items-center justify-center flex-shrink-0 ${\r\n accessMode === 'full' ? 'border-[var(--color-accent-600)]' : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {accessMode === 'full' && (\r\n <div className=\"w-2.5 h-2.5 rounded-full bg-[var(--color-accent-600)]\" />\r\n )}\r\n </div>\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('tenants.applications.customize.fullAccess', 'Full Application Access')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-muted)] mt-1\">\r\n {t(\r\n 'tenants.applications.customize.fullAccessHint',\r\n 'Access to all modules and sections of this application'\r\n )}\r\n </p>\r\n </div>\r\n </button>\r\n\r\n {/* Custom Access Option */}\r\n <button\r\n type=\"button\"\r\n onClick={() => handleAccessModeChange('custom')}\r\n className={`w-full flex items-start gap-3 p-4 rounded-[var(--radius-card)] border text-left transition-colors ${\r\n accessMode === 'custom'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]/5'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div\r\n className={`w-5 h-5 mt-0.5 rounded-full border-2 flex items-center justify-center flex-shrink-0 ${\r\n accessMode === 'custom' ? 'border-[var(--color-accent-600)]' : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {accessMode === 'custom' && (\r\n <div className=\"w-2.5 h-2.5 rounded-full bg-[var(--color-accent-600)]\" />\r\n )}\r\n </div>\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('tenants.applications.customize.customAccess', 'Custom Access')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-muted)] mt-1\">\r\n {t(\r\n 'tenants.applications.customize.customAccessHint',\r\n 'Select specific modules and sections to grant access'\r\n )}\r\n </p>\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Module/Section Tree (only shown in custom mode) */}\r\n {accessMode === 'custom' && (\r\n <div className=\"space-y-3\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('tenants.applications.customize.selectModules', 'Select Modules & Sections')}\r\n </label>\r\n\r\n <div className=\"border border-[var(--border-color)] rounded-[var(--radius-card)] divide-y divide-[var(--border-color)]\">\r\n {modules.map(module => (\r\n <ModuleRow\r\n key={module.id}\r\n module={module}\r\n isExpanded={expandedModules.has(module.id)}\r\n renderIcon={renderIcon}\r\n isInheritedRevoked={isInheritedRevoked}\r\n getModuleCheckState={getModuleCheckState}\r\n toggleModuleExpand={toggleModuleExpand}\r\n toggleModule={toggleModule}\r\n toggleSection={toggleSection}\r\n mode={mode}\r\n t={t}\r\n />\r\n ))}\r\n\r\n {modules.length === 0 && (\r\n <div className=\"p-6 text-center text-sm text-[var(--text-muted)]\">\r\n {t('tenants.applications.customize.noModules', 'No modules available')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"flex-shrink-0 border-t border-[var(--border-color)] p-4 bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"text-sm text-[var(--text-muted)]\">\r\n {accessMode === 'custom' ? (\r\n <div className=\"space-y-0.5\">\r\n <div>\r\n {stats.checkedModules}/{stats.totalModules} {t('tenants.applications.customize.modules', 'modules')},\r\n {' '}{stats.checkedSections}/{stats.totalSections} {t('tenants.applications.customize.sections', 'sections')}\r\n </div>\r\n {(stats.revokedInheritedModules > 0 || stats.revokedInheritedSections > 0) && (\r\n <div className=\"text-red-500 dark:text-red-400 text-xs flex items-center gap-1\">\r\n <Ban className=\"w-3 h-3\" />\r\n {stats.revokedInheritedModules > 0 && (\r\n <span>{stats.revokedInheritedModules} {t('tenants.applications.customize.modules')} {t('tenants.applications.customize.revokedLabel').toLowerCase()}</span>\r\n )}\r\n {stats.revokedInheritedModules > 0 && stats.revokedInheritedSections > 0 && ', '}\r\n {stats.revokedInheritedSections > 0 && (\r\n <span>{stats.revokedInheritedSections} {t('tenants.applications.customize.sections')} {t('tenants.applications.customize.revokedLabel').toLowerCase()}</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n t('tenants.applications.customize.fullAccessDesc', 'Full application access')\r\n )}\r\n </div>\r\n <div className=\"flex gap-2\">\r\n {mode !== 'template' && modules.some(m => m.originalSource !== 'Inherited' && m.originalSource !== 'Unavailable') && (\r\n <button\r\n onClick={handleReset}\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] font-medium text-orange-600 hover:bg-orange-50 dark:text-orange-400 dark:hover:bg-orange-900/20\"\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n {t('tenants.applications.customize.resetOverrides', 'Reset to template')}\r\n </button>\r\n )}\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] font-medium text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {t('common.cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save', 'Save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo, useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport * as LucideIcons from 'lucide-react';\r\nimport {\r\n Boxes,\r\n Plus,\r\n X,\r\n Check,\r\n Minus,\r\n SlidersHorizontal,\r\n Loader2,\r\n Search,\r\n ChevronRight,\r\n ChevronDown,\r\n CheckCircle,\r\n Layers,\r\n Trash2,\r\n ShieldX,\r\n AlertTriangle,\r\n} from 'lucide-react';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport type {\r\n TenantApplicationDto,\r\n AvailableApplicationDto,\r\n ApplicationAccessLevel,\r\n} from '@/services/api/adminApi';\r\nimport { EntityCard } from '@/components/ui/EntityCard';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport { ApplicationAccessCustomizeDrawer } from '@/components/platform/administration/ApplicationAccessCustomizeDrawer';\r\n\r\nexport interface BulkModuleNode {\r\n readonly id: string;\r\n readonly label: string;\r\n readonly code: string;\r\n readonly icon: string | null;\r\n readonly isAssigned: boolean;\r\n readonly sections: BulkSectionNode[];\r\n}\r\n\r\nexport interface BulkSectionNode {\r\n readonly id: string;\r\n readonly label: string;\r\n readonly code: string;\r\n readonly icon: string | null;\r\n readonly isAssigned: boolean;\r\n}\r\n\r\ninterface TenantApplicationsTabProps {\r\n readonly tenantId: string;\r\n readonly tenantName: string;\r\n /** Mode: 'tenant' for tenant-level, 'template' for template-level module management */\r\n readonly mode?: 'tenant' | 'template';\r\n readonly applications: TenantApplicationDto[] | null;\r\n readonly loadingApps: boolean;\r\n readonly actionLoading: string | null;\r\n readonly onRefresh: () => Promise<void>;\r\n readonly onUpdateAccessLevel: (appId: string, accessLevel: ApplicationAccessLevel) => Promise<void>;\r\n readonly onRemoveApplication?: (appId: string) => Promise<void>;\r\n // Add application modal state\r\n readonly addingApplication: boolean;\r\n readonly availableAppsError?: string | null;\r\n readonly filteredAvailableApps: AvailableApplicationDto[];\r\n readonly loadingAvailableApps: boolean;\r\n readonly selectedAppIds: string[];\r\n readonly assigningApps: boolean;\r\n readonly appSearchTerm: string;\r\n readonly selectedAccessLevel: ApplicationAccessLevel;\r\n readonly bulkAccessMode: 'full' | 'custom';\r\n readonly bulkModules: BulkModuleNode[];\r\n readonly bulkExpandedModules: Set<string>;\r\n readonly loadingBulkModules: boolean;\r\n // Customize drawer state\r\n readonly showCustomizeDrawer: boolean;\r\n readonly customizingApp: TenantApplicationDto | null;\r\n // Actions\r\n readonly onOpenAddApplication: () => void;\r\n readonly onCloseAddApplication: () => void;\r\n readonly onAssignApplications: () => Promise<void>;\r\n readonly onAppToggle: (appId: string) => void;\r\n readonly onSelectAllApps: () => void;\r\n readonly onClearAppSelection: () => void;\r\n readonly onOpenCustomizeDrawer: (app: TenantApplicationDto) => void;\r\n readonly onCloseCustomizeDrawer: () => void;\r\n // Module handlers\r\n readonly onLoadBulkModules: (appId: string) => Promise<void>;\r\n readonly onToggleBulkModuleExpand: (moduleId: string) => void;\r\n readonly onToggleBulkModule: (moduleId: string) => void;\r\n readonly onToggleBulkSection: (moduleId: string, sectionId: string) => void;\r\n readonly onGetBulkModuleCheckState: (module: BulkModuleNode) => 'checked' | 'unchecked' | 'indeterminate';\r\n readonly onGetBulkStats: () => { totalModules: number; assignedModules: number; totalSections: number; assignedSections: number };\r\n readonly onSelectAllBulkModules: () => void;\r\n readonly onClearBulkModules: () => void;\r\n // Setters\r\n readonly setAppSearchTerm: (term: string) => void;\r\n readonly setSelectedAccessLevel: (level: ApplicationAccessLevel) => void;\r\n readonly setBulkAccessMode: (mode: 'full' | 'custom') => void;\r\n}\r\n\r\nfunction formatDate(date: string | Date): string {\r\n const d = new Date(date);\r\n return d.toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\nconst getCheckStateClassName = (checkState: 'checked' | 'unchecked' | 'indeterminate'): string => {\r\n if (checkState === 'checked' || checkState === 'indeterminate') {\r\n return 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]';\r\n }\r\n return 'border-[var(--border-color)] hover:border-[var(--color-accent-600)]';\r\n};\r\n\r\nconst getLoadingView = (): React.ReactNode => (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n);\r\n\r\nconst getEmptyApplicationsView = (t: (key: string) => string): React.ReactNode => (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n <Boxes className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p>{t('tenants.applications.empty')}</p>\r\n </div>\r\n);\r\n\r\nconst ACCESS_LEVEL_OPTIONS: {\r\n level: ApplicationAccessLevel;\r\n labelKey: string;\r\n descKey: string;\r\n selectedBorder: string;\r\n selectedBg: string;\r\n dotBg: string;\r\n}[] = [\r\n {\r\n level: 'FullAccess',\r\n labelKey: 'tenants.applications.accessLevels.fullAccess',\r\n descKey: 'tenants.applications.accessLevels.fullAccessDesc',\r\n selectedBorder: 'border-green-500',\r\n selectedBg: 'bg-green-500/10',\r\n dotBg: 'bg-green-500',\r\n },\r\n {\r\n level: 'RequestAccess',\r\n labelKey: 'tenants.applications.accessLevels.requestAccess',\r\n descKey: 'tenants.applications.accessLevels.requestAccessDesc',\r\n selectedBorder: 'border-amber-500',\r\n selectedBg: 'bg-amber-500/10',\r\n dotBg: 'bg-amber-500',\r\n },\r\n {\r\n level: 'Disabled',\r\n labelKey: 'tenants.applications.accessLevels.disabled',\r\n descKey: 'tenants.applications.accessLevels.disabledDesc',\r\n selectedBorder: 'border-gray-500',\r\n selectedBg: 'bg-gray-500/10',\r\n dotBg: 'bg-gray-500',\r\n },\r\n];\r\n\r\n\r\nfunction AccessLevelSelector({\r\n selectedAccessLevel,\r\n setSelectedAccessLevel,\r\n}: {\r\n selectedAccessLevel: ApplicationAccessLevel;\r\n setSelectedAccessLevel: (level: ApplicationAccessLevel) => void;\r\n}) {\r\n const { t } = useTranslation('admin');\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {ACCESS_LEVEL_OPTIONS.map((opt) => {\r\n const isSelected = selectedAccessLevel === opt.level;\r\n return (\r\n <button\r\n key={opt.level}\r\n type=\"button\"\r\n onClick={() => setSelectedAccessLevel(opt.level)}\r\n className={`w-full flex items-start gap-3 p-4 rounded-[var(--radius-input)] border text-left transition-colors ${\r\n isSelected\r\n ? `${opt.selectedBorder} ${opt.selectedBg}`\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div\r\n className={`w-5 h-5 mt-0.5 rounded-full border-2 flex items-center justify-center flex-shrink-0 ${\r\n isSelected ? opt.selectedBorder : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {isSelected && <div className={`w-2.5 h-2.5 rounded-full ${opt.dotBg}`} />}\r\n </div>\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{t(opt.labelKey)}</p>\r\n <p className=\"text-sm text-[var(--text-muted)] mt-1\">{t(opt.descKey)}</p>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nexport function TenantApplicationsTab({\r\n tenantId,\r\n tenantName,\r\n mode = 'tenant',\r\n applications,\r\n loadingApps,\r\n actionLoading,\r\n onRefresh,\r\n onUpdateAccessLevel,\r\n onRemoveApplication,\r\n addingApplication,\r\n availableAppsError,\r\n filteredAvailableApps,\r\n loadingAvailableApps,\r\n selectedAppIds,\r\n assigningApps,\r\n appSearchTerm,\r\n selectedAccessLevel,\r\n bulkAccessMode,\r\n bulkModules,\r\n bulkExpandedModules,\r\n loadingBulkModules,\r\n showCustomizeDrawer,\r\n customizingApp,\r\n onOpenAddApplication,\r\n onCloseAddApplication,\r\n onAssignApplications,\r\n onAppToggle,\r\n onSelectAllApps,\r\n onClearAppSelection,\r\n onOpenCustomizeDrawer,\r\n onCloseCustomizeDrawer,\r\n onLoadBulkModules,\r\n onToggleBulkModuleExpand,\r\n onToggleBulkModule,\r\n onToggleBulkSection,\r\n onGetBulkModuleCheckState,\r\n onGetBulkStats,\r\n onSelectAllBulkModules,\r\n onClearBulkModules,\r\n setAppSearchTerm,\r\n setSelectedAccessLevel,\r\n setBulkAccessMode,\r\n}: TenantApplicationsTabProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n\r\n const bulkStats = useMemo(() => {\r\n return onGetBulkStats();\r\n }, [bulkModules, onGetBulkStats]);\r\n\r\n const [removeConfirm, setRemoveConfirm] = useState<{\r\n show: boolean;\r\n app: TenantApplicationDto | null;\r\n loading: boolean;\r\n }>({ show: false, app: null, loading: false });\r\n\r\n const inheritedApps = useMemo(\r\n () => (applications ?? []).filter(app => app.source === 'Inherited' || app.source === 'Overridden'),\r\n [applications]\r\n );\r\n\r\n const directApps = useMemo(\r\n () => (applications ?? []).filter(app => app.source === 'Direct' || app.source === 'Revoked'),\r\n [applications]\r\n );\r\n\r\n const renderAppCard = (app: TenantApplicationDto) => {\r\n const accessLevelOption = ACCESS_LEVEL_OPTIONS.find(o => o.level === app.accessLevel);\r\n const isActive = app.accessLevel !== 'Disabled';\r\n\r\n return (\r\n <EntityCard\r\n key={app.applicationId}\r\n avatar={{\r\n letter: (app.label?.at(0) || 'A').toUpperCase(),\r\n color: isActive ? 'var(--color-accent-500)' : '#6b7280'\r\n }}\r\n title={app.label}\r\n subtitle={app.code}\r\n description={app.assignedAt\r\n ? t('tenants.applications.assignedAt', { date: formatDate(app.assignedAt) })\r\n : undefined\r\n }\r\n stats={\r\n <span>\r\n {app.inheritedModuleCount > 0 && (\r\n <><span className=\"text-green-600 dark:text-green-400 font-medium\">{app.inheritedModuleCount}</span> {t('tenants.applications.counts.inherited')}</>\r\n )}\r\n {app.directModuleCount > 0 && (\r\n <>{app.inheritedModuleCount > 0 ? ', ' : ''}<span className=\"text-blue-600 dark:text-blue-400 font-medium\">{app.directModuleCount}</span> {t('tenants.applications.counts.direct')}</>\r\n )}\r\n {app.revokedModuleCount > 0 && (\r\n <>{(app.inheritedModuleCount > 0 || app.directModuleCount > 0) ? ', ' : ''}<span className=\"text-red-600 dark:text-red-400 font-medium\">{app.revokedModuleCount}</span> {t('tenants.applications.counts.revoked')}</>\r\n )}\r\n {app.inheritedModuleCount === 0 && app.directModuleCount === 0 && app.revokedModuleCount === 0 && (\r\n <><span className=\"font-medium text-[var(--text-primary)]\">0</span>/{app.totalModuleCount}</>\r\n )}\r\n {' '}{t('tenants.applications.customize.modules')}\r\n {' / '}\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {app.totalSectionCount}\r\n </span>{' '}\r\n {t('tenants.applications.customize.sections')}\r\n </span>\r\n }\r\n customFooter={\r\n <div className=\"space-y-2 pt-2 mt-2 border-t border-[var(--border-color)]\">\r\n {/* Access level selector */}\r\n <div className=\"flex items-center gap-2\">\r\n <div className={`w-2.5 h-2.5 rounded-full flex-shrink-0 ${accessLevelOption?.dotBg ?? 'bg-green-500'}`} />\r\n <select\r\n value={app.accessLevel}\r\n onChange={e => void onUpdateAccessLevel(app.applicationId, e.target.value as ApplicationAccessLevel)}\r\n disabled={actionLoading === app.applicationId}\r\n className=\"flex-1 px-2 py-1 rounded-[var(--radius-input)] bg-[var(--bg-secondary)] border border-[var(--border-color)] text-sm text-[var(--text-primary)] focus:ring-2 focus:ring-[var(--color-accent-600)]\"\r\n >\r\n {ACCESS_LEVEL_OPTIONS.map(opt => (\r\n <option key={opt.level} value={opt.level}>\r\n {t(opt.labelKey)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n {/* Customize + Remove buttons */}\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => onOpenCustomizeDrawer(app)}\r\n className=\"btn btn-sm flex items-center justify-center gap-1 flex-1 bg-[var(--color-accent-700)] hover:bg-[var(--color-accent-800)] text-white\"\r\n >\r\n <SlidersHorizontal className=\"w-4 h-4\" />\r\n {t('tenants.applications.customize.button')}\r\n </button>\r\n {onRemoveApplication && (\r\n <button\r\n onClick={() => setRemoveConfirm({ show: true, app, loading: false })}\r\n className=\"btn btn-sm flex items-center justify-center px-2 border border-red-300 text-red-500 hover:bg-red-50 hover:border-red-400 dark:border-red-700 dark:hover:bg-red-900/20\"\r\n title={t('tenants.applications.remove')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n }\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"space-y-4\">\r\n {/* Header with Add button */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('tenants.applications.assigned')}\r\n </h3>\r\n <button\r\n onClick={onOpenAddApplication}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.applications.add')}\r\n </button>\r\n </div>\r\n\r\n {loadingApps ? getLoadingView() : null}\r\n {!loadingApps && (!applications || applications.length === 0) ? getEmptyApplicationsView(t) : null}\r\n\r\n {/* Inherited applications section */}\r\n {!loadingApps && inheritedApps.length > 0 && (\r\n <div className=\"space-y-3\">\r\n <h4 className=\"text-base font-medium text-[var(--text-secondary)]\">\r\n {t('tenants.applications.sectionInherited')}\r\n <span className=\"ml-2 text-sm font-normal text-[var(--text-muted)]\">({inheritedApps.length})</span>\r\n </h4>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6\">\r\n {inheritedApps.map(renderAppCard)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Direct applications section */}\r\n {!loadingApps && directApps.length > 0 && (\r\n <div className=\"space-y-3\">\r\n <h4 className=\"text-base font-medium text-[var(--text-secondary)]\">\r\n {t('tenants.applications.sectionDirect')}\r\n <span className=\"ml-2 text-sm font-normal text-[var(--text-muted)]\">({directApps.length})</span>\r\n </h4>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6\">\r\n {directApps.map(renderAppCard)}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n {addingApplication && (\r\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\r\n <div className=\"w-full max-w-6xl bg-[var(--bg-card)] rounded-[var(--radius-card)] shadow-xl border border-[var(--border-color)] max-h-[90vh] flex flex-col\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between p-4 border-b border-[var(--border-color)] flex-shrink-0\">\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('tenants.applications.modal.title')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-muted)]\">\r\n {t('tenants.applications.modal.subtitle')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={onCloseAddApplication}\r\n className=\"p-1 hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)]\"\r\n aria-label={t('common:close', 'Close')}\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n {/* Three Column Content */}\r\n <div className=\"flex-1 overflow-hidden grid grid-cols-1 md:grid-cols-3 divide-x divide-[var(--border-color)]\">\r\n {/* Left Column - Application Selection */}\r\n <div className=\"flex flex-col p-4 overflow-hidden\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)]\">\r\n {t('tenants.applications.modal.selectApps')}\r\n {selectedAppIds.length > 0 && (\r\n <span className=\"ml-2 px-2 py-0.5 text-xs rounded-full bg-[var(--color-accent-600)] text-white\">\r\n {selectedAppIds.length}\r\n </span>\r\n )}\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onSelectAllApps}\r\n className=\"text-xs text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('tenants.applications.modal.selectAll')}\r\n </button>\r\n {selectedAppIds.length > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearAppSelection}\r\n className=\"text-xs text-[var(--text-muted)] hover:underline\"\r\n >\r\n {t('tenants.applications.modal.clearSelection')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Search */}\r\n <div className=\"relative mb-3\">\r\n <Search className=\"absolute left-3 top-2.5 w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={appSearchTerm}\r\n onChange={e => setAppSearchTerm(e.target.value)}\r\n placeholder={t('tenants.applications.modal.searchPlaceholder')}\r\n className=\"w-full px-3 py-2 pl-10 rounded-[var(--radius-input)] bg-[var(--bg-secondary)] border border-[var(--border-color)] text-[var(--text-primary)]\"\r\n />\r\n </div>\r\n\r\n {/* Application List */}\r\n <div className=\"flex-1 overflow-y-auto border border-[var(--border-color)] rounded-[var(--radius-input)]\">\r\n {loadingAvailableApps && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {!loadingAvailableApps && availableAppsError && (\r\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\r\n {availableAppsError === 'forbidden' ? (\r\n <>\r\n <ShieldX className=\"w-8 h-8 text-red-500 mb-2\" />\r\n <p className=\"text-sm font-medium text-red-500 mb-1\">\r\n {t('tenants.applications.modal.errorForbidden')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)]\">\r\n {t('tenants.applications.modal.errorForbiddenHint')}\r\n </p>\r\n </>\r\n ) : (\r\n <>\r\n <AlertTriangle className=\"w-8 h-8 text-amber-500 mb-2\" />\r\n <p className=\"text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.applications.modal.errorGeneric')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)]\">\r\n {t('tenants.applications.modal.errorGenericHint')}\r\n </p>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n {!loadingAvailableApps && !availableAppsError && filteredAvailableApps.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\r\n <Boxes className=\"w-8 h-8 text-[var(--text-tertiary)] mb-2\" />\r\n <p className=\"text-sm text-[var(--text-muted)]\">\r\n {t('tenants.applications.modal.noAvailable')}\r\n </p>\r\n </div>\r\n )}\r\n {!loadingAvailableApps && !availableAppsError && filteredAvailableApps.length > 0 && (\r\n filteredAvailableApps.map(app => {\r\n const isSelected = selectedAppIds.includes(app.id);\r\n return (\r\n <button\r\n key={app.id}\r\n onClick={() => onAppToggle(app.id)}\r\n className={`w-full flex items-center gap-3 px-3 py-2.5 text-left hover:bg-[var(--bg-hover)] border-b border-[var(--border-color)] last:border-b-0 ${\r\n isSelected ? 'bg-[var(--color-accent-500)]/10' : ''\r\n }`}\r\n >\r\n <div\r\n className={`w-5 h-5 rounded border-2 flex items-center justify-center flex-shrink-0 ${\r\n isSelected\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]'\r\n : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {isSelected && <CheckCircle className=\"w-3 h-3 text-white\" />}\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] truncate\">{app.label}</p>\r\n <p className=\"text-xs text-[var(--text-muted)] truncate\">\r\n {app.code}\r\n </p>\r\n </div>\r\n </button>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Middle Column - Module Customization */}\r\n <div className=\"flex flex-col p-4 overflow-hidden\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('tenants.applications.modal.moduleAccess')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-muted)] mb-4\">\r\n {t('tenants.applications.modal.moduleAccessHint')}\r\n </p>\r\n\r\n {/* Access Mode Toggle */}\r\n <div className=\"space-y-2 mb-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setBulkAccessMode('full')}\r\n className={`w-full flex items-start gap-3 p-3 rounded-[var(--radius-input)] border text-left transition-colors ${\r\n bulkAccessMode === 'full'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]/5'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div\r\n className={`w-4 h-4 mt-0.5 rounded-full border-2 flex items-center justify-center flex-shrink-0 ${\r\n bulkAccessMode === 'full' ? 'border-[var(--color-accent-600)]' : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {bulkAccessMode === 'full' && <div className=\"w-2 h-2 rounded-full bg-[var(--color-accent-600)]\" />}\r\n </div>\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('tenants.applications.customize.fullAccess')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-0.5\">\r\n {t('tenants.applications.modal.fullAccessModulesHint')}\r\n </p>\r\n </div>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setBulkAccessMode('custom');\r\n if (selectedAppIds.length > 0 && bulkModules.length === 0) {\r\n onLoadBulkModules(selectedAppIds[0]);\r\n }\r\n }}\r\n className={`w-full flex items-start gap-3 p-3 rounded-[var(--radius-input)] border text-left transition-colors ${\r\n bulkAccessMode === 'custom'\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]/5'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <div\r\n className={`w-4 h-4 mt-0.5 rounded-full border-2 flex items-center justify-center flex-shrink-0 ${\r\n bulkAccessMode === 'custom' ? 'border-[var(--color-accent-600)]' : 'border-[var(--border-color)]'\r\n }`}\r\n >\r\n {bulkAccessMode === 'custom' && <div className=\"w-2 h-2 rounded-full bg-[var(--color-accent-600)]\" />}\r\n </div>\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('tenants.applications.customize.customAccess')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-muted)] mt-0.5\">\r\n {t('tenants.applications.modal.customAccessModulesHint')}\r\n </p>\r\n </div>\r\n </button>\r\n </div>\r\n\r\n {/* Module/Section Tree (only shown in custom mode) */}\r\n {bulkAccessMode === 'custom' && (\r\n <div className=\"flex-1 overflow-hidden flex flex-col\">\r\n {selectedAppIds.length === 0 && (\r\n <p className=\"text-sm text-[var(--text-muted)] text-center py-8\">\r\n {t('tenants.applications.modal.selectAppFirst')}\r\n </p>\r\n )}\r\n {selectedAppIds.length > 0 && loadingBulkModules && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {selectedAppIds.length > 0 && !loadingBulkModules && (\r\n <>\r\n {selectedAppIds.length > 1 && (\r\n <p className=\"text-xs text-amber-600 mb-2\">\r\n {t('tenants.applications.modal.multipleAppsHint')}\r\n </p>\r\n )}\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"text-xs text-[var(--text-muted)]\">\r\n {bulkStats.assignedModules}/{bulkStats.totalModules}{' '}\r\n {t('tenants.applications.customize.modules')},\r\n {' '}{bulkStats.assignedSections}/{bulkStats.totalSections}{' '}\r\n {t('tenants.applications.customize.sections')}\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={onSelectAllBulkModules}\r\n className=\"text-xs text-[var(--color-accent-600)] hover:underline\"\r\n >\r\n {t('tenants.applications.modal.selectAllModules')}\r\n </button>\r\n {bulkStats.assignedSections > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearBulkModules}\r\n className=\"text-xs text-[var(--text-muted)] hover:underline\"\r\n >\r\n {t('tenants.applications.modal.clearModules')}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex-1 overflow-y-auto border border-[var(--border-color)] rounded-[var(--radius-input)]\">\r\n {bulkModules.map(module => {\r\n const checkState = onGetBulkModuleCheckState(module);\r\n const isExpanded = bulkExpandedModules.has(module.id);\r\n const icons = LucideIcons as unknown as Record<string, LucideIcon>;\r\n const ModuleIcon = module.icon ? icons[module.icon] : null;\r\n\r\n return (\r\n <div key={module.id} className=\"border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex items-center gap-2 p-2 hover:bg-[var(--bg-hover)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => onToggleBulkModuleExpand(module.id)}\r\n className=\"p-0.5 rounded hover:bg-[var(--bg-tertiary)]\"\r\n >\r\n {isExpanded ? (\r\n <ChevronDown className=\"w-4 h-4 text-[var(--text-muted)]\" />\r\n ) : (\r\n <ChevronRight className=\"w-4 h-4 text-[var(--text-muted)]\" />\r\n )}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => onToggleBulkModule(module.id)}\r\n className={`w-4 h-4 rounded border-2 flex items-center justify-center flex-shrink-0 transition-colors ${getCheckStateClassName(checkState)}`}\r\n >\r\n {checkState === 'checked' && <Check className=\"w-2.5 h-2.5 text-white\" />}\r\n {checkState === 'indeterminate' && <Minus className=\"w-2.5 h-2.5 text-white\" />}\r\n </button>\r\n\r\n <div className=\"p-1 rounded bg-[var(--bg-tertiary)]\">\r\n {ModuleIcon ? (\r\n <ModuleIcon className=\"w-3 h-3 text-[var(--text-muted)]\" />\r\n ) : (\r\n <Layers className=\"w-3 h-3 text-[var(--text-muted)]\" />\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium text-[var(--text-primary)] truncate\">{module.label}</p>\r\n </div>\r\n </div>\r\n\r\n {isExpanded && module.sections.length > 0 && (\r\n <div className=\"pl-10 pb-1 space-y-0.5 bg-[var(--bg-secondary)]\">\r\n {module.sections.map(section => {\r\n const SectionIcon = section.icon ? icons[section.icon] : null;\r\n return (\r\n <div key={section.id} className=\"flex items-center gap-2 p-1.5 rounded hover:bg-[var(--bg-hover)]\">\r\n <button\r\n type=\"button\"\r\n onClick={() => onToggleBulkSection(module.id, section.id)}\r\n className={`w-3.5 h-3.5 rounded border-2 flex items-center justify-center flex-shrink-0 transition-colors ${\r\n section.isAssigned\r\n ? 'border-[var(--color-accent-600)] bg-[var(--color-accent-600)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-600)]'\r\n }`}\r\n >\r\n {section.isAssigned && <Check className=\"w-2 h-2 text-white\" />}\r\n </button>\r\n\r\n <div className=\"p-0.5 rounded bg-[var(--bg-tertiary)]\">\r\n {SectionIcon ? (\r\n <SectionIcon className=\"w-3 h-3 text-[var(--text-muted)]\" />\r\n ) : (\r\n <Layers className=\"w-3 h-3 text-[var(--text-muted)]\" />\r\n )}\r\n </div>\r\n\r\n <span className=\"text-xs text-[var(--text-primary)] truncate\">{section.label}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n\r\n {bulkModules.length === 0 && (\r\n <p className=\"p-4 text-center text-sm text-[var(--text-muted)]\">\r\n {t('tenants.applications.customize.noModules')}\r\n </p>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Right Column - Access Level */}\r\n <div className=\"flex flex-col p-4\">\r\n <label className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('tenants.applications.modal.accessLevel')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-muted)] mb-4\">\r\n {t('tenants.applications.modal.accessLevelHint')}\r\n </p>\r\n <AccessLevelSelector\r\n selectedAccessLevel={selectedAccessLevel}\r\n setSelectedAccessLevel={setSelectedAccessLevel}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"flex items-center justify-between p-4 border-t border-[var(--border-color)] flex-shrink-0 bg-[var(--bg-secondary)]\">\r\n <p className=\"text-sm text-[var(--text-muted)]\">\r\n {selectedAppIds.length > 0\r\n ? t('tenants.applications.modal.selectedCount', { count: selectedAppIds.length })\r\n : t('tenants.applications.modal.noSelection')}\r\n </p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={onCloseAddApplication}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] font-medium text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={onAssignApplications}\r\n disabled={selectedAppIds.length === 0 || assigningApps}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] font-medium bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50\"\r\n >\r\n {assigningApps ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Plus className=\"w-4 h-4\" />}\r\n {t('tenants.applications.modal.assign')}\r\n {selectedAppIds.length > 0 && ` (${selectedAppIds.length})`}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Customize Access Drawer */}\r\n {customizingApp && (\r\n <ApplicationAccessCustomizeDrawer\r\n application={customizingApp}\r\n tenantId={tenantId}\r\n tenantName={tenantName}\r\n isOpen={showCustomizeDrawer}\r\n onClose={onCloseCustomizeDrawer}\r\n mode={mode}\r\n onSaved={async () => {\r\n await onRefresh();\r\n onCloseCustomizeDrawer();\r\n }}\r\n />\r\n )}\r\n\r\n {/* Remove Application Confirmation */}\r\n {removeConfirm.app && (\r\n <ConfirmModal\r\n isOpen={removeConfirm.show}\r\n title={t('tenants.applications.removeConfirm.title')}\r\n message={\r\n <div className=\"space-y-3 text-left\">\r\n <p>{t('tenants.applications.removeConfirm.message', { name: removeConfirm.app.label })}</p>\r\n <div className=\"p-3 rounded-lg bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <p className=\"text-sm font-medium text-[var(--text-primary)] mb-2\">\r\n {t('tenants.applications.removeConfirm.impactTitle')}\r\n </p>\r\n <ul className=\"text-sm text-[var(--text-secondary)] space-y-1\">\r\n <li>\r\n {t('tenants.applications.removeConfirm.impactModules', {\r\n count: removeConfirm.app.totalModuleCount,\r\n })}\r\n </li>\r\n <li>\r\n {t('tenants.applications.removeConfirm.impactSections', {\r\n count: removeConfirm.app.totalSectionCount,\r\n })}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n }\r\n variant=\"danger\"\r\n confirmLabel={t('tenants.applications.remove')}\r\n loading={removeConfirm.loading}\r\n onConfirm={async () => {\r\n if (!onRemoveApplication || !removeConfirm.app) return;\r\n setRemoveConfirm(prev => ({ ...prev, loading: true }));\r\n try {\r\n await onRemoveApplication(removeConfirm.app.applicationId);\r\n } finally {\r\n setRemoveConfirm({ show: false, app: null, loading: false });\r\n }\r\n }}\r\n onCancel={() => setRemoveConfirm({ show: false, app: null, loading: false })}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useMemo, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTenantDetail } from '@/hooks/useTenantDetail';\r\nimport { useTenantMembers } from '@/hooks/useTenantMembers';\r\nimport { useTenantGroups } from '@/hooks/useTenantGroups';\r\nimport { useTenantApplications } from '@/hooks/useTenantApplications';\r\nimport { useTenantOrganisation } from '@/hooks/useTenantOrganisation';\r\nimport { useTenantRoles } from '@/hooks/useTenantRoles';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\nimport { useNavigation } from '@/contexts/NavigationContext';\r\nimport {\r\n Building2,\r\n ArrowLeft,\r\n RefreshCw,\r\n Loader2,\r\n AlertTriangle,\r\n PlayCircle,\r\n PauseCircle,\r\n Archive,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { TenantOverviewTab, TenantMembersTab, TenantGroupsTab, TenantRolesTab, TenantApplicationsTab } from '@/components/platform/administration/tenants';\r\nimport { AccessRequestsListTab } from '@/components/platform/administration/access-requests';\r\nimport { useAccessRequests } from '@/hooks/useAccessRequests';\r\nimport { ConfirmModal, type ConfirmVariant } from '@/components/ui/ConfirmModal';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { adminApi, type TenantStatus } from '@/services/api/adminApi';\r\n\r\nconst VALID_TABS = ['overview', 'members', 'groups', 'roles', 'applications', 'requests'] as const;\r\ntype TabType = typeof VALID_TABS[number];\r\n\r\nconst STATUS_CONFIG: Record<TenantStatus, { color: string; bgColor: string; borderColor: string }> = {\r\n Pending: {\r\n color: 'text-[var(--info-text)]',\r\n bgColor: 'bg-[var(--info-bg)]',\r\n borderColor: 'border-[var(--info-border)]'\r\n },\r\n Active: {\r\n color: 'text-[var(--success-text)]',\r\n bgColor: 'bg-[var(--success-bg)]',\r\n borderColor: 'border-[var(--success-border)]'\r\n },\r\n Suspended: {\r\n color: 'text-[var(--warning-text)]',\r\n bgColor: 'bg-[var(--warning-bg)]',\r\n borderColor: 'border-[var(--warning-border)]'\r\n },\r\n Archived: {\r\n color: 'text-[var(--text-tertiary)]',\r\n bgColor: 'bg-[var(--bg-tertiary)]',\r\n borderColor: 'border-[var(--border-color)]'\r\n }\r\n};\r\n\r\nexport function TenantDetailPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const { id: tenantId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<TabType>('overview', VALID_TABS);\r\n\r\n const { refreshTenants, currentTenant } = useTenant();\r\n const { refreshMenu } = useNavigation();\r\n\r\n // Hooks for managing tenant data\r\n const tenantDetail = useTenantDetail(tenantId);\r\n const tenantMembers = useTenantMembers(tenantId);\r\n const tenantGroups = useTenantGroups(tenantId);\r\n const handleApplicationsChanged = useCallback(() => {\r\n // Refresh menu if we're editing the current tenant's applications\r\n if (currentTenant && tenantId === currentTenant.id) {\r\n refreshMenu();\r\n }\r\n }, [currentTenant, tenantId, refreshMenu]);\r\n\r\n const tenantAppOptions = useMemo(() => ({\r\n onApplicationsChanged: handleApplicationsChanged,\r\n }), [handleApplicationsChanged]);\r\n\r\n const tenantApplications = useTenantApplications(tenantId, tenantAppOptions);\r\n const tenantRoles = useTenantRoles(tenantId);\r\n const tenantOrganisation = useTenantOrganisation(tenantId);\r\n const accessRequests = useAccessRequests('tenant', tenantId!);\r\n\r\n // Minimal state needed in page\r\n const [actionLoading, setActionLoading] = useState<string | null>(null);\r\n const [confirmModal, setConfirmModal] = useState<{\r\n show: boolean;\r\n title: string;\r\n message: string;\r\n variant: ConfirmVariant;\r\n onConfirm: () => void;\r\n }>({\r\n show: false,\r\n title: '',\r\n message: '',\r\n variant: 'warning',\r\n onConfirm: () => {},\r\n });\r\n\r\n // Track which tabs have been loaded to avoid re-fetching\r\n const [loadedTabs, setLoadedTabs] = useState<Set<string>>(new Set());\r\n\r\n // Load tenant detail on mount\r\n useEffect(() => {\r\n if (!tenantId) {\r\n navigate('/administration/tenants');\r\n return;\r\n }\r\n tenantDetail.loadTenant();\r\n }, [tenantId]);\r\n\r\n // Lazy load tab data only when the tab is first selected\r\n useEffect(() => {\r\n if (!tenantId || loadedTabs.has(activeTab)) return;\r\n\r\n const loadTabData = async () => {\r\n switch (activeTab) {\r\n case 'overview':\r\n // Overview uses tenant detail (already loaded) + members for owner\r\n if (!loadedTabs.has('members')) {\r\n await tenantMembers.loadMembers();\r\n setLoadedTabs(prev => new Set(prev).add('members'));\r\n }\r\n break;\r\n case 'members':\r\n await tenantMembers.loadMembers();\r\n break;\r\n case 'groups':\r\n await tenantGroups.loadGroups();\r\n break;\r\n case 'roles':\r\n await tenantRoles.loadRoles();\r\n break;\r\n case 'applications':\r\n await tenantApplications.loadApplications();\r\n break;\r\n case 'requests':\r\n await accessRequests.loadRequests();\r\n break;\r\n }\r\n setLoadedTabs(prev => new Set(prev).add(activeTab));\r\n };\r\n\r\n loadTabData();\r\n }, [activeTab, tenantId]);\r\n\r\n const handleStatusChange = async (newStatus: TenantStatus) => {\r\n if (!tenantDetail.tenant) return;\r\n\r\n const currentStatus = tenantDetail.tenant.status;\r\n if (currentStatus === newStatus) return;\r\n\r\n const statusMessages: Record<TenantStatus, string> = {\r\n Active: t('admin:tenants.confirmActivate'),\r\n Suspended: t('admin:tenants.confirmSuspend'),\r\n Archived: t('admin:tenants.confirmArchive'),\r\n Pending: t('admin:tenants.confirmPending'),\r\n };\r\n\r\n setConfirmModal({\r\n show: true,\r\n title: t('common:confirm'),\r\n message: statusMessages[newStatus],\r\n variant: newStatus === 'Archived' ? 'danger' : 'warning',\r\n onConfirm: async () => {\r\n setActionLoading(newStatus);\r\n try {\r\n if (newStatus === 'Active') {\r\n await adminApi.tenants.activate(tenantDetail.tenant!.id);\r\n } else if (newStatus === 'Suspended') {\r\n await adminApi.tenants.suspend(tenantDetail.tenant!.id);\r\n } else if (newStatus === 'Archived') {\r\n await adminApi.tenants.archive(tenantDetail.tenant!.id);\r\n }\r\n await refreshTenants();\r\n await tenantDetail.loadTenant();\r\n } catch (error) {\r\n console.error('Failed to update tenant status:', error);\r\n } finally {\r\n setActionLoading(null);\r\n setConfirmModal({ ...confirmModal, show: false });\r\n }\r\n },\r\n });\r\n };\r\n\r\n const handleRefresh = async () => {\r\n setActionLoading('refresh');\r\n try {\r\n const promises: Promise<void>[] = [tenantDetail.loadTenant()];\r\n switch (activeTab) {\r\n case 'overview':\r\n promises.push(tenantMembers.loadMembers());\r\n break;\r\n case 'members':\r\n promises.push(tenantMembers.loadMembers());\r\n break;\r\n case 'groups':\r\n promises.push(tenantGroups.loadGroups());\r\n break;\r\n case 'roles':\r\n promises.push(tenantRoles.loadRoles());\r\n break;\r\n case 'applications':\r\n promises.push(tenantApplications.loadApplications());\r\n break;\r\n case 'requests':\r\n promises.push(accessRequests.loadRequests());\r\n break;\r\n }\r\n await Promise.all(promises);\r\n } finally {\r\n setActionLoading(null);\r\n }\r\n };\r\n\r\n if (tenantDetail.loading) {\r\n return (\r\n <div className=\"p-6 flex items-center justify-center min-h-screen\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto mb-2 text-[var(--text-secondary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('common:loading')}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!tenantDetail.tenant) {\r\n return (\r\n <div className=\"p-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n ]}\r\n />\r\n <div className=\"mt-4 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{tenantDetail.error || t('admin:tenants.notFound')}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const tenant = tenantDetail.tenant;\r\n const statusConfig = STATUS_CONFIG[tenant.status];\r\n const getStatusIcon = (status: TenantStatus) => {\r\n switch (status) {\r\n case 'Active': return <PlayCircle className=\"w-4 h-4\" />;\r\n case 'Suspended': return <PauseCircle className=\"w-4 h-4\" />;\r\n case 'Archived': return <Archive className=\"w-4 h-4\" />;\r\n default: return <Building2 className=\"w-4 h-4\" />;\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n { label: tenant.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between gap-4\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/tenants')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">{tenant.name}</h1>\r\n <p className=\"text-sm sm:text-base text-[var(--text-secondary)]\">{tenant.slug}</p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`px-3 py-1 rounded-[var(--radius-badge)] text-sm flex items-center gap-2 ${statusConfig.bgColor} ${statusConfig.color} border ${statusConfig.borderColor}`}>\r\n {getStatusIcon(tenant.status)}\r\n {t(`admin:tenants.status.${tenant.status.toLowerCase()}`)}\r\n </span>\r\n <span className={`px-3 py-1 rounded-[var(--radius-badge)] text-sm ${\r\n tenant.type === 'Business'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--accent-bg)] text-[var(--accent-text)]'\r\n }`}>\r\n {t(`admin:tenants.type.${tenant.type.toLowerCase()}`)}\r\n </span>\r\n {tenant.status !== 'Active' && tenant.status !== 'Archived' && (\r\n <button\r\n onClick={() => handleStatusChange('Active')}\r\n disabled={actionLoading !== null}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--success-dot)] text-white hover:opacity-90 transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading === 'Active' ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <PlayCircle className=\"w-4 h-4\" />}\r\n {t('admin:tenants.actions.activate')}\r\n </button>\r\n )}\r\n {tenant.status === 'Active' && (\r\n <button\r\n onClick={() => handleStatusChange('Suspended')}\r\n disabled={actionLoading !== null}\r\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--warning-dot)] text-white hover:opacity-90 transition-colors disabled:opacity-50\"\r\n >\r\n {actionLoading === 'Suspended' ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <PauseCircle className=\"w-4 h-4\" />}\r\n {t('admin:tenants.actions.suspend')}\r\n </button>\r\n )}\r\n <button\r\n onClick={() => navigate(`/administration/tenants/${tenantId}/settings`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n title={t('admin:tenants.settings.title')}\r\n >\r\n <Settings className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={actionLoading === 'refresh'}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50\"\r\n title={t('common:refresh')}\r\n >\r\n <RefreshCw className={`w-5 h-5 ${actionLoading === 'refresh' ? 'animate-spin' : ''}`} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {tenantDetail.error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{tenantDetail.error}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1 -mb-px\">\r\n {VALID_TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--primary-color)] text-[var(--primary-color)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`admin:tenants.tabs.${tab}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div>\r\n {activeTab === 'overview' && (\r\n <TenantOverviewTab\r\n tenant={tenant}\r\n tenantOwner={(() => {\r\n const owner = tenantMembers.members?.find(m => m.isOwner);\r\n return owner ? { userDisplayName: owner.userDisplayName ?? undefined, userEmail: owner.userEmail ?? undefined } : null;\r\n })()}\r\n statusConfig={STATUS_CONFIG}\r\n actionLoading={actionLoading}\r\n onRefresh={handleRefresh}\r\n onEditClick={tenantDetail.openEditGeneralInfo}\r\n onStatusChange={(action) => {\r\n const statusMap: Record<string, TenantStatus> = {\r\n activate: 'Active',\r\n suspend: 'Suspended',\r\n archive: 'Archived'\r\n };\r\n handleStatusChange(statusMap[action]);\r\n }}\r\n onMembersTabClick={() => setActiveTab('members')}\r\n onLinkOrgClick={tenantOrganisation.openLinkOrgModal}\r\n onUnlinkOrg={tenantOrganisation.handleUnlinkOrganisation}\r\n />\r\n )}\r\n\r\n {activeTab === 'members' && (\r\n <TenantMembersTab\r\n tenantId={tenantId!}\r\n members={tenantMembers.members}\r\n loadingMembers={tenantMembers.loadingMembers}\r\n actionLoading={actionLoading}\r\n onRefresh={tenantMembers.loadMembers}\r\n onRemoveMember={tenantMembers.handleRemoveMember}\r\n />\r\n )}\r\n\r\n {activeTab === 'groups' && (\r\n <TenantGroupsTab\r\n tenantId={tenantId!}\r\n groups={tenantGroups.groups}\r\n loadingGroups={tenantGroups.loadingGroups}\r\n removingGroupId={tenantGroups.removingGroupId}\r\n onRefresh={tenantGroups.loadGroups}\r\n onRemoveGroup={tenantGroups.handleRemoveGroup}\r\n />\r\n )}\r\n\r\n {activeTab === 'roles' && (\r\n <TenantRolesTab\r\n roles={tenantRoles.roles}\r\n loadingRoles={tenantRoles.loadingRoles}\r\n />\r\n )}\r\n\r\n {activeTab === 'applications' && (\r\n <TenantApplicationsTab\r\n tenantId={tenantId!}\r\n tenantName={tenant.name}\r\n applications={tenantApplications.applications}\r\n loadingApps={tenantApplications.loadingApps}\r\n actionLoading={actionLoading}\r\n onRefresh={tenantApplications.loadApplications}\r\n onUpdateAccessLevel={tenantApplications.handleUpdateAccessLevel}\r\n onRemoveApplication={tenantApplications.handleRemoveApplication}\r\n // Add application modal state\r\n addingApplication={tenantApplications.addingApplication}\r\n availableAppsError={tenantApplications.availableAppsError}\r\n filteredAvailableApps={tenantApplications.filteredAvailableApps}\r\n loadingAvailableApps={tenantApplications.loadingAvailableApps}\r\n selectedAppIds={tenantApplications.selectedAppIds}\r\n assigningApps={tenantApplications.assigningApps}\r\n appSearchTerm={tenantApplications.appSearchTerm}\r\n selectedAccessLevel={tenantApplications.selectedAccessLevel}\r\n bulkAccessMode={tenantApplications.bulkAccessMode}\r\n bulkModules={tenantApplications.bulkModules}\r\n bulkExpandedModules={tenantApplications.bulkExpandedModules}\r\n loadingBulkModules={tenantApplications.loadingBulkModules}\r\n // Customize drawer state\r\n showCustomizeDrawer={tenantApplications.showCustomizeDrawer}\r\n customizingApp={tenantApplications.customizingApp}\r\n // Actions\r\n onOpenAddApplication={tenantApplications.loadAvailableApps}\r\n onCloseAddApplication={() => {\r\n tenantApplications.setAddingApplication(false);\r\n tenantApplications.setSelectedAppIds([]);\r\n tenantApplications.setAppSearchTerm('');\r\n tenantApplications.setSelectedAccessLevel('FullAccess');\r\n tenantApplications.setBulkAccessMode('full');\r\n tenantApplications.setBulkModules([]);\r\n tenantApplications.setBulkExpandedModules(new Set());\r\n }}\r\n onAssignApplications={tenantApplications.handleAssignApplications}\r\n onAppToggle={tenantApplications.handleAppToggle}\r\n onSelectAllApps={tenantApplications.selectAllFilteredApps}\r\n onClearAppSelection={tenantApplications.clearAppSelection}\r\n onOpenCustomizeDrawer={tenantApplications.openCustomizeDrawer}\r\n onCloseCustomizeDrawer={tenantApplications.closeCustomizeDrawer}\r\n // Module handlers\r\n onLoadBulkModules={tenantApplications.loadBulkModulesForApp}\r\n onToggleBulkModuleExpand={tenantApplications.toggleBulkModuleExpand}\r\n onToggleBulkModule={tenantApplications.toggleBulkModule}\r\n onToggleBulkSection={tenantApplications.toggleBulkSection}\r\n onGetBulkModuleCheckState={tenantApplications.getBulkModuleCheckState}\r\n onGetBulkStats={tenantApplications.getBulkStats}\r\n onSelectAllBulkModules={tenantApplications.selectAllBulkModules}\r\n onClearBulkModules={tenantApplications.clearBulkModules}\r\n // Setters\r\n setAppSearchTerm={tenantApplications.setAppSearchTerm}\r\n setSelectedAccessLevel={tenantApplications.setSelectedAccessLevel}\r\n setBulkAccessMode={tenantApplications.setBulkAccessMode}\r\n />\r\n )}\r\n\r\n {activeTab === 'requests' && (\r\n <AccessRequestsListTab\r\n requests={accessRequests.requests}\r\n loading={accessRequests.loading}\r\n onReload={() => accessRequests.loadRequests()}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Organisation Linking Modal - handled by useTenantOrganisation hook */}\r\n {tenantOrganisation.showLinkOrgModal && (\r\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full mx-4\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)] mb-4\">\r\n {t('admin:tenants.organisation.linkTitle')}\r\n </h2>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">\r\n {t('admin:tenants.organisation.linkDescription')}\r\n </p>\r\n <div className=\"flex gap-2 justify-end\">\r\n <button\r\n onClick={tenantOrganisation.closeLinkOrgModal}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={() => {\r\n tenantOrganisation.openLinkOrgModal();\r\n tenantDetail.loadTenant();\r\n }}\r\n disabled={tenantOrganisation.linkingOrg}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--primary-color)] text-white hover:opacity-90 disabled:opacity-50\"\r\n >\r\n {tenantOrganisation.linkingOrg ? t('common:loading') : t('admin:tenants.organisation.link')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirm Modal */}\r\n {confirmModal.show && (\r\n <ConfirmModal\r\n title={confirmModal.title}\r\n message={confirmModal.message}\r\n variant={confirmModal.variant}\r\n isOpen={confirmModal.show}\r\n onConfirm={() => {\r\n confirmModal.onConfirm();\r\n }}\r\n onCancel={() => {\r\n setConfirmModal({ ...confirmModal, show: false });\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport {\r\n ArrowLeft,\r\n Building2,\r\n User,\r\n Building,\r\n Loader2,\r\n AlertCircle,\r\n AlertTriangle,\r\n Check,\r\n Hash,\r\n FileText,\r\n UserPlus,\r\n Info,\r\n MapPin,\r\n Phone,\r\n Mail,\r\n Globe,\r\n FileCheck,\r\n Zap,\r\n Search,\r\n Link,\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type CreateTenantB2CRequest,\r\n type CreateTenantB2BRequest,\r\n type CreateOrganisationRequest,\r\n type BusinessIdentifierType,\r\n type TenantType,\r\n type OrganisationListItemDto,\r\n} from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\n// Business Identifier Type options\r\nconst BUSINESS_IDENTIFIER_TYPES: { value: BusinessIdentifierType; label: string; country: string }[] = [\r\n { value: 'UID_CHE', label: 'CHE/IDE (Suisse)', country: 'CH' },\r\n { value: 'VAT', label: 'VAT (EU)', country: 'EU' },\r\n { value: 'SIRET', label: 'SIRET (France)', country: 'FR' },\r\n { value: 'SIREN', label: 'SIREN (France)', country: 'FR' },\r\n { value: 'KVK', label: 'KVK (Netherlands)', country: 'NL' },\r\n { value: 'CRN', label: 'CRN (UK)', country: 'GB' },\r\n { value: 'ABN', label: 'ABN (Australia)', country: 'AU' },\r\n { value: 'Other', label: 'Other', country: '' },\r\n];\r\n\r\ntype OrganisationMode = 'none' | 'create' | 'existing';\r\n\r\nfunction getTenantTypeFromUrl(typeFromUrl: string | null): TenantType {\r\n return typeFromUrl === 'b2b' ? 'Business' : 'Personal';\r\n}\r\n\r\nfunction applyConfigTypeRestrictions(config: { enableB2B: boolean; enableB2C: boolean }): TenantType {\r\n if (!config.enableB2C) return 'Business';\r\n if (!config.enableB2B) return 'Personal';\r\n return 'Personal';\r\n}\r\n\r\nfunction buildOrganisationRequest(\r\n orgName: string,\r\n orgLegalName: string,\r\n orgCountryCode: string,\r\n orgBusinessIdType: BusinessIdentifierType,\r\n orgBusinessId: string,\r\n orgVatNumber: string,\r\n addrStreet: string,\r\n addrStreet2: string,\r\n addrPostalCode: string,\r\n addrCity: string,\r\n addrState: string,\r\n addrCountry: string,\r\n addrCountryCode: string,\r\n orgPhone: string,\r\n orgEmail: string,\r\n orgWebsite: string,\r\n isFromRegistry: boolean = false\r\n): CreateOrganisationRequest {\r\n return {\r\n name: orgName,\r\n legalName: orgLegalName || undefined,\r\n countryCode: orgCountryCode,\r\n businessIdentifierType: orgBusinessIdType,\r\n businessIdentifier: orgBusinessId,\r\n vatNumber: orgVatNumber || undefined,\r\n address: {\r\n street: addrStreet,\r\n street2: addrStreet2 || undefined,\r\n postalCode: addrPostalCode,\r\n city: addrCity,\r\n state: addrState || undefined,\r\n country: addrCountry,\r\n countryCode: addrCountryCode,\r\n },\r\n phone: orgPhone || undefined,\r\n email: orgEmail || undefined,\r\n website: orgWebsite || undefined,\r\n isFromRegistry: isFromRegistry || undefined,\r\n };\r\n}\r\n\r\nexport function TenantCreatePage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const { refreshTenants } = useTenant();\r\n const typeFromUrl = searchParams.get('type');\r\n const organisationIdFromUrl = searchParams.get('organisationId');\r\n\r\n const [enableB2B, setEnableB2B] = useState<boolean | null>(null);\r\n const [enableB2C, setEnableB2C] = useState<boolean | null>(null);\r\n const [tenantType, setTenantType] = useState<TenantType>(getTenantTypeFromUrl(typeFromUrl));\r\n const [organisationMode, setOrganisationMode] = useState<OrganisationMode>(organisationIdFromUrl ? 'existing' : 'none');\r\n const [loading, setLoading] = useState(false);\r\n const [configLoading, setConfigLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [lookupLoading, setLookupLoading] = useState(false);\r\n const [lookupError, setLookupError] = useState<string | null>(null);\r\n const [lookupSuccess, setLookupSuccess] = useState(false);\r\n const [isFromRegistry, setIsFromRegistry] = useState(false);\r\n\r\n // Existing organisation selection state\r\n const [selectedOrganisation, setSelectedOrganisation] = useState<OrganisationListItemDto | null>(null);\r\n const [availableOrganisations, setAvailableOrganisations] = useState<OrganisationListItemDto[]>([]);\r\n const [orgSearchQuery, setOrgSearchQuery] = useState('');\r\n const [orgSearchLoading, setOrgSearchLoading] = useState(false);\r\n\r\n // Load multitenant config on mount\r\n useEffect(() => {\r\n const loadConfig = async () => {\r\n try {\r\n const config = await adminApi.tenants.getConfig();\r\n setEnableB2B(config.enableB2B);\r\n setEnableB2C(config.enableB2C);\r\n if (!organisationIdFromUrl) {\r\n setTenantType(applyConfigTypeRestrictions(config));\r\n }\r\n } catch (err) {\r\n console.error('Failed to load tenant config:', err);\r\n // Default to both enabled if config fails\r\n setEnableB2B(true);\r\n setEnableB2C(true);\r\n } finally {\r\n setConfigLoading(false);\r\n }\r\n };\r\n loadConfig();\r\n }, []);\r\n\r\n // Load organisation from URL param\r\n useEffect(() => {\r\n if (!organisationIdFromUrl) return;\r\n const loadOrganisation = async () => {\r\n try {\r\n const org = await adminApi.organisations.getById(organisationIdFromUrl);\r\n setSelectedOrganisation({\r\n id: org.id,\r\n name: org.name,\r\n legalName: org.legalName,\r\n countryCode: org.countryCode,\r\n businessIdentifier: org.businessIdentifier,\r\n businessIdentifierType: org.businessIdentifierType as OrganisationListItemDto['businessIdentifierType'],\r\n verificationStatus: org.verificationStatus as OrganisationListItemDto['verificationStatus'],\r\n verifiedAt: org.verifiedAt,\r\n createdAt: org.createdAt,\r\n });\r\n // Pre-fill tenant name from org name\r\n if (!name) {\r\n handleNameChange(org.name);\r\n }\r\n } catch (err) {\r\n console.error('Failed to load organisation:', err);\r\n }\r\n };\r\n loadOrganisation();\r\n }, [organisationIdFromUrl]);\r\n\r\n // Search available organisations\r\n useEffect(() => {\r\n if (organisationMode !== 'existing') return;\r\n const searchOrganisations = async () => {\r\n setOrgSearchLoading(true);\r\n try {\r\n const results = await adminApi.organisations.getAvailable(orgSearchQuery || undefined);\r\n setAvailableOrganisations(results);\r\n } catch (err) {\r\n console.error('Failed to search organisations:', err);\r\n } finally {\r\n setOrgSearchLoading(false);\r\n }\r\n };\r\n const debounce = setTimeout(searchOrganisations, 300);\r\n return () => clearTimeout(debounce);\r\n }, [organisationMode, orgSearchQuery]);\r\n\r\n // Tenant fields\r\n const [name, setName] = useState('');\r\n const [slug, setSlug] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n // Organisation fields (B2B only)\r\n const [orgName, setOrgName] = useState('');\r\n const [orgLegalName, setOrgLegalName] = useState('');\r\n const [orgCountryCode, setOrgCountryCode] = useState('CH');\r\n const [orgBusinessIdType, setOrgBusinessIdType] = useState<BusinessIdentifierType>('UID_CHE');\r\n const [orgBusinessId, setOrgBusinessId] = useState('CHE-'); // Pre-fill for Switzerland\r\n\r\n // Format CHE number: CHE-XXX.XXX.XXX\r\n const formatCheNumber = (value: string): string => {\r\n // Remove all non-alphanumeric characters except CHE prefix\r\n const cleaned = value.toUpperCase().replace(/[^A-Z0-9]/g, '');\r\n\r\n // Extract digits after CHE\r\n let digits = cleaned.startsWith('CHE') ? cleaned.slice(3) : cleaned.replace(/[^0-9]/g, '');\r\n digits = digits.slice(0, 9); // Max 9 digits\r\n\r\n // Format as CHE-XXX.XXX.XXX\r\n if (digits.length === 0) return 'CHE-';\r\n if (digits.length <= 3) return `CHE-${digits}`;\r\n if (digits.length <= 6) return `CHE-${digits.slice(0, 3)}.${digits.slice(3)}`;\r\n return `CHE-${digits.slice(0, 3)}.${digits.slice(3, 6)}.${digits.slice(6)}`;\r\n };\r\n\r\n const handleBusinessIdChange = (value: string) => {\r\n // Only format for CHE type\r\n if (orgBusinessIdType === 'UID_CHE' && orgCountryCode === 'CH') {\r\n setOrgBusinessId(formatCheNumber(value));\r\n } else {\r\n setOrgBusinessId(value);\r\n }\r\n setIsFromRegistry(false);\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n };\r\n\r\n // Update business ID when country or type changes\r\n useEffect(() => {\r\n if (orgCountryCode === 'CH' && orgBusinessIdType === 'UID_CHE') {\r\n // If empty or just \"CHE-\", keep the prefix\r\n if (!orgBusinessId || orgBusinessId === 'CHE-') {\r\n setOrgBusinessId('CHE-');\r\n } else {\r\n // Re-format existing value\r\n setOrgBusinessId(formatCheNumber(orgBusinessId));\r\n }\r\n }\r\n }, [orgCountryCode, orgBusinessIdType]);\r\n const [orgVatNumber, setOrgVatNumber] = useState('');\r\n const [orgPhone, setOrgPhone] = useState('');\r\n const [orgEmail, setOrgEmail] = useState('');\r\n const [orgWebsite, setOrgWebsite] = useState('');\r\n\r\n // Address fields\r\n const [addrStreet, setAddrStreet] = useState('');\r\n const [addrStreet2, setAddrStreet2] = useState('');\r\n const [addrPostalCode, setAddrPostalCode] = useState('');\r\n const [addrCity, setAddrCity] = useState('');\r\n const [addrState, setAddrState] = useState('');\r\n const [addrCountry, setAddrCountry] = useState('Switzerland');\r\n const [addrCountryCode, setAddrCountryCode] = useState('CH');\r\n\r\n const generateSlug = (value: string) => {\r\n return value\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '')\r\n .replace(/[^a-z0-9]+/g, '-')\r\n .replace(/(^-)|(-$)/g, '')\r\n .substring(0, 50);\r\n };\r\n\r\n const handleNameChange = (value: string) => {\r\n setName(value);\r\n if (!slug || slug === generateSlug(name)) {\r\n setSlug(generateSlug(value));\r\n }\r\n };\r\n\r\n const validateLookupInput = (): boolean => {\r\n const cleanedId = orgBusinessId.replace(/[^0-9]/g, '');\r\n if (!orgBusinessId || cleanedId.length < 9 || !orgCountryCode) {\r\n setLookupError(t('admin:tenants.create.organisation.lookupIncomplete'));\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const fillOrganisationFields = (result: Awaited<ReturnType<typeof adminApi.organisations.lookup>>) => {\r\n if (result.name) {\r\n setOrgName(result.name);\r\n if (!name) {\r\n handleNameChange(result.name);\r\n }\r\n }\r\n if (result.legalName) setOrgLegalName(result.legalName);\r\n if (result.vatNumber) setOrgVatNumber(result.vatNumber);\r\n if (result.phone) setOrgPhone(result.phone);\r\n if (result.email) setOrgEmail(result.email);\r\n if (result.website) setOrgWebsite(result.website);\r\n };\r\n\r\n const fillAddressFields = (result: Awaited<ReturnType<typeof adminApi.organisations.lookup>>) => {\r\n if (result.street) setAddrStreet(result.street);\r\n if (result.street2) setAddrStreet2(result.street2);\r\n if (result.postalCode) setAddrPostalCode(result.postalCode);\r\n if (result.city) setAddrCity(result.city);\r\n if (result.state) setAddrState(result.state);\r\n if (result.country) setAddrCountry(result.country);\r\n if (result.countryCode) setAddrCountryCode(result.countryCode);\r\n };\r\n\r\n const mapLookupError = (errorMessage: string): string => {\r\n if (errorMessage.includes('404') || errorMessage.includes('not found')) {\r\n return t('admin:tenants.create.organisation.lookupFailed');\r\n }\r\n if (errorMessage.includes('credentials') || errorMessage.includes('401')) {\r\n return t('admin:tenants.create.organisation.lookupAuthError');\r\n }\r\n return t('admin:tenants.create.organisation.lookupFailed');\r\n };\r\n\r\n const handleLookup = async () => {\r\n if (!validateLookupInput()) return;\r\n\r\n setLookupLoading(true);\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n\r\n try {\r\n const result = await adminApi.organisations.lookup(orgCountryCode, orgBusinessId);\r\n\r\n fillOrganisationFields(result);\r\n fillAddressFields(result);\r\n setIsFromRegistry(true);\r\n\r\n setLookupSuccess(true);\r\n setTimeout(() => setLookupSuccess(false), 3000);\r\n } catch (err: unknown) {\r\n console.error('[Zefix Lookup] Failed:', err);\r\n const errorMessage = err instanceof Error ? err.message : '';\r\n setLookupError(mapLookupError(errorMessage));\r\n } finally {\r\n setLookupLoading(false);\r\n }\r\n };\r\n\r\n const submitB2CTenant = async () => {\r\n const request: CreateTenantB2CRequest = {\r\n name,\r\n slug: slug || generateSlug(name),\r\n description: description || undefined,\r\n };\r\n const result = await adminApi.tenants.createB2C(request);\r\n await refreshTenants();\r\n navigate(`/administration/tenants/${result.id}`);\r\n };\r\n\r\n const submitB2BTenant = async () => {\r\n let request: CreateTenantB2BRequest;\r\n\r\n if (organisationMode === 'existing' && selectedOrganisation) {\r\n request = {\r\n name,\r\n slug: slug || generateSlug(name),\r\n description: description || undefined,\r\n organisationId: selectedOrganisation.id,\r\n };\r\n } else if (organisationMode === 'create') {\r\n const organisation = buildOrganisationRequest(\r\n orgName, orgLegalName, orgCountryCode, orgBusinessIdType, orgBusinessId,\r\n orgVatNumber, addrStreet, addrStreet2, addrPostalCode, addrCity, addrState,\r\n addrCountry, addrCountryCode, orgPhone, orgEmail, orgWebsite, isFromRegistry\r\n );\r\n request = {\r\n name,\r\n slug: slug || generateSlug(name),\r\n description: description || undefined,\r\n organisation,\r\n };\r\n } else {\r\n request = {\r\n name,\r\n slug: slug || generateSlug(name),\r\n description: description || undefined,\r\n };\r\n }\r\n\r\n const result = await adminApi.tenants.createB2B(request);\r\n await refreshTenants();\r\n navigate(`/administration/tenants/${result.id}`);\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setLoading(true);\r\n\r\n try {\r\n if (tenantType === 'Personal') {\r\n await submitB2CTenant();\r\n } else {\r\n await submitB2BTenant();\r\n }\r\n } catch (err: unknown) {\r\n console.error('Failed to create tenant:', err);\r\n const errorMessage = err instanceof Error ? err.message : t('admin:tenants.errors.createFailed');\r\n setError(errorMessage);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const getOrganisationFormValidity = (): boolean => {\r\n if (organisationMode === 'existing') return !!selectedOrganisation;\r\n if (organisationMode !== 'create') return true;\r\n return !!(orgName && orgCountryCode && orgBusinessIdType && orgBusinessId &&\r\n addrStreet && addrPostalCode && addrCity && addrCountry && addrCountryCode);\r\n };\r\n\r\n const getB2BFormValidity = (): boolean => {\r\n if (tenantType !== 'Business') return true;\r\n return !!(name && getOrganisationFormValidity());\r\n };\r\n\r\n const isFormValid = !!(name && getB2BFormValidity());\r\n\r\n return (\r\n <div className=\"container mx-auto px-4 py-6 max-w-3xl\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('tenants.create.title') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4 mb-6\">\r\n <button\r\n onClick={() => navigate('/administration/tenants')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)]\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5\" />\r\n </button>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:tenants.create.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => setError(null)}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:dismiss')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Type Selection */}\r\n <div className=\"card p-6 mb-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('admin:tenants.create.selectType')}\r\n </h2>\r\n\r\n {/* B2C Disabled Notice */}\r\n {!configLoading && enableB2C === false && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--info-text)]\">\r\n <Info className=\"w-4 h-4 flex-shrink-0\" />\r\n <span className=\"text-sm\">{t('admin:tenants.create.b2cDisabledNotice')}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* B2B Disabled Notice */}\r\n {!configLoading && enableB2B === false && (\r\n <div className=\"mb-4 p-3 rounded-[var(--radius-card)] bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--info-text)]\">\r\n <Info className=\"w-4 h-4 flex-shrink-0\" />\r\n <span className=\"text-sm\">{t('admin:tenants.create.b2bDisabledNotice')}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {configLoading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-tertiary)]\" />\r\n </div>\r\n ) : (\r\n <div className={`grid gap-4 ${enableB2C && enableB2B ? 'grid-cols-2' : 'grid-cols-1'}`}>\r\n {/* B2C Option - Only show if enabled */}\r\n {enableB2C && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setTenantType('Personal')}\r\n className={`p-4 rounded-[var(--radius-card)] border-2 transition-all text-left ${\r\n tenantType === 'Personal'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-500)]/5'\r\n : 'border-[var(--border-color)] hover:border-[var(--border-color-hover)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className={`p-2 rounded-[var(--radius-button)] ${\r\n tenantType === 'Personal'\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <User className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"font-medium text-[var(--text-primary)]\">{t('admin:tenants.type.b2c')}</p>\r\n </div>\r\n {tenantType === 'Personal' && (\r\n <Check className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.b2cDescription')}\r\n </p>\r\n </button>\r\n )}\r\n\r\n {/* B2B Option - Only show if enabled */}\r\n {enableB2B && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setTenantType('Business')}\r\n className={`p-4 rounded-[var(--radius-card)] border-2 transition-all text-left ${\r\n tenantType === 'Business'\r\n ? 'border-[var(--info-border)] bg-[var(--info-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--border-color-hover)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className={`p-2 rounded-[var(--radius-button)] ${\r\n tenantType === 'Business'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Building className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"font-medium text-[var(--text-primary)]\">{t('admin:tenants.type.b2b')}</p>\r\n </div>\r\n {tenantType === 'Business' && (\r\n <Check className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.b2bDescription')}\r\n </p>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Tenant Details */}\r\n <div className=\"card p-6 space-y-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('admin:tenants.create.details')}\r\n </h2>\r\n\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <Building2 className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => handleNameChange(e.target.value)}\r\n placeholder={t('admin:tenants.create.namePlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Slug */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <Hash className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.slug')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={slug}\r\n onChange={(e) => setSlug(generateSlug(e.target.value))}\r\n placeholder={t('admin:tenants.create.slugPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] font-mono placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:tenants.create.slugHelp')}\r\n </p>\r\n </div>\r\n\r\n {/* Description */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <FileText className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.description')}\r\n </label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={t('admin:tenants.create.descriptionPlaceholder')}\r\n rows={3}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* B2B: Organisation Mode Selection */}\r\n {tenantType === 'Business' && (\r\n <div className=\"card p-6 space-y-4\">\r\n <h2 className=\"text-lg font-semibold text-[var(--info-text)] flex items-center gap-2\">\r\n <Building className=\"w-5 h-5\" />\r\n {t('admin:tenants.create.organisation.title')}\r\n </h2>\r\n\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n {/* Quick creation (no organisation) */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOrganisationMode('none')}\r\n className={`p-4 rounded-[var(--radius-card)] border-2 transition-all text-left ${\r\n organisationMode === 'none'\r\n ? 'border-[var(--success-border)] bg-[var(--success-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--border-color-hover)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className={`p-2 rounded-[var(--radius-button)] ${\r\n organisationMode === 'none'\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Zap className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.create.organisation.quickMode')}\r\n </p>\r\n </div>\r\n {organisationMode === 'none' && (\r\n <Check className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.organisation.quickModeDescription')}\r\n </p>\r\n </button>\r\n\r\n {/* Existing organisation */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOrganisationMode('existing')}\r\n className={`p-4 rounded-[var(--radius-card)] border-2 transition-all text-left ${\r\n organisationMode === 'existing'\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-500)]/5'\r\n : 'border-[var(--border-color)] hover:border-[var(--border-color-hover)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className={`p-2 rounded-[var(--radius-button)] ${\r\n organisationMode === 'existing'\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Link className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.create.organisation.existingMode')}\r\n </p>\r\n </div>\r\n {organisationMode === 'existing' && (\r\n <Check className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.organisation.existingModeDescription')}\r\n </p>\r\n </button>\r\n\r\n {/* Create organisation */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setOrganisationMode('create')}\r\n className={`p-4 rounded-[var(--radius-card)] border-2 transition-all text-left ${\r\n organisationMode === 'create'\r\n ? 'border-[var(--info-border)] bg-[var(--info-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--border-color-hover)]'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className={`p-2 rounded-[var(--radius-button)] ${\r\n organisationMode === 'create'\r\n ? 'bg-[var(--info-bg)] text-[var(--info-text)]'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Building className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.create.organisation.createMode')}\r\n </p>\r\n </div>\r\n {organisationMode === 'create' && (\r\n <Check className=\"w-5 h-5 text-[var(--info-text)]\" />\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.create.organisation.createModeDescription')}\r\n </p>\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* B2B: Existing Organisation Selection */}\r\n {tenantType === 'Business' && organisationMode === 'existing' && (\r\n <div className=\"card p-6 space-y-4\">\r\n <h2 className=\"text-lg font-semibold text-[var(--color-accent-600)] flex items-center gap-2\">\r\n <Link className=\"w-5 h-5\" />\r\n {t('admin:tenants.create.organisation.selectExisting')}\r\n </h2>\r\n\r\n {/* Selected organisation display */}\r\n {selectedOrganisation && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{selectedOrganisation.name}</p>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {selectedOrganisation.businessIdentifier} — {selectedOrganisation.countryCode}\r\n </p>\r\n {selectedOrganisation.legalName && (\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{selectedOrganisation.legalName}</p>\r\n )}\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => setSelectedOrganisation(null)}\r\n className=\"text-sm text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n {t('common:remove')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Search input */}\r\n {!selectedOrganisation && (\r\n <>\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-3 w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <input\r\n type=\"text\"\r\n value={orgSearchQuery}\r\n onChange={(e) => setOrgSearchQuery(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.searchPlaceholder')}\r\n className=\"w-full pl-10 pr-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Results */}\r\n {orgSearchLoading && (\r\n <div className=\"flex items-center justify-center py-4\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[var(--text-tertiary)]\" />\r\n </div>\r\n )}\r\n {!orgSearchLoading && availableOrganisations.length === 0 && (\r\n <p className=\"text-sm text-[var(--text-secondary)] text-center py-4\">\r\n {t('admin:tenants.create.organisation.noResults')}\r\n </p>\r\n )}\r\n {!orgSearchLoading && availableOrganisations.length > 0 && (\r\n <div className=\"border border-[var(--border-color)] rounded-[var(--radius-card)] overflow-hidden max-h-64 overflow-y-auto\">\r\n {availableOrganisations.map((org) => (\r\n <button\r\n key={org.id}\r\n type=\"button\"\r\n onClick={() => {\r\n setSelectedOrganisation(org);\r\n if (!name) {\r\n handleNameChange(org.name);\r\n }\r\n }}\r\n className=\"w-full text-left px-4 py-3 border-b border-[var(--border-color)] last:border-b-0 hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <p className=\"font-medium text-sm text-[var(--text-primary)]\">{org.name}</p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {org.businessIdentifier} — {org.countryCode}\r\n </p>\r\n </div>\r\n <span className={`text-xs px-2 py-1 rounded-[var(--radius-badge)] ${\r\n org.verificationStatus === 'Verified'\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : org.verificationStatus === 'Pending'\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)]'\r\n : 'bg-[var(--error-bg)] text-[var(--error-text)]'\r\n }`}>\r\n {t(`admin:organisations.status.${org.verificationStatus.toLowerCase()}`, org.verificationStatus)}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* B2B: Organisation Details (only if creating) */}\r\n {tenantType === 'Business' && organisationMode === 'create' && (\r\n <div className=\"card p-6 space-y-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--info-text)] flex items-center gap-2\">\r\n <FileCheck className=\"w-5 h-5\" />\r\n {t('admin:tenants.create.organisation.details')}\r\n </h2>\r\n\r\n {/* Organisation Name */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={orgName}\r\n onChange={(e) => setOrgName(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.namePlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.legalName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={orgLegalName}\r\n onChange={(e) => setOrgLegalName(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.legalNamePlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Business Identifier */}\r\n <div className=\"p-4 bg-[var(--info-bg)] rounded-[var(--radius-card)] border border-[var(--info-border)] space-y-4\">\r\n <h3 className=\"text-sm font-semibold text-[var(--info-text)] flex items-center gap-2\">\r\n <FileCheck className=\"w-4 h-4\" />\r\n {t('admin:tenants.create.organisation.businessId.title')}\r\n </h3>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.businessId.type')} *\r\n </label>\r\n <select\r\n value={orgBusinessIdType}\r\n onChange={(e) => {\r\n const newType = e.target.value as BusinessIdentifierType;\r\n setOrgBusinessIdType(newType);\r\n // Auto-set country code based on identifier type\r\n const typeInfo = BUSINESS_IDENTIFIER_TYPES.find(t => t.value === newType);\r\n if (typeInfo?.country) {\r\n setOrgCountryCode(typeInfo.country);\r\n }\r\n }}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n >\r\n {BUSINESS_IDENTIFIER_TYPES.map((type) => (\r\n <option key={type.value} value={type.value}>\r\n {type.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.businessId.number')} *\r\n </label>\r\n <div className=\"relative flex\">\r\n <input\r\n type=\"text\"\r\n value={orgBusinessId}\r\n onChange={(e) => handleBusinessIdChange(e.target.value)}\r\n placeholder={orgBusinessIdType === 'UID_CHE' ? 'CHE-123.456.789' : t('admin:tenants.create.organisation.businessId.placeholder')}\r\n className=\"flex-1 px-4 py-2 pr-12 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] font-mono placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={handleLookup}\r\n disabled={lookupLoading || !orgBusinessId || orgBusinessId.replace(/[^0-9]/g, '').length < 9 || orgCountryCode !== 'CH'}\r\n className=\"absolute right-1 top-1 bottom-1 px-2.5 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center justify-center\"\r\n title={t('admin:tenants.create.organisation.lookupTitle')}\r\n >\r\n {lookupLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Search className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n </div>\r\n {lookupError && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1 flex items-center gap-1\">\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {lookupError}\r\n </p>\r\n )}\r\n {lookupSuccess && (\r\n <p className=\"text-xs text-[var(--success-text)] mt-1 flex items-center gap-1\">\r\n <Check className=\"w-3 h-3\" />\r\n {t('admin:tenants.create.organisation.lookupSuccess')}\r\n </p>\r\n )}\r\n {orgCountryCode === 'CH' && orgBusinessIdType === 'UID_CHE' && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {orgBusinessId.replace(/[^0-9]/g, '').length < 9\r\n ? t('admin:tenants.create.organisation.lookupHintIncomplete')\r\n : t('admin:tenants.create.organisation.lookupHint')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.vatNumber')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={orgVatNumber}\r\n onChange={(e) => setOrgVatNumber(e.target.value)}\r\n placeholder=\"CHE-123.456.789 TVA\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] font-mono placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Address */}\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)] space-y-4\">\r\n <h3 className=\"text-sm font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <MapPin className=\"w-4 h-4\" />\r\n {t('admin:tenants.create.organisation.address.title')} *\r\n </h3>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.street')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrStreet}\r\n onChange={(e) => setAddrStreet(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.address.streetPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.street2')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrStreet2}\r\n onChange={(e) => setAddrStreet2(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.address.street2Placeholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.postalCode')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrPostalCode}\r\n onChange={(e) => setAddrPostalCode(e.target.value)}\r\n placeholder=\"1000\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n <div className=\"col-span-2\">\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.city')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrCity}\r\n onChange={(e) => setAddrCity(e.target.value)}\r\n placeholder={t('admin:tenants.create.organisation.address.cityPlaceholder')}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.state')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrState}\r\n onChange={(e) => setAddrState(e.target.value)}\r\n placeholder=\"VD\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.country')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrCountry}\r\n onChange={(e) => setAddrCountry(e.target.value)}\r\n placeholder=\"Switzerland\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('admin:tenants.create.organisation.address.countryCode')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={addrCountryCode}\r\n onChange={(e) => setAddrCountryCode(e.target.value.toUpperCase().slice(0, 2))}\r\n placeholder=\"CH\"\r\n maxLength={2}\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] uppercase\"\r\n required={organisationMode === 'create'}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Contact Info */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <Phone className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.organisation.phone')}\r\n </label>\r\n <input\r\n type=\"tel\"\r\n value={orgPhone}\r\n onChange={(e) => setOrgPhone(e.target.value)}\r\n placeholder=\"+41 21 123 45 67\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <Mail className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.organisation.email')}\r\n </label>\r\n <input\r\n type=\"email\"\r\n value={orgEmail}\r\n onChange={(e) => setOrgEmail(e.target.value)}\r\n placeholder=\"contact@company.ch\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n <Globe className=\"w-4 h-4 inline mr-2\" />\r\n {t('admin:tenants.create.organisation.website')}\r\n </label>\r\n <input\r\n type=\"url\"\r\n value={orgWebsite}\r\n onChange={(e) => setOrgWebsite(e.target.value)}\r\n placeholder=\"https://www.company.ch\"\r\n className=\"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"flex items-center justify-end gap-4 pt-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/tenants')}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={loading || !isFormValid}\r\n className={`inline-flex items-center gap-2 px-6 py-2 text-sm font-medium rounded-[var(--radius-button)] text-white transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${\r\n tenantType === 'Business'\r\n ? organisationMode === 'none'\r\n ? 'bg-[var(--success-dot)] hover:opacity-90'\r\n : 'bg-[var(--info-dot)] hover:opacity-90'\r\n : 'bg-[var(--color-accent-600)] hover:bg-[var(--color-accent-700)]'\r\n }`}\r\n >\r\n {loading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <UserPlus className=\"w-4 h-4\" />\r\n )}\r\n {t('admin:tenants.create.submit')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport {\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ResponsiveContainer,\r\n Sector\r\n} from 'recharts';\r\nimport type { TopTenantDto } from '@/services/api/tenantAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface TenantActivityPieChartProps {\r\n readonly data: TopTenantDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst COLORS = [\r\n '#3b82f6', // blue-500\r\n '#22c55e', // green-500\r\n '#f59e0b', // amber-500\r\n '#ef4444', // red-500\r\n '#8b5cf6', // violet-500\r\n '#06b6d4', // cyan-500\r\n '#ec4899', // pink-500\r\n '#f97316', // orange-500\r\n '#14b8a6', // teal-500\r\n '#6366f1', // indigo-500\r\n];\r\n\r\nconst renderActiveShape = (props: unknown) => {\r\n const {\r\n cx = 0,\r\n cy = 0,\r\n midAngle = 0,\r\n innerRadius = 0,\r\n outerRadius = 0,\r\n startAngle = 0,\r\n endAngle = 0,\r\n fill = '#8884d8',\r\n payload,\r\n percent = 0,\r\n value = 0\r\n } = props as {\r\n cx?: number;\r\n cy?: number;\r\n midAngle?: number;\r\n innerRadius?: number;\r\n outerRadius?: number;\r\n startAngle?: number;\r\n endAngle?: number;\r\n fill?: string;\r\n payload: { tenantName: string; tenantType: string };\r\n percent?: number;\r\n value?: number;\r\n };\r\n\r\n if (!payload) return <g />;\r\n const RADIAN = Math.PI / 180;\r\n const sin = Math.sin(-RADIAN * midAngle);\r\n const cos = Math.cos(-RADIAN * midAngle);\r\n const sx = cx + (outerRadius + 10) * cos;\r\n const sy = cy + (outerRadius + 10) * sin;\r\n const mx = cx + (outerRadius + 30) * cos;\r\n const my = cy + (outerRadius + 30) * sin;\r\n const ex = mx + (cos >= 0 ? 1 : -1) * 22;\r\n const ey = my;\r\n const textAnchor = cos >= 0 ? 'start' : 'end';\r\n\r\n return (\r\n <g>\r\n <text x={cx} y={cy} dy={-10} textAnchor=\"middle\" fill=\"var(--text-primary)\" style={{ fontSize: '14px', fontWeight: 'bold' }}>\r\n {payload.tenantName}\r\n </text>\r\n <text x={cx} y={cy} dy={10} textAnchor=\"middle\" fill=\"var(--text-secondary)\" style={{ fontSize: '12px' }}>\r\n {value.toLocaleString()} {payload.tenantType === '_duration' ? 'min' : 'accès'}\r\n </text>\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n innerRadius={innerRadius}\r\n outerRadius={outerRadius}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n fill={fill}\r\n />\r\n <Sector\r\n cx={cx}\r\n cy={cy}\r\n startAngle={startAngle}\r\n endAngle={endAngle}\r\n innerRadius={outerRadius + 6}\r\n outerRadius={outerRadius + 10}\r\n fill={fill}\r\n />\r\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={fill} fill=\"none\" />\r\n <circle cx={ex} cy={ey} r={2} fill={fill} stroke=\"none\" />\r\n <text x={ex + (cos >= 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill=\"var(--text-primary)\" style={{ fontSize: '12px' }}>\r\n {`${(percent * 100).toFixed(0)}%`}\r\n </text>\r\n </g>\r\n );\r\n};\r\n\r\nexport const TenantActivityPieChart: React.FC<TenantActivityPieChartProps> = ({ data, mode = 'access' }) => {\r\n const [activeIndex, setActiveIndex] = useState(0);\r\n\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full text-[var(--text-secondary)]\">\r\n Aucune donnée d'activité disponible\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (tenant: TopTenantDto) =>\r\n mode === 'access' ? tenant.accessCount : tenant.totalDurationMinutes;\r\n\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n const totalValue = data.reduce((sum, t) => sum + getValue(t), 0);\r\n\r\n const chartData = data.map((tenant, index) => ({\r\n ...tenant,\r\n // Encode mode into tenantType field for activeShape to read\r\n tenantType: mode === 'duration' ? '_duration' : tenant.tenantType,\r\n name: tenant.tenantName,\r\n value: getValue(tenant),\r\n fill: COLORS[index % COLORS.length]\r\n }));\r\n\r\n const onPieEnter = (_: unknown, index: number) => {\r\n setActiveIndex(index);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col\">\r\n {/* Summary stats */}\r\n <div className=\"flex items-center gap-2 text-sm h-[34px]\">\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n Vue globale des tenants actifs\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <span className=\"text-lg font-semibold text-blue-600\">\r\n Tenants\r\n </span>\r\n <span className=\"text-[var(--text-secondary)]\">\r\n ({data.length} actifs • {totalValue.toLocaleString()} {valueLabel} total)\r\n </span>\r\n </div>\r\n\r\n {/* Pie Chart */}\r\n <div style={{ width: '100%', height: 350 }}>\r\n <ResponsiveContainer width=\"100%\" height={350}>\r\n <PieChart>\r\n <Pie\r\n {...{\r\n activeIndex,\r\n activeShape: renderActiveShape,\r\n data: chartData,\r\n cx: '50%',\r\n cy: '50%',\r\n innerRadius: 70,\r\n outerRadius: 110,\r\n fill: '#8884d8',\r\n dataKey: 'value',\r\n onMouseEnter: onPieEnter\r\n } as React.ComponentProps<typeof Pie>}\r\n >\r\n {chartData.map((entry) => (\r\n <Cell key={entry.tenantId} fill={entry.fill} />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-2 max-h-[200px] overflow-y-auto\">\r\n {chartData.map((item, index) => (\r\n <button\r\n key={item.tenantId}\r\n onClick={() => setActiveIndex(index)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n setActiveIndex(index);\r\n }\r\n }}\r\n className={`flex items-center gap-2 p-2 rounded-lg hover:bg-[var(--bg-secondary)] transition-colors cursor-pointer focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] ${\r\n activeIndex === index ? 'bg-[var(--bg-secondary)]' : ''\r\n }`}\r\n >\r\n <div\r\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\r\n style={{ backgroundColor: item.fill }}\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-sm font-medium truncate text-[var(--text-primary)]\">\r\n {item.tenantName}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {getValue(data[index]).toLocaleString()} {valueLabel}\r\n </p>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer\r\n} from 'recharts';\r\nimport { tenantAnalyticsApi } from '@/services/api/tenantAnalyticsApi';\r\nimport type { TenantTrendsDto, TenantSeriesDto } from '@/services/api/tenantAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\nimport { Loader2 } from 'lucide-react';\r\n\r\ninterface TenantUsageTrendChartProps {\r\n readonly period?: number;\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst DEFAULT_COLORS = [\r\n '#3b82f6', // blue\r\n '#22c55e', // green\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#06b6d4', // cyan\r\n '#ec4899', // pink\r\n];\r\n\r\ninterface LegendItemProps {\r\n readonly tenant: TenantSeriesDto;\r\n readonly index: number;\r\n readonly mode: ChartMode;\r\n readonly getColor: (tenant: TenantSeriesDto, index: number) => string;\r\n}\r\n\r\nfunction LegendItem({ tenant, index, mode, getColor }: LegendItemProps) {\r\n return (\r\n <div key={tenant.name} className=\"flex items-center gap-2\">\r\n <div\r\n className=\"w-3 h-3 rounded-full\"\r\n style={{ backgroundColor: getColor(tenant, index) }}\r\n />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{tenant.name}</span>\r\n <span className=\"text-sm font-semibold\" style={{ color: getColor(tenant, index) }}>\r\n {mode === 'access' ? tenant.totalAccess : `${tenant.totalDurationMinutes} min`}\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\nexport const TenantUsageTrendChart: React.FC<TenantUsageTrendChartProps> = ({ period = 30, mode = 'access' }) => {\r\n const [data, setData] = useState<TenantTrendsDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setLoading(true);\r\n const result = await tenantAnalyticsApi.getTrends(period);\r\n setData(result);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load trends');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [period]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px]\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !data) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n {error || 'Aucune donnée disponible'}\r\n </div>\r\n );\r\n }\r\n\r\n if (!data?.dailyData?.length || !data?.tenants?.length) {\r\n return (\r\n <div className=\"flex items-center justify-center h-[300px] text-[var(--text-secondary)]\">\r\n Aucune donnée de tendance disponible\r\n </div>\r\n );\r\n }\r\n\r\n // Transform data for Recharts based on mode\r\n const chartData = data.dailyData.map((day) => {\r\n const entry: Record<string, string | number> = {\r\n date: new Date(day.date).toLocaleDateString('fr-FR', {\r\n day: '2-digit',\r\n month: 'short'\r\n })\r\n };\r\n data.tenants.forEach((tenant) => {\r\n if (mode === 'access') {\r\n entry[tenant.name] = day.tenantCounts[tenant.name] || 0;\r\n } else {\r\n entry[tenant.name] = day.tenantDurations?.[tenant.name] || 0;\r\n }\r\n });\r\n return entry;\r\n });\r\n\r\n const getColor = (tenant: TenantSeriesDto, index: number): string => {\r\n return tenant.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length];\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Chart */}\r\n <div style={{ width: '100%', height: 300 }}>\r\n <ResponsiveContainer width=\"100%\" height={300}>\r\n <LineChart\r\n data={chartData}\r\n margin={{ top: 5, right: 30, left: 20, bottom: 5 }}\r\n >\r\n <CartesianGrid\r\n strokeDasharray=\"3 3\"\r\n stroke=\"var(--border-color)\"\r\n />\r\n <XAxis\r\n dataKey=\"date\"\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n />\r\n <YAxis\r\n stroke=\"var(--text-secondary)\"\r\n style={{ fontSize: '11px' }}\r\n tick={{ fill: 'var(--text-secondary)' }}\r\n label={{\r\n value: mode === 'access' ? 'Accès' : 'Minutes',\r\n angle: -90,\r\n position: 'insideLeft',\r\n style: { fill: 'var(--text-secondary)', fontSize: '11px' }\r\n }}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)'\r\n }}\r\n labelStyle={{ color: 'var(--text-primary)', fontWeight: 'bold', marginBottom: '8px' }}\r\n itemStyle={{ color: 'var(--text-secondary)' }}\r\n />\r\n <Legend\r\n wrapperStyle={{\r\n paddingTop: '20px'\r\n }}\r\n formatter={(value) => (\r\n <span style={{ color: 'var(--text-secondary)', fontSize: '12px' }}>{value}</span>\r\n )}\r\n />\r\n {data.tenants.map((tenant, index) => (\r\n <Line\r\n key={tenant.name}\r\n type=\"monotone\"\r\n dataKey={tenant.name}\r\n stroke={getColor(tenant, index)}\r\n strokeWidth={2}\r\n dot={{ r: 2, fill: getColor(tenant, index) }}\r\n activeDot={{ r: 5, fill: getColor(tenant, index) }}\r\n />\r\n ))}\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n {/* Legend with totals */}\r\n <div className=\"flex flex-wrap gap-4 justify-center border-t border-[var(--border-color)] pt-4\">\r\n {data.tenants.map((tenant, index) => (\r\n <LegendItem key={tenant.name} tenant={tenant} index={index} mode={mode} getColor={getColor} />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Users, Building2 } from 'lucide-react';\r\nimport type { TopTenantDto } from '@/services/api/tenantAnalyticsApi';\r\nimport type { ChartMode } from './UsageTrendChart';\r\n\r\ninterface TenantPopularityChartProps {\r\n readonly data: TopTenantDto[];\r\n readonly mode?: ChartMode;\r\n}\r\n\r\nconst tenantColors = [\r\n '#3b82f6',\r\n '#8b5cf6',\r\n '#22c55e',\r\n '#f59e0b',\r\n '#ef4444',\r\n '#06b6d4',\r\n '#ec4899',\r\n '#10b981',\r\n '#f97316',\r\n '#6366f1'\r\n];\r\n\r\nexport const TenantPopularityChart: React.FC<TenantPopularityChartProps> = ({ data, mode = 'access' }) => {\r\n if (!data || data.length === 0) {\r\n return (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n Aucune donnée de tenant disponible\r\n </div>\r\n );\r\n }\r\n\r\n const getValue = (tenant: TopTenantDto) =>\r\n mode === 'access' ? tenant.accessCount : tenant.totalDurationMinutes;\r\n const valueLabel = mode === 'access' ? 'accès' : 'min';\r\n\r\n const maxCount = Math.max(...data.map(t => getValue(t)), 1);\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {data.map((tenant, index) => {\r\n const value = getValue(tenant);\r\n const percentage = (value / maxCount) * 100;\r\n\r\n return (\r\n <div\r\n key={tenant.tenantId}\r\n className=\"rounded-lg bg-[var(--bg-secondary)] p-4 hover:shadow-sm transition-shadow border-l-4\"\r\n style={{ borderLeftColor: tenantColors[index % tenantColors.length] }}\r\n >\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <div className=\"flex-1\">\r\n {/* Tenant type badge */}\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-1 font-mono\">\r\n <span className=\"text-blue-500\">{tenant.tenantType}</span>\r\n <span className=\"mx-1\">›</span>\r\n <span className=\"text-green-500\">{tenant.tenantSlug}</span>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <h5 className=\"font-semibold text-[var(--text-primary)]\">\r\n {tenant.tenantName}\r\n </h5>\r\n </div>\r\n </div>\r\n <div className=\"text-right\">\r\n <div className=\"text-xl font-bold\" style={{ color: tenantColors[index % tenantColors.length] }}>\r\n {value.toLocaleString()}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{valueLabel}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-2 bg-[var(--bg-primary)] rounded-full overflow-hidden mb-2\">\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${percentage}%`,\r\n backgroundColor: tenantColors[index % tenantColors.length]\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 text-xs text-[var(--text-secondary)]\">\r\n <div className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n <span>{tenant.uniqueUsers} utilisateurs uniques</span>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <Building2 className=\"w-3 h-3\" />\r\n <span>{tenant.tenantType}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n","import type { ReactElement } from 'react';\r\nimport React, { useEffect, useState, useCallback } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AlertTriangle,\r\n Building2,\r\n Users,\r\n Activity,\r\n TrendingUp,\r\n Loader2,\r\n RefreshCw,\r\n Clock,\r\n PauseCircle,\r\n CheckCircle,\r\n Timer,\r\n ShieldCheck,\r\n ShieldX,\r\n ClipboardList\r\n} from 'lucide-react';\r\nimport { tenantAnalyticsApi } from '@/services/api/tenantAnalyticsApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport type {\r\n TenantDashboardStatsDto,\r\n TopTenantDto\r\n} from '@/services/api/tenantAnalyticsApi';\r\nimport { TenantActivityPieChart } from '@/components/dashboard/TenantActivityPieChart';\r\nimport { TenantUsageTrendChart } from '@/components/dashboard/TenantUsageTrendChart';\r\nimport { TenantPopularityChart } from '@/components/dashboard/TenantPopularityChart';\r\nimport type { ChartMode } from '@/components/dashboard/UsageTrendChart';\r\n\r\nconst KpiCard: React.FC<{\r\n label: string;\r\n value: number | string;\r\n icon: React.ReactNode;\r\n color: 'blue' | 'green' | 'purple' | 'orange' | 'yellow' | 'red';\r\n subtitle?: string;\r\n}> = ({ label, value, icon, color, subtitle }) => {\r\n const iconColors = {\r\n blue: 'text-blue-500',\r\n green: 'text-green-500',\r\n purple: 'text-purple-500',\r\n orange: 'text-orange-500',\r\n yellow: 'text-yellow-500',\r\n red: 'text-red-500'\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--item-color-border)]\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-[var(--text-secondary)]\">{label}</span>\r\n <div className={iconColors[color]}>{icon}</div>\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--text-primary)]\">{typeof value === 'number' ? value.toLocaleString() : value}</div>\r\n {subtitle && <div className=\"text-xs text-[var(--text-tertiary)] mt-1\">{subtitle}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport function TenantsDashboardPage(): ReactElement {\r\n const navigate = useNavigate();\r\n const { t } = useTranslation('admin');\r\n const [stats, setStats] = useState<TenantDashboardStatsDto | null>(null);\r\n const [topTenants, setTopTenants] = useState<TopTenantDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [chartMode, setChartMode] = useState<ChartMode>('access');\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const [dashboardRes, topTenantsRes] = await Promise.all([\r\n tenantAnalyticsApi.getDashboardStats(period),\r\n tenantAnalyticsApi.getTopTenants(5, period, chartMode === 'access' ? 'access' : 'duration')\r\n ]);\r\n setStats(dashboardRes);\r\n setTopTenants(topTenantsRes);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, chartMode]);\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatDuration = (seconds: number): string => {\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n if (minutes < 60) return `${minutes}m`;\r\n const hours = Math.floor(minutes / 60);\r\n return `${hours}h ${minutes % 60}m`;\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex h-96 items-center justify-center\">\r\n <Loader2 className=\"h-8 w-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"h-5 w-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-[var(--error-text)] font-medium\">{error}</p>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"text-[var(--error-text)] hover:opacity-80\"\r\n >\r\n <RefreshCw className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('tenants.dashboard.title', 'Dashboard') }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Building2 className=\"h-6 w-6\" />\r\n {t('tenants.dashboard.title', 'Tableau de bord Tenants')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('tenants.dashboard.subtitle', \"Analyse d'utilisation et statistiques des tenants\")}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n {/* Mode Toggle */}\r\n <div className=\"flex items-center gap-1 rounded-lg border border-[var(--item-color-border)] bg-[var(--bg-secondary)] p-1\">\r\n <button\r\n onClick={() => setChartMode('access')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'access'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Activity className=\"w-3.5 h-3.5\" />\r\n {t('tenants.dashboard.access', 'Accès')}\r\n </span>\r\n </button>\r\n <button\r\n onClick={() => setChartMode('duration')}\r\n className={`px-3 py-1.5 text-sm font-medium rounded-md transition-all ${\r\n chartMode === 'duration'\r\n ? 'bg-[var(--color-primary-600)] text-white shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n <Clock className=\"w-3.5 h-3.5\" />\r\n {t('tenants.dashboard.duration', 'Durée')}\r\n </span>\r\n </button>\r\n </div>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"rounded-[var(--radius-input)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-primary)] focus:border-[var(--color-primary-600)] focus:outline-none\"\r\n >\r\n <option value={7}>7 {t('common.days', 'jours')}</option>\r\n <option value={30}>30 {t('common.days', 'jours')}</option>\r\n <option value={90}>90 {t('common.days', 'jours')}</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"rounded-[var(--radius-button)] border border-[var(--item-color-border)] bg-[var(--bg-secondary)] px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] flex items-center gap-2 transition-colors\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n {t('common.refresh', 'Actualiser')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards Grid */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n label={t('tenants.dashboard.totalTenants', 'Total Tenants')}\r\n value={stats?.totalTenants || 0}\r\n icon={<Building2 className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n label={t('tenants.dashboard.activeTenants', 'Tenants Actifs')}\r\n value={stats?.activeTenants || 0}\r\n icon={<CheckCircle className=\"h-5 w-5\" />}\r\n color=\"green\"\r\n />\r\n <KpiCard\r\n label={t('tenants.dashboard.suspendedTenants', 'Suspendus')}\r\n value={stats?.suspendedTenants || 0}\r\n icon={<PauseCircle className=\"h-5 w-5\" />}\r\n color=\"orange\"\r\n />\r\n <KpiCard\r\n label={t('tenants.dashboard.totalMembers', 'Total Membres')}\r\n value={stats?.totalMembers || 0}\r\n icon={<Users className=\"h-5 w-5\" />}\r\n color=\"purple\"\r\n />\r\n <KpiCard\r\n label={t('tenants.dashboard.avgSession', 'Session Moy.')}\r\n value={formatDuration(stats?.avgSessionDuration || 0)}\r\n icon={<Timer className=\"h-5 w-5\" />}\r\n color=\"blue\"\r\n subtitle={`${period} ${t('common.days', 'jours')}`}\r\n />\r\n <KpiCard\r\n label={t('tenants.dashboard.growthRate', 'Croissance')}\r\n value={`${stats?.growthRate.toFixed(1) || 0}%`}\r\n icon={<TrendingUp className=\"h-5 w-5\" />}\r\n color={(stats?.growthRate ?? 0) >= 0 ? 'green' : 'red'}\r\n subtitle={t('tenants.dashboard.vsPreviousPeriod', 'vs période précédente')}\r\n />\r\n </div>\r\n\r\n {/* Access Requests Section */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-semibold flex items-center gap-2 text-[var(--text-primary)]\">\r\n <ClipboardList className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {t('tenants.dashboard.accessRequests.title', \"Demandes d'accès\")}\r\n </h3>\r\n <button\r\n onClick={() => navigate('/administration/access-requests')}\r\n className=\"text-sm font-medium text-[var(--color-primary-600)] hover:underline flex items-center gap-1\"\r\n >\r\n {t('tenants.dashboard.accessRequests.manage', 'Gérer')}\r\n <span aria-hidden=\"true\">&rarr;</span>\r\n </button>\r\n </div>\r\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\r\n <div className=\"rounded-lg p-4 bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-sm font-medium text-[var(--warning-text)]\">\r\n {t('tenants.dashboard.accessRequests.pending', 'En attente')}\r\n </span>\r\n <Clock className=\"h-4 w-4 text-[var(--warning-text)]\" />\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--warning-text)]\">\r\n {stats?.pendingAccessRequests || 0}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg p-4 bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-sm font-medium text-[var(--success-text)]\">\r\n {t('tenants.dashboard.accessRequests.approved', 'Approuvées')}\r\n </span>\r\n <ShieldCheck className=\"h-4 w-4 text-[var(--success-text)]\" />\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">\r\n {stats?.approvedAccessRequests || 0}\r\n </div>\r\n </div>\r\n <div className=\"rounded-lg p-4 bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-sm font-medium text-[var(--error-text)]\">\r\n {t('tenants.dashboard.accessRequests.denied', 'Refusées')}\r\n </span>\r\n <ShieldX className=\"h-4 w-4 text-[var(--error-text)]\" />\r\n </div>\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">\r\n {stats?.deniedAccessRequests || 0}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Two Column: Tenant Activity Pie + Top Tenants List */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Tenant Activity Pie Chart */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Building2 className=\"h-5 w-5 text-[var(--color-primary-600)]\" />\r\n {chartMode === 'access' ? t('tenants.dashboard.activity', 'Activité') : t('tenants.dashboard.timeSpent', 'Temps passé')} {t('tenants.dashboard.byTenant', 'par Tenant')}\r\n </h3>\r\n {topTenants.length > 0 ? (\r\n <TenantActivityPieChart data={topTenants} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('tenants.dashboard.noData', 'Aucune donnée disponible')}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Top Tenants List */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Activity className=\"h-5 w-5 text-green-600\" />\r\n {t('tenants.dashboard.topTenantsList', 'Classement des Tenants')}\r\n </h3>\r\n {stats?.topTenants && stats.topTenants.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {stats.topTenants.slice(0, 5).map((tenant, index) => (\r\n <button\r\n type=\"button\"\r\n key={tenant.tenantId}\r\n className=\"w-full flex items-center gap-3 p-3 rounded-lg bg-[var(--bg-secondary)] hover:bg-[var(--bg-hover)] cursor-pointer transition-colors text-left\"\r\n onClick={() => navigate(`/administration/tenants/${tenant.tenantId}`)}\r\n >\r\n <div\r\n className=\"w-8 h-8 rounded-full flex items-center justify-center text-white font-bold text-sm\"\r\n style={{ backgroundColor: ['#3b82f6', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6'][index % 5] }}\r\n >\r\n {index + 1}\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-[var(--text-primary)] truncate\">{tenant.tenantName}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">\r\n {tenant.tenantType} • {tenant.uniqueUsers} {t('tenants.dashboard.users', 'utilisateurs')}\r\n </p>\r\n </div>\r\n <div className=\"text-right\">\r\n <p className=\"font-semibold text-[var(--text-primary)]\">\r\n {chartMode === 'access' ? tenant.accessCount : `${tenant.totalDurationMinutes}m`}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">\r\n {chartMode === 'access' ? t('tenants.dashboard.accesses', 'accès') : t('tenants.dashboard.totalTime', 'temps total')}\r\n </p>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('tenants.dashboard.noData', 'Aucune donnée disponible')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Usage Trends Chart - Full Width with Tenant breakdown */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <TrendingUp className=\"h-5 w-5\" />\r\n {t('tenants.dashboard.trendTitle', {\r\n defaultValue: `Tendance ${chartMode === 'access' ? \"d'utilisation\" : 'du temps passé'} par Tenant`\r\n })} ({period} {t('common.days', 'jours')})\r\n </h3>\r\n <TenantUsageTrendChart period={period} mode={chartMode} />\r\n </div>\r\n\r\n {/* Tenant Popularity - Full Width */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-[var(--bg-card)] p-4\">\r\n <h3 className=\"font-semibold mb-4 flex items-center gap-2 text-[var(--text-primary)]\">\r\n <Building2 className=\"h-5 w-5 text-purple-600\" />\r\n {t('tenants.dashboard.popularTenants', {\r\n defaultValue: `Tenants les plus ${chartMode === 'access' ? 'actifs' : 'utilisés'}`\r\n })}\r\n <span className=\"text-xs font-normal text-[var(--text-secondary)] ml-2\">\r\n ({t('tenants.dashboard.byRanking', 'Type > Slug')})\r\n </span>\r\n </h3>\r\n {topTenants.length > 0 ? (\r\n <TenantPopularityChart data={topTenants} mode={chartMode} />\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('tenants.dashboard.noData', 'Aucune donnée disponible')}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Call to action */}\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--item-color-border)] bg-gradient-to-r from-[var(--color-primary-600)]/10 to-[var(--color-accent-500)]/10 p-6\">\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h3 className=\"font-bold text-[var(--text-primary)]\">{t('tenants.dashboard.exploreAll', 'Explorer tous les Tenants')}</h3>\r\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">\r\n {t('tenants.dashboard.exploreDescription', 'Voir la liste complète des tenants et gérer leurs paramètres')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/tenants/list')}\r\n className=\"whitespace-nowrap rounded-[var(--radius-button)] bg-[var(--color-primary-600)] px-4 py-2 font-medium text-white transition-all hover:shadow-md\"\r\n >\r\n {t('tenants.dashboard.viewTenants', 'Voir les Tenants')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport {\r\n adminApi,\r\n type TenantApplicationDto,\r\n type AvailableApplicationDto,\r\n type ApplicationAccessLevel,\r\n type SaveOverridesRequest,\r\n} from '@/services/api/adminApi';\r\nimport type {\r\n UseTenantApplicationsReturn,\r\n BulkAccessMode,\r\n BulkModuleNode,\r\n BulkSectionNode,\r\n} from './useTenantApplications';\r\n\r\nconst updateModuleAssignment = (module: BulkModuleNode, moduleId: string): BulkModuleNode => {\r\n if (module.id !== moduleId) return module;\r\n const newIsAssigned = !module.isAssigned;\r\n return {\r\n ...module,\r\n isAssigned: newIsAssigned,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: newIsAssigned })),\r\n };\r\n};\r\n\r\nconst updateSectionAssignment = (module: BulkModuleNode, moduleId: string, sectionId: string): BulkModuleNode => {\r\n if (module.id !== moduleId) return module;\r\n const newSections = module.sections.map(s =>\r\n s.id === sectionId ? { ...s, isAssigned: !s.isAssigned } : s\r\n );\r\n const anySectionAssigned = newSections.some(s => s.isAssigned);\r\n return {\r\n ...module,\r\n isAssigned: anySectionAssigned,\r\n sections: newSections,\r\n };\r\n};\r\n\r\nconst assignAllSections = (module: BulkModuleNode): BulkModuleNode => ({\r\n ...module,\r\n isAssigned: true,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: true })),\r\n});\r\n\r\nconst clearAllSections = (module: BulkModuleNode): BulkModuleNode => ({\r\n ...module,\r\n isAssigned: false,\r\n sections: module.sections.map(s => ({ ...s, isAssigned: false })),\r\n});\r\n\r\nfunction mapTemplateAppToTenantApp(\r\n app: { applicationId: string; label: string; code: string; description: string | null; icon: string | null; accessLevel: string; assignedAt: string; assignedBy: string | null; assignedModuleCount: number; assignedSectionCount: number; totalModuleCount: number; totalSectionCount: number }\r\n): TenantApplicationDto {\r\n return {\r\n applicationId: app.applicationId,\r\n label: app.label,\r\n code: app.code,\r\n description: app.description,\r\n icon: app.icon,\r\n accessLevel: app.accessLevel as ApplicationAccessLevel,\r\n assignedAt: app.assignedAt,\r\n assignedBy: app.assignedBy,\r\n source: 'Direct',\r\n inheritedModuleCount: 0,\r\n directModuleCount: app.assignedModuleCount,\r\n revokedModuleCount: 0,\r\n inheritedSectionCount: 0,\r\n directSectionCount: app.assignedSectionCount,\r\n revokedSectionCount: 0,\r\n totalModuleCount: app.totalModuleCount,\r\n totalSectionCount: app.totalSectionCount,\r\n };\r\n}\r\n\r\nexport function useTemplateApplications(templateId: string | undefined): UseTenantApplicationsReturn {\r\n const [applications, setApplications] = useState<TenantApplicationDto[] | null>(null);\r\n const [loadingApps, setLoadingApps] = useState(false);\r\n\r\n const [addingApplication, setAddingApplication] = useState(false);\r\n const [availableApps, setAvailableApps] = useState<AvailableApplicationDto[]>([]);\r\n const [loadingAvailableApps, setLoadingAvailableApps] = useState(false);\r\n const [selectedAppIds, setSelectedAppIds] = useState<string[]>([]);\r\n const [assigningApps, setAssigningApps] = useState(false);\r\n const [appSearchTerm, setAppSearchTerm] = useState('');\r\n const [availableAppsError, setAvailableAppsError] = useState<string | null>(null);\r\n\r\n const [selectedAccessLevel, setSelectedAccessLevel] = useState<ApplicationAccessLevel>('FullAccess');\r\n const [bulkAccessMode, setBulkAccessMode] = useState<BulkAccessMode>('full');\r\n const [bulkModules, setBulkModules] = useState<BulkModuleNode[]>([]);\r\n const [bulkExpandedModules, setBulkExpandedModules] = useState<Set<string>>(new Set());\r\n const [loadingBulkModules, setLoadingBulkModules] = useState(false);\r\n\r\n const [showCustomizeDrawer, setShowCustomizeDrawer] = useState(false);\r\n const [customizingApp, setCustomizingApp] = useState<TenantApplicationDto | null>(null);\r\n\r\n const loadApplications = useCallback(async () => {\r\n if (!templateId) return;\r\n setLoadingApps(true);\r\n try {\r\n const data = await adminApi.templates.getApplications(templateId);\r\n const mapped = Array.isArray(data) ? data.map(mapTemplateAppToTenantApp) : [];\r\n setApplications(mapped);\r\n } catch (err) {\r\n console.error('Failed to load template applications:', err);\r\n setApplications([]);\r\n } finally {\r\n setLoadingApps(false);\r\n }\r\n }, [templateId]);\r\n\r\n const loadAvailableApps = useCallback(async () => {\r\n if (!templateId) return;\r\n setAddingApplication(true);\r\n setSelectedAppIds([]);\r\n setLoadingAvailableApps(true);\r\n setAvailableAppsError(null);\r\n try {\r\n const availableAppsResult = await adminApi.templates.getAvailableApplications(templateId);\r\n setAvailableApps(availableAppsResult.filter(a => !a.isAssigned));\r\n } catch (err) {\r\n console.error('Failed to load available applications:', err);\r\n const isForbidden = err instanceof Error && err.name === 'ForbiddenError';\r\n setAvailableAppsError(isForbidden ? 'forbidden' : 'generic');\r\n } finally {\r\n setLoadingAvailableApps(false);\r\n }\r\n }, [templateId]);\r\n\r\n const closeAddApplication = useCallback(() => {\r\n setAddingApplication(false);\r\n setSelectedAppIds([]);\r\n setAppSearchTerm('');\r\n setSelectedAccessLevel('FullAccess');\r\n setBulkAccessMode('full');\r\n setBulkModules([]);\r\n setBulkExpandedModules(new Set());\r\n }, []);\r\n\r\n const handleAssignApplications = useCallback(async () => {\r\n if (!templateId || selectedAppIds.length === 0) return;\r\n setAssigningApps(true);\r\n try {\r\n const request = {\r\n applicationIds: selectedAppIds,\r\n accessLevel: selectedAccessLevel,\r\n accessMode: bulkAccessMode,\r\n moduleIds: bulkAccessMode === 'custom' ? bulkModules.filter(m => m.isAssigned).map(m => m.id) : undefined,\r\n sectionIds: bulkAccessMode === 'custom' ? bulkModules.flatMap(m => m.sections.filter(s => s.isAssigned).map(s => s.id)) : undefined,\r\n };\r\n\r\n await adminApi.templates.bulkAssignApplications(templateId, request);\r\n\r\n await loadApplications();\r\n closeAddApplication();\r\n } catch (err) {\r\n console.error('Failed to assign applications:', err);\r\n } finally {\r\n setAssigningApps(false);\r\n }\r\n }, [templateId, selectedAppIds, selectedAccessLevel, bulkAccessMode, bulkModules, loadApplications, closeAddApplication]);\r\n\r\n const handleRemoveApplication = useCallback(async (appId: string) => {\r\n if (!templateId) return;\r\n try {\r\n await adminApi.templates.removeApplication(templateId, appId);\r\n await loadApplications();\r\n } catch (err) {\r\n console.error('Failed to remove application:', err);\r\n }\r\n }, [templateId, loadApplications]);\r\n\r\n const handleUpdateAccessLevel = useCallback(async (appId: string, accessLevel: ApplicationAccessLevel) => {\r\n if (!templateId) return;\r\n try {\r\n await adminApi.templates.updateApplicationAccessLevel(templateId, appId, accessLevel);\r\n await loadApplications();\r\n } catch (err) {\r\n console.error('Failed to update access level:', err);\r\n }\r\n }, [templateId, loadApplications]);\r\n\r\n const openCustomizeDrawer = useCallback((app: TenantApplicationDto) => {\r\n setCustomizingApp(app);\r\n setShowCustomizeDrawer(true);\r\n }, []);\r\n\r\n const closeCustomizeDrawer = useCallback(() => {\r\n setShowCustomizeDrawer(false);\r\n setCustomizingApp(null);\r\n }, []);\r\n\r\n const filteredAvailableApps = useMemo(() => {\r\n if (!appSearchTerm) return availableApps;\r\n\r\n const searchLower = appSearchTerm.toLowerCase();\r\n return availableApps.filter(app =>\r\n app.label.toLowerCase().includes(searchLower) ||\r\n app.code.toLowerCase().includes(searchLower)\r\n );\r\n }, [availableApps, appSearchTerm]);\r\n\r\n const handleAppToggle = useCallback((appId: string) => {\r\n setSelectedAppIds(prev =>\r\n prev.includes(appId)\r\n ? prev.filter(id => id !== appId)\r\n : [...prev, appId]\r\n );\r\n }, []);\r\n\r\n const selectAllFilteredApps = useCallback(() => {\r\n const filteredIds = filteredAvailableApps.map(app => app.id);\r\n setSelectedAppIds(filteredIds);\r\n }, [filteredAvailableApps]);\r\n\r\n const clearAppSelection = useCallback(() => {\r\n setSelectedAppIds([]);\r\n }, []);\r\n\r\n const loadBulkModulesForApp = useCallback(async (appId: string) => {\r\n setLoadingBulkModules(true);\r\n try {\r\n const appModules = await adminApi.applications.getModules(appId);\r\n const moduleNodes: BulkModuleNode[] = [];\r\n\r\n for (const appModule of appModules) {\r\n const sections = await adminApi.applications.getModuleSections(appId, appModule.id);\r\n const sectionNodes: BulkSectionNode[] = sections.map(section => ({\r\n id: section.id,\r\n label: section.label,\r\n code: section.code,\r\n icon: section.icon,\r\n isAssigned: true,\r\n }));\r\n\r\n moduleNodes.push({\r\n id: appModule.id,\r\n label: appModule.label,\r\n code: appModule.code,\r\n icon: appModule.icon,\r\n isAssigned: true,\r\n sections: sectionNodes,\r\n });\r\n }\r\n\r\n setBulkModules(moduleNodes);\r\n } catch (err) {\r\n console.error('Failed to load modules:', err);\r\n } finally {\r\n setLoadingBulkModules(false);\r\n }\r\n }, []);\r\n\r\n const toggleBulkModuleExpand = useCallback((moduleId: string) => {\r\n setBulkExpandedModules(prev => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(moduleId)) {\r\n newSet.delete(moduleId);\r\n } else {\r\n newSet.add(moduleId);\r\n }\r\n return newSet;\r\n });\r\n }, []);\r\n\r\n const toggleBulkModule = useCallback((moduleId: string) => {\r\n setBulkModules(prev => prev.map(m => updateModuleAssignment(m, moduleId)));\r\n }, []);\r\n\r\n const toggleBulkSection = useCallback((moduleId: string, sectionId: string) => {\r\n setBulkModules(prev => prev.map(m => updateSectionAssignment(m, moduleId, sectionId)));\r\n }, []);\r\n\r\n const getBulkModuleCheckState = useCallback((module: BulkModuleNode): 'checked' | 'unchecked' | 'indeterminate' => {\r\n if (module.sections.length === 0) {\r\n return module.isAssigned ? 'checked' : 'unchecked';\r\n }\r\n const assignedCount = module.sections.filter(s => s.isAssigned).length;\r\n if (assignedCount === 0) return 'unchecked';\r\n if (assignedCount === module.sections.length) return 'checked';\r\n return 'indeterminate';\r\n }, []);\r\n\r\n const getBulkStats = useCallback(() => {\r\n const totalModules = bulkModules.length;\r\n const assignedModules = bulkModules.filter(m => m.isAssigned || m.sections.some(s => s.isAssigned)).length;\r\n const totalSections = bulkModules.reduce((sum, m) => sum + m.sections.length, 0);\r\n const assignedSections = bulkModules.reduce((sum, m) => sum + m.sections.filter(s => s.isAssigned).length, 0);\r\n return { totalModules, assignedModules, totalSections, assignedSections };\r\n }, [bulkModules]);\r\n\r\n const selectAllBulkModules = useCallback(() => {\r\n setBulkModules(prev => prev.map(m => assignAllSections(m)));\r\n }, []);\r\n\r\n const clearBulkModules = useCallback(() => {\r\n setBulkModules(prev => prev.map(m => clearAllSections(m)));\r\n }, []);\r\n\r\n return {\r\n applications,\r\n setApplications,\r\n loadingApps,\r\n setLoadingApps,\r\n addingApplication,\r\n setAddingApplication,\r\n availableApps,\r\n setAvailableApps,\r\n loadingAvailableApps,\r\n setLoadingAvailableApps,\r\n selectedAppIds,\r\n setSelectedAppIds,\r\n assigningApps,\r\n setAssigningApps,\r\n appSearchTerm,\r\n setAppSearchTerm,\r\n selectedAccessLevel,\r\n setSelectedAccessLevel,\r\n bulkAccessMode,\r\n setBulkAccessMode,\r\n bulkModules,\r\n setBulkModules,\r\n bulkExpandedModules,\r\n setBulkExpandedModules,\r\n loadingBulkModules,\r\n setLoadingBulkModules,\r\n showCustomizeDrawer,\r\n setShowCustomizeDrawer,\r\n customizingApp,\r\n setCustomizingApp,\r\n loadApplications,\r\n availableAppsError,\r\n loadAvailableApps,\r\n handleAssignApplications,\r\n handleRemoveApplication,\r\n handleUpdateAccessLevel,\r\n openCustomizeDrawer,\r\n closeCustomizeDrawer,\r\n filteredAvailableApps,\r\n handleAppToggle,\r\n selectAllFilteredApps,\r\n clearAppSelection,\r\n loadBulkModulesForApp,\r\n toggleBulkModuleExpand,\r\n toggleBulkModule,\r\n toggleBulkSection,\r\n getBulkModuleCheckState,\r\n getBulkStats,\r\n selectAllBulkModules,\r\n clearBulkModules,\r\n // Template mode does not support overrides — provide no-op stubs to satisfy the shared interface\r\n handleSaveOverrides: async (_appId: string, _request: SaveOverridesRequest) => { /* no-op for template mode */ },\r\n handleResetOverrides: async (_appId: string) => { /* no-op for template mode */ },\r\n };\r\n}\r\n","import { memo, useEffect, useState, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams, useNavigate, Link } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTemplateApplications } from '@/hooks/useTemplateApplications';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { TenantApplicationsTab } from '@/components/platform/administration/tenants/TenantApplicationsTab';\r\nimport { ArrowLeft, RefreshCw, Loader2, AlertCircle, Star, User, Building2, Users, AppWindow, LayoutGrid, Brain } from 'lucide-react';\r\nimport { adminApi, type TenantTemplateDetailDto, type TenantBasicDto, type TemplateAiInstanceDto } from '@/services/api/adminApi';\r\n\r\nconst VALID_TABS = ['info', 'applications', 'tenants', 'ai'] as const;\r\ntype TabType = typeof VALID_TABS[number];\r\n\r\n// ============================================================================\r\n// Interfaces\r\n// ============================================================================\r\n\r\ninterface InfoTabProps {\r\n readonly template: TenantTemplateDetailDto;\r\n readonly t: (key: string) => string;\r\n}\r\n\r\ninterface StatCardProps {\r\n readonly icon: React.ReactNode;\r\n readonly label: string;\r\n readonly value: number;\r\n}\r\n\r\ninterface TenantsTabProps {\r\n readonly templateId: string;\r\n readonly t: (key: string) => string;\r\n}\r\n\r\ninterface AiInstancesTabProps {\r\n readonly templateId: string;\r\n readonly t: (key: string) => string;\r\n}\r\n\r\n// ============================================================================\r\n// Main Page\r\n// ============================================================================\r\n\r\nexport function TenantTemplateDetailPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { id: templateId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<TabType>('info', VALID_TABS);\r\n\r\n const [template, setTemplate] = useState<TenantTemplateDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const templateApplications = useTemplateApplications(templateId);\r\n\r\n const loadTemplate = useCallback(async () => {\r\n if (!templateId) return;\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.templates.getById(templateId);\r\n setTemplate(data);\r\n setError(null);\r\n } catch {\r\n setError(t('templates.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n if (!templateId) {\r\n navigate('/administration/tenants/template');\r\n return;\r\n }\r\n loadTemplate();\r\n }, [templateId, loadTemplate, navigate]);\r\n\r\n useEffect(() => {\r\n if (template && templateId) {\r\n templateApplications.loadApplications();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [template, templateId]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"p-6 flex items-center justify-center min-h-[50vh]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !template) {\r\n return (\r\n <div className=\"p-6 space-y-4\">\r\n <button\r\n onClick={() => navigate('/administration/tenants/template')}\r\n className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('templates.title')}\r\n </button>\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <span className=\"text-[var(--error-text)]\">{error || t('templates.notFound')}</span>\r\n </div>\r\n <button\r\n onClick={() => loadTemplate()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:errors.retry')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const TypeIcon = template.targetTenantType === 'Personal' ? User : Building2;\r\n const typeLabel = template.targetTenantType === 'Personal'\r\n ? t('templates.targetPersonal')\r\n : t('templates.targetBusiness');\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('templates.title'), href: '/administration/tenants/template' },\r\n { label: template.name }\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between gap-4\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/tenants/template')}\r\n aria-label={t('templates.title')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div>\r\n <div className=\"flex items-center gap-3\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{template.name}</h1>\r\n {template.isDefault && (\r\n <span className=\"flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-badge)] text-xs bg-[var(--accent-bg)] text-[var(--accent-text)]\">\r\n <Star className=\"w-3 h-3\" />\r\n {t('templates.default')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n <span className=\"text-sm text-[var(--text-tertiary)] font-mono\">{template.code}</span>\r\n <span className=\"text-[var(--text-tertiary)]\">-</span>\r\n <span className=\"flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n <TypeIcon className=\"w-3.5 h-3.5\" />\r\n {typeLabel}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <button\r\n onClick={loadTemplate}\r\n aria-label={t('common:refresh')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] text-[var(--text-secondary)]\"\r\n >\r\n <RefreshCw className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1 -mb-px\">\r\n {VALID_TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 text-sm border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--primary-color)] text-[var(--primary-color)] font-medium'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`templates.tabs.${tab}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n {activeTab === 'info' && <InfoTab template={template} t={t} />}\r\n {activeTab === 'applications' && (\r\n <TenantApplicationsTab\r\n tenantId={templateId!}\r\n tenantName={template.name}\r\n mode=\"template\"\r\n applications={templateApplications.applications}\r\n loadingApps={templateApplications.loadingApps}\r\n actionLoading={null}\r\n onRefresh={templateApplications.loadApplications}\r\n onUpdateAccessLevel={templateApplications.handleUpdateAccessLevel}\r\n onRemoveApplication={templateApplications.handleRemoveApplication}\r\n // Add application modal state\r\n addingApplication={templateApplications.addingApplication}\r\n availableAppsError={templateApplications.availableAppsError}\r\n filteredAvailableApps={templateApplications.filteredAvailableApps}\r\n loadingAvailableApps={templateApplications.loadingAvailableApps}\r\n selectedAppIds={templateApplications.selectedAppIds}\r\n assigningApps={templateApplications.assigningApps}\r\n appSearchTerm={templateApplications.appSearchTerm}\r\n selectedAccessLevel={templateApplications.selectedAccessLevel}\r\n bulkAccessMode={templateApplications.bulkAccessMode}\r\n bulkModules={templateApplications.bulkModules}\r\n bulkExpandedModules={templateApplications.bulkExpandedModules}\r\n loadingBulkModules={templateApplications.loadingBulkModules}\r\n // Customize drawer state\r\n showCustomizeDrawer={templateApplications.showCustomizeDrawer}\r\n customizingApp={templateApplications.customizingApp}\r\n // Actions\r\n onOpenAddApplication={templateApplications.loadAvailableApps}\r\n onCloseAddApplication={() => {\r\n templateApplications.setAddingApplication(false);\r\n templateApplications.setSelectedAppIds([]);\r\n templateApplications.setAppSearchTerm('');\r\n templateApplications.setSelectedAccessLevel('FullAccess');\r\n templateApplications.setBulkAccessMode('full');\r\n templateApplications.setBulkModules([]);\r\n templateApplications.setBulkExpandedModules(new Set());\r\n }}\r\n onAssignApplications={templateApplications.handleAssignApplications}\r\n onAppToggle={templateApplications.handleAppToggle}\r\n onSelectAllApps={templateApplications.selectAllFilteredApps}\r\n onClearAppSelection={templateApplications.clearAppSelection}\r\n onOpenCustomizeDrawer={templateApplications.openCustomizeDrawer}\r\n onCloseCustomizeDrawer={templateApplications.closeCustomizeDrawer}\r\n // Module handlers\r\n onLoadBulkModules={templateApplications.loadBulkModulesForApp}\r\n onToggleBulkModuleExpand={templateApplications.toggleBulkModuleExpand}\r\n onToggleBulkModule={templateApplications.toggleBulkModule}\r\n onToggleBulkSection={templateApplications.toggleBulkSection}\r\n onGetBulkModuleCheckState={templateApplications.getBulkModuleCheckState}\r\n onGetBulkStats={templateApplications.getBulkStats}\r\n onSelectAllBulkModules={templateApplications.selectAllBulkModules}\r\n onClearBulkModules={templateApplications.clearBulkModules}\r\n // Setters\r\n setAppSearchTerm={templateApplications.setAppSearchTerm}\r\n setSelectedAccessLevel={templateApplications.setSelectedAccessLevel}\r\n setBulkAccessMode={templateApplications.setBulkAccessMode}\r\n />\r\n )}\r\n {activeTab === 'tenants' && <TenantsTab templateId={templateId!} t={t} />}\r\n {activeTab === 'ai' && <AiInstancesTab templateId={templateId!} t={t} />}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// InfoTab\r\n// ============================================================================\r\n\r\nfunction InfoTab({ template, t }: InfoTabProps) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-5\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('templates.info.general')}</h3>\r\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <dt className=\"text-sm text-[var(--text-secondary)]\">{t('templates.info.code')}</dt>\r\n <dd className=\"font-mono text-[var(--text-primary)]\">{template.code}</dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-sm text-[var(--text-secondary)]\">{t('templates.info.name')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{template.name}</dd>\r\n </div>\r\n <div className=\"md:col-span-2\">\r\n <dt className=\"text-sm text-[var(--text-secondary)]\">{t('templates.info.description')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{template.description || '-'}</dd>\r\n </div>\r\n </dl>\r\n </div>\r\n\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] p-5\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('templates.info.stats')}</h3>\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <StatCard icon={<AppWindow className=\"w-5 h-5\" />} label={t('templates.tabs.applications')} value={template.applications.length} />\r\n <StatCard icon={<LayoutGrid className=\"w-5 h-5\" />} label={t('templates.tabs.tenants')} value={template.modules.length} />\r\n <StatCard icon={<Users className=\"w-5 h-5\" />} label={t('templates.tabs.tenants')} value={0} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// StatCard (memo for list rendering)\r\n// ============================================================================\r\n\r\nconst StatCard = memo(function StatCard({ icon, label, value }: StatCardProps) {\r\n return (\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-[var(--radius-card)]\">\r\n <span className=\"text-[var(--text-secondary)]\">{icon}</span>\r\n <div>\r\n <p className=\"text-2xl font-bold text-[var(--text-primary)]\">{value}</p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">{label}</p>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// TenantsTab\r\n// ============================================================================\r\n\r\nfunction TenantsTab({ templateId, t }: TenantsTabProps) {\r\n const [tenants, setTenants] = useState<TenantBasicDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [tabError, setTabError] = useState<string | null>(null);\r\n\r\n const loadTenants = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setTabError(null);\r\n const data = await adminApi.templates.getTenants(templateId);\r\n setTenants(data);\r\n } catch {\r\n setTabError(t('templates.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n useEffect(() => {\r\n loadTenants();\r\n }, [loadTenants]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (tabError) {\r\n return (\r\n <div className=\"p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{tabError}</span>\r\n </div>\r\n <button\r\n onClick={() => loadTenants()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:errors.retry')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {t('templates.tenants.title')} ({tenants.length})\r\n </h3>\r\n\r\n {tenants.length === 0 ? (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Users className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p>{t('templates.tenants.noTenants')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] divide-y divide-[var(--border-color)]\">\r\n {tenants.map(tenant => (\r\n <Link\r\n key={tenant.id}\r\n to={`/administration/tenants/${tenant.id}`}\r\n className=\"flex items-center justify-between p-3 hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{tenant.name}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] font-mono\">{tenant.slug}</p>\r\n </div>\r\n <span className=\"text-xs text-[var(--text-secondary)] px-2 py-0.5 bg-[var(--bg-secondary)] rounded-[var(--radius-badge)]\">\r\n {t('templates.tenants.explicit')}\r\n </span>\r\n </Link>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// AiInstancesTab\r\n// ============================================================================\r\n\r\nfunction AiInstancesTab({ templateId, t }: AiInstancesTabProps) {\r\n const [instances, setInstances] = useState<TemplateAiInstanceDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [tabError, setTabError] = useState<string | null>(null);\r\n\r\n const loadInstances = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setTabError(null);\r\n const data = await adminApi.templates.getAiInstances(templateId);\r\n setInstances(data);\r\n } catch {\r\n setTabError(t('templates.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [templateId, t]);\r\n\r\n const handleRemove = useCallback(async (instanceId: string) => {\r\n if (!window.confirm(t('templates.ai.removeConfirm'))) return;\r\n try {\r\n await adminApi.templates.removeAiInstance(templateId, instanceId);\r\n await loadInstances();\r\n } catch {\r\n setTabError(t('templates.errors.loadFailed'));\r\n }\r\n }, [templateId, t, loadInstances]);\r\n\r\n useEffect(() => {\r\n loadInstances();\r\n }, [loadInstances]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (tabError) {\r\n return (\r\n <div className=\"p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{tabError}</span>\r\n </div>\r\n <button\r\n onClick={() => loadInstances()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:errors.retry')}\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {t('templates.ai.title')} ({instances.length})\r\n </h3>\r\n\r\n {instances.length === 0 ? (\r\n <div className=\"p-8 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <Brain className=\"w-8 h-8 mx-auto mb-2 opacity-50\" />\r\n <p>{t('templates.ai.noInstances')}</p>\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] divide-y divide-[var(--border-color)]\">\r\n {instances.map(instance => (\r\n <div\r\n key={instance.id}\r\n className=\"flex items-center justify-between p-3 hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{instance.instanceName}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] font-mono\">{instance.instanceCode}</p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <span className={`text-xs px-2 py-0.5 rounded-[var(--radius-badge)] ${\r\n instance.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {instance.isActive ? t('templates.ai.active') : t('templates.ai.inactive')}\r\n </span>\r\n <button\r\n onClick={() => handleRemove(instance.instanceId)}\r\n className=\"text-xs text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('templates.ai.remove')}\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useState, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { Settings2, Building, User, Boxes, Users, Loader2, AlertTriangle, Star, ArrowRight, Plus } from 'lucide-react';\r\nimport { adminApi, type TenantTemplateDto } from '@/services/api/adminApi';\r\n\r\nexport function TenantsTemplatePage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const [templates, setTemplates] = useState<TenantTemplateDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadTemplates = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const data = await adminApi.templates.getAll();\r\n setTemplates(data);\r\n setError(null);\r\n } catch {\r\n setError(t('tenants.template.errors.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [t]);\r\n\r\n useEffect(() => {\r\n loadTemplates();\r\n }, [loadTemplates]);\r\n\r\n const handleCardClick = (templateId: string) => {\r\n navigate(`/administration/tenants/template/${templateId}`);\r\n };\r\n\r\n const systemTemplates = templates.filter(t => t.isDefault);\r\n const customTemplates = templates.filter(t => !t.isDefault);\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('tenants.template.title') }\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('tenants.template.title')}\r\n subtitle={t('tenants.template.subtitle')}\r\n icon={<Settings2 className=\"w-6 h-6\" />}\r\n actions={\r\n <button\r\n onClick={() => navigate('/administration/tenants/template/create')}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('tenants.template.createTemplate')}\r\n </button>\r\n }\r\n />\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {loading && (\r\n <div className=\"flex justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n )}\r\n {!loading && templates.length === 0 && (\r\n <div className=\"p-6 text-center text-[var(--text-secondary)] bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n {t('tenants.template.noTemplates')}\r\n </div>\r\n )}\r\n {!loading && templates.length > 0 && (\r\n <div className=\"space-y-8\">\r\n {/* System Templates */}\r\n {systemTemplates.length > 0 && (\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('tenants.template.systemTemplates')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {systemTemplates.map(template => (\r\n <SystemTemplateCard\r\n key={template.id}\r\n template={template}\r\n onClick={() => handleCardClick(template.id)}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Custom Templates */}\r\n {customTemplates.length > 0 && (\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('tenants.template.customTemplates')}\r\n </h3>\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {customTemplates.map(template => (\r\n <CustomTemplateCard\r\n key={template.id}\r\n template={template}\r\n onClick={() => handleCardClick(template.id)}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SystemTemplateCard({\r\n template,\r\n onClick,\r\n t\r\n}: {\r\n template: TenantTemplateDto;\r\n onClick: () => void;\r\n t: (key: string) => string;\r\n}) {\r\n const IconComponent = template.targetTenantType === 'Personal' ? User : Building;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className=\"p-6 border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-card)] hover:bg-[var(--bg-hover)] hover:border-[var(--primary-color)] cursor-pointer transition-all duration-200 shadow-sm hover:shadow-md text-left w-full\"\r\n >\r\n <div className=\"space-y-4\">\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2.5 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <IconComponent className=\"w-5 h-5 text-[var(--primary-color)]\" />\r\n </div>\r\n <div className=\"min-w-0 flex-1\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {template.targetTenantType === 'Personal'\r\n ? t('tenants.template.personalTitle')\r\n : t('tenants.template.businessTitle')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)] font-mono\">{template.code}</p>\r\n </div>\r\n </div>\r\n <span className=\"flex items-center gap-1 px-2.5 py-1 rounded-[var(--radius-badge)] text-xs bg-[var(--accent-bg)] text-[var(--accent-text)] flex-shrink-0\">\r\n <Star className=\"w-3 h-3\" />\r\n {t('tenants.template.default')}\r\n </span>\r\n </div>\r\n\r\n {/* Description */}\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {template.targetTenantType === 'Personal'\r\n ? t('tenants.template.personalDescription')\r\n : t('tenants.template.businessDescription')}\r\n </p>\r\n\r\n {/* Status Badges */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className={`px-2 py-0.5 rounded-[var(--radius-badge)] text-xs ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {template.isActive ? t('templates.active') : t('templates.inactive')}\r\n </span>\r\n </div>\r\n\r\n {/* Stats Grid */}\r\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\r\n <div className=\"p-3 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <Boxes className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{t('tenants.template.applications')}</span>\r\n </div>\r\n <div className=\"text-lg font-bold text-[var(--text-primary)]\">{template.applicationCount}</div>\r\n </div>\r\n <div className=\"p-3 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <Users className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{t('tenants.template.tenants')}</span>\r\n </div>\r\n <div className=\"text-lg font-bold text-[var(--text-primary)]\">{template.tenantCount}</div>\r\n </div>\r\n </div>\r\n\r\n {/* CTA Button */}\r\n <span\r\n className=\"w-full mt-2 py-2 px-3 rounded-[var(--radius-button)] bg-[var(--primary-color)] text-white text-sm font-medium flex items-center justify-center gap-2 hover:opacity-90 transition-opacity\"\r\n >\r\n {t('tenants.template.configure')}\r\n <ArrowRight className=\"w-3.5 h-3.5\" />\r\n </span>\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\nfunction CustomTemplateCard({\r\n template,\r\n onClick,\r\n t\r\n}: {\r\n template: TenantTemplateDto;\r\n onClick: () => void;\r\n t: (key: string) => string;\r\n}) {\r\n const IconComponent = template.targetTenantType === 'Personal' ? User : Building;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className=\"p-6 border border-[var(--border-color)] rounded-[var(--radius-card)] bg-[var(--bg-card)] hover:bg-[var(--bg-hover)] hover:border-[var(--primary-color)] cursor-pointer transition-all duration-200 shadow-sm hover:shadow-md text-left w-full\"\r\n >\r\n <div className=\"space-y-4\">\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2.5 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <IconComponent className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </div>\r\n <div className=\"min-w-0 flex-1\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {template.name}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)] font-mono\">{template.code}</p>\r\n </div>\r\n </div>\r\n <span className={`px-2.5 py-1 rounded-[var(--radius-badge)] text-xs flex-shrink-0 ${\r\n template.isActive\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)]'\r\n }`}>\r\n {template.isActive ? t('templates.active') : t('templates.inactive')}\r\n </span>\r\n </div>\r\n\r\n {/* Description */}\r\n {template.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {template.description}\r\n </p>\r\n )}\r\n\r\n {/* Type badge */}\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"px-2 py-0.5 rounded-[var(--radius-badge)] text-xs bg-[var(--info-bg)] text-[var(--info-text)]\">\r\n {template.targetTenantType === 'Personal'\r\n ? t('tenants.type.personal')\r\n : t('tenants.type.business')}\r\n </span>\r\n </div>\r\n\r\n {/* Stats Grid */}\r\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\r\n <div className=\"p-3 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <Boxes className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{t('tenants.template.applications')}</span>\r\n </div>\r\n <div className=\"text-lg font-bold text-[var(--text-primary)]\">{template.applicationCount}</div>\r\n </div>\r\n <div className=\"p-3 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <Users className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">{t('tenants.template.tenants')}</span>\r\n </div>\r\n <div className=\"text-lg font-bold text-[var(--text-primary)]\">{template.tenantCount}</div>\r\n </div>\r\n </div>\r\n\r\n {/* CTA Button */}\r\n <span\r\n className=\"w-full mt-2 py-2 px-3 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] text-sm font-medium flex items-center justify-center gap-2 hover:bg-[var(--bg-hover)] transition-colors border border-[var(--border-color)]\"\r\n >\r\n {t('tenants.template.configure')}\r\n <ArrowRight className=\"w-3.5 h-3.5\" />\r\n </span>\r\n </div>\r\n </button>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { Settings2, Loader2, AlertTriangle, Check } from 'lucide-react';\r\nimport { adminApi, type TenantType } from '@/services/api/adminApi';\r\n\r\nexport function TenantTemplateCreatePage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n\r\n const [code, setCode] = useState('');\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [targetTenantType, setTargetTenantType] = useState<TenantType>('Business');\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!code.trim() || !name.trim()) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n try {\r\n const result = await adminApi.templates.create({\r\n code: code.trim(),\r\n name: name.trim(),\r\n description: description.trim() || undefined,\r\n targetTenantType,\r\n });\r\n navigate(`/administration/tenants/template/${result.id}`);\r\n } catch (err) {\r\n console.error('Failed to create template:', err);\r\n const axiosError = err as { response?: { status?: number; data?: { message?: string } } };\r\n if (axiosError.response?.status === 409) {\r\n setError(axiosError.response.data?.message || t('tenants.template.errors.createConflict'));\r\n } else {\r\n setError(t('tenants.template.errors.createFailed'));\r\n }\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('tenants.template.title'), href: '/administration/tenants/template' },\r\n { label: t('tenants.template.createTitle') }\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('tenants.template.createTitle')}\r\n subtitle={t('tenants.template.createSubtitle')}\r\n icon={<Settings2 className=\"w-6 h-6\" />}\r\n />\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"max-w-2xl space-y-6\">\r\n <div className=\"p-6 rounded-[var(--radius-card)] bg-[var(--bg-card)] border border-[var(--border-color)] space-y-4\">\r\n {/* Code */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.template.code')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n placeholder=\"e.g. custom-b2b-premium\"\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.template.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n placeholder={t('tenants.template.namePlaceholder')}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n required\r\n />\r\n </div>\r\n\r\n {/* Description */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('common:description')}\r\n </label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n rows={3}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n {/* Target Tenant Type */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('tenants.template.targetType')} *\r\n </label>\r\n <select\r\n value={targetTenantType}\r\n onChange={(e) => setTargetTenantType(e.target.value as TenantType)}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"Business\">{t('tenants.type.business')}</option>\r\n <option value=\"Personal\">{t('tenants.type.personal')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/tenants/template')}\r\n className=\"px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={!code.trim() || !name.trim() || saving}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Check className=\"w-4 h-4\" />\r\n )}\r\n {t('common:create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { TenantsPage } from './TenantsPage';\r\n\r\nexport function TenantsBusinessPage(): ReactElement {\r\n return <TenantsPage lockedType=\"Business\" />;\r\n}\r\n","import type { ReactElement } from 'react';\nimport { TenantsPage } from './TenantsPage';\r\n\r\nexport function TenantsPersonalPage(): ReactElement {\r\n return <TenantsPage lockedType=\"Personal\" />;\r\n}\r\n","import type { ReactElement } from 'react';\r\nimport { TenantsPage } from './TenantsPage';\r\n\r\nexport function TenantsOtherPage(): ReactElement {\r\n return <TenantsPage excludeTypes={['Business', 'Personal']} />;\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { AccessRequestsListTab } from '@/components/platform/administration/access-requests/AccessRequestsListTab';\r\nimport { accessRequestsApi } from '@/services/api/accessRequestsApi';\r\nimport type { AccessRequest } from '@/services/api/accessRequestsApi';\r\nimport { ShieldCheck, Loader2, Filter } from 'lucide-react';\r\n\r\nconst STATUS_FILTERS = ['all', 'Pending', 'Approved', 'Denied'] as const;\r\n\r\nexport function TenantAccessRequestsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const [requests, setRequests] = useState<AccessRequest[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [statusFilter, setStatusFilter] = useState<string>('all');\r\n\r\n const loadRequests = useCallback(async () => {\r\n setLoading(true);\r\n try {\r\n const status = statusFilter === 'all' ? undefined : statusFilter;\r\n const data = await accessRequestsApi.getAllRequests(status);\r\n setRequests(Array.isArray(data) ? data : []);\r\n } catch {\r\n setRequests([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [statusFilter]);\r\n\r\n useEffect(() => {\r\n loadRequests();\r\n }, [loadRequests]);\r\n\r\n const stats = {\r\n pending: requests.filter(r => r.status === 'Pending').length,\r\n approved: requests.filter(r => r.status === 'Approved').length,\r\n denied: requests.filter(r => r.status === 'Denied').length,\r\n };\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('accessRequests.pageTitle') },\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('accessRequests.pageTitle')}\r\n icon={<ShieldCheck className=\"w-6 h-6\" />}\r\n />\r\n\r\n {/* Stats cards */}\r\n <div className=\"grid grid-cols-3 gap-4\">\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--warning-border)]\">\r\n <div className=\"text-2xl font-bold text-[var(--warning-text)]\">{stats.pending}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('accessRequests.stats.pending')}</div>\r\n </div>\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--success-border)]\">\r\n <div className=\"text-2xl font-bold text-[var(--success-text)]\">{stats.approved}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('accessRequests.stats.approved')}</div>\r\n </div>\r\n <div className=\"rounded-[var(--radius-card)] p-4 bg-[var(--bg-card)] border border-[var(--error-border)]\">\r\n <div className=\"text-2xl font-bold text-[var(--error-text)]\">{stats.denied}</div>\r\n <div className=\"text-sm text-[var(--text-secondary)]\">{t('accessRequests.stats.denied')}</div>\r\n </div>\r\n </div>\r\n\r\n {/* Status filter */}\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <div className=\"flex gap-1\">\r\n {STATUS_FILTERS.map((status) => (\r\n <button\r\n key={status}\r\n onClick={() => setStatusFilter(status)}\r\n className={`px-3 py-1.5 rounded-[var(--radius-button)] text-sm font-medium transition-colors ${\r\n statusFilter === status\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {status === 'all'\r\n ? t('accessRequests.filter.all')\r\n : t(`accessRequests.status.${status.toLowerCase()}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Requests table */}\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n ) : (\r\n <AccessRequestsListTab\r\n requests={requests}\r\n loading={false}\r\n onReload={loadRequests}\r\n showTenantColumn\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useAuth } from '@/contexts/AuthContext';\r\nimport { useSignalRContext, type NotificationDto as SignalRNotificationDto } from '@/contexts/SignalRContext';\r\nimport type { LucideIcon } from 'lucide-react';\r\nimport {\r\n Key,\r\n AlertTriangle,\r\n CheckCircle,\r\n Clock,\r\n Loader2,\r\n RefreshCw,\r\n Settings,\r\n Info,\r\n GitMerge,\r\n Users,\r\n Building2,\r\n Zap,\r\n Lock,\r\n Save,\r\n TestTube,\r\n Eye,\r\n EyeOff,\r\n ExternalLink,\r\n Shield,\r\n Copy,\r\n Check,\r\n Filter,\r\n Play,\r\n History,\r\n Square,\r\n} from 'lucide-react';\r\nimport { createEntraApi } from '@/services/api/entraApi';\r\nimport type {\r\n EntraConfigurationDto,\r\n EntraSyncConflictDto,\r\n ResolveConflictRequest,\r\n EntraSyncStatusDto,\r\n TestConnectionResult,\r\n EntraSyncResultDto,\r\n EntraSyncSessionDto,\r\n} from '@/services/api/entraApi';\r\nimport { ConflictCard, ResolutionModal } from '@/components/platform/administration/entra';\r\n\r\ninterface TenantEntraTabProps {\r\n readonly tenantId: string;\r\n readonly tenantName: string;\r\n readonly tenantSlug: string;\r\n}\r\n\r\n// Permission constants\r\nconst ENTRA_PERMISSIONS = {\r\n READ: 'administration.entra.read',\r\n UPDATE: 'administration.entra.update',\r\n SYNC: 'administration.entra.execute',\r\n};\r\n\r\n// Entra sync notification types\r\nconst ENTRA_SYNC_TYPES = {\r\n STARTED: 'EntraSyncStarted',\r\n COMPLETED: 'EntraSyncCompleted',\r\n FAILED: 'EntraSyncFailed',\r\n};\r\n\r\n// Required Graph API permissions\r\nconst REQUIRED_PERMISSIONS = [\r\n { code: 'User.Read.All', descriptionKey: 'userReadAll' },\r\n { code: 'Group.Read.All', descriptionKey: 'groupReadAll' },\r\n { code: 'GroupMember.Read.All', descriptionKey: 'groupMemberReadAll' },\r\n];\r\n\r\n// User types for sync\r\nconst USER_TYPES = [\r\n { id: 'member', labelKey: 'userTypes.member', descriptionKey: 'userTypes.memberDescription', supported: true },\r\n { id: 'guest', labelKey: 'userTypes.guest', descriptionKey: 'userTypes.guestDescription', supported: true },\r\n];\r\n\r\nconst calculateElapsedTime = (startedAt: Date): string => {\r\n const now = Date.now();\r\n const start = startedAt.getTime();\r\n const diffSeconds = Math.floor((now - start) / 1000);\r\n const minutes = Math.floor(diffSeconds / 60);\r\n const seconds = diffSeconds % 60;\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n};\r\n\r\nconst handleEntraNotification = (\r\n notification: SignalRNotificationDto,\r\n setActiveSyncSession: any,\r\n loadData: () => void\r\n) => {\r\n if (notification.type === ENTRA_SYNC_TYPES.STARTED) {\r\n setActiveSyncSession({\r\n sessionId: notification.relatedEntityId || '',\r\n startedAt: new Date(notification.createdAt),\r\n });\r\n } else if (notification.type === ENTRA_SYNC_TYPES.COMPLETED || notification.type === ENTRA_SYNC_TYPES.FAILED) {\r\n setActiveSyncSession(null);\r\n loadData();\r\n }\r\n};\r\n\r\n// ============================================\r\n// Sub-tab Navigation\r\n// ============================================\r\n\r\ntype SubTabId = 'config' | 'sync' | 'users' | 'groups';\r\n\r\ninterface SubTab {\r\n id: SubTabId;\r\n label: string;\r\n icon: LucideIcon;\r\n permission: string;\r\n}\r\n\r\n// ============================================\r\n// Reusable Components\r\n// ============================================\r\n\r\ninterface SectionCardProps {\r\n readonly icon: LucideIcon;\r\n readonly title: string;\r\n readonly description?: string;\r\n readonly action?: React.ReactNode;\r\n readonly children: React.ReactNode;\r\n readonly className?: string;\r\n}\r\n\r\nfunction SectionCard({ icon: Icon, title, description, action, children, className = '' }: SectionCardProps) {\r\n return (\r\n <div className={`rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] shadow-sm overflow-hidden ${className}`}>\r\n <div className=\"px-6 py-4 border-b border-[var(--border-subtle)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30\">\r\n <Icon className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <div>\r\n <h2 className=\"text-base font-semibold text-[var(--text-primary)]\">{title}</h2>\r\n {description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5\">{description}</p>\r\n )}\r\n </div>\r\n </div>\r\n {action}\r\n </div>\r\n </div>\r\n <div className=\"p-6\">\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ToggleProps {\r\n readonly checked: boolean;\r\n readonly onChange: () => void;\r\n readonly label: string;\r\n readonly description?: string;\r\n readonly disabled?: boolean;\r\n}\r\n\r\nfunction Toggle({ checked, onChange, label, description, disabled }: ToggleProps) {\r\n return (\r\n <div className=\"flex items-center justify-between py-3\">\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <label className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</label>\r\n {description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5\">{description}</p>\r\n )}\r\n </div>\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={checked}\r\n onClick={onChange}\r\n disabled={disabled}\r\n className={`relative inline-flex h-6 w-11 flex-shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:ring-offset-2 focus:ring-offset-[var(--bg-primary)] disabled:opacity-50 disabled:cursor-not-allowed ${\r\n checked ? 'bg-[var(--color-accent-600)]' : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-4 w-4 transform rounded-full bg-white shadow-md transition-transform ${\r\n checked ? 'translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nconst isValidGuid = (value: string): boolean => {\r\n if (!value) return true;\r\n const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\r\n return guidRegex.test(value);\r\n};\r\n\r\n// ============================================\r\n// Configuration Sub-Tab (Editable)\r\n// ============================================\r\n\r\n// Type for the entra API instance\r\ntype EntraApiInstance = ReturnType<typeof createEntraApi>;\r\n\r\ninterface ConfigTabProps {\r\n readonly config: EntraConfigurationDto | null;\r\n readonly loading: boolean;\r\n readonly canEdit: boolean;\r\n readonly onRefresh: () => void;\r\n readonly onConfigUpdated: () => void;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n readonly entraApi: EntraApiInstance;\r\n}\r\n\r\nconst ConfigTabReadOnly = ({ config, loading, canEdit, onRefresh, onEdit, t }: {\r\n config: EntraConfigurationDto | null;\r\n loading: boolean;\r\n canEdit: boolean;\r\n onRefresh: () => void;\r\n onEdit: () => void;\r\n t: (key: string, options?: Record<string, unknown>) => string;\r\n}) => (\r\n <SectionCard\r\n icon={Key}\r\n title={t('admin:tenants.entra.configuration.title')}\r\n description={t('admin:tenants.entra.configuration.description')}\r\n action={\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\r\n {canEdit && (\r\n <button\r\n onClick={onEdit}\r\n className=\"inline-flex items-center justify-center gap-2 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors\"\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n <span className=\"sm:inline\">{t('admin:tenants.entra.configuration.edit')}</span>\r\n </button>\r\n )}\r\n <button\r\n onClick={onRefresh}\r\n disabled={loading}\r\n className=\"inline-flex items-center justify-center gap-2 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors disabled:opacity-50\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\r\n <span className=\"sm:inline\">{t('common:refresh')}</span>\r\n </button>\r\n </div>\r\n }\r\n >\r\n {config ? (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n {config.isConfigured ? (\r\n <>\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.entra.configuration.configured')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.configuration.connectedTo', { tenantId: config.tenantId })}\r\n </p>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <Info className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.entra.configuration.notConfigured')}\r\n </p>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.configuration.notConfiguredHint')}\r\n </p>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {config.isConfigured && (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4\">\r\n <div className=\"p-3 sm:p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <Clock className=\"w-4 h-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.entra.configuration.syncStatus')}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {config.syncEnabled\r\n ? t('admin:tenants.entra.configuration.syncEnabled')\r\n : t('admin:tenants.entra.configuration.syncDisabled')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"p-3 sm:p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <Settings className=\"w-4 h-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.entra.configuration.syncInterval')}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {config.syncIntervalMinutes} {t('common:minutes')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"p-3 sm:p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)] sm:col-span-2 lg:col-span-1\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <GitMerge className=\"w-4 h-4 text-[var(--text-tertiary)] flex-shrink-0\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.entra.configuration.conflictResolution')}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t(`entra:settings.conflictResolutions.${config.defaultConflictResolution?.toLowerCase() ?? 'manualreview'}`)}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.configuration.noData')}\r\n </p>\r\n )}\r\n </SectionCard>\r\n);\r\n\r\nfunction ConfigTab({ config, loading, canEdit, onRefresh, onConfigUpdated, t, entraApi }: ConfigTabProps) {\r\n const [editing, setEditing] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [testing, setTesting] = useState(false);\r\n const [testResult, setTestResult] = useState<TestConnectionResult | null>(null);\r\n const [showSecret, setShowSecret] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [copiedPermission, setCopiedPermission] = useState<string | null>(null);\r\n const [hasExistingSecret, setHasExistingSecret] = useState(config?.hasClientSecret ?? false);\r\n const [validationErrors, setValidationErrors] = useState<{ tenantId?: string; clientId?: string }>({});\r\n\r\n const [credentials, setCredentials] = useState({\r\n tenantId: config?.tenantId || '',\r\n clientId: config?.clientId || '',\r\n clientSecret: '',\r\n });\r\n\r\n const [syncSettings, setSyncSettings] = useState({\r\n syncEnabled: config?.syncEnabled ?? false,\r\n syncIntervalMinutes: config?.syncIntervalMinutes ?? 60,\r\n useDeltaSync: config?.useDeltaSync ?? true,\r\n defaultConflictResolution: (config?.defaultConflictResolution ?? 'ManualReview') as 'ManualReview' | 'EntraWins' | 'LocalWins',\r\n autoCreateReferences: config?.autoCreateReferences ?? true,\r\n syncOnlyActiveUsers: config?.syncOnlyActiveUsers ?? true,\r\n syncUserTypes: config?.syncUserTypes ?? 'member',\r\n });\r\n\r\n useEffect(() => {\r\n if (!config) return;\r\n setCredentials({\r\n tenantId: config.tenantId || '',\r\n clientId: config.clientId || '',\r\n clientSecret: '',\r\n });\r\n setHasExistingSecret(config.hasClientSecret);\r\n setSyncSettings({\r\n syncEnabled: config.syncEnabled,\r\n syncIntervalMinutes: config.syncIntervalMinutes,\r\n useDeltaSync: config.useDeltaSync,\r\n defaultConflictResolution: config.defaultConflictResolution as 'ManualReview' | 'EntraWins' | 'LocalWins',\r\n autoCreateReferences: config.autoCreateReferences,\r\n syncOnlyActiveUsers: config.syncOnlyActiveUsers ?? true,\r\n syncUserTypes: config.syncUserTypes ?? 'member',\r\n });\r\n }, [config]);\r\n\r\n const validateField = (field: 'tenantId' | 'clientId', value: string) => {\r\n const errorKey = !isValidGuid(value) ? t('entra:settings.invalidGuidFormat') : undefined;\r\n setValidationErrors(prev => ({ ...prev, [field]: errorKey }));\r\n };\r\n\r\n const handleCredentialChange = (field: keyof typeof credentials, value: string) => {\r\n setCredentials(prev => ({ ...prev, [field]: value }));\r\n if (field === 'tenantId' || field === 'clientId') {\r\n validateField(field, value);\r\n }\r\n };\r\n\r\n const hasValidationErrors = Boolean(validationErrors.tenantId || validationErrors.clientId);\r\n const canTestConnection = !testing && !hasValidationErrors && credentials.tenantId && credentials.clientId && (credentials.clientSecret || hasExistingSecret);\r\n const canSaveCredentials = !saving && !hasValidationErrors && credentials.tenantId && credentials.clientId && credentials.clientSecret;\r\n\r\n const handleCopyPermission = async (code: string) => {\r\n try {\r\n await navigator.clipboard.writeText(code);\r\n setCopiedPermission(code);\r\n setTimeout(() => setCopiedPermission(null), 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err instanceof Error ? err.message : 'Unknown error');\r\n }\r\n };\r\n\r\n const handleTestConnection = async () => {\r\n if (!canTestConnection) return;\r\n setTesting(true);\r\n setTestResult(null);\r\n setError(null);\r\n setSuccess(null);\r\n try {\r\n const result = credentials.clientSecret\r\n ? await entraApi.settings.testConnection({\r\n tenantId: credentials.tenantId,\r\n clientId: credentials.clientId,\r\n clientSecret: credentials.clientSecret,\r\n })\r\n : await entraApi.settings.testStoredConnection();\r\n setTestResult(result);\r\n if (result.success) {\r\n setSuccess(t('entra:settings.testSuccess'));\r\n } else {\r\n setError(result.errorMessage || t('entra:settings.testFailed'));\r\n }\r\n } catch (err) {\r\n console.error('Connection test failed:', err instanceof Error ? err.message : 'Unknown error');\r\n setError(t('entra:settings.testFailed'));\r\n } finally {\r\n setTesting(false);\r\n }\r\n };\r\n\r\n const handleSaveCredentials = async () => {\r\n if (!canSaveCredentials) return;\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n try {\r\n await entraApi.settings.saveCredentials({\r\n tenantId: credentials.tenantId,\r\n clientId: credentials.clientId,\r\n clientSecret: credentials.clientSecret,\r\n });\r\n setSuccess(t('entra:settings.credentialsSaved'));\r\n setHasExistingSecret(true);\r\n setCredentials(prev => ({ ...prev, clientSecret: '' }));\r\n onConfigUpdated();\r\n } catch (err) {\r\n console.error('Failed to save credentials:', err instanceof Error ? err.message : 'Unknown error');\r\n setError(t('entra:settings.saveError'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleSaveSettings = async () => {\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n try {\r\n await entraApi.settings.saveSyncSettings({\r\n syncEnabled: syncSettings.syncEnabled,\r\n syncIntervalMinutes: syncSettings.syncIntervalMinutes,\r\n useDeltaSync: syncSettings.useDeltaSync,\r\n defaultConflictResolution: syncSettings.defaultConflictResolution,\r\n autoCreateReferences: syncSettings.autoCreateReferences,\r\n syncOnlyActiveUsers: syncSettings.syncOnlyActiveUsers,\r\n syncUserTypes: syncSettings.syncUserTypes,\r\n });\r\n setSuccess(t('entra:settings.settingsSaved'));\r\n onConfigUpdated();\r\n } catch (err) {\r\n console.error('Failed to save settings:', err instanceof Error ? err.message : 'Unknown error');\r\n setError(t('entra:settings.saveError'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n if (!canEdit || !editing) {\r\n return <ConfigTabReadOnly config={config} loading={loading} canEdit={canEdit} onRefresh={onRefresh} onEdit={() => setEditing(true)} t={t} />;\r\n }\r\n\r\n // Editing view\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Required Permissions Warning */}\r\n <div className=\"rounded-[var(--radius-card)] border-2 border-[var(--warning-border)] bg-[var(--warning-bg)] p-4\">\r\n <div className=\"flex items-start gap-4\">\r\n <Shield className=\"w-5 h-5 text-[var(--warning-text)] mt-0.5\" />\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center justify-between gap-4 mb-2\">\r\n <h3 className=\"font-semibold text-[var(--warning-text)]\">\r\n {t('entra:settings.permissionsWarningTitle')}\r\n </h3>\r\n <a\r\n href=\"https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--warning-border)] text-[var(--warning-text)] hover:opacity-80 transition-opacity\"\r\n >\r\n {t('entra:settings.configureInAzure')}\r\n <ExternalLink className=\"w-3.5 h-3.5\" />\r\n </a>\r\n </div>\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-90 mb-3\">\r\n {t('entra:settings.permissionsWarningDescription')}\r\n </p>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {REQUIRED_PERMISSIONS.map((perm) => (\r\n <button\r\n key={perm.code}\r\n onClick={() => handleCopyPermission(perm.code)}\r\n className=\"group inline-flex items-center gap-2 px-3 py-2 rounded-[var(--radius-button)] bg-[var(--bg-primary)] border border-[var(--warning-border)] hover:shadow-sm transition-all\"\r\n >\r\n <code className=\"text-sm font-mono font-medium text-[var(--text-primary)]\">{perm.code}</code>\r\n {copiedPermission === perm.code ? (\r\n <Check className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n ) : (\r\n <Copy className=\"w-4 h-4 text-[var(--warning-text)]\" />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Error/Success Messages */}\r\n {error && (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"text-sm text-[var(--error-text)]\">{error}</span>\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n <span className=\"text-sm text-[var(--success-text)]\">{success}</span>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Credentials Section */}\r\n <SectionCard icon={Key} title={t('entra:settings.credentials')} description=\"Azure AD Application\">\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('entra:settings.tenantId')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n autoComplete=\"off\"\r\n value={credentials.tenantId}\r\n onChange={(e) => handleCredentialChange('tenantId', e.target.value)}\r\n placeholder=\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\n className={`w-full px-3 py-2.5 rounded-[var(--radius-input)] border bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:border-transparent transition-shadow ${\r\n validationErrors.tenantId ? 'border-[var(--error-border)] focus:ring-[var(--error-border)]' : 'border-[var(--border-color)] focus:ring-[var(--color-accent-500)]'\r\n }`}\r\n />\r\n {validationErrors.tenantId && (\r\n <p className=\"mt-1.5 text-xs text-[var(--error-text)]\">{validationErrors.tenantId}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('entra:settings.clientId')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n autoComplete=\"off\"\r\n value={credentials.clientId}\r\n onChange={(e) => handleCredentialChange('clientId', e.target.value)}\r\n placeholder=\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\n className={`w-full px-3 py-2.5 rounded-[var(--radius-input)] border bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:border-transparent transition-shadow ${\r\n validationErrors.clientId ? 'border-[var(--error-border)] focus:ring-[var(--error-border)]' : 'border-[var(--border-color)] focus:ring-[var(--color-accent-500)]'\r\n }`}\r\n />\r\n {validationErrors.clientId && (\r\n <p className=\"mt-1.5 text-xs text-[var(--error-text)]\">{validationErrors.clientId}</p>\r\n )}\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('entra:settings.clientSecret')}\r\n {hasExistingSecret && (\r\n <span className=\"ml-2 inline-flex items-center gap-1 text-xs text-[var(--success-text)]\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('common:configured')}\r\n </span>\r\n )}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showSecret ? 'text' : 'password'}\r\n autoComplete=\"new-password\"\r\n value={credentials.clientSecret}\r\n onChange={(e) => handleCredentialChange('clientSecret', e.target.value)}\r\n placeholder={hasExistingSecret ? '••••••••••••••••' : 'OvA8Q~xxxxxxxxxxxx'}\r\n className=\"w-full px-3 py-2.5 pr-10 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowSecret(!showSecret)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\r\n >\r\n {showSecret ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 sm:gap-3 pt-2\">\r\n <button\r\n onClick={handleTestConnection}\r\n disabled={testing || hasValidationErrors || !credentials.tenantId || !credentials.clientId || (!credentials.clientSecret && !hasExistingSecret)}\r\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {testing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <TestTube className=\"w-4 h-4\" />}\r\n {t('entra:settings.testConnection')}\r\n </button>\r\n <button\r\n onClick={handleSaveCredentials}\r\n disabled={saving || hasValidationErrors || !credentials.tenantId || !credentials.clientId || !credentials.clientSecret}\r\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n\r\n {testResult?.success && (\r\n <div className=\"mt-4 p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n <span className=\"font-medium text-[var(--success-text)]\">{t('entra:settings.connectionSuccessful')}</span>\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-3 text-sm\">\r\n {testResult.tenantName && <div><span className=\"text-[var(--text-tertiary)]\">Tenant:</span> {testResult.tenantName}</div>}\r\n {testResult.userCount !== null && <div><span className=\"text-[var(--text-tertiary)]\">Users:</span> {testResult.userCount}</div>}\r\n {testResult.groupCount !== null && <div><span className=\"text-[var(--text-tertiary)]\">Groups:</span> {testResult.groupCount}</div>}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </SectionCard>\r\n\r\n {/* Sync Settings */}\r\n <div className=\"space-y-6\">\r\n <SectionCard icon={Clock} title={t('entra:settings.syncSettings')} description=\"Scheduling & Performance\">\r\n <div className=\"divide-y divide-[var(--border-subtle)]\">\r\n <Toggle\r\n checked={syncSettings.syncEnabled}\r\n onChange={() => setSyncSettings(prev => ({ ...prev, syncEnabled: !prev.syncEnabled }))}\r\n label={t('entra:settings.syncEnabled')}\r\n description={t('entra:settings.syncEnabledHelp')}\r\n />\r\n <div className=\"py-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-2\">\r\n {t('entra:settings.syncInterval')}\r\n </label>\r\n <select\r\n value={syncSettings.syncIntervalMinutes}\r\n onChange={(e) => setSyncSettings(prev => ({ ...prev, syncIntervalMinutes: Number(e.target.value) }))}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value={15} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">15 {t('common:minutes')}</option>\r\n <option value={30} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">30 {t('common:minutes')}</option>\r\n <option value={60} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">1 {t('common:hour')}</option>\r\n <option value={120} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">2 {t('common:hours')}</option>\r\n <option value={360} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">6 {t('common:hours')}</option>\r\n <option value={720} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">12 {t('common:hours')}</option>\r\n <option value={1440} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">24 {t('common:hours')}</option>\r\n </select>\r\n </div>\r\n <Toggle\r\n checked={syncSettings.useDeltaSync}\r\n onChange={() => setSyncSettings(prev => ({ ...prev, useDeltaSync: !prev.useDeltaSync }))}\r\n label={t('entra:settings.useDeltaSync')}\r\n description={t('entra:settings.useDeltaSyncHelp')}\r\n />\r\n </div>\r\n </SectionCard>\r\n\r\n <SectionCard icon={GitMerge} title={t('entra:settings.conflictResolution')} description=\"Data Priority\">\r\n <select\r\n value={syncSettings.defaultConflictResolution}\r\n onChange={(e) => setSyncSettings(prev => ({ ...prev, defaultConflictResolution: e.target.value as 'ManualReview' | 'EntraWins' | 'LocalWins' }))}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"ManualReview\" className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">{t('entra:settings.conflictResolutions.manualReview')}</option>\r\n <option value=\"EntraWins\" className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">{t('entra:settings.conflictResolutions.entraWins')}</option>\r\n <option value=\"LocalWins\" className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">{t('entra:settings.conflictResolutions.localWins')}</option>\r\n </select>\r\n </SectionCard>\r\n\r\n <SectionCard icon={Filter} title={t('entra:settings.userSyncFilters')} description=\"User Types\">\r\n <div className=\"space-y-4\">\r\n <Toggle\r\n checked={syncSettings.syncOnlyActiveUsers}\r\n onChange={() => setSyncSettings(prev => ({ ...prev, syncOnlyActiveUsers: !prev.syncOnlyActiveUsers }))}\r\n label={t('entra:settings.syncOnlyActiveUsers')}\r\n description={t('entra:settings.syncOnlyActiveUsersHelp')}\r\n />\r\n <div className=\"space-y-2 pt-2 border-t border-[var(--border-subtle)]\">\r\n {USER_TYPES.map((userType) => {\r\n const selectedTypes = syncSettings.syncUserTypes.split(',').map(s => s.trim()).filter(Boolean);\r\n const isChecked = selectedTypes.includes(userType.id);\r\n return (\r\n <label\r\n key={userType.id}\r\n className={`flex items-center gap-3 p-3 rounded-[var(--radius-button)] border cursor-pointer transition-all ${\r\n isChecked ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20' : 'border-[var(--border-color)] bg-[var(--bg-secondary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isChecked}\r\n onChange={() => {\r\n let newTypes = isChecked\r\n ? selectedTypes.filter(t => t !== userType.id)\r\n : [...selectedTypes, userType.id];\r\n if (newTypes.length === 0) newTypes = ['member'];\r\n setSyncSettings(prev => ({ ...prev, syncUserTypes: newTypes.join(',') }));\r\n }}\r\n className=\"w-4 h-4 rounded border-[var(--border-color)] text-[var(--color-accent-600)]\"\r\n />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t(`entra:settings.${userType.labelKey}`)}\r\n </span>\r\n </label>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </SectionCard>\r\n\r\n <div className=\"flex flex-col-reverse sm:flex-row items-stretch sm:items-center gap-2 sm:gap-3\">\r\n <button\r\n onClick={() => setEditing(false)}\r\n className=\"px-4 py-2.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors text-center\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveSettings}\r\n disabled={saving}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-2.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 transition-colors shadow-sm\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Sync Status Badge & Icon Helpers\r\n// ============================================\r\n\r\nconst StatusBadgeMap = {\r\n Completed: { bg: 'bg-[var(--success-bg)]', text: 'text-[var(--success-text)]', icon: CheckCircle },\r\n PartiallyCompleted: { bg: 'bg-[var(--warning-bg)]', text: 'text-[var(--warning-text)]', icon: AlertTriangle },\r\n Failed: { bg: 'bg-[var(--error-bg)]', text: 'text-[var(--error-text)]', icon: AlertTriangle },\r\n InProgress: { bg: 'bg-[var(--color-accent-100)]', text: 'text-[var(--color-accent-700)]', icon: Loader2 },\r\n Cancelled: { bg: 'bg-[var(--bg-tertiary)]', text: 'text-[var(--text-tertiary)]', icon: Square },\r\n};\r\n\r\nconst SyncStatusIconMap = {\r\n Success: <CheckCircle className=\"w-4 h-4 text-[var(--success-text)]\" />,\r\n Failed: <AlertTriangle className=\"w-4 h-4 text-[var(--error-text)]\" />,\r\n Running: <Loader2 className=\"w-4 h-4 text-[var(--color-accent-500)] animate-spin\" />,\r\n};\r\n\r\nconst getStatusBadge = (status: string, t: (key: string) => string) => {\r\n const badge = StatusBadgeMap[status as keyof typeof StatusBadgeMap];\r\n if (!badge) {\r\n return <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-[var(--bg-tertiary)] text-[var(--text-tertiary)]\">{status}</span>;\r\n }\r\n const Icon = badge.icon;\r\n const label = t(`admin:tenants.entra.history.${status.toLowerCase()}`);\r\n return <span className={`inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full ${badge.bg} ${badge.text}`}><Icon className={badge.icon === Loader2 ? \"w-3 h-3 animate-spin\" : \"w-3 h-3\"} /> {label}</span>;\r\n};\r\n\r\nconst getSyncStatusIcon = (status: string) => {\r\n return SyncStatusIconMap[status as keyof typeof SyncStatusIconMap] || <Clock className=\"w-4 h-4 text-[var(--text-tertiary)]\" />;\r\n};\r\n\r\n// ============================================\r\n// Sync Sub-Tab\r\n// ============================================\r\n\r\ninterface SyncTabProps {\r\n readonly config: EntraConfigurationDto | null;\r\n readonly conflicts: EntraSyncConflictDto[];\r\n readonly syncStatus: EntraSyncStatusDto[];\r\n readonly loading: boolean;\r\n readonly canSync: boolean;\r\n readonly onRefresh: () => void;\r\n readonly onResolveConflict: (conflict: EntraSyncConflictDto) => void;\r\n readonly onSyncAll: () => Promise<EntraSyncResultDto | null>;\r\n readonly onLoadHistory: (page: number, pageSize: number) => Promise<{ sessions: EntraSyncSessionDto[]; totalCount: number } | null>;\r\n readonly onCancelSession: (sessionId: string) => Promise<boolean>;\r\n readonly activeSyncSession: { sessionId: string; startedAt: Date } | null;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nconst formatDuration = (startedAt: string, completedAt: string | null): string => {\r\n if (!completedAt) return '-';\r\n const start = new Date(startedAt).getTime();\r\n const end = new Date(completedAt).getTime();\r\n const diffMs = end - start;\r\n if (diffMs < 1000) return `${diffMs}ms`;\r\n if (diffMs < 60000) return `${Math.round(diffMs / 1000)}s`;\r\n return `${Math.round(diffMs / 60000)}m`;\r\n};\r\n\r\nconst useSyncTabState = () => {\r\n const [syncing, setSyncing] = useState(false);\r\n const [lastSyncResult, setLastSyncResult] = useState<EntraSyncResultDto | null>(null);\r\n const [syncError, setSyncError] = useState<string | null>(null);\r\n const [history, setHistory] = useState<EntraSyncSessionDto[]>([]);\r\n const [historyLoading, setHistoryLoading] = useState(false);\r\n const [historyPage, setHistoryPage] = useState(1);\r\n const [historyTotalCount, setHistoryTotalCount] = useState(0);\r\n const [cancellingSessionId, setCancellingSessionId] = useState<string | null>(null);\r\n\r\n return {\r\n syncing, setSyncing, lastSyncResult, setLastSyncResult, syncError, setSyncError,\r\n history, setHistory, historyLoading, setHistoryLoading, historyPage, setHistoryPage,\r\n historyTotalCount, setHistoryTotalCount, cancellingSessionId, setCancellingSessionId\r\n };\r\n};\r\n\r\nfunction SyncTab({ config, conflicts, syncStatus, loading, canSync, onRefresh, onResolveConflict, onSyncAll, onLoadHistory, onCancelSession, activeSyncSession, t }: SyncTabProps) {\r\n const {\r\n syncing, setSyncing, lastSyncResult, setLastSyncResult, syncError, setSyncError,\r\n history, setHistory, historyLoading, setHistoryLoading, historyPage, setHistoryPage,\r\n historyTotalCount, setHistoryTotalCount, cancellingSessionId, setCancellingSessionId\r\n } = useSyncTabState();\r\n const historyPageSize = 5;\r\n\r\n const loadHistory = useCallback(async (page: number) => {\r\n setHistoryLoading(true);\r\n try {\r\n const result = await onLoadHistory(page, historyPageSize);\r\n if (!result) return;\r\n setHistory(result.sessions);\r\n setHistoryTotalCount(result.totalCount);\r\n setHistoryPage(page);\r\n } catch (err) {\r\n console.error('Failed to load history:', err);\r\n } finally {\r\n setHistoryLoading(false);\r\n }\r\n }, [onLoadHistory]);\r\n\r\n useEffect(() => {\r\n if (config?.isConfigured) {\r\n loadHistory(1);\r\n }\r\n }, [config?.isConfigured, loadHistory]);\r\n\r\n const handleSyncNow = async () => {\r\n setSyncing(true);\r\n setSyncError(null);\r\n setLastSyncResult(null);\r\n try {\r\n const result = await onSyncAll();\r\n if (!result) return;\r\n setLastSyncResult(result);\r\n onRefresh();\r\n loadHistory(1);\r\n } catch (err) {\r\n console.error('Sync failed:', err instanceof Error ? err.message : 'Unknown error');\r\n setSyncError(t('admin:tenants.entra.sync.syncFailed'));\r\n } finally {\r\n setSyncing(false);\r\n }\r\n };\r\n\r\n const handleCancelSession = async (sessionId: string) => {\r\n setCancellingSessionId(sessionId);\r\n try {\r\n const success = await onCancelSession(sessionId);\r\n if (success) {\r\n loadHistory(historyPage);\r\n }\r\n } catch (err) {\r\n console.error('Failed to cancel session:', err instanceof Error ? err.message : 'Unknown error');\r\n } finally {\r\n setCancellingSessionId(null);\r\n }\r\n };\r\n\r\n if (!config?.isConfigured) {\r\n return (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <Info className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n <span className=\"text-sm text-[var(--warning-text)]\">\r\n {t('admin:tenants.entra.sync.configureFirst')}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Sync Actions Card */}\r\n <SectionCard\r\n icon={Play}\r\n title={t('admin:tenants.entra.sync.actionsTitle')}\r\n description={t('admin:tenants.entra.sync.actionsDescription')}\r\n >\r\n <div className=\"space-y-4\">\r\n {/* Sync Button */}\r\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 sm:gap-4\">\r\n <button\r\n onClick={handleSyncNow}\r\n disabled={syncing || activeSyncSession !== null || !canSync}\r\n className=\"w-full sm:w-auto inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm\"\r\n >\r\n {syncing || activeSyncSession ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n {syncing || activeSyncSession ? t('admin:tenants.entra.sync.syncing') : t('admin:tenants.entra.sync.syncNow')}\r\n </button>\r\n {!canSync && (\r\n <span className=\"text-xs text-[var(--text-tertiary)]\">\r\n {t('admin:tenants.entra.sync.noSyncPermission')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Sync Error */}\r\n {syncError && (\r\n <div className=\"flex items-center gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <AlertTriangle className=\"w-4 h-4 text-[var(--error-text)]\" />\r\n <span className=\"text-sm text-[var(--error-text)]\">{syncError}</span>\r\n </div>\r\n )}\r\n\r\n {/* Last Sync Result */}\r\n {lastSyncResult && (\r\n <div className={`p-4 rounded-[var(--radius-card)] border ${lastSyncResult.success ? 'bg-[var(--success-bg)] border-[var(--success-border)]' : 'bg-[var(--error-bg)] border-[var(--error-border)]'}`}>\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n {lastSyncResult.success ? (\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n ) : (\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n )}\r\n <span className={`font-medium ${lastSyncResult.success ? 'text-[var(--success-text)]' : 'text-[var(--error-text)]'}`}>\r\n {lastSyncResult.success ? t('admin:tenants.entra.sync.syncSuccess') : t('admin:tenants.entra.sync.syncFailed')}\r\n </span>\r\n </div>\r\n <div className=\"grid grid-cols-3 sm:grid-cols-5 gap-2 sm:gap-3 text-sm\">\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)] text-center sm:text-left\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.created')}</span>\r\n <p className=\"font-semibold text-[var(--success-text)]\">+{lastSyncResult.created}</p>\r\n </div>\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)] text-center sm:text-left\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.updated')}</span>\r\n <p className=\"font-semibold text-[var(--color-accent-600)]\">~{lastSyncResult.updated}</p>\r\n </div>\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)] text-center sm:text-left\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.deleted')}</span>\r\n <p className=\"font-semibold text-[var(--error-text)]\">-{lastSyncResult.deleted}</p>\r\n </div>\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)] text-center sm:text-left\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.skipped')}</span>\r\n <p className=\"font-semibold text-[var(--text-secondary)]\">{lastSyncResult.skipped}</p>\r\n </div>\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)] text-center sm:text-left col-span-3 sm:col-span-1\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.conflicts')}</span>\r\n <p className={`font-semibold ${lastSyncResult.conflicts > 0 ? 'text-[var(--warning-text)]' : 'text-[var(--text-primary)]'}`}>{lastSyncResult.conflicts}</p>\r\n </div>\r\n </div>\r\n {lastSyncResult.errorMessage && (\r\n <p className=\"mt-3 text-sm text-[var(--error-text)]\">{lastSyncResult.errorMessage}</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </SectionCard>\r\n\r\n {/* Sync Status Card */}\r\n <SectionCard\r\n icon={Zap}\r\n title={t('admin:tenants.entra.sync.statusTitle')}\r\n description={t('admin:tenants.entra.sync.statusDescription')}\r\n action={\r\n <button\r\n onClick={onRefresh}\r\n disabled={loading}\r\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors disabled:opacity-50\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\r\n {t('common:refresh')}\r\n </button>\r\n }\r\n >\r\n {syncStatus.length > 0 ? (\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\r\n {syncStatus.map((status) => (\r\n <div\r\n key={status.resourceType}\r\n className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\"\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t(`entra:resourceTypes.${status.resourceType.toLowerCase()}`)}\r\n </span>\r\n {getSyncStatusIcon(status.status)}\r\n </div>\r\n <div className=\"space-y-1 text-xs text-[var(--text-tertiary)]\">\r\n <p>{t('admin:tenants.entra.sync.itemsSynced', { count: status.totalItemsSynced })}</p>\r\n {status.lastFullSyncAt && (\r\n <p>{t('admin:tenants.entra.sync.lastSync', { date: new Date(status.lastFullSyncAt).toLocaleDateString() })}</p>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.sync.noStatus')}\r\n </p>\r\n )}\r\n </SectionCard>\r\n\r\n <SectionCard\r\n icon={AlertTriangle}\r\n title={t('admin:tenants.entra.conflicts.title')}\r\n description={t('admin:tenants.entra.conflicts.description', { count: conflicts.length })}\r\n >\r\n {conflicts.length === 0 ? (\r\n <div className=\"text-center py-8\">\r\n <div className=\"mx-auto w-12 h-12 rounded-full bg-[var(--success-bg)] flex items-center justify-center mb-3\">\r\n <CheckCircle className=\"w-6 h-6 text-[var(--success-text)]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-1\">\r\n {t('entra:conflicts.noConflicts')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('entra:conflicts.noConflictsDescription')}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n {conflicts.map((conflict) => (\r\n <ConflictCard\r\n key={conflict.id}\r\n conflict={conflict}\r\n onResolve={onResolveConflict}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </SectionCard>\r\n\r\n {/* Sync History Card */}\r\n <SectionCard\r\n icon={History}\r\n title={t('admin:tenants.entra.history.title')}\r\n description={t('admin:tenants.entra.history.description')}\r\n action={\r\n <button\r\n onClick={() => loadHistory(historyPage)}\r\n disabled={historyLoading}\r\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)] transition-colors disabled:opacity-50\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${historyLoading ? 'animate-spin' : ''}`} />\r\n {t('common:refresh')}\r\n </button>\r\n }\r\n >\r\n {historyLoading && history.length === 0 && (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!(historyLoading && history.length === 0) && history.length === 0 && (\r\n <div className=\"text-center py-8\">\r\n <div className=\"mx-auto w-12 h-12 rounded-full bg-[var(--bg-tertiary)] flex items-center justify-center mb-3\">\r\n <History className=\"w-6 h-6 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.history.noHistory')}\r\n </p>\r\n </div>\r\n )}\r\n {history.length > 0 && (\r\n <div className=\"space-y-4\">\r\n {/* Mobile: Card-based layout */}\r\n <div className=\"block sm:hidden space-y-3\">\r\n {history.map((session) => (\r\n <div key={session.id} className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {session.isFullSync ? (\r\n <span className=\"px-2 py-0.5 text-xs rounded bg-[var(--color-accent-100)] text-[var(--color-accent-700)]\">{t('admin:tenants.entra.history.fullSync')}</span>\r\n ) : (\r\n <span className=\"px-2 py-0.5 text-xs rounded bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.deltaSync')}</span>\r\n )}\r\n {getStatusBadge(session.status, t)}\r\n </div>\r\n {session.status === 'InProgress' && canSync && (\r\n <button\r\n onClick={() => handleCancelSession(session.id)}\r\n disabled={cancellingSessionId === session.id}\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-[var(--radius-button)] bg-[var(--error-bg)] text-[var(--error-text)]\"\r\n >\r\n {cancellingSessionId === session.id ? <Loader2 className=\"w-3 h-3 animate-spin\" /> : <Square className=\"w-3 h-3\" />}\r\n {t('common:cancel')}\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-tertiary)] mb-2\">\r\n {new Date(session.startedAt).toLocaleString()} • {formatDuration(session.startedAt, session.completedAt)}\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-2 text-center\">\r\n <div className=\"p-1.5 rounded bg-[var(--bg-primary)]\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.created')}</span>\r\n <span className=\"font-medium text-[var(--success-text)]\">+{session.created}</span>\r\n </div>\r\n <div className=\"p-1.5 rounded bg-[var(--bg-primary)]\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.updated')}</span>\r\n <span className=\"font-medium text-[var(--color-accent-600)]\">~{session.updated}</span>\r\n </div>\r\n <div className=\"p-1.5 rounded bg-[var(--bg-primary)]\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">{t('admin:tenants.entra.sync.deleted')}</span>\r\n <span className=\"font-medium text-[var(--error-text)]\">-{session.deleted}</span>\r\n </div>\r\n </div>\r\n <div className=\"mt-2 pt-2 border-t border-[var(--border-subtle)] text-xs text-[var(--text-secondary)]\">\r\n {session.triggerType === 'Manual' ? (\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n {session.triggeredByUserName || t('admin:tenants.entra.history.unknownUser')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 text-[var(--text-tertiary)]\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('admin:tenants.entra.history.scheduled')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Desktop: Table layout */}\r\n <div className=\"hidden sm:block overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.date')}</th>\r\n <th className=\"text-left py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.type')}</th>\r\n <th className=\"text-left py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.status')}</th>\r\n <th className=\"text-right py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.duration')}</th>\r\n <th className=\"text-right py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.sync.created')}</th>\r\n <th className=\"text-right py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.sync.updated')}</th>\r\n <th className=\"text-right py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.sync.deleted')}</th>\r\n <th className=\"text-left py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.triggeredBy')}</th>\r\n <th className=\"text-center py-2 px-3 font-medium text-[var(--text-secondary)]\">{t('common:actionsColumn')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {history.map((session) => (\r\n <tr key={session.id} className=\"border-b border-[var(--border-subtle)] hover:bg-[var(--bg-secondary)]\">\r\n <td className=\"py-2 px-3 text-[var(--text-primary)]\">\r\n {new Date(session.startedAt).toLocaleString()}\r\n </td>\r\n <td className=\"py-2 px-3\">\r\n <span className=\"inline-flex items-center gap-1 text-xs\">\r\n {session.isFullSync ? (\r\n <span className=\"px-2 py-0.5 rounded bg-[var(--color-accent-100)] text-[var(--color-accent-700)]\">{t('admin:tenants.entra.history.fullSync')}</span>\r\n ) : (\r\n <span className=\"px-2 py-0.5 rounded bg-[var(--bg-tertiary)] text-[var(--text-secondary)]\">{t('admin:tenants.entra.history.deltaSync')}</span>\r\n )}\r\n </span>\r\n </td>\r\n <td className=\"py-2 px-3\">\r\n {getStatusBadge(session.status, t)}\r\n </td>\r\n <td className=\"py-2 px-3 text-right text-[var(--text-secondary)]\">\r\n {formatDuration(session.startedAt, session.completedAt)}\r\n </td>\r\n <td className=\"py-2 px-3 text-right text-[var(--success-text)] font-medium\">\r\n +{session.created}\r\n </td>\r\n <td className=\"py-2 px-3 text-right text-[var(--color-accent-600)] font-medium\">\r\n ~{session.updated}\r\n </td>\r\n <td className=\"py-2 px-3 text-right text-[var(--error-text)] font-medium\">\r\n -{session.deleted}\r\n </td>\r\n <td className=\"py-2 px-3 text-[var(--text-secondary)]\">\r\n {session.triggerType === 'Manual' ? (\r\n <span className=\"flex items-center gap-1\">\r\n <Users className=\"w-3 h-3\" />\r\n {session.triggeredByUserName || t('admin:tenants.entra.history.unknownUser')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 text-[var(--text-tertiary)]\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('admin:tenants.entra.history.scheduled')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"py-2 px-3 text-center\">\r\n {session.status === 'InProgress' && canSync && (\r\n <button\r\n onClick={() => handleCancelSession(session.id)}\r\n disabled={cancellingSessionId === session.id}\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-[var(--radius-button)] bg-[var(--error-bg)] text-[var(--error-text)] hover:bg-[var(--error-border)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('admin:tenants.entra.history.cancelSync')}\r\n >\r\n {cancellingSessionId === session.id ? (\r\n <Loader2 className=\"w-3 h-3 animate-spin\" />\r\n ) : (\r\n <Square className=\"w-3 h-3\" />\r\n )}\r\n {t('common:cancel')}\r\n </button>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* Pagination */}\r\n {historyTotalCount > historyPageSize && (\r\n <div className=\"flex items-center justify-between pt-4 border-t border-[var(--border-subtle)]\">\r\n <span className=\"text-sm text-[var(--text-tertiary)]\">\r\n {t('admin:tenants.entra.history.showing', {\r\n from: (historyPage - 1) * historyPageSize + 1,\r\n to: Math.min(historyPage * historyPageSize, historyTotalCount),\r\n total: historyTotalCount\r\n })}\r\n </span>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => loadHistory(historyPage - 1)}\r\n disabled={historyPage === 1 || historyLoading}\r\n className=\"px-3 py-1.5 text-sm rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common:previous')}\r\n </button>\r\n <button\r\n onClick={() => loadHistory(historyPage + 1)}\r\n disabled={historyPage * historyPageSize >= historyTotalCount || historyLoading}\r\n className=\"px-3 py-1.5 text-sm rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-secondary)] hover:bg-[var(--bg-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common:next')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </SectionCard>\r\n </div>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Users Sub-Tab (Placeholder)\r\n// ============================================\r\n\r\ninterface UsersTabProps {\r\n readonly config: EntraConfigurationDto | null;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction UsersTab({ config, t }: UsersTabProps) {\r\n if (!config?.isConfigured) {\r\n return (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <Info className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n <span className=\"text-sm text-[var(--warning-text)]\">\r\n {t('admin:tenants.entra.users.configureFirst')}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <SectionCard\r\n icon={Users}\r\n title={t('admin:tenants.entra.users.title')}\r\n description={t('admin:tenants.entra.users.description')}\r\n >\r\n <div className=\"text-center py-8\">\r\n <div className=\"mx-auto w-12 h-12 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Users className=\"w-6 h-6 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-1\">\r\n {t('admin:tenants.entra.users.comingSoon')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.users.comingSoonDescription')}\r\n </p>\r\n </div>\r\n </SectionCard>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Groups Sub-Tab (Placeholder)\r\n// ============================================\r\n\r\ninterface GroupsTabProps {\r\n readonly config: EntraConfigurationDto | null;\r\n readonly t: (key: string, options?: Record<string, unknown>) => string;\r\n}\r\n\r\nfunction GroupsTab({ config, t }: GroupsTabProps) {\r\n if (!config?.isConfigured) {\r\n return (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--warning-bg)] border border-[var(--warning-border)]\">\r\n <Info className=\"w-5 h-5 text-[var(--warning-text)]\" />\r\n <span className=\"text-sm text-[var(--warning-text)]\">\r\n {t('admin:tenants.entra.groups.configureFirst')}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <SectionCard\r\n icon={Building2}\r\n title={t('admin:tenants.entra.groups.title')}\r\n description={t('admin:tenants.entra.groups.description')}\r\n >\r\n <div className=\"text-center py-8\">\r\n <div className=\"mx-auto w-12 h-12 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Building2 className=\"w-6 h-6 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-1\">\r\n {t('admin:tenants.entra.groups.comingSoon')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:tenants.entra.groups.comingSoonDescription')}\r\n </p>\r\n </div>\r\n </SectionCard>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Main Component\r\n// ============================================\r\n\r\nexport function TenantEntraTab({ tenantId, tenantSlug }: TenantEntraTabProps): ReactElement {\r\n const { t } = useTranslation(['admin', 'entra', 'common']);\r\n const { hasPermission } = useAuth();\r\n const { isConnected, onNotification } = useSignalRContext();\r\n const [activeSubTab, setActiveSubTab] = useState<SubTabId>('config');\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // Create API instance with tenant context\r\n // This ensures all API calls include the correct X-Tenant-Slug header\r\n const entraApi = useMemo(() => createEntraApi(tenantSlug), [tenantSlug]);\r\n\r\n // Data state\r\n const [config, setConfig] = useState<EntraConfigurationDto | null>(null);\r\n const [conflicts, setConflicts] = useState<EntraSyncConflictDto[]>([]);\r\n const [syncStatus, setSyncStatus] = useState<EntraSyncStatusDto[]>([]);\r\n const [selectedConflict, setSelectedConflict] = useState<EntraSyncConflictDto | null>(null);\r\n const [resolving, setResolving] = useState(false);\r\n\r\n // Real-time sync state\r\n const [activeSyncSession, setActiveSyncSession] = useState<{ sessionId: string; startedAt: Date } | null>(null);\r\n const [syncElapsedTime, setSyncElapsedTime] = useState<string>('00:00');\r\n\r\n // Abort controller\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n const isLoadingRef = useRef(false);\r\n\r\n // Permissions\r\n const canRead = hasPermission(ENTRA_PERMISSIONS.READ);\r\n const canEdit = hasPermission(ENTRA_PERMISSIONS.UPDATE);\r\n const canSync = hasPermission(ENTRA_PERMISSIONS.SYNC);\r\n\r\n // Define sub-tabs\r\n const subTabs: SubTab[] = [\r\n { id: 'config', label: t('admin:tenants.entra.tabs.config'), icon: Key, permission: ENTRA_PERMISSIONS.READ },\r\n { id: 'sync', label: t('admin:tenants.entra.tabs.sync'), icon: Zap, permission: ENTRA_PERMISSIONS.SYNC },\r\n { id: 'users', label: t('admin:tenants.entra.tabs.users'), icon: Users, permission: ENTRA_PERMISSIONS.READ },\r\n { id: 'groups', label: t('admin:tenants.entra.tabs.groups'), icon: Building2, permission: ENTRA_PERMISSIONS.READ },\r\n ];\r\n\r\n const availableTabs = subTabs.filter((tab) => hasPermission(tab.permission));\r\n\r\n useEffect(() => {\r\n if (availableTabs.length > 0 && !availableTabs.find((tab) => tab.id === activeSubTab)) {\r\n setActiveSubTab(availableTabs[0].id);\r\n }\r\n }, [availableTabs, activeSubTab]);\r\n\r\n const loadData = useCallback(async () => {\r\n if (isLoadingRef.current) return;\r\n\r\n if (!canRead) {\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n\r\n abortControllerRef.current = new AbortController();\r\n isLoadingRef.current = true;\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const [configData, conflictsData, syncStatusData] = await Promise.all([\r\n entraApi.settings.getConfiguration(),\r\n entraApi.conflicts.getAll(),\r\n entraApi.dashboard.getSyncStatus(),\r\n ]);\r\n\r\n setConfig(configData ?? null);\r\n setConflicts(Array.isArray(conflictsData) ? conflictsData : []);\r\n setSyncStatus(Array.isArray(syncStatusData) ? syncStatusData : []);\r\n } catch (err) {\r\n if (err instanceof Error && err.name === 'AbortError') return;\r\n console.error('Failed to load Entra data:', err instanceof Error ? err.message : 'Unknown error');\r\n setError(t('admin:tenants.entra.loadError'));\r\n } finally {\r\n isLoadingRef.current = false;\r\n setLoading(false);\r\n }\r\n }, [entraApi, t, canRead]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n return () => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n };\r\n }, [loadData, tenantId]);\r\n\r\n // Subscribe to SignalR notifications for real-time updates\r\n useEffect(() => {\r\n const unsubscribe = onNotification((notification: SignalRNotificationDto) => {\r\n handleEntraNotification(notification, setActiveSyncSession, loadData);\r\n });\r\n\r\n return unsubscribe;\r\n }, [onNotification, loadData]);\r\n\r\n // Timer for active sync session elapsed time\r\n useEffect(() => {\r\n if (!activeSyncSession) {\r\n setSyncElapsedTime('00:00');\r\n return;\r\n }\r\n\r\n setSyncElapsedTime(calculateElapsedTime(activeSyncSession.startedAt));\r\n const interval = setInterval(() => {\r\n setSyncElapsedTime(calculateElapsedTime(activeSyncSession.startedAt));\r\n }, 1000);\r\n\r\n return () => clearInterval(interval);\r\n }, [activeSyncSession]);\r\n\r\n const handleResolve = useCallback(async (resolution: ResolveConflictRequest['resolution'], notes?: string) => {\r\n if (!selectedConflict || resolving) return;\r\n\r\n setResolving(true);\r\n try {\r\n await entraApi.conflicts.resolve(selectedConflict.id, {\r\n resolution,\r\n notes: notes || undefined,\r\n });\r\n setSelectedConflict(null);\r\n await loadData();\r\n } catch (err) {\r\n console.error('Failed to resolve conflict:', err instanceof Error ? err.message : 'Unknown error');\r\n setError(t('entra:conflicts.resolveError'));\r\n } finally {\r\n setResolving(false);\r\n }\r\n }, [entraApi, selectedConflict, resolving, loadData, t]);\r\n\r\n const handleSyncAll = useCallback(async (): Promise<EntraSyncResultDto | null> => {\r\n try {\r\n const result = await entraApi.sync.syncAll();\r\n return result;\r\n } catch (err) {\r\n console.error('Sync all failed:', err instanceof Error ? err.message : 'Unknown error');\r\n throw err;\r\n }\r\n }, [entraApi]);\r\n\r\n const handleLoadHistory = useCallback(async (page: number, pageSize: number): Promise<{ sessions: EntraSyncSessionDto[]; totalCount: number } | null> => {\r\n try {\r\n const result = await entraApi.sync.getHistory(page, pageSize);\r\n return result;\r\n } catch (err) {\r\n console.error('Failed to load history:', err instanceof Error ? err.message : 'Unknown error');\r\n return null;\r\n }\r\n }, [entraApi]);\r\n\r\n const handleCancelSession = useCallback(async (sessionId: string): Promise<boolean> => {\r\n try {\r\n await entraApi.sync.cancelSession(sessionId);\r\n return true;\r\n } catch (err) {\r\n console.error('Failed to cancel session:', err instanceof Error ? err.message : 'Unknown error');\r\n return false;\r\n }\r\n }, [entraApi]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (availableTabs.length === 0) {\r\n return (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <Lock className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"text-sm text-[var(--error-text)]\">\r\n {t('admin:tenants.entra.noPermission')}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {error && (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"text-sm text-[var(--error-text)]\">{error}</span>\r\n <button onClick={() => setError(null)} className=\"ml-auto text-[var(--error-text)] hover:opacity-70\">×</button>\r\n </div>\r\n )}\r\n\r\n {/* Active Sync Banner */}\r\n {activeSyncSession && (\r\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center gap-3 flex-1\">\r\n <RefreshCw className=\"w-5 h-5 text-[var(--color-accent-600)] animate-spin flex-shrink-0\" />\r\n <div className=\"min-w-0\">\r\n <p className=\"font-medium text-[var(--color-accent-700)] dark:text-[var(--color-accent-400)]\">\r\n {t('admin:tenants.entra.sync.syncInProgress')}\r\n </p>\r\n <p className=\"text-sm text-[var(--color-accent-600)] dark:text-[var(--color-accent-500)] truncate\">\r\n {t('admin:tenants.entra.sync.syncInProgressDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 self-end sm:self-auto\">\r\n <span className=\"text-lg font-mono font-bold text-[var(--color-accent-700)] dark:text-[var(--color-accent-400)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/50 px-3 py-1 rounded\">\r\n ⏱ {syncElapsedTime}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Sub-tab Navigation */}\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-1 p-1 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex flex-wrap items-center gap-1 flex-1\">\r\n {availableTabs.map((tab) => {\r\n const Icon = tab.icon;\r\n const isActive = activeSubTab === tab.id;\r\n // Show badge for sync tab when there are conflicts\r\n const showConflictBadge = tab.id === 'sync' && conflicts.length > 0;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => setActiveSubTab(tab.id)}\r\n className={`flex items-center gap-2 px-3 sm:px-4 py-2 text-sm font-medium rounded-[var(--radius-button)] transition-all flex-1 sm:flex-none justify-center sm:justify-start ${\r\n isActive\r\n ? 'bg-[var(--bg-card)] text-[var(--text-primary)] shadow-sm'\r\n : 'text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <Icon className=\"w-4 h-4\" />\r\n <span className=\"hidden sm:inline\">{tab.label}</span>\r\n {showConflictBadge && (\r\n <span className=\"ml-1 px-1.5 py-0.5 text-xs font-bold rounded-full bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n {conflicts.length}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n {/* Connection status indicator */}\r\n <div className=\"flex items-center justify-center sm:justify-end gap-2 px-2 py-1 border-t sm:border-t-0 sm:border-l border-[var(--border-subtle)] mt-1 sm:mt-0 pt-2 sm:pt-0\">\r\n {isConnected ? (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--success-text)]\" title={t('admin:tenants.entra.realTimeConnected')}>\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--success-text)] animate-pulse\" />\r\n <span className=\"hidden sm:inline\">{t('common:live')}</span>\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1.5 text-xs text-[var(--text-tertiary)]\" title={t('admin:tenants.entra.realTimeDisconnected')}>\r\n <span className=\"w-2 h-2 rounded-full bg-[var(--text-tertiary)]\" />\r\n <span className=\"hidden sm:inline\">{t('common:offline')}</span>\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Sub-tab Content */}\r\n {activeSubTab === 'config' && (\r\n <ConfigTab\r\n config={config}\r\n loading={loading}\r\n canEdit={canEdit}\r\n onRefresh={loadData}\r\n onConfigUpdated={loadData}\r\n t={t}\r\n entraApi={entraApi}\r\n />\r\n )}\r\n {activeSubTab === 'sync' && (\r\n <SyncTab\r\n config={config}\r\n conflicts={conflicts}\r\n syncStatus={syncStatus}\r\n loading={loading}\r\n canSync={canSync}\r\n onRefresh={loadData}\r\n onResolveConflict={setSelectedConflict}\r\n onSyncAll={handleSyncAll}\r\n onLoadHistory={handleLoadHistory}\r\n onCancelSession={handleCancelSession}\r\n activeSyncSession={activeSyncSession}\r\n t={t}\r\n />\r\n )}\r\n {activeSubTab === 'users' && <UsersTab config={config} t={t} />}\r\n {activeSubTab === 'groups' && <GroupsTab config={config} t={t} />}\r\n\r\n {/* Resolution Modal */}\r\n {selectedConflict && (\r\n <ResolutionModal\r\n conflict={selectedConflict}\r\n onClose={() => setSelectedConflict(null)}\r\n onResolve={handleResolve}\r\n resolving={resolving}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { TFunction } from 'i18next';\r\nimport {\r\n Settings,\r\n Save,\r\n Loader2,\r\n CheckCircle,\r\n AlertTriangle,\r\n TestTube,\r\n Eye,\r\n EyeOff,\r\n RefreshCw,\r\n Clock,\r\n Zap,\r\n ExternalLink,\r\n Info,\r\n} from 'lucide-react';\r\nimport { Tooltip } from '@/components/ui/Tooltip';\r\nimport {\r\n ticketingApi,\r\n type TenantTicketingConfigurationDto,\r\n type SaveTicketingConfigurationRequest,\r\n type TicketingSyncResultDto,\r\n} from '@/services/api/ticketingApi';\r\n\r\nfunction validateGlpiConfig(fields: {\r\n glpiBaseUrl: string;\r\n glpiClientId: string;\r\n glpiClientSecret: string;\r\n glpiUsername: string;\r\n glpiPassword: string;\r\n}, config: TenantTicketingConfigurationDto | null, t: TFunction): Record<string, string> {\r\n const errors: Record<string, string> = {};\r\n\r\n if (!fields.glpiBaseUrl.trim()) {\r\n errors.glpiBaseUrl = t('admin:tenants.ticketing.validation.baseUrlRequired');\r\n } else {\r\n try {\r\n new URL(fields.glpiBaseUrl);\r\n } catch {\r\n errors.glpiBaseUrl = t('admin:tenants.ticketing.validation.baseUrlInvalid');\r\n }\r\n }\r\n if (!fields.glpiClientId.trim()) {\r\n errors.glpiClientId = t('admin:tenants.ticketing.validation.clientIdRequired');\r\n }\r\n if (!fields.glpiClientSecret && !config?.hasGlpiClientSecret) {\r\n errors.glpiClientSecret = t('admin:tenants.ticketing.validation.clientSecretRequired');\r\n }\r\n if (!fields.glpiUsername.trim()) {\r\n errors.glpiUsername = t('admin:tenants.ticketing.validation.usernameRequired');\r\n }\r\n if (!fields.glpiPassword && !config?.hasGlpiPassword) {\r\n errors.glpiPassword = t('admin:tenants.ticketing.validation.passwordRequired');\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction buildGlpiSaveRequest(fields: {\r\n glpiBaseUrl: string;\r\n glpiClientId: string;\r\n glpiClientSecret: string;\r\n glpiUsername: string;\r\n glpiPassword: string;\r\n glpiEntityId: string;\r\n glpiRequestTypeId: string;\r\n}, provider: string, syncEnabled: boolean, syncIntervalMinutes: number): SaveTicketingConfigurationRequest {\r\n const request: SaveTicketingConfigurationRequest = {\r\n provider,\r\n syncEnabled,\r\n syncIntervalMinutes,\r\n };\r\n\r\n if (provider === 'GLPI') {\r\n request.glpiBaseUrl = fields.glpiBaseUrl;\r\n request.glpiClientId = fields.glpiClientId;\r\n if (fields.glpiClientSecret) {\r\n request.glpiClientSecret = fields.glpiClientSecret;\r\n }\r\n request.glpiUsername = fields.glpiUsername;\r\n if (fields.glpiPassword) {\r\n request.glpiPassword = fields.glpiPassword;\r\n }\r\n if (fields.glpiEntityId) {\r\n request.glpiEntityId = Number(fields.glpiEntityId);\r\n }\r\n if (fields.glpiRequestTypeId) {\r\n request.glpiRequestTypeId = Number(fields.glpiRequestTypeId);\r\n }\r\n }\r\n\r\n return request;\r\n}\r\n\r\ninterface TenantSupportSettingsTabProps {\r\n readonly tenantId: string;\r\n readonly tenantName: string;\r\n}\r\n\r\n// ============================================\r\n// Reusable Components (same pattern as TenantEntraTab)\r\n// ============================================\r\n\r\ninterface SectionCardProps {\r\n readonly icon: typeof Settings;\r\n readonly title: string;\r\n readonly description?: string;\r\n readonly action?: React.ReactNode;\r\n readonly children: React.ReactNode;\r\n}\r\n\r\nfunction SectionCard({ icon: Icon, title, description, action, children }: SectionCardProps) {\r\n return (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] shadow-sm overflow-hidden\">\r\n <div className=\"px-6 py-4 border-b border-[var(--border-subtle)] bg-[var(--bg-secondary)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-[var(--radius-button)] bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30\">\r\n <Icon className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <div>\r\n <h2 className=\"text-base font-semibold text-[var(--text-primary)]\">{title}</h2>\r\n {description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5\">{description}</p>\r\n )}\r\n </div>\r\n </div>\r\n {action}\r\n </div>\r\n </div>\r\n <div className=\"p-6\">\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ToggleProps {\r\n readonly checked: boolean;\r\n readonly onChange: () => void;\r\n readonly label: string;\r\n readonly description?: string;\r\n readonly disabled?: boolean;\r\n}\r\n\r\nfunction Toggle({ checked, onChange, label, description, disabled }: ToggleProps) {\r\n return (\r\n <div className=\"flex items-center justify-between py-3\">\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <label className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</label>\r\n {description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-0.5\">{description}</p>\r\n )}\r\n </div>\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={checked}\r\n onClick={onChange}\r\n disabled={disabled}\r\n className={`relative inline-flex h-6 w-11 flex-shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] focus:ring-offset-2 focus:ring-offset-[var(--bg-primary)] disabled:opacity-50 disabled:cursor-not-allowed ${\r\n checked ? 'bg-[var(--color-accent-600)]' : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-4 w-4 transform rounded-full bg-white shadow-md transition-transform ${\r\n checked ? 'translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction InfoBubble({ text }: { text: string }) {\r\n return (\r\n <Tooltip\r\n content={\r\n <span className=\"whitespace-pre-line text-xs leading-relaxed\">{text}</span>\r\n }\r\n position=\"right\"\r\n variant=\"info\"\r\n delay={100}\r\n className=\"!max-w-sm\"\r\n >\r\n <Info className=\"w-4 h-4 text-[var(--text-tertiary)] hover:text-[var(--info-text)] cursor-help transition-colors\" />\r\n </Tooltip>\r\n );\r\n}\r\n\r\n// ============================================\r\n// Main Component\r\n// ============================================\r\n\r\nexport function TenantSupportSettingsTab({ tenantId, tenantName }: TenantSupportSettingsTabProps): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n\r\n // State\r\n const [loading, setLoading] = useState(true);\r\n const [saving, setSaving] = useState(false);\r\n const [testing, setTesting] = useState(false);\r\n const [syncing, setSyncing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [showSecrets, setShowSecrets] = useState(false);\r\n const [config, setConfig] = useState<TenantTicketingConfigurationDto | null>(null);\r\n const [lastSyncResult, setLastSyncResult] = useState<TicketingSyncResultDto | null>(null);\r\n const [testResult, setTestResult] = useState<{ success: boolean; errorMessage?: string | null } | null>(null);\r\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\r\n\r\n // Form state\r\n const [provider, setProvider] = useState<string>('SmartStack');\r\n const [glpiBaseUrl, setGlpiBaseUrl] = useState('');\r\n const [glpiClientId, setGlpiClientId] = useState('');\r\n const [glpiClientSecret, setGlpiClientSecret] = useState('');\r\n const [glpiUsername, setGlpiUsername] = useState('');\r\n const [glpiPassword, setGlpiPassword] = useState('');\r\n const [glpiEntityId, setGlpiEntityId] = useState<string>('');\r\n const [glpiRequestTypeId, setGlpiRequestTypeId] = useState<string>('');\r\n const [syncEnabled, setSyncEnabled] = useState(false);\r\n const [syncIntervalMinutes, setSyncIntervalMinutes] = useState(60);\r\n\r\n const isGlpi = provider === 'GLPI';\r\n\r\n const fieldErrorClass = (field: string) =>\r\n fieldErrors[field] ? 'border-[var(--error-border)] ring-1 ring-[var(--error-border)]' : 'border-[var(--border-color)]';\r\n\r\n const loadConfiguration = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await ticketingApi.getConfiguration(tenantId);\r\n setConfig(data);\r\n setProvider(data.provider || 'SmartStack');\r\n setGlpiBaseUrl(data.glpiBaseUrl || '');\r\n setGlpiClientId(data.glpiClientId || '');\r\n setGlpiClientSecret('');\r\n setGlpiUsername(data.glpiUsername || '');\r\n setGlpiPassword('');\r\n setGlpiEntityId(data.glpiEntityId != null ? String(data.glpiEntityId) : '');\r\n setGlpiRequestTypeId(data.glpiRequestTypeId != null ? String(data.glpiRequestTypeId) : '');\r\n setSyncEnabled(data.syncEnabled);\r\n setSyncIntervalMinutes(data.syncIntervalMinutes);\r\n } catch {\r\n // Configuration may not exist yet, that's OK\r\n setConfig(null);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [tenantId]);\r\n\r\n useEffect(() => {\r\n loadConfiguration();\r\n }, [loadConfiguration]);\r\n\r\n const validateForm = (): boolean => {\r\n if (!isGlpi) {\r\n setFieldErrors({});\r\n return true;\r\n }\r\n\r\n const errors = validateGlpiConfig({\r\n glpiBaseUrl,\r\n glpiClientId,\r\n glpiClientSecret,\r\n glpiUsername,\r\n glpiPassword,\r\n }, config, t);\r\n\r\n setFieldErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!validateForm()) return;\r\n\r\n setSaving(true);\r\n setError(null);\r\n setSuccess(null);\r\n\r\n const request = buildGlpiSaveRequest({\r\n glpiBaseUrl,\r\n glpiClientId,\r\n glpiClientSecret,\r\n glpiUsername,\r\n glpiPassword,\r\n glpiEntityId,\r\n glpiRequestTypeId,\r\n }, provider, syncEnabled, syncIntervalMinutes);\r\n\r\n try {\r\n const updated = await ticketingApi.saveConfiguration(tenantId, request);\r\n setConfig(updated);\r\n setGlpiClientSecret('');\r\n setGlpiPassword('');\r\n setSuccess(t('admin:tenants.ticketing.saveSuccess'));\r\n } catch {\r\n setError(t('admin:tenants.ticketing.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleTestConnection = async () => {\r\n setTesting(true);\r\n setTestResult(null);\r\n setError(null);\r\n setSuccess(null);\r\n try {\r\n const result = await ticketingApi.testConnection(tenantId, {\r\n glpiBaseUrl: glpiBaseUrl,\r\n glpiClientId: glpiClientId,\r\n glpiClientSecret: glpiClientSecret || undefined,\r\n glpiUsername: glpiUsername,\r\n glpiPassword: glpiPassword || undefined,\r\n });\r\n setTestResult(result);\r\n if (result.success) {\r\n setSuccess(t('admin:tenants.ticketing.testSuccess'));\r\n } else {\r\n setError(result.errorMessage || t('admin:tenants.ticketing.testFailed'));\r\n }\r\n } catch {\r\n setError(t('admin:tenants.ticketing.testFailed'));\r\n } finally {\r\n setTesting(false);\r\n }\r\n };\r\n\r\n const handleSyncNow = async () => {\r\n setSyncing(true);\r\n setLastSyncResult(null);\r\n setError(null);\r\n setSuccess(null);\r\n try {\r\n const result = await ticketingApi.triggerSync(tenantId);\r\n setLastSyncResult(result);\r\n if (result.success) {\r\n setSuccess(t('admin:tenants.ticketing.syncSuccess', { count: result.ticketsUpdated }));\r\n } else {\r\n setError(result.errorMessage || t('admin:tenants.ticketing.syncFailed'));\r\n }\r\n await loadConfiguration();\r\n } catch {\r\n setError(t('admin:tenants.ticketing.syncFailed'));\r\n } finally {\r\n setSyncing(false);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Error / Success Messages */}\r\n {error && (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n <span className=\"text-sm text-[var(--error-text)]\">{error}</span>\r\n <button onClick={() => setError(null)} className=\"ml-auto text-[var(--error-text)] hover:opacity-70\">\r\n &times;\r\n </button>\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"flex items-center gap-3 p-4 rounded-[var(--radius-card)] bg-[var(--success-bg)] border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n <span className=\"text-sm text-[var(--success-text)]\">{success}</span>\r\n <button onClick={() => setSuccess(null)} className=\"ml-auto text-[var(--success-text)] hover:opacity-70\">\r\n &times;\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Provider Selection */}\r\n <SectionCard\r\n icon={Settings}\r\n title={t('admin:tenants.ticketing.provider.title')}\r\n description={t('admin:tenants.ticketing.provider.description', { tenantName })}\r\n >\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.provider.label')}\r\n </label>\r\n <select\r\n value={provider}\r\n onChange={(e) => {\r\n const newProvider = e.target.value;\r\n setProvider(newProvider);\r\n if (newProvider !== 'GLPI') {\r\n setSyncEnabled(false);\r\n }\r\n }}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value=\"SmartStack\" className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">\r\n SmartStack\r\n </option>\r\n <option value=\"GLPI\" className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">\r\n GLPI\r\n </option>\r\n </select>\r\n <p className=\"mt-1.5 text-xs text-[var(--text-tertiary)] whitespace-pre-line\">\r\n {isGlpi\r\n ? t('admin:tenants.ticketing.provider.glpiHint')\r\n : t('admin:tenants.ticketing.provider.smartstackHint')}\r\n </p>\r\n </div>\r\n\r\n {/* GLPI Connection Fields */}\r\n {isGlpi && (\r\n <>\r\n {/* Documentation Link */}\r\n <div className=\"flex items-start gap-3 p-3 rounded-[var(--radius-card)] bg-[var(--info-bg)] border border-[var(--info-border)]\">\r\n <ExternalLink className=\"w-4 h-4 text-[var(--info-text)] mt-0.5 flex-shrink-0\" />\r\n <div className=\"text-sm text-[var(--info-text)]\">\r\n <span>{t('admin:tenants.ticketing.glpi.docHint')} </span>\r\n <a\r\n href=\"https://glpi-project.org/documentation/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"font-medium underline hover:opacity-80\"\r\n >\r\n {t('admin:tenants.ticketing.glpi.docLink')}\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.baseUrl')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.baseUrlHelp')} />\r\n </label>\r\n <input\r\n type=\"url\"\r\n value={glpiBaseUrl}\r\n onChange={(e) => { setGlpiBaseUrl(e.target.value); setFieldErrors(prev => { const { glpiBaseUrl: _, ...rest } = prev; return rest; }); }}\r\n placeholder=\"https://glpi.example.com\"\r\n className={`w-full px-3 py-2.5 rounded-[var(--radius-input)] border ${fieldErrorClass('glpiBaseUrl')} bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow`}\r\n />\r\n {fieldErrors.glpiBaseUrl && <p className=\"mt-1 text-xs text-[var(--error-text)]\">{fieldErrors.glpiBaseUrl}</p>}\r\n </div>\r\n\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.clientId')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.clientIdHelp')} />\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={glpiClientId}\r\n onChange={(e) => { setGlpiClientId(e.target.value); setFieldErrors(prev => { const { glpiClientId: _, ...rest } = prev; return rest; }); }}\r\n placeholder={t('admin:tenants.ticketing.glpi.clientIdPlaceholder')}\r\n className={`w-full px-3 py-2.5 rounded-[var(--radius-input)] border ${fieldErrorClass('glpiClientId')} bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow`}\r\n />\r\n {fieldErrors.glpiClientId && <p className=\"mt-1 text-xs text-[var(--error-text)]\">{fieldErrors.glpiClientId}</p>}\r\n </div>\r\n\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.clientSecret')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.clientSecretHelp')} />\r\n {config?.hasGlpiClientSecret && (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--success-text)]\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('common:configured')}\r\n </span>\r\n )}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showSecrets ? 'text' : 'password'}\r\n autoComplete=\"new-password\"\r\n value={glpiClientSecret}\r\n onChange={(e) => { setGlpiClientSecret(e.target.value); setFieldErrors(prev => { const { glpiClientSecret: _, ...rest } = prev; return rest; }); }}\r\n placeholder={config?.hasGlpiClientSecret ? '••••••••••••••••' : t('admin:tenants.ticketing.glpi.clientSecretPlaceholder')}\r\n className={`w-full px-3 py-2.5 pr-10 rounded-[var(--radius-input)] border ${fieldErrorClass('glpiClientSecret')} bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow`}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowSecrets(!showSecrets)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\r\n >\r\n {showSecrets ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n {fieldErrors.glpiClientSecret && <p className=\"mt-1 text-xs text-[var(--error-text)]\">{fieldErrors.glpiClientSecret}</p>}\r\n </div>\r\n\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.username')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.usernameHelp')} />\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={glpiUsername}\r\n onChange={(e) => { setGlpiUsername(e.target.value); setFieldErrors(prev => { const { glpiUsername: _, ...rest } = prev; return rest; }); }}\r\n placeholder={t('admin:tenants.ticketing.glpi.usernamePlaceholder')}\r\n className={`w-full px-3 py-2.5 rounded-[var(--radius-input)] border ${fieldErrorClass('glpiUsername')} bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow`}\r\n />\r\n {fieldErrors.glpiUsername && <p className=\"mt-1 text-xs text-[var(--error-text)]\">{fieldErrors.glpiUsername}</p>}\r\n </div>\r\n\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.password')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.passwordHelp')} />\r\n {config?.hasGlpiPassword && (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--success-text)]\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('common:configured')}\r\n </span>\r\n )}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showSecrets ? 'text' : 'password'}\r\n autoComplete=\"new-password\"\r\n value={glpiPassword}\r\n onChange={(e) => { setGlpiPassword(e.target.value); setFieldErrors(prev => { const { glpiPassword: _, ...rest } = prev; return rest; }); }}\r\n placeholder={config?.hasGlpiPassword ? '••••••••••••••••' : t('admin:tenants.ticketing.glpi.passwordPlaceholder')}\r\n className={`w-full px-3 py-2.5 pr-10 rounded-[var(--radius-input)] border ${fieldErrorClass('glpiPassword')} bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] font-mono text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow`}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowSecrets(!showSecrets)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\r\n >\r\n {showSecrets ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n {fieldErrors.glpiPassword && <p className=\"mt-1 text-xs text-[var(--error-text)]\">{fieldErrors.glpiPassword}</p>}\r\n </div>\r\n\r\n {/* GLPI Entity ID */}\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.entityId')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.entityIdHelp')} />\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={glpiEntityId}\r\n onChange={(e) => setGlpiEntityId(e.target.value)}\r\n placeholder={t('admin:tenants.ticketing.glpi.entityIdPlaceholder')}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow\"\r\n />\r\n </div>\r\n\r\n {/* GLPI Request Type ID */}\r\n <div>\r\n <label className=\"flex items-center gap-2 text-sm font-medium text-[var(--text-primary)] mb-1.5\">\r\n {t('admin:tenants.ticketing.glpi.requestTypeId')}\r\n <InfoBubble text={t('admin:tenants.ticketing.glpi.requestTypeIdHelp')} />\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n value={glpiRequestTypeId}\r\n onChange={(e) => setGlpiRequestTypeId(e.target.value)}\r\n placeholder={t('admin:tenants.ticketing.glpi.requestTypeIdPlaceholder')}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder-[var(--text-muted)] text-sm focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] transition-shadow\"\r\n />\r\n </div>\r\n\r\n {/* Test Connection */}\r\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 sm:gap-3 pt-2\">\r\n <button\r\n onClick={handleTestConnection}\r\n disabled={testing || !glpiBaseUrl || !glpiClientId || (!glpiClientSecret && !config?.hasGlpiClientSecret) || !glpiUsername || (!glpiPassword && !config?.hasGlpiPassword)}\r\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium rounded-[var(--radius-button)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {testing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <TestTube className=\"w-4 h-4\" />}\r\n {t('admin:tenants.ticketing.testConnection')}\r\n </button>\r\n </div>\r\n\r\n {/* Test Connection Result */}\r\n {testResult && (\r\n <div className={`p-4 rounded-[var(--radius-card)] border ${\r\n testResult.success\r\n ? 'bg-[var(--success-bg)] border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] border-[var(--error-border)]'\r\n }`}>\r\n <div className=\"flex items-center gap-2\">\r\n {testResult.success ? (\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n ) : (\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n )}\r\n <span className={`font-medium ${testResult.success ? 'text-[var(--success-text)]' : 'text-[var(--error-text)]'}`}>\r\n {testResult.success\r\n ? t('admin:tenants.ticketing.connectionSuccessful')\r\n : t('admin:tenants.ticketing.connectionFailed')}\r\n </span>\r\n </div>\r\n {!testResult.success && testResult.errorMessage && (\r\n <p className=\"mt-2 text-sm text-[var(--error-text)]\">{testResult.errorMessage}</p>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </SectionCard>\r\n\r\n {/* Sync Settings */}\r\n <div className=\"space-y-6\">\r\n <SectionCard\r\n icon={Clock}\r\n title={t('admin:tenants.ticketing.sync.title')}\r\n description={t('admin:tenants.ticketing.sync.description')}\r\n >\r\n <div className=\"divide-y divide-[var(--border-subtle)]\">\r\n <Toggle\r\n checked={syncEnabled}\r\n onChange={() => setSyncEnabled(!syncEnabled)}\r\n label={t('admin:tenants.ticketing.sync.enabledLabel')}\r\n description={t('admin:tenants.ticketing.sync.enabledDescription')}\r\n disabled={!isGlpi}\r\n />\r\n <div className=\"py-4\">\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-2\">\r\n {t('admin:tenants.ticketing.sync.intervalLabel')}\r\n </label>\r\n <select\r\n value={syncIntervalMinutes}\r\n onChange={(e) => setSyncIntervalMinutes(Number(e.target.value))}\r\n disabled={!isGlpi || !syncEnabled}\r\n className=\"w-full px-3 py-2.5 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n <option value={15} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">15 {t('common:minutes')}</option>\r\n <option value={30} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">30 {t('common:minutes')}</option>\r\n <option value={60} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">1 {t('common:hour')}</option>\r\n <option value={120} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">2 {t('common:hours')}</option>\r\n <option value={360} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">6 {t('common:hours')}</option>\r\n <option value={720} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">12 {t('common:hours')}</option>\r\n <option value={1440} className=\"bg-[var(--bg-secondary)] text-[var(--text-primary)]\">24 {t('common:hours')}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </SectionCard>\r\n\r\n {/* Last Sync Status */}\r\n {config?.isConfigured && isGlpi && (\r\n <SectionCard\r\n icon={Zap}\r\n title={t('admin:tenants.ticketing.syncStatus.title')}\r\n description={t('admin:tenants.ticketing.syncStatus.description')}\r\n action={\r\n <button\r\n onClick={handleSyncNow}\r\n disabled={syncing}\r\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {syncing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <RefreshCw className=\"w-4 h-4\" />}\r\n {t('admin:tenants.ticketing.syncStatus.syncNow')}\r\n </button>\r\n }\r\n >\r\n <div className=\"space-y-4\">\r\n {/* Last Sync Info */}\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--bg-secondary)] border border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <Clock className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('admin:tenants.ticketing.syncStatus.lastSync')}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {config.lastSyncAt\r\n ? new Date(config.lastSyncAt).toLocaleString()\r\n : t('admin:tenants.ticketing.syncStatus.never')}\r\n </p>\r\n </div>\r\n\r\n <div className={`p-4 rounded-[var(--radius-card)] border ${\r\n config.lastSyncError\r\n ? 'bg-[var(--error-bg)] border-[var(--error-border)]'\r\n : 'bg-[var(--success-bg)] border-[var(--success-border)]'\r\n }`}>\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n {config.lastSyncError ? (\r\n <AlertTriangle className=\"w-4 h-4 text-[var(--error-text)]\" />\r\n ) : (\r\n <CheckCircle className=\"w-4 h-4 text-[var(--success-text)]\" />\r\n )}\r\n <span className={`text-sm font-medium ${\r\n config.lastSyncError ? 'text-[var(--error-text)]' : 'text-[var(--success-text)]'\r\n }`}>\r\n {t('admin:tenants.ticketing.syncStatus.status')}\r\n </span>\r\n </div>\r\n <p className={`text-sm ${\r\n config.lastSyncError ? 'text-[var(--error-text)]' : 'text-[var(--success-text)]'\r\n }`}>\r\n {config.lastSyncError || t('admin:tenants.ticketing.syncStatus.healthy')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Last Sync Result */}\r\n {lastSyncResult && (\r\n <div className={`p-4 rounded-[var(--radius-card)] border ${\r\n lastSyncResult.success\r\n ? 'bg-[var(--success-bg)] border-[var(--success-border)]'\r\n : 'bg-[var(--error-bg)] border-[var(--error-border)]'\r\n }`}>\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n {lastSyncResult.success ? (\r\n <CheckCircle className=\"w-5 h-5 text-[var(--success-text)]\" />\r\n ) : (\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)]\" />\r\n )}\r\n <span className={`font-medium ${lastSyncResult.success ? 'text-[var(--success-text)]' : 'text-[var(--error-text)]'}`}>\r\n {lastSyncResult.success\r\n ? t('admin:tenants.ticketing.syncStatus.syncSuccess')\r\n : t('admin:tenants.ticketing.syncStatus.syncFailed')}\r\n </span>\r\n </div>\r\n <div className=\"grid grid-cols-2 gap-3 text-sm\">\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)]\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">\r\n {t('admin:tenants.ticketing.syncStatus.ticketsUpdated')}\r\n </span>\r\n <p className=\"font-semibold text-[var(--success-text)]\">{lastSyncResult.ticketsUpdated}</p>\r\n </div>\r\n <div className=\"p-2 rounded bg-[var(--bg-primary)] border border-[var(--border-subtle)]\">\r\n <span className=\"text-xs text-[var(--text-tertiary)] block\">\r\n {t('admin:tenants.ticketing.syncStatus.ticketsFailed')}\r\n </span>\r\n <p className={`font-semibold ${lastSyncResult.ticketsFailed > 0 ? 'text-[var(--error-text)]' : 'text-[var(--text-primary)]'}`}>\r\n {lastSyncResult.ticketsFailed}\r\n </p>\r\n </div>\r\n </div>\r\n {lastSyncResult.errorMessage && (\r\n <p className=\"mt-3 text-sm text-[var(--error-text)]\">{lastSyncResult.errorMessage}</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </SectionCard>\r\n )}\r\n\r\n {/* Save Button */}\r\n <div className=\"flex flex-col-reverse sm:flex-row items-stretch sm:items-center gap-2 sm:gap-3\">\r\n <button\r\n onClick={handleSave}\r\n disabled={saving}\r\n className=\"inline-flex items-center justify-center gap-2 px-6 py-2.5 text-sm font-medium rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors shadow-sm\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams, useNavigate } from 'react-router-dom';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\nimport { useTenantDetail } from '@/hooks/useTenantDetail';\r\nimport {\r\n ArrowLeft,\r\n Loader2,\r\n AlertTriangle,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { TenantEntraTab } from '@/components/platform/administration/TenantEntraTab';\r\nimport { TenantSupportSettingsTab } from '@/components/platform/administration/tenants/TenantSupportSettingsTab';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst VALID_TABS = ['entra', 'support'] as const;\r\ntype TabType = typeof VALID_TABS[number];\r\n\r\nexport function TenantSettingsPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const { id: tenantId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n const { activeTab, setActiveTab } = useTabNavigation<TabType>('entra', VALID_TABS);\r\n\r\n const tenantDetail = useTenantDetail(tenantId);\r\n\r\n useEffect(() => {\r\n if (!tenantId) {\r\n navigate('/administration/tenants');\r\n return;\r\n }\r\n tenantDetail.loadTenant();\r\n }, [tenantId]);\r\n\r\n if (tenantDetail.loading) {\r\n return (\r\n <div className=\"p-6 flex items-center justify-center min-h-screen\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto mb-2 text-[var(--text-secondary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('common:loading')}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!tenantDetail.tenant) {\r\n return (\r\n <div className=\"p-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants' },\r\n ]}\r\n />\r\n <div className=\"mt-4 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{tenantDetail.error || t('admin:tenants.notFound')}</span>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const tenant = tenantDetail.tenant;\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n {/* Breadcrumb */}\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants' },\r\n { label: tenant.name, href: `/administration/tenants/${tenantId}` },\r\n { label: t('admin:tenants.settings.title') },\r\n ]}\r\n />\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate(`/administration/tenants/${tenantId}`)}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)]\">\r\n <Settings className=\"w-5 h-5 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-xl sm:text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:tenants.settings.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{tenant.name}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {tenantDetail.error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{tenantDetail.error}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Tab Navigation */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1 -mb-px\">\r\n {VALID_TABS.map(tab => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--primary-color)] text-[var(--primary-color)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`admin:tenants.settings.tabs.${tab}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div>\r\n {activeTab === 'entra' && tenantId && (\r\n <TenantEntraTab\r\n tenantId={tenantId}\r\n tenantName={tenant.name}\r\n tenantSlug={tenant.slug}\r\n />\r\n )}\r\n\r\n {activeTab === 'support' && tenantId && (\r\n <TenantSupportSettingsTab\r\n tenantId={tenantId}\r\n tenantName={tenant.name}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Loader2,\r\n Save,\r\n AlertTriangle,\r\n CheckCircle,\r\n ChevronDown,\r\n Palette,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { PageHeader } from '@/components/ui/PageHeader';\r\nimport { tenantTypeSettingsApi, type TenantTypeSettingsDto, type UpdateTenantTypeSettingsRequest } from '@/services/api/tenantTypeSettingsApi';\r\nimport type { TenantType } from '@/services/api/adminApi';\r\nimport { getLucideIcon, getAvailableIconNames, getColorClasses, getAvailableColors } from '@/utils/tenantIconMap';\r\n\r\ninterface CardEditState {\r\n icon: string;\r\n iconType: 'Lucide' | 'Url' | 'Svg';\r\n color: string;\r\n displayName: string;\r\n description: string;\r\n}\r\n\r\nexport function TenantTypeSettingsPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n\r\n const [settings, setSettings] = useState<TenantTypeSettingsDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState<string | null>(null);\r\n const [editStates, setEditStates] = useState<Record<string, CardEditState>>({});\r\n const [savingType, setSavingType] = useState<TenantType | null>(null);\r\n\r\n const loadSettings = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await tenantTypeSettingsApi.getAll();\r\n setSettings(data);\r\n\r\n const states: Record<string, CardEditState> = {};\r\n for (const s of data) {\r\n states[s.type] = {\r\n icon: s.icon,\r\n iconType: s.iconType,\r\n color: s.color,\r\n displayName: s.displayName,\r\n description: s.description ?? '',\r\n };\r\n }\r\n setEditStates(states);\r\n } catch {\r\n setError(t('admin:tenantTypeSettings.loadError'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [t]);\r\n\r\n useEffect(() => {\r\n loadSettings();\r\n }, [loadSettings]);\r\n\r\n const handleSave = async (type: TenantType) => {\r\n const state = editStates[type];\r\n if (!state) return;\r\n\r\n try {\r\n setSavingType(type);\r\n setError(null);\r\n const request: UpdateTenantTypeSettingsRequest = {\r\n icon: state.icon,\r\n iconType: state.iconType,\r\n color: state.color,\r\n displayName: state.displayName,\r\n description: state.description || null,\r\n };\r\n await tenantTypeSettingsApi.update(type, request);\r\n setSuccess(t('admin:tenantTypeSettings.saveSuccess'));\r\n setTimeout(() => setSuccess(null), 3000);\r\n await loadSettings();\r\n } catch {\r\n setError(t('admin:tenantTypeSettings.saveError'));\r\n } finally {\r\n setSavingType(null);\r\n }\r\n };\r\n\r\n const updateEditState = (type: string, field: keyof CardEditState, value: string) => {\r\n setEditStates((prev) => ({\r\n ...prev,\r\n [type]: { ...prev[type], [field]: value },\r\n }));\r\n };\r\n\r\n const hasChanges = (type: string): boolean => {\r\n const original = settings.find((s) => s.type === type);\r\n const current = editStates[type];\r\n if (!original || !current) return false;\r\n return (\r\n original.icon !== current.icon ||\r\n original.color !== current.color ||\r\n original.displayName !== current.displayName ||\r\n (original.description ?? '') !== current.description\r\n );\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"p-6 flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants' },\r\n { label: t('admin:tenantTypeSettings.title') },\r\n ]}\r\n />\r\n\r\n <PageHeader\r\n title={t('admin:tenantTypeSettings.title')}\r\n subtitle={t('admin:tenantTypeSettings.subtitle')}\r\n icon={<Palette className=\"w-6 h-6\" />}\r\n />\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-lg bg-red-500/10 border border-red-500/20 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-500 flex-shrink-0\" />\r\n <p className=\"text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {success && (\r\n <div className=\"p-4 rounded-lg bg-green-500/10 border border-green-500/20 flex items-center gap-3\">\r\n <CheckCircle className=\"w-5 h-5 text-green-500 flex-shrink-0\" />\r\n <p className=\"text-green-500\">{success}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\r\n {settings.map((setting) => {\r\n const state = editStates[setting.type];\r\n if (!state) return null;\r\n\r\n const PreviewIcon = getLucideIcon(state.icon);\r\n const previewColors = getColorClasses(state.color);\r\n\r\n return (\r\n <div\r\n key={setting.type}\r\n className=\"p-6 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)] space-y-5\"\r\n >\r\n {/* Preview */}\r\n <div className=\"flex items-center gap-4\">\r\n <div className={`w-14 h-14 rounded-xl flex items-center justify-center ${previewColors.bg}`}>\r\n <PreviewIcon className={`w-7 h-7 ${previewColors.text}`} />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">{state.displayName}</h3>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{setting.type}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Display Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('admin:tenantTypeSettings.displayName')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={state.displayName}\r\n onChange={(e) => updateEditState(setting.type, 'displayName', e.target.value)}\r\n className=\"w-full px-3 py-2 rounded-lg border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n />\r\n </div>\r\n\r\n {/* Icon Selector */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('admin:tenantTypeSettings.icon')}\r\n </label>\r\n <div className=\"relative\">\r\n <select\r\n value={state.icon}\r\n onChange={(e) => updateEditState(setting.type, 'icon', e.target.value)}\r\n className=\"w-full px-3 py-2 pr-8 rounded-lg border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] appearance-none focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n {getAvailableIconNames().map((name) => (\r\n <option key={name} value={name}>{name}</option>\r\n ))}\r\n </select>\r\n <ChevronDown className=\"absolute right-2 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-tertiary)] pointer-events-none\" />\r\n </div>\r\n </div>\r\n\r\n {/* Color Selector */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('admin:tenantTypeSettings.color')}\r\n </label>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {getAvailableColors().map((color) => {\r\n const colorClasses = getColorClasses(color);\r\n return (\r\n <button\r\n key={color}\r\n onClick={() => updateEditState(setting.type, 'color', color)}\r\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-all ${colorClasses.bg} ${\r\n state.color === color ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)]' : ''\r\n }`}\r\n title={color}\r\n >\r\n <div className={`w-4 h-4 rounded-full ${colorClasses.text.replace('text-', 'bg-')}`} />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* Description */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('admin:tenantTypeSettings.description')}\r\n </label>\r\n <textarea\r\n value={state.description}\r\n onChange={(e) => updateEditState(setting.type, 'description', e.target.value)}\r\n rows={2}\r\n className=\"w-full px-3 py-2 rounded-lg border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)] resize-none\"\r\n />\r\n </div>\r\n\r\n {/* Save Button */}\r\n <button\r\n onClick={() => handleSave(setting.type as TenantType)}\r\n disabled={!hasChanges(setting.type) || savingType === setting.type}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-2 rounded-lg bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)] transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {savingType === setting.type ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Save className=\"w-4 h-4\" />\r\n )}\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Plus, AlertTriangle, Building } from 'lucide-react';\r\nimport { adminApi, type OrganisationListItemDto, type VerificationStatus } from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { DataTable, type DataTableColumn } from '@/components/ui/DataTable';\r\n\r\nconst VERIFICATION_STATUS_CONFIG: Record<VerificationStatus, { bgColor: string; textColor: string }> = {\r\n Pending: {\r\n bgColor: 'bg-[var(--warning-bg)]',\r\n textColor: 'text-[var(--warning-text)]',\r\n },\r\n Verified: {\r\n bgColor: 'bg-[var(--success-bg)]',\r\n textColor: 'text-[var(--success-text)]',\r\n },\r\n Rejected: {\r\n bgColor: 'bg-[var(--error-bg)]',\r\n textColor: 'text-[var(--error-text)]',\r\n },\r\n};\r\n\r\nexport function OrganisationsListPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const navigate = useNavigate();\r\n\r\n const [organisations, setOrganisations] = useState<OrganisationListItemDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [page, setPage] = useState(1);\r\n const [pageSize] = useState(10);\r\n const [totalPages, setTotalPages] = useState(1);\r\n const [search, setSearch] = useState('');\r\n const [verificationFilter, setVerificationFilter] = useState<VerificationStatus | 'All'>('All');\r\n\r\n const loadOrganisations = useCallback(async (signal?: AbortSignal) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await adminApi.organisations.getAll({\r\n page,\r\n pageSize,\r\n search: search || undefined,\r\n verificationStatus: verificationFilter !== 'All' ? verificationFilter : undefined,\r\n });\r\n if (!signal?.aborted) {\r\n setOrganisations(result.items);\r\n setTotalPages(Math.ceil(result.totalCount / pageSize));\r\n }\r\n } catch (err) {\r\n if (!signal?.aborted) {\r\n console.error('Failed to load organisations:', err);\r\n setError(t('common:error', 'An error occurred'));\r\n }\r\n } finally {\r\n if (!signal?.aborted) {\r\n setLoading(false);\r\n }\r\n }\r\n }, [page, pageSize, search, verificationFilter, t]);\r\n\r\n useEffect(() => {\r\n const abortController = new AbortController();\r\n loadOrganisations(abortController.signal);\r\n return () => abortController.abort();\r\n }, [loadOrganisations]);\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearch(e.target.value);\r\n setPage(1);\r\n };\r\n\r\n const statusFilters: (VerificationStatus | 'All')[] = ['All', 'Pending', 'Verified', 'Rejected'];\r\n\r\n const columns: DataTableColumn<OrganisationListItemDto>[] = [\r\n {\r\n key: 'name',\r\n label: t('admin:organisations.columns.name', 'Name'),\r\n sortable: true,\r\n render: (org) => (\r\n <div>\r\n <div className=\"font-medium text-[var(--text-primary)]\">{org.name}</div>\r\n {org.legalName && (\r\n <div className=\"text-xs text-[var(--text-secondary)]\">{org.legalName}</div>\r\n )}\r\n </div>\r\n ),\r\n },\r\n {\r\n key: 'countryCode',\r\n label: t('admin:organisations.columns.country', 'Country'),\r\n sortable: true,\r\n },\r\n {\r\n key: 'businessIdentifier',\r\n label: t('admin:organisations.columns.identifier', 'Business ID'),\r\n sortable: true,\r\n render: (org) => (\r\n <span className=\"font-mono text-[var(--text-primary)]\">{org.businessIdentifier}</span>\r\n ),\r\n },\r\n {\r\n key: 'verificationStatus',\r\n label: t('admin:organisations.columns.status', 'Status'),\r\n sortable: true,\r\n render: (org) => (\r\n <span\r\n className={`inline-block px-3 py-1 rounded-[var(--radius-badge)] text-xs font-medium ${\r\n VERIFICATION_STATUS_CONFIG[org.verificationStatus].bgColor\r\n } ${VERIFICATION_STATUS_CONFIG[org.verificationStatus].textColor}`}\r\n >\r\n {t(\r\n `admin:organisations.status.${org.verificationStatus.toLowerCase()}`,\r\n org.verificationStatus\r\n )}\r\n </span>\r\n ),\r\n },\r\n {\r\n key: 'createdAt',\r\n label: t('admin:organisations.columns.created', 'Created'),\r\n sortable: true,\r\n render: (org) => (\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {new Date(org.createdAt).toLocaleDateString()}\r\n </span>\r\n ),\r\n },\r\n {\r\n key: 'actions',\r\n label: t('admin:organisations.columns.actions', 'Actions'),\r\n align: 'right',\r\n render: (org) => (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n navigate(`/administration/tenants/create?type=b2b&organisationId=${org.id}`);\r\n }}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-[var(--radius-button)] bg-[var(--info-bg)] text-[var(--info-text)] border border-[var(--info-border)] hover:opacity-80 transition-colors\"\r\n title={t('admin:organisations.createTenant', 'Create B2B tenant for this organisation')}\r\n >\r\n <Building className=\"w-3.5 h-3.5\" />\r\n {t('admin:organisations.createTenantButton', 'Create tenant')}\r\n </button>\r\n ),\r\n },\r\n ];\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('admin:organisations.title', 'Organisations') },\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:organisations.title', 'Organisations')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:organisations.description', 'Manage organisations and verify their details')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/tenants/organisations/create')}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] text-white hover:bg-[var(--color-accent-600)] transition-colors\"\r\n >\r\n <Plus className=\"w-5 h-5\" />\r\n {t('common:create', 'Create')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div className=\"flex flex-col sm:flex-row gap-4\">\r\n <div className=\"relative flex-1\">\r\n <input\r\n type=\"text\"\r\n placeholder={t('common:search', 'Search')}\r\n value={search}\r\n onChange={handleSearchChange}\r\n className=\"input w-full pl-10\"\r\n />\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2\">\r\n {statusFilters.map((status) => (\r\n <button\r\n key={status}\r\n onClick={() => {\r\n setVerificationFilter(status);\r\n setPage(1);\r\n }}\r\n className={`px-3 py-1 rounded-[var(--radius-badge)] text-sm transition-colors ${\r\n verificationFilter === status\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]'\r\n }`}\r\n >\r\n {status === 'All' ? t('common:all', 'All') : t(`admin:organisations.status.${status.toLowerCase()}`, status)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n </div>\r\n <button\r\n onClick={() => loadOrganisations()}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:retry', 'Retry')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n <DataTable\r\n data={organisations}\r\n columns={columns}\r\n loading={loading}\r\n getRowKey={(item) => item.id}\r\n onRowClick={(item) => navigate(`/administration/tenants/organisations/${item.id}`)}\r\n emptyMessage={t('admin:organisations.empty', 'No organisations found')}\r\n />\r\n\r\n {!loading && organisations.length > 0 && (\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('common:page', 'Page')} {page} {t('common:of', 'of')} {totalPages}\r\n </div>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => setPage(Math.max(1, page - 1))}\r\n disabled={page === 1}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {t('common:previous', 'Previous')}\r\n </button>\r\n <button\r\n onClick={() => setPage(Math.min(totalPages, page + 1))}\r\n disabled={page >= totalPages}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {t('common:next', 'Next')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\r\nimport { ArrowLeft, Loader2, AlertTriangle, Check, X } from 'lucide-react';\r\nimport { adminApi, type OrganisationDto, type VerificationStatus } from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nconst VERIFICATION_STATUS_CONFIG: Record<VerificationStatus, { bgColor: string; textColor: string }> = {\r\n Pending: {\r\n bgColor: 'bg-[var(--warning-bg)]',\r\n textColor: 'text-[var(--warning-text)]',\r\n },\r\n Verified: {\r\n bgColor: 'bg-[var(--success-bg)]',\r\n textColor: 'text-[var(--success-text)]',\r\n },\r\n Rejected: {\r\n bgColor: 'bg-[var(--error-bg)]',\r\n textColor: 'text-[var(--error-text)]',\r\n },\r\n};\r\n\r\ntype TabType = 'info' | 'contact' | 'address';\r\nconst VALID_TABS: TabType[] = ['info', 'contact', 'address'];\r\n\r\nexport function OrganisationDetailPage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const { id: orgId } = useParams<{ id: string }>();\r\n const navigate = useNavigate();\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n\r\n const [organisation, setOrganisation] = useState<OrganisationDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [actionLoading, setActionLoading] = useState(false);\r\n\r\n // Tab management\r\n const getInitialTab = (): TabType => {\r\n const tabParam = searchParams.get('tab');\r\n if (tabParam && VALID_TABS.includes(tabParam as TabType)) {\r\n return tabParam as TabType;\r\n }\r\n return 'info';\r\n };\r\n\r\n const [activeTab, setActiveTab] = useState<TabType>(getInitialTab);\r\n\r\n // Modal states\r\n const [verifyModal, setVerifyModal] = useState<{ show: boolean; notes: string }>({\r\n show: false,\r\n notes: '',\r\n });\r\n const [rejectModal, setRejectModal] = useState<{ show: boolean; reason: string }>({\r\n show: false,\r\n reason: '',\r\n });\r\n\r\n // Sync URL with active tab\r\n useEffect(() => {\r\n if (activeTab === 'info') {\r\n if (searchParams.get('tab')) {\r\n searchParams.delete('tab');\r\n setSearchParams(searchParams, { replace: true });\r\n }\r\n } else if (searchParams.get('tab') !== activeTab) {\r\n setSearchParams({ tab: activeTab }, { replace: true });\r\n }\r\n }, [activeTab, searchParams, setSearchParams]);\r\n\r\n const loadOrganisation = useCallback(async () => {\r\n if (!orgId) {\r\n navigate('/administration/tenants/organisations');\r\n return;\r\n }\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await adminApi.organisations.getById(orgId);\r\n setOrganisation(data);\r\n } catch (err) {\r\n console.error('Failed to load organisation:', err);\r\n setError(t('admin:organisations.loadError', 'Failed to load organisation'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [orgId, navigate, t]);\r\n\r\n useEffect(() => {\r\n loadOrganisation();\r\n }, [loadOrganisation]);\r\n\r\n const handleVerify = async () => {\r\n if (!organisation) return;\r\n setActionLoading(true);\r\n try {\r\n const updated = await adminApi.organisations.verify(organisation.id, verifyModal.notes || undefined);\r\n setOrganisation(updated);\r\n setVerifyModal({ show: false, notes: '' });\r\n } catch (err) {\r\n console.error('Failed to verify organisation:', err);\r\n setError(t('admin:organisations.verifyError', 'Failed to verify organisation'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const handleReject = async () => {\r\n if (!organisation) return;\r\n setActionLoading(true);\r\n try {\r\n const updated = await adminApi.organisations.reject(organisation.id, rejectModal.reason);\r\n setOrganisation(updated);\r\n setRejectModal({ show: false, reason: '' });\r\n } catch (err) {\r\n console.error('Failed to reject organisation:', err);\r\n setError(t('admin:organisations.rejectError', 'Failed to reject organisation'));\r\n } finally {\r\n setActionLoading(false);\r\n }\r\n };\r\n\r\n const hasContactData = organisation && (organisation.phone || organisation.email || organisation.website);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"p-6 flex items-center justify-center min-h-[400px]\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto mb-2 text-[var(--text-secondary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('common:loading', 'Loading')}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!organisation) {\r\n return (\r\n <div className=\"p-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('admin:organisations.title', 'Organisations'), href: '/administration/tenants/organisations' },\r\n ]}\r\n />\r\n <div className=\"mt-4 p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error || t('admin:organisations.notFound', 'Organisation not found')}</span>\r\n </div>\r\n <button\r\n onClick={loadOrganisation}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:retry', 'Retry')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const statusConfig = VERIFICATION_STATUS_CONFIG[organisation.verificationStatus];\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('admin:organisations.title', 'Organisations'), href: '/administration/tenants/organisations' },\r\n { label: organisation.name },\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between gap-4\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/tenants/organisations')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{organisation.name}</h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{organisation.businessIdentifier}</p>\r\n </div>\r\n </div>\r\n <span className={`px-4 py-2 rounded-[var(--radius-badge)] text-sm font-medium ${statusConfig.bgColor} ${statusConfig.textColor}`}>\r\n {t(`admin:organisations.status.${organisation.verificationStatus.toLowerCase()}`, organisation.verificationStatus)}\r\n </span>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n </div>\r\n <button\r\n onClick={loadOrganisation}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('common:retry', 'Retry')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-1 -mb-px\">\r\n {VALID_TABS.map((tab) => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`px-4 py-2 border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--primary-color)] text-[var(--primary-color)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`admin:organisations.tabs.${tab}`, tab)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {activeTab === 'info' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.name', 'Organisation Name')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.name}</p>\r\n </div>\r\n {organisation.legalName && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.legalName', 'Legal Name')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.legalName}</p>\r\n </div>\r\n )}\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.country', 'Country')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.countryCode}</p>\r\n </div>\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {organisation.businessIdentifierType}\r\n </label>\r\n <p className=\"mt-1 font-mono text-[var(--text-primary)]\">{organisation.businessIdentifier}</p>\r\n </div>\r\n {organisation.vatNumber && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.vatNumber', 'VAT Number')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.vatNumber}</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {organisation.verificationStatus !== 'Verified' && (\r\n <div className=\"flex gap-2 pt-4\">\r\n {(organisation.verificationStatus === 'Pending' || organisation.verificationStatus === 'Rejected') && (\r\n <button\r\n onClick={() => setVerifyModal({ show: true, notes: '' })}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--success-bg)] text-[var(--success-text)] hover:opacity-90 disabled:opacity-50 transition-opacity\"\r\n >\r\n <Check className=\"w-4 h-4\" />\r\n {t('admin:organisations.verify', 'Verify')}\r\n </button>\r\n )}\r\n {organisation.verificationStatus === 'Pending' && (\r\n <button\r\n onClick={() => setRejectModal({ show: true, reason: '' })}\r\n disabled={actionLoading}\r\n className=\"flex items-center gap-2 px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90 disabled:opacity-50 transition-opacity\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n {t('admin:organisations.reject', 'Reject')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {activeTab === 'contact' && (\r\n hasContactData ? (\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {organisation.phone && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.phone', 'Phone')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.phone}</p>\r\n </div>\r\n )}\r\n {organisation.email && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.email', 'Email')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)]\">{organisation.email}</p>\r\n </div>\r\n )}\r\n {organisation.website && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.website', 'Website')}\r\n </label>\r\n <p className=\"mt-1 text-[var(--text-primary)] break-all\">{organisation.website}</p>\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"py-12 text-center text-[var(--text-secondary)]\">\r\n {t('admin:organisations.noContact', 'No contact information available')}\r\n </div>\r\n )\r\n )}\r\n\r\n {activeTab === 'address' && (\r\n organisation.address ? (\r\n <div className=\"p-4 rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <div className=\"space-y-2\">\r\n <div>\r\n <label className=\"text-xs font-semibold text-[var(--text-secondary)] uppercase tracking-wide\">\r\n {t('admin:organisations.form.address', 'Address')}\r\n </label>\r\n <p className=\"text-[var(--text-primary)]\">{organisation.address.street}</p>\r\n {organisation.address.street2 && (\r\n <p className=\"text-[var(--text-primary)]\">{organisation.address.street2}</p>\r\n )}\r\n </div>\r\n <div>\r\n <p className=\"text-[var(--text-primary)]\">\r\n {organisation.address.postalCode} {organisation.address.city}\r\n </p>\r\n {organisation.address.state && (\r\n <p className=\"text-[var(--text-primary)]\">{organisation.address.state}</p>\r\n )}\r\n </div>\r\n <div>\r\n <p className=\"text-[var(--text-primary)]\">\r\n {organisation.address.country} ({organisation.address.countryCode})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"py-12 text-center text-[var(--text-secondary)]\">\r\n {t('admin:organisations.noAddress', 'No address information available')}\r\n </div>\r\n )\r\n )}\r\n\r\n {verifyModal.show && (\r\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full mx-4\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)] mb-4\">\r\n {t('admin:organisations.verifyTitle', 'Verify Organisation')}\r\n </h2>\r\n <div className=\"mb-4 space-y-3\">\r\n <div>\r\n <label className=\"block text-sm text-[var(--text-secondary)] mb-1\">\r\n {t('admin:organisations.verifyNotes', 'Notes (optional)')}\r\n </label>\r\n <textarea\r\n value={verifyModal.notes}\r\n onChange={(e) => setVerifyModal({ ...verifyModal, notes: e.target.value })}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n rows={3}\r\n placeholder={t('admin:organisations.verifyNotesPlaceholder', 'Add notes about verification')}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"flex gap-2 justify-end\">\r\n <button\r\n onClick={() => setVerifyModal({ show: false, notes: '' })}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {t('common:cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleVerify}\r\n disabled={actionLoading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--success-bg)] text-[var(--success-text)] hover:opacity-90 disabled:opacity-50\"\r\n >\r\n {actionLoading ? t('common:saving', 'Saving') : t('admin:organisations.verify', 'Verify')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {rejectModal.show && (\r\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-[var(--radius-card)] p-6 max-w-md w-full mx-4\">\r\n <h2 className=\"text-xl font-bold text-[var(--text-primary)] mb-4\">\r\n {t('admin:organisations.rejectTitle', 'Reject Organisation')}\r\n </h2>\r\n <div className=\"mb-4\">\r\n <label className=\"block text-sm text-[var(--text-secondary)] mb-1\">\r\n {t('admin:organisations.rejectReason', 'Reason')}\r\n </label>\r\n <textarea\r\n value={rejectModal.reason}\r\n onChange={(e) => setRejectModal({ ...rejectModal, reason: e.target.value })}\r\n className=\"w-full px-3 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-secondary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n rows={3}\r\n placeholder={t('admin:organisations.rejectReasonPlaceholder', 'Explain why this organisation is rejected')}\r\n />\r\n </div>\r\n <div className=\"flex gap-2 justify-end\">\r\n <button\r\n onClick={() => setRejectModal({ show: false, reason: '' })}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)]\"\r\n >\r\n {t('common:cancel', 'Cancel')}\r\n </button>\r\n <button\r\n onClick={handleReject}\r\n disabled={actionLoading}\r\n className=\"px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-bg)] text-[var(--error-text)] hover:opacity-90 disabled:opacity-50\"\r\n >\r\n {actionLoading ? t('common:saving', 'Saving') : t('admin:organisations.reject', 'Reject')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Loader2,\r\n AlertTriangle,\r\n Check,\r\n Search,\r\n} from 'lucide-react';\r\nimport {\r\n adminApi,\r\n type CreateOrganisationRequest,\r\n type BusinessIdentifierType,\r\n} from '@/services/api/adminApi';\r\n\r\n// Country to business identifier type mapping\r\nconst countryIdentifierTypes: Record<string, {\r\n types: BusinessIdentifierType[];\r\n defaultType: BusinessIdentifierType;\r\n country: string;\r\n vatSuffix?: string;\r\n}> = {\r\n CH: { types: ['UID_CHE'], defaultType: 'UID_CHE', country: 'Switzerland', vatSuffix: 'MWST' },\r\n FR: { types: ['SIREN', 'SIRET'], defaultType: 'SIREN', country: 'France', vatSuffix: 'TVA' },\r\n DE: { types: ['HRB', 'HRA'], defaultType: 'HRB', country: 'Germany', vatSuffix: 'USt' },\r\n BE: { types: ['BCE_KBO'], defaultType: 'BCE_KBO', country: 'Belgium', vatSuffix: 'TVA' },\r\n NL: { types: ['KVK'], defaultType: 'KVK', country: 'Netherlands', vatSuffix: 'BTW' },\r\n ES: { types: ['CIF'], defaultType: 'CIF', country: 'Spain', vatSuffix: 'IVA' },\r\n IT: { types: ['PartitaIVA'], defaultType: 'PartitaIVA', country: 'Italy', vatSuffix: 'IVA' },\r\n GB: { types: ['CRN'], defaultType: 'CRN', country: 'United Kingdom', vatSuffix: 'VAT' },\r\n};\r\n\r\nexport interface OrganisationFormData {\r\n name: string;\r\n legalName?: string;\r\n countryCode: string;\r\n businessIdentifierType: BusinessIdentifierType;\r\n businessIdentifier: string;\r\n vatNumber?: string;\r\n phone?: string;\r\n email?: string;\r\n website?: string;\r\n isFromRegistry: boolean;\r\n address: {\r\n street: string;\r\n street2?: string;\r\n postalCode: string;\r\n city: string;\r\n state?: string | null;\r\n country: string;\r\n countryCode: string;\r\n };\r\n}\r\n\r\ninterface CreateOrganisationFormProps {\r\n /** Form data (controlled) */\r\n readonly data: OrganisationFormData;\r\n /** Callback when form data changes */\r\n readonly onChange: (data: OrganisationFormData) => void;\r\n /** Callback when tenant name should be updated (optional, for TenantCreatePage) */\r\n readonly onTenantNameSuggested?: (name: string) => void;\r\n /** Whether the form is in a compact modal layout */\r\n readonly compact?: boolean;\r\n /** Whether form submission was attempted (shows validation errors) */\r\n readonly submitted?: boolean;\r\n /** Additional class names */\r\n readonly className?: string;\r\n}\r\n\r\n/**\r\n * Shared form component for creating organisations.\r\n * Used by both TenantCreatePage and TenantDetailPage modal.\r\n */\r\nexport function CreateOrganisationForm({\r\n data,\r\n onChange,\r\n onTenantNameSuggested,\r\n compact = false,\r\n submitted = false,\r\n className = '',\r\n}: CreateOrganisationFormProps): ReactElement {\r\n const { t, i18n } = useTranslation(['admin', 'common']);\r\n\r\n // Lookup state\r\n const [lookupLoading, setLookupLoading] = useState(false);\r\n const [lookupError, setLookupError] = useState<string | null>(null);\r\n const [lookupSuccess, setLookupSuccess] = useState(false);\r\n\r\n // Format CHE number: CHE-XXX.XXX.XXX\r\n const formatCheNumber = (value: string): string => {\r\n const cleaned = value.toUpperCase().replace(/[^A-Z0-9]/g, '');\r\n let digits = cleaned.startsWith('CHE') ? cleaned.slice(3) : cleaned.replace(/[^0-9]/g, '');\r\n digits = digits.slice(0, 9);\r\n\r\n if (digits.length === 0) return 'CHE-';\r\n if (digits.length <= 3) return `CHE-${digits}`;\r\n if (digits.length <= 6) return `CHE-${digits.slice(0, 3)}.${digits.slice(3)}`;\r\n return `CHE-${digits.slice(0, 3)}.${digits.slice(3, 6)}.${digits.slice(6)}`;\r\n };\r\n\r\n // Get VAT suffix based on language preference for Switzerland\r\n const getVatSuffix = (): string => {\r\n const lang = i18n.language?.substring(0, 2).toLowerCase();\r\n switch (lang) {\r\n case 'de': return 'MWST';\r\n case 'fr': return 'TVA';\r\n case 'it': return 'IVA';\r\n default: return 'MWST'; // Default to German for Switzerland\r\n }\r\n };\r\n\r\n const handleBusinessIdChange = (value: string) => {\r\n let newValue = value;\r\n if (data.countryCode === 'CH') {\r\n newValue = formatCheNumber(value);\r\n }\r\n onChange({ ...data, businessIdentifier: newValue, isFromRegistry: false });\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n };\r\n\r\n const handleCountryChange = (countryCode: string) => {\r\n const config = countryIdentifierTypes[countryCode];\r\n if (config) {\r\n onChange({\r\n ...data,\r\n countryCode,\r\n businessIdentifierType: config.defaultType,\r\n businessIdentifier: countryCode === 'CH' ? 'CHE-' : '',\r\n isFromRegistry: false,\r\n address: {\r\n ...data.address,\r\n countryCode,\r\n country: config.country,\r\n },\r\n });\r\n }\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n };\r\n\r\n // Pre-fill CHE- when switching to Switzerland\r\n useEffect(() => {\r\n if (data.countryCode === 'CH' && (!data.businessIdentifier || data.businessIdentifier === '')) {\r\n onChange({ ...data, businessIdentifier: 'CHE-' });\r\n }\r\n }, [data.countryCode]);\r\n\r\n const handleLookup = async () => {\r\n const cleanedId = data.businessIdentifier.replace(/[^0-9]/g, '');\r\n if (!data.businessIdentifier || cleanedId.length < 9 || data.countryCode !== 'CH') {\r\n setLookupError(t('admin:tenants.organisation.lookupIncomplete', 'Please enter a complete CHE number (9 digits)'));\r\n return;\r\n }\r\n\r\n setLookupLoading(true);\r\n setLookupError(null);\r\n setLookupSuccess(false);\r\n\r\n try {\r\n const result = await adminApi.organisations.lookup(data.countryCode, data.businessIdentifier);\r\n\r\n // Auto-fill form fields\r\n const updatedData: OrganisationFormData = {\r\n ...data,\r\n name: result.name || data.name,\r\n legalName: result.legalName || data.legalName,\r\n vatNumber: result.vatNumber ? `${result.vatNumber} ${getVatSuffix()}` : data.vatNumber,\r\n phone: result.phone || data.phone,\r\n email: result.email || data.email,\r\n website: result.website || data.website,\r\n isFromRegistry: true,\r\n address: {\r\n street: result.street || data.address.street,\r\n street2: result.street2 || data.address.street2,\r\n postalCode: result.postalCode || data.address.postalCode,\r\n city: result.city || data.address.city,\r\n state: result.state || data.address.state,\r\n country: result.country || data.address.country,\r\n countryCode: result.countryCode || data.address.countryCode,\r\n },\r\n };\r\n\r\n onChange(updatedData);\r\n\r\n // Suggest tenant name if callback provided\r\n if (onTenantNameSuggested && result.name) {\r\n onTenantNameSuggested(result.name);\r\n }\r\n\r\n setLookupSuccess(true);\r\n setTimeout(() => setLookupSuccess(false), 3000);\r\n } catch (err: unknown) {\r\n console.error('[Zefix Lookup] Failed:', err);\r\n const errorMessage = err instanceof Error ? err.message : '';\r\n if (errorMessage.includes('404') || errorMessage.includes('not found')) {\r\n setLookupError(t('admin:tenants.organisation.lookupFailed', 'Company not found in registry'));\r\n } else if (errorMessage.includes('credentials') || errorMessage.includes('401')) {\r\n setLookupError(t('admin:tenants.organisation.lookupAuthError', 'Registry service not configured'));\r\n } else {\r\n setLookupError(t('admin:tenants.organisation.lookupFailed', 'Company not found in registry'));\r\n }\r\n } finally {\r\n setLookupLoading(false);\r\n }\r\n };\r\n\r\n const inputClass = compact\r\n ? \"w-full px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-input)] bg-[var(--bg-secondary)] text-[var(--text-primary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n : \"w-full px-4 py-2 rounded-[var(--radius-input)] border border-[var(--border-color)] bg-[var(--bg-primary)] text-[var(--text-primary)] placeholder:text-[var(--text-tertiary)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\";\r\n\r\n const inputErrorClass = \"border-[var(--error-text)] ring-1 ring-[var(--error-text)]\";\r\n\r\n const fieldClass = (hasError: boolean) =>\r\n hasError ? `${inputClass} ${inputErrorClass}` : inputClass;\r\n\r\n const labelClass = \"block text-sm font-medium text-[var(--text-secondary)] mb-1\";\r\n\r\n return (\r\n <div className={`space-y-4 ${className}`}>\r\n {/* Organisation Name */}\r\n <div>\r\n <label className={labelClass}>\r\n {t('admin:tenants.organisation.form.name', 'Organisation Name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={data.name}\r\n onChange={(e) => onChange({ ...data, name: e.target.value })}\r\n className={fieldClass(submitted && !data.name.trim())}\r\n placeholder={t('admin:tenants.organisation.form.namePlaceholder', 'Enter organisation name')}\r\n />\r\n {submitted && !data.name.trim() && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1\">{t('common:validation.required', 'This field is required')}</p>\r\n )}\r\n </div>\r\n\r\n {/* Country */}\r\n <div>\r\n <label className={labelClass}>\r\n {t('admin:tenants.organisation.form.country', 'Country')} *\r\n </label>\r\n <select\r\n value={data.countryCode}\r\n onChange={(e) => handleCountryChange(e.target.value)}\r\n className={inputClass}\r\n >\r\n {Object.entries(countryIdentifierTypes).map(([code, config]) => (\r\n <option key={code} value={code}>{config.country} ({code})</option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Business Identifier */}\r\n <div>\r\n <label className={labelClass}>\r\n {data.businessIdentifierType} *\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"text\"\r\n value={data.businessIdentifier}\r\n onChange={(e) => handleBusinessIdChange(e.target.value)}\r\n className={`flex-1 ${inputClass} font-mono`}\r\n placeholder={data.countryCode === 'CH' ? 'CHE-123.456.789' : t('admin:tenants.organisation.form.identifierPlaceholder', 'Enter identifier')}\r\n />\r\n {/* Search button - only show for Switzerland */}\r\n {data.countryCode === 'CH' && (\r\n <button\r\n type=\"button\"\r\n onClick={handleLookup}\r\n disabled={lookupLoading || !data.businessIdentifier || data.businessIdentifier.replace(/[^0-9]/g, '').length < 9}\r\n className=\"px-3 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] text-white hover:bg-[var(--color-accent-600)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center\"\r\n title={t('admin:tenants.organisation.lookupTitle', 'Search in registry')}\r\n >\r\n {lookupLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Search className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n {/* Feedback messages */}\r\n {lookupError && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1 flex items-center gap-1\">\r\n <AlertTriangle className=\"w-3 h-3\" />\r\n {lookupError}\r\n </p>\r\n )}\r\n {lookupSuccess && (\r\n <p className=\"text-xs text-[var(--success-text)] mt-1 flex items-center gap-1\">\r\n <Check className=\"w-3 h-3\" />\r\n {t('admin:tenants.organisation.lookupSuccess', 'Information retrieved successfully')}\r\n </p>\r\n )}\r\n {data.countryCode === 'CH' && !lookupError && !lookupSuccess && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {data.businessIdentifier.replace(/[^0-9]/g, '').length < 9\r\n ? t('admin:tenants.organisation.lookupHintIncomplete', 'Enter 9 digits to enable Zefix lookup')\r\n : t('admin:tenants.organisation.lookupHint', 'Click search button to auto-fill from Zefix')}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Address */}\r\n <div className=\"space-y-3\">\r\n <label className={labelClass}>\r\n {t('admin:tenants.organisation.form.address', 'Address')} *\r\n </label>\r\n <div>\r\n <input\r\n type=\"text\"\r\n value={data.address.street}\r\n onChange={(e) => onChange({ ...data, address: { ...data.address, street: e.target.value } })}\r\n className={fieldClass(submitted && !data.address.street.trim())}\r\n placeholder={t('admin:tenants.organisation.form.streetPlaceholder', 'Street address')}\r\n />\r\n {submitted && !data.address.street.trim() && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1\">{t('common:validation.required', 'This field is required')}</p>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-3\">\r\n <div>\r\n <input\r\n type=\"text\"\r\n value={data.address.postalCode}\r\n onChange={(e) => onChange({ ...data, address: { ...data.address, postalCode: e.target.value } })}\r\n className={fieldClass(submitted && !data.address.postalCode.trim())}\r\n placeholder={t('admin:tenants.organisation.form.postalCodePlaceholder', 'Postal code')}\r\n />\r\n {submitted && !data.address.postalCode.trim() && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1\">{t('common:validation.required', 'This field is required')}</p>\r\n )}\r\n </div>\r\n <div className=\"col-span-2\">\r\n <input\r\n type=\"text\"\r\n value={data.address.city}\r\n onChange={(e) => onChange({ ...data, address: { ...data.address, city: e.target.value } })}\r\n className={fieldClass(submitted && !data.address.city.trim())}\r\n placeholder={t('admin:tenants.organisation.form.cityPlaceholder', 'City')}\r\n />\r\n {submitted && !data.address.city.trim() && (\r\n <p className=\"text-xs text-[var(--error-text)] mt-1\">{t('common:validation.required', 'This field is required')}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* VAT Number */}\r\n <div>\r\n <label className={labelClass}>\r\n {t('admin:tenants.organisation.form.vatNumber', 'VAT Number')} ({t('common:optional', 'optional')})\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={data.vatNumber || ''}\r\n onChange={(e) => onChange({ ...data, vatNumber: e.target.value || undefined })}\r\n className={inputClass}\r\n placeholder={data.countryCode === 'CH' ? `CHE-123.456.789 ${getVatSuffix()}` : 'FRXX123456789'}\r\n />\r\n {data.countryCode === 'CH' && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('admin:tenants.organisation.vatHint', 'VAT suffix will be added automatically based on language (MWST/TVA/IVA)')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Helper to create initial form data\r\nexport function createInitialOrganisationData(): OrganisationFormData {\r\n return {\r\n name: '',\r\n countryCode: 'CH',\r\n businessIdentifierType: 'UID_CHE',\r\n businessIdentifier: 'CHE-',\r\n isFromRegistry: false,\r\n address: {\r\n street: '',\r\n postalCode: '',\r\n city: '',\r\n state: null,\r\n country: 'Switzerland',\r\n countryCode: 'CH',\r\n },\r\n };\r\n}\r\n\r\n// Helper to convert form data to API request\r\nexport function toCreateOrganisationRequest(data: OrganisationFormData): CreateOrganisationRequest {\r\n return {\r\n name: data.name,\r\n legalName: data.legalName,\r\n countryCode: data.countryCode,\r\n businessIdentifierType: data.businessIdentifierType,\r\n businessIdentifier: data.businessIdentifier,\r\n vatNumber: data.vatNumber,\r\n phone: data.phone,\r\n email: data.email,\r\n website: data.website,\r\n isFromRegistry: data.isFromRegistry || undefined,\r\n address: {\r\n street: data.address.street,\r\n street2: data.address.street2 ?? undefined,\r\n postalCode: data.address.postalCode,\r\n city: data.address.city,\r\n state: data.address.state ?? undefined,\r\n country: data.address.country,\r\n countryCode: data.address.countryCode,\r\n },\r\n };\r\n}\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { ArrowLeft, Loader2, AlertTriangle } from 'lucide-react';\r\nimport {\r\n CreateOrganisationForm,\r\n createInitialOrganisationData,\r\n toCreateOrganisationRequest,\r\n type OrganisationFormData,\r\n} from '@/components/platform/administration/organisations/CreateOrganisationForm';\r\nimport { adminApi } from '@/services/api/adminApi';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\n\r\nexport function OrganisationCreatePage(): ReactElement {\r\n const { t } = useTranslation(['admin', 'common']);\r\n const navigate = useNavigate();\r\n\r\n const [formData, setFormData] = useState<OrganisationFormData>(createInitialOrganisationData());\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [submitted, setSubmitted] = useState(false);\r\n\r\n const isValid = formData.name.trim() && formData.address.street.trim() && formData.address.city.trim() && formData.address.postalCode.trim();\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setSubmitted(true);\r\n\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const request = toCreateOrganisationRequest(formData);\r\n const created = await adminApi.organisations.create(request);\r\n navigate(`/administration/tenants/organisations/${created.id}`);\r\n } catch (err) {\r\n console.error('Failed to create organisation:', err);\r\n setError(\r\n err instanceof Error\r\n ? err.message\r\n : t('admin:organisations.createError', 'Failed to create organisation')\r\n );\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('admin:header.title'), href: '/administration' },\r\n { label: t('admin:tenants.title'), href: '/administration/tenants/list' },\r\n { label: t('admin:organisations.title', 'Organisations'), href: '/administration/tenants/organisations' },\r\n { label: t('common:create', 'Create') },\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between gap-4\">\r\n <div className=\"flex items-center gap-4\">\r\n <button\r\n onClick={() => navigate('/administration/tenants/organisations')}\r\n className=\"p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-5 h-5 text-[var(--text-secondary)]\" />\r\n </button>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('admin:organisations.create', 'Create Organisation')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('admin:organisations.createDescription', 'Add a new organisation to the system')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]\">\r\n <div className=\"flex items-center gap-2 text-[var(--error-text)]\">\r\n <AlertTriangle className=\"w-5 h-5\" />\r\n <span>{error}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n <div className=\"p-6 rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)]\">\r\n <CreateOrganisationForm data={formData} onChange={setFormData} submitted={submitted} />\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/tenants/organisations')}\r\n className=\"px-6 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n >\r\n {t('common:cancel', 'Cancel')}\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={loading}\r\n className=\"flex items-center gap-2 px-6 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-500)] text-white hover:bg-[var(--color-accent-600)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {loading && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {loading ? t('common:saving', 'Saving') : t('common:create', 'Create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n"],"names":["VALID_STATUSES","VALID_TYPES","defaultFilters","validateStatus","value","validateType","validatePage","parsed","getDefaultFilters","lockedType","excludeTypes","useActiveFilterCount","filters","useMemo","count","useDebounce","delay","debouncedValue","setDebouncedValue","useState","useEffect","handler","STATUS_CONFIG","TYPE_CONFIG","User","Building","Server","TenantsPage","t","useTranslation","navigate","useNavigate","searchParams","setSearchParams","useSearchParams","currentTenant","isGlobalView","refreshTenants","useTenant","buildTenantUrl","useTenantUrl","getIconForType","useTenantTypeSettings","initialFilters","tenants","setTenants","loading","setLoading","setFilters","showFilters","setShowFilters","menuOpen","setMenuOpen","actionLoading","setActionLoading","confirmAction","setConfirmAction","viewMode","setViewMode","page","setPage","totalPages","setTotalPages","totalCount","setTotalCount","error","setError","sortKey","setSortKey","sortDesc","setSortDesc","debouncedSearch","activeFilterCount","loadTenants","useCallback","result","adminApi","err","params","handleResetFilters","updateFilter","key","prev","handleActivate","tenant","handleSuspend","handleArchive","handleConfirmAction","action","getConfirmModalMessage","tenantName","getConfirmModalLabel","getConfirmModalVariant","getConfirmModalProps","stats","sum","paginatedTenants","toggleSort","SortIcon","column","jsx","ArrowUpDown","ArrowDown","ArrowUp","getTenantStatusVariant","status","getPageTitle","getPageSubtitle","getPageIcon","Building2","pageTitle","pageSubtitle","PageIcon","hideTypeColumn","columnCount","renderTableHeader","columnLabel","columnKey","hidden","jsxs","renderTableActionsMenu","e","Loader2","MoreHorizontal","Eye","Edit2","Users","PlayCircle","PauseCircle","Archive","renderTableRow","typeInfo","RowIcon","getLucideIcon","rowColors","getColorClasses","statusConfig","StatusBadge","Layers","Clock","renderLoadingRow","renderEmptyRow","renderTableView","buildCardTags","buildCardActions","buildCardStats","Boxes","mapTenantToCardProps","avatarColor","renderCardsView","EntityCard","Breadcrumb","PageHeader","Fragment","AlertCircle","Search","ChevronDown","Filter","RotateCcw","ViewToggle","Pagination","props","ConfirmModal","useTenantDetail","tenantId","setTenant","editingGeneralInfo","setEditingGeneralInfo","editName","setEditName","editDescription","setEditDescription","savingGeneralInfo","setSavingGeneralInfo","loadTenant","data","openEditGeneralInfo","closeEditGeneralInfo","handleSaveGeneralInfo","useTenantMembers","members","setMembers","loadingMembers","setLoadingMembers","addingMember","setAddingMember","availableUsers","setAvailableUsers","loadingUsers","setLoadingUsers","userSearchTerm","setUserSearchTerm","selectedUserId","setSelectedUserId","addingMemberLoading","setAddingMemberLoading","selectedMemberForRoles","setSelectedMemberForRoles","availableRoles","setAvailableRoles","selectedRoleIds","setSelectedRoleIds","loadingRoles","setLoadingRoles","savingRoles","setSavingRoles","loadMembers","loadAvailableUsers","memberUserIds","m","u","handleAddMember","handleRemoveMember","userId","loadAvailableRoles","openRoleModal","member","r","closeRoleModal","handleRoleToggle","roleId","id","handleSaveRoles","useTenantGroups","groups","setGroups","loadingGroups","setLoadingGroups","addingGroup","setAddingGroup","availableGroupsForTenant","setAvailableGroupsForTenant","loadingAvailableGroups","setLoadingAvailableGroups","selectedGroupIds","setSelectedGroupIds","assigningGroups","setAssigningGroups","groupSearchTerm","setGroupSearchTerm","removingGroupId","setRemovingGroupId","loadGroups","loadAvailableGroups","handleAssignGroups","succeeded","failed","groupId","handleRemoveGroup","updateModuleAssignment","module","moduleId","newIsAssigned","s","updateSectionAssignment","sectionId","newSections","anySectionAssigned","assignAllSections","clearAllSections","useTenantApplications","options","applications","setApplications","loadingApps","setLoadingApps","addingApplication","setAddingApplication","availableApps","setAvailableApps","loadingAvailableApps","setLoadingAvailableApps","selectedAppIds","setSelectedAppIds","assigningApps","setAssigningApps","appSearchTerm","setAppSearchTerm","availableAppsError","setAvailableAppsError","selectedAccessLevel","setSelectedAccessLevel","bulkAccessMode","setBulkAccessMode","bulkModules","setBulkModules","bulkExpandedModules","setBulkExpandedModules","loadingBulkModules","setLoadingBulkModules","showCustomizeDrawer","setShowCustomizeDrawer","customizingApp","setCustomizingApp","loadApplications","loadAvailableApps","availableAppsResult","a","isForbidden","closeAddApplication","handleAssignApplications","request","handleRemoveApplication","appId","handleUpdateAccessLevel","accessLevel","openCustomizeDrawer","app","closeCustomizeDrawer","handleSaveOverrides","handleResetOverrides","filteredAvailableApps","searchLower","handleAppToggle","selectAllFilteredApps","filteredIds","clearAppSelection","loadBulkModulesForApp","appModules","moduleNodes","appModule","sectionNodes","section","toggleBulkModuleExpand","newSet","toggleBulkModule","toggleBulkSection","getBulkModuleCheckState","assignedCount","getBulkStats","totalModules","assignedModules","totalSections","assignedSections","selectAllBulkModules","clearBulkModules","COUNTRY_IDENTIFIER_TYPES","DEFAULT_ORG_FORM","useTenantOrganisation","showLinkOrgModal","setShowLinkOrgModal","availableOrgs","setAvailableOrgs","loadingOrgs","setLoadingOrgs","selectedOrgId","setSelectedOrgId","linkingOrg","setLinkingOrg","orgSearchTerm","setOrgSearchTerm","showCreateOrgForm","setShowCreateOrgForm","creatingOrg","setCreatingOrg","newOrgForm","setNewOrgForm","lookupLoading","setLookupLoading","lookupError","setLookupError","lookupSuccess","setLookupSuccess","loadAvailableOrgs","search","response","openLinkOrgModal","closeLinkOrgModal","handleLinkOrganisation","handleUnlinkOrganisation","handleCreateAndLinkOrganisation","createdOrg","formatCheNumber","cleaned","digits","handleBusinessIdChange","handleZefixLookup","cleanedId","errorMessage","handleCountryChange","countryCode","config","useTenantRoles","roles","setRoles","loadRoles","TemplateSelectionModal","show","templates","selectedTemplateId","loadingTemplates","assigningTemplate","onTemplateSelect","onClose","onAssign","tenantTemplateId","X","tmpl","TenantGeneralInfoSection","onEditClick","Info","Edit3","TenantTicketingSection","ticketingConfig","loadingTicketing","Headphones","Settings","CheckCircle2","TenantTemplateSection","onOpenTemplateModal","onRemoveTemplate","removingTemplate","ExternalLink","Plus","Star","ArrowRight","TenantOverviewTab","tenantOwner","onRefresh","onStatusChange","onMembersTabClick","onLinkOrgClick","onUnlinkOrg","editState","setEditState","showTemplateModal","setShowTemplateModal","setTemplates","setLoadingTemplates","setSelectedTemplateId","setAssigningTemplate","setRemovingTemplate","setTicketingConfig","setLoadingTicketing","loadTicketingConfig","ticketingApi","loadTemplates","handleOpenTemplateModal","handleAssignTemplate","handleRemoveTemplate","RefreshCw","typeOption","formatDate","date","TenantMembersTab","onRemoveMember","manageRolesState","setManageRolesState","openRolesModal","closeRolesModal","openAddMember","closeAddMember","columns","Link","Crown","role","Shield","source","UsersRound","Link2","UserMinus","DataTable","term","user","TenantGroupsTab","onRemoveGroup","removeConfirm","setRemoveConfirm","showCreateModal","setShowCreateModal","newGroupName","setNewGroupName","newGroupDescription","setNewGroupDescription","newGroupIsSecurityGroup","setNewGroupIsSecurityGroup","creating","setCreating","createError","setCreateError","openAddGroup","closeAddGroup","handleGroupToggle","handleAddGroups","handleCreateGroup","created","groupsApi","axiosError","group","Cloud","filteredGroups","g","Check","CATEGORY_STYLES","TenantRolesTab","Lock","style","AppWindow","Globe","SOURCE_COLORS","computeModuleOverrides","modules","overrides","wasActive","isNowChecked","computeSectionOverrides","sWasActive","sIsNowChecked","updateModuleCheckStateHelper","newChecked","updateSectionCheckStateHelper","SectionItem","renderIcon","checkRevoked","toggleSection","sectionRevoked","Ban","ModuleRow","isExpanded","getModuleCheckState","toggleModuleExpand","toggleModule","mode","checkState","moduleRevoked","ChevronRight","Minus","ApplicationAccessCustomizeDrawer","isOpen","application","onSaved","saving","setSaving","success","setSuccess","accessMode","setAccessMode","setModules","expandedModules","setExpandedModules","iconName","IconComponent","LucideIcons","loadData","expanded","hasAnyOverride","preCheckAllModules","mods","handleAccessModeChange","newMode","isInheritedRevoked","originalSource","isChecked","checkedCount","saveTemplateMode","moduleIds","sectionIds","saveTenantMode","moduleOverrides","sectionOverrides","handleSave","handleReset","resetAction","checkedModules","checkedSections","inheritedCount","directCount","revokedCount","revokedInheritedModules","revokedInheritedSections","handleEscape","CheckCircle","Save","getCheckStateClassName","getLoadingView","getEmptyApplicationsView","ACCESS_LEVEL_OPTIONS","AccessLevelSelector","opt","isSelected","TenantApplicationsTab","onUpdateAccessLevel","onRemoveApplication","onOpenAddApplication","onCloseAddApplication","onAssignApplications","onAppToggle","onSelectAllApps","onClearAppSelection","onOpenCustomizeDrawer","onCloseCustomizeDrawer","onLoadBulkModules","onToggleBulkModuleExpand","onToggleBulkModule","onToggleBulkSection","onGetBulkModuleCheckState","onGetBulkStats","onSelectAllBulkModules","onClearBulkModules","bulkStats","inheritedApps","directApps","renderAppCard","accessLevelOption","o","isActive","SlidersHorizontal","Trash2","ShieldX","AlertTriangle","icons","ModuleIcon","SectionIcon","VALID_TABS","TenantDetailPage","useParams","activeTab","setActiveTab","useTabNavigation","refreshMenu","useNavigation","tenantDetail","tenantMembers","tenantGroups","handleApplicationsChanged","tenantAppOptions","tenantApplications","tenantRoles","tenantOrganisation","accessRequests","useAccessRequests","confirmModal","setConfirmModal","loadedTabs","setLoadedTabs","handleStatusChange","newStatus","statusMessages","handleRefresh","promises","getStatusIcon","ArrowLeft","tab","owner","AccessRequestsListTab","BUSINESS_IDENTIFIER_TYPES","getTenantTypeFromUrl","typeFromUrl","applyConfigTypeRestrictions","buildOrganisationRequest","orgName","orgLegalName","orgCountryCode","orgBusinessIdType","orgBusinessId","orgVatNumber","addrStreet","addrStreet2","addrPostalCode","addrCity","addrState","addrCountry","addrCountryCode","orgPhone","orgEmail","orgWebsite","isFromRegistry","TenantCreatePage","organisationIdFromUrl","enableB2B","setEnableB2B","enableB2C","setEnableB2C","tenantType","setTenantType","organisationMode","setOrganisationMode","configLoading","setConfigLoading","setIsFromRegistry","selectedOrganisation","setSelectedOrganisation","availableOrganisations","setAvailableOrganisations","orgSearchQuery","setOrgSearchQuery","orgSearchLoading","setOrgSearchLoading","org","name","handleNameChange","debounce","results","setName","slug","setSlug","description","setDescription","setOrgName","setOrgLegalName","setOrgCountryCode","setOrgBusinessIdType","setOrgBusinessId","setOrgVatNumber","setOrgPhone","setOrgEmail","setOrgWebsite","setAddrStreet","setAddrStreet2","setAddrPostalCode","setAddrCity","setAddrState","setAddrCountry","setAddrCountryCode","generateSlug","validateLookupInput","fillOrganisationFields","fillAddressFields","mapLookupError","handleLookup","submitB2CTenant","submitB2BTenant","organisation","handleSubmit","isFormValid","Hash","FileText","Zap","FileCheck","newType","type","MapPin","Phone","Mail","UserPlus","COLORS","renderActiveShape","cx","cy","midAngle","innerRadius","outerRadius","startAngle","endAngle","fill","payload","percent","RADIAN","sin","cos","sx","sy","mx","my","ex","ey","textAnchor","Sector","TenantActivityPieChart","activeIndex","setActiveIndex","getValue","valueLabel","totalValue","chartData","index","onPieEnter","_","ResponsiveContainer","PieChart","Pie","entry","Cell","item","DEFAULT_COLORS","LegendItem","getColor","TenantUsageTrendChart","period","setData","tenantAnalyticsApi","day","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Line","tenantColors","TenantPopularityChart","maxCount","percentage","KpiCard","label","icon","color","subtitle","TenantsDashboardPage","setStats","topTenants","setTopTenants","refreshing","setRefreshing","setPeriod","chartMode","setChartMode","dashboardRes","topTenantsRes","formatDuration","seconds","minutes","Activity","Timer","TrendingUp","ClipboardList","ShieldCheck","mapTemplateAppToTenantApp","useTemplateApplications","templateId","mapped","_appId","_request","TenantTemplateDetailPage","template","setTemplate","templateApplications","loadTemplate","TypeIcon","typeLabel","InfoTab","TenantsTab","AiInstancesTab","StatCard","LayoutGrid","memo","tabError","setTabError","instances","setInstances","loadInstances","handleRemove","instanceId","Brain","instance","TenantsTemplatePage","handleCardClick","systemTemplates","customTemplates","Settings2","SystemTemplateCard","CustomTemplateCard","onClick","TenantTemplateCreatePage","code","setCode","targetTenantType","setTargetTenantType","TenantsBusinessPage","TenantsPersonalPage","TenantsOtherPage","STATUS_FILTERS","TenantAccessRequestsPage","requests","setRequests","statusFilter","setStatusFilter","loadRequests","accessRequestsApi","ENTRA_PERMISSIONS","ENTRA_SYNC_TYPES","REQUIRED_PERMISSIONS","USER_TYPES","calculateElapsedTime","startedAt","now","start","diffSeconds","handleEntraNotification","notification","setActiveSyncSession","SectionCard","Icon","title","children","className","Toggle","checked","onChange","disabled","isValidGuid","ConfigTabReadOnly","canEdit","onEdit","Key","GitMerge","ConfigTab","onConfigUpdated","entraApi","editing","setEditing","testing","setTesting","testResult","setTestResult","showSecret","setShowSecret","copiedPermission","setCopiedPermission","hasExistingSecret","setHasExistingSecret","validationErrors","setValidationErrors","credentials","setCredentials","syncSettings","setSyncSettings","validateField","field","errorKey","handleCredentialChange","hasValidationErrors","canTestConnection","canSaveCredentials","handleCopyPermission","handleTestConnection","handleSaveCredentials","handleSaveSettings","perm","Copy","EyeOff","TestTube","userType","selectedTypes","newTypes","StatusBadgeMap","Square","SyncStatusIconMap","getStatusBadge","badge","getSyncStatusIcon","completedAt","diffMs","useSyncTabState","syncing","setSyncing","lastSyncResult","setLastSyncResult","syncError","setSyncError","history","setHistory","historyLoading","setHistoryLoading","historyPage","setHistoryPage","historyTotalCount","setHistoryTotalCount","cancellingSessionId","setCancellingSessionId","SyncTab","conflicts","syncStatus","canSync","onResolveConflict","onSyncAll","onLoadHistory","onCancelSession","activeSyncSession","historyPageSize","loadHistory","handleSyncNow","handleCancelSession","sessionId","Play","conflict","ConflictCard","History","session","UsersTab","GroupsTab","TenantEntraTab","tenantSlug","hasPermission","useAuth","isConnected","onNotification","useSignalRContext","activeSubTab","setActiveSubTab","createEntraApi","setConfig","setConflicts","setSyncStatus","selectedConflict","setSelectedConflict","resolving","setResolving","syncElapsedTime","setSyncElapsedTime","abortControllerRef","useRef","isLoadingRef","canRead","availableTabs","configData","conflictsData","syncStatusData","interval","handleResolve","resolution","notes","handleSyncAll","handleLoadHistory","pageSize","showConflictBadge","ResolutionModal","validateGlpiConfig","fields","errors","buildGlpiSaveRequest","provider","syncEnabled","syncIntervalMinutes","InfoBubble","text","TenantSupportSettingsTab","showSecrets","setShowSecrets","fieldErrors","setFieldErrors","setProvider","glpiBaseUrl","setGlpiBaseUrl","glpiClientId","setGlpiClientId","glpiClientSecret","setGlpiClientSecret","glpiUsername","setGlpiUsername","glpiPassword","setGlpiPassword","glpiEntityId","setGlpiEntityId","glpiRequestTypeId","setGlpiRequestTypeId","setSyncEnabled","setSyncIntervalMinutes","isGlpi","fieldErrorClass","loadConfiguration","validateForm","updated","newProvider","rest","TenantSettingsPage","TenantTypeSettingsPage","settings","setSettings","editStates","setEditStates","savingType","setSavingType","loadSettings","tenantTypeSettingsApi","states","state","updateEditState","hasChanges","original","current","Palette","setting","PreviewIcon","previewColors","getAvailableIconNames","colorClasses","VERIFICATION_STATUS_CONFIG","OrganisationsListPage","organisations","setOrganisations","setSearch","verificationFilter","setVerificationFilter","loadOrganisations","signal","abortController","handleSearchChange","statusFilters","OrganisationDetailPage","orgId","setOrganisation","getInitialTab","tabParam","verifyModal","setVerifyModal","rejectModal","setRejectModal","loadOrganisation","handleVerify","handleReject","hasContactData","countryIdentifierTypes","CreateOrganisationForm","onTenantNameSuggested","compact","submitted","i18n","getVatSuffix","newValue","updatedData","inputClass","inputErrorClass","fieldClass","hasError","labelClass","createInitialOrganisationData","toCreateOrganisationRequest","OrganisationCreatePage","formData","setFormData","setSubmitted","isValid"],"mappings":";;;;;;;;;;;;;;;;AASA,MAAMA,KAAiC,CAAC,WAAW,UAAU,aAAa,UAAU,GAC9EC,KAA4B,CAAC,YAAY,YAAY,QAAQ,GAE7DC,KAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR,GAEaC,KAAiB,CAACC,MACxBA,KACEJ,GAAe,SAASI,CAAqB,IAAKA,IADtC,IAIRC,KAAe,CAACD,MACtBA,KACEH,GAAY,SAASG,CAAmB,IAAKA,IADjC,IAIRE,KAAe,CAACF,MAAiC;AAC5D,QAAMG,IAAS,SAASH,KAAS,KAAK,EAAE;AACxC,SAAO,MAAMG,CAAM,KAAKA,IAAS,IAAI,IAAIA;AAC3C,GAEaC,KAAoB,CAACC,GAAyBC,OAA8C;AAAA,EACvG,GAAGR;AAAA,EACH,MAAMO,MAAeC,IAAe,KAAc;AACpD;AAEO,SAASC,GACdC,GACAH,GACAC,GACQ;AACR,SAAOG,GAAQ,MAAM;AACnB,QAAIC,IAAQ;AACZ,WAAIF,EAAQ,UAAQE,KAChB,CAACL,KAAc,CAACC,KAAgBE,EAAQ,QAAME,KAC3CA;AAAA,EACT,GAAG,CAACF,GAASH,GAAYC,CAAY,CAAC;AACxC;ACRA,SAASK,GAAeX,GAAUY,GAAkB;AAClD,QAAM,CAACC,GAAgBC,CAAiB,IAAIC,EAAYf,CAAK;AAC7D,SAAAgB,GAAU,MAAM;AACd,UAAMC,IAAU,WAAW,MAAMH,EAAkBd,CAAK,GAAGY,CAAK;AAChE,WAAO,MAAM,aAAaK,CAAO;AAAA,EACnC,GAAG,CAACjB,GAAOY,CAAK,CAAC,GACVC;AACT;AAGA,MAAMK,KAAqK;AAAA,EACzK,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EAAA;AAAA,EAEf,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EAAA;AAAA,EAEf,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EAAA;AAAA,EAEf,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,EAAA;AAEjB,GAEMC,KAA6E;AAAA,EACjF,UAAU,EAAE,MAAMC,IAAM,OAAO,wBAAA;AAAA,EAC/B,UAAU,EAAE,MAAMC,IAAU,OAAO,wBAAA;AAAA,EACnC,QAAQ,EAAE,MAAMC,IAAQ,OAAO,sBAAA;AACjC;AAsBO,SAASC,GAAY,EAAE,YAAAlB,GAAY,cAAAC,KAAgD;AACxF,QAAM,EAAE,GAAAkB,EAAA,IAAMC,GAAe,OAAO,GAC9BC,IAAWC,GAAA,GACX,CAACC,GAAcC,CAAe,IAAIC,GAAA,GAClC,EAAE,eAAAC,GAAe,cAAAC,GAAc,gBAAAC,EAAA,IAAmBC,GAAA,GAClDC,IAAiBC,GAAA,GACjB,EAAE,gBAAAC,EAAA,IAAmBC,GAAA,GAGrBC,IAA8B9B;AAAA,IAClC,OAAO;AAAA,MACL,QAAQmB,EAAa,IAAI,QAAQ,KAAK;AAAA,MACtC,QAAQ7B,GAAe6B,EAAa,IAAI,QAAQ,CAAC;AAAA,MACjD,MAAMvB,KAAcJ,GAAa2B,EAAa,IAAI,MAAM,CAAC,MAAMtB,IAAe,KAAK;AAAA,IAAA;AAAA;AAAA,IAGrF,CAAA;AAAA,EAAC,GAGG,CAACkC,GAASC,CAAU,IAAI1B,EAA0B,CAAA,CAAE,GACpD,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAACP,GAASoC,CAAU,IAAI7B,EAAsBwB,CAAc,GAC5D,CAACM,GAAaC,CAAc,IAAI/B,EAAS,EAAK,GAC9C,CAACgC,GAAUC,CAAW,IAAIjC,EAAwB,IAAI,GACtD,CAACkC,GAAeC,CAAgB,IAAInC,EAAwB,IAAI,GAChE,CAACoC,GAAeC,CAAgB,IAAIrC,EAAuF,IAAI,GAC/H,CAACsC,GAAUC,CAAW,IAAIvC,EAAmB,OAAO,GACpD,CAACwC,GAAMC,CAAO,IAAIzC,EAASb,GAAa0B,EAAa,IAAI,MAAM,CAAC,CAAC,GACjE,CAAC6B,IAAYC,EAAa,IAAI3C,EAAS,CAAC,GACxC,CAAC4C,GAAYC,CAAa,IAAI7C,EAAS,CAAC,GACxC,CAAC8C,IAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACgD,GAASC,CAAU,IAAIjD,EAAiB,MAAM,GAC/C,CAACkD,GAAUC,CAAW,IAAInD,EAAS,EAAK,GAGxCoD,IAAkBxD,GAAYH,EAAQ,QAAQ,GAAG,GAGjD4D,IAAoB7D,GAAqBC,GAASH,GAAYC,CAAY,GAE1E+D,IAAcC,EAAY,YAAY;AAC1C,QAAI;AACF,MAAA3B,EAAW,EAAI,GACfmB,EAAS,IAAI;AACb,YAAMS,IAAS,MAAMC,EAAS,QAAQ,OAAO;AAAA,QAC3C,MAAAjB;AAAA,QACA,UAAU;AAAA,QACV,QAAQY,KAAmB;AAAA,QAC3B,QAAQ3D,EAAQ,UAAU;AAAA,QAC1B,MAAMA,EAAQ,QAAQ;AAAA,QACtB,QAAQuD;AAAA,QACR,UAAAE;AAAA,QACA,cAAA3D;AAAA,MAAA,CACD;AACD,MAAAmC,EAAW8B,EAAO,KAAK,GACvBX,EAAcW,EAAO,UAAU,GAC/Bb,GAAca,EAAO,UAAU;AAAA,IACjC,SAASE,GAAK;AACZ,cAAQ,MAAM,2BAA2BA,CAAG,GAC5CX,EAAStC,EAAE,mBAAmB,CAAC,GAC/BiB,EAAW,CAAA,CAAE;AAAA,IACf,UAAA;AACE,MAAAE,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACY,GAAMY,GAAiB3D,EAAQ,QAAQA,EAAQ,MAAMuD,GAASE,GAAUzC,GAAGO,GAAe,IAAIC,GAAc1B,CAAY,CAAC;AAG7H,EAAAU,GAAU,MAAM;AACd,UAAM0D,IAAS,IAAI,gBAAA;AACnB,IAAIlE,EAAQ,UAAQkE,EAAO,IAAI,UAAUlE,EAAQ,MAAM,GACnDA,EAAQ,UAAQkE,EAAO,IAAI,UAAUlE,EAAQ,MAAM,GACnDA,EAAQ,QAAMkE,EAAO,IAAI,QAAQlE,EAAQ,IAAI,GAC7C+C,IAAO,KAAGmB,EAAO,IAAI,QAAQnB,EAAK,UAAU,GAChD1B,EAAgB6C,GAAQ,EAAE,SAAS,GAAA,CAAM;AAAA,EAC3C,GAAG,CAAClE,GAAS+C,GAAM1B,CAAe,CAAC,GAEnCb,GAAU,MAAM;AACd,IAAAqD,EAAA;AAAA,EACF,GAAG,CAACA,CAAW,CAAC;AAEhB,QAAMM,KAAqB,MAAM;AAC/B,IAAA/B,EAAWxC,GAAkBC,GAAYC,CAAY,CAAC,GACtDkD,EAAQ,CAAC;AAAA,EACX,GAEMoB,KAAe,CAA8BC,GAAQ7E,OAA0B;AAEnF,IAAIK,KAAcwE,MAAQ,WAG1BjC,EAAW,CAAAkC,QAAS,EAAE,GAAGA,IAAM,CAACD,CAAG,GAAG7E,KAAQ,GAC9CwD,EAAQ,CAAC;AAAA,EACX,GAEMuB,KAAiB,CAACC,MAA0B;AAChD,IAAAhC,EAAY,IAAI,GAChBI,EAAiB,EAAE,QAAA4B,GAAQ,QAAQ,WAAA,CAAY;AAAA,EACjD,GAEMC,KAAgB,CAACD,MAA0B;AAC/C,IAAAhC,EAAY,IAAI,GAChBI,EAAiB,EAAE,QAAA4B,GAAQ,QAAQ,UAAA,CAAW;AAAA,EAChD,GAEME,KAAgB,CAACF,MAA0B;AAC/C,IAAAhC,EAAY,IAAI,GAChBI,EAAiB,EAAE,QAAA4B,GAAQ,QAAQ,UAAA,CAAW;AAAA,EAChD,GAEMG,KAAsB,YAAY;AACtC,QAAI,CAAChC,EAAe;AACpB,UAAM,EAAE,QAAA6B,GAAQ,QAAAI,GAAA,IAAWjC;AAC3B,IAAAD,EAAiB8B,EAAO,EAAE;AAC1B,QAAI;AACF,MAAII,OAAW,aAAY,MAAMZ,EAAS,QAAQ,SAASQ,EAAO,EAAE,IAC3DI,OAAW,YAAW,MAAMZ,EAAS,QAAQ,QAAQQ,EAAO,EAAE,IAC9DI,OAAW,aAAW,MAAMZ,EAAS,QAAQ,QAAQQ,EAAO,EAAE,GACvE,MAAM/C,EAAA,GACNoC,EAAA;AAAA,IACF,SAASI,IAAK;AACZ,cAAQ,MAAM,aAAaW,EAAM,YAAYX,EAAG;AAAA,IAClD,UAAA;AACE,MAAAvB,EAAiB,IAAI,GACrBE,EAAiB,IAAI;AAAA,IACvB;AAAA,EACF,GAEMiC,IAAyB,CAACD,GAA4CE,OAA+B;AACzG,YAAQF,GAAA;AAAA,MACN,KAAK;AACH,eAAO5D,EAAE,2BAA2B,EAAE,MAAM8D,IAAY;AAAA,MAC1D,KAAK;AACH,eAAO9D,EAAE,0BAA0B,EAAE,MAAM8D,IAAY;AAAA,MACzD,KAAK;AACH,eAAO9D,EAAE,0BAA0B,EAAE,MAAM8D,IAAY;AAAA,IAAA;AAAA,EAE7D,GAEMC,KAAuB,CAACH,MAAuD;AACnF,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO5D,EAAE,0BAA0B;AAAA,MACrC,KAAK;AACH,eAAOA,EAAE,yBAAyB;AAAA,MACpC,KAAK;AACH,eAAOA,EAAE,yBAAyB;AAAA,IAAA;AAAA,EAExC,GAEMgE,KAAyB,CAACJ,MAA+D;AAC7F,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IAAA;AAAA,EAEb,GAEMK,IAAuB,MAAM;AACjC,QAAI,CAACtC,EAAe,QAAO;AAC3B,UAAM,EAAE,QAAA6B,GAAQ,QAAAI,GAAA,IAAWjC;AAC3B,WAAO;AAAA,MACL,SAASkC,EAAuBD,IAAQJ,EAAO,IAAI;AAAA,MACnD,OAAOO,GAAqBH,EAAM;AAAA,MAClC,SAASI,GAAuBJ,EAAM;AAAA,IAAA;AAAA,EAE1C,GAGMM,IAAQjF,GAAQ,OAAO;AAAA,IAC3B,QAAQ+B,EAAQ,OAAO,CAAAhB,MAAKA,EAAE,WAAW,QAAQ,EAAE;AAAA,IACnD,WAAWgB,EAAQ,OAAO,CAAAhB,MAAKA,EAAE,WAAW,WAAW,EAAE;AAAA,IACzD,SAASgB,EAAQ,OAAO,CAACmD,GAAKnE,OAAMmE,KAAOnE,GAAE,eAAe,IAAI,CAAC;AAAA,IACjE,iBAAiBgB,EAAQ,OAAO,CAACmD,GAAKnE,OAAMmE,KAAOnE,GAAE,6BAA6B,IAAI,CAAC;AAAA,EAAA,IACrF,CAACgB,CAAO,CAAC,GAGPoD,IAAmBpD,GAEnBqD,KAAa,CAAChB,MAAgB;AAClC,IAAId,MAAYc,IACdX,EAAY,CAACD,CAAQ,KAErBD,EAAWa,CAAG,GACdX,EAAY,EAAK,IAEnBV,EAAQ,CAAC;AAAA,EACX,GAEMsC,IAAW,CAAC,EAAE,QAAAC,QACdhC,MAAYgC,IAAe,gBAAAC,EAACC,IAAA,EAAY,WAAU,gGAA+F,IAC9IhC,sBACFiC,IAAA,EAAU,WAAU,8CAA6C,IAClE,gBAAAF,EAACG,IAAA,EAAQ,WAAU,6CAAA,CAA6C,GAGhEC,IAAyB,CAACC,MAC1BA,MAAW,WAAiB,YAC5BA,MAAW,cAAoB,YAC/BA,MAAW,YAAkB,SAC1B,WAGHC,KAAe,MAAc;AACjC,QAAIhG,EAAc,QAAOkB,EAAE,qBAAqB;AAChD,YAAQnB,GAAA;AAAA,MACN,KAAK;AACH,eAAOmB,EAAE,0BAA0B;AAAA,MACrC,KAAK;AACH,eAAOA,EAAE,wBAAwB;AAAA,MACnC;AACE,eAAOA,EAAE,eAAe;AAAA,IAAA;AAAA,EAE9B,GAEM+E,KAAkB,MAAc;AACpC,QAAIjG,EAAc,QAAOkB,EAAE,wBAAwB;AACnD,YAAQnB,GAAA;AAAA,MACN,KAAK;AACH,eAAOmB,EAAE,6BAA6B;AAAA,MACxC,KAAK;AACH,eAAOA,EAAE,2BAA2B;AAAA,MACtC;AACE,eAAOA,EAAE,kBAAkB;AAAA,IAAA;AAAA,EAEjC,GAEMgF,KAAc,MAAM;AACxB,QAAIlG,EAAc,QAAOgB;AACzB,YAAQjB,GAAA;AAAA,MACN,KAAK;AACH,eAAOgB;AAAA,MACT,KAAK;AACH,eAAOD;AAAA,MACT;AACE,eAAOqF;AAAA,IAAA;AAAA,EAEb,GAEMC,KAAYJ,GAAA,GACZK,KAAeJ,GAAA,GACfK,KAAWJ,GAAA,GAEXK,KAAiB,CAAC,CAACxG,KAAc,CAAC,CAACC,GAEnCwG,KAAc,KAAMD,KAAqB,IAAJ,KAAS,GAE9CE,KAAoB,CAACC,GAAqBC,IAAmBC,KAAiB,OAClF,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,yLAAyLkB,EAAM;AAAA,MAC1M,SAAS,MAAMrB,GAAWoB,EAAS;AAAA,MAEnC,UAAA,gBAAAE,EAAC,QAAA,EAAK,WAAU,oCACb,UAAA;AAAA,QAAAH;AAAA,QACD,gBAAAhB,EAACF,GAAA,EAAS,QAAQmB,GAAA,CAAW;AAAA,MAAA,EAAA,CAC/B;AAAA,IAAA;AAAA,EAAA,GAIEG,KAAyB,CAACpC,MAC9B,gBAAAgB,EAAC,OAAA,EAAI,WAAU,uCAAsC,SAAS,CAACqB,OAAMA,GAAE,gBAAA,GAAmB,WAAW,CAACA,OAAMA,GAAE,gBAAA,GAAmB,MAAK,gBACpI,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMhD,EAAYD,MAAaiC,EAAO,KAAK,OAAOA,EAAO,EAAE;AAAA,QACpE,WAAU;AAAA,QAET,UAAA/B,MAAkB+B,EAAO,KACxB,gBAAAgB,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAACuB,IAAA,EAAe,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAIvCxE,MAAaiC,EAAO,MACnB,gBAAAmC,EAAC,OAAA,EAAI,WAAU,qGAAoG,OAAO,EAAE,cAAc,qBAAA,GACxI,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AACb,YAAAnE,EAAY,IAAI,GAChBtB,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,EAAE,CAAC;AAAA,UACjE;AAAA,UACA,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAACwB,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,YACxBhG,EAAE,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEnB,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AACb,YAAAnE,EAAY,IAAI,GAChBtB,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,EAAE,CAAC;AAAA,UACjE;AAAA,UACA,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAACyB,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC1BjG,EAAE,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAElB,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAM;AACb,YAAAnE,EAAY,IAAI,GAChBtB,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,UAAU,CAAC;AAAA,UACzE;AAAA,UACA,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC1BlG,EAAE,6BAA6B;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAElC,gBAAAwE,EAAC,OAAA,EAAI,WAAU,6CAAA,CAA6C;AAAA,MAC3DhB,EAAO,WAAW,YAAYA,EAAO,WAAW,cAC/C,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMpC,GAAeC,CAAM;AAAA,UACpC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAAC2B,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,YAC/BnG,EAAE,0BAA0B;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGhCwD,EAAO,WAAW,YACjB,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMlC,GAAcD,CAAM;AAAA,UACnC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAAC4B,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,YAChCpG,EAAE,yBAAyB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAG/BwD,EAAO,WAAW,cACjB,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMjC,GAAcF,CAAM;AAAA,UACnC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAAC6B,IAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,YAC5BrG,EAAE,yBAAyB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9B,EAAA,CAEJ;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF,GAGIsG,KAAiB,CAAC9C,MAA0B;AAChD,UAAM+C,KAAW1F,EAAe2C,EAAO,IAAI,GACrCgD,KAAUC,GAAcF,GAAS,IAAI,GACrCG,KAAYC,GAAgBJ,GAAS,KAAK,GAC1CK,KAAelH,GAAc8D,EAAO,MAAM;AAEhD,WACE,gBAAAmC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW,kEAAkEpE,MAAaiC,EAAO,KAAK,kBAAkB,EAAE;AAAA,QAC1H,SAAS,MAAMtD,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,EAAE,CAAC;AAAA,QAE9E,UAAA;AAAA,UAAA,gBAAAgB,EAAC,QAAG,WAAU,aACZ,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAI,WAAW,8CAA8CkC,GAAU,EAAE,IAAI,OAAO,EAAE,cAAc,wBACnG,4BAACF,IAAA,EAAQ,WAAW,WAAWE,GAAU,IAAI,IAAI,GACnD;AAAA,YACA,gBAAAf,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,gHACV,UAAAhB,EAAO,MACV;AAAA,cACA,gBAAAgB,EAAC,KAAA,EAAE,WAAU,gDAAgD,YAAO,KAAA,CAAK;AAAA,YAAA,EAAA,CAC3E;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,UACC,CAACa,MACA,gBAAAM,EAAC,MAAA,EAAG,WAAU,kCACZ,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnB,EAACgC,IAAA,EAAQ,WAAW,WAAWE,GAAU,IAAI,IAAI;AAAA,cACjD,gBAAAlC,EAAC,QAAA,EAAK,WAAU,wCACb,UAAAxE,EAAEL,GAAY6D,EAAO,IAAI,EAAE,KAAK,EAAA,CACnC;AAAA,YAAA,GACF;AAAA,YACCA,EAAO,cAAc,QACpB,gBAAAgB,EAAC,OAAE,WAAU,uDAAuD,UAAAhB,EAAO,aAAa,KAAA,CAAK;AAAA,UAAA,GAEjG;AAAA,UAEF,gBAAAgB,EAAC,MAAA,EAAG,WAAU,aACZ,UAAA,gBAAAA;AAAA,YAACqC;AAAA,YAAA;AAAA,cACC,QAAQD,GAAa;AAAA,cACrB,OAAO5G,EAAE,kBAAkBwD,EAAO,OAAO,YAAA,CAAa,EAAE;AAAA,YAAA;AAAA,UAAA,GAE5D;AAAA,UACA,gBAAAgB,EAAC,QAAG,WAAU,kCACX,YAAO,eACN,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAACsC,IAAA,EAAO,WAAU,yCAAA,CAAyC;AAAA,YAC3D,gBAAAtC,EAAC,QAAA,EAAK,WAAU,sCAAsC,YAAO,aAAA,CAAa;AAAA,UAAA,GAC5E,IAEA,gBAAAA,EAAC,QAAA,EAAK,WAAU,uCAAsC,eAAC,GAE3D;AAAA,UACA,gBAAAA,EAAC,MAAA,EAAG,WAAU,8CACZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAhB,EAAO,eAAe,EAAA,CAAE,GAChF;AAAA,UACA,gBAAAgB,EAAC,MAAA,EAAG,WAAU,8CACV,WAAAhB,EAAO,6BAA6B,KAAK,IACzC,gBAAAmC,EAAC,QAAA,EAAK,WAAU,uKACd,UAAA;AAAA,YAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC1BvD,EAAO;AAAA,UAAA,GACV,IAEA,gBAAAgB,EAAC,QAAA,EAAK,WAAU,uCAAsC,eAAC,GAE3D;AAAA,4BACC,MAAA,EAAG,WAAU,aACX,UAAAoB,GAAuBpC,CAAM,EAAA,CAChC;AAAA,QAAA;AAAA,MAAA;AAAA,MA7DKA,EAAO;AAAA,IAAA;AAAA,EAgElB,GAEMwD,KAAmB,MACvB,gBAAAxC,EAAC,MAAA,EACC,4BAAC,MAAA,EAAG,SAASc,IAAa,WAAU,oBAClC,UAAA,gBAAAd,EAAC,OAAA,EAAI,WAAU,2GAAA,CAA2G,GAC5H,GACF,GAGIyC,KAAiB,MACrB,gBAAAzC,EAAC,MAAA,EACC,UAAA,gBAAAA,EAAC,MAAA,EAAG,SAASc,IAAa,WAAU,iDACjC,UAAAtF,EAAE,eAAe,GACpB,GACF,GAGIkH,KAAkB,MACtB,gBAAA1C,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,UACf,UAAA;AAAA,IAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,4BAA2B,OAAO,EAAE,cAAc,4CAAA,GACjE,UAAA,gBAAAmB,EAAC,MAAA,EACE,UAAA;AAAA,MAAAJ,GAAkBvF,EAAE,sBAAsB,GAAG,MAAM;AAAA,MACnD,CAACqF,MAAkBE,GAAkBvF,EAAE,sBAAsB,GAAG,QAAQ,sBAAsB;AAAA,MAC9FuF,GAAkBvF,EAAE,wBAAwB,GAAG,QAAQ;AAAA,MACvDuF,GAAkBvF,EAAE,0BAA0B,GAAG,YAAY,sBAAsB;AAAA,wBACnF,MAAA,EAAG,WAAU,yHACX,UAAAA,EAAE,yBAAyB,GAC9B;AAAA,wBACC,MAAA,EAAG,WAAU,yHACX,UAAAA,EAAE,0BAA0B,GAC/B;AAAA,MACA,gBAAAwE,EAAC,MAAA,EAAG,WAAU,iBAAA,CAAiB;AAAA,IAAA,EAAA,CACjC,EAAA,CACF;AAAA,IACA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,yCACd,UAAA;AAAA,MAAAzE,KAAW8F,GAAA;AAAA,MACX,CAAC9F,KAAWkD,EAAiB,WAAW,KAAK6C,GAAA;AAAA,MAC7C,CAAC/F,KAAWkD,EAAiB,SAAS,KAAKA,EAAiB,IAAIkC,EAAc;AAAA,IAAA,EAAA,CACjF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,GAGIa,KAAgB,CAAC3D,MAA2C;AAAA,IAChE;AAAA,MACE,OAAOxD,EAAE,gBAAgBwD,EAAO,KAAK,YAAA,CAAa,EAAE;AAAA,MACpD,SAASA,EAAO,SAAS,aAAa,SAAS;AAAA,IAAA;AAAA,IAEjD;AAAA,MACE,OAAOxD,EAAE,kBAAkBwD,EAAO,OAAO,YAAA,CAAa,EAAE;AAAA,MACxD,SAASoB,EAAuBpB,EAAO,MAAM;AAAA,IAAA;AAAA,EAC/C,GAGI4D,KAAmB,CAAC5D,MAA8C;AAAA,IACtE;AAAA,MACE,OAAOxD,EAAE,aAAa;AAAA,MACtB,SAAS,MAAME,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,EAAE,CAAC;AAAA,MAC9E,SAAS;AAAA,MACT,MAAMyC;AAAA,IAAA;AAAA,IAER;AAAA,MACE,OAAOjG,EAAE,6BAA6B;AAAA,MACtC,SAAS,MAAME,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,UAAU,CAAC;AAAA,MACtF,SAAS;AAAA,MACT,MAAM0C;AAAA,IAAA;AAAA,EACR,GAGImB,KAAiB,CAAC7D,MACtB,gBAAAmC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,wBACtD,QAAA,EAAM,UAAA;AAAA,QAAA1C,EAAO,eAAe;AAAA,QAAE;AAAA,QAAExD,EAAE,iBAAiB;AAAA,MAAA,EAAA,CAAE;AAAA,IAAA,GACxD;AAAA,IACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC8C,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,wBACtD,QAAA,EAAM,UAAA;AAAA,QAAA9D,EAAO,oBAAoB;AAAA,QAAE;AAAA,QAAExD,EAAE,sBAAsB;AAAA,MAAA,EAAA,CAAE;AAAA,IAAA,EAAA,CAClE;AAAA,EAAA,GACF,GAGIuH,KAAuB,CAAC/D,MAA0B;AAEtD,UAAMgE,KADQhE,EAAO,SAAS,aACF,YAAY;AAExC,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,QAAQA,EAAO,KAAK,GAAG,CAAC,GAAG,iBAAiB;AAAA,QAC5C,OAAOgE;AAAA,MAAA;AAAA,MAET,OAAOhE,EAAO;AAAA,MACd,UAAUA,EAAO;AAAA,MACjB,aAAaA,EAAO,cAAc,QAAQ;AAAA,MAC1C,OAAO6D,GAAe7D,CAAM;AAAA,MAC5B,MAAM2D,GAAc3D,CAAM;AAAA,MAC1B,SAAS4D,GAAiB5D,CAAM;AAAA,MAChC,SAAS,MAAMtD,EAASS,EAAe,2BAA2B6C,EAAO,EAAE,EAAE,CAAC;AAAA,IAAA;AAAA,EAElF,GAGMiE,KAAkB,MACtB,gBAAA9B,EAAC,OAAA,EAAI,WAAU,uEACZ,UAAA;AAAA,IAAAzE,KACC,gBAAAyE,EAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD;AAAA,wBACxE,QAAA,EAAK,WAAU,6CAA6C,UAAA9F,EAAE,gBAAgB,EAAA,CAAE;AAAA,IAAA,GACnF;AAAA,IAED,CAACkB,KAAWkD,EAAiB,WAAW,KACvC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAI,WAAU,uFACb,4BAACS,IAAA,EAAU,WAAU,uCAAsC,EAAA,CAC7D;AAAA,wBACC,QAAA,EAAK,WAAU,gCAAgC,UAAAjF,EAAE,mBAAmB,EAAA,CAAE;AAAA,IAAA,GACzE;AAAA,IAED,CAACkB,KAAWkD,EAAiB,SAAS,KACrCA,EAAiB,IAAI,CAACZ,MACpB,gBAAAgB,EAACkD,MAA4B,GAAGH,GAAqB/D,CAAM,EAAA,GAA1CA,EAAO,EAAsC,CAC/D;AAAA,EAAA,GAEL;AAGF,SACE,gBAAAmC,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAMW,EAAe,iBAAiB,EAAA;AAAA,UAClE,GAAI9B,KAAcC,IACd;AAAA,YACE,EAAE,OAAOkB,EAAE,eAAe,GAAG,MAAMW,EAAe,8BAA8B,EAAA;AAAA,YAChF,EAAE,OACyBX,EAArBlB,IAAuB,wBACpBD,MAAe,aAAe,6BAAgC,wBADrB,EAE/C;AAAA,UAAE,IAEP,CAAC,EAAE,OAAOmB,EAAE,eAAe,GAAG;AAAA,QAAA;AAAA,MAEpC;AAAA,IAAA;AAAA,IAIF,gBAAAwE;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO1C;AAAA,QACP,UAAUC;AAAA,QACV,MAAM,gBAAAX,EAACY,IAAA,EAAS,WAAU,yCAAA,CAAyC;AAAA,QACnE,SACE,gBAAAO,EAAAkC,IAAA,EACG,UAAA;AAAA,UAAA,CAAC/I,MAAiB,CAACD,KAAcA,MAAe,eAC/C,gBAAA8G;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMzF,EAASS,EAAe,gCAAgC,IAAI,WAAW;AAAA,cACtF,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA6D,EAAC5E,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBACzBI,EAAE,mBAAmB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGzB,CAAClB,MAAiB,CAACD,KAAcA,MAAe,eAC/C,gBAAA8G;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMzF,EAASS,EAAe,gCAAgC,IAAI,WAAW;AAAA,cACtF,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA6D,EAAC3E,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,gBAC7BG,EAAE,mBAAmB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACxB,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAKHqC,MACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,0HACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,gDAAA,CAAgD;AAAA,MACvE,gBAAAtD,EAAC,QAAA,EAAK,WAAU,4BAA4B,UAAAnC,IAAM;AAAA,MAClD,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS3B;AAAA,UACT,WAAU;AAAA,UAET,YAAE,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IACnB,GACF;AAAA,sBAID,OAAA,EAAI,WAAU,iBACb,UAAA,gBAAA8C,EAAC,OAAA,EAAI,WAAU,uBAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAnB,EAACuD,IAAA,EAAO,WAAU,+EAAA,CAA+E;AAAA,UACjG,gBAAAvD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOxF,EAAQ;AAAA,cACf,UAAU,CAAC6G,MAAMzC,GAAa,UAAUyC,EAAE,OAAO,KAAK;AAAA,cACtD,aAAa7F,EAAE,eAAe;AAAA,cAC9B,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QAGEnB,KAAcC,IACd,gBAAA6G,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO3G,EAAQ;AAAA,cACf,UAAU,CAAC6G,MAAMzC,GAAa,UAAUyC,EAAE,OAAO,KAA0B;AAAA,cAC3E,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAF,EAAC,UAAA,EAAO,OAAM,IAAI,UAAA;AAAA,kBAAA3F,EAAE,wBAAwB;AAAA,kBAAE;AAAA,kBAAGA,EAAE,YAAY;AAAA,gBAAA,GAAE;AAAA,kCAChE,UAAA,EAAO,OAAM,WAAW,UAAAA,EAAE,wBAAwB,GAAE;AAAA,kCACpD,UAAA,EAAO,OAAM,UAAU,UAAAA,EAAE,uBAAuB,GAAE;AAAA,kCAClD,UAAA,EAAO,OAAM,aAAa,UAAAA,EAAE,0BAA0B,GAAE;AAAA,kCACxD,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,yBAAyB,EAAA,CAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEzD,gBAAAwE,EAACwD,IAAA,EAAY,WAAU,sGAAA,CAAsG;AAAA,QAAA,EAAA,CAC/H,IAEA,gBAAArC,EAAAkC,IAAA,EACE,UAAA;AAAA,UAAA,gBAAAlC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMrE,EAAe,CAACD,CAAW;AAAA,cAC1C,WAAW,uKAAuKuB,IAAoB,IAAI,0CAA0C,EAAE;AAAA,cAEtP,UAAA;AAAA,gBAAA,gBAAA4B,EAACyD,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,gBAC3BjI,EAAE,gBAAgB;AAAA,gBAClB4C,IAAoB,KACnB,gBAAA4B,EAAC,QAAA,EAAK,WAAU,mFACb,UAAA5B,GACH;AAAA,kCAEDoF,IAAA,EAAY,WAAW,gCAAgC3G,IAAc,eAAe,EAAE,GAAA,CAAI;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAG5FuB,IAAoB,KACnB,gBAAA+C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASxC;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAqB,EAAC0D,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,gBAC9BlI,EAAE,cAAc;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACnB,GAEJ;AAAA,QAGF,gBAAAwE,EAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,QAExB,gBAAAA;AAAA,UAAC2D;AAAA,UAAA;AAAA,YACC,UAAAtG;AAAA,YACA,UAAUC;AAAA,YACV,WAAW;AAAA,YACX,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,YAAY9B,EAAE,cAAc;AAAA,YAC5B,YAAYA,EAAE,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9B,GACF;AAAA,MAGC,CAACnB,KAAc,CAACC,KAAgBuC,KAC/B,gBAAAsE,EAAC,OAAA,EAAI,WAAU,mGACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,gEACd,UAAAxE,EAAE,wBAAwB,GAC7B;AAAA,UACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO3G,EAAQ;AAAA,gBACf,UAAU,CAAC6G,MAAMzC,GAAa,UAAUyC,EAAE,OAAO,KAA0B;AAAA,gBAC3E,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAArB,EAAC,UAAA,EAAO,OAAM,IAAI,UAAAxE,EAAE,YAAY,GAAE;AAAA,oCACjC,UAAA,EAAO,OAAM,WAAW,UAAAA,EAAE,wBAAwB,GAAE;AAAA,oCACpD,UAAA,EAAO,OAAM,UAAU,UAAAA,EAAE,uBAAuB,GAAE;AAAA,oCAClD,UAAA,EAAO,OAAM,aAAa,UAAAA,EAAE,0BAA0B,GAAE;AAAA,oCACxD,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,yBAAyB,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEzD,gBAAAwE,EAACwD,IAAA,EAAY,WAAU,sGAAA,CAAsG;AAAA,UAAA,EAAA,CAC/H;AAAA,QAAA,GACF;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAxD,EAAC,SAAA,EAAM,WAAU,gEACd,UAAAxE,EAAE,sBAAsB,GAC3B;AAAA,UACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO3G,EAAQ;AAAA,gBACf,UAAU,CAAC6G,MAAMzC,GAAa,QAAQyC,EAAE,OAAO,KAAwB;AAAA,gBACvE,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAArB,EAAC,UAAA,EAAO,OAAM,IAAI,UAAAxE,EAAE,YAAY,GAAE;AAAA,oCACjC,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,uBAAuB,GAAE;AAAA,oCACpD,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,uBAAuB,GAAE;AAAA,oCACpD,UAAA,EAAO,OAAM,UAAU,UAAAA,EAAE,qBAAqB,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEnD,gBAAAwE,EAACwD,IAAA,EAAY,WAAU,sGAAA,CAAsG;AAAA,UAAA,EAAA,CAC/H;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF;AAAA,IAGA,gBAAArC,EAAC,OAAA,EAAI,WAAU,8CACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAI,WAAU,yEACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,qCAAA,CAAqC;AAAA,0BACzD,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAT,EAAC,KAAA,EAAE,WAAU,iDAAiD,UAAAN,EAAM,QAAO;AAAA,4BAC1E,KAAA,EAAE,WAAU,sCAAsC,UAAAlE,EAAE,uBAAuB,EAAA,CAAE;AAAA,QAAA,EAAA,CAChF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,wBACC,OAAA,EAAI,WAAU,yEACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC4B,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,0BAC3D,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA5B,EAAC,KAAA,EAAE,WAAU,iDAAiD,UAAAN,EAAM,WAAU;AAAA,4BAC7E,KAAA,EAAE,WAAU,sCAAsC,UAAAlE,EAAE,0BAA0B,EAAA,CAAE;AAAA,QAAA,EAAA,CACnF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,wBACC,OAAA,EAAI,WAAU,yEACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,uCAAA,CAAuC;AAAA,0BACvD,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA1B,EAAC,KAAA,EAAE,WAAU,iDAAiD,UAAAN,EAAM,SAAQ;AAAA,4BAC3E,KAAA,EAAE,WAAU,wCAAwC,UAAAlE,EAAE,yBAAyB,EAAA,CAAE;AAAA,QAAA,EAAA,CACpF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,MACA,gBAAAwE,EAAC,OAAA,EAAI,WAAW,mBAAmBN,EAAM,kBAAkB,IAAI,0DAA0D,uDAAuD,IAC9K,UAAA,gBAAAyB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAW,WAAW7C,EAAM,kBAAkB,IAAI,+BAA+B,8BAA8B,GAAA,CAAI;AAAA,0BACzH,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAM,EAAC,KAAA,EAAE,WAAW,sBAAsBN,EAAM,kBAAkB,IAAI,+BAA+B,4BAA4B,IAAK,UAAAA,EAAM,gBAAA,CAAgB;AAAA,UACtJ,gBAAAM,EAAC,KAAA,EAAE,WAAW,WAAWN,EAAM,kBAAkB,IAAI,+BAA+B,8BAA8B,IAAK,UAAAlE,EAAE,0BAA0B,EAAA,CAAE;AAAA,QAAA,EAAA,CACvJ;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGC6B,MAAa,UAAUqF,GAAA,IAAoBO,GAAA;AAAA,IAG3CxF,KAAa,KACZ,gBAAAuC,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA;AAAA,MAAC4D;AAAA,MAAA;AAAA,QACC,MAAArG;AAAA,QACA,YAAAE;AAAA,QACA,YAAAE;AAAA,QACA,UAAU;AAAA,QACV,cAAcH;AAAA,QACd,WAAWhC,EAAE,eAAe,EAAE,YAAA;AAAA,MAAY;AAAA,IAAA,GAE9C;AAAA,KAIA,MAAM;AACN,YAAMqI,IAAQpE,EAAA;AACd,aAAOoE,IACL,gBAAA7D;AAAA,QAAC8D;AAAA,QAAA;AAAA,UACC,QAAQ,CAAC,CAAC3G;AAAA,UACV,OAAO0G,EAAM;AAAA,UACb,SAASA,EAAM;AAAA,UACf,cAAcA,EAAM;AAAA,UACpB,SAASA,EAAM;AAAA,UACf,SAAS,CAAC,CAAC5G;AAAA,UACX,WAAWkC;AAAA,UACX,UAAU,MAAM/B,EAAiB,IAAI;AAAA,QAAA;AAAA,MAAA,IAErC;AAAA,IACN,GAAA;AAAA,EAAG,GACL;AAEJ;ACx2BO,SAAS2G,GAAgBC,GAAqD;AACnF,QAAM,EAAE,GAAAxI,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAE1C,CAACuD,GAAQiF,CAAS,IAAIlJ,EAAiC,IAAI,GAC3D,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAEhD,CAACmJ,GAAoBC,CAAqB,IAAIpJ,EAAS,EAAK,GAC5D,CAACqJ,GAAUC,CAAW,IAAItJ,EAAS,EAAE,GACrC,CAACuJ,GAAiBC,CAAkB,IAAIxJ,EAAS,EAAE,GACnD,CAACyJ,GAAmBC,CAAoB,IAAI1J,EAAS,EAAK,GAE1D2J,IAAapG,EAAY,YAAY;AACzC,QAAK0F;AACL,UAAI;AACF,QAAAlG,EAAS,IAAI;AACb,cAAM6G,IAAO,MAAMnG,EAAS,QAAQ,QAAQwF,CAAQ;AACpD,QAAAC,EAAUU,CAAI;AAAA,MAChB,SAASlG,GAAK;AACZ,gBAAQ,MAAM,0BAA0BA,CAAG,GAC3CX,EAAStC,EAAE,iCAAiC,CAAC;AAAA,MAC/C,UAAA;AACE,QAAAmB,EAAW,EAAK;AAAA,MAClB;AAAA,EACF,GAAG,CAACqH,GAAUxI,CAAC,CAAC,GAEVoJ,IAAsBtG,EAAY,MAAM;AAC5C,IAAKU,MACLqF,EAAYrF,EAAO,IAAI,GACvBuF,EAAmBvF,EAAO,eAAe,EAAE,GAC3CmF,EAAsB,EAAI;AAAA,EAC5B,GAAG,CAACnF,CAAM,CAAC,GAEL6F,IAAuBvG,EAAY,MAAM;AAC7C,IAAA6F,EAAsB,EAAK,GAC3BE,EAAY,EAAE,GACdE,EAAmB,EAAE;AAAA,EACvB,GAAG,CAAA,CAAE,GAECO,IAAwBxG,EAAY,YAAY;AACpD,QAAKU,GACL;AAAA,MAAAyF,EAAqB,EAAI;AACzB,UAAI;AACF,cAAMjG,EAAS,QAAQ,OAAOQ,EAAO,IAAI;AAAA,UACvC,MAAMoF;AAAA,UACN,aAAaE,KAAmB;AAAA,QAAA,CACjC,GACD,MAAMI,EAAA,GACNG,EAAA;AAAA,MACF,SAASpG,GAAK;AACZ,gBAAQ,MAAM,4BAA4BA,CAAG;AAAA,MAC/C,UAAA;AACE,QAAAgG,EAAqB,EAAK;AAAA,MAC5B;AAAA;AAAA,EACF,GAAG,CAACzF,GAAQoF,GAAUE,GAAiBI,GAAYG,CAAoB,CAAC;AAExE,SAAO;AAAA,IACL,QAAA7F;AAAA,IACA,WAAAiF;AAAA,IACA,SAAAvH;AAAA,IACA,YAAAC;AAAA,IACA,OAAAkB;AAAA,IACA,UAAAC;AAAA,IACA,YAAA4G;AAAA,IACA,oBAAAR;AAAA,IACA,uBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,uBAAAK;AAAA,IACA,qBAAAF;AAAA,IACA,sBAAAC;AAAA,EAAA;AAEJ;AC3DO,SAASE,GAAiBf,GAAsD;AACrF,QAAM,CAACgB,GAASC,CAAU,IAAIlK,EAAmC,IAAI,GAC/D,CAACmK,GAAgBC,CAAiB,IAAIpK,EAAS,EAAK,GAEpD,CAACqK,GAAcC,CAAe,IAAItK,EAAS,EAAK,GAChD,CAACuK,GAAgBC,CAAiB,IAAIxK,EAAwB,CAAA,CAAE,GAChE,CAACyK,GAAcC,CAAe,IAAI1K,EAAS,EAAK,GAChD,CAAC2K,GAAgBC,CAAiB,IAAI5K,EAAS,EAAE,GACjD,CAAC6K,GAAgBC,CAAiB,IAAI9K,EAAwB,IAAI,GAClE,CAAC+K,GAAqBC,CAAsB,IAAIhL,EAAS,EAAK,GAE9D,CAACiL,GAAwBC,CAAyB,IAAIlL,EAAiC,IAAI,GAC3F,CAACmL,GAAgBC,CAAiB,IAAIpL,EAAwB,CAAA,CAAE,GAChE,CAACqL,GAAiBC,CAAkB,IAAItL,EAAmB,CAAA,CAAE,GAC7D,CAACuL,GAAcC,CAAe,IAAIxL,EAAS,EAAK,GAChD,CAACyL,GAAaC,CAAc,IAAI1L,EAAS,EAAK,GAE9C2L,IAAcpI,EAAY,YAAY;AAC1C,QAAK0F,GACL;AAAA,MAAAmB,EAAkB,EAAI;AACtB,UAAI;AACF,cAAMR,IAAO,MAAMnG,EAAS,QAAQ,WAAWwF,CAAQ;AACvD,QAAAiB,EAAWN,CAAI;AAAA,MACjB,SAASlG,GAAK;AACZ,gBAAQ,MAAM,2BAA2BA,CAAG;AAAA,MAC9C,UAAA;AACE,QAAA0G,EAAkB,EAAK;AAAA,MACzB;AAAA;AAAA,EACF,GAAG,CAACnB,CAAQ,CAAC,GAEP2C,IAAqBrI,EAAY,YAAY;AACjD,IAAAmH,EAAgB,EAAI;AACpB,QAAI;AACF,YAAMlH,IAAS,MAAMC,EAAS,MAAM,OAAO,EAAE,UAAU,IAAI,GACrDoI,IAAgB,IAAI,KAAK5B,KAAW,CAAA,GAAI,IAAI,CAAA6B,MAAKA,EAAE,MAAM,CAAC;AAChE,MAAAtB,EAAkBhH,EAAO,MAAM,OAAO,CAAAuI,MAAK,CAACF,EAAc,IAAIE,EAAE,EAAE,CAAC,CAAC;AAAA,IACtE,SAASrI,GAAK;AACZ,cAAQ,MAAM,yBAAyBA,CAAG;AAAA,IAC5C,UAAA;AACE,MAAAgH,EAAgB,EAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAACT,CAAO,CAAC,GAEN+B,IAAkBzI,EAAY,YAAY;AAC9C,QAAI,GAAC0F,KAAY,CAAC4B,IAClB;AAAA,MAAAG,EAAuB,EAAI;AAC3B,UAAI;AACF,cAAMvH,EAAS,QAAQ,UAAUwF,GAAU,EAAE,QAAQ4B,GAAgB,GACrE,MAAMc,EAAA,GACNrB,EAAgB,EAAK,GACrBQ,EAAkB,IAAI,GACtBF,EAAkB,EAAE;AAAA,MACtB,SAASlH,GAAK;AACZ,gBAAQ,MAAM,yBAAyBA,CAAG;AAAA,MAC5C,UAAA;AACE,QAAAsH,EAAuB,EAAK;AAAA,MAC9B;AAAA;AAAA,EACF,GAAG,CAAC/B,GAAU4B,GAAgBc,CAAW,CAAC,GAEpCM,KAAqB1I,EAAY,OAAO2I,MAAmB;AAC/D,QAAKjD;AACL,UAAI;AACF,cAAMxF,EAAS,QAAQ,aAAawF,GAAUiD,CAAM,GACpD,MAAMP,EAAA;AAAA,MACR,SAASjI,GAAK;AACZ,gBAAQ,MAAM,4BAA4BA,CAAG;AAAA,MAC/C;AAAA,EACF,GAAG,CAACuF,GAAU0C,CAAW,CAAC,GAEpBQ,KAAqB5I,EAAY,YAAY;AACjD,IAAAiI,EAAgB,EAAI;AACpB,QAAI;AACF,YAAM5B,IAAO,MAAMnG,EAAS,MAAM,cAAA;AAClC,MAAA2H,EAAkBxB,CAAI;AAAA,IACxB,SAASlG,GAAK;AACZ,cAAQ,MAAM,yBAAyBA,CAAG;AAAA,IAC5C,UAAA;AACE,MAAA8H,EAAgB,EAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAA,CAAE,GAECY,IAAgB7I,EAAY,OAAO8I,MAA4B;AACnE,IAAAnB,EAA0BmB,CAAM,GAChCf,EAAmBe,EAAO,MAAM,IAAI,CAAAC,MAAKA,EAAE,MAAM,CAAC,GAC9CnB,EAAe,WAAW,KAC5B,MAAMgB,GAAA;AAAA,EAEV,GAAG,CAAChB,EAAe,QAAQgB,EAAkB,CAAC,GAExCI,IAAiBhJ,EAAY,MAAM;AACvC,IAAA2H,EAA0B,IAAI,GAC9BI,EAAmB,CAAA,CAAE;AAAA,EACvB,GAAG,CAAA,CAAE,GAECkB,KAAmBjJ,EAAY,CAACkJ,MAAmB;AACvD,IAAAnB;AAAA,MAAmB,CAAAvH,MACjBA,EAAK,SAAS0I,CAAM,IAChB1I,EAAK,OAAO,CAAA2I,MAAMA,MAAOD,CAAM,IAC/B,CAAC,GAAG1I,GAAM0I,CAAM;AAAA,IAAA;AAAA,EAExB,GAAG,CAAA,CAAE,GAECE,IAAkBpJ,EAAY,YAAY;AAC9C,QAAI,GAAC0F,KAAY,CAACgC,IAClB;AAAA,MAAAS,EAAe,EAAI;AACnB,UAAI;AACF,cAAMjI,EAAS,QAAQ,kBAAkBwF,GAAUgC,EAAuB,QAAQI,CAAe,GACjG,MAAMM,EAAA,GACNY,EAAA;AAAA,MACF,SAAS7I,GAAK;AACZ,gBAAQ,MAAM,yBAAyBA,CAAG;AAAA,MAC5C,UAAA;AACE,QAAAgI,EAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAAG,CAACzC,GAAUgC,GAAwBI,GAAiBM,GAAaY,CAAc,CAAC;AAEnF,SAAO;AAAA,IACL,SAAAtC;AAAA,IACA,YAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,2BAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAI;AAAA,IACA,oBAAAC;AAAA,IACA,eAAAG;AAAA,IACA,gBAAAG;AAAA,IACA,iBAAAI;AAAA,IACA,kBAAAH;AAAA,EAAA;AAEJ;ACpKO,SAASI,GAAgB3D,GAAqD;AACnF,QAAM,EAAE,GAAAxI,EAAA,IAAMC,GAAe,OAAO,GAE9B,CAACmM,GAAQC,CAAS,IAAI9M,EAAkC,IAAI,GAC5D,CAAC+M,GAAeC,CAAgB,IAAIhN,EAAS,EAAK,GAElD,CAACiN,GAAaC,CAAc,IAAIlN,EAAS,EAAK,GAC9C,CAACmN,GAA0BC,CAA2B,IAAIpN,EAA8B,CAAA,CAAE,GAC1F,CAACqN,GAAwBC,CAAyB,IAAItN,EAAS,EAAK,GACpE,CAACuN,GAAkBC,CAAmB,IAAIxN,EAAmB,CAAA,CAAE,GAC/D,CAACyN,GAAiBC,CAAkB,IAAI1N,EAAS,EAAK,GACtD,CAAC2N,GAAiBC,CAAkB,IAAI5N,EAAS,EAAE,GACnD,CAAC6N,GAAiBC,CAAkB,IAAI9N,EAAwB,IAAI,GAEpE+N,IAAaxK,EAAY,YAAY;AACzC,QAAK0F,GACL;AAAA,MAAA+D,EAAiB,EAAI;AACrB,UAAI;AACF,cAAMpD,IAAO,MAAMnG,EAAS,QAAQ,UAAUwF,CAAQ;AACtD,QAAA6D,EAAU,MAAM,QAAQlD,CAAI,IAAIA,IAAO,CAAA,CAAE;AAAA,MAC3C,SAASlG,GAAK;AACZ,gBAAQ,MAAM,0BAA0BA,CAAG,GAC3CoJ,EAAU,CAAA,CAAE;AAAA,MACd,UAAA;AACE,QAAAE,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAAG,CAAC/D,CAAQ,CAAC,GAEP+E,IAAsBzK,EAAY,YAAY;AAClD,QAAK0F,GACL;AAAA,MAAAqE,EAA0B,EAAI;AAC9B,UAAI;AACF,cAAM1D,IAAO,MAAMnG,EAAS,QAAQ,mBAAmBwF,CAAQ;AAC/D,QAAAmE,EAA4BxD,CAAI;AAAA,MAClC,SAASlG,GAAK;AACZ,gBAAQ,MAAM,oCAAoCA,CAAG,GACrD0J,EAA4B,CAAA,CAAE;AAAA,MAChC,UAAA;AACE,QAAAE,EAA0B,EAAK;AAAA,MACjC;AAAA;AAAA,EACF,GAAG,CAACrE,CAAQ,CAAC,GAEPgF,IAAqB1K,EAAY,YAAY;AACjD,QAAI,CAAC0F,KAAYsE,EAAiB,WAAW,EAAG;AAChD,IAAAG,EAAmB,EAAI;AACvB,UAAMQ,IAAsB,CAAA,GACtBC,IAAmB,CAAA;AAEzB,eAAWC,KAAWb;AACpB,UAAI;AACF,cAAM9J,EAAS,QAAQ,iBAAiBwF,GAAUmF,CAAO,GACzDF,EAAU,KAAKE,CAAO;AAAA,MACxB,SAAS1K,GAAK;AACZ,gBAAQ,MAAM,uBAAuB0K,CAAO,KAAK1K,CAAG,GACpDyK,EAAO,KAAKC,CAAO;AAAA,MACrB;AAGF,UAAML,EAAA,GAEFI,EAAO,WAAW,KACpBjB,EAAe,EAAK,GACpBM,EAAoB,CAAA,CAAE,KACbU,EAAU,WAAW,KAG9BV,EAAoBW,CAAM,GAG5BT,EAAmB,EAAK;AAAA,EAC1B,GAAG,CAACzE,GAAUsE,GAAkBQ,GAAYtN,CAAC,CAAC,GAExC4N,IAAoB9K,EAAY,OAAO6K,MAAoB;AAC/D,QAAKnF,GACL;AAAA,MAAA6E,EAAmBM,CAAO;AAC1B,UAAI;AACF,cAAM3K,EAAS,QAAQ,sBAAsBwF,GAAUmF,CAAO,GAC9D,MAAML,EAAA;AAAA,MACR,SAASrK,GAAc;AACrB,gBAAQ,MAAM,2BAA2BA,CAAG;AAAA,MAC9C,UAAA;AACE,QAAAoK,EAAmB,IAAI;AAAA,MACzB;AAAA;AAAA,EACF,GAAG,CAAC7E,GAAU8E,CAAU,CAAC;AAEzB,SAAO;AAAA,IACL,QAAAlB;AAAA,IACA,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,0BAAAC;AAAA,IACA,6BAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,2BAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,mBAAAI;AAAA,EAAA;AAEJ;ACrIA,MAAMC,KAAyB,CAACC,GAAwBC,MAAqC;AAC3F,MAAID,EAAO,OAAOC,EAAU,QAAOD;AACnC,QAAME,IAAgB,CAACF,EAAO;AAC9B,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,YAAYE;AAAA,IACZ,UAAUF,EAAO,SAAS,IAAI,CAAAG,OAAM,EAAE,GAAGA,GAAG,YAAYD,IAAgB;AAAA,EAAA;AAE5E,GAEME,KAA0B,CAACJ,GAAwBC,GAAkBI,MAAsC;AAC/G,MAAIL,EAAO,OAAOC,EAAU,QAAOD;AACnC,QAAMM,IAAcN,EAAO,SAAS;AAAA,IAAI,CAAAG,MACtCA,EAAE,OAAOE,IAAY,EAAE,GAAGF,GAAG,YAAY,CAACA,EAAE,eAAeA;AAAA,EAAA,GAEvDI,IAAqBD,EAAY,KAAK,CAAAH,MAAKA,EAAE,UAAU;AAC7D,SAAO;AAAA,IACL,GAAGH;AAAA,IACH,YAAYO;AAAA,IACZ,UAAUD;AAAA,EAAA;AAEd,GAEME,KAAoB,CAACR,OAA4C;AAAA,EACrE,GAAGA;AAAA,EACH,YAAY;AAAA,EACZ,UAAUA,EAAO,SAAS,IAAI,CAAA,OAAM,EAAE,GAAG,GAAG,YAAY,KAAO;AACjE,IAEMS,KAAmB,CAACT,OAA4C;AAAA,EACpE,GAAGA;AAAA,EACH,YAAY;AAAA,EACZ,UAAUA,EAAO,SAAS,IAAI,CAAA,OAAM,EAAE,GAAG,GAAG,YAAY,KAAQ;AAClE;AAiFO,SAASU,GAAsBhG,GAA8BiG,GAAqE;AACvI,QAAM,CAACC,GAAcC,CAAe,IAAIpP,EAAwC,IAAI,GAC9E,CAACqP,GAAaC,CAAc,IAAItP,EAAS,EAAK,GAE9C,CAACuP,GAAmBC,CAAoB,IAAIxP,EAAS,EAAK,GAC1D,CAACyP,GAAeC,CAAgB,IAAI1P,EAAoC,CAAA,CAAE,GAC1E,CAAC2P,GAAsBC,CAAuB,IAAI5P,EAAS,EAAK,GAChE,CAAC6P,GAAgBC,CAAiB,IAAI9P,EAAmB,CAAA,CAAE,GAC3D,CAAC+P,GAAeC,CAAgB,IAAIhQ,EAAS,EAAK,GAClD,CAACiQ,GAAeC,CAAgB,IAAIlQ,EAAS,EAAE,GAC/C,CAACmQ,GAAoBC,CAAqB,IAAIpQ,EAAwB,IAAI,GAE1E,CAACqQ,GAAqBC,CAAsB,IAAItQ,EAAiC,YAAY,GAC7F,CAACuQ,GAAgBC,CAAiB,IAAIxQ,EAAyB,MAAM,GACrE,CAACyQ,GAAaC,CAAc,IAAI1Q,EAA2B,CAAA,CAAE,GAC7D,CAAC2Q,GAAqBC,CAAsB,IAAI5Q,EAAsB,oBAAI,KAAK,GAC/E,CAAC6Q,GAAoBC,CAAqB,IAAI9Q,EAAS,EAAK,GAE5D,CAAC+Q,IAAqBC,EAAsB,IAAIhR,EAAS,EAAK,GAC9D,CAACiR,GAAgBC,CAAiB,IAAIlR,EAAsC,IAAI,GAEhFmR,KAAmB5N,EAAY,YAAY;AAC/C,QAAK0F,GACL;AAAA,MAAAqG,EAAe,EAAI;AACnB,UAAI;AACF,cAAM1F,IAAO,MAAMnG,EAAS,QAAQ,gBAAgBwF,CAAQ;AAC5D,QAAAmG,EAAgB,MAAM,QAAQxF,CAAI,IAAIA,IAAO,CAAA,CAAE;AAAA,MACjD,SAASlG,GAAK;AACZ,gBAAQ,MAAM,gCAAgCA,CAAG,GACjD0L,EAAgB,CAAA,CAAE;AAAA,MACpB,UAAA;AACE,QAAAE,EAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAAG,CAACrG,CAAQ,CAAC,GAEPmI,IAAoB7N,EAAY,YAAY;AAChD,QAAK0F,GACL;AAAA,MAAAuG,EAAqB,EAAI,GACzBM,EAAkB,CAAA,CAAE,GACpBF,EAAwB,EAAI,GAC5BQ,EAAsB,IAAI;AAC1B,UAAI;AACF,cAAMiB,IAAsB,MAAM5N,EAAS,QAAQ,yBAAyBwF,CAAQ;AACpF,QAAAyG,EAAiB2B,EAAoB,OAAO,CAAAC,MAAK,CAACA,EAAE,UAAU,CAAC;AAAA,MACjE,SAAS5N,GAAK;AACZ,gBAAQ,MAAM,0CAA0CA,CAAG;AAC3D,cAAM6N,IAAc7N,aAAe,SAASA,EAAI,SAAS;AACzD,QAAA0M,EAAsBmB,IAAc,cAAc,SAAS;AAAA,MAC7D,UAAA;AACE,QAAA3B,EAAwB,EAAK;AAAA,MAC/B;AAAA;AAAA,EACF,GAAG,CAAC3G,CAAQ,CAAC,GAEPuI,IAAsBjO,EAAY,MAAM;AAC5C,IAAAiM,EAAqB,EAAK,GAC1BM,EAAkB,CAAA,CAAE,GACpBI,EAAiB,EAAE,GACnBI,EAAuB,YAAY,GACnCE,EAAkB,MAAM,GACxBE,EAAe,CAAA,CAAE,GACjBE,EAAuB,oBAAI,KAAK;AAAA,EAClC,GAAG,CAAA,CAAE,GAECa,IAA2BlO,EAAY,YAAY;AACvD,QAAI,GAAC0F,KAAY4G,EAAe,WAAW,IAC3C;AAAA,MAAAG,EAAiB,EAAI;AACrB,UAAI;AACF,cAAM0B,IAAU;AAAA,UACd,gBAAgB7B;AAAA,UAChB,aAAaQ;AAAA,UACb,YAAYE;AAAA,UACZ,WAAWA,MAAmB,WAAWE,EAAY,OAAO,CAAA3E,MAAKA,EAAE,UAAU,EAAE,IAAI,CAAAA,MAAKA,EAAE,EAAE,IAAI;AAAA,UAChG,YAAYyE,MAAmB,WAAWE,EAAY,QAAQ,CAAA3E,MAAKA,EAAE,SAAS,OAAO,CAAA4C,OAAKA,GAAE,UAAU,EAAE,IAAI,QAAKA,GAAE,EAAE,CAAC,IAAI;AAAA,QAAA;AAG5H,cAAMjL,EAAS,QAAQ,uBAAuBwF,GAAUyI,CAAO,GAE/D,MAAMP,GAAA,GACNK,EAAA,GACAtC,GAAS,wBAAA;AAAA,MACX,SAASxL,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG;AAAA,MACrD,UAAA;AACE,QAAAsM,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAAG,CAAC/G,GAAU4G,GAAgBQ,GAAqBE,GAAgBE,GAAaU,IAAkBK,GAAqBtC,CAAO,CAAC,GAEzHyC,IAA0BpO,EAAY,OAAOqO,MAAkB;AACnE,QAAK3I;AACL,UAAI;AACF,cAAMxF,EAAS,QAAQ,kBAAkBwF,GAAU2I,CAAK,GACxD,MAAMT,GAAA,GACNjC,GAAS,wBAAA;AAAA,MACX,SAASxL,GAAK;AACZ,gBAAQ,MAAM,iCAAiCA,CAAG;AAAA,MACpD;AAAA,EACF,GAAG,CAACuF,GAAUkI,IAAkBjC,CAAO,CAAC,GAElC2C,IAA0BtO,EAAY,OAAOqO,GAAeE,MAAwC;AACxG,QAAK7I;AACL,UAAI;AACF,cAAMxF,EAAS,QAAQ,6BAA6BwF,GAAU2I,GAAOE,CAAW,GAChF,MAAMX,GAAA,GACNjC,GAAS,wBAAA;AAAA,MACX,SAASxL,IAAK;AACZ,gBAAQ,MAAM,kCAAkCA,EAAG;AAAA,MACrD;AAAA,EACF,GAAG,CAACuF,GAAUkI,IAAkBjC,CAAO,CAAC,GAElC6C,IAAsBxO,EAAY,CAACyO,MAA8B;AACrE,IAAAd,EAAkBc,CAAG,GACrBhB,GAAuB,EAAI;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECiB,IAAuB1O,EAAY,MAAM;AAC7C,IAAAyN,GAAuB,EAAK,GAC5BE,EAAkB,IAAI;AAAA,EACxB,GAAG,CAAA,CAAE,GAECgB,IAAsB3O,EAAY,OAAOqO,GAAeF,MAAkC;AAC9F,QAAKzI;AACL,UAAI;AACF,cAAMxF,EAAS,QAAQ,cAAcwF,GAAU2I,GAAOF,CAAO,GAC7D,MAAMP,GAAA,GACNjC,GAAS,wBAAA;AAAA,MACX,SAASxL,IAAK;AACZ,sBAAQ,MAAM,6BAA6BA,EAAG,GACxCA;AAAA,MACR;AAAA,EACF,GAAG,CAACuF,GAAUkI,IAAkBjC,CAAO,CAAC,GAElCiD,KAAuB5O,EAAY,OAAOqO,MAAkB;AAChE,QAAK3I;AACL,UAAI;AAEF,cAAMxF,EAAS,QAAQ,cAAcwF,GAAU2I,GAAO,EAAE,SAAS,CAAA,GAAI,UAAU,CAAA,GAAI,GACnF,MAAMT,GAAA,GACNjC,GAAS,wBAAA;AAAA,MACX,SAASxL,GAAK;AACZ,sBAAQ,MAAM,8BAA8BA,CAAG,GACzCA;AAAA,MACR;AAAA,EACF,GAAG,CAACuF,GAAUkI,IAAkBjC,CAAO,CAAC,GAElCkD,KAAwB1S,GAAQ,MAAM;AAC1C,QAAI,CAACuQ,EAAe,QAAOR;AAE3B,UAAM4C,IAAcpC,EAAc,YAAA;AAClC,WAAOR,EAAc;AAAA,MAAO,CAAAuC,MAC1BA,EAAI,MAAM,YAAA,EAAc,SAASK,CAAW,KAC5CL,EAAI,KAAK,YAAA,EAAc,SAASK,CAAW;AAAA,IAAA;AAAA,EAE/C,GAAG,CAAC5C,GAAeQ,CAAa,CAAC,GAE3BqC,KAAkB/O,EAAY,CAACqO,MAAkB;AACrD,IAAA9B;AAAA,MAAkB,CAAA/L,MAChBA,EAAK,SAAS6N,CAAK,IACf7N,EAAK,OAAO,CAAA2I,OAAMA,OAAOkF,CAAK,IAC9B,CAAC,GAAG7N,GAAM6N,CAAK;AAAA,IAAA;AAAA,EAEvB,GAAG,CAAA,CAAE,GAECW,KAAwBhP,EAAY,MAAM;AAC9C,UAAMiP,IAAcJ,GAAsB,IAAI,CAAAJ,MAAOA,EAAI,EAAE;AAC3D,IAAAlC,EAAkB0C,CAAW;AAAA,EAC/B,GAAG,CAACJ,EAAqB,CAAC,GAEpBK,KAAoBlP,EAAY,MAAM;AAC1C,IAAAuM,EAAkB,CAAA,CAAE;AAAA,EACtB,GAAG,CAAA,CAAE,GAEC4C,KAAwBnP,EAAY,OAAOqO,MAAkB;AACjE,IAAAd,EAAsB,EAAI;AAC1B,QAAI;AACF,YAAM6B,IAAa,MAAMlP,EAAS,aAAa,WAAWmO,CAAK,GACzDgB,KAAgC,CAAA;AAEtC,iBAAWC,MAAaF,GAAY;AAElC,cAAMG,MADW,MAAMrP,EAAS,aAAa,kBAAkBmO,GAAOiB,GAAU,EAAE,GACjC,IAAI,CAAAE,QAAY;AAAA,UAC/D,IAAIA,GAAQ;AAAA,UACZ,OAAOA,GAAQ;AAAA,UACf,MAAMA,GAAQ;AAAA,UACd,MAAMA,GAAQ;AAAA,UACd,YAAY;AAAA,QAAA,EACZ;AAEF,QAAAH,GAAY,KAAK;AAAA,UACf,IAAIC,GAAU;AAAA,UACd,OAAOA,GAAU;AAAA,UACjB,MAAMA,GAAU;AAAA,UAChB,MAAMA,GAAU;AAAA,UAChB,YAAY;AAAA,UACZ,UAAUC;AAAA,QAAA,CACX;AAAA,MACH;AAEA,MAAApC,EAAekC,EAAW;AAAA,IAC5B,SAASlP,GAAK;AACZ,cAAQ,MAAM,2BAA2BA,CAAG;AAAA,IAC9C,UAAA;AACE,MAAAoN,EAAsB,EAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAA,CAAE,GAECkC,IAAyBzP,EAAY,CAACiL,MAAqB;AAC/D,IAAAoC,EAAuB,CAAA7M,MAAQ;AAC7B,YAAMkP,KAAS,IAAI,IAAIlP,CAAI;AAC3B,aAAIkP,GAAO,IAAIzE,CAAQ,IACrByE,GAAO,OAAOzE,CAAQ,IAEtByE,GAAO,IAAIzE,CAAQ,GAEdyE;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,KAAmB3P,EAAY,CAACiL,MAAqB;AACzD,IAAAkC,EAAe,CAAA3M,MAAQA,EAAK,IAAI,CAAA+H,OAAKwC,GAAuBxC,IAAG0C,CAAQ,CAAC,CAAC;AAAA,EAC3E,GAAG,CAAA,CAAE,GAEC2E,KAAoB5P,EAAY,CAACiL,GAAkBI,MAAsB;AAC7E,IAAA8B,EAAe,CAAA3M,OAAQA,GAAK,IAAI,CAAA+H,OAAK6C,GAAwB7C,IAAG0C,GAAUI,CAAS,CAAC,CAAC;AAAA,EACvF,GAAG,CAAA,CAAE,GAECwE,IAA0B7P,EAAY,CAACgL,MAAsE;AACjH,QAAIA,EAAO,SAAS,WAAW;AAC7B,aAAOA,EAAO,aAAa,YAAY;AAEzC,UAAM8E,IAAgB9E,EAAO,SAAS,OAAO,CAAAG,OAAKA,GAAE,UAAU,EAAE;AAChE,WAAI2E,MAAkB,IAAU,cAC5BA,MAAkB9E,EAAO,SAAS,SAAe,YAC9C;AAAA,EACT,GAAG,CAAA,CAAE,GAEC+E,IAAe/P,EAAY,MAAM;AACrC,UAAMgQ,IAAe9C,EAAY,QAC3B+C,IAAkB/C,EAAY,OAAO,CAAA3E,OAAKA,GAAE,cAAcA,GAAE,SAAS,KAAK,CAAA4C,OAAKA,GAAE,UAAU,CAAC,EAAE,QAC9F+E,KAAgBhD,EAAY,OAAO,CAAC7L,IAAKkH,OAAMlH,KAAMkH,GAAE,SAAS,QAAQ,CAAC,GACzE4H,KAAmBjD,EAAY,OAAO,CAAC7L,IAAKkH,OAAMlH,KAAMkH,GAAE,SAAS,OAAO,CAAA4C,OAAKA,GAAE,UAAU,EAAE,QAAQ,CAAC;AAC5G,WAAO,EAAE,cAAA6E,GAAc,iBAAAC,GAAiB,eAAAC,IAAe,kBAAAC,GAAA;AAAA,EACzD,GAAG,CAACjD,CAAW,CAAC,GAEVkD,IAAuBpQ,EAAY,MAAM;AAC7C,IAAAmN,EAAe,OAAQ3M,EAAK,IAAI,OAAKgL,GAAkBjD,CAAC,CAAC,CAAC;AAAA,EAC5D,GAAG,CAAA,CAAE,GAEC8H,KAAmBrQ,EAAY,MAAM;AACzC,IAAAmN,EAAe,OAAQ3M,EAAK,IAAI,OAAKiL,GAAiBlD,CAAC,CAAC,CAAC;AAAA,EAC3D,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,cAAAqD;AAAA,IACA,iBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAG;AAAA,IACA,wBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,oBAAAhB;AAAA,IACA,mBAAAiB;AAAA,IACA,0BAAAK;AAAA,IACA,yBAAAE;AAAA,IACA,yBAAAE;AAAA,IACA,qBAAAE;AAAA,IACA,sBAAAE;AAAA,IACA,uBAAAG;AAAA,IACA,iBAAAE;AAAA,IACA,uBAAAC;AAAA,IACA,mBAAAE;AAAA,IACA,uBAAAC;AAAA,IACA,wBAAAM;AAAA,IACA,kBAAAE;AAAA,IACA,mBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,cAAAE;AAAA,IACA,sBAAAK;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAA1B;AAAA,IACA,sBAAAC;AAAA,EAAA;AAEJ;AC9XA,MAAM0B,KAAsI;AAAA,EAC1I,IAAI,EAAE,OAAO,CAAC,SAAS,OAAO,GAA+B,aAAa,SAAmC,SAAS,SAAA;AAAA,EACtH,IAAI,EAAE,OAAO,CAAC,SAAS,GAA+B,aAAa,WAAqC,SAAS,cAAA;AAAA,EACjH,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,GAA+B,aAAa,OAAiC,SAAS,UAAA;AAAA,EAChH,IAAI,EAAE,OAAO,CAAC,SAAS,GAA+B,aAAa,WAAqC,SAAS,UAAA;AAAA,EACjH,IAAI,EAAE,OAAO,CAAC,KAAK,GAA+B,aAAa,OAAiC,SAAS,cAAA;AAAA,EACzG,IAAI,EAAE,OAAO,CAAC,KAAK,GAA+B,aAAa,OAAiC,SAAS,QAAA;AAAA,EACzG,IAAI,EAAE,OAAO,CAAC,YAAY,GAA+B,aAAa,cAAwC,SAAS,QAAA;AAAA,EACvH,IAAI,EAAE,OAAO,CAAC,KAAK,GAA+B,aAAa,OAAiC,SAAS,iBAAA;AAC3G,GAEMC,KAA8C;AAAA,EAClD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;AAEO,SAASC,GAAsB9K,GAA2D;AAC/F,QAAM,EAAE,GAAAxI,EAAA,IAAMC,GAAe,OAAO,GAE9B,CAACsT,GAAkBC,CAAmB,IAAIjU,EAAS,EAAK,GACxD,CAACkU,GAAeC,CAAgB,IAAInU,EAAoC,CAAA,CAAE,GAC1E,CAACoU,GAAaC,CAAc,IAAIrU,EAAS,EAAK,GAC9C,CAACsU,GAAeC,CAAgB,IAAIvU,EAAwB,IAAI,GAChE,CAACwU,GAAYC,CAAa,IAAIzU,EAAS,EAAK,GAC5C,CAAC0U,GAAeC,CAAgB,IAAI3U,EAAS,EAAE,GAE/C,CAAC4U,GAAmBC,CAAoB,IAAI7U,EAAS,EAAK,GAC1D,CAAC8U,GAAaC,CAAc,IAAI/U,EAAS,EAAK,GAC9C,CAACgV,GAAYC,CAAa,IAAIjV,EAAoC8T,EAAgB,GAElF,CAACoB,GAAeC,CAAgB,IAAInV,EAAS,EAAK,GAClD,CAACoV,GAAaC,CAAc,IAAIrV,EAAwB,IAAI,GAC5D,CAACsV,GAAeC,CAAgB,IAAIvV,EAAS,EAAK,GAElDwV,IAAoBjS,EAAY,OAAOkS,MAAoB;AAC/D,IAAApB,EAAe,EAAI;AACnB,QAAI;AACF,YAAMqB,IAAW,MAAMjS,EAAS,cAAc,aAAagS,CAAM,GAC3D7L,IAAO,MAAM,QAAQ8L,CAAQ,IAAIA,IAAYA,EAAmD,SAAS,CAAA;AAC/G,MAAAvB,EAAiBvK,CAAI;AAAA,IACvB,SAASlG,GAAK;AACZ,cAAQ,MAAM,2CAA2CA,CAAG,GAC5DyQ,EAAiB,CAAA,CAAE;AAAA,IACrB,UAAA;AACE,MAAAE,EAAe,EAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAA,CAAE,GAECsB,IAAmBpS,EAAY,MAAM;AACzC,IAAA0Q,EAAoB,EAAI,GACxBM,EAAiB,IAAI,GACrBI,EAAiB,EAAE,GACnBa,EAAA;AAAA,EACF,GAAG,CAACA,CAAiB,CAAC,GAEhBI,IAAoBrS,EAAY,MAAM;AAC1C,IAAA0Q,EAAoB,EAAK,GACzBM,EAAiB,IAAI,GACrBI,EAAiB,EAAE,GACnBE,EAAqB,EAAK,GAC1BI,EAAcnB,EAAgB,GAC9BqB,EAAiB,EAAK,GACtBE,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAAA,EACxB,GAAG,CAAA,CAAE,GAECM,IAAyBtS,EAAY,YAAY;AACrD,QAAI,GAAC0F,KAAY,CAACqL,IAClB;AAAA,MAAAG,EAAc,EAAI;AAClB,UAAI;AACF,cAAMhR,EAAS,QAAQ,iBAAiBwF,GAAUqL,CAAa,GAE/DsB,EAAA;AAAA,MACF,SAASlS,GAAK;AACZ,gBAAQ,MAAM,gCAAgCA,CAAG;AAAA,MACnD,UAAA;AACE,QAAA+Q,EAAc,EAAK;AAAA,MACrB;AAAA;AAAA,EACF,GAAG,CAACxL,GAAUqL,GAAesB,CAAiB,CAAC,GAEzCE,KAA2BvS,EAAY,YAAY;AACvD,QAAK0F,GACL;AAAA,MAAAwL,EAAc,EAAI;AAClB,UAAI;AACF,cAAMhR,EAAS,QAAQ,mBAAmBwF,CAAQ;AAAA,MAEpD,SAASvF,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG;AAAA,MACrD,UAAA;AACE,QAAA+Q,EAAc,EAAK;AAAA,MACrB;AAAA;AAAA,EACF,GAAG,CAACxL,CAAQ,CAAC,GAEP8M,KAAkCxS,EAAY,YAAY;AAC9D,QAAK0F,KACD,GAAC+L,EAAW,QAAQ,CAACA,EAAW,sBAAsB,CAACA,EAAW,QAAQ,UAAU,CAACA,EAAW,QAAQ,QAAQ,CAACA,EAAW,QAAQ,aAGxI;AAAA,MAAAD,EAAe,EAAI;AACnB,UAAI;AACF,cAAMiB,IAAa,MAAMvS,EAAS,cAAc,OAAOuR,CAAU;AACjE,cAAMvR,EAAS,QAAQ,iBAAiBwF,GAAU+M,EAAW,EAAE,GAE/DJ,EAAA;AAAA,MACF,SAASlS,GAAK;AACZ,gBAAQ,MAAM,2CAA2CA,CAAG;AAAA,MAC9D,UAAA;AACE,QAAAqR,EAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAAG,CAAC9L,GAAU+L,GAAYY,CAAiB,CAAC,GAEtCK,IAAkB1S,EAAY,CAACtE,MAA0B;AAC7D,UAAMiX,IAAUjX,EAAM,YAAA,EAAc,QAAQ,cAAc,EAAE;AAC5D,QAAIkX,IAASD,EAAQ,WAAW,KAAK,IAAIA,EAAQ,MAAM,CAAC,IAAIA,EAAQ,QAAQ,WAAW,EAAE;AAGzF,WAFAC,IAASA,EAAO,MAAM,GAAG,CAAC,GAEtBA,EAAO,WAAW,IAAU,SAC5BA,EAAO,UAAU,IAAU,OAAOA,CAAM,KACxCA,EAAO,UAAU,IAAU,OAAOA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,CAAC,CAAC,KACpE,OAAOA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,CAAC,CAAC;AAAA,EAC3E,GAAG,CAAA,CAAE,GAECC,IAAyB7S,EAAY,CAACtE,MAAkB;AAC5D,IAAI+V,EAAW,gBAAgB,OAC7BC,EAAc,CAAAlR,OAAS,EAAE,GAAGA,GAAM,oBAAoBkS,EAAgBhX,CAAK,IAAI,IAE/EgW,EAAc,QAAS,EAAE,GAAGlR,GAAM,oBAAoB9E,IAAQ,GAEhEoW,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAAA,EACxB,GAAG,CAACP,EAAW,aAAaiB,CAAe,CAAC,GAEtCI,KAAoB9S,EAAY,YAAY;AAChD,UAAM+S,IAAYtB,EAAW,mBAAmB,QAAQ,WAAW,EAAE;AACrE,QAAI,CAACA,EAAW,sBAAsBsB,EAAU,SAAS,KAAKtB,EAAW,gBAAgB,MAAM;AAC7F,MAAAK,EAAe5U,EAAE,uCAAuC,CAAC;AACzD;AAAA,IACF;AAEA,IAAA0U,EAAiB,EAAI,GACrBE,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAEtB,QAAI;AACF,YAAM/R,IAAS,MAAMC,EAAS,cAAc;AAAA,QAC1CuR,EAAW;AAAA,QACXA,EAAW;AAAA,MAAA;AAGb,MAAAC,EAAc,CAAAlR,OAAS;AAAA,QACrB,GAAGA;AAAA,QACH,MAAMP,EAAO,QAAQO,EAAK;AAAA,QAC1B,WAAWP,EAAO,aAAaO,EAAK;AAAA,QACpC,WAAWP,EAAO,aAAaO,EAAK;AAAA,QACpC,SAAS;AAAA,UACP,GAAGA,EAAK;AAAA,UACR,QAAQP,EAAO,UAAUO,EAAK,QAAQ;AAAA,UACtC,SAASP,EAAO,WAAWO,EAAK,QAAQ,WAAW;AAAA,UACnD,YAAYP,EAAO,cAAcO,EAAK,QAAQ;AAAA,UAC9C,MAAMP,EAAO,QAAQO,EAAK,QAAQ;AAAA,UAClC,OAAOP,EAAO,SAASO,EAAK,QAAQ;AAAA,UACpC,SAASP,EAAO,WAAWO,EAAK,QAAQ;AAAA,UACxC,aAAaP,EAAO,eAAeO,EAAK,QAAQ;AAAA,QAAA;AAAA,MAClD,EACA,GAEFwR,EAAiB,EAAI,GACrB,WAAW,MAAMA,EAAiB,EAAK,GAAG,GAAI;AAAA,IAChD,SAAS7R,GAAc;AACrB,cAAQ,MAAM,0BAA0BA,CAAG;AAC3C,YAAM6S,IAAe7S,aAAe,QAAQA,EAAI,UAAU;AAC1D,MAAI6S,EAAa,SAAS,KAAK,KAAKA,EAAa,SAAS,gBAAgB,KAAKA,EAAa,SAAS,qBAAqB,IACxHlB,EAAe5U,EAAE,+CAA+C,CAAC,IACxD8V,EAAa,SAAS,aAAa,KAAKA,EAAa,SAAS,KAAK,IAC5ElB,EAAe5U,EAAE,sCAAsC,CAAC,KAC/C8V,EAAa,SAAS,KAAK,KAAKA,EAAa,SAAS,WAAW,GAC1ElB,EAAe5U,EAAE,mCAAmC,CAAC;AAAA,IAIzD,UAAA;AACE,MAAA0U,EAAiB,EAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAACH,EAAW,oBAAoBA,EAAW,aAAavU,CAAC,CAAC,GAEvD+V,IAAsBjT,EAAY,CAACkT,MAAwB;AAC/D,UAAMC,IAAS7C,GAAyB4C,CAAW;AACnD,IAAIC,KACFzB,EAAc,CAAAlR,OAAS;AAAA,MACrB,GAAGA;AAAA,MACH,aAAA0S;AAAA,MACA,wBAAwBC,EAAO;AAAA,MAC/B,oBAAoBD,MAAgB,OAAO,SAAS;AAAA,MACpD,SAAS;AAAA,QACP,GAAG1S,EAAK;AAAA,QACR,aAAA0S;AAAA,QACA,SAASC,EAAO;AAAA,MAAA;AAAA,IAClB,EACA;AAAA,EAEN,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,kBAAA1C;AAAA,IACA,qBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,wBAAAK;AAAA,IACA,0BAAAC;AAAA,IACA,iCAAAC;AAAA,IACA,iBAAAE;AAAA,IACA,wBAAAG;AAAA,IACA,mBAAAC;AAAA,IACA,kBAAAV;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAY;AAAA,EAAA;AAEJ;AC5RO,SAASG,GAAe1N,GAAoD;AACjF,QAAM,CAAC2N,GAAOC,CAAQ,IAAI7W,EAAiC,IAAI,GACzD,CAACuL,GAAcC,CAAe,IAAIxL,EAAS,EAAK,GAChD,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAEhD8W,IAAYvT,EAAY,YAAY;AACxC,QAAK0F,GACL;AAAA,MAAAuC,EAAgB,EAAI,GACpBzI,EAAS,IAAI;AACb,UAAI;AACF,cAAM6G,IAAO,MAAMnG,EAAS,QAAQ,eAAewF,CAAQ;AAC3D,QAAA4N,EAASjN,CAAI;AAAA,MACf,SAASlG,GAAK;AACZ,gBAAQ,MAAM,gCAAgCA,CAAG,GACjDX,EAAS,sBAAsB;AAAA,MACjC,UAAA;AACE,QAAAyI,EAAgB,EAAK;AAAA,MACvB;AAAA;AAAA,EACF,GAAG,CAACvC,CAAQ,CAAC;AAEb,SAAO,EAAE,OAAA2N,GAAO,cAAArL,GAAc,OAAAzI,GAAO,WAAAgU,EAAA;AACvC;AC+BA,SAASC,GAAuB;AAAA,EAC9B,MAAAC;AAAA,EAAM,WAAAC;AAAA,EAAW,oBAAAC;AAAA,EAAoB,kBAAAC;AAAA,EAAkB,mBAAAC;AAAA,EACvD,kBAAAC;AAAA,EAAkB,SAAAC;AAAA,EAAS,UAAAC;AAAA,EAAU,kBAAAC;AAAA,EAAkB,GAAA/W;AACzD,GAAuB;AACrB,SAAKuW,sBAGF,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAA5Q,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAxE,EAAE,8BAA8B,GACnC;AAAA,0BACC,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,iCAAiC,EAAA,CACtC;AAAA,MAAA,GACF;AAAA,MACA,gBAAAwE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASqS;AAAA,UACT,WAAU;AAAA,UAEV,UAAA,gBAAArS,EAACwS,IAAA,EAAE,WAAU,sCAAA,CAAsC;AAAA,QAAA;AAAA,MAAA;AAAA,IACrD,GACF;AAAA,IAECN,uBACE,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAlS,EAACsB,GAAA,EAAQ,WAAU,oDAAA,CAAoD,EAAA,CACzE;AAAA,IAED,CAAC4Q,KAAoBF,EAAU,WAAW,uBACxC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAhS,EAAC,OAAE,WAAU,uCAAuC,UAAAxE,EAAE,uCAAuC,GAAE,GACjG;AAAA,IAED,CAAC0W,KAAoBF,EAAU,SAAS,KACvC,gBAAAhS,EAAC,OAAA,EAAI,WAAU,gDACZ,UAAAgS,EAAU,IAAI,CAAAS,MACb,gBAAAtR;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMiR,EAAiBK,EAAK,EAAE;AAAA,QACvC,WAAW,4DACTR,MAAuBQ,EAAK,KACxB,8DACA,2FACN;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAtR,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,kDAAkD,UAAAyS,EAAK,MAAK;AAAA,cACzE,gBAAAzS,EAAC,KAAA,EAAE,WAAU,iDAAiD,YAAK,KAAA,CAAK;AAAA,YAAA,GAC1E;AAAA,YACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,UAAK,WAAW,qDACfyS,EAAK,qBAAqB,aACtB,gDACA,iDACN,IACG,UAAAjX,EAAE,gBAAgBiX,EAAK,iBAAiB,YAAA,CAAa,EAAE,GAC1D;AAAA,cACCA,EAAK,aACJ,gBAAAzS,EAAC,QAAA,EAAK,WAAU,uGACb,UAAAxE,EAAE,0BAA0B,EAAA,CAC/B;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UACCiX,EAAK,eACJ,gBAAAzS,EAAC,OAAE,WAAU,6CAA6C,YAAK,YAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MA7BxEyS,EAAK;AAAA,IAAA,CAgCb,GACH;AAAA,IAGF,gBAAAtR,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASqS;AAAA,UACT,WAAU;AAAA,UAET,YAAE,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAEpB,gBAAArS;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASsS;AAAA,UACT,UAAUH,KAAqB,CAACF,KAAsBA,MAAuBM;AAAA,UAC7E,WAAU;AAAA,UAET,cACC,gBAAAvS,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C9F,EAAE,0BAA0B;AAAA,QAAA;AAAA,MAAA;AAAA,IAEhC,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,IA5FgB;AA8FpB;AAEA,SAASkX,GAAyB;AAAA,EAChC,QAAA1T;AAAA,EACA,cAAAoD;AAAA,EACA,aAAAuQ;AAAA,EACA,GAAAnX;AACF,GAKG;AACD,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,QAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,QACzBpX,EAAE,4BAA4B;AAAA,MAAA,GACjC;AAAA,MACA,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASwR;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAA3S,EAAC6S,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAC1BrX,EAAE,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAClB,GACF;AAAA,IACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,wDACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,qBAAqB,GAAE;AAAA,QAC3G,gBAAAwE,EAAC,KAAA,EAAE,WAAU,kDAAkD,YAAO,KAAA,CAAK;AAAA,MAAA,GAC7E;AAAA,MACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,qBAAqB,GAAE;AAAA,QAC3G,gBAAAwE,EAAC,KAAA,EAAE,WAAU,gDAAgD,YAAO,KAAA,CAAK;AAAA,MAAA,GAC3E;AAAA,MACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,qBAAqB,GAAE;AAAA,0BAC1G,QAAA,EAAK,WAAW,iEACfwD,EAAO,SAAS,aACZ,gDACA,iDACN,IACG,YAAE,gBAAgBA,EAAO,KAAK,aAAa,EAAE,EAAA,CAChD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAmC,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,uBAAuB,GAAE;AAAA,QAC7G,gBAAAwE,EAAC,UAAK,WAAW,iEAAiEoC,EAAapD,EAAO,MAAM,EAAE,OAAO,IAAIoD,EAAapD,EAAO,MAAM,EAAE,KAAK,IACvJ,UAAAxD,EAAE,kBAAkBwD,EAAO,OAAO,YAAA,CAAa,EAAE,EAAA,CACpD;AAAA,MAAA,GACF;AAAA,MACCA,EAAO,eACN,gBAAAmC,EAAC,OAAA,EAAI,WAAU,uEACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,4BAA4B,GAAE;AAAA,QAClH,gBAAAwE,EAAC,KAAA,EAAE,WAAU,0DAA0D,YAAO,YAAA,CAAY;AAAA,MAAA,EAAA,CAC5F;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS8S,GAAuB;AAAA,EAC9B,QAAA9T;AAAA,EACA,iBAAA+T;AAAA,EACA,kBAAAC;AAAA,EACA,GAAAxX;AAAA,EACA,UAAAE;AACF,GAMG;AACD,SACE,gBAAAyF,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,QAAA,gBAAAnB,EAACiT,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,QAC/BzX,EAAE,wCAAwC;AAAA,MAAA,GAC7C;AAAA,MACA,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMzF,EAAS,2BAA2BsD,EAAO,EAAE,uBAAuB;AAAA,UACnF,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAgB,EAACkT,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,YAC7B1X,EAAE,4CAA4C;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACjD,GACF;AAAA,IACCwX,uBACE,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAhT,EAACsB,GAAA,EAAQ,WAAU,oDAAA,CAAoD,EAAA,CACzE;AAAA,IAED,CAAC0R,KAAoBD,KACpB,gBAAA5R,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEACV,UAAAxE,EAAE,2CAA2C,GAChD;AAAA,QACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,kDACV,UAAA+S,EAAgB,aAAa,SAC1BvX,EAAE,+CAA+C,IACjDA,EAAE,qDAAqD,EAAA,CAC7D;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEACV,UAAAxE,EAAE,yCAAyC,GAC9C;AAAA,QACA,gBAAAwE,EAAC,QAAA,EAAK,WAAW,sFACf+S,EAAgB,eACZ,sDACA,mDACN,IACG,UAAAA,EAAgB,eACb,gBAAA5R,EAAAkC,IAAA,EAAE,UAAA;AAAA,UAAA,gBAAArD,EAACmT,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,UAAG3X,EAAE,6CAA6C;AAAA,QAAA,EAAA,CAAE,IACxF,gBAAA2F,EAAAkC,IAAA,EAAE,UAAA;AAAA,UAAA,gBAAArD,EAACsD,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,UAAG9H,EAAE,gDAAgD;AAAA,QAAA,EAAA,CAAE,EAAA,CAChG;AAAA,MAAA,GACF;AAAA,MACCuX,EAAgB,aAAa,UAAUA,EAAgB,eACtD,gBAAA5R,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEACV,UAAAxE,EAAE,0CAA0C,GAC/C;AAAA,QACA,gBAAAwE,EAAC,OAAE,WAAU,yDAAwD,OAAO+S,EAAgB,aACzF,YAAgB,YAAA,CACnB;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GAEJ;AAAA,IAED,CAACC,KAAoB,CAACD,KACrB,gBAAA5R,EAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,MAAA,gBAAAnB,EAACiT,IAAA,EAAW,WAAU,+CAAA,CAA+C;AAAA,wBACpE,KAAA,EAAE,WAAU,mCACV,UAAAzX,EAAE,kDAAkD,GACvD;AAAA,wBACC,KAAA,EAAE,WAAU,mDACV,UAAAA,EAAE,sDAAsD,EAAA,CAC3D;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS4X,GAAsB;AAAA,EAC7B,QAAApU;AAAA,EACA,WAAAgT;AAAA,EACA,qBAAAqB;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAA7X;AAAA,EACA,GAAAF;AACF,GAQG;AACD,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACsC,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,UAC3B9G,EAAE,8BAA8B;AAAA,QAAA,GACnC;AAAA,QACA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMzF,EAAS,kCAAkC;AAAA,YAC1D,WAAU;AAAA,YACV,OAAOF,EAAE,gCAAgC;AAAA,YAEzC,UAAA;AAAA,cAAA,gBAAAwE,EAACwT,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,cACjChY,EAAE,gCAAgC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACrC,GACF;AAAA,MACCwD,EAAO,aACN,gBAAAmC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASkS;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAArT,EAAC6S,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAC1BrX,EAAE,yBAAyB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9B,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASmS;AAAA,YACT,UAAUC;AAAA,YACV,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,IAAmB,gBAAAvT,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,cACzFhX,EAAE,yBAAyB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9B,EAAA,CACF,IAEA,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASkS;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAArT,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YACzBjY,EAAE,yBAAyB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9B,GAEJ;AAAA,IACCwD,EAAO,aACN,gBAAAmC,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,uBAAuB,GAAE;AAAA,QAC7G,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,kDAAkD,UAAAhB,EAAO,gBAAgB,KAAI;AAAA,UACzFgT,EAAU,KAAK,CAAAS,MAAQA,EAAK,OAAOzT,EAAO,UAAU,GAAG,aACtD,gBAAAmC,EAAC,QAAA,EAAK,WAAU,+HACd,UAAA;AAAA,YAAA,gBAAAnB,EAAC0T,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YACzBlY,EAAE,0BAA0B;AAAA,UAAA,EAAA,CAC/B;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,uBAAuB,GAAE;AAAA,0BAC5G,KAAA,EAAE,WAAU,gDAAgD,UAAAwD,EAAO,gBAAgB,IAAA,CAAI;AAAA,MAAA,GAC1F;AAAA,MACA,gBAAAgB,EAAC,OAAA,EAAI,WAAU,6DACb,UAAA,gBAAAmB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMzF,EAAS,oCAAoCsD,EAAO,UAAU,EAAE;AAAA,UAC/E,WAAU;AAAA,UAET,UAAA;AAAA,YAAAxD,EAAE,8BAA8B;AAAA,YACjC,gBAAAwE,EAAC2T,IAAA,EAAW,WAAU,cAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EACtC,CACF;AAAA,IAAA,EAAA,CACF,IAEA,gBAAAxS,EAAC,OAAA,EAAI,WAAU,2FACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsC,IAAA,EAAO,WAAU,kDAAA,CAAkD;AAAA,wBACnE,KAAA,EAAE,WAAU,sCACV,UAAA9G,EAAE,+BAA+B,GACpC;AAAA,wBACC,KAAA,EAAE,WAAU,sDACV,UAAAA,EAAE,mCAAmC,EAAA,CACxC;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEO,SAASoY,GAAkB;AAAA,EAChC,QAAA5U;AAAA,EACA,aAAA6U;AAAA,EACA,cAAAzR;AAAA,EACA,eAAAnF;AAAA,EACA,WAAA6W;AAAA,EACA,aAAAnB;AAAA,EACA,gBAAAoB;AAAA,EACA,mBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,aAAAC;AACF,GAAyC;AACvC,QAAM,EAAE,GAAA1Y,EAAA,IAAMC,GAAe,OAAO,GAC9BC,IAAWC,GAAA,GACX,CAACuI,GAAoBC,CAAqB,IAAIpJ,EAAS,EAAK,GAC5D,CAACoZ,GAAWC,CAAY,IAAIrZ,EAAoB,EAAE,MAAM,IAAI,aAAa,IAAI,MAAM,WAAA,CAAY,GAC/F,CAACyJ,GAAmBC,CAAoB,IAAI1J,EAAS,EAAK,GAC1D,CAACwU,GAAYC,CAAa,IAAIzU,EAAS,EAAK,GAG5C,CAACsZ,GAAmBC,CAAoB,IAAIvZ,EAAS,EAAK,GAC1D,CAACiX,GAAWuC,CAAY,IAAIxZ,EAA8B,CAAA,CAAE,GAC5D,CAACmX,GAAkBsC,CAAmB,IAAIzZ,EAAS,EAAK,GACxD,CAACkX,GAAoBwC,CAAqB,IAAI1Z,EAAiB,EAAE,GACjE,CAACoX,GAAmBuC,CAAoB,IAAI3Z,EAAS,EAAK,GAC1D,CAACwY,IAAkBoB,EAAmB,IAAI5Z,EAAS,EAAK,GAGxD,CAACgY,GAAiB6B,CAAkB,IAAI7Z,EAAiD,IAAI,GAC7F,CAACiY,IAAkB6B,CAAmB,IAAI9Z,EAAS,EAAK,GAExD+Z,IAAsBxW,EAAY,YAAY;AAClD,IAAAuW,EAAoB,EAAI;AACxB,QAAI;AACF,YAAMpD,KAAS,MAAMsD,GAAa,iBAAiB/V,EAAO,EAAE;AAC5D,MAAA4V,EAAmBnD,EAAM;AAAA,IAC3B,QAAQ;AACN,MAAAmD,EAAmB,IAAI;AAAA,IACzB,UAAA;AACE,MAAAC,EAAoB,EAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC7V,EAAO,EAAE,CAAC;AAEd,EAAAhE,GAAU,MAAM;AACd,IAAA8Z,EAAA;AAAA,EACF,GAAG,CAACA,CAAmB,CAAC;AAExB,QAAME,IAAgB1W,EAAY,YAAY;AAC5C,IAAAkW,EAAoB,EAAI;AACxB,QAAI;AACF,YAAM7P,KAAO,MAAMnG,EAAS,UAAU,OAAA;AACtC,MAAA+V,EAAa5P,GAAK,OAAO,CAAAnJ,OAAKA,GAAE,QAAQ,CAAC;AAAA,IAC3C,SAASiD,IAAK;AACZ,cAAQ,MAAM,6BAA6BA,EAAG;AAAA,IAChD,UAAA;AACE,MAAA+V,EAAoB,EAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAA,CAAE;AAGL,EAAAxZ,GAAU,MAAM;AACd,IAAIgE,EAAO,cAAcgT,EAAU,WAAW,KAC5CgD,EAAA;AAAA,EAEJ,GAAG,CAAChW,EAAO,YAAYgT,EAAU,QAAQgD,CAAa,CAAC;AAEvD,QAAMC,IAA0B,YAAY;AAC1C,IAAAR,EAAsBzV,EAAO,cAAc,EAAE,GAC7CsV,EAAqB,EAAI,GACzB,MAAMU,EAAA;AAAA,EACR,GAEME,IAAuB,YAAY;AACvC,QAAKjD,GACL;AAAA,MAAAyC,EAAqB,EAAI;AACzB,UAAI;AACF,cAAMlW,EAAS,QAAQ,eAAeQ,EAAO,IAAIiT,CAAkB,GACnE,MAAM6B,EAAA,GACNQ,EAAqB,EAAK;AAAA,MAC5B,SAAS7V,IAAK;AACZ,gBAAQ,MAAM,8BAA8BA,EAAG;AAAA,MACjD,UAAA;AACE,QAAAiW,EAAqB,EAAK;AAAA,MAC5B;AAAA;AAAA,EACF,GAEMS,IAAuB,YAAY;AACvC,IAAAR,GAAoB,EAAI;AACxB,QAAI;AACF,YAAMnW,EAAS,QAAQ,eAAeQ,EAAO,EAAE,GAC/C,MAAM8U,EAAA;AAAA,IACR,SAASrV,IAAK;AACZ,cAAQ,MAAM,8BAA8BA,EAAG;AAAA,IACjD,UAAA;AACE,MAAAkW,GAAoB,EAAK;AAAA,IAC3B;AAAA,EACF,GAEM/P,IAAsB,MAAM;AAChC,IAAAwP,EAAa,EAAE,MAAMpV,EAAO,MAAM,aAAaA,EAAO,eAAe,IAAI,MAAMA,EAAO,KAAA,CAAoB,GAC1GmF,EAAsB,EAAI,GAC1BwO,EAAA;AAAA,EACF,GAEM9N,IAAuB,MAAM;AACjC,IAAAV,EAAsB,EAAK,GAC3BiQ,EAAa,EAAE,MAAM,IAAI,aAAa,IAAI,MAAM,YAAY;AAAA,EAC9D,GAEMtP,KAAwB,YAAY;AACxC,QAAKqP,EAAU,KAAK,QACpB;AAAA,MAAA1P,EAAqB,EAAI;AACzB,UAAI;AACF,cAAMjG,EAAS,QAAQ,OAAOQ,EAAO,IAAI;AAAA,UACvC,MAAMmV,EAAU;AAAA,UAChB,aAAaA,EAAU;AAAA,UACvB,MAAMA,EAAU;AAAA,QAAA,CACjB,GACD,MAAML,EAAA,GACNjP,EAAA;AAAA,MACF,SAASpG,IAAK;AACZ,gBAAQ,MAAM,+BAA+BA,EAAG;AAAA,MAClD,UAAA;AACE,QAAAgG,EAAqB,EAAK;AAAA,MAC5B;AAAA;AAAA,EACF,GAEMoM,KAA2B,YAAY;AAC3C,IAAArB,EAAc,EAAI;AAClB,QAAI;AACF,YAAM0E,EAAA;AAAA,IACR,UAAA;AACE,MAAA1E,EAAc,EAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAArO,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAAC0S;AAAA,MAAA;AAAA,QACC,QAAA1T;AAAA,QACA,cAAAoD;AAAA,QACA,aAAawC;AAAA,QACb,GAAApJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,UAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,UACzBpX,EAAE,sBAAsB;AAAA,QAAA,GAC3B;AAAA,QACA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6S;AAAA,YACT,WAAU;AAAA,YACV,OAAOxY,EAAE,yCAAyC;AAAA,YAElD,UAAA;AAAA,cAAA,gBAAAwE,EAAC6S,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAC1BrX,EAAE,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAClB,GACF;AAAA,MACCqY,IACC,gBAAA1S,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,aAAa,GAAE;AAAA,4BAClG,KAAA,EAAE,WAAU,kDAAkD,UAAAqY,EAAY,mBAAmB,IAAA,CAAI;AAAA,QAAA,GACpG;AAAA,QACA,gBAAA1S,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,cAAc,GAAE;AAAA,4BACnG,KAAA,EAAE,WAAU,kDAAkD,UAAAqY,EAAY,aAAa,IAAA,CAAI;AAAA,QAAA,EAAA,CAC9F;AAAA,MAAA,EAAA,CACF,IAEA,gBAAA7T,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,uCAAuC,UAAAxE,EAAE,wBAAwB,EAAA,CAAE,EAAA,CAClF;AAAA,IAAA,GAEJ;AAAA,IAGCwD,EAAO,SAAS,cACf,gBAAAmC,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UAC9BjF,EAAE,6BAA6B;AAAA,QAAA,GAClC;AAAA,QACCwD,EAAO,iBACN,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS0P;AAAA,YACT,UAAUtB;AAAA,YACV,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,IAAa,gBAAAvP,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,cACnFhX,EAAE,6BAA6B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAGlC,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS8S;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAjU,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cACzBjY,EAAE,2BAA2B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAChC,GAEJ;AAAA,MACCwD,EAAO,iBACN,gBAAAgB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,qEAAqE,UAAAxE,EAAE,iCAAiC,GAAE;AAAA,0BACtH,KAAA,EAAE,WAAU,kDAAkD,UAAAwD,EAAO,cAAc,QAAQ,IAAA,CAAI;AAAA,MAAA,EAAA,CAClG,EAAA,CACF,IAEA,gBAAAmC,EAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,+CAAA,CAA+C;AAAA,0BAC9D,KAAA,EAAE,WAAU,mCACV,UAAApX,EAAE,qCAAqC,EAAA,CAC1C;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GAEJ;AAAA,IAGF,gBAAAwE;AAAA,MAAC8S;AAAA,MAAA;AAAA,QACC,QAAA9T;AAAA,QACA,iBAAA+T;AAAA,QACA,kBAAAC;AAAA,QACA,GAAAxX;AAAA,QACA,UAAAE;AAAA,MAAA;AAAA,IAAA;AAAA,IAGF,gBAAAsE;AAAA,MAACoT;AAAA,MAAA;AAAA,QACC,QAAApU;AAAA,QACA,WAAAgT;AAAA,QACA,qBAAqBiD;AAAA,QACrB,kBAAkBE;AAAA,QAClB,kBAAA5B;AAAA,QACA,UAAA7X;AAAA,QACA,GAAAF;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+FACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAI,WAAU,0CACb,UAAA,gBAAAmB,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,QAAA,gBAAAnB,EAACkT,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,QAC7B1X,EAAE,wBAAwB;AAAA,MAAA,EAAA,CAC7B,EAAA,CACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,QAAAnC,EAAO,WAAW,YAAYA,EAAO,WAAW,cAC/C,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM4S,EAAe,UAAU;AAAA,YACxC,UAAU9W,MAAkB;AAAA,YAC5B,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,MAAkB,+BAAcqE,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAAC2B,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,cAC9GnG,EAAE,0BAA0B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhCwD,EAAO,WAAW,YACjB,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM4S,EAAe,SAAS;AAAA,YACvC,UAAU9W,MAAkB;AAAA,YAC5B,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,MAAkB,8BAAaqE,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAAC4B,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,cAC9GpG,EAAE,yBAAyB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAG/BwD,EAAO,WAAW,cACjB,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM4S,EAAe,SAAS;AAAA,YACvC,UAAU9W,MAAkB;AAAA,YAC5B,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,MAAkB,8BAAaqE,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAAC6B,IAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,cAC1GrG,EAAE,yBAAyB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhC,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS2S;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA9T,EAACoV,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,cAC9B5Z,EAAE,gBAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACrB,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAwE;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,MAAMuC;AAAA,QACN,WAAArC;AAAA,QACA,oBAAAC;AAAA,QACA,kBAAAC;AAAA,QACA,mBAAAC;AAAA,QACA,kBAAkBsC;AAAA,QAClB,SAAS,MAAMH,EAAqB,EAAK;AAAA,QACzC,UAAUY;AAAA,QACV,kBAAkBlW,EAAO,cAAc;AAAA,QACvC,GAAAxD;AAAA,MAAA;AAAA,IAAA;AAAA,IAID0I,uBACE,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAA/C,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAxE,EAAE,0BAA0B,GAC/B;AAAA,4BACC,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,kCAAkC,EAAA,CACvC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6E;AAAA,YACT,WAAU;AAAA,YAEV,UAAA,gBAAA7E,EAACwS,IAAA,EAAE,WAAU,sCAAA,CAAsC;AAAA,UAAA;AAAA,QAAA;AAAA,MACrD,GACF;AAAA,MAEA,gBAAArR,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,mBAAmB,GACxB;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOmU,EAAU;AAAA,cACjB,UAAU,CAAC9S,OAAM+S,EAAa,CAAAtV,QAAS,EAAE,GAAGA,IAAM,MAAMuC,GAAE,OAAO,MAAA,EAAQ;AAAA,cACzE,WAAU;AAAA,cACV,aAAa7F,EAAE,gCAAgC;AAAA,YAAA;AAAA,UAAA;AAAA,QACjD,GACF;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAwE,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,0BAA0B,GAC/B;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOmU,EAAU;AAAA,cACjB,UAAU,CAAC9S,OAAM+S,EAAa,CAAAtV,QAAS,EAAE,GAAGA,IAAM,aAAauC,GAAE,OAAO,MAAA,EAAQ;AAAA,cAChF,WAAU;AAAA,cACV,aAAa7F,EAAE,uCAAuC;AAAA,YAAA;AAAA,UAAA;AAAA,QACxD,GACF;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAwE,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,mBAAmB,GACxB;AAAA,UACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,cACX,UAAA,CAAC,YAAY,UAAU,EAAY,IAAI,CAACqV,OACxC,gBAAArV;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAMoU,EAAa,CAAAtV,QAAS,EAAE,GAAGA,IAAM,MAAMuW,GAAA,EAAa;AAAA,cACnE,WAAW,8DACTlB,EAAU,SAASkB,KACf,0FACA,wHACN;AAAA,cAEA,UAAA,gBAAArV,EAAC,QAAA,EAAK,WAAU,uBAAuB,UAAAxE,EAAE,gBAAgB6Z,GAAW,YAAA,CAAa,EAAE,EAAA,CAAE;AAAA,YAAA;AAAA,YAThFA;AAAA,UAAA,CAWR,GACH;AAAA,UACClB,EAAU,SAAS,cAAcnV,EAAO,kBACvC,gBAAAgB,EAAC,KAAA,EAAE,WAAU,yCACV,UAAAxE,EAAE,6BAA6B,EAAA,CAClC;AAAA,UAED2Y,EAAU,SAASnV,EAAO,QACzB,gBAAAgB,EAAC,OAAE,WAAU,2CACV,UAAAxE,EAAE,gCAAgC,EAAA,CACrC;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6E;AAAA,YACT,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAA7E;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS8E;AAAA,YACT,UAAUN,KAAqB,CAAC2P,EAAU,KAAK,KAAA;AAAA,YAC/C,WAAU;AAAA,YAET,cACC,gBAAAnU,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C9F,EAAE,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAEnB,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AClxBA,SAAS8Z,GAAWC,GAA6B;AAE/C,SADU,IAAI,KAAKA,CAAI,EACd,mBAAmB,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN;AACH;AAGO,SAASC,GAAiB;AAAA,EAC/B,UAAAxR;AAAA,EACA,SAAAgB;AAAA,EACA,gBAAAE;AAAA,EACA,eAAAjI;AAAA,EACA,WAAA6W;AAAA,EACA,gBAAA2B;AACF,GAAwC;AACtC,QAAM,EAAE,GAAAja,EAAA,IAAMC,GAAe,OAAO,GAG9B,CAACia,GAAkBC,CAAmB,IAAI5a,EAA2B;AAAA,IACzE,QAAQ;AAAA,IACR,gBAAgB,CAAA;AAAA,IAChB,iBAAiB,CAAA;AAAA,EAAC,CACnB,GACK,CAACuL,GAAcC,CAAe,IAAIxL,EAAS,EAAK,GAChD,CAACyL,GAAaC,CAAc,IAAI1L,EAAS,EAAK,GAG9C,CAACqK,GAAcC,CAAe,IAAItK,EAAS,EAAK,GAChD,CAACuK,GAAgBC,CAAiB,IAAIxK,EAAwB,CAAA,CAAE,GAChE,CAACyK,GAAcC,CAAe,IAAI1K,EAAS,EAAK,GAChD,CAAC2K,GAAgBC,CAAiB,IAAI5K,EAAS,EAAE,GACjD,CAAC6K,GAAgBC,CAAiB,IAAI9K,EAAwB,IAAI,GAClE,CAAC+K,GAAqBC,CAAsB,IAAIhL,EAAS,EAAK,GAE9DmM,IAAqB5I,EAAY,YAAY;AACjD,IAAAiI,EAAgB,EAAI;AACpB,QAAI;AAEF,aADa,MAAM/H,EAAS,QAAQ,eAAewF,CAAQ;AAAA,IAE7D,SAASvF,GAAK;AACZ,qBAAQ,MAAM,yBAAyBA,CAAG,GACnC,CAAA;AAAA,IACT,UAAA;AACE,MAAA8H,EAAgB,EAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAACvC,CAAQ,CAAC,GAEP4R,IAAiB,OAAOxO,MAA4B;AACxD,IAAAuO,EAAoB,CAAA7W,OAAS;AAAA,MAC3B,GAAGA;AAAA,MACH,QAAAsI;AAAA,MACA,iBAAiBA,EAAO,MAAM,IAAI,CAAAC,MAAKA,EAAE,MAAM;AAAA,IAAA,EAC/C;AACF,UAAMsK,IAAQ,MAAMzK,EAAA;AACpB,IAAAyO,EAAoB,CAAA7W,OAAS;AAAA,MAC3B,GAAGA;AAAA,MACH,gBAAgB6S;AAAA,IAAA,EAChB;AAAA,EACJ,GAEMkE,IAAkB,MAAM;AAC5B,IAAAF,EAAoB;AAAA,MAClB,QAAQ;AAAA,MACR,gBAAgB,CAAA;AAAA,MAChB,iBAAiB,CAAA;AAAA,IAAC,CACnB;AAAA,EACH,GAEMpO,IAAmB,CAACC,MAAmB;AAC3C,IAAAmO,EAAoB,CAAA7W,OAAS;AAAA,MAC3B,GAAGA;AAAA,MACH,iBAAiBA,EAAK,gBAAgB,SAAS0I,CAAM,IACjD1I,EAAK,gBAAgB,OAAO,CAAA2I,MAAMA,MAAOD,CAAM,IAC/C,CAAC,GAAG1I,EAAK,iBAAiB0I,CAAM;AAAA,IAAA,EACpC;AAAA,EACJ,GAEME,IAAkB,YAAY;AAClC,QAAKgO,EAAiB,QACtB;AAAA,MAAAjP,EAAe,EAAI;AACnB,UAAI;AACF,cAAMjI,EAAS,QAAQ,kBAAkBwF,GAAU0R,EAAiB,OAAO,QAAQA,EAAiB,eAAe,GACnH,MAAM5B,EAAA,GACN+B,EAAA;AAAA,MACF,SAASpX,GAAK;AACZ,gBAAQ,MAAM,yBAAyBA,CAAG;AAAA,MAC5C,UAAA;AACE,QAAAgI,EAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAEME,KAAqB,YAAY;AACrC,IAAAlB,EAAgB,EAAI;AACpB,QAAI;AACF,YAAMd,IAAO,MAAMnG,EAAS,MAAM,OAAO,EAAE,aAAa,IAAM;AAC9D,MAAA+G,EAAkBZ,EAAK,KAAK;AAAA,IAC9B,SAASlG,GAAK;AACZ,cAAQ,MAAM,mCAAmCA,CAAG,GACpD8G,EAAkB,CAAA,CAAE;AAAA,IACtB,UAAA;AACE,MAAAE,EAAgB,EAAK;AAAA,IACvB;AAAA,EACF,GAEMqQ,KAAgB,MAAM;AAC1B,IAAAzQ,EAAgB,EAAI,GACpBQ,EAAkB,IAAI,GACtBF,EAAkB,EAAE,GACpBgB,GAAA;AAAA,EACF,GAEMoP,IAAiB,MAAM;AAC3B,IAAA1Q,EAAgB,EAAK,GACrBQ,EAAkB,IAAI,GACtBF,EAAkB,EAAE,GACpBJ,EAAkB,CAAA,CAAE;AAAA,EACtB,GAEMwB,IAAkB,YAAY;AAClC,QAAKnB,GACL;AAAA,MAAAG,EAAuB,EAAI;AAC3B,UAAI;AACF,cAAMvH,EAAS,QAAQ,UAAUwF,GAAU,EAAE,QAAQ4B,GAAgB,GACrE,MAAMkO,EAAA,GACNiC,EAAA;AAAA,MACF,SAAStX,GAAK;AACZ,gBAAQ,MAAM,yBAAyBA,CAAG;AAAA,MAC5C,UAAA;AACE,QAAAsH,EAAuB,EAAK;AAAA,MAC9B;AAAA;AAAA,EACF,GAEMiQ,KAA8C;AAAA,IAClD;AAAA,MACE,KAAK;AAAA,MACL,OAAOxa,EAAE,aAAa;AAAA,MACtB,UAAU;AAAA,MACV,QAAQ,CAAC4L,MACP,gBAAAjG;AAAA,QAAC8U;AAAA,QAAA;AAAA,UACC,IAAI,yBAAyB7O,EAAO,MAAM;AAAA,UAC1C,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAApH,EAAC,OAAA,EAAI,WAAW,6EACdoH,EAAO,UACH,sDACA,gEACN,IACG,UAAAA,EAAO,UAAU,gBAAApH,EAACkW,IAAA,EAAM,WAAU,UAAA,CAAU,KAAM9O,EAAO,mBAAmBA,EAAO,aAAa,KAAK,OAAO,CAAC,EAAE,YAAA,EAAY,CAC9H;AAAA,YACA,gBAAAjG,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,UAAK,WAAU,yDAAyD,UAAAoH,EAAO,mBAAmBA,EAAO,WAAU;AAAA,cACnHA,EAAO,aAAaA,EAAO,qCACzB,QAAA,EAAK,WAAU,sDAAsD,UAAAA,EAAO,UAAA,CAAU;AAAA,YAAA,EAAA,CAE3F;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAO5L,EAAE,sBAAsB;AAAA,MAC/B,QAAQ,CAAC4L,MACP,gBAAAjG,EAAC,OAAA,EAAI,WAAU,wBACZ,UAAA;AAAA,QAAAiG,EAAO,WACN,gBAAAjG,EAAC,QAAA,EAAK,WAAU,sIACd,UAAA;AAAA,UAAA,gBAAAnB,EAACkW,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,UAC1B1a,EAAE,uBAAuB;AAAA,QAAA,GAC5B;AAAA,QAED4L,EAAO,MAAM,SAAS,KACrBA,EAAO,MAAM,IAAI,CAAA+O,MACf,gBAAAhV;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAnB,EAACoW,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,cAC3BD,EAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAJDA,EAAK;AAAA,QAAA,CAMb;AAAA,QAEF/O,EAAO,MAAM,WAAW,KAAK,CAACA,EAAO,WACpC,gBAAAjG,EAAC,QAAA,EAAK,WAAU,yIACd,UAAA;AAAA,UAAA,gBAAAnB,EAAC5E,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,UACzBI,EAAE,wBAAwB;AAAA,QAAA,EAAA,CAC7B;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC4L,MAAW;AAClB,cAAMiP,IAASjP,EAAO;AACtB,eAAIiP,MAAW,UAEX,gBAAAlV,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,yHACd,UAAA;AAAA,YAAA,gBAAAnB,EAACsW,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,YAC/B9a,EAAE,8BAA8B;AAAA,UAAA,GACnC;AAAA,UACC4L,EAAO,oBACN,gBAAAjG;AAAA,YAAC8U;AAAA,YAAA;AAAA,cACC,IAAI,gCAAgC7O,EAAO,cAAc;AAAA,cACzD,WAAU;AAAA,cACV,SAAS,CAAC/F,MAAMA,EAAE,gBAAA;AAAA,cAElB,UAAA;AAAA,gBAAA,gBAAArB,EAACuW,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gBAC1BnP,EAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACV,GAEJ,IAGAiP,MAAW,SAEX,gBAAAlV,EAAC,OAAA,EAAI,WAAU,6BACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,mHACb,UAAAxE,EAAE,6BAA6B,GAClC;AAAA,UACC4L,EAAO,oBACN,gBAAAjG;AAAA,YAAC8U;AAAA,YAAA;AAAA,cACC,IAAI,gCAAgC7O,EAAO,cAAc;AAAA,cACzD,WAAU;AAAA,cACV,SAAS,CAAC/F,MAAMA,EAAE,gBAAA;AAAA,cAElB,UAAA;AAAA,gBAAA,gBAAArB,EAACuW,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gBAC1BnP,EAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACV,GAEJ,sBAID,QAAA,EAAK,WAAU,sHACb,UAAA5L,EAAE,+BAA+B,GACpC;AAAA,MAEJ;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAOA,EAAE,0BAA0B;AAAA,MACnC,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC4L,MACP,gBAAApH,EAAC,QAAA,EAAK,WAAU,uCAAuC,UAAAoH,EAAO,WAAWkO,GAAWlO,EAAO,QAAQ,IAAI,IAAA,CAAI;AAAA,IAAA;AAAA,IAG/G;AAAA,MACE,KAAK;AAAA,MACL,OAAO5L,EAAE,sBAAsB;AAAA,MAC/B,OAAO;AAAA,MACP,QAAQ,CAAC4L,MACP,gBAAAjG,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,CAACqB,MAAM;AAAE,cAAAA,EAAE,gBAAA,GAAmBuU,EAAexO,CAAM;AAAA,YAAG;AAAA,YAC/D,WAAU;AAAA,YACV,OAAO5L,EAAE,mCAAmC;AAAA,YAE5C,UAAA,gBAAAwE,EAACoW,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAE7B,CAAChP,EAAO,WAAWA,EAAO,qBAAqB,WAC9C,gBAAApH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,CAACqB,MAAM;AAAE,cAAAA,EAAE,gBAAA,GAAmBoU,EAAerO,EAAO,MAAM;AAAA,YAAG;AAAA,YACtE,UAAUnK,MAAkBmK,EAAO;AAAA,YACnC,WAAU;AAAA,YACV,OAAOA,EAAO,qBAAqB,SAC/B5L,EAAE,yCAAyC,IAC3CA,EAAE,wBAAwB;AAAA,YAE7B,UAAAyB,MAAkBmK,EAAO,SACxB,gBAAApH,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAACwW,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAIpC,CAACpP,EAAO,WAAWA,EAAO,qBAAqB,WAC9C,gBAAApH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAOxE,EAAE,0CAA0C;AAAA,YAEnD,UAAA,gBAAAwE,EAACwW,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,EAAA,CAEJ;AAAA,IAAA;AAAA,EAEJ;AAGF,SACE,gBAAArV,EAAAkC,IAAA,EACE,UAAA;AAAA,IAAA,gBAAArD;AAAA,MAACyW;AAAA,MAAA;AAAA,QACC,MAAMzR,KAAW,CAAA;AAAA,QACjB,SAASE;AAAA,QACT,SAAA8Q;AAAA,QACA,YAAU;AAAA,QACV,mBAAmBxa,EAAE,wBAAwB;AAAA,QAC7C,cAAc,CAAC4L,GAAQsP,OACpBtP,EAAO,mBAAmB,IAAI,YAAA,EAAc,SAASsP,EAAK,aAAa,MACvEtP,EAAO,aAAa,IAAI,cAAc,SAASsP,EAAK,aAAa;AAAA,QAEpE,WAAW,CAACtP,MAAWA,EAAO;AAAA,QAC9B,cAAc5L,EAAE,uBAAuB;AAAA,QACvC,WAAW,gBAAAwE,EAAC0B,IAAA,EAAM,WAAU,gDAAA,CAAgD;AAAA,QAC5E,eACE,gBAAAP;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS2U;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA9V,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cACzBjY,EAAE,qBAAqB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAG5B,YAAY,EAAE,UAAU,IAAI,kBAAkB,GAAA;AAAA,MAAK;AAAA,IAAA;AAAA,IAIpDka,EAAiB,UAChB,gBAAA1V,EAAC,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,6DACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAxE,EAAE,mCAAmC,GACxC;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,6CACV,YAAE,wCAAwC,EAAE,MAAM0V,EAAiB,OAAO,mBAAmBA,EAAiB,OAAO,UAAA,CAAW,EAAA,CACnI;AAAA,QAAA,GACF;AAAA,QACA,gBAAA1V;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6V;AAAA,YACT,WAAU;AAAA,YAEV,UAAA,gBAAA7V,EAACwS,IAAA,EAAE,WAAU,sCAAA,CAAsC;AAAA,UAAA;AAAA,QAAA;AAAA,MACrD,GACF;AAAA,MAEClM,IACC,gBAAAtG,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,GAC3E,IAEA,gBAAAtB,EAAC,SAAI,WAAU,oIACZ,UAAA0V,EAAiB,eAAe,WAAW,IAC1C,gBAAA1V,EAAC,KAAA,EAAE,WAAU,wDACV,UAAAxE,EAAE,8CAA8C,EAAA,CACnD,IAEAka,EAAiB,eAAe,IAAI,CAAAS,MAClC,gBAAAhV;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAnB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS0V,EAAiB,gBAAgB,SAASS,EAAK,EAAE;AAAA,gBAC1D,UAAU,MAAM5O,EAAiB4O,EAAK,EAAE;AAAA,gBACxC,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ,gBAAAhV,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAAmW,EAAK,MAAK;AAAA,cACnEA,EAAK,eACJ,gBAAAnW,EAAC,OAAE,WAAU,uCAAuC,YAAK,YAAA,CAAY;AAAA,YAAA,EAAA,CAEzE;AAAA,UAAA;AAAA,QAAA;AAAA,QAdKmW,EAAK;AAAA,MAAA,CAgBb,GAEL;AAAA,MAGF,gBAAAhV,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6V;AAAA,YACT,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAA7V;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS0H;AAAA,YACT,UAAUlB,KAAeF;AAAA,YACzB,WAAU;AAAA,YAET,cACC,gBAAAtG,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C9F,EAAE,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAEnB,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAID4J,uBACE,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAAjE,EAAC,OAAA,EAAI,WAAU,6DACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAxE,EAAE,0BAA0B,GAC/B;AAAA,4BACC,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,6BAA6B,EAAA,CAClC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS+V;AAAA,YACT,WAAU;AAAA,YAEV,UAAA,gBAAA/V,EAACwS,IAAA,EAAE,WAAU,sCAAA,CAAsC;AAAA,UAAA;AAAA,QAAA;AAAA,MACrD,GACF;AAAA,MAEA,gBAAAxS,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO0F;AAAA,UACP,UAAU,CAACrE,MAAMsE,EAAkBtE,EAAE,OAAO,KAAK;AAAA,UACjD,WAAU;AAAA,UACV,aAAa7F,EAAE,6BAA6B;AAAA,QAAA;AAAA,MAAA,GAEhD;AAAA,MAECgK,IACC,gBAAAxF,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,uDAAsD,GAC3E,IAEA,gBAAAtB,EAAC,OAAA,EAAI,WAAU,oIACZ,UAAAsF,EACE;AAAA,QAAO,OACNI,MAAmB,MACnBoB,EAAE,SAAS,YAAA,EAAc,SAASpB,EAAe,aAAa,KAC9DoB,EAAE,MAAM,YAAA,EAAc,SAASpB,EAAe,aAAa;AAAA,MAAA,EAE5D,IAAI,CAAAiR,MACH,gBAAAxV;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,+FACTyE,MAAmB+Q,EAAK,KACpB,4EACA,4BACN;AAAA,UAEA,UAAA;AAAA,YAAA,gBAAA3W;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,SAAS4F,MAAmB+Q,EAAK;AAAA,gBACjC,UAAU,MAAM9Q,EAAkB8Q,EAAK,EAAE;AAAA,gBACzC,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ,gBAAAxV,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAA2W,EAAK,UAAS;AAAA,cACxE,gBAAA3W,EAAC,KAAA,EAAE,WAAU,uCAAuC,YAAK,MAAA,CAAM;AAAA,YAAA,EAAA,CACjE;AAAA,UAAA;AAAA,QAAA;AAAA,QAjBK2W,EAAK;AAAA,MAAA,CAmBb,GACL;AAAA,MAGF,gBAAAxV,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS+V;AAAA,YACT,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAA/V;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS+G;AAAA,YACT,UAAU,CAACnB,KAAkBE;AAAA,YAC7B,WAAU;AAAA,YAET,cACC,gBAAA9F,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C9F,EAAE,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MAElB,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;ACpfA,SAAS8Z,GAAWC,GAA6B;AAE/C,SADU,IAAI,KAAKA,CAAI,EACd,mBAAmB,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN;AACH;AAEO,SAASqB,GAAgB;AAAA,EAC9B,UAAA5S;AAAA,EACA,QAAA4D;AAAA,EACA,eAAAE;AAAA,EACA,iBAAAc;AAAA,EACA,WAAAkL;AAAA,EACA,eAAA+C;AACF,GAAuC;AACrC,QAAM,EAAE,GAAArb,EAAA,IAAMC,GAAe,OAAO,GAC9BC,IAAWC,GAAA,GAGX,CAACqM,GAAaC,CAAc,IAAIlN,EAAS,EAAK,GAC9C,CAACmN,GAA0BC,CAA2B,IAAIpN,EAA8B,CAAA,CAAE,GAC1F,CAACqN,GAAwBC,CAAyB,IAAItN,EAAS,EAAK,GACpE,CAACuN,GAAkBC,CAAmB,IAAIxN,EAAmB,CAAA,CAAE,GAC/D,CAACyN,GAAiBC,CAAkB,IAAI1N,EAAS,EAAK,GACtD,CAAC2N,GAAiBC,CAAkB,IAAI5N,EAAS,EAAE,GAGnD,CAAC+b,GAAeC,CAAgB,IAAIhc,EAA4E,EAAE,MAAM,IAAO,OAAO,MAAM,SAAS,GAAA,CAAO,GAG5J,CAACic,GAAiBC,CAAkB,IAAIlc,EAAS,EAAK,GACtD,CAACmc,GAAcC,CAAe,IAAIpc,EAAS,EAAE,GAC7C,CAACqc,GAAqBC,CAAsB,IAAItc,EAAS,EAAE,GAC3D,CAACuc,GAAyBC,CAA0B,IAAIxc,EAAS,EAAI,GACrE,CAACyc,IAAUC,EAAW,IAAI1c,EAAS,EAAK,GACxC,CAAC2c,GAAaC,CAAc,IAAI5c,EAAwB,IAAI,GAE5DgO,KAAsB,YAAY;AACtC,IAAAV,EAA0B,EAAI;AAC9B,QAAI;AACF,YAAM1D,IAAO,MAAMnG,EAAS,QAAQ,mBAAmBwF,CAAQ;AAC/D,MAAAmE,EAA4BxD,CAAI;AAAA,IAClC,SAASlG,GAAK;AACZ,cAAQ,MAAM,oCAAoCA,CAAG,GACrD0J,EAA4B,CAAA,CAAE;AAAA,IAChC,UAAA;AACE,MAAAE,EAA0B,EAAK;AAAA,IACjC;AAAA,EACF,GAEMuP,IAAe,MAAM;AACzB,IAAA3P,EAAe,EAAI,GACnBM,EAAoB,CAAA,CAAE,GACtBI,EAAmB,EAAE,GACrBI,GAAA;AAAA,EACF,GAEM8O,IAAgB,MAAM;AAC1B,IAAA5P,EAAe,EAAK,GACpBM,EAAoB,CAAA,CAAE,GACtBI,EAAmB,EAAE;AAAA,EACvB,GAEMmP,IAAoB,CAAC3O,MAAoB;AAC7C,IAAAZ;AAAA,MAAoB,CAAAzJ,MAClBA,EAAK,SAASqK,CAAO,IACjBrK,EAAK,OAAO,CAAA2I,OAAMA,OAAO0B,CAAO,IAChC,CAAC,GAAGrK,GAAMqK,CAAO;AAAA,IAAA;AAAA,EAEzB,GAEM4O,IAAkB,YAAY;AAClC,QAAIzP,EAAiB,WAAW,EAAG;AACnC,IAAAG,EAAmB,EAAI;AACvB,UAAMQ,IAAsB,CAAA,GACtBC,IAAmB,CAAA;AAEzB,eAAWC,MAAWb;AACpB,UAAI;AACF,cAAM9J,EAAS,QAAQ,iBAAiBwF,GAAUmF,EAAO,GACzDF,EAAU,KAAKE,EAAO;AAAA,MACxB,SAAS1K,IAAK;AACZ,gBAAQ,MAAM,uBAAuB0K,EAAO,KAAK1K,EAAG,GACpDyK,EAAO,KAAKC,EAAO;AAAA,MACrB;AAGF,UAAM2K,EAAA,GAEF5K,EAAO,WAAW,IACpB2O,EAAA,IACS5O,EAAU,SAAS,KAC5BV,EAAoBW,CAAM,GAG5BT,EAAmB,EAAK;AAAA,EAC1B,GAEMuP,IAAoB,YAAY;AACpC,QAAKd,EAAa,QAElB;AAAA,MAAAO,GAAY,EAAI,GAChBE,EAAe,IAAI;AACnB,UAAI;AAEF,cAAMM,IAAU,MAAMC,GAAU,OAAO;AAAA,UACrC,MAAMhB,EAAa,KAAA;AAAA,UACnB,aAAaE,EAAoB,KAAA,KAAU;AAAA,UAC3C,iBAAiBE;AAAA,QAAA,CAClB;AAGD,cAAM9Y,EAAS,QAAQ,iBAAiBwF,GAAUiU,EAAQ,EAAE,GAG5D,MAAMnE,EAAA,GACNmD,EAAmB,EAAK,GACxBE,EAAgB,EAAE,GAClBE,EAAuB,EAAE,GACzBE,EAA2B,EAAI;AAAA,MACjC,SAAS9Y,GAAK;AACZ,gBAAQ,MAAM,2BAA2BA,CAAG;AAC5C,cAAM0Z,IAAa1Z;AACnB,QAAI0Z,EAAW,UAAU,WAAW,MAClCR,EAAeQ,EAAW,SAAS,MAAM,WAAW3c,EAAE,4BAA4B,CAAC,IAEnFmc,EAAenc,EAAE,4BAA4B,CAAC;AAAA,MAElD,UAAA;AACE,QAAAic,GAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAEMzB,IAA6C;AAAA,IACjD;AAAA,MACE,KAAK;AAAA,MACL,OAAOxa,EAAE,aAAa;AAAA,MACtB,UAAU;AAAA,MACV,QAAQ,CAAC4c,MACP,gBAAAjX,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,6EACdoY,EAAM,oBACF,gDACA,gEACN,IACE,UAAA,gBAAApY,EAACsW,IAAA,EAAW,WAAU,UAAA,CAAU,GAClC;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAtW,EAAC,QAAA,EAAK,WAAU,8DAA8D,UAAAoY,EAAM,MAAK;AAAA,UACxFA,EAAM,eACL,gBAAApY,EAAC,OAAE,WAAU,8CAA8C,YAAM,YAAA,CAAY;AAAA,QAAA,EAAA,CAEjF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,4BAA4B;AAAA,MACrC,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC4c,MACP,gBAAApY,EAAC,UAAK,WAAU,wCAAwC,YAAM,YAAA,CAAY;AAAA,IAAA;AAAA,IAG9E;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,yBAAyB;AAAA,MAClC,QAAQ,CAAC4c,MACP,gBAAApY,EAAC,QAAA,EAAK,WAAW,oFACfoY,EAAM,WACF,sDACA,6CACN,IACG,YAAM,WACH5c,EAAE,6BAA6B,IAC/BA,EAAE,iCAAiC,EAAE,WAAW4c,EAAM,mBAAA,CAAoB,EAAA,CAChF;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAO5c,EAAE,uBAAuB;AAAA,MAChC,cAAc;AAAA,MACd,QAAQ,CAAC4c,MACP,gBAAApY,EAAC,UAAK,WAAW,oFACfoY,EAAM,oBACF,gDACA,sDACN,IACG,UAAAA,EAAM,oBACL,gBAAAjX,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAACqY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,QAAE;AAAA,MAAA,EAAA,CAE/B,IAEA,gBAAAlX,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAACsW,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,QAC/B9a,EAAE,sBAAsB;AAAA,MAAA,EAAA,CAC3B,EAAA,CAEJ;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOA,EAAE,0BAA0B;AAAA,MACnC,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC4c,MACP,gBAAApY,EAAC,QAAA,EAAK,WAAU,uCACb,UAAAoY,EAAM,UAAU9C,GAAW8C,EAAM,OAAO,IAAI,IAAA,CAC/C;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,CAACA,MAAUA,EAAM,WACvB,gBAAApY;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,CAACqB,MAAM;AAAE,YAAAA,EAAE,gBAAA,GAAmB0V,EAAiB,EAAE,MAAM,IAAM,OAAAqB,GAAO,SAAS,IAAO;AAAA,UAAG;AAAA,UAChG,UAAUxP,MAAoBwP,EAAM;AAAA,UACpC,WAAU;AAAA,UACV,OAAO5c,EAAE,uBAAuB;AAAA,UAE/B,UAAAoN,MAAoBwP,EAAM,UACzB,gBAAApY,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA,IAGzB;AAAA,IAAA;AAAA,EACN;AAGF,SACE,gBAAArR,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACyW;AAAA,MAAA;AAAA,QACC,MAAM7O,KAAU,CAAA;AAAA,QAChB,SAASE;AAAA,QACT,SAAAkO;AAAA,QACA,YAAU;AAAA,QACV,mBAAmBxa,EAAE,kCAAkC;AAAA,QACvD,cAAc,CAAC4c,GAAO1B,MACpB0B,EAAM,KAAK,YAAA,EAAc,SAAS1B,EAAK,aAAa,MACnD0B,EAAM,eAAe,IAAI,cAAc,SAAS1B,EAAK,aAAa;AAAA,QAErE,WAAW,CAAC0B,MAAUA,EAAM;AAAA,QAC5B,YAAY,CAACA,MAAU1c,EAAS,gCAAgC0c,EAAM,OAAO,EAAE;AAAA,QAC/E,cAAc5c,EAAE,yBAAyB;AAAA,QACzC,WAAW,gBAAAwE,EAACsW,IAAA,EAAW,WAAU,gDAAA,CAAgD;AAAA,QACjF,eACE,gBAAAnV,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AAAE,gBAAAwW,EAAe,IAAI,GAAGV,EAAmB,EAAI;AAAA,cAAG;AAAA,cACjE,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAjX,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBACzBjY,EAAE,oBAAoB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEzB,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASyW;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA5X,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBACzBjY,EAAE,oBAAoB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACzB,GACF;AAAA,QAEF,YAAY,EAAE,UAAU,IAAI,kBAAkB,GAAA;AAAA,MAAK;AAAA,IAAA;AAAA,IAIpDwM,uBACE,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAA7G,EAAC,OAAA,EAAI,WAAU,6DACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gDACX,UAAAxE,EAAE,yBAAyB,GAC9B;AAAA,4BACC,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,4BAA4B,EAAA,CACjC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6X;AAAA,YACT,WAAU;AAAA,YAEV,UAAA,gBAAA7X,EAACwS,IAAA,EAAE,WAAU,sCAAA,CAAsC;AAAA,UAAA;AAAA,QAAA;AAAA,MACrD,GACF;AAAA,MAEA,gBAAAxS,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO0I;AAAA,UACP,UAAU,CAACrH,MAAMsH,EAAmBtH,EAAE,OAAO,KAAK;AAAA,UAClD,WAAU;AAAA,UACV,aAAa7F,EAAE,6BAA6B;AAAA,QAAA;AAAA,MAAA,GAEhD;AAAA,MAEC4M,IACC,gBAAApI,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,EAAA,CAC3E,KACG,MAAM;AACT,cAAMgX,IAAiBpQ,EAAyB;AAAA,UAAO,CAAAqQ,MACrD7P,MAAoB,MACpB6P,EAAE,KAAK,YAAA,EAAc,SAAS7P,EAAgB,YAAA,CAAa,MAC1D6P,EAAE,eAAe,IAAI,cAAc,SAAS7P,EAAgB,aAAa;AAAA,QAAA;AAG5E,eAAO4P,EAAe,WAAW,IAC/B,gBAAAnX,EAAC,OAAA,EAAI,WAAU,6GACb,UAAA;AAAA,UAAA,gBAAAnB,EAACsW,IAAA,EAAW,WAAU,qDAAA,CAAqD;AAAA,UAC3E,gBAAAtW,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAkI,EAAyB,WAAW,IACjC1M,EAAE,kCAAkC,IACpCA,EAAE,iCAAiC,EAAA,CACzC;AAAA,QAAA,EAAA,CACF,IAEA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,oIACZ,UAAAsY,EAAe,IAAI,CAAAF,MAClB,gBAAAjX;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,+FACTmH,EAAiB,SAAS8P,EAAM,OAAO,IACnC,4EACA,4BACN;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAApY;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAASsI,EAAiB,SAAS8P,EAAM,OAAO;AAAA,kBAChD,UAAU,MAAMN,EAAkBM,EAAM,OAAO;AAAA,kBAC/C,WAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEZ,gBAAAjX,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAAoY,EAAM,MAAK;AAAA,gBACpEA,EAAM,eACL,gBAAApY,EAAC,OAAE,WAAU,uCAAuC,YAAM,YAAA,CAAY;AAAA,cAAA,EAAA,CAE1E;AAAA,YAAA;AAAA,UAAA;AAAA,UAlBKoY,EAAM;AAAA,QAAA,CAoBd,GACH;AAAA,MAEJ,GAAA;AAAA,MAEA,gBAAAjX,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6X;AAAA,YACT,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAA7X;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS+X;AAAA,YACT,UAAUzP,EAAiB,WAAW,KAAKE;AAAA,YAC3C,WAAU;AAAA,YAET,cACC,gBAAAxI,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB,IAE1C9F,EAAE,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MAElB,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAIDsb,EAAc,SACb,gBAAA9W;AAAA,MAAC8D;AAAA,MAAA;AAAA,QACC,QAAQgT,EAAc;AAAA,QACtB,OAAOtb,EAAE,uBAAuB;AAAA,QAChC,SAASA,EAAE,gCAAgC,EAAE,MAAMsb,EAAc,MAAM,MAAM;AAAA,QAC7E,SAAQ;AAAA,QACR,cAActb,EAAE,uBAAuB;AAAA,QACvC,SAASsb,EAAc;AAAA,QACvB,WAAW,YAAY;AACrB,cAAKA,EAAc,OACnB;AAAA,YAAAC,EAAiB,QAAS,EAAE,GAAGjY,GAAM,SAAS,KAAO;AACrD,gBAAI;AACF,oBAAM+X,EAAcC,EAAc,MAAM,OAAO;AAAA,YACjD,UAAA;AACE,cAAAC,EAAiB,EAAE,MAAM,IAAO,OAAO,MAAM,SAAS,IAAO;AAAA,YAC/D;AAAA;AAAA,QACF;AAAA,QACA,UAAU,MAAMA,EAAiB,EAAE,MAAM,IAAO,OAAO,MAAM,SAAS,GAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAKhFC,uBACE,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAA7V,EAAC,OAAA,EAAI,WAAU,2HACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAxE,EAAE,4BAA4B,GACjC;AAAA,4BACC,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,+BAA+B,EAAA,CACpC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMiX,EAAmB,EAAK;AAAA,YACvC,WAAU;AAAA,YAEV,UAAA,gBAAAjX,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACzB,GACF;AAAA,MACA,gBAAArR,EAAC,OAAA,EAAI,WAAU,iBACZ,UAAA;AAAA,QAAAuW,uBACE,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAvW,EAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,UAAM,UAAA0X,EAAA,CAAY;AAAA,UACnB,gBAAA1X,EAAC,UAAA,EAAO,SAAS,MAAM2X,EAAe,IAAI,GAAG,WAAU,WACrD,UAAA,gBAAA3X,EAACwS,IAAA,EAAE,WAAU,WAAU,EAAA,CACzB;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,0BAED,OAAA,EACC,UAAA;AAAA,UAAA,gBAAArR,EAAC,SAAA,EAAM,WAAU,6DACd,UAAA;AAAA,YAAA3F,EAAE,kBAAkB;AAAA,YAAE;AAAA,UAAA,GACzB;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOkX;AAAA,cACP,UAAU,CAAC7V,MAAM8V,EAAgB9V,EAAE,OAAO,KAAK;AAAA,cAC/C,aAAa7F,EAAE,6BAA6B;AAAA,cAC5C,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAwE,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,oBAAoB,GACzB;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOoX;AAAA,cACP,UAAU,CAAC/V,MAAMgW,EAAuBhW,EAAE,OAAO,KAAK;AAAA,cACtD,aAAa7F,EAAE,+BAA+B;AAAA,cAC9C,MAAM;AAAA,cACN,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMuX,EAA2B,CAACD,CAAuB;AAAA,cAClE,WAAW,6EACTA,IACI,iCACA,yBACN;AAAA,cAEA,UAAA,gBAAAtX;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW,6EACTsX,IAA0B,kBAAkB,eAC9C;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,4BAED,QAAA,EAAK,WAAU,sCACb,UAAA9b,EAAE,wBAAwB,EAAA,CAC7B;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMiX,EAAmB,EAAK;AAAA,YACvC,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAA9V;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS6W;AAAA,YACT,UAAU,CAACd,EAAa,KAAA,KAAUM;AAAA,YAClC,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,KACC,gBAAAxX,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAACwY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAE5Bhd,EAAE,6BAA6B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAClC,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AC/fA,MAAMid,KAAgE;AAAA,EACpE,QAAQ,EAAE,IAAI,wBAAwB,MAAM,2BAAA;AAAA,EAC5C,OAAO,EAAE,IAAI,0BAA0B,MAAM,6BAAA;AAAA,EAC7C,SAAS,EAAE,IAAI,uBAAuB,MAAM,0BAAA;AAAA,EAC5C,aAAa,EAAE,IAAI,0BAA0B,MAAM,6BAAA;AAAA,EACnD,QAAQ,EAAE,IAAI,yBAAyB,MAAM,4BAAA;AAC/C;AAEO,SAASC,GAAe;AAAA,EAC7B,OAAA/G;AAAA,EACA,cAAArL;AACF,GAAgD;AAC9C,QAAM,EAAE,GAAA9K,EAAA,IAAMC,GAAe,OAAO,GAE9Bua,IAA4C;AAAA,IAChD;AAAA,MACE,KAAK;AAAA,MACL,OAAOxa,EAAE,4BAA4B;AAAA,MACrC,UAAU;AAAA,MACV,QAAQ,CAAC2a,MACP,gBAAAhV,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAW,yDACdmW,EAAK,WACD,sDACA,gEACN,IACG,UAAAA,EAAK,WAAW,gBAAAnW,EAAC2Y,IAAA,EAAK,WAAU,UAAA,CAAU,sBAAMvC,IAAA,EAAO,WAAU,WAAU,EAAA,CAC9E;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAApW,EAAC,QAAA,EAAK,WAAU,0CAA0C,UAAAmW,EAAK,MAAK;AAAA,UACnEA,EAAK,eACJ,gBAAAnW,EAAC,OAAE,WAAU,2DAA2D,YAAK,YAAA,CAAY;AAAA,QAAA,EAAA,CAE7F;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,gCAAgC;AAAA,MACzC,UAAU;AAAA,MACV,QAAQ,CAAC2a,MAAS;AAChB,cAAMyC,IAAQH,GAAgBtC,EAAK,QAAQ,KAAK,EAAE,IAAI,2BAA2B,MAAM,+BAAA;AACvF,eACE,gBAAAnW,EAAC,UAAK,WAAW,4EAA4E4Y,EAAM,EAAE,IAAIA,EAAM,IAAI,IAChH,YAAE,4BAA4BzC,EAAK,QAAQ,IAAI,EAAE,cAAcA,EAAK,SAAA,CAAU,EAAA,CACjF;AAAA,MAEJ;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,KAAK;AAAA,MACL,OAAO3a,EAAE,mCAAmC;AAAA,MAC5C,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC2a,MACP,gBAAAnW,EAAC,UAAK,WAAU,yEACb,UAAAmW,EAAK,gBACJ,gBAAAhV,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAAC6Y,IAAA,EAAU,WAAU,cAAA,CAAc;AAAA,QAClC1C,EAAK;AAAA,MAAA,EAAA,CACR,IAEA,gBAAAhV,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAAC8Y,IAAA,EAAM,WAAU,cAAA,CAAc;AAAA,QAC9Btd,EAAE,4BAA4B;AAAA,MAAA,EAAA,CACjC,EAAA,CAEJ;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOA,EAAE,mCAAmC;AAAA,MAC5C,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC2a,MACP,gBAAAnW,EAAC,UAAK,WAAU,wCAAwC,YAAK,iBAAA,CAAiB;AAAA,IAAA;AAAA,IAGlF;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,+BAA+B;AAAA,MACxC,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ,CAAC2a,MACP,gBAAAhV,EAAC,QAAA,EAAK,WAAU,yEACd,UAAA;AAAA,QAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,cAAA,CAAc;AAAA,QAC9ByU,EAAK;AAAA,MAAA,EAAA,CACR;AAAA,IAAA;AAAA,EAEJ;AAGF,SACE,gBAAAnW;AAAA,IAACyW;AAAA,IAAA;AAAA,MACC,MAAM9E,KAAS,CAAA;AAAA,MACf,SAASrL;AAAA,MACT,SAAA0P;AAAA,MACA,YAAU;AAAA,MACV,mBAAmBxa,EAAE,sBAAsB;AAAA,MAC3C,cAAc,CAAC2a,GAAMO,MACnBP,EAAK,KAAK,YAAA,EAAc,SAASO,EAAK,YAAA,CAAa,MAClDP,EAAK,eAAe,IAAI,YAAA,EAAc,SAASO,EAAK,YAAA,CAAa,MACjEP,EAAK,mBAAmB,IAAI,YAAA,EAAc,SAASO,EAAK,aAAa;AAAA,MAExE,WAAW,CAACP,MAASA,EAAK;AAAA,MAC1B,cAAc3a,EAAE,qBAAqB;AAAA,MACrC,WAAW,gBAAAwE,EAACoW,IAAA,EAAO,WAAU,gDAAA,CAAgD;AAAA,MAC7E,YAAY,EAAE,UAAU,IAAI,kBAAkB,GAAA;AAAA,IAAK;AAAA,EAAA;AAGzD;ACrEA,MAAM2C,KAA0F;AAAA,EAC9F,WAAW,EAAE,KAAK,gBAAgB,MAAM,sCAAsC,IAAI,oCAAoC,OAAO,iBAAA;AAAA,EAC7H,QAAQ,EAAE,KAAK,eAAe,MAAM,oCAAoC,IAAI,kCAAkC,OAAO,cAAA;AAAA,EACrH,YAAY,EAAE,KAAK,iBAAiB,MAAM,wCAAwC,IAAI,sCAAsC,OAAO,cAAA;AAAA,EACnI,SAAS,EAAE,KAAK,cAAc,MAAM,kCAAkC,IAAI,gCAAgC,OAAO,eAAA;AAAA,EACjH,aAAa,EAAE,KAAK,eAAe,MAAM,iBAAiB,IAAI,IAAI,OAAO,GAAA;AAC3E,GAGMC,KAAyB,CAACC,MAAgF;AAC9G,QAAMC,IAA4D,CAAA;AAClE,aAAWrS,KAAKoS,GAAS;AACvB,UAAME,IAAYtS,EAAE,mBAAmB,aAAaA,EAAE,mBAAmB,eACnEuS,IAAevS,EAAE;AAEvB,IAAIsS,KAAa,CAACC,IAChBF,EAAU,KAAK,EAAE,UAAUrS,EAAE,IAAI,QAAQ,UAAU,IAC1C,CAACsS,KAAaC,MACnBvS,EAAE,mBAAmB,YACvBqS,EAAU,KAAK,EAAE,UAAUrS,EAAE,IAAI,QAAQ,mBAAmB,IAE5DqS,EAAU,KAAK,EAAE,UAAUrS,EAAE,IAAI,QAAQ,OAAO;AAAA,EAGtD;AACA,SAAOqS;AACT,GAGMG,KAA0B,CAACJ,MAAiF;AAChH,QAAMC,IAA6D,CAAA;AACnE,aAAWrS,KAAKoS;AACd,eAAWxP,KAAK5C,EAAE,UAAU;AAC1B,YAAMyS,IAAa7P,EAAE,mBAAmB,aAAaA,EAAE,mBAAmB,eACpE8P,IAAgB9P,EAAE;AAExB,MAAI6P,KAAc,CAACC,IACjBL,EAAU,KAAK,EAAE,WAAWzP,EAAE,IAAI,QAAQ,UAAU,IAC3C,CAAC6P,KAAcC,MACpB9P,EAAE,mBAAmB,YACvByP,EAAU,KAAK,EAAE,WAAWzP,EAAE,IAAI,QAAQ,mBAAmB,IAE7DyP,EAAU,KAAK,EAAE,WAAWzP,EAAE,IAAI,QAAQ,OAAO;AAAA,IAGvD;AAEF,SAAOyP;AACT,GAGMM,KAA+B,CACnC1a,GACAyK,GACAkQ,MAEO3a,EAAK,IAAI,CAAA+H,MACVA,EAAE,OAAO0C,IAAiB1C,IACvB;AAAA,EACL,GAAGA;AAAA,EACH,WAAW4S;AAAA,EACX,UAAU5S,EAAE,SAAS,IAAI,CAAA4C,OAAM,EAAE,GAAGA,GAAG,WAAWgQ,IAAa;AAAA,CAElE,GAIGC,KAAgC,CACpC5a,GACAyK,GACAI,MAEO7K,EAAK,IAAI,CAAA+H,MAAK;AACnB,MAAIA,EAAE,OAAO0C,EAAU,QAAO1C;AAC9B,QAAM+C,IAAc/C,EAAE,SAAS;AAAA,IAAI,CAAA4C,MACjCA,EAAE,OAAOE,IAAY,EAAE,GAAGF,GAAG,WAAW,CAACA,EAAE,cAAcA;AAAA,EAAA;AAE3D,SAAO;AAAA,IACL,GAAG5C;AAAA,IACH,WAAW+C,EAAY,KAAK,CAAAH,MAAKA,EAAE,SAAS;AAAA,IAC5C,UAAUG;AAAA,EAAA;AAEd,CAAC,GAeG+P,KAAc,CAAC,EAAE,SAAA7L,GAAS,UAAAvE,GAAU,YAAAqQ,GAAY,oBAAoBC,GAAc,eAAAC,GAAe,GAAAte,QAA0B;AAC/H,QAAMue,IAAiBF,EAAa/L,EAAQ,gBAAgBA,EAAQ,SAAS;AAE7E,SACE,gBAAA3M;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAW,uCACT4Y,IACI,6EACA,4BACN;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAA5Y;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM2Y,EAAcvQ,GAAUuE,EAAQ,EAAE;AAAA,YACjD,WAAW,6FACTiM,IACI,8BACAjM,EAAQ,YACR,kEACA,qEACN;AAAA,YAEC,UAAA;AAAA,cAAAiM,KAAkB,gBAAA/Z,EAACga,IAAA,EAAI,WAAU,yBAAA,CAAyB;AAAA,cAC1D,CAACD,KAAkBjM,EAAQ,aAAa,gBAAA9N,EAACwY,IAAA,EAAM,WAAU,yBAAA,CAAyB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGrF,gBAAAxY,EAAC,SAAI,WAAW,eAAe+Z,IAAiB,kCAAkC,yBAAyB,IACxG,UAAAH,EAAW9L,EAAQ,IAAI,KACtB,gBAAA9N,EAACsC,MAAO,WAAW,WAAWyX,IAAiB,iBAAiB,0BAA0B,IAAI,EAAA,CAElG;AAAA,QAEA,gBAAA/Z,EAAC,UAAK,WAAW,kBAAkB+Z,IAAiB,gDAAgD,4BAA4B,IAAK,UAAAjM,EAAQ,MAAA,CAAM;AAAA,QAClJiM,KACC,gBAAA/Z,EAAC,QAAA,EAAK,WAAU,mHACb,UAAAxE,EAAE,6CAA6C,EAAA,CAClD;AAAA,MAAA;AAAA,IAAA;AAAA,IA/BGsS,EAAQ;AAAA,EAAA;AAmCnB,GAeMmM,KAAY,CAAC;AAAA,EACjB,QAAA3Q;AAAA,EACA,YAAA4Q;AAAA,EACA,YAAAN;AAAA,EACA,oBAAoBC;AAAA,EACpB,qBAAAM;AAAA,EACA,oBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAP;AAAA,EACA,MAAAQ;AAAA,EACA,GAAA9e;AACF,MAAsB;AACpB,QAAM+e,IAAaJ,EAAoB7Q,CAAM,GACvCkR,IAAgBX,EAAavQ,EAAO,gBAAgBA,EAAO,SAAS;AAE1E,2BACG,OAAA,EAEC,UAAA;AAAA,IAAA,gBAAAnI,EAAC,SAAI,WAAW,+BACdqZ,IACI,6EACA,4BACN,IACE,UAAA;AAAA,MAAA,gBAAAxa;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMoa,EAAmB9Q,EAAO,EAAE;AAAA,UAC3C,WAAU;AAAA,UAET,UAAA4Q,sBACE1W,IAAA,EAAY,WAAU,oCAAmC,IAE1D,gBAAAxD,EAACya,IAAA,EAAa,WAAU,mCAAA,CAAmC;AAAA,QAAA;AAAA,MAAA;AAAA,MAI/D,gBAAAtZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMkZ,EAAa/Q,EAAO,EAAE;AAAA,UACrC,WAAW,6FACTkR,IACI,8BACAD,MAAe,aAEfA,MAAe,kBADf,kEAGA,qEACN;AAAA,UAEC,UAAA;AAAA,YAAAC,KAAiB,gBAAAxa,EAACga,IAAA,EAAI,WAAU,qBAAA,CAAqB;AAAA,YACrD,CAACQ,KAAiBD,MAAe,aAAa,gBAAAva,EAACwY,IAAA,EAAM,WAAU,sBAAqB;AAAA,YACpF,CAACgC,KAAiBD,MAAe,mBAAmB,gBAAAva,EAAC0a,IAAA,EAAM,WAAU,qBAAA,CAAqB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAG7F,gBAAA1a,EAAC,SAAI,WAAW,iBAAiBwa,IAAgB,kCAAkC,yBAAyB,IACzG,UAAAZ,EAAWtQ,EAAO,IAAI,KAAK,gBAAAtJ,EAACsC,MAAO,WAAW,WAAWkY,IAAgB,iBAAiB,0BAA0B,IAAI,EAAA,CAC3H;AAAA,MAEA,gBAAArZ,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAW,wBAAwBwa,IAAgB,gDAAgD,4BAA4B,IAAK,YAAO,MAAA,CAAM;AAAA,UACnJF,MAAS,cAAchR,EAAO,WAAW,kBACxCkR,IACE,gBAAAxa,EAAC,UAAK,WAAU,mHACb,YAAE,6CAA6C,EAAA,CAClD,IAEA,gBAAAA,EAAC,QAAA,EAAK,WAAW,2CAA2C+Y,GAAczP,EAAO,MAAM,KAAKyP,GAAc,WAAW,EAAE,KAAKA,GAAczP,EAAO,MAAM,KAAKyP,GAAc,WAAW,IAAI,IACtL,YAAE,mCAAmCA,GAAczP,EAAO,MAAM,KAAKyP,GAAc,WAAW,KAAK,EAAE,EAAA,CACxG;AAAA,QAAA,GAGN;AAAA,0BACC,KAAA,EAAE,WAAW,gBAAgByB,IAAgB,mCAAmC,0BAA0B,IACxG,UAAA;AAAA,UAAAlR,EAAO,SAAS,OAAO,CAAAG,MAAKA,EAAE,SAAS,EAAE;AAAA,UAAO;AAAA,UAAEH,EAAO,SAAS;AAAA,UAAQ;AAAA,UAC1E9N,EAAE,2CAA2C,UAAU;AAAA,QAAA,EAAA,CAC1D;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGC0e,KAAc5Q,EAAO,SAAS,SAAS,KACtC,gBAAAtJ,EAAC,OAAA,EAAI,WAAU,iDACZ,UAAAsJ,EAAO,SAAS,IAAI,CAAAwE,MACnB,gBAAA9N;AAAA,MAAC2Z;AAAA,MAAA;AAAA,QAEC,SAAA7L;AAAA,QACA,UAAUxE,EAAO;AAAA,QACjB,YAAAsQ;AAAA,QACA,oBAAoBC;AAAA,QACpB,eAAAC;AAAA,QACA,GAAAte;AAAA,MAAA;AAAA,MANKsS,EAAQ;AAAA,IAAA,CAQhB,EAAA,CACH;AAAA,EAAA,EAAA,GA3EMxE,EAAO,EA6EjB;AAEJ;AAEO,SAASqR,GAAiC;AAAA,EAC/C,QAAAC;AAAA,EACA,SAAAvI;AAAA,EACA,UAAArO;AAAA,EACA,YAAA1E;AAAA,EACA,aAAAub;AAAA,EACA,SAAAC;AAAA,EACA,MAAAR,IAAO;AACT,GAA+D;AAC7D,QAAM,EAAE,GAAA9e,EAAA,IAAMC,GAAe,OAAO,GAE9B,CAACiB,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAACggB,GAAQC,CAAS,IAAIjgB,EAAS,EAAK,GACpC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkgB,GAASC,CAAU,IAAIngB,EAAwB,IAAI,GAEpD,CAACogB,GAAYC,CAAa,IAAIrgB,EAAqB,MAAM,GACzD,CAACke,GAASoC,CAAU,IAAItgB,EAA6B,CAAA,CAAE,GACvD,CAACugB,GAAiBC,CAAkB,IAAIxgB,EAAsB,oBAAI,KAAK,GAEvE6e,IAAa,CAAC4B,MAA4B;AAC9C,QAAI,CAACA,EAAU,QAAO;AAEtB,UAAMC,IADQC,GACcF,CAAQ;AACpC,WAAKC,IACE,gBAAAzb,EAACyb,GAAA,EAAc,WAAU,UAAA,CAAU,IADf;AAAA,EAE7B,GAEME,IAAWrd,EAAY,YAAY;AACvC,QAAKsc,GACL;AAAA,MAAAje,EAAW,EAAI,GACfmB,EAAS,IAAI;AAEb,UAAI;AACF,YAAIwc,MAAS,YAAY;AAGvB,gBAAM3M,KADW,MAAMnP,EAAS,UAAU,sBAAsBwF,GAAU6W,EAAY,aAAa,GAClD,IAAI,CAAAhU,OAAM;AAAA,YACzD,IAAIA,EAAE;AAAA,YACN,OAAOA,EAAE;AAAA,YACT,MAAMA,EAAE;AAAA,YACR,MAAMA,EAAE;AAAA,YACR,QAAQA,EAAE,aAAa,WAAW;AAAA,YAClC,aAAa;AAAA,YACb,qBAAqBA,EAAE;AAAA,YACvB,WAAWA,EAAE;AAAA,YACb,gBAAgBA,EAAE,aAAa,WAAW;AAAA,YAC1C,UAAUA,EAAE,SAAS,IAAI,CAAA4C,OAAM;AAAA,cAC7B,IAAIA,EAAE;AAAA,cACN,OAAOA,EAAE;AAAA,cACT,MAAMA,EAAE;AAAA,cACR,MAAMA,EAAE;AAAA,cACR,QAAQA,EAAE,aAAa,WAAW;AAAA,cAClC,aAAa;AAAA,cACb,qBAAqBA,EAAE;AAAA,cACvB,WAAWA,EAAE;AAAA,cACb,gBAAgBA,EAAE,aAAa,WAAW;AAAA,YAAA,EAC1C;AAAA,UAAA,EACF;AACF,UAAA4R,EAAW1N,CAAW,GACtByN,EAAczN,EAAY,KAAK,CAAA9G,MAAKA,EAAE,SAAS,IAAI,WAAW,MAAM;AACpE,gBAAM+U,IAAW,IAAI,IAAIjO,EAAY,OAAO,CAAA9G,MAAKA,EAAE,SAAS,KAAK,CAAA4C,MAAKA,EAAE,SAAS,CAAC,EAAE,IAAI,CAAA5C,MAAKA,EAAE,EAAE,CAAC;AAClG,UAAA0U,EAAmBK,CAAQ;AAAA,QAC7B,OAAO;AAGL,gBAAMjO,KADO,MAAMnP,EAAS,QAAQ,iBAAiBwF,GAAU6W,EAAY,aAAa,GAC3C,IAAI,CAAAhU,OAAM;AAAA,YACrD,IAAIA,EAAE;AAAA,YACN,OAAOA,EAAE;AAAA,YACT,MAAMA,EAAE;AAAA,YACR,MAAMA,EAAE;AAAA,YACR,QAAQA,EAAE;AAAA,YACV,aAAaA,EAAE;AAAA,YACf,qBAAqBA,EAAE;AAAA,YACvB,WAAWA,EAAE,WAAW,aAAaA,EAAE,WAAW;AAAA,YAClD,gBAAgBA,EAAE;AAAA,YAClB,UAAUA,EAAE,SAAS,IAAI,CAAA4C,OAAM;AAAA,cAC7B,IAAIA,EAAE;AAAA,cACN,OAAOA,EAAE;AAAA,cACT,MAAMA,EAAE;AAAA,cACR,MAAMA,EAAE;AAAA,cACR,QAAQA,EAAE;AAAA,cACV,aAAaA,EAAE;AAAA,cACf,qBAAqBA,EAAE;AAAA,cACvB,WAAWA,EAAE,WAAW,aAAaA,EAAE,WAAW;AAAA,cAClD,gBAAgBA,EAAE;AAAA,YAAA,EAClB;AAAA,UAAA,EACF;AACF,UAAA4R,EAAW1N,CAAW;AAGtB,gBAAMkO,IAAiBlO,EAAY;AAAA,YAAK,CAAA9G,MACtCA,EAAE,WAAW,YAAYA,EAAE,WAAW,gBAAgBA,EAAE,WAAW,aACnEA,EAAE,SAAS,KAAK,CAAA4C,MAAKA,EAAE,WAAW,YAAYA,EAAE,WAAW,gBAAgBA,EAAE,WAAW,SAAS;AAAA,UAAA;AAEnG,UAAA2R,EAAcS,IAAiB,WAAW,MAAM;AAGhD,gBAAMD,IAAW,IAAI,IAAIjO,EACtB,OAAO,CAAA9G,MAAKA,EAAE,SAAS,KAAK,CAAA4C,MAAKA,EAAE,WAAW,eAAe,CAACA,EAAE,mBAAmB,CAAC,EACpF,IAAI,CAAA5C,MAAKA,EAAE,EAAE,CAAC;AACjB,UAAA0U,EAAmBK,CAAQ;AAAA,QAC7B;AAAA,MACF,SAASnd,GAAK;AACZ,QAAAX,EAASW,aAAe,QAAQA,EAAI,UAAU,qBAAqB;AAAA,MACrE,UAAA;AACE,QAAA9B,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACie,GAAQC,EAAY,eAAe7W,GAAUsW,CAAI,CAAC;AAEtD,EAAAtf,GAAU,MAAM;AACd,IAAA2gB,EAAA;AAAA,EACF,GAAG,CAACA,CAAQ,CAAC;AAEb,QAAMG,IAAqB,CAACC,MACnBA,EAAK,IAAI,CAAAlV,OAAM;AAAA,IACpB,GAAGA;AAAA,IACH,WAAW;AAAA,IACX,UAAUA,EAAE,SAAS,IAAI,CAAA4C,OAAM,EAAE,GAAGA,GAAG,WAAW,KAAO;AAAA,EAAA,EACzD,GAGEuS,IAAyB,CAACC,MAAwB;AACtD,IAAIA,MAAY,YAAYd,MAAe,WACnBlC,EAAQ,KAAK,CAAApS,MAAKA,EAAE,aAAaA,EAAE,SAAS,KAAK,CAAA4C,MAAKA,EAAE,SAAS,CAAC,KAEtF4R,EAAWS,CAAkB,IAGjCV,EAAca,CAAO;AAAA,EACvB,GAEM7B,IAAqB,CAAC7Q,MAAqB;AAC/C,IAAAgS,EAAmB,CAAAzc,MAAQ;AACzB,YAAMkP,IAAS,IAAI,IAAIlP,CAAI;AAC3B,aAAIkP,EAAO,IAAIzE,CAAQ,IACrByE,EAAO,OAAOzE,CAAQ,IAEtByE,EAAO,IAAIzE,CAAQ,GAEdyE;AAAA,IACT,CAAC;AAAA,EACH,GAEMqM,IAAe,CAAC9Q,MAAqB;AACzC,IAAA8R,EAAW,CAAAvc,MAAQ;AAEjB,YAAM2a,IAAa,CADJ3a,EAAK,KAAK,CAAA+H,MAAKA,EAAE,OAAO0C,CAAQ,GACnB;AAC5B,aAAOiQ,GAA6B1a,GAAMyK,GAAUkQ,CAAU;AAAA,IAChE,CAAC;AAAA,EACH,GAEMK,IAAgB,CAACvQ,GAAkBI,MAAsB;AAC7D,IAAA0R,EAAW,CAAAvc,MAAQ4a,GAA8B5a,GAAMyK,GAAUI,CAAS,CAAC;AAAA,EAC7E,GAGMuS,IAAqB,CAACC,GAAwBC,OACjDD,MAAmB,eAAeA,MAAmB,cAAc,CAACC,GAEjEjC,KAAsB,CAAC7Q,MAAwE;AACnG,QAAIA,EAAO,SAAS,WAAW;AAC7B,aAAOA,EAAO,YAAY,YAAY;AAExC,UAAM+S,IAAe/S,EAAO,SAAS,OAAO,CAAAG,MAAKA,EAAE,SAAS,EAAE;AAC9D,WAAI4S,MAAiB,IAAU,cAC3BA,MAAiB/S,EAAO,SAAS,SAAe,YAC7C;AAAA,EACT,GAEMgT,KAAmB,YAAY;AACnC,QAAInB,MAAe;AACjB,YAAM3c,EAAS,UAAU,yBAAyBwF,GAAU6W,EAAY,eAAe;AAAA,QACrF,YAAY;AAAA,MAAA,CACb;AAAA,SACI;AACL,YAAM0B,IAAYtD,EAAQ,OAAO,CAAApS,MAAKA,EAAE,aAAaA,EAAE,SAAS,KAAK,CAAA4C,MAAKA,EAAE,SAAS,CAAC,EAAE,IAAI,CAAA5C,MAAKA,EAAE,EAAE,GAC/F2V,IAAavD,EAAQ,QAAQ,CAAApS,MAAKA,EAAE,SAAS,OAAO,CAAA4C,MAAKA,EAAE,SAAS,EAAE,IAAI,CAAAA,MAAKA,EAAE,EAAE,CAAC;AAC1F,YAAMjL,EAAS,UAAU,yBAAyBwF,GAAU6W,EAAY,eAAe;AAAA,QACrF,YAAY;AAAA,QACZ,WAAA0B;AAAA,QACA,YAAAC;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EACF,GAEMC,IAAiB,YAAY;AACjC,UAAMC,IAAkB1D,GAAuBC,CAAO,GAChD0D,IAAmBtD,GAAwBJ,CAAO;AAExD,KAAIyD,EAAgB,SAAS,KAAKC,EAAiB,SAAS,MAC1D,MAAMne,EAAS,QAAQ,cAAcwF,GAAU6W,EAAY,eAAe;AAAA,MACxE,SAAS6B,EAAgB,SAAS,IAAIA,IAAkB;AAAA,MACxD,UAAUC,EAAiB,SAAS,IAAIA,IAAmB;AAAA,IAAA,CAC5D;AAAA,EAEL,GAEMC,IAAa,YAAY;AAC7B,IAAA5B,EAAU,EAAI,GACdld,EAAS,IAAI,GACbod,EAAW,IAAI;AAEf,QAAI;AACF,MAAIZ,MAAS,aACX,MAAMgC,GAAA,IAEN,MAAMG,EAAA,GAGRvB,EAAW1f,EAAE,wCAAwC,4BAA4B,CAAC,GAClFsf,IAAA,GACA,WAAW,MAAMzI,EAAA,GAAW,GAAI;AAAA,IAClC,SAAS5T,GAAK;AACZ,MAAAX,EAASW,aAAe,QAAQA,EAAI,UAAU,gBAAgB;AAAA,IAChE,UAAA;AACE,MAAAuc,EAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAEM6B,KAAc,YAAY;AAC9B,IAAA7B,EAAU,EAAI,GACdld,EAAS,IAAI;AACb,QAAI;AAEF,YAAMgf,IAA8B,mBAC9BJ,IAAkBzD,EACrB,OAAO,CAAApS,MAAKA,EAAE,mBAAmB,YAAYA,EAAE,mBAAmB,gBAAgBA,EAAE,mBAAmB,SAAS,EAChH,IAAI,CAAAA,OAAM,EAAE,UAAUA,EAAE,IAAI,QAAQiW,EAAA,EAAc,GAC/CH,IAAmB1D,EAAQ;AAAA,QAAQ,CAAApS,MACvCA,EAAE,SACC,OAAO,OAAK4C,EAAE,mBAAmB,YAAYA,EAAE,mBAAmB,gBAAgBA,EAAE,mBAAmB,SAAS,EAChH,IAAI,CAAAA,OAAM,EAAE,WAAWA,EAAE,IAAI,QAAQqT,EAAA,EAAc;AAAA,MAAA;AAGxD,OAAIJ,EAAgB,SAAS,KAAKC,EAAiB,SAAS,MAC1D,MAAMne,EAAS,QAAQ,cAAcwF,GAAU6W,EAAY,eAAe;AAAA,QACxE,SAAS6B,EAAgB,SAAS,IAAIA,IAAkB;AAAA,QACxD,UAAUC,EAAiB,SAAS,IAAIA,IAAmB;AAAA,MAAA,CAC5D,GAGHzB,EAAW1f,EAAE,+CAA+C,sBAAsB,CAAC,GACnFsf,IAAA,GACA,WAAW,MAAMzI,EAAA,GAAW,GAAI;AAAA,IAClC,SAAS5T,GAAK;AACZ,MAAAX,EAASW,aAAe,QAAQA,EAAI,UAAU,iBAAiB;AAAA,IACjE,UAAA;AACE,MAAAuc,EAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAeMtb,KAbW,MAAM;AACrB,UAAM4O,IAAe2K,EAAQ,QACvB8D,IAAiB9D,EAAQ,OAAO,CAAApS,OAAKA,GAAE,SAAS,EAAE,QAClD2H,IAAgByK,EAAQ,OAAO,CAACtZ,IAAKkH,OAAMlH,KAAMkH,GAAE,SAAS,QAAQ,CAAC,GACrEmW,IAAkB/D,EAAQ,OAAO,CAACtZ,IAAKkH,OAAMlH,KAAMkH,GAAE,SAAS,OAAO,CAAA4C,OAAKA,GAAE,SAAS,EAAE,QAAQ,CAAC,GAChGwT,IAAiBhE,EAAQ,OAAO,QAAKpS,GAAE,WAAW,WAAW,EAAE,QAC/DqW,IAAcjE,EAAQ,OAAO,CAAApS,OAAKA,GAAE,WAAW,YAAYA,GAAE,WAAW,YAAY,EAAE,QACtFsW,KAAelE,EAAQ,OAAO,QAAKpS,GAAE,WAAW,SAAS,EAAE,QAC3DuW,KAA0BnE,EAAQ,OAAO,CAAApS,OAAKqV,EAAmBrV,GAAE,gBAAgBA,GAAE,SAAS,CAAC,EAAE,QACjGwW,KAA2BpE,EAAQ,OAAO,CAACtZ,IAAKkH,OAAMlH,KAAMkH,GAAE,SAAS,OAAO,CAAA4C,OAAKyS,EAAmBzS,GAAE,gBAAgBA,GAAE,SAAS,CAAC,EAAE,QAAQ,CAAC;AACrJ,WAAO,EAAE,cAAA6E,GAAc,gBAAAyO,GAAgB,eAAAvO,GAAe,iBAAAwO,GAAiB,gBAAAC,GAAgB,aAAAC,GAAa,cAAAC,IAAc,yBAAAC,IAAyB,0BAAAC,GAAA;AAAA,EAC7I,GAEc;AAyBd,SAtBAriB,GAAU,MAAM;AACd,UAAMsiB,IAAe,CAACjc,MAAqB;AACzC,MAAIA,EAAE,QAAQ,YAAYuZ,KACxBvI,EAAA;AAAA,IAEJ;AACA,oBAAS,iBAAiB,WAAWiL,CAAY,GAC1C,MAAM,SAAS,oBAAoB,WAAWA,CAAY;AAAA,EACnE,GAAG,CAAC1C,GAAQvI,CAAO,CAAC,GAGpBrX,GAAU,OACJ4f,IACF,SAAS,KAAK,MAAM,WAAW,WAE/B,SAAS,KAAK,MAAM,WAAW,IAE1B,MAAM;AACX,aAAS,KAAK,MAAM,WAAW;AAAA,EACjC,IACC,CAACA,CAAM,CAAC,GAENA,IAGH,gBAAAzZ,EAAC,OAAA,EAAI,WAAU,2DAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAASqS;AAAA,QACT,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAIb,gBAAAlR,EAAC,OAAA,EAAI,WAAU,uJAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8EACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,QAAG,WAAU,oDACX,UAAAxE,EAAE,wCAAwC,kBAAkB,GAC/D;AAAA,UACA,gBAAA2F,EAAC,KAAA,EAAE,WAAU,yCACV,UAAA;AAAA,YAAA0Z,EAAY;AAAA,YAAM;AAAA,YAAIvb;AAAA,UAAA,EAAA,CACzB;AAAA,QAAA,GACF;AAAA,QACA,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASqS;AAAA,YACT,WAAU;AAAA,YAEV,UAAA,gBAAArS,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACzB,GACF;AAAA,wBAGC,OAAA,EAAI,WAAU,8BACZ,UAAA9V,IACC,gBAAAsD,EAAC,SAAI,WAAU,0CACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,EAAA,CAC3E,IAEA,gBAAAH,EAAC,OAAA,EAAI,WAAU,aAEZ,UAAA;AAAA,QAAAtD,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,UAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,mCAAA,CAAmC;AAAA,UAC1D,gBAAAtD,EAAC,KAAA,EAAE,WAAU,oCAAoC,UAAAnC,EAAA,CAAM;AAAA,QAAA,GACzD;AAAA,QAEDod,KACC,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,UAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,UAC5D,gBAAAvd,EAAC,KAAA,EAAE,WAAU,sCAAsC,UAAAib,EAAA,CAAQ;AAAA,QAAA,GAC7D;AAAA,QAIF,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,aACjB,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,oDACd,UAAAxE,EAAE,6CAA6C,aAAa,GAC7D;AAAA,UAGA,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM6a,EAAuB,MAAM;AAAA,cAC5C,WAAW,qGACTb,MAAe,SACX,oEACA,yDACN;AAAA,cAEF,UAAA;AAAA,gBAAA,gBAAAnb;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,uFACTmb,MAAe,SAAS,qCAAqC,8BAC/D;AAAA,oBAEC,UAAAA,MAAe,UACd,gBAAAnb,EAAC,OAAA,EAAI,WAAU,wDAAA,CAAwD;AAAA,kBAAA;AAAA,gBAAA;AAAA,kCAG1E,OAAA,EACC,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAE,WAAU,0CACV,UAAAxE,EAAE,6CAA6C,yBAAyB,GAC3E;AAAA,kBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,yCACV,UAAAxE;AAAA,oBACC;AAAA,oBACA;AAAA,kBAAA,EACF,CACF;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIA,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM6a,EAAuB,QAAQ;AAAA,cAC9C,WAAW,qGACTb,MAAe,WACX,oEACA,yDACN;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAAnb;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,uFACTmb,MAAe,WAAW,qCAAqC,8BACjE;AAAA,oBAEC,UAAAA,MAAe,YACd,gBAAAnb,EAAC,OAAA,EAAI,WAAU,wDAAA,CAAwD;AAAA,kBAAA;AAAA,gBAAA;AAAA,kCAG1E,OAAA,EACC,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAE,WAAU,0CACV,UAAAxE,EAAE,+CAA+C,eAAe,GACnE;AAAA,kBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,yCACV,UAAAxE;AAAA,oBACC;AAAA,oBACA;AAAA,kBAAA,EACF,CACF;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,GACF;AAAA,QAGC2f,MAAe,YACd,gBAAAha,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,oDACd,UAAAxE,EAAE,gDAAgD,2BAA2B,GAChF;AAAA,UAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0GACZ,UAAA;AAAA,YAAA8X,EAAQ,IAAI,CAAA3P,MACX,gBAAAtJ;AAAA,cAACia;AAAA,cAAA;AAAA,gBAEC,QAAA3Q;AAAA,gBACA,YAAYgS,EAAgB,IAAIhS,EAAO,EAAE;AAAA,gBACzC,YAAAsQ;AAAA,gBACA,oBAAAsC;AAAA,gBACA,qBAAA/B;AAAA,gBACA,oBAAAC;AAAA,gBACA,cAAAC;AAAA,gBACA,eAAAP;AAAA,gBACA,MAAAQ;AAAA,gBACA,GAAA9e;AAAA,cAAA;AAAA,cAVK8N,EAAO;AAAA,YAAA,CAYf;AAAA,YAEA2P,EAAQ,WAAW,KAClB,gBAAAjZ,EAAC,OAAA,EAAI,WAAU,oDACZ,UAAAxE,EAAE,4CAA4C,sBAAsB,EAAA,CACvE;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CAEF,EAAA,CAEJ;AAAA,wBAGC,OAAA,EAAI,WAAU,oFACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAAmb,MAAe,WACd,gBAAAha,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACE,UAAA;AAAA,YAAAzB,EAAM;AAAA,YAAe;AAAA,YAAEA,EAAM;AAAA,YAAa;AAAA,YAAElE,EAAE,0CAA0C,SAAS;AAAA,YAAE;AAAA,YACnG;AAAA,YAAKkE,EAAM;AAAA,YAAgB;AAAA,YAAEA,EAAM;AAAA,YAAc;AAAA,YAAElE,EAAE,2CAA2C,UAAU;AAAA,UAAA,GAC7G;AAAA,WACEkE,EAAM,0BAA0B,KAAKA,EAAM,2BAA2B,MACtE,gBAAAyB,EAAC,OAAA,EAAI,WAAU,kEACb,UAAA;AAAA,YAAA,gBAAAnB,EAACga,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,YACxBta,EAAM,0BAA0B,KAC/B,gBAAAyB,EAAC,QAAA,EAAM,UAAA;AAAA,cAAAzB,EAAM;AAAA,cAAwB;AAAA,cAAElE,EAAE,wCAAwC;AAAA,cAAE;AAAA,cAAEA,EAAE,6CAA6C,EAAE,YAAA;AAAA,YAAY,GAAE;AAAA,YAErJkE,EAAM,0BAA0B,KAAKA,EAAM,2BAA2B,KAAK;AAAA,YAC3EA,EAAM,2BAA2B,KAChC,gBAAAyB,EAAC,QAAA,EAAM,UAAA;AAAA,cAAAzB,EAAM;AAAA,cAAyB;AAAA,cAAElE,EAAE,yCAAyC;AAAA,cAAE;AAAA,cAAEA,EAAE,6CAA6C,EAAE,YAAA;AAAA,YAAY,EAAA,CAAE;AAAA,UAAA,EAAA,CAE1J;AAAA,QAAA,EAAA,CAEJ,IAEAA,EAAE,iDAAiD,yBAAyB,EAAA,CAEhF;AAAA,QACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,UAAAmZ,MAAS,cAAcrB,EAAQ,KAAK,CAAApS,MAAKA,EAAE,mBAAmB,eAAeA,EAAE,mBAAmB,aAAa,KAC9G,gBAAA1F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS0b;AAAA,cACT,UAAU9B;AAAA,cACV,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA/a,EAAC0D,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,gBAC9BlI,EAAE,iDAAiD,mBAAmB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAG3E,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASqS;AAAA,cACT,WAAU;AAAA,cAET,UAAA7W,EAAE,iBAAiB,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,UAE9B,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASyb;AAAA,cACT,UAAU7B;AAAA,cACV,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAA,IAAS,gBAAA/a,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwd,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBAClFhiB,EAAE,eAAe,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1B,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF,IAzNkB;AA2NtB;AC/sBA,SAAS8Z,GAAWC,GAA6B;AAE/C,SADU,IAAI,KAAKA,CAAI,EACd,mBAAmB,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN;AACH;AAEA,MAAMkI,KAAyB,CAAClD,MAC1BA,MAAe,aAAaA,MAAe,kBACtC,kEAEF,uEAGHmD,KAAiB,MACrB,gBAAA1d,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,EAAA,CAC3E,GAGIqc,KAA2B,CAACniB,MAChC,gBAAA2F,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,EAAA,gBAAAnB,EAAC8C,IAAA,EAAM,WAAU,qDAAA,CAAqD;AAAA,EACtE,gBAAA9C,EAAC,KAAA,EAAG,UAAAxE,EAAE,4BAA4B,EAAA,CAAE;AAAA,GACtC,GAGIoiB,KAOA;AAAA,EACJ;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,OAAO;AAAA,EAAA;AAEX;AAGA,SAASC,GAAoB;AAAA,EAC3B,qBAAAzS;AAAA,EACA,wBAAAC;AACF,GAGG;AACD,QAAM,EAAE,GAAA7P,EAAA,IAAMC,GAAe,OAAO;AAEpC,2BACG,OAAA,EAAI,WAAU,aACZ,UAAAmiB,GAAqB,IAAI,CAACE,MAAQ;AACjC,UAAMC,IAAa3S,MAAwB0S,EAAI;AAC/C,WACE,gBAAA3c;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAMkK,EAAuByS,EAAI,KAAK;AAAA,QAC/C,WAAW,sGACTC,IACI,GAAGD,EAAI,cAAc,IAAIA,EAAI,UAAU,KACvC,yDACN;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAA9d;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,uFACT+d,IAAaD,EAAI,iBAAiB,8BACpC;AAAA,cAEC,eAAc,gBAAA9d,EAAC,OAAA,EAAI,WAAW,4BAA4B8d,EAAI,KAAK,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,4BAEzE,OAAA,EACC,UAAA;AAAA,YAAA,gBAAA9d,EAAC,OAAE,WAAU,0CAA0C,UAAAxE,EAAEsiB,EAAI,QAAQ,GAAE;AAAA,8BACtE,KAAA,EAAE,WAAU,yCAAyC,UAAAtiB,EAAEsiB,EAAI,OAAO,EAAA,CAAE;AAAA,UAAA,EAAA,CACvE;AAAA,QAAA;AAAA,MAAA;AAAA,MAnBKA,EAAI;AAAA,IAAA;AAAA,EAsBf,CAAC,EAAA,CACH;AAEJ;AAEO,SAASE,GAAsB;AAAA,EACpC,UAAAha;AAAA,EACA,YAAA1E;AAAA,EACA,MAAAgb,IAAO;AAAA,EACP,cAAApQ;AAAA,EACA,aAAAE;AAAA,EACA,eAAAnN;AAAA,EACA,WAAA6W;AAAA,EACA,qBAAAmK;AAAA,EACA,qBAAAC;AAAA,EACA,mBAAA5T;AAAA,EACA,oBAAAY;AAAA,EACA,uBAAAiC;AAAA,EACA,sBAAAzC;AAAA,EACA,gBAAAE;AAAA,EACA,eAAAE;AAAA,EACA,eAAAE;AAAA,EACA,qBAAAI;AAAA,EACA,gBAAAE;AAAA,EACA,aAAAE;AAAA,EACA,qBAAAE;AAAA,EACA,oBAAAE;AAAA,EACA,qBAAAE;AAAA,EACA,gBAAAE;AAAA,EACA,sBAAAmS;AAAA,EACA,uBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,kBAAAjU;AAAA,EACA,wBAAAI;AAAA,EACA,mBAAAE;AACF,GAA6C;AAC3C,QAAM,EAAE,GAAA/P,EAAA,IAAMC,GAAe,OAAO,GAE9B0jB,KAAY1kB,GAAQ,MACjBukB,EAAA,GACN,CAACxT,GAAawT,CAAc,CAAC,GAE1B,CAAClI,IAAeC,EAAgB,IAAIhc,EAIvC,EAAE,MAAM,IAAO,KAAK,MAAM,SAAS,GAAA,CAAO,GAEvCqkB,KAAgB3kB;AAAA,IACpB,OAAOyP,KAAgB,IAAI,OAAO,CAAA6C,MAAOA,EAAI,WAAW,eAAeA,EAAI,WAAW,YAAY;AAAA,IAClG,CAAC7C,CAAY;AAAA,EAAA,GAGTmV,KAAa5kB;AAAA,IACjB,OAAOyP,KAAgB,IAAI,OAAO,CAAA6C,MAAOA,EAAI,WAAW,YAAYA,EAAI,WAAW,SAAS;AAAA,IAC5F,CAAC7C,CAAY;AAAA,EAAA,GAGToV,KAAgB,CAACvS,MAA8B;AACnD,UAAMwS,KAAoB3B,GAAqB,KAAK,OAAK4B,EAAE,UAAUzS,EAAI,WAAW,GAC9E0S,KAAW1S,EAAI,gBAAgB;AAErC,WACE,gBAAA/M;AAAA,MAACkD;AAAA,MAAA;AAAA,QAEC,QAAQ;AAAA,UACN,SAAS6J,EAAI,OAAO,GAAG,CAAC,KAAK,KAAK,YAAA;AAAA,UAClC,OAAO0S,KAAW,4BAA4B;AAAA,QAAA;AAAA,QAEhD,OAAO1S,EAAI;AAAA,QACX,UAAUA,EAAI;AAAA,QACd,aAAaA,EAAI,aACbvR,EAAE,mCAAmC,EAAE,MAAM8Z,GAAWvI,EAAI,UAAU,EAAA,CAAG,IACzE;AAAA,QAEJ,yBACG,QAAA,EACE,UAAA;AAAA,UAAAA,EAAI,uBAAuB,KAC1B,gBAAA5L,EAAAkC,IAAA,EAAE,UAAA;AAAA,YAAA,gBAAArD,EAAC,QAAA,EAAK,WAAU,kDAAkD,UAAA+M,EAAI,sBAAqB;AAAA,YAAO;AAAA,YAAEvR,EAAE,uCAAuC;AAAA,UAAA,GAAE;AAAA,UAElJuR,EAAI,oBAAoB,KACvB,gBAAA5L,EAAAkC,IAAA,EAAG,UAAA;AAAA,YAAA0J,EAAI,uBAAuB,IAAI,OAAO;AAAA,YAAG,gBAAA/M,EAAC,QAAA,EAAK,WAAU,gDAAgD,YAAI,mBAAkB;AAAA,YAAO;AAAA,YAAExE,EAAE,oCAAoC;AAAA,UAAA,GAAE;AAAA,UAEpLuR,EAAI,qBAAqB,KACxB,gBAAA5L,EAAAkC,IAAA,EAAI,UAAA;AAAA,YAAA0J,EAAI,uBAAuB,KAAKA,EAAI,oBAAoB,IAAK,OAAO;AAAA,YAAG,gBAAA/M,EAAC,QAAA,EAAK,WAAU,8CAA8C,YAAI,oBAAmB;AAAA,YAAO;AAAA,YAAExE,EAAE,qCAAqC;AAAA,UAAA,GAAE;AAAA,UAEnNuR,EAAI,yBAAyB,KAAKA,EAAI,sBAAsB,KAAKA,EAAI,uBAAuB,KAC3F,gBAAA5L,EAAAkC,IAAA,EAAE,UAAA;AAAA,YAAA,gBAAArD,EAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA,KAAC;AAAA,YAAO;AAAA,YAAE+M,EAAI;AAAA,UAAA,GAAiB;AAAA,UAE3F;AAAA,UAAKvR,EAAE,wCAAwC;AAAA,UAC/C;AAAA,UACD,gBAAAwE,EAAC,QAAA,EAAK,WAAU,0CACb,YAAI,mBACP;AAAA,UAAQ;AAAA,UACPxE,EAAE,yCAAyC;AAAA,QAAA,GAC9C;AAAA,QAEF,cACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,6DAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAI,WAAW,0CAA0Cuf,IAAmB,SAAS,cAAc,IAAI;AAAA,YACxG,gBAAAvf;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO+M,EAAI;AAAA,gBACX,UAAU;AAAK,kBAAKkR,EAAoBlR,EAAI,eAAe1L,EAAE,OAAO,KAA+B;AAAA;AAAA,gBACnG,UAAUpE,MAAkB8P,EAAI;AAAA,gBAChC,WAAU;AAAA,gBAET,UAAA6Q,GAAqB,IAAI,CAAAE,MACxB,gBAAA9d,EAAC,YAAuB,OAAO8d,EAAI,OAChC,UAAAtiB,EAAEsiB,EAAI,QAAQ,EAAA,GADJA,EAAI,KAEjB,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,GACF;AAAA,UAEA,gBAAA3c,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMsd,EAAsB1R,CAAG;AAAA,gBACxC,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAA/M,EAAC0f,IAAA,EAAkB,WAAU,UAAA,CAAU;AAAA,kBACtClkB,EAAE,uCAAuC;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAE3C0iB,KACC,gBAAAle;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM+W,GAAiB,EAAE,MAAM,IAAM,KAAAhK,GAAK,SAAS,IAAO;AAAA,gBACnE,WAAU;AAAA,gBACV,OAAOvR,EAAE,6BAA6B;AAAA,gBAEtC,UAAA,gBAAAwE,EAAC2f,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9B,EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,MAtEG5S,EAAI;AAAA,IAAA;AAAA,EA0Ef;AAEA,SACE,gBAAA5L,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAxE,EAAE,+BAA+B,GACpC;AAAA,QACA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASgd;AAAA,YACT,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAne,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cACzBjY,EAAE,0BAA0B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC/B,GACF;AAAA,MAEC4O,IAAcsT,OAAmB;AAAA,MACjC,CAACtT,MAAgB,CAACF,KAAgBA,EAAa,WAAW,KAAKyT,GAAyBniB,CAAC,IAAI;AAAA,MAG7F,CAAC4O,KAAegV,GAAc,SAAS,KACtC,gBAAAje,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,sDACX,UAAA;AAAA,UAAA3F,EAAE,uCAAuC;AAAA,UAC1C,gBAAA2F,EAAC,QAAA,EAAK,WAAU,qDAAoD,UAAA;AAAA,YAAA;AAAA,YAAEie,GAAc;AAAA,YAAO;AAAA,UAAA,EAAA,CAAC;AAAA,QAAA,GAC9F;AAAA,0BACC,OAAA,EAAI,WAAU,uEACZ,UAAAA,GAAc,IAAIE,EAAa,EAAA,CAClC;AAAA,MAAA,GACF;AAAA,MAID,CAAClV,KAAeiV,GAAW,SAAS,KACnC,gBAAAle,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,sDACX,UAAA;AAAA,UAAA3F,EAAE,oCAAoC;AAAA,UACvC,gBAAA2F,EAAC,QAAA,EAAK,WAAU,qDAAoD,UAAA;AAAA,YAAA;AAAA,YAAEke,GAAW;AAAA,YAAO;AAAA,UAAA,EAAA,CAAC;AAAA,QAAA,GAC3F;AAAA,0BACC,OAAA,EAAI,WAAU,uEACZ,UAAAA,GAAW,IAAIC,EAAa,EAAA,CAC/B;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GAEJ;AAAA,IACChV,uBACE,OAAA,EAAI,WAAU,uEACb,UAAA,gBAAAnJ,EAAC,OAAA,EAAI,WAAU,8IAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAxE,EAAE,kCAAkC,GACvC;AAAA,4BACC,KAAA,EAAE,WAAU,oCACV,UAAAA,EAAE,qCAAqC,EAAA,CAC1C;AAAA,QAAA,GACF;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASoe;AAAA,YACT,WAAU;AAAA,YACV,cAAY5iB,EAAE,gBAAgB,OAAO;AAAA,YAErC,UAAA,gBAAAwE,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACzB,GACF;AAAA,MAGA,gBAAArR,EAAC,OAAA,EAAI,WAAU,gGAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,oDACd,UAAA;AAAA,cAAA3F,EAAE,uCAAuC;AAAA,cACzCoP,EAAe,SAAS,KACvB,gBAAA5K,EAAC,UAAK,WAAU,iFACb,YAAe,OAAA,CAClB;AAAA,YAAA,GAEJ;AAAA,YACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,cAAA,gBAAAnB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAASue;AAAA,kBACT,WAAU;AAAA,kBAET,YAAE,sCAAsC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAE1C3T,EAAe,SAAS,KACvB,gBAAA5K;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAASwe;AAAA,kBACT,WAAU;AAAA,kBAET,YAAE,2CAA2C;AAAA,gBAAA;AAAA,cAAA;AAAA,YAChD,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UAGA,gBAAArd,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,YAAA,gBAAAnB,EAACuD,IAAA,EAAO,WAAU,8DAAA,CAA8D;AAAA,YAChF,gBAAAvD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOgL;AAAA,gBACP,UAAU,CAAA3J,MAAK4J,EAAiB5J,EAAE,OAAO,KAAK;AAAA,gBAC9C,aAAa7F,EAAE,8CAA8C;AAAA,gBAC7D,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,UAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA;AAAA,YAAAuJ,KACC,gBAAA1K,EAAC,SAAI,WAAU,yCACb,4BAACsB,GAAA,EAAQ,WAAU,uDAAsD,EAAA,CAC3E;AAAA,YAED,CAACoJ,KAAwBQ,KACxB,gBAAAlL,EAAC,SAAI,WAAU,mEACZ,UAAAkL,MAAuB,cACtB,gBAAA/J,EAAAkC,IAAA,EACE,UAAA;AAAA,cAAA,gBAAArD,EAAC4f,IAAA,EAAQ,WAAU,4BAAA,CAA4B;AAAA,gCAC9C,KAAA,EAAE,WAAU,yCACV,UAAApkB,EAAE,2CAA2C,GAChD;AAAA,gCACC,KAAA,EAAE,WAAU,oCACV,UAAAA,EAAE,+CAA+C,EAAA,CACpD;AAAA,YAAA,EAAA,CACF,IAEA,gBAAA2F,EAAAkC,IAAA,EACE,UAAA;AAAA,cAAA,gBAAArD,EAAC6f,IAAA,EAAc,WAAU,8BAAA,CAA8B;AAAA,gCACtD,KAAA,EAAE,WAAU,uDACV,UAAArkB,EAAE,yCAAyC,GAC9C;AAAA,gCACC,KAAA,EAAE,WAAU,oCACV,UAAAA,EAAE,6CAA6C,EAAA,CAClD;AAAA,YAAA,EAAA,CACF,EAAA,CAEJ;AAAA,YAED,CAACkP,KAAwB,CAACQ,KAAsBiC,EAAsB,WAAW,KAChF,gBAAAhM,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC8C,IAAA,EAAM,WAAU,2CAAA,CAA2C;AAAA,gCAC3D,KAAA,EAAE,WAAU,oCACV,UAAAtH,EAAE,wCAAwC,EAAA,CAC7C;AAAA,YAAA,GACF;AAAA,YAED,CAACkP,KAAwB,CAACQ,KAAsBiC,EAAsB,SAAS,KAC9EA,EAAsB,IAAI,CAAAJ,MAAO;AAC/B,oBAAMgR,KAAanT,EAAe,SAASmC,EAAI,EAAE;AACjD,qBACE,gBAAA5L;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,SAAS,MAAMmd,EAAYvR,EAAI,EAAE;AAAA,kBACjC,WAAW,yIACTgR,KAAa,oCAAoC,EACnD;AAAA,kBAEA,UAAA;AAAA,oBAAA,gBAAA/d;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAW,2EACT+d,KACI,kEACA,8BACN;AAAA,wBAEC,UAAAA,MAAc,gBAAA/d,EAACud,IAAA,EAAY,WAAU,qBAAA,CAAqB;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAE7D,gBAAApc,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,sBAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,mDAAmD,UAAA+M,EAAI,OAAM;AAAA,sBAC1E,gBAAA/M,EAAC,KAAA,EAAE,WAAU,6CACV,YAAI,KAAA,CACP;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBApBK+M,EAAI;AAAA,cAAA;AAAA,YAuBf,CAAC;AAAA,UAAA,EAAA,CAEL;AAAA,QAAA,GACF;AAAA,QAGA,gBAAA5L,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,yDACd,UAAAxE,EAAE,yCAAyC,GAC9C;AAAA,4BACC,KAAA,EAAE,WAAU,yCACV,UAAAA,EAAE,6CAA6C,GAClD;AAAA,UAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAMoK,EAAkB,MAAM;AAAA,gBACvC,WAAW,sGACTD,MAAmB,SACf,oEACA,yDACN;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAAtL;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,uFACTsL,MAAmB,SAAS,qCAAqC,8BACnE;AAAA,sBAEC,UAAAA,MAAmB,UAAU,gBAAAtL,EAAC,OAAA,EAAI,WAAU,oDAAA,CAAoD;AAAA,oBAAA;AAAA,kBAAA;AAAA,oCAElG,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,kDACV,UAAAxE,EAAE,2CAA2C,GAChD;AAAA,sCACC,KAAA,EAAE,WAAU,2CACV,UAAAA,EAAE,kDAAkD,EAAA,CACvD;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGF,gBAAA2F;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,kBAAAoK,EAAkB,QAAQ,GACtBX,EAAe,SAAS,KAAKY,EAAY,WAAW,KACtDmT,GAAkB/T,EAAe,CAAC,CAAC;AAAA,gBAEvC;AAAA,gBACA,WAAW,sGACTU,MAAmB,WACf,oEACA,yDACN;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAAtL;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,uFACTsL,MAAmB,WAAW,qCAAqC,8BACrE;AAAA,sBAEC,UAAAA,MAAmB,YAAY,gBAAAtL,EAAC,OAAA,EAAI,WAAU,oDAAA,CAAoD;AAAA,oBAAA;AAAA,kBAAA;AAAA,oCAEpG,OAAA,EACC,UAAA;AAAA,oBAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,kDACV,UAAAxE,EAAE,6CAA6C,GAClD;AAAA,sCACC,KAAA,EAAE,WAAU,2CACV,UAAAA,EAAE,oDAAoD,EAAA,CACzD;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACF,GACF;AAAA,UAGC8P,MAAmB,YAClB,gBAAAnK,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,YAAAyJ,EAAe,WAAW,KACzB,gBAAA5K,EAAC,KAAA,EAAE,WAAU,qDACV,UAAAxE,EAAE,2CAA2C,EAAA,CAChD;AAAA,YAEDoP,EAAe,SAAS,KAAKgB,KAC5B,gBAAA5L,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,GAC3E;AAAA,YAEDsJ,EAAe,SAAS,KAAK,CAACgB,KAC7B,gBAAAzK,EAAAkC,IAAA,EACG,UAAA;AAAA,cAAAuH,EAAe,SAAS,KACvB,gBAAA5K,EAAC,KAAA,EAAE,WAAU,+BACV,UAAAxE,EAAE,6CAA6C,EAAA,CAClD;AAAA,cAEF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,kBAAAge,GAAU;AAAA,kBAAgB;AAAA,kBAAEA,GAAU;AAAA,kBAAc;AAAA,kBACpD3jB,EAAE,wCAAwC;AAAA,kBAAE;AAAA,kBAC5C;AAAA,kBAAK2jB,GAAU;AAAA,kBAAiB;AAAA,kBAAEA,GAAU;AAAA,kBAAe;AAAA,kBAC3D3jB,EAAE,yCAAyC;AAAA,gBAAA,GAC9C;AAAA,gBACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,kBAAA,gBAAAnB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAASif;AAAA,sBACT,WAAU;AAAA,sBAET,YAAE,6CAA6C;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEjDE,GAAU,mBAAmB,KAC5B,gBAAAnf;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAASkf;AAAA,sBACT,WAAU;AAAA,sBAET,YAAE,yCAAyC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC9C,EAAA,CAEJ;AAAA,cAAA,GACF;AAAA,cACA,gBAAA/d,EAAC,OAAA,EAAI,WAAU,4FACZ,UAAA;AAAA,gBAAAqK,EAAY,IAAI,CAAAlC,MAAU;AACzB,wBAAMiR,KAAawE,EAA0BzV,CAAM,GAC7C4Q,KAAaxO,EAAoB,IAAIpC,EAAO,EAAE,GAC9CwW,IAAQpE,IACRqE,IAAazW,EAAO,OAAOwW,EAAMxW,EAAO,IAAI,IAAI;AAEtD,yBACE,gBAAAnI,EAAC,OAAA,EAAoB,WAAU,yDAC7B,UAAA;AAAA,oBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,sBAAA,gBAAAnB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAM4e,EAAyBtV,EAAO,EAAE;AAAA,0BACjD,WAAU;AAAA,0BAET,UAAA4Q,uBACE1W,IAAA,EAAY,WAAU,oCAAmC,IAE1D,gBAAAxD,EAACya,IAAA,EAAa,WAAU,mCAAA,CAAmC;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAI/D,gBAAAtZ;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAM0d,EAAmBvV,EAAO,EAAE;AAAA,0BAC3C,WAAW,6FAA6FmU,GAAuBlD,EAAU,CAAC;AAAA,0BAEzI,UAAA;AAAA,4BAAAA,OAAe,aAAa,gBAAAva,EAACwY,IAAA,EAAM,WAAU,0BAAyB;AAAA,4BACtE+B,OAAe,mBAAmB,gBAAAva,EAAC0a,IAAA,EAAM,WAAU,yBAAA,CAAyB;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAG/E,gBAAA1a,EAAC,OAAA,EAAI,WAAU,uCACZ,cACC,gBAAAA,EAAC+f,GAAA,EAAW,WAAU,mCAAA,CAAmC,IAEzD,gBAAA/f,EAACsC,IAAA,EAAO,WAAU,oCAAmC,GAEzD;AAAA,sBAEA,gBAAAtC,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA,gBAAAA,EAAC,OAAE,WAAU,2DAA2D,UAAAsJ,EAAO,MAAA,CAAM,EAAA,CACvF;AAAA,oBAAA,GACF;AAAA,oBAEC4Q,MAAc5Q,EAAO,SAAS,SAAS,KACtC,gBAAAtJ,EAAC,OAAA,EAAI,WAAU,mDACZ,UAAAsJ,EAAO,SAAS,IAAI,CAAAwE,MAAW;AAC9B,4BAAMkS,KAAclS,EAAQ,OAAOgS,EAAMhS,EAAQ,IAAI,IAAI;AACzD,6BACE,gBAAA3M,EAAC,OAAA,EAAqB,WAAU,oEAC9B,UAAA;AAAA,wBAAA,gBAAAnB;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS,MAAM8e,GAAoBxV,EAAO,IAAIwE,EAAQ,EAAE;AAAA,4BACxD,WAAW,iGACTA,EAAQ,aACJ,kEACA,qEACN;AAAA,4BAEC,UAAAA,EAAQ,cAAc,gBAAA9N,EAACwY,IAAA,EAAM,WAAU,qBAAA,CAAqB;AAAA,0BAAA;AAAA,wBAAA;AAAA,wBAG/D,gBAAAxY,EAAC,OAAA,EAAI,WAAU,yCACZ,eACC,gBAAAA,EAACggB,IAAA,EAAY,WAAU,mCAAA,CAAmC,IAE1D,gBAAAhgB,EAACsC,IAAA,EAAO,WAAU,oCAAmC,GAEzD;AAAA,wBAEA,gBAAAtC,EAAC,QAAA,EAAK,WAAU,+CAA+C,YAAQ,MAAA,CAAM;AAAA,sBAAA,EAAA,GArBrE8N,EAAQ,EAsBlB;AAAA,oBAEJ,CAAC,EAAA,CACH;AAAA,kBAAA,EAAA,GAlEMxE,EAAO,EAoEjB;AAAA,gBAEJ,CAAC;AAAA,gBAEAkC,EAAY,WAAW,KACtB,gBAAAxL,EAAC,OAAE,WAAU,oDACV,UAAAxE,EAAE,0CAA0C,EAAA,CAC/C;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GAEJ;AAAA,QAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,yDACd,UAAAxE,EAAE,wCAAwC,GAC7C;AAAA,4BACC,KAAA,EAAE,WAAU,yCACV,UAAAA,EAAE,4CAA4C,GACjD;AAAA,UACA,gBAAAwE;AAAA,YAAC6d;AAAA,YAAA;AAAA,cACC,qBAAAzS;AAAA,cACA,wBAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAGA,gBAAAlK,EAAC,OAAA,EAAI,WAAU,sHACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAE,WAAU,oCACV,UAAA4K,EAAe,SAAS,IACrBpP,EAAE,4CAA4C,EAAE,OAAOoP,EAAe,OAAA,CAAQ,IAC9EpP,EAAE,wCAAwC,GAChD;AAAA,QACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASoe;AAAA,cACT,WAAU;AAAA,cAET,YAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,gBAAAjd;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASkd;AAAA,cACT,UAAUzT,EAAe,WAAW,KAAKE;AAAA,cACzC,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAA,IAAgB,gBAAA9K,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBACzFjY,EAAE,mCAAmC;AAAA,gBACrCoP,EAAe,SAAS,KAAK,KAAKA,EAAe,MAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1D,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAIDoB,KACC,gBAAAhM;AAAA,MAAC2a;AAAA,MAAA;AAAA,QACC,aAAa3O;AAAA,QACb,UAAAhI;AAAA,QACA,YAAA1E;AAAA,QACA,QAAQwM;AAAA,QACR,SAAS4S;AAAA,QACT,MAAApE;AAAA,QACA,SAAS,YAAY;AACnB,gBAAMxG,EAAA,GACN4K,GAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAKH5H,GAAc,OACb,gBAAA9W;AAAA,MAAC8D;AAAA,MAAA;AAAA,QACC,QAAQgT,GAAc;AAAA,QACtB,OAAOtb,EAAE,0CAA0C;AAAA,QACnD,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAG,YAAE,8CAA8C,EAAE,MAAM8W,GAAc,IAAI,MAAA,CAAO,EAAA,CAAE;AAAA,UACvF,gBAAA3V,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,uDACV,UAAAxE,EAAE,gDAAgD,GACrD;AAAA,YACA,gBAAA2F,EAAC,MAAA,EAAG,WAAU,kDACZ,UAAA;AAAA,cAAA,gBAAAnB,EAAC,MAAA,EACE,YAAE,oDAAoD;AAAA,gBACrD,OAAO8W,GAAc,IAAI;AAAA,cAAA,CAC1B,GACH;AAAA,cACA,gBAAA9W,EAAC,MAAA,EACE,UAAAxE,EAAE,qDAAqD;AAAA,gBACtD,OAAOsb,GAAc,IAAI;AAAA,cAAA,CAC1B,EAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAEF,SAAQ;AAAA,QACR,cAActb,EAAE,6BAA6B;AAAA,QAC7C,SAASsb,GAAc;AAAA,QACvB,WAAW,YAAY;AACrB,cAAI,GAACoH,KAAuB,CAACpH,GAAc,MAC3C;AAAA,YAAAC,GAAiB,QAAS,EAAE,GAAGjY,GAAM,SAAS,KAAO;AACrD,gBAAI;AACF,oBAAMof,EAAoBpH,GAAc,IAAI,aAAa;AAAA,YAC3D,UAAA;AACE,cAAAC,GAAiB,EAAE,MAAM,IAAO,KAAK,MAAM,SAAS,IAAO;AAAA,YAC7D;AAAA;AAAA,QACF;AAAA,QACA,UAAU,MAAMA,GAAiB,EAAE,MAAM,IAAO,KAAK,MAAM,SAAS,GAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAC7E,GAEJ;AAEJ;ACnzBA,MAAMkJ,KAAa,CAAC,YAAY,WAAW,UAAU,SAAS,gBAAgB,UAAU,GAGlF/kB,KAA+F;AAAA,EACnG,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAAA,EAEf,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAAA,EAEf,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAAA,EAEf,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;AAEO,SAASglB,KAAiC;AAC/C,QAAM,EAAE,GAAA1kB,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1C,EAAE,IAAIuI,EAAA,IAAamc,GAAA,GACnBzkB,IAAWC,GAAA,GACX,EAAE,WAAAykB,GAAW,cAAAC,EAAA,IAAiBC,GAA0B,YAAYL,EAAU,GAE9E,EAAE,gBAAAhkB,GAAgB,eAAAF,EAAA,IAAkBG,GAAA,GACpC,EAAE,aAAAqkB,EAAA,IAAgBC,GAAA,GAGlBC,IAAe1c,GAAgBC,CAAQ,GACvC0c,IAAgB3b,GAAiBf,CAAQ,GACzC2c,IAAehZ,GAAgB3D,CAAQ,GACvC4c,IAA4BtiB,EAAY,MAAM;AAElD,IAAIvC,KAAiBiI,MAAajI,EAAc,MAC9CwkB,EAAA;AAAA,EAEJ,GAAG,CAACxkB,GAAeiI,GAAUuc,CAAW,CAAC,GAEnCM,IAAmBpmB,GAAQ,OAAO;AAAA,IACtC,uBAAuBmmB;AAAA,EAAA,IACrB,CAACA,CAAyB,CAAC,GAEzBE,IAAqB9W,GAAsBhG,GAAU6c,CAAgB,GACrEE,IAAcrP,GAAe1N,CAAQ,GACrCgd,IAAqBlS,GAAsB9K,CAAQ,GACnDid,IAAiBC,GAAkB,UAAUld,CAAS,GAGtD,CAAC/G,GAAeC,CAAgB,IAAInC,EAAwB,IAAI,GAChE,CAAComB,GAAcC,CAAe,IAAIrmB,EAMrC;AAAA,IACD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW,MAAM;AAAA,IAAC;AAAA,EAAA,CACnB,GAGK,CAACsmB,GAAYC,CAAa,IAAIvmB,EAAsB,oBAAI,KAAK;AAGnE,EAAAC,GAAU,MAAM;AACd,QAAI,CAACgJ,GAAU;AACb,MAAAtI,EAAS,yBAAyB;AAClC;AAAA,IACF;AACA,IAAA+kB,EAAa,WAAA;AAAA,EACf,GAAG,CAACzc,CAAQ,CAAC,GAGbhJ,GAAU,MAAM;AACd,QAAI,CAACgJ,KAAYqd,EAAW,IAAIjB,CAAS,EAAG;AA8B5C,KA5BoB,YAAY;AAC9B,cAAQA,GAAA;AAAA,QACN,KAAK;AAEH,UAAKiB,EAAW,IAAI,SAAS,MAC3B,MAAMX,EAAc,YAAA,GACpBY,EAAc,OAAQ,IAAI,IAAIxiB,CAAI,EAAE,IAAI,SAAS,CAAC;AAEpD;AAAA,QACF,KAAK;AACH,gBAAM4hB,EAAc,YAAA;AACpB;AAAA,QACF,KAAK;AACH,gBAAMC,EAAa,WAAA;AACnB;AAAA,QACF,KAAK;AACH,gBAAMI,EAAY,UAAA;AAClB;AAAA,QACF,KAAK;AACH,gBAAMD,EAAmB,iBAAA;AACzB;AAAA,QACF,KAAK;AACH,gBAAMG,EAAe,aAAA;AACrB;AAAA,MAAA;AAEJ,MAAAK,EAAc,OAAQ,IAAI,IAAIxiB,CAAI,EAAE,IAAIshB,CAAS,CAAC;AAAA,IACpD,GAEA;AAAA,EACF,GAAG,CAACA,GAAWpc,CAAQ,CAAC;AAExB,QAAMud,IAAqB,OAAOC,MAA4B;AAI5D,QAHI,CAACf,EAAa,UAEIA,EAAa,OAAO,WACpBe,EAAW;AAEjC,UAAMC,KAA+C;AAAA,MACnD,QAAQjmB,EAAE,+BAA+B;AAAA,MACzC,WAAWA,EAAE,8BAA8B;AAAA,MAC3C,UAAUA,EAAE,8BAA8B;AAAA,MAC1C,SAASA,EAAE,8BAA8B;AAAA,IAAA;AAG3C,IAAA4lB,EAAgB;AAAA,MACd,MAAM;AAAA,MACN,OAAO5lB,EAAE,gBAAgB;AAAA,MACzB,SAASimB,GAAeD,CAAS;AAAA,MACjC,SAASA,MAAc,aAAa,WAAW;AAAA,MAC/C,WAAW,YAAY;AACrB,QAAAtkB,EAAiBskB,CAAS;AAC1B,YAAI;AACF,UAAIA,MAAc,WAChB,MAAMhjB,EAAS,QAAQ,SAASiiB,EAAa,OAAQ,EAAE,IAC9Ce,MAAc,cACvB,MAAMhjB,EAAS,QAAQ,QAAQiiB,EAAa,OAAQ,EAAE,IAC7Ce,MAAc,cACvB,MAAMhjB,EAAS,QAAQ,QAAQiiB,EAAa,OAAQ,EAAE,GAExD,MAAMxkB,EAAA,GACN,MAAMwkB,EAAa,WAAA;AAAA,QACrB,SAAS5iB,IAAO;AACd,kBAAQ,MAAM,mCAAmCA,EAAK;AAAA,QACxD,UAAA;AACE,UAAAX,EAAiB,IAAI,GACrBkkB,EAAgB,EAAE,GAAGD,GAAc,MAAM,IAAO;AAAA,QAClD;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH,GAEMO,IAAgB,YAAY;AAChC,IAAAxkB,EAAiB,SAAS;AAC1B,QAAI;AACF,YAAMykB,IAA4B,CAAClB,EAAa,YAAY;AAC5D,cAAQL,GAAA;AAAA,QACN,KAAK;AACH,UAAAuB,EAAS,KAAKjB,EAAc,aAAa;AACzC;AAAA,QACF,KAAK;AACH,UAAAiB,EAAS,KAAKjB,EAAc,aAAa;AACzC;AAAA,QACF,KAAK;AACH,UAAAiB,EAAS,KAAKhB,EAAa,YAAY;AACvC;AAAA,QACF,KAAK;AACH,UAAAgB,EAAS,KAAKZ,EAAY,WAAW;AACrC;AAAA,QACF,KAAK;AACH,UAAAY,EAAS,KAAKb,EAAmB,kBAAkB;AACnD;AAAA,QACF,KAAK;AACH,UAAAa,EAAS,KAAKV,EAAe,cAAc;AAC3C;AAAA,MAAA;AAEJ,YAAM,QAAQ,IAAIU,CAAQ;AAAA,IAC5B,UAAA;AACE,MAAAzkB,EAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,MAAIujB,EAAa;AACf,6BACG,OAAA,EAAI,WAAU,qDACb,UAAA,gBAAAtf,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsB,GAAA,EAAQ,WAAU,iEAAA,CAAiE;AAAA,wBACnF,KAAA,EAAE,WAAU,gCAAgC,UAAA9F,EAAE,gBAAgB,EAAA,CAAE;AAAA,IAAA,EAAA,CACnE,EAAA,CACF;AAIJ,MAAI,CAACilB,EAAa;AAChB,WACE,gBAAAtf,EAAC,OAAA,EAAI,WAAU,OACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAACmD;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,YACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,UAA+B;AAAA,QAC1E;AAAA,MAAA;AAAA,wBAED,OAAA,EAAI,WAAU,kGACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,0BAClC,QAAA,EAAM,UAAAY,EAAa,SAASjlB,EAAE,wBAAwB,EAAA,CAAE;AAAA,MAAA,EAAA,CAC3D,EAAA,CACF;AAAA,IAAA,GACF;AAIJ,QAAMwD,IAASyhB,EAAa,QACtBre,IAAelH,GAAc8D,EAAO,MAAM,GAC1C4iB,IAAgB,CAACvhB,MAAyB;AAC9C,YAAQA,GAAA;AAAA,MACN,KAAK;AAAU,eAAO,gBAAAL,EAAC2B,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,MACtD,KAAK;AAAa,eAAO,gBAAA3B,EAAC4B,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,MAC1D,KAAK;AAAY,eAAO,gBAAA5B,EAAC6B,IAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,MACrD;AAAS,eAAO,gBAAA7B,EAACS,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,IAAA;AAAA,EAEnD;AAEA,SACE,gBAAAU,EAAC,OAAA,EAAI,WAAU,iBAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,UACzC,EAAE,OAAOwD,EAAO,KAAA;AAAA,QAAK;AAAA,MACvB;AAAA,IAAA;AAAA,IAIF,gBAAAmC,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMtE,EAAS,yBAAyB;AAAA,YACjD,WAAU;AAAA,YAEV,UAAA,gBAAAsE,EAAC6hB,IAAA,EAAU,WAAU,uCAAA,CAAuC;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9D,gBAAA1gB,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,4DAA4D,UAAAhB,EAAO,MAAK;AAAA,UACtF,gBAAAgB,EAAC,KAAA,EAAE,WAAU,qDAAqD,YAAO,KAAA,CAAK;AAAA,QAAA,EAAA,CAChF;AAAA,MAAA,GACF;AAAA,MACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,QAAA,EAAK,WAAW,2EAA2EiB,EAAa,OAAO,IAAIA,EAAa,KAAK,WAAWA,EAAa,WAAW,IACtK,UAAA;AAAA,UAAAwf,EAAc5iB,EAAO,MAAM;AAAA,UAC3BxD,EAAE,wBAAwBwD,EAAO,OAAO,YAAA,CAAa,EAAE;AAAA,QAAA,GAC1D;AAAA,0BACC,QAAA,EAAK,WAAW,mDACfA,EAAO,SAAS,aACZ,gDACA,iDACN,IACG,YAAE,sBAAsBA,EAAO,KAAK,YAAA,CAAa,EAAE,GACtD;AAAA,QACCA,EAAO,WAAW,YAAYA,EAAO,WAAW,cAC/C,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMogB,EAAmB,QAAQ;AAAA,YAC1C,UAAUtkB,MAAkB;AAAA,YAC5B,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,MAAkB,6BAAYqE,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAAC2B,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,cAC5GnG,EAAE,gCAAgC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGtCwD,EAAO,WAAW,YACjB,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMogB,EAAmB,WAAW;AAAA,YAC7C,UAAUtkB,MAAkB;AAAA,YAC5B,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,MAAkB,gCAAeqE,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAAC4B,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,cAChHpG,EAAE,+BAA+B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGtC,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMtE,EAAS,2BAA2BsI,CAAQ,WAAW;AAAA,YACtE,WAAU;AAAA,YACV,OAAOxI,EAAE,8BAA8B;AAAA,YAEvC,UAAA,gBAAAwE,EAACkT,IAAA,EAAS,WAAU,uCAAA,CAAuC;AAAA,UAAA;AAAA,QAAA;AAAA,QAE7D,gBAAAlT;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS0hB;AAAA,YACT,UAAUzkB,MAAkB;AAAA,YAC5B,WAAU;AAAA,YACV,OAAOzB,EAAE,gBAAgB;AAAA,YAEzB,UAAA,gBAAAwE,EAACoV,MAAU,WAAW,WAAWnY,MAAkB,YAAY,iBAAiB,EAAE,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MACxF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGCwjB,EAAa,SACZ,gBAAAzgB,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAA7f,EAAC,QAAA,EAAM,UAAAygB,EAAa,MAAA,CAAM;AAAA,IAAA,EAAA,CAC5B,EAAA,CACF;AAAA,IAIF,gBAAAzgB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAAC,SAAI,WAAU,qBACZ,UAAAigB,GAAW,IAAI,CAAA6B,MACd,gBAAA9hB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMqgB,EAAayB,CAAG;AAAA,QAC/B,WAAW,0CACT1B,MAAc0B,IACV,8DACA,kFACN;AAAA,QAEC,UAAAtmB,EAAE,sBAAsBsmB,CAAG,EAAE;AAAA,MAAA;AAAA,MARzBA;AAAA,IAAA,CAUR,GACH,EAAA,CACF;AAAA,sBAGC,OAAA,EACE,UAAA;AAAA,MAAA1B,MAAc,cACb,gBAAApgB;AAAA,QAAC4T;AAAA,QAAA;AAAA,UACC,QAAA5U;AAAA,UACA,cAAc,MAAM;AAClB,kBAAM+iB,IAAQrB,EAAc,SAAS,KAAK,CAAA7Z,MAAKA,EAAE,OAAO;AACxD,mBAAOkb,IAAQ,EAAE,iBAAiBA,EAAM,mBAAmB,QAAW,WAAWA,EAAM,aAAa,OAAA,IAAc;AAAA,UACpH,GAAA;AAAA,UACA,cAAc7mB;AAAA,UACd,eAAA+B;AAAA,UACA,WAAWykB;AAAA,UACX,aAAajB,EAAa;AAAA,UAC1B,gBAAgB,CAACrhB,MAAW;AAM1B,YAAAmiB,EALgD;AAAA,cAC9C,UAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,YAAA,EAEkBniB,CAAM,CAAC;AAAA,UACtC;AAAA,UACA,mBAAmB,MAAMihB,EAAa,SAAS;AAAA,UAC/C,gBAAgBW,EAAmB;AAAA,UACnC,aAAaA,EAAmB;AAAA,QAAA;AAAA,MAAA;AAAA,MAInCZ,MAAc,aACb,gBAAApgB;AAAA,QAACwV;AAAA,QAAA;AAAA,UACC,UAAAxR;AAAA,UACA,SAAS0c,EAAc;AAAA,UACvB,gBAAgBA,EAAc;AAAA,UAC9B,eAAAzjB;AAAA,UACA,WAAWyjB,EAAc;AAAA,UACzB,gBAAgBA,EAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAIjCN,MAAc,YACb,gBAAApgB;AAAA,QAAC4W;AAAA,QAAA;AAAA,UACC,UAAA5S;AAAA,UACA,QAAQ2c,EAAa;AAAA,UACrB,eAAeA,EAAa;AAAA,UAC5B,iBAAiBA,EAAa;AAAA,UAC9B,WAAWA,EAAa;AAAA,UACxB,eAAeA,EAAa;AAAA,QAAA;AAAA,MAAA;AAAA,MAI/BP,MAAc,WACb,gBAAApgB;AAAA,QAAC0Y;AAAA,QAAA;AAAA,UACC,OAAOqI,EAAY;AAAA,UACnB,cAAcA,EAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAI7BX,MAAc,kBACb,gBAAApgB;AAAA,QAACge;AAAA,QAAA;AAAA,UACC,UAAAha;AAAA,UACA,YAAYhF,EAAO;AAAA,UACnB,cAAc8hB,EAAmB;AAAA,UACjC,aAAaA,EAAmB;AAAA,UAChC,eAAA7jB;AAAA,UACA,WAAW6jB,EAAmB;AAAA,UAC9B,qBAAqBA,EAAmB;AAAA,UACxC,qBAAqBA,EAAmB;AAAA,UAExC,mBAAmBA,EAAmB;AAAA,UACtC,oBAAoBA,EAAmB;AAAA,UACvC,uBAAuBA,EAAmB;AAAA,UAC1C,sBAAsBA,EAAmB;AAAA,UACzC,gBAAgBA,EAAmB;AAAA,UACnC,eAAeA,EAAmB;AAAA,UAClC,eAAeA,EAAmB;AAAA,UAClC,qBAAqBA,EAAmB;AAAA,UACxC,gBAAgBA,EAAmB;AAAA,UACnC,aAAaA,EAAmB;AAAA,UAChC,qBAAqBA,EAAmB;AAAA,UACxC,oBAAoBA,EAAmB;AAAA,UAEvC,qBAAqBA,EAAmB;AAAA,UACxC,gBAAgBA,EAAmB;AAAA,UAEnC,sBAAsBA,EAAmB;AAAA,UACzC,uBAAuB,MAAM;AAC3B,YAAAA,EAAmB,qBAAqB,EAAK,GAC7CA,EAAmB,kBAAkB,EAAE,GACvCA,EAAmB,iBAAiB,EAAE,GACtCA,EAAmB,uBAAuB,YAAY,GACtDA,EAAmB,kBAAkB,MAAM,GAC3CA,EAAmB,eAAe,EAAE,GACpCA,EAAmB,uBAAuB,oBAAI,KAAK;AAAA,UACrD;AAAA,UACA,sBAAsBA,EAAmB;AAAA,UACzC,aAAaA,EAAmB;AAAA,UAChC,iBAAiBA,EAAmB;AAAA,UACpC,qBAAqBA,EAAmB;AAAA,UACxC,uBAAuBA,EAAmB;AAAA,UAC1C,wBAAwBA,EAAmB;AAAA,UAE3C,mBAAmBA,EAAmB;AAAA,UACtC,0BAA0BA,EAAmB;AAAA,UAC7C,oBAAoBA,EAAmB;AAAA,UACvC,qBAAqBA,EAAmB;AAAA,UACxC,2BAA2BA,EAAmB;AAAA,UAC9C,gBAAgBA,EAAmB;AAAA,UACnC,wBAAwBA,EAAmB;AAAA,UAC3C,oBAAoBA,EAAmB;AAAA,UAEvC,kBAAkBA,EAAmB;AAAA,UACrC,wBAAwBA,EAAmB;AAAA,UAC3C,mBAAmBA,EAAmB;AAAA,QAAA;AAAA,MAAA;AAAA,MAIzCV,MAAc,cACb,gBAAApgB;AAAA,QAACgiB;AAAA,QAAA;AAAA,UACC,UAAUf,EAAe;AAAA,UACzB,SAASA,EAAe;AAAA,UACxB,UAAU,MAAMA,EAAe,aAAA;AAAA,QAAa;AAAA,MAAA;AAAA,IAC9C,GAEJ;AAAA,IAGCD,EAAmB,oBAClB,gBAAAhhB,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,qDACX,UAAAxE,EAAE,sCAAsC,GAC3C;AAAA,wBACC,KAAA,EAAE,WAAU,qCACV,UAAAA,EAAE,4CAA4C,GACjD;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASghB,EAAmB;AAAA,YAC5B,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAAhhB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AACb,cAAAghB,EAAmB,iBAAA,GACnBP,EAAa,WAAA;AAAA,YACf;AAAA,YACA,UAAUO,EAAmB;AAAA,YAC7B,WAAU;AAAA,YAET,YAAmB,aAAaxlB,EAAE,gBAAgB,IAAIA,EAAE,iCAAiC;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5F,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAID2lB,EAAa,QACZ,gBAAAnhB;AAAA,MAAC8D;AAAA,MAAA;AAAA,QACC,OAAOqd,EAAa;AAAA,QACpB,SAASA,EAAa;AAAA,QACtB,SAASA,EAAa;AAAA,QACtB,QAAQA,EAAa;AAAA,QACrB,WAAW,MAAM;AACf,UAAAA,EAAa,UAAA;AAAA,QACf;AAAA,QACA,UAAU,MAAM;AACd,UAAAC,EAAgB,EAAE,GAAGD,GAAc,MAAM,IAAO;AAAA,QAClD;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;AClfA,MAAMc,KAAiG;AAAA,EACrG,EAAE,OAAO,WAAW,OAAO,oBAAoB,SAAS,KAAA;AAAA,EACxD,EAAE,OAAO,OAAO,OAAO,YAAY,SAAS,KAAA;AAAA,EAC5C,EAAE,OAAO,SAAS,OAAO,kBAAkB,SAAS,KAAA;AAAA,EACpD,EAAE,OAAO,SAAS,OAAO,kBAAkB,SAAS,KAAA;AAAA,EACpD,EAAE,OAAO,OAAO,OAAO,qBAAqB,SAAS,KAAA;AAAA,EACrD,EAAE,OAAO,OAAO,OAAO,YAAY,SAAS,KAAA;AAAA,EAC5C,EAAE,OAAO,OAAO,OAAO,mBAAmB,SAAS,KAAA;AAAA,EACnD,EAAE,OAAO,SAAS,OAAO,SAAS,SAAS,GAAA;AAC7C;AAIA,SAASC,GAAqBC,GAAwC;AACpE,SAAOA,MAAgB,QAAQ,aAAa;AAC9C;AAEA,SAASC,GAA4B3Q,GAAgE;AACnG,SAAKA,EAAO,aACPA,EAAO,WACL,cAFuB;AAGhC;AAEA,SAAS4Q,GACPC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAA0B,IACC;AAC3B,SAAO;AAAA,IACL,MAAMhB;AAAA,IACN,WAAWC,KAAgB;AAAA,IAC3B,aAAaC;AAAA,IACb,wBAAwBC;AAAA,IACxB,oBAAoBC;AAAA,IACpB,WAAWC,KAAgB;AAAA,IAC3B,SAAS;AAAA,MACP,QAAQC;AAAA,MACR,SAASC,KAAe;AAAA,MACxB,YAAYC;AAAA,MACZ,MAAMC;AAAA,MACN,OAAOC,KAAa;AAAA,MACpB,SAASC;AAAA,MACT,aAAaC;AAAA,IAAA;AAAA,IAEf,OAAOC,KAAY;AAAA,IACnB,OAAOC,KAAY;AAAA,IACnB,SAASC,KAAc;AAAA,IACvB,gBAAgBC,KAAkB;AAAA,EAAA;AAEtC;AAEO,SAASC,KAAiC;AAC/C,QAAM,EAAE,GAAA/nB,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1CC,IAAWC,GAAA,GACX,CAACC,CAAY,IAAIE,GAAA,GACjB,EAAE,gBAAAG,EAAA,IAAmBC,GAAA,GACrBimB,IAAcvmB,EAAa,IAAI,MAAM,GACrC4nB,IAAwB5nB,EAAa,IAAI,gBAAgB,GAEzD,CAAC6nB,GAAWC,CAAY,IAAI3oB,EAAyB,IAAI,GACzD,CAAC4oB,GAAWC,CAAY,IAAI7oB,EAAyB,IAAI,GACzD,CAAC8oB,GAAYC,CAAa,IAAI/oB,EAAqBmnB,GAAqBC,CAAW,CAAC,GACpF,CAAC4B,GAAkBC,CAAmB,IAAIjpB,EAA2ByoB,IAAwB,aAAa,MAAM,GAChH,CAAC9mB,GAASC,CAAU,IAAI5B,EAAS,EAAK,GACtC,CAACkpB,GAAeC,CAAgB,IAAInpB,EAAS,EAAI,GACjD,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkV,GAAeC,CAAgB,IAAInV,EAAS,EAAK,GAClD,CAACoV,GAAaC,CAAc,IAAIrV,EAAwB,IAAI,GAC5D,CAACsV,GAAeC,CAAgB,IAAIvV,EAAS,EAAK,GAClD,CAACuoB,GAAgBa,CAAiB,IAAIppB,EAAS,EAAK,GAGpD,CAACqpB,GAAsBC,CAAuB,IAAItpB,EAAyC,IAAI,GAC/F,CAACupB,IAAwBC,EAAyB,IAAIxpB,EAAoC,CAAA,CAAE,GAC5F,CAACypB,GAAgBC,CAAiB,IAAI1pB,EAAS,EAAE,GACjD,CAAC2pB,IAAkBC,CAAmB,IAAI5pB,EAAS,EAAK;AAG9D,EAAAC,GAAU,MAAM;AAkBd,KAjBmB,YAAY;AAC7B,UAAI;AACF,cAAMyW,KAAS,MAAMjT,EAAS,QAAQ,UAAA;AACtC,QAAAklB,EAAajS,GAAO,SAAS,GAC7BmS,EAAanS,GAAO,SAAS,GACxB+R,KACHM,EAAc1B,GAA4B3Q,EAAM,CAAC;AAAA,MAErD,SAAShT,IAAK;AACZ,gBAAQ,MAAM,iCAAiCA,EAAG,GAElDilB,EAAa,EAAI,GACjBE,EAAa,EAAI;AAAA,MACnB,UAAA;AACE,QAAAM,EAAiB,EAAK;AAAA,MACxB;AAAA,IACF,GACA;AAAA,EACF,GAAG,CAAA,CAAE,GAGLlpB,GAAU,MAAM;AACd,QAAI,CAACwoB,EAAuB;AAuB5B,KAtByB,YAAY;AACnC,UAAI;AACF,cAAMoB,KAAM,MAAMpmB,EAAS,cAAc,QAAQglB,CAAqB;AACtE,QAAAa,EAAwB;AAAA,UACtB,IAAIO,GAAI;AAAA,UACR,MAAMA,GAAI;AAAA,UACV,WAAWA,GAAI;AAAA,UACf,aAAaA,GAAI;AAAA,UACjB,oBAAoBA,GAAI;AAAA,UACxB,wBAAwBA,GAAI;AAAA,UAC5B,oBAAoBA,GAAI;AAAA,UACxB,YAAYA,GAAI;AAAA,UAChB,WAAWA,GAAI;AAAA,QAAA,CAChB,GAEIC,KACHC,EAAiBF,GAAI,IAAI;AAAA,MAE7B,SAASnmB,IAAK;AACZ,gBAAQ,MAAM,gCAAgCA,EAAG;AAAA,MACnD;AAAA,IACF,GACA;AAAA,EACF,GAAG,CAAC+kB,CAAqB,CAAC,GAG1BxoB,GAAU,MAAM;AACd,QAAI+oB,MAAqB,WAAY;AAYrC,UAAMgB,KAAW,WAXW,YAAY;AACtC,MAAAJ,EAAoB,EAAI;AACxB,UAAI;AACF,cAAMK,KAAU,MAAMxmB,EAAS,cAAc,aAAagmB,KAAkB,MAAS;AACrF,QAAAD,GAA0BS,EAAO;AAAA,MACnC,SAASvmB,IAAK;AACZ,gBAAQ,MAAM,mCAAmCA,EAAG;AAAA,MACtD,UAAA;AACE,QAAAkmB,EAAoB,EAAK;AAAA,MAC3B;AAAA,IACF,GACiD,GAAG;AACpD,WAAO,MAAM,aAAaI,EAAQ;AAAA,EACpC,GAAG,CAAChB,GAAkBS,CAAc,CAAC;AAGrC,QAAM,CAACK,GAAMI,CAAO,IAAIlqB,EAAS,EAAE,GAC7B,CAACmqB,GAAMC,CAAO,IAAIpqB,EAAS,EAAE,GAC7B,CAACqqB,GAAaC,CAAc,IAAItqB,EAAS,EAAE,GAG3C,CAACunB,GAASgD,EAAU,IAAIvqB,EAAS,EAAE,GACnC,CAACwnB,IAAcgD,EAAe,IAAIxqB,EAAS,EAAE,GAC7C,CAACynB,IAAgBgD,EAAiB,IAAIzqB,EAAS,IAAI,GACnD,CAAC0nB,IAAmBgD,CAAoB,IAAI1qB,EAAiC,SAAS,GACtF,CAAC2nB,IAAegD,EAAgB,IAAI3qB,EAAS,MAAM,GAGnDiW,IAAkB,CAAChX,MAA0B;AAEjD,UAAMiX,KAAUjX,EAAM,YAAA,EAAc,QAAQ,cAAc,EAAE;AAG5D,QAAIkX,KAASD,GAAQ,WAAW,KAAK,IAAIA,GAAQ,MAAM,CAAC,IAAIA,GAAQ,QAAQ,WAAW,EAAE;AAIzF,WAHAC,KAASA,GAAO,MAAM,GAAG,CAAC,GAGtBA,GAAO,WAAW,IAAU,SAC5BA,GAAO,UAAU,IAAU,OAAOA,EAAM,KACxCA,GAAO,UAAU,IAAU,OAAOA,GAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAO,MAAM,CAAC,CAAC,KACpE,OAAOA,GAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAO,MAAM,CAAC,CAAC;AAAA,EAC3E,GAEMC,IAAyB,CAACnX,MAAkB;AAEhD,IACE0rB,GADEjD,OAAsB,aAAaD,OAAmB,OACvCxR,EAAgBhX,CAAK,IAErBA,CAFsB,GAIzCmqB,EAAkB,EAAK,GACvB/T,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAAA,EACxB;AAGA,EAAAtV,GAAU,MAAM;AACd,IAAIwnB,OAAmB,QAAQC,OAAsB,aAGjDiD,GADE,CAAChD,MAAiBA,OAAkB,SACrB,SAGA1R,EAAgB0R,EAAa,CAHvB;AAAA,EAM7B,GAAG,CAACF,IAAgBC,EAAiB,CAAC;AACtC,QAAM,CAACE,GAAcgD,EAAe,IAAI5qB,EAAS,EAAE,GAC7C,CAACooB,GAAUyC,CAAW,IAAI7qB,EAAS,EAAE,GACrC,CAACqoB,IAAUyC,EAAW,IAAI9qB,EAAS,EAAE,GACrC,CAACsoB,IAAYyC,EAAa,IAAI/qB,EAAS,EAAE,GAGzC,CAAC6nB,IAAYmD,EAAa,IAAIhrB,EAAS,EAAE,GACzC,CAAC8nB,IAAamD,EAAc,IAAIjrB,EAAS,EAAE,GAC3C,CAAC+nB,IAAgBmD,EAAiB,IAAIlrB,EAAS,EAAE,GACjD,CAACgoB,IAAUmD,EAAW,IAAInrB,EAAS,EAAE,GACrC,CAACioB,IAAWmD,EAAY,IAAIprB,EAAS,EAAE,GACvC,CAACkoB,IAAamD,EAAc,IAAIrrB,EAAS,aAAa,GACtD,CAACmoB,IAAiBmD,EAAkB,IAAItrB,EAAS,IAAI,GAErDurB,KAAe,CAACtsB,MACbA,EACJ,cACA,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,eAAe,GAAG,EAC1B,QAAQ,cAAc,EAAE,EACxB,UAAU,GAAG,EAAE,GAGd8qB,IAAmB,CAAC9qB,MAAkB;AAC1C,IAAAirB,EAAQjrB,CAAK,IACT,CAACkrB,KAAQA,MAASoB,GAAazB,CAAI,MACrCM,EAAQmB,GAAatsB,CAAK,CAAC;AAAA,EAE/B,GAEMusB,KAAsB,MAAe;AACzC,UAAMlV,IAAYqR,GAAc,QAAQ,WAAW,EAAE;AACrD,WAAI,CAACA,MAAiBrR,EAAU,SAAS,KAAK,CAACmR,MAC7CpS,EAAe5U,EAAE,oDAAoD,CAAC,GAC/D,MAEF;AAAA,EACT,GAEMgrB,KAAyB,CAACjoB,MAAsE;AACpG,IAAIA,EAAO,SACT+mB,GAAW/mB,EAAO,IAAI,GACjBsmB,KACHC,EAAiBvmB,EAAO,IAAI,IAG5BA,EAAO,aAAWgnB,GAAgBhnB,EAAO,SAAS,GAClDA,EAAO,aAAWonB,GAAgBpnB,EAAO,SAAS,GAClDA,EAAO,SAAOqnB,EAAYrnB,EAAO,KAAK,GACtCA,EAAO,SAAOsnB,GAAYtnB,EAAO,KAAK,GACtCA,EAAO,WAASunB,GAAcvnB,EAAO,OAAO;AAAA,EAClD,GAEMkoB,KAAoB,CAACloB,MAAsE;AAC/F,IAAIA,EAAO,UAAQwnB,GAAcxnB,EAAO,MAAM,GAC1CA,EAAO,WAASynB,GAAeznB,EAAO,OAAO,GAC7CA,EAAO,cAAY0nB,GAAkB1nB,EAAO,UAAU,GACtDA,EAAO,QAAM2nB,GAAY3nB,EAAO,IAAI,GACpCA,EAAO,SAAO4nB,GAAa5nB,EAAO,KAAK,GACvCA,EAAO,WAAS6nB,GAAe7nB,EAAO,OAAO,GAC7CA,EAAO,eAAa8nB,GAAmB9nB,EAAO,WAAW;AAAA,EAC/D,GAEMmoB,KAAiB,CAACpV,MAClBA,EAAa,SAAS,KAAK,KAAKA,EAAa,SAAS,WAAW,IAC5D9V,EAAE,gDAAgD,IAEvD8V,EAAa,SAAS,aAAa,KAAKA,EAAa,SAAS,KAAK,IAC9D9V,EAAE,mDAAmD,IAEvDA,EAAE,gDAAgD,GAGrDmrB,KAAe,YAAY;AAC/B,QAAKJ,MAEL;AAAA,MAAArW,EAAiB,EAAI,GACrBE,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAEtB,UAAI;AACF,cAAM/R,IAAS,MAAMC,EAAS,cAAc,OAAOgkB,IAAgBE,EAAa;AAEhF,QAAA8D,GAAuBjoB,CAAM,GAC7BkoB,GAAkBloB,CAAM,GACxB4lB,EAAkB,EAAI,GAEtB7T,EAAiB,EAAI,GACrB,WAAW,MAAMA,EAAiB,EAAK,GAAG,GAAI;AAAA,MAChD,SAAS7R,GAAc;AACrB,gBAAQ,MAAM,0BAA0BA,CAAG;AAC3C,cAAM6S,KAAe7S,aAAe,QAAQA,EAAI,UAAU;AAC1D,QAAA2R,EAAesW,GAAepV,EAAY,CAAC;AAAA,MAC7C,UAAA;AACE,QAAApB,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAEM0W,KAAkB,YAAY;AAClC,UAAMna,IAAkC;AAAA,MACtC,MAAAoY;AAAA,MACA,MAAMK,KAAQoB,GAAazB,CAAI;AAAA,MAC/B,aAAaO,KAAe;AAAA,IAAA,GAExB7mB,KAAS,MAAMC,EAAS,QAAQ,UAAUiO,CAAO;AACvD,UAAMxQ,EAAA,GACNP,EAAS,2BAA2B6C,GAAO,EAAE,EAAE;AAAA,EACjD,GAEMsoB,KAAkB,YAAY;AAClC,QAAIpa;AAEJ,QAAIsX,MAAqB,cAAcK;AACrC,MAAA3X,IAAU;AAAA,QACR,MAAAoY;AAAA,QACA,MAAMK,KAAQoB,GAAazB,CAAI;AAAA,QAC/B,aAAaO,KAAe;AAAA,QAC5B,gBAAgBhB,EAAqB;AAAA,MAAA;AAAA,aAE9BL,MAAqB,UAAU;AACxC,YAAM+C,KAAezE;AAAA,QACnBC;AAAA,QAASC;AAAA,QAAcC;AAAA,QAAgBC;AAAA,QAAmBC;AAAA,QAC1DC;AAAA,QAAcC;AAAA,QAAYC;AAAA,QAAaC;AAAA,QAAgBC;AAAA,QAAUC;AAAA,QACjEC;AAAA,QAAaC;AAAA,QAAiBC;AAAA,QAAUC;AAAA,QAAUC;AAAA,QAAYC;AAAA,MAAA;AAEhE,MAAA7W,IAAU;AAAA,QACR,MAAAoY;AAAA,QACA,MAAMK,KAAQoB,GAAazB,CAAI;AAAA,QAC/B,aAAaO,KAAe;AAAA,QAC5B,cAAA0B;AAAA,MAAA;AAAA,IAEJ;AACE,MAAAra,IAAU;AAAA,QACR,MAAAoY;AAAA,QACA,MAAMK,KAAQoB,GAAazB,CAAI;AAAA,QAC/B,aAAaO,KAAe;AAAA,MAAA;AAIhC,UAAM7mB,KAAS,MAAMC,EAAS,QAAQ,UAAUiO,CAAO;AACvD,UAAMxQ,EAAA,GACNP,EAAS,2BAA2B6C,GAAO,EAAE,EAAE;AAAA,EACjD,GAEMwoB,KAAe,OAAO1lB,MAAuB;AACjD,IAAAA,EAAE,eAAA,GACFvD,EAAS,IAAI,GACbnB,EAAW,EAAI;AAEf,QAAI;AACF,MAAIknB,MAAe,aACjB,MAAM+C,GAAA,IAEN,MAAMC,GAAA;AAAA,IAEV,SAASpoB,IAAc;AACrB,cAAQ,MAAM,4BAA4BA,EAAG;AAC7C,YAAM6S,KAAe7S,cAAe,QAAQA,GAAI,UAAUjD,EAAE,mCAAmC;AAC/F,MAAAsC,EAASwT,EAAY;AAAA,IACvB,UAAA;AACE,MAAA3U,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAcMqqB,KAAc,CAAC,EAAEnC,MAJjBhB,MAAe,aAAmB,KAC/B,CAAC,EAAEgB,MARNd,MAAqB,aAAmB,CAAC,CAACK,IAC1CL,MAAqB,WAAiB,KACnC,CAAC,EAAEzB,KAAWE,MAAkBC,MAAqBC,MAC1DE,MAAcE,MAAkBC,MAAYE,MAAeC;AAU/D,SACE,gBAAA/hB,EAAC,OAAA,EAAI,WAAU,yCAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,sBAAsB,EAAA;AAAA,QAAE;AAAA,MACrC;AAAA,IAAA;AAAA,IAIF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMtE,EAAS,yBAAyB;AAAA,UACjD,WAAU;AAAA,UAEV,UAAA,gBAAAsE,EAAC6hB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,wBAEhC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAA7hB,EAAC,MAAA,EAAG,WAAU,iDACX,UAAAxE,EAAE,4BAA4B,GACjC;AAAA,0BACC,KAAA,EAAE,WAAU,gCACV,UAAAA,EAAE,+BAA+B,EAAA,CACpC;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGCqC,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,kGACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,QAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,wBAAA,CAAwB;AAAA,QAC/C,gBAAAtD,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,MAAA,GACf;AAAA,MACA,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMlC,EAAS,IAAI;AAAA,UAC5B,WAAU;AAAA,UAET,YAAE,gBAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,GACF;AAAA,IAIF,gBAAAqD,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,yDACX,UAAAxE,EAAE,iCAAiC,GACtC;AAAA,MAGC,CAACyoB,KAAiBN,MAAc,MAC/B,gBAAA3jB,EAAC,OAAA,EAAI,WAAU,gGACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,wBAAA,CAAwB;AAAA,0BACvC,QAAA,EAAK,WAAU,WAAW,UAAApX,EAAE,wCAAwC,EAAA,CAAE;AAAA,MAAA,EAAA,CACzE,EAAA,CACF;AAAA,MAID,CAACyoB,KAAiBR,MAAc,MAC/B,gBAAAzjB,EAAC,OAAA,EAAI,WAAU,gGACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,wBAAA,CAAwB;AAAA,0BACvC,QAAA,EAAK,WAAU,WAAW,UAAApX,EAAE,wCAAwC,EAAA,CAAE;AAAA,MAAA,EAAA,CACzE,EAAA,CACF;AAAA,MAGDyoB,IACC,gBAAAjkB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,KAAQ,WAAU,mDAAA,CAAmD,GACxE,IAEA,gBAAAH,EAAC,SAAI,WAAW,cAAcwiB,KAAaF,IAAY,gBAAgB,aAAa,IAEjF,UAAA;AAAA,QAAAE,KACC,gBAAAxiB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM2iB,EAAc,UAAU;AAAA,YACvC,WAAW,sEACTD,MAAe,aACX,oEACA,uEACN;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAA1iB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,sCACd6jB,MAAe,aACX,mEACA,sDACN,IACE,UAAA,gBAAA7jB,EAAC5E,IAAA,EAAK,WAAU,UAAA,CAAU,GAC5B;AAAA,gBACA,gBAAA4E,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CAA0C,UAAAxE,EAAE,wBAAwB,EAAA,CAAE,GACrF;AAAA,gBACCqoB,MAAe,cACd,gBAAA7jB,EAACwY,IAAA,EAAM,WAAU,yCAAA,CAAyC;AAAA,cAAA,GAE9D;AAAA,gCACC,KAAA,EAAE,WAAU,wCACV,UAAAhd,EAAE,qCAAqC,EAAA,CAC1C;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAKHioB,KACC,gBAAAtiB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM2iB,EAAc,UAAU;AAAA,YACvC,WAAW,sEACTD,MAAe,aACX,oDACA,uEACN;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAA1iB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,sCACd6jB,MAAe,aACX,gDACA,sDACN,IACE,UAAA,gBAAA7jB,EAAC3E,IAAA,EAAS,WAAU,UAAA,CAAU,GAChC;AAAA,gBACA,gBAAA2E,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CAA0C,UAAAxE,EAAE,wBAAwB,EAAA,CAAE,GACrF;AAAA,gBACCqoB,MAAe,cACd,gBAAA7jB,EAACwY,IAAA,EAAM,WAAU,kCAAA,CAAkC;AAAA,cAAA,GAEvD;AAAA,gCACC,KAAA,EAAE,WAAU,wCACV,UAAAhd,EAAE,qCAAqC,EAAA,CAC1C;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAAA,CAEJ;AAAA,IAAA,GAEJ;AAAA,IAGA,gBAAA2F,EAAC,QAAA,EAAK,UAAU4lB,IAAc,WAAU,aAEtC,UAAA;AAAA,MAAA,gBAAA5lB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAxE,EAAE,8BAA8B,GACnC;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,YAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,sBAAA,CAAsB;AAAA,YAC1CjF,EAAE,2BAA2B;AAAA,YAAE;AAAA,UAAA,GAClC;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO6kB;AAAA,cACP,UAAU,CAACxjB,MAAMyjB,EAAiBzjB,EAAE,OAAO,KAAK;AAAA,cAChD,aAAa7F,EAAE,sCAAsC;AAAA,cACrD,WAAU;AAAA,cACV,UAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACV,GACF;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,YAAA,gBAAAnB,EAACinB,IAAA,EAAK,WAAU,sBAAA,CAAsB;AAAA,YACrCzrB,EAAE,2BAA2B;AAAA,UAAA,GAChC;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOklB;AAAA,cACP,UAAU,CAAC7jB,MAAM8jB,EAAQmB,GAAajlB,EAAE,OAAO,KAAK,CAAC;AAAA,cACrD,aAAa7F,EAAE,sCAAsC;AAAA,cACrD,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,4BAEX,KAAA,EAAE,WAAU,4CACV,UAAAA,EAAE,+BAA+B,EAAA,CACpC;AAAA,QAAA,GACF;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,YAAA,gBAAAnB,EAACknB,IAAA,EAAS,WAAU,sBAAA,CAAsB;AAAA,YACzC1rB,EAAE,kCAAkC;AAAA,UAAA,GACvC;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOolB;AAAA,cACP,UAAU,CAAC/jB,MAAMgkB,EAAehkB,EAAE,OAAO,KAAK;AAAA,cAC9C,aAAa7F,EAAE,6CAA6C;AAAA,cAC5D,MAAM;AAAA,cACN,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAGCqoB,MAAe,cACd,gBAAA1iB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAAC3E,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,UAC7BG,EAAE,yCAAyC;AAAA,QAAA,GAC9C;AAAA,QAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BAEb,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM6iB,EAAoB,MAAM;AAAA,cACzC,WAAW,sEACTD,MAAqB,SACjB,0DACA,uEACN;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,sCACd+jB,MAAqB,SACjB,sDACA,sDACN,IACE,UAAA,gBAAA/jB,EAACmnB,IAAA,EAAI,WAAU,UAAA,CAAU,GAC3B;AAAA,kBACA,gBAAAnnB,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CACV,UAAAxE,EAAE,6CAA6C,EAAA,CAClD,GACF;AAAA,kBACCuoB,MAAqB,UACpB,gBAAA/jB,EAACwY,IAAA,EAAM,WAAU,qCAAA,CAAqC;AAAA,gBAAA,GAE1D;AAAA,kCACC,KAAA,EAAE,WAAU,wCACV,UAAAhd,EAAE,wDAAwD,EAAA,CAC7D;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIF,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM6iB,EAAoB,UAAU;AAAA,cAC7C,WAAW,sEACTD,MAAqB,aACjB,oEACA,uEACN;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,sCACd+jB,MAAqB,aACjB,mEACA,sDACN,IACE,UAAA,gBAAA/jB,EAACiW,IAAA,EAAK,WAAU,UAAA,CAAU,GAC5B;AAAA,kBACA,gBAAAjW,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CACV,UAAAxE,EAAE,gDAAgD,EAAA,CACrD,GACF;AAAA,kBACCuoB,MAAqB,cACpB,gBAAA/jB,EAACwY,IAAA,EAAM,WAAU,yCAAA,CAAyC;AAAA,gBAAA,GAE9D;AAAA,kCACC,KAAA,EAAE,WAAU,wCACV,UAAAhd,EAAE,2DAA2D,EAAA,CAChE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAIF,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM6iB,EAAoB,QAAQ;AAAA,cAC3C,WAAW,sEACTD,MAAqB,WACjB,oDACA,uEACN;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,sCACd+jB,MAAqB,WACjB,gDACA,sDACN,IACE,UAAA,gBAAA/jB,EAAC3E,IAAA,EAAS,WAAU,UAAA,CAAU,GAChC;AAAA,kBACA,gBAAA2E,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,0CACV,UAAAxE,EAAE,8CAA8C,EAAA,CACnD,GACF;AAAA,kBACCuoB,MAAqB,YACpB,gBAAA/jB,EAACwY,IAAA,EAAM,WAAU,kCAAA,CAAkC;AAAA,gBAAA,GAEvD;AAAA,kCACC,KAAA,EAAE,WAAU,wCACV,UAAAhd,EAAE,yDAAyD,EAAA,CAC9D;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAIDqoB,MAAe,cAAcE,MAAqB,cACjD,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,gFACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACiW,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,UACzBza,EAAE,kDAAkD;AAAA,QAAA,GACvD;AAAA,QAGC4oB,uBACE,OAAA,EAAI,WAAU,iGACb,UAAA,gBAAAjjB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,0CAA0C,UAAAokB,EAAqB,MAAK;AAAA,YACjF,gBAAAjjB,EAAC,KAAA,EAAE,WAAU,wCACV,UAAA;AAAA,cAAAijB,EAAqB;AAAA,cAAmB;AAAA,cAAIA,EAAqB;AAAA,YAAA,GACpE;AAAA,YACCA,EAAqB,aACpB,gBAAApkB,EAAC,OAAE,WAAU,uCAAuC,YAAqB,UAAA,CAAU;AAAA,UAAA,GAEvF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMqkB,EAAwB,IAAI;AAAA,cAC3C,WAAU;AAAA,cAET,YAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,QACpB,EAAA,CACF,EAAA,CACF;AAAA,QAID,CAACD,KACA,gBAAAjjB,EAAAkC,IAAA,EACE,UAAA;AAAA,UAAA,gBAAAlC,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAnB,EAACuD,IAAA,EAAO,WAAU,4DAAA,CAA4D;AAAA,YAC9E,gBAAAvD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOwkB;AAAA,gBACP,UAAU,CAACnjB,MAAMojB,EAAkBpjB,EAAE,OAAO,KAAK;AAAA,gBACjD,aAAa7F,EAAE,qDAAqD;AAAA,gBACpE,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,UAGCkpB,wBACE,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAA1kB,EAACsB,GAAA,EAAQ,WAAU,mDAAA,CAAmD,EAAA,CACxE;AAAA,UAED,CAACojB,MAAoBJ,GAAuB,WAAW,KACtD,gBAAAtkB,EAAC,KAAA,EAAE,WAAU,yDACV,UAAAxE,EAAE,6CAA6C,EAAA,CAClD;AAAA,UAED,CAACkpB,MAAoBJ,GAAuB,SAAS,KACpD,gBAAAtkB,EAAC,OAAA,EAAI,WAAU,6GACZ,UAAAskB,GAAuB,IAAI,CAACM,MAC3B,gBAAA5kB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM;AACb,gBAAAqkB,EAAwBO,CAAG,GACtBC,KACHC,EAAiBF,EAAI,IAAI;AAAA,cAE7B;AAAA,cACA,WAAU;AAAA,cAEV,UAAA,gBAAAzjB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,kDAAkD,UAAA4kB,EAAI,MAAK;AAAA,kBACxE,gBAAAzjB,EAAC,KAAA,EAAE,WAAU,wCACV,UAAA;AAAA,oBAAAyjB,EAAI;AAAA,oBAAmB;AAAA,oBAAIA,EAAI;AAAA,kBAAA,EAAA,CAClC;AAAA,gBAAA,GACF;AAAA,gBACA,gBAAA5kB,EAAC,UAAK,WAAW,mDACf4kB,EAAI,uBAAuB,aACvB,sDACAA,EAAI,uBAAuB,YACzB,sDACA,+CACR,IACG,UAAAppB,EAAE,8BAA8BopB,EAAI,mBAAmB,aAAa,IAAIA,EAAI,kBAAkB,EAAA,CACjG;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,YA1BKA,EAAI;AAAA,UAAA,CA4BZ,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GAEJ;AAAA,MAIDf,MAAe,cAAcE,MAAqB,YACjD,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAAConB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UAC9B5rB,EAAE,2CAA2C;AAAA,QAAA,GAChD;AAAA,QAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,cAAA3F,EAAE,wCAAwC;AAAA,cAAE;AAAA,YAAA,GAC/C;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOsiB;AAAA,gBACP,UAAU,CAACjhB,MAAMikB,GAAWjkB,EAAE,OAAO,KAAK;AAAA,gBAC1C,aAAa7F,EAAE,mDAAmD;AAAA,gBAClE,WAAU;AAAA,gBACV,UAAUuoB,MAAqB;AAAA,cAAA;AAAA,YAAA;AAAA,UACjC,GACF;AAAA,4BACC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAA/jB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,6CAA6C,GAClD;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOuiB;AAAA,gBACP,UAAU,CAAClhB,MAAMkkB,GAAgBlkB,EAAE,OAAO,KAAK;AAAA,gBAC/C,aAAa7F,EAAE,wDAAwD;AAAA,gBACvE,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,qGACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,YAAA,gBAAAnB,EAAConB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,YAC9B5rB,EAAE,oDAAoD;AAAA,UAAA,GACzD;AAAA,UAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,mDAAmD;AAAA,gBAAE;AAAA,cAAA,GAC1D;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOyiB;AAAA,kBACP,UAAU,CAACphB,MAAM;AACf,0BAAMgmB,KAAUhmB,EAAE,OAAO;AACzB,oBAAAokB,EAAqB4B,EAAO;AAE5B,0BAAMtlB,KAAWkgB,GAA0B,KAAK,CAAAzmB,OAAKA,GAAE,UAAU6rB,EAAO;AACxE,oBAAItlB,IAAU,WACZyjB,GAAkBzjB,GAAS,OAAO;AAAA,kBAEtC;AAAA,kBACA,WAAU;AAAA,kBACV,UAAUgiB,MAAqB;AAAA,kBAE9B,UAAA9B,GAA0B,IAAI,CAACqF,MAC9B,gBAAAtnB,EAAC,UAAA,EAAwB,OAAOsnB,EAAK,OAClC,UAAAA,EAAK,MAAA,GADKA,EAAK,KAElB,CACD;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,GACF;AAAA,8BACC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAnmB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,qDAAqD;AAAA,gBAAE;AAAA,cAAA,GAC5D;AAAA,cACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,gBAAA,gBAAAnB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO0iB;AAAA,oBACP,UAAU,CAACrhB,MAAM8P,EAAuB9P,EAAE,OAAO,KAAK;AAAA,oBACtD,aAAaohB,OAAsB,YAAY,oBAAoBjnB,EAAE,0DAA0D;AAAA,oBAC/H,WAAU;AAAA,oBACV,UAAUuoB,MAAqB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEjC,gBAAA/jB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS2mB;AAAA,oBACT,UAAU1W,KAAiB,CAACyS,MAAiBA,GAAc,QAAQ,WAAW,EAAE,EAAE,SAAS,KAAKF,OAAmB;AAAA,oBACnH,WAAU;AAAA,oBACV,OAAOhnB,EAAE,+CAA+C;AAAA,oBAEvD,UAAAyU,sBACE3O,GAAA,EAAQ,WAAU,wBAAuB,IAE1C,gBAAAtB,EAACuD,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAEhC,GACF;AAAA,cACC4M,KACC,gBAAAhP,EAAC,KAAA,EAAE,WAAU,iEACX,UAAA;AAAA,gBAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,gBAClC1P;AAAA,cAAA,GACH;AAAA,cAEDE,KACC,gBAAAlP,EAAC,KAAA,EAAE,WAAU,mEACX,UAAA;AAAA,gBAAA,gBAAAnB,EAACwY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gBAC1Bhd,EAAE,iDAAiD;AAAA,cAAA,GACtD;AAAA,cAEDgnB,OAAmB,QAAQC,OAAsB,+BAC/C,KAAA,EAAE,WAAU,4CACV,UAAAC,GAAc,QAAQ,WAAW,EAAE,EAAE,SAAS,IAC3ClnB,EAAE,wDAAwD,IAC1DA,EAAE,8CAA8C,EAAA,CACtD;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAwE,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,6CAA6C,GAClD;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO2iB;AAAA,gBACP,UAAU,CAACthB,MAAMskB,GAAgBtkB,EAAE,OAAO,KAAK;AAAA,gBAC/C,aAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAGA,gBAAAF,EAAC,OAAA,EAAI,WAAU,2GACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4EACZ,UAAA;AAAA,YAAA,gBAAAnB,EAACunB,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,YAC3B/rB,EAAE,iDAAiD;AAAA,YAAE;AAAA,UAAA,GACxD;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,cAAA3F,EAAE,kDAAkD;AAAA,cAAE;AAAA,YAAA,GACzD;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO4iB;AAAA,gBACP,UAAU,CAACvhB,MAAM0kB,GAAc1kB,EAAE,OAAO,KAAK;AAAA,gBAC7C,aAAa7F,EAAE,6DAA6D;AAAA,gBAC5E,WAAU;AAAA,gBACV,UAAUuoB,MAAqB;AAAA,cAAA;AAAA,YAAA;AAAA,UACjC,GACF;AAAA,4BAEC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAA/jB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,mDAAmD,GACxD;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO6iB;AAAA,gBACP,UAAU,CAACxhB,MAAM2kB,GAAe3kB,EAAE,OAAO,KAAK;AAAA,gBAC9C,aAAa7F,EAAE,8DAA8D;AAAA,gBAC7E,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,UAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,sDAAsD;AAAA,gBAAE;AAAA,cAAA,GAC7D;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO8iB;AAAA,kBACP,UAAU,CAACzhB,MAAM4kB,GAAkB5kB,EAAE,OAAO,KAAK;AAAA,kBACjD,aAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,UAAU0iB,MAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjC,GACF;AAAA,YACA,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,gDAAgD;AAAA,gBAAE;AAAA,cAAA,GACvD;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO+iB;AAAA,kBACP,UAAU,CAAC1hB,MAAM6kB,GAAY7kB,EAAE,OAAO,KAAK;AAAA,kBAC3C,aAAa7F,EAAE,2DAA2D;AAAA,kBAC1E,WAAU;AAAA,kBACV,UAAUuoB,MAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjC,GACF;AAAA,8BACC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAA/jB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,iDAAiD,GACtD;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOgjB;AAAA,kBACP,UAAU,CAAC3hB,MAAM8kB,GAAa9kB,EAAE,OAAO,KAAK;AAAA,kBAC5C,aAAY;AAAA,kBACZ,WAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACZ,EAAA,CACF;AAAA,UAAA,GACF;AAAA,UAEA,gBAAAF,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,mDAAmD;AAAA,gBAAE;AAAA,cAAA,GAC1D;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOijB;AAAA,kBACP,UAAU,CAAC5hB,MAAM+kB,GAAe/kB,EAAE,OAAO,KAAK;AAAA,kBAC9C,aAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,UAAU0iB,MAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjC,GACF;AAAA,8BACC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAA5iB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,gBAAA3F,EAAE,uDAAuD;AAAA,gBAAE;AAAA,cAAA,GAC9D;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOkjB;AAAA,kBACP,UAAU,CAAC7hB,MAAMglB,GAAmBhlB,EAAE,OAAO,MAAM,cAAc,MAAM,GAAG,CAAC,CAAC;AAAA,kBAC5E,aAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,WAAU;AAAA,kBACV,UAAU0iB,MAAqB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjC,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAGA,gBAAA5iB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,cAAA,gBAAAnB,EAACwnB,IAAA,EAAM,WAAU,sBAAA,CAAsB;AAAA,cACtChsB,EAAE,yCAAyC;AAAA,YAAA,GAC9C;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOmjB;AAAA,gBACP,UAAU,CAAC9hB,MAAMukB,EAAYvkB,EAAE,OAAO,KAAK;AAAA,gBAC3C,aAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,4BACC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAF,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,cAAA,gBAAAnB,EAACynB,IAAA,EAAK,WAAU,sBAAA,CAAsB;AAAA,cACrCjsB,EAAE,yCAAyC;AAAA,YAAA,GAC9C;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOojB;AAAA,gBACP,UAAU,CAAC/hB,MAAMwkB,GAAYxkB,EAAE,OAAO,KAAK;AAAA,gBAC3C,aAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,4BACC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAF,EAAC,SAAA,EAAM,WAAU,+DACf,UAAA;AAAA,cAAA,gBAAAnB,EAAC8Y,IAAA,EAAM,WAAU,sBAAA,CAAsB;AAAA,cACtCtd,EAAE,2CAA2C;AAAA,YAAA,GAChD;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAOqjB;AAAA,gBACP,UAAU,CAAChiB,MAAMykB,GAAczkB,EAAE,OAAO,KAAK;AAAA,gBAC7C,aAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAIF,gBAAAF,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMtE,EAAS,yBAAyB;AAAA,YACjD,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAAyF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAUzE,KAAW,CAACsqB;AAAA,YACtB,WAAW,4KACTnD,MAAe,aACXE,MAAqB,SACnB,6CACA,0CACF,iEACN;AAAA,YAEC,UAAA;AAAA,cAAArnB,IACC,gBAAAsD,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAAC0nB,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,cAE/BlsB,EAAE,6BAA6B;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAClC,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AChnCA,MAAMmsB,KAAS;AAAA,EACb;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,GAEMC,KAAoB,CAAC/jB,MAAmB;AAC5C,QAAM;AAAA,IACJ,IAAAgkB,IAAK;AAAA,IACL,IAAAC,IAAK;AAAA,IACL,UAAAC,IAAW;AAAA,IACX,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,YAAAC,IAAa;AAAA,IACb,UAAAC,IAAW;AAAA,IACX,MAAAC,IAAO;AAAA,IACP,SAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,OAAAtuB,IAAQ;AAAA,EAAA,IACN6J;AAcJ,MAAI,CAACwkB,EAAS,QAAO,gBAAAroB,EAAC,KAAA,CAAA,CAAE;AACxB,QAAMuoB,IAAS,KAAK,KAAK,KACnBC,IAAM,KAAK,IAAI,CAACD,IAASR,CAAQ,GACjCU,IAAM,KAAK,IAAI,CAACF,IAASR,CAAQ,GACjCW,IAAKb,KAAMI,IAAc,MAAMQ,GAC/BE,IAAKb,KAAMG,IAAc,MAAMO,GAC/BI,IAAKf,KAAMI,IAAc,MAAMQ,GAC/BI,IAAKf,KAAMG,IAAc,MAAMO,GAC/BM,IAAKF,KAAMH,KAAO,IAAI,IAAI,MAAM,IAChCM,IAAKF,GACLG,IAAaP,KAAO,IAAI,UAAU;AAExC,2BACG,KAAA,EACC,UAAA;AAAA,IAAA,gBAAAzoB,EAAC,UAAK,GAAG6nB,GAAI,GAAGC,GAAI,IAAI,KAAK,YAAW,UAAS,MAAK,uBAAsB,OAAO,EAAE,UAAU,QAAQ,YAAY,OAAA,GAChH,YAAQ,YACX;AAAA,sBACC,QAAA,EAAK,GAAGD,GAAI,GAAGC,GAAI,IAAI,IAAI,YAAW,UAAS,MAAK,yBAAwB,OAAO,EAAE,UAAU,UAC7F,UAAA;AAAA,MAAA9tB,EAAM,eAAA;AAAA,MAAiB;AAAA,MAAEquB,EAAQ,eAAe,cAAc,QAAQ;AAAA,IAAA,GACzE;AAAA,IACA,gBAAAroB;AAAA,MAACipB;AAAA,MAAA;AAAA,QACC,IAAApB;AAAA,QACA,IAAAC;AAAA,QACA,aAAAE;AAAA,QACA,aAAAC;AAAA,QACA,YAAAC;AAAA,QACA,UAAAC;AAAA,QACA,MAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAApoB;AAAA,MAACipB;AAAA,MAAA;AAAA,QACC,IAAApB;AAAA,QACA,IAAAC;AAAA,QACA,YAAAI;AAAA,QACA,UAAAC;AAAA,QACA,aAAaF,IAAc;AAAA,QAC3B,aAAaA,IAAc;AAAA,QAC3B,MAAAG;AAAA,MAAA;AAAA,IAAA;AAAA,sBAED,QAAA,EAAK,GAAG,IAAIM,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAAI,QAAQX,GAAM,MAAK,QAAO;AAAA,IAC3E,gBAAApoB,EAAC,UAAA,EAAO,IAAI8oB,GAAI,IAAIC,GAAI,GAAG,GAAG,MAAAX,GAAY,QAAO,OAAA,CAAO;AAAA,IACxD,gBAAApoB,EAAC,QAAA,EAAK,GAAG8oB,KAAML,KAAO,IAAI,IAAI,MAAM,IAAI,GAAGM,GAAI,YAAAC,GAAwB,MAAK,uBAAsB,OAAO,EAAE,UAAU,OAAA,GAClH,UAAA,IAAIV,IAAU,KAAK,QAAQ,CAAC,CAAC,IAAA,CAChC;AAAA,EAAA,GACF;AAEJ,GAEaY,KAAgE,CAAC,EAAE,MAAAvkB,GAAM,MAAA2V,IAAO,eAAe;AAC1G,QAAM,CAAC6O,GAAaC,CAAc,IAAIruB,EAAS,CAAC;AAEhD,MAAI,CAAC4J,KAAQA,EAAK,WAAW;AAC3B,WACE,gBAAA3E,EAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,uCAEtF;AAIJ,QAAMqpB,IAAW,CAACrqB,MAChBsb,MAAS,WAAWtb,EAAO,cAAcA,EAAO,sBAE5CsqB,IAAahP,MAAS,WAAW,UAAU,OAC3CiP,IAAa5kB,EAAK,OAAO,CAAChF,GAAKnE,MAAMmE,IAAM0pB,EAAS7tB,CAAC,GAAG,CAAC,GAEzDguB,IAAY7kB,EAAK,IAAI,CAAC3F,GAAQyqB,OAAW;AAAA,IAC7C,GAAGzqB;AAAA;AAAA,IAEH,YAAYsb,MAAS,aAAa,cAActb,EAAO;AAAA,IACvD,MAAMA,EAAO;AAAA,IACb,OAAOqqB,EAASrqB,CAAM;AAAA,IACtB,MAAM2oB,GAAO8B,IAAQ9B,GAAO,MAAM;AAAA,EAAA,EAClC,GAEI+B,IAAa,CAACC,GAAYF,MAAkB;AAChD,IAAAL,EAAeK,CAAK;AAAA,EACtB;AAEA,SACE,gBAAAtoB,EAAC,OAAA,EAAI,WAAU,iBAEb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,+BAA8B,4CAE9C,EAAA,CACF;AAAA,IAEA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,uCAAsC,UAAA,WAEtD;AAAA,MACA,gBAAAmB,EAAC,QAAA,EAAK,WAAU,gCAA+B,UAAA;AAAA,QAAA;AAAA,QAC3CwD,EAAK;AAAA,QAAO;AAAA,QAAW4kB,EAAW,eAAA;AAAA,QAAiB;AAAA,QAAED;AAAA,QAAW;AAAA,MAAA,EAAA,CACpE;AAAA,IAAA,GACF;AAAA,sBAGC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,IAAA,GACnC,UAAA,gBAAAtpB,EAAC4pB,MAAoB,OAAM,QAAO,QAAQ,KACxC,4BAACC,IAAA,EACC,UAAA,gBAAA7pB;AAAA,MAAC8pB;AAAA,MAAA;AAAA,QAEG,aAAAX;AAAA,QACA,aAAavB;AAAA,QACb,MAAM4B;AAAA,QACN,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,aAAa;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,QACT,cAAcE;AAAA,QAGf,UAAAF,EAAU,IAAI,CAACO,MACd,gBAAA/pB,EAACgqB,IAAA,EAA0B,MAAMD,EAAM,QAA5BA,EAAM,QAA4B,CAC9C;AAAA,MAAA;AAAA,IAAA,EACH,CACF,GACF,GACF;AAAA,IAGA,gBAAA/pB,EAAC,SAAI,WAAU,uEACZ,YAAU,IAAI,CAACiqB,GAAMR,MACpB,gBAAAtoB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMioB,EAAeK,CAAK;AAAA,QACnC,WAAW,CAACpoB,MAAM;AAChB,WAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACF+nB,EAAeK,CAAK;AAAA,QAExB;AAAA,QACA,WAAW,+KACTN,MAAgBM,IAAQ,6BAA6B,EACvD;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAzpB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,iBAAiBiqB,EAAK,KAAA;AAAA,YAAK;AAAA,UAAA;AAAA,UAEtC,gBAAA9oB,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,2DACV,UAAAiqB,EAAK,YACR;AAAA,YACA,gBAAA9oB,EAAC,KAAA,EAAE,WAAU,wCACV,UAAA;AAAA,cAAAkoB,EAAS1kB,EAAK8kB,CAAK,CAAC,EAAE,eAAA;AAAA,cAAiB;AAAA,cAAEH;AAAA,YAAA,EAAA,CAC5C;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MAvBKW,EAAK;AAAA,IAAA,CAyBb,EAAA,CACH;AAAA,EAAA,GACF;AAEJ,GC7LMC,KAAiB;AAAA,EACrB;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AASA,SAASC,GAAW,EAAE,QAAAnrB,GAAQ,OAAAyqB,GAAO,MAAAnP,GAAM,UAAA8P,KAA6B;AACtE,SACE,gBAAAjpB,EAAC,OAAA,EAAsB,WAAU,2BAC/B,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,iBAAiBoqB,EAASprB,GAAQyqB,CAAK,EAAA;AAAA,MAAE;AAAA,IAAA;AAAA,IAEpD,gBAAAzpB,EAAC,QAAA,EAAK,WAAU,wCAAwC,YAAO,MAAK;AAAA,sBACnE,QAAA,EAAK,WAAU,yBAAwB,OAAO,EAAE,OAAOoqB,EAASprB,GAAQyqB,CAAK,EAAA,GAC3E,gBAAS,WAAWzqB,EAAO,cAAc,GAAGA,EAAO,oBAAoB,OAAA,CAC1E;AAAA,EAAA,EAAA,GARQA,EAAO,IASjB;AAEJ;AAEO,MAAMqrB,KAA8D,CAAC,EAAE,QAAAC,IAAS,IAAI,MAAAhQ,IAAO,eAAe;AAC/G,QAAM,CAAC3V,GAAM4lB,CAAO,IAAIxvB,EAAiC,IAAI,GACvD,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI;AAmBtD,MAjBAC,GAAU,MAAM;AAcd,KAbkB,YAAY;AAC5B,UAAI;AACF,QAAA2B,EAAW,EAAI;AACf,cAAM4B,IAAS,MAAMisB,GAAmB,UAAUF,CAAM;AACxD,QAAAC,EAAQhsB,CAAM,GACdT,EAAS,IAAI;AAAA,MACf,SAASW,GAAK;AACZ,QAAAX,EAASW,aAAe,QAAQA,EAAI,UAAU,uBAAuB;AAAA,MACvE,UAAA;AACE,QAAA9B,EAAW,EAAK;AAAA,MAClB;AAAA,IACF,GAEA;AAAA,EACF,GAAG,CAAC2tB,CAAM,CAAC,GAEP5tB;AACF,WACE,gBAAAsD,EAAC,SAAI,WAAU,8CACb,4BAACsB,GAAA,EAAQ,WAAU,wDAAuD,EAAA,CAC5E;AAIJ,MAAIzD,KAAS,CAAC8G;AACZ,WACE,gBAAA3E,EAAC,OAAA,EAAI,WAAU,2EACZ,eAAS,4BACZ;AAIJ,MAAI,CAAC2E,GAAM,WAAW,UAAU,CAACA,GAAM,SAAS;AAC9C,WACE,gBAAA3E,EAAC,OAAA,EAAI,WAAU,2EAA0E,UAAA,wCAEzF;AAKJ,QAAMwpB,IAAY7kB,EAAK,UAAU,IAAI,CAAC8lB,MAAQ;AAC5C,UAAMV,IAAyC;AAAA,MAC7C,MAAM,IAAI,KAAKU,EAAI,IAAI,EAAE,mBAAmB,SAAS;AAAA,QACnD,KAAK;AAAA,QACL,OAAO;AAAA,MAAA,CACR;AAAA,IAAA;AAEH,WAAA9lB,EAAK,QAAQ,QAAQ,CAAC3F,MAAW;AAC/B,MAAIsb,MAAS,WACXyP,EAAM/qB,EAAO,IAAI,IAAIyrB,EAAI,aAAazrB,EAAO,IAAI,KAAK,IAEtD+qB,EAAM/qB,EAAO,IAAI,IAAIyrB,EAAI,kBAAkBzrB,EAAO,IAAI,KAAK;AAAA,IAE/D,CAAC,GACM+qB;AAAA,EACT,CAAC,GAEKK,IAAW,CAACprB,GAAyByqB,MAClCzqB,EAAO,SAASkrB,GAAeT,IAAQS,GAAe,MAAM;AAGrE,SACE,gBAAA/oB,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,IAAA,GACnC,UAAA,gBAAAA,EAAC4pB,IAAA,EAAoB,OAAM,QAAO,QAAQ,KACxC,UAAA,gBAAAzoB;AAAA,MAACupB;AAAA,MAAA;AAAA,QACC,MAAMlB;AAAA,QACN,QAAQ,EAAE,KAAK,GAAG,OAAO,IAAI,MAAM,IAAI,QAAQ,EAAA;AAAA,QAE/C,UAAA;AAAA,UAAA,gBAAAxpB;AAAA,YAAC2qB;AAAA,YAAA;AAAA,cACC,iBAAgB;AAAA,cAChB,QAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAET,gBAAA3qB;AAAA,YAAC4qB;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,QAAO;AAAA,cACP,OAAO,EAAE,UAAU,OAAA;AAAA,cACnB,MAAM,EAAE,MAAM,wBAAA;AAAA,YAAwB;AAAA,UAAA;AAAA,UAExC,gBAAA5qB;AAAA,YAAC6qB;AAAA,YAAA;AAAA,cACC,QAAO;AAAA,cACP,OAAO,EAAE,UAAU,OAAA;AAAA,cACnB,MAAM,EAAE,MAAM,wBAAA;AAAA,cACd,OAAO;AAAA,gBACL,OAAOvQ,MAAS,WAAW,UAAU;AAAA,gBACrC,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,OAAO,EAAE,MAAM,yBAAyB,UAAU,OAAA;AAAA,cAAO;AAAA,YAC3D;AAAA,UAAA;AAAA,UAEF,gBAAAta;AAAA,YAAC8qB;AAAA,YAAA;AAAA,cACC,cAAc;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,OAAO;AAAA,cAAA;AAAA,cAET,YAAY,EAAE,OAAO,uBAAuB,YAAY,QAAQ,cAAc,MAAA;AAAA,cAC9E,WAAW,EAAE,OAAO,wBAAA;AAAA,YAAwB;AAAA,UAAA;AAAA,UAE9C,gBAAA9qB;AAAA,YAAC+qB;AAAA,YAAA;AAAA,cACC,cAAc;AAAA,gBACZ,YAAY;AAAA,cAAA;AAAA,cAEd,WAAW,CAAC/wB,MACV,gBAAAgG,EAAC,QAAA,EAAK,OAAO,EAAE,OAAO,yBAAyB,UAAU,OAAA,GAAW,UAAAhG,EAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAG7E2K,EAAK,QAAQ,IAAI,CAAC3F,GAAQyqB,MACzB,gBAAAzpB;AAAA,YAACgrB;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAShsB,EAAO;AAAA,cAChB,QAAQorB,EAASprB,GAAQyqB,CAAK;AAAA,cAC9B,aAAa;AAAA,cACb,KAAK,EAAE,GAAG,GAAG,MAAMW,EAASprB,GAAQyqB,CAAK,EAAA;AAAA,cACzC,WAAW,EAAE,GAAG,GAAG,MAAMW,EAASprB,GAAQyqB,CAAK,EAAA;AAAA,YAAE;AAAA,YAN5CzqB,EAAO;AAAA,UAAA,CAQf;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEL,EAAA,CACF;AAAA,sBAGC,OAAA,EAAI,WAAU,kFACZ,UAAA2F,EAAK,QAAQ,IAAI,CAAC3F,GAAQyqB,MACzB,gBAAAzpB,EAACmqB,IAAA,EAA6B,QAAAnrB,GAAgB,OAAAyqB,GAAc,MAAAnP,GAAY,UAAA8P,KAAvDprB,EAAO,IAAoE,CAC7F,EAAA,CACH;AAAA,EAAA,GACF;AAEJ,GCtLMisB,KAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAA8D,CAAC,EAAE,MAAAvmB,GAAM,MAAA2V,IAAO,eAAe;AACxG,MAAI,CAAC3V,KAAQA,EAAK,WAAW;AAC3B,WACE,gBAAA3E,EAAC,OAAA,EAAI,WAAU,iDAAgD,UAAA,sCAE/D;AAIJ,QAAMqpB,IAAW,CAACrqB,MAChBsb,MAAS,WAAWtb,EAAO,cAAcA,EAAO,sBAC5CsqB,IAAahP,MAAS,WAAW,UAAU,OAE3C6Q,IAAW,KAAK,IAAI,GAAGxmB,EAAK,IAAI,CAAAnJ,MAAK6tB,EAAS7tB,CAAC,CAAC,GAAG,CAAC;AAE1D,SACE,gBAAAwE,EAAC,SAAI,WAAU,aACZ,YAAK,IAAI,CAAChB,GAAQyqB,MAAU;AAC3B,UAAMzvB,IAAQqvB,EAASrqB,CAAM,GACvBosB,IAAcpxB,IAAQmxB,IAAY;AAExC,WACE,gBAAAhqB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO,EAAE,iBAAiB8pB,GAAaxB,IAAQwB,GAAa,MAAM,EAAA;AAAA,QAElE,UAAA;AAAA,UAAA,gBAAA9pB,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,UAEb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,sDACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,iBAAiB,UAAAhB,EAAO,YAAW;AAAA,gBACnD,gBAAAgB,EAAC,QAAA,EAAK,WAAU,QAAO,UAAA,KAAC;AAAA,gBACxB,gBAAAA,EAAC,QAAA,EAAK,WAAU,kBAAkB,YAAO,WAAA,CAAW;AAAA,cAAA,GACtD;AAAA,cACA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA,EAAC,QAAG,WAAU,4CACX,UAAAhB,EAAO,WAAA,CACV,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YACA,gBAAAmC,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,qBAAoB,OAAO,EAAE,OAAOirB,GAAaxB,IAAQwB,GAAa,MAAM,EAAA,GACxF,UAAAjxB,EAAM,kBACT;AAAA,cACA,gBAAAgG,EAAC,OAAA,EAAI,WAAU,wCAAwC,UAAAspB,EAAA,CAAW;AAAA,YAAA,EAAA,CACpE;AAAA,UAAA,GACF;AAAA,UAEA,gBAAAtpB,EAAC,OAAA,EAAI,WAAU,gEACb,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO,GAAGorB,CAAU;AAAA,gBACpB,iBAAiBH,GAAaxB,IAAQwB,GAAa,MAAM;AAAA,cAAA;AAAA,YAC3D;AAAA,UAAA,GAEJ;AAAA,UAEA,gBAAA9pB,EAAC,OAAA,EAAI,WAAU,gEACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gCAC1B,QAAA,EAAM,UAAA;AAAA,gBAAA1C,EAAO;AAAA,gBAAY;AAAA,cAAA,EAAA,CAAqB;AAAA,YAAA,GACjD;AAAA,YACA,gBAAAmC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,cAC/B,gBAAAT,EAAC,QAAA,EAAM,UAAAhB,EAAO,WAAA,CAAW;AAAA,YAAA,EAAA,CAC3B;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MA7CKA,EAAO;AAAA,IAAA;AAAA,EAgDlB,CAAC,EAAA,CACH;AAEJ,GClEMqsB,KAMD,CAAC,EAAE,OAAAC,GAAO,OAAAtxB,GAAO,MAAAuxB,GAAM,OAAAC,GAAO,UAAAC,QAW/B,gBAAAtqB,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,EAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,oDAAoD,UAAAsrB,GAAM;AAAA,sBACzE,OAAA,EAAI,WAbQ;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,KAAK;AAAA,IAAA,EAO0BE,CAAK,GAAI,UAAAD,EAAA,CAAK;AAAA,EAAA,GAC3C;AAAA,EACA,gBAAAvrB,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAA,OAAOhG,KAAU,WAAWA,EAAM,eAAA,IAAmBA,EAAA,CAAM;AAAA,EAC1HyxB,KAAY,gBAAAzrB,EAAC,OAAA,EAAI,WAAU,4CAA4C,UAAAyrB,EAAA,CAAS;AAAA,GACnF;AAIG,SAASC,KAAqC;AACnD,QAAMhwB,IAAWC,GAAA,GACX,EAAE,GAAAH,EAAA,IAAMC,GAAe,OAAO,GAC9B,CAACiE,GAAOisB,CAAQ,IAAI5wB,EAAyC,IAAI,GACjE,CAAC6wB,GAAYC,CAAa,IAAI9wB,EAAyB,CAAA,CAAE,GACzD,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC+wB,GAAYC,CAAa,IAAIhxB,EAAS,EAAK,GAC5C,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACuvB,GAAQ0B,CAAS,IAAIjxB,EAAS,EAAE,GACjC,CAACkxB,GAAWC,CAAY,IAAInxB,EAAoB,QAAQ,GAExD4gB,IAAWrd,EAAY,YAAY;AACvC,QAAI;AACF,MAAAR,EAAS,IAAI;AACb,YAAM,CAACquB,GAAcC,CAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,QACtD5B,GAAmB,kBAAkBF,CAAM;AAAA,QAC3CE,GAAmB,cAAc,GAAGF,GAAQ2B,MAAc,WAAW,WAAW,UAAU;AAAA,MAAA,CAC3F;AACD,MAAAN,EAASQ,CAAY,GACrBN,EAAcO,CAAa;AAAA,IAC7B,SAAS3tB,GAAK;AACZ,MAAAX,EAASW,aAAe,QAAQA,EAAI,UAAU,0BAA0B;AAAA,IAC1E,UAAA;AACE,MAAA9B,EAAW,EAAK,GAChBovB,EAAc,EAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAACzB,GAAQ2B,CAAS,CAAC;AAEtB,EAAAjxB,GAAU,MAAM;AACd,IAAA2B,EAAW,EAAI,GACfgf,EAAA;AAAA,EACF,GAAG,CAACA,CAAQ,CAAC;AAEb,QAAM+F,IAAgB,MAAM;AAC1B,IAAAqK,EAAc,EAAI,GAClBpQ,EAAA;AAAA,EACF,GAEM0Q,IAAiB,CAACC,MAA4B;AAClD,QAAIA,IAAU,GAAI,QAAO,GAAGA,CAAO;AACnC,UAAMC,IAAU,KAAK,MAAMD,IAAU,EAAE;AACvC,WAAIC,IAAU,KAAW,GAAGA,CAAO,MAE5B,GADO,KAAK,MAAMA,IAAU,EAAE,CACtB,KAAKA,IAAU,EAAE;AAAA,EAClC;AAEA,SAAI7vB,IAEA,gBAAAsD,EAAC,SAAI,WAAU,yCACb,4BAACsB,GAAA,EAAQ,WAAU,wDAAuD,EAAA,CAC5E,IAIAzD,sBAEC,OAAA,EAAI,WAAU,aACb,UAAA,gBAAAsD,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,iDAAA,CAAiD;AAAA,IAC1E,gBAAA7f,EAAC,SAAI,WAAU,UACb,4BAAC,KAAA,EAAE,WAAU,wCAAwC,UAAAnC,EAAA,CAAM,EAAA,CAC7D;AAAA,IACA,gBAAAmC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS0hB;AAAA,QACT,WAAU;AAAA,QAEV,UAAA,gBAAA1hB,EAACoV,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACjC,EAAA,CACF,EAAA,CACF,IAKF,gBAAAjU,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,2BAA2B,WAAW,EAAA;AAAA,QAAE;AAAA,MACrD;AAAA,IAAA;AAAA,IAIF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UAC9BjF,EAAE,2BAA2B,yBAAyB;AAAA,QAAA,GACzD;AAAA,0BACC,KAAA,EAAE,WAAU,qCACV,UAAAA,EAAE,8BAA8B,mDAAmD,EAAA,CACtF;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,4GACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMksB,EAAa,QAAQ;AAAA,cACpC,WAAW,6DACTD,MAAc,WACV,uDACA,yDACN;AAAA,cAEA,UAAA,gBAAA9qB,EAAC,QAAA,EAAK,WAAU,6BACd,UAAA;AAAA,gBAAA,gBAAAnB,EAACwsB,IAAA,EAAS,WAAU,cAAA,CAAc;AAAA,gBACjChxB,EAAE,4BAA4B,OAAO;AAAA,cAAA,EAAA,CACxC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMksB,EAAa,UAAU;AAAA,cACtC,WAAW,6DACTD,MAAc,aACV,uDACA,yDACN;AAAA,cAEA,UAAA,gBAAA9qB,EAAC,QAAA,EAAK,WAAU,6BACd,UAAA;AAAA,gBAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,cAAA,CAAc;AAAA,gBAC9B/G,EAAE,8BAA8B,OAAO;AAAA,cAAA,EAAA,CAC1C;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOmpB;AAAA,YACP,UAAU,CAACjpB,MAAM2qB,EAAU,OAAO3qB,EAAE,OAAO,KAAK,CAAC;AAAA,YACjD,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAF,EAAC,UAAA,EAAO,OAAO,GAAG,UAAA;AAAA,gBAAA;AAAA,gBAAG3F,EAAE,eAAe,OAAO;AAAA,cAAA,GAAE;AAAA,cAC/C,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,UAAA;AAAA,gBAAA;AAAA,gBAAI3F,EAAE,eAAe,OAAO;AAAA,cAAA,GAAE;AAAA,cACjD,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,UAAA;AAAA,gBAAA;AAAA,gBAAI3F,EAAE,eAAe,OAAO;AAAA,cAAA,EAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEnD,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASugB;AAAA,YACT,UAAUoK;AAAA,YACV,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA9rB,EAACoV,MAAU,WAAW,WAAW0W,IAAa,iBAAiB,EAAE,IAAI;AAAA,cACpEtwB,EAAE,kBAAkB,YAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACnC,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,wDACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,kCAAkC,eAAe;AAAA,UAC1D,OAAOkE,GAAO,gBAAgB;AAAA,UAC9B,MAAM,gBAAAM,EAACS,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,UACrC,OAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAER,gBAAAT;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,mCAAmC,gBAAgB;AAAA,UAC5D,OAAOkE,GAAO,iBAAiB;AAAA,UAC/B,MAAM,gBAAAM,EAACud,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,UACvC,OAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAER,gBAAAvd;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,sCAAsC,WAAW;AAAA,UAC1D,OAAOkE,GAAO,oBAAoB;AAAA,UAClC,MAAM,gBAAAM,EAAC4B,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,UACvC,OAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAER,gBAAA5B;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,kCAAkC,eAAe;AAAA,UAC1D,OAAOkE,GAAO,gBAAgB;AAAA,UAC9B,MAAM,gBAAAM,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,UACjC,OAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAER,gBAAA1B;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,gCAAgC,cAAc;AAAA,UACvD,OAAO6wB,EAAe3sB,GAAO,sBAAsB,CAAC;AAAA,UACpD,MAAM,gBAAAM,EAACysB,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,UACjC,OAAM;AAAA,UACN,UAAU,GAAGnC,CAAM,IAAI9uB,EAAE,eAAe,OAAO,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAElD,gBAAAwE;AAAA,QAACqrB;AAAA,QAAA;AAAA,UACC,OAAO7vB,EAAE,gCAAgC,YAAY;AAAA,UACrD,OAAO,GAAGkE,GAAO,WAAW,QAAQ,CAAC,KAAK,CAAC;AAAA,UAC3C,MAAM,gBAAAM,EAAC0sB,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,UACtC,QAAQhtB,GAAO,cAAc,MAAM,IAAI,UAAU;AAAA,UACjD,UAAUlE,EAAE,sCAAsC,uBAAuB;AAAA,QAAA;AAAA,MAAA;AAAA,IAC3E,GACF;AAAA,IAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,oEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAAC2sB,IAAA,EAAc,WAAU,0CAAA,CAA0C;AAAA,UAClEnxB,EAAE,0CAA0C,kBAAkB;AAAA,QAAA,GACjE;AAAA,QACA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMzF,EAAS,iCAAiC;AAAA,YACzD,WAAU;AAAA,YAET,UAAA;AAAA,cAAAF,EAAE,2CAA2C,OAAO;AAAA,cACrD,gBAAAwE,EAAC,QAAA,EAAK,eAAY,QAAO,UAAA,IAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,GACF;AAAA,MACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,UAAK,WAAU,kDACb,UAAAxE,EAAE,4CAA4C,YAAY,GAC7D;AAAA,YACA,gBAAAwE,EAACuC,IAAA,EAAM,WAAU,qCAAA,CAAqC;AAAA,UAAA,GACxD;AAAA,4BACC,OAAA,EAAI,WAAU,iDACZ,UAAA7C,GAAO,yBAAyB,EAAA,CACnC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAyB,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,UAAK,WAAU,kDACb,UAAAxE,EAAE,6CAA6C,YAAY,GAC9D;AAAA,YACA,gBAAAwE,EAAC4sB,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,UAAA,GAC9D;AAAA,4BACC,OAAA,EAAI,WAAU,iDACZ,UAAAltB,GAAO,0BAA0B,EAAA,CACpC;AAAA,QAAA,GACF;AAAA,QACA,gBAAAyB,EAAC,OAAA,EAAI,WAAU,2EACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,UAAK,WAAU,gDACb,UAAAxE,EAAE,2CAA2C,UAAU,GAC1D;AAAA,YACA,gBAAAwE,EAAC4f,IAAA,EAAQ,WAAU,mCAAA,CAAmC;AAAA,UAAA,GACxD;AAAA,4BACC,OAAA,EAAI,WAAU,+CACZ,UAAAlgB,GAAO,wBAAwB,EAAA,CAClC;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAyB,EAAC,OAAA,EAAI,WAAU,yCAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,0CAAA,CAA0C;AAAA,UAC9DwrB,MAAc,WAAWzwB,EAAE,8BAA8B,UAAU,IAAIA,EAAE,+BAA+B,aAAa;AAAA,UAAE;AAAA,UAAEA,EAAE,8BAA8B,YAAY;AAAA,QAAA,GACxK;AAAA,QACCowB,EAAW,SAAS,IACnB,gBAAA5rB,EAACkpB,IAAA,EAAuB,MAAM0C,GAAY,MAAMK,EAAA,CAAW,sBAE1D,OAAA,EAAI,WAAU,iDACZ,UAAAzwB,EAAE,4BAA4B,0BAA0B,EAAA,CAC3D;AAAA,MAAA,GAEJ;AAAA,MAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,UAAA,gBAAAnB,EAACwsB,IAAA,EAAS,WAAU,yBAAA,CAAyB;AAAA,UAC5ChxB,EAAE,oCAAoC,wBAAwB;AAAA,QAAA,GACjE;AAAA,QACCkE,GAAO,cAAcA,EAAM,WAAW,SAAS,sBAC7C,OAAA,EAAI,WAAU,aACZ,UAAAA,EAAM,WAAW,MAAM,GAAG,CAAC,EAAE,IAAI,CAACV,GAAQyqB,MACzC,gBAAAtoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YAEL,WAAU;AAAA,YACV,SAAS,MAAMzF,EAAS,2BAA2BsD,EAAO,QAAQ,EAAE;AAAA,YAEpE,UAAA;AAAA,cAAA,gBAAAgB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,iBAAiB,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS,EAAEypB,IAAQ,CAAC,EAAA;AAAA,kBAE1F,UAAAA,IAAQ;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEX,gBAAAtoB,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,mDAAmD,UAAAhB,EAAO,YAAW;AAAA,gBAClF,gBAAAmC,EAAC,KAAA,EAAE,WAAU,uCACV,UAAA;AAAA,kBAAAnC,EAAO;AAAA,kBAAW;AAAA,kBAAIA,EAAO;AAAA,kBAAY;AAAA,kBAAExD,EAAE,2BAA2B,cAAc;AAAA,gBAAA,EAAA,CACzF;AAAA,cAAA,GACF;AAAA,cACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,4CACV,UAAAisB,MAAc,WAAWjtB,EAAO,cAAc,GAAGA,EAAO,oBAAoB,IAAA,CAC/E;AAAA,gBACA,gBAAAgB,EAAC,KAAA,EAAE,WAAU,uCACV,UAAAisB,MAAc,WAAWzwB,EAAE,8BAA8B,OAAO,IAAIA,EAAE,+BAA+B,aAAa,EAAA,CACrH;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAvBKwD,EAAO;AAAA,QAAA,CAyBf,GACH,IAEA,gBAAAgB,EAAC,OAAA,EAAI,WAAU,iDACZ,UAAAxE,EAAE,4BAA4B,0BAA0B,EAAA,CAC3D;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,QAAA,gBAAAnB,EAAC0sB,IAAA,EAAW,WAAU,UAAA,CAAU;AAAA,QAC/BlxB,EAAE,gCAAgC;AAAA,UACjC,cAAc,YAAYywB,MAAc,WAAW,kBAAkB,gBAAgB;AAAA,QAAA,CACtF;AAAA,QAAE;AAAA,QAAG3B;AAAA,QAAO;AAAA,QAAE9uB,EAAE,eAAe,OAAO;AAAA,QAAE;AAAA,MAAA,GAC3C;AAAA,MACA,gBAAAwE,EAACqqB,IAAA,EAAsB,QAAAC,GAAgB,MAAM2B,EAAA,CAAW;AAAA,IAAA,GAC1D;AAAA,IAGA,gBAAA9qB,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,yEACZ,UAAA;AAAA,QAAA,gBAAAnB,EAACS,IAAA,EAAU,WAAU,0BAAA,CAA0B;AAAA,QAC9CjF,EAAE,oCAAoC;AAAA,UACrC,cAAc,oBAAoBywB,MAAc,WAAW,WAAW,UAAU;AAAA,QAAA,CACjF;AAAA,QACD,gBAAA9qB,EAAC,QAAA,EAAK,WAAU,yDAAwD,UAAA;AAAA,UAAA;AAAA,UACpE3F,EAAE,+BAA+B,aAAa;AAAA,UAAE;AAAA,QAAA,EAAA,CACpD;AAAA,MAAA,GACF;AAAA,MACCowB,EAAW,SAAS,IACnB,gBAAA5rB,EAACkrB,IAAA,EAAsB,MAAMU,GAAY,MAAMK,EAAA,CAAW,sBAEzD,OAAA,EAAI,WAAU,iDACZ,UAAAzwB,EAAE,4BAA4B,0BAA0B,EAAA,CAC3D;AAAA,IAAA,GAEJ;AAAA,sBAGC,OAAA,EAAI,WAAU,iKACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,sEACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,QAAG,WAAU,wCAAwC,UAAAxE,EAAE,gCAAgC,2BAA2B,GAAE;AAAA,0BACpH,KAAA,EAAE,WAAU,6CACV,UAAAA,EAAE,wCAAwC,8DAA8D,EAAA,CAC3G;AAAA,MAAA,GACF;AAAA,MACA,gBAAAwE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMtE,EAAS,8BAA8B;AAAA,UACtD,WAAU;AAAA,UAET,UAAAF,EAAE,iCAAiC,kBAAkB;AAAA,QAAA;AAAA,MAAA;AAAA,IACxD,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AC5YA,MAAM6N,KAAyB,CAACC,GAAwBC,MAAqC;AAC3F,MAAID,EAAO,OAAOC,EAAU,QAAOD;AACnC,QAAME,IAAgB,CAACF,EAAO;AAC9B,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,YAAYE;AAAA,IACZ,UAAUF,EAAO,SAAS,IAAI,CAAAG,OAAM,EAAE,GAAGA,GAAG,YAAYD,IAAgB;AAAA,EAAA;AAE5E,GAEME,KAA0B,CAACJ,GAAwBC,GAAkBI,MAAsC;AAC/G,MAAIL,EAAO,OAAOC,EAAU,QAAOD;AACnC,QAAMM,IAAcN,EAAO,SAAS;AAAA,IAAI,CAAAG,MACtCA,EAAE,OAAOE,IAAY,EAAE,GAAGF,GAAG,YAAY,CAACA,EAAE,eAAeA;AAAA,EAAA,GAEvDI,IAAqBD,EAAY,KAAK,CAAAH,MAAKA,EAAE,UAAU;AAC7D,SAAO;AAAA,IACL,GAAGH;AAAA,IACH,YAAYO;AAAA,IACZ,UAAUD;AAAA,EAAA;AAEd,GAEME,KAAoB,CAACR,OAA4C;AAAA,EACrE,GAAGA;AAAA,EACH,YAAY;AAAA,EACZ,UAAUA,EAAO,SAAS,IAAI,CAAA,OAAM,EAAE,GAAG,GAAG,YAAY,KAAO;AACjE,IAEMS,KAAmB,CAACT,OAA4C;AAAA,EACpE,GAAGA;AAAA,EACH,YAAY;AAAA,EACZ,UAAUA,EAAO,SAAS,IAAI,CAAA,OAAM,EAAE,GAAG,GAAG,YAAY,KAAQ;AAClE;AAEA,SAASujB,GACP9f,GACsB;AACtB,SAAO;AAAA,IACL,eAAeA,EAAI;AAAA,IACnB,OAAOA,EAAI;AAAA,IACX,MAAMA,EAAI;AAAA,IACV,aAAaA,EAAI;AAAA,IACjB,MAAMA,EAAI;AAAA,IACV,aAAaA,EAAI;AAAA,IACjB,YAAYA,EAAI;AAAA,IAChB,YAAYA,EAAI;AAAA,IAChB,QAAQ;AAAA,IACR,sBAAsB;AAAA,IACtB,mBAAmBA,EAAI;AAAA,IACvB,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,IACvB,oBAAoBA,EAAI;AAAA,IACxB,qBAAqB;AAAA,IACrB,kBAAkBA,EAAI;AAAA,IACtB,mBAAmBA,EAAI;AAAA,EAAA;AAE3B;AAEO,SAAS+f,GAAwBC,GAA6D;AACnG,QAAM,CAAC7iB,GAAcC,CAAe,IAAIpP,EAAwC,IAAI,GAC9E,CAACqP,GAAaC,CAAc,IAAItP,EAAS,EAAK,GAE9C,CAACuP,GAAmBC,CAAoB,IAAIxP,EAAS,EAAK,GAC1D,CAACyP,GAAeC,CAAgB,IAAI1P,EAAoC,CAAA,CAAE,GAC1E,CAAC2P,GAAsBC,CAAuB,IAAI5P,EAAS,EAAK,GAChE,CAAC6P,GAAgBC,CAAiB,IAAI9P,EAAmB,CAAA,CAAE,GAC3D,CAAC+P,GAAeC,CAAgB,IAAIhQ,EAAS,EAAK,GAClD,CAACiQ,GAAeC,CAAgB,IAAIlQ,EAAS,EAAE,GAC/C,CAACmQ,GAAoBC,CAAqB,IAAIpQ,EAAwB,IAAI,GAE1E,CAACqQ,GAAqBC,CAAsB,IAAItQ,EAAiC,YAAY,GAC7F,CAACuQ,GAAgBC,CAAiB,IAAIxQ,EAAyB,MAAM,GACrE,CAACyQ,GAAaC,CAAc,IAAI1Q,EAA2B,CAAA,CAAE,GAC7D,CAAC2Q,GAAqBC,CAAsB,IAAI5Q,EAAsB,oBAAI,KAAK,GAC/E,CAAC6Q,GAAoBC,CAAqB,IAAI9Q,EAAS,EAAK,GAE5D,CAAC+Q,GAAqBC,EAAsB,IAAIhR,EAAS,EAAK,GAC9D,CAACiR,IAAgBC,CAAiB,IAAIlR,EAAsC,IAAI,GAEhFmR,IAAmB5N,EAAY,YAAY;AAC/C,QAAKyuB,GACL;AAAA,MAAA1iB,EAAe,EAAI;AACnB,UAAI;AACF,cAAM1F,IAAO,MAAMnG,EAAS,UAAU,gBAAgBuuB,CAAU,GAC1DC,IAAS,MAAM,QAAQroB,CAAI,IAAIA,EAAK,IAAIkoB,EAAyB,IAAI,CAAA;AAC3E,QAAA1iB,EAAgB6iB,CAAM;AAAA,MACxB,SAASvuB,GAAK;AACZ,gBAAQ,MAAM,yCAAyCA,CAAG,GAC1D0L,EAAgB,CAAA,CAAE;AAAA,MACpB,UAAA;AACE,QAAAE,EAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAAG,CAAC0iB,CAAU,CAAC,GAET5gB,KAAoB7N,EAAY,YAAY;AAChD,QAAKyuB,GACL;AAAA,MAAAxiB,EAAqB,EAAI,GACzBM,EAAkB,CAAA,CAAE,GACpBF,EAAwB,EAAI,GAC5BQ,EAAsB,IAAI;AAC1B,UAAI;AACF,cAAMiB,IAAsB,MAAM5N,EAAS,UAAU,yBAAyBuuB,CAAU;AACxF,QAAAtiB,EAAiB2B,EAAoB,OAAO,CAAAC,MAAK,CAACA,EAAE,UAAU,CAAC;AAAA,MACjE,SAAS5N,GAAK;AACZ,gBAAQ,MAAM,0CAA0CA,CAAG;AAC3D,cAAM6N,IAAc7N,aAAe,SAASA,EAAI,SAAS;AACzD,QAAA0M,EAAsBmB,IAAc,cAAc,SAAS;AAAA,MAC7D,UAAA;AACE,QAAA3B,EAAwB,EAAK;AAAA,MAC/B;AAAA;AAAA,EACF,GAAG,CAACoiB,CAAU,CAAC,GAETxgB,IAAsBjO,EAAY,MAAM;AAC5C,IAAAiM,EAAqB,EAAK,GAC1BM,EAAkB,CAAA,CAAE,GACpBI,EAAiB,EAAE,GACnBI,EAAuB,YAAY,GACnCE,EAAkB,MAAM,GACxBE,EAAe,CAAA,CAAE,GACjBE,EAAuB,oBAAI,KAAK;AAAA,EAClC,GAAG,CAAA,CAAE,GAECa,IAA2BlO,EAAY,YAAY;AACvD,QAAI,GAACyuB,KAAcniB,EAAe,WAAW,IAC7C;AAAA,MAAAG,EAAiB,EAAI;AACrB,UAAI;AACF,cAAM0B,IAAU;AAAA,UACd,gBAAgB7B;AAAA,UAChB,aAAaQ;AAAA,UACb,YAAYE;AAAA,UACZ,WAAWA,MAAmB,WAAWE,EAAY,OAAO,CAAA3E,MAAKA,EAAE,UAAU,EAAE,IAAI,CAAAA,MAAKA,EAAE,EAAE,IAAI;AAAA,UAChG,YAAYyE,MAAmB,WAAWE,EAAY,QAAQ,CAAA3E,MAAKA,EAAE,SAAS,OAAO,CAAA4C,OAAKA,GAAE,UAAU,EAAE,IAAI,QAAKA,GAAE,EAAE,CAAC,IAAI;AAAA,QAAA;AAG5H,cAAMjL,EAAS,UAAU,uBAAuBuuB,GAAYtgB,CAAO,GAEnE,MAAMP,EAAA,GACNK,EAAA;AAAA,MACF,SAAS9N,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG;AAAA,MACrD,UAAA;AACE,QAAAsM,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAAG,CAACgiB,GAAYniB,GAAgBQ,GAAqBE,GAAgBE,GAAaU,GAAkBK,CAAmB,CAAC,GAElHG,IAA0BpO,EAAY,OAAOqO,MAAkB;AACnE,QAAKogB;AACL,UAAI;AACF,cAAMvuB,EAAS,UAAU,kBAAkBuuB,GAAYpgB,CAAK,GAC5D,MAAMT,EAAA;AAAA,MACR,SAASzN,GAAK;AACZ,gBAAQ,MAAM,iCAAiCA,CAAG;AAAA,MACpD;AAAA,EACF,GAAG,CAACsuB,GAAY7gB,CAAgB,CAAC,GAE3BU,IAA0BtO,EAAY,OAAOqO,GAAeE,MAAwC;AACxG,QAAKkgB;AACL,UAAI;AACF,cAAMvuB,EAAS,UAAU,6BAA6BuuB,GAAYpgB,GAAOE,CAAW,GACpF,MAAMX,EAAA;AAAA,MACR,SAASzN,IAAK;AACZ,gBAAQ,MAAM,kCAAkCA,EAAG;AAAA,MACrD;AAAA,EACF,GAAG,CAACsuB,GAAY7gB,CAAgB,CAAC,GAE3BY,IAAsBxO,EAAY,CAACyO,MAA8B;AACrE,IAAAd,EAAkBc,CAAG,GACrBhB,GAAuB,EAAI;AAAA,EAC7B,GAAG,CAAA,CAAE,GAECiB,IAAuB1O,EAAY,MAAM;AAC7C,IAAAyN,GAAuB,EAAK,GAC5BE,EAAkB,IAAI;AAAA,EACxB,GAAG,CAAA,CAAE,GAECkB,IAAwB1S,GAAQ,MAAM;AAC1C,QAAI,CAACuQ,EAAe,QAAOR;AAE3B,UAAM4C,IAAcpC,EAAc,YAAA;AAClC,WAAOR,EAAc;AAAA,MAAO,CAAAuC,MAC1BA,EAAI,MAAM,YAAA,EAAc,SAASK,CAAW,KAC5CL,EAAI,KAAK,YAAA,EAAc,SAASK,CAAW;AAAA,IAAA;AAAA,EAE/C,GAAG,CAAC5C,GAAeQ,CAAa,CAAC,GAE3BqC,IAAkB/O,EAAY,CAACqO,MAAkB;AACrD,IAAA9B;AAAA,MAAkB,CAAA/L,MAChBA,EAAK,SAAS6N,CAAK,IACf7N,EAAK,OAAO,CAAA2I,OAAMA,OAAOkF,CAAK,IAC9B,CAAC,GAAG7N,GAAM6N,CAAK;AAAA,IAAA;AAAA,EAEvB,GAAG,CAAA,CAAE,GAECW,KAAwBhP,EAAY,MAAM;AAC9C,UAAMiP,IAAcJ,EAAsB,IAAI,CAAAJ,MAAOA,EAAI,EAAE;AAC3D,IAAAlC,EAAkB0C,CAAW;AAAA,EAC/B,GAAG,CAACJ,CAAqB,CAAC,GAEpBK,KAAoBlP,EAAY,MAAM;AAC1C,IAAAuM,EAAkB,CAAA,CAAE;AAAA,EACtB,GAAG,CAAA,CAAE,GAEC4C,KAAwBnP,EAAY,OAAOqO,MAAkB;AACjE,IAAAd,EAAsB,EAAI;AAC1B,QAAI;AACF,YAAM6B,IAAa,MAAMlP,EAAS,aAAa,WAAWmO,CAAK,GACzDgB,KAAgC,CAAA;AAEtC,iBAAWC,KAAaF,GAAY;AAElC,cAAMG,MADW,MAAMrP,EAAS,aAAa,kBAAkBmO,GAAOiB,EAAU,EAAE,GACjC,IAAI,CAAAE,QAAY;AAAA,UAC/D,IAAIA,GAAQ;AAAA,UACZ,OAAOA,GAAQ;AAAA,UACf,MAAMA,GAAQ;AAAA,UACd,MAAMA,GAAQ;AAAA,UACd,YAAY;AAAA,QAAA,EACZ;AAEF,QAAAH,GAAY,KAAK;AAAA,UACf,IAAIC,EAAU;AAAA,UACd,OAAOA,EAAU;AAAA,UACjB,MAAMA,EAAU;AAAA,UAChB,MAAMA,EAAU;AAAA,UAChB,YAAY;AAAA,UACZ,UAAUC;AAAA,QAAA,CACX;AAAA,MACH;AAEA,MAAApC,EAAekC,EAAW;AAAA,IAC5B,SAASlP,GAAK;AACZ,cAAQ,MAAM,2BAA2BA,CAAG;AAAA,IAC9C,UAAA;AACE,MAAAoN,EAAsB,EAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAA,CAAE,GAECkC,KAAyBzP,EAAY,CAACiL,MAAqB;AAC/D,IAAAoC,EAAuB,CAAA7M,MAAQ;AAC7B,YAAMkP,KAAS,IAAI,IAAIlP,CAAI;AAC3B,aAAIkP,GAAO,IAAIzE,CAAQ,IACrByE,GAAO,OAAOzE,CAAQ,IAEtByE,GAAO,IAAIzE,CAAQ,GAEdyE;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,KAAmB3P,EAAY,CAACiL,MAAqB;AACzD,IAAAkC,EAAe,CAAA3M,MAAQA,EAAK,IAAI,CAAA+H,OAAKwC,GAAuBxC,IAAG0C,CAAQ,CAAC,CAAC;AAAA,EAC3E,GAAG,CAAA,CAAE,GAEC2E,KAAoB5P,EAAY,CAACiL,GAAkBI,MAAsB;AAC7E,IAAA8B,EAAe,CAAA3M,OAAQA,GAAK,IAAI,CAAA+H,MAAK6C,GAAwB7C,GAAG0C,GAAUI,CAAS,CAAC,CAAC;AAAA,EACvF,GAAG,CAAA,CAAE,GAECwE,IAA0B7P,EAAY,CAACgL,MAAsE;AACjH,QAAIA,EAAO,SAAS,WAAW;AAC7B,aAAOA,EAAO,aAAa,YAAY;AAEzC,UAAM8E,IAAgB9E,EAAO,SAAS,OAAO,CAAAG,OAAKA,GAAE,UAAU,EAAE;AAChE,WAAI2E,MAAkB,IAAU,cAC5BA,MAAkB9E,EAAO,SAAS,SAAe,YAC9C;AAAA,EACT,GAAG,CAAA,CAAE,GAEC+E,KAAe/P,EAAY,MAAM;AACrC,UAAMgQ,IAAe9C,EAAY,QAC3B+C,IAAkB/C,EAAY,OAAO,CAAA3E,MAAKA,EAAE,cAAcA,EAAE,SAAS,KAAK,CAAA4C,OAAKA,GAAE,UAAU,CAAC,EAAE,QAC9F+E,KAAgBhD,EAAY,OAAO,CAAC7L,GAAKkH,OAAMlH,IAAMkH,GAAE,SAAS,QAAQ,CAAC,GACzE4H,IAAmBjD,EAAY,OAAO,CAAC7L,GAAKkH,OAAMlH,IAAMkH,GAAE,SAAS,OAAO,CAAA4C,OAAKA,GAAE,UAAU,EAAE,QAAQ,CAAC;AAC5G,WAAO,EAAE,cAAA6E,GAAc,iBAAAC,GAAiB,eAAAC,IAAe,kBAAAC,EAAA;AAAA,EACzD,GAAG,CAACjD,CAAW,CAAC,GAEVkD,KAAuBpQ,EAAY,MAAM;AAC7C,IAAAmN,EAAe,OAAQ3M,EAAK,IAAI,OAAKgL,GAAkBjD,CAAC,CAAC,CAAC;AAAA,EAC5D,GAAG,CAAA,CAAE,GAEC8H,IAAmBrQ,EAAY,MAAM;AACzC,IAAAmN,EAAe,OAAQ3M,EAAK,IAAI,OAAKiL,GAAiBlD,CAAC,CAAC,CAAC;AAAA,EAC3D,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,cAAAqD;AAAA,IACA,iBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAG;AAAA,IACA,wBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,oBAAAhB;AAAA,IACA,mBAAAiB;AAAA,IACA,0BAAAK;AAAA,IACA,yBAAAE;AAAA,IACA,yBAAAE;AAAA,IACA,qBAAAE;AAAA,IACA,sBAAAE;AAAA,IACA,uBAAAG;AAAA,IACA,iBAAAE;AAAA,IACA,uBAAAC;AAAA,IACA,mBAAAE;AAAA,IACA,uBAAAC;AAAA,IACA,wBAAAM;AAAA,IACA,kBAAAE;AAAA,IACA,mBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,cAAAE;AAAA,IACA,sBAAAK;AAAA,IACA,kBAAAC;AAAA;AAAA,IAEA,qBAAqB,OAAOse,GAAgBC,MAAmC;AAAA,IAAgC;AAAA,IAC/G,sBAAsB,OAAOD,MAAmB;AAAA,IAAgC;AAAA,EAAA;AAEpF;ACtVA,MAAMhN,KAAa,CAAC,QAAQ,gBAAgB,WAAW,IAAI;AAgCpD,SAASkN,KAAyC;AACvD,QAAM,EAAE,GAAA3xB,EAAA,IAAMC,GAAe,OAAO,GAC9B,EAAE,IAAIsxB,EAAA,IAAe5M,GAAA,GACrBzkB,IAAWC,GAAA,GACX,EAAE,WAAAykB,GAAW,cAAAC,EAAA,IAAiBC,GAA0B,QAAQL,EAAU,GAE1E,CAACmN,GAAUC,CAAW,IAAItyB,EAAyC,IAAI,GACvE,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAEhDuyB,IAAuBR,GAAwBC,CAAU,GAEzDQ,IAAejvB,EAAY,YAAY;AAC3C,QAAKyuB;AACL,UAAI;AACF,QAAApwB,EAAW,EAAI;AACf,cAAMgI,IAAO,MAAMnG,EAAS,UAAU,QAAQuuB,CAAU;AACxD,QAAAM,EAAY1oB,CAAI,GAChB7G,EAAS,IAAI;AAAA,MACf,QAAQ;AACN,QAAAA,EAAStC,EAAE,6BAA6B,CAAC;AAAA,MAC3C,UAAA;AACE,QAAAmB,EAAW,EAAK;AAAA,MAClB;AAAA,EACF,GAAG,CAACowB,GAAYvxB,CAAC,CAAC;AAiBlB,MAfAR,GAAU,MAAM;AACd,QAAI,CAAC+xB,GAAY;AACf,MAAArxB,EAAS,kCAAkC;AAC3C;AAAA,IACF;AACA,IAAA6xB,EAAA;AAAA,EACF,GAAG,CAACR,GAAYQ,GAAc7xB,CAAQ,CAAC,GAEvCV,GAAU,MAAM;AACd,IAAIoyB,KAAYL,KACdO,EAAqB,iBAAA;AAAA,EAGzB,GAAG,CAACF,GAAUL,CAAU,CAAC,GAErBrwB;AACF,WACE,gBAAAsD,EAAC,SAAI,WAAU,qDACb,4BAACsB,GAAA,EAAQ,WAAU,qDAAoD,EAAA,CACzE;AAIJ,MAAIzD,KAAS,CAACuvB;AACZ,WACE,gBAAAjsB,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,MAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMzF,EAAS,kCAAkC;AAAA,UAC1D,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAsE,EAAC6hB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,YAC9BrmB,EAAE,iBAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEtB,gBAAA2F,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,mCAAA,CAAmC;AAAA,4BACzD,QAAA,EAAK,WAAU,4BAA4B,UAAAzF,KAASrC,EAAE,oBAAoB,EAAA,CAAE;AAAA,QAAA,GAC/E;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMutB,EAAA;AAAA,YACf,WAAU;AAAA,YAET,YAAE,qBAAqB;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1B,EAAA,CACF;AAAA,IAAA,GACF;AAIJ,QAAMC,IAAWJ,EAAS,qBAAqB,aAAahyB,KAAOqF,IAC7DgtB,IAAYL,EAAS,qBAAqB,aAC5C5xB,EAAE,0BAA0B,IAC5BA,EAAE,0BAA0B;AAEhC,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,iBAAiB,GAAG,MAAM,mCAAA;AAAA,UACrC,EAAE,OAAO4xB,EAAS,KAAA;AAAA,QAAK;AAAA,MACzB;AAAA,IAAA;AAAA,IAIF,gBAAAjsB,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMtE,EAAS,kCAAkC;AAAA,YAC1D,cAAYF,EAAE,iBAAiB;AAAA,YAC/B,WAAU;AAAA,YAEV,UAAA,gBAAAwE,EAAC6hB,IAAA,EAAU,WAAU,uCAAA,CAAuC;AAAA,UAAA;AAAA,QAAA;AAAA,0BAE7D,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA1gB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAAotB,EAAS,MAAK;AAAA,YAC5EA,EAAS,aACR,gBAAAjsB,EAAC,QAAA,EAAK,WAAU,6HACd,UAAA;AAAA,cAAA,gBAAAnB,EAAC0T,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cACzBlY,EAAE,mBAAmB;AAAA,YAAA,EAAA,CACxB;AAAA,UAAA,GAEJ;AAAA,UACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,iDAAiD,UAAAotB,EAAS,MAAK;AAAA,YAC/E,gBAAAptB,EAAC,QAAA,EAAK,WAAU,+BAA8B,UAAA,KAAC;AAAA,YAC/C,gBAAAmB,EAAC,QAAA,EAAK,WAAU,gEACd,UAAA;AAAA,cAAA,gBAAAnB,EAACwtB,GAAA,EAAS,WAAU,cAAA,CAAc;AAAA,cACjCC;AAAA,YAAA,EAAA,CACH;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,gBAAAztB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASutB;AAAA,UACT,cAAY/xB,EAAE,gBAAgB;AAAA,UAC9B,WAAU;AAAA,UAEV,UAAA,gBAAAwE,EAACoV,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACjC,GACF;AAAA,IAGA,gBAAApV,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAAC,SAAI,WAAU,qBACZ,UAAAigB,GAAW,IAAI,CAAA6B,MACd,gBAAA9hB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMqgB,EAAayB,CAAG;AAAA,QAC/B,WAAW,kDACT1B,MAAc0B,IACV,0EACA,kFACN;AAAA,QAEC,UAAAtmB,EAAE,kBAAkBsmB,CAAG,EAAE;AAAA,MAAA;AAAA,MARrBA;AAAA,IAAA,CAUR,GACH,EAAA,CACF;AAAA,IAGC1B,MAAc,UAAU,gBAAApgB,EAAC0tB,IAAA,EAAQ,UAAAN,GAAoB,GAAA5xB,GAAM;AAAA,IAC3D4kB,MAAc,kBACX,gBAAApgB;AAAA,MAACge;AAAA,MAAA;AAAA,QACC,UAAU+O;AAAA,QACV,YAAYK,EAAS;AAAA,QACrB,MAAK;AAAA,QACL,cAAcE,EAAqB;AAAA,QACnC,aAAaA,EAAqB;AAAA,QAClC,eAAe;AAAA,QACf,WAAWA,EAAqB;AAAA,QAChC,qBAAqBA,EAAqB;AAAA,QAC1C,qBAAqBA,EAAqB;AAAA,QAE1C,mBAAmBA,EAAqB;AAAA,QACxC,oBAAoBA,EAAqB;AAAA,QACzC,uBAAuBA,EAAqB;AAAA,QAC5C,sBAAsBA,EAAqB;AAAA,QAC3C,gBAAgBA,EAAqB;AAAA,QACrC,eAAeA,EAAqB;AAAA,QACpC,eAAeA,EAAqB;AAAA,QACpC,qBAAqBA,EAAqB;AAAA,QAC1C,gBAAgBA,EAAqB;AAAA,QACrC,aAAaA,EAAqB;AAAA,QAClC,qBAAqBA,EAAqB;AAAA,QAC1C,oBAAoBA,EAAqB;AAAA,QAEzC,qBAAqBA,EAAqB;AAAA,QAC1C,gBAAgBA,EAAqB;AAAA,QAErC,sBAAsBA,EAAqB;AAAA,QAC3C,uBAAuB,MAAM;AAC3B,UAAAA,EAAqB,qBAAqB,EAAK,GAC/CA,EAAqB,kBAAkB,EAAE,GACzCA,EAAqB,iBAAiB,EAAE,GACxCA,EAAqB,uBAAuB,YAAY,GACxDA,EAAqB,kBAAkB,MAAM,GAC7CA,EAAqB,eAAe,EAAE,GACtCA,EAAqB,uBAAuB,oBAAI,KAAK;AAAA,QACvD;AAAA,QACA,sBAAsBA,EAAqB;AAAA,QAC3C,aAAaA,EAAqB;AAAA,QAClC,iBAAiBA,EAAqB;AAAA,QACtC,qBAAqBA,EAAqB;AAAA,QAC1C,uBAAuBA,EAAqB;AAAA,QAC5C,wBAAwBA,EAAqB;AAAA,QAE7C,mBAAmBA,EAAqB;AAAA,QACxC,0BAA0BA,EAAqB;AAAA,QAC/C,oBAAoBA,EAAqB;AAAA,QACzC,qBAAqBA,EAAqB;AAAA,QAC1C,2BAA2BA,EAAqB;AAAA,QAChD,gBAAgBA,EAAqB;AAAA,QACrC,wBAAwBA,EAAqB;AAAA,QAC7C,oBAAoBA,EAAqB;AAAA,QAEzC,kBAAkBA,EAAqB;AAAA,QACvC,wBAAwBA,EAAqB;AAAA,QAC7C,mBAAmBA,EAAqB;AAAA,MAAA;AAAA,IAAA;AAAA,IAG7ClN,MAAc,aAAa,gBAAApgB,EAAC2tB,IAAA,EAAW,YAAAZ,GAAyB,GAAAvxB,GAAM;AAAA,IACtE4kB,MAAc,QAAQ,gBAAApgB,EAAC4tB,IAAA,EAAe,YAAAb,GAAyB,GAAAvxB,EAAA,CAAM;AAAA,EAAA,GACxE;AAEJ;AAMA,SAASkyB,GAAQ,EAAE,UAAAN,GAAU,GAAA5xB,KAAmB;AAC9C,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,4FACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAAxE,EAAE,wBAAwB,GAAE;AAAA,MAC3F,gBAAA2F,EAAC,MAAA,EAAG,WAAU,yCACZ,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,wCAAwC,UAAAxE,EAAE,qBAAqB,GAAE;AAAA,UAC/E,gBAAAwE,EAAC,MAAA,EAAG,WAAU,wCAAwC,YAAS,KAAA,CAAK;AAAA,QAAA,GACtE;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,wCAAwC,UAAAxE,EAAE,qBAAqB,GAAE;AAAA,UAC/E,gBAAAwE,EAAC,MAAA,EAAG,WAAU,8BAA8B,YAAS,KAAA,CAAK;AAAA,QAAA,GAC5D;AAAA,QACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,wCAAwC,UAAAxE,EAAE,4BAA4B,GAAE;AAAA,4BACrF,MAAA,EAAG,WAAU,8BAA8B,UAAA4xB,EAAS,eAAe,IAAA,CAAI;AAAA,QAAA,EAAA,CAC1E;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAjsB,EAAC,OAAA,EAAI,WAAU,4FACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAAxE,EAAE,sBAAsB,GAAE;AAAA,MACzF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC6tB,IAAA,EAAS,MAAM,gBAAA7tB,EAAC6Y,IAAA,EAAU,WAAU,UAAA,CAAU,GAAI,OAAOrd,EAAE,6BAA6B,GAAG,OAAO4xB,EAAS,aAAa,QAAQ;AAAA,QACjI,gBAAAptB,EAAC6tB,IAAA,EAAS,MAAM,gBAAA7tB,EAAC8tB,MAAW,WAAU,UAAA,CAAU,GAAI,OAAOtyB,EAAE,wBAAwB,GAAG,OAAO4xB,EAAS,QAAQ,QAAQ;AAAA,QACxH,gBAAAptB,EAAC6tB,IAAA,EAAS,MAAM,gBAAA7tB,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU,GAAI,OAAOlG,EAAE,wBAAwB,GAAG,OAAO,EAAA,CAAG;AAAA,MAAA,EAAA,CAC/F;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAMA,MAAMqyB,KAAWE,GAAK,SAAkB,EAAE,MAAAxC,GAAM,OAAAD,GAAO,OAAAtxB,KAAwB;AAC7E,SACE,gBAAAmH,EAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,gCAAgC,UAAAurB,GAAK;AAAA,sBACpD,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAvrB,EAAC,KAAA,EAAE,WAAU,iDAAiD,UAAAhG,GAAM;AAAA,MACpE,gBAAAgG,EAAC,KAAA,EAAE,WAAU,wCAAwC,UAAAsrB,EAAA,CAAM;AAAA,IAAA,EAAA,CAC7D;AAAA,EAAA,GACF;AAEJ,CAAC;AAMD,SAASqC,GAAW,EAAE,YAAAZ,GAAY,GAAAvxB,KAAsB;AACtD,QAAM,CAACgB,GAASC,CAAU,IAAI1B,EAA2B,CAAA,CAAE,GACrD,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAACizB,GAAUC,CAAW,IAAIlzB,EAAwB,IAAI,GAEtDsD,IAAcC,EAAY,YAAY;AAC1C,QAAI;AACF,MAAA3B,EAAW,EAAI,GACfsxB,EAAY,IAAI;AAChB,YAAMtpB,IAAO,MAAMnG,EAAS,UAAU,WAAWuuB,CAAU;AAC3D,MAAAtwB,EAAWkI,CAAI;AAAA,IACjB,QAAQ;AACN,MAAAspB,EAAYzyB,EAAE,6BAA6B,CAAC;AAAA,IAC9C,UAAA;AACE,MAAAmB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACowB,GAAYvxB,CAAC,CAAC;AAMlB,SAJAR,GAAU,MAAM;AACd,IAAAqD,EAAA;AAAA,EACF,GAAG,CAACA,CAAW,CAAC,GAEZ3B,IAEA,gBAAAsD,EAAC,SAAI,WAAU,4BACb,4BAACsB,GAAA,EAAQ,WAAU,qDAAoD,EAAA,CACzE,IAIA0sB,IAEA,gBAAA7sB,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,mCAAA,CAAmC;AAAA,MAC1D,gBAAAtD,EAAC,QAAA,EAAK,WAAU,iCAAiC,UAAAguB,EAAA,CAAS;AAAA,IAAA,GAC5D;AAAA,IACA,gBAAAhuB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAM3B,EAAA;AAAA,QACf,WAAU;AAAA,QAET,YAAE,qBAAqB;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1B,GACF,IAKF,gBAAA8C,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4CACX,UAAA;AAAA,MAAA3F,EAAE,yBAAyB;AAAA,MAAE;AAAA,MAAGgB,EAAQ;AAAA,MAAO;AAAA,IAAA,GAClD;AAAA,IAECA,EAAQ,WAAW,IAClB,gBAAA2E,EAAC,OAAA,EAAI,WAAU,0IACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,kCAAA,CAAkC;AAAA,MACnD,gBAAA1B,EAAC,KAAA,EAAG,UAAAxE,EAAE,6BAA6B,EAAA,CAAE;AAAA,IAAA,EAAA,CACvC,IAEA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,8HACZ,UAAAxD,EAAQ,IAAI,CAAAwC,MACX,gBAAAmC;AAAA,MAAC8U;AAAA,MAAA;AAAA,QAEC,IAAI,2BAA2BjX,EAAO,EAAE;AAAA,QACxC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAmC,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,0CAA0C,UAAAhB,EAAO,MAAK;AAAA,YACnE,gBAAAgB,EAAC,KAAA,EAAE,WAAU,iDAAiD,YAAO,KAAA,CAAK;AAAA,UAAA,GAC5E;AAAA,4BACC,QAAA,EAAK,WAAU,2GACb,UAAAxE,EAAE,4BAA4B,EAAA,CACjC;AAAA,QAAA;AAAA,MAAA;AAAA,MAVKwD,EAAO;AAAA,IAAA,CAYf,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAMA,SAAS4uB,GAAe,EAAE,YAAAb,GAAY,GAAAvxB,KAA0B;AAC9D,QAAM,CAAC0yB,GAAWC,CAAY,IAAIpzB,EAAkC,CAAA,CAAE,GAChE,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAACizB,GAAUC,CAAW,IAAIlzB,EAAwB,IAAI,GAEtDqzB,IAAgB9vB,EAAY,YAAY;AAC5C,QAAI;AACF,MAAA3B,EAAW,EAAI,GACfsxB,EAAY,IAAI;AAChB,YAAMtpB,IAAO,MAAMnG,EAAS,UAAU,eAAeuuB,CAAU;AAC/D,MAAAoB,EAAaxpB,CAAI;AAAA,IACnB,QAAQ;AACN,MAAAspB,EAAYzyB,EAAE,6BAA6B,CAAC;AAAA,IAC9C,UAAA;AACE,MAAAmB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACowB,GAAYvxB,CAAC,CAAC,GAEZ6yB,IAAe/vB,EAAY,OAAOgwB,MAAuB;AAC7D,QAAK,OAAO,QAAQ9yB,EAAE,4BAA4B,CAAC;AACnD,UAAI;AACF,cAAMgD,EAAS,UAAU,iBAAiBuuB,GAAYuB,CAAU,GAChE,MAAMF,EAAA;AAAA,MACR,QAAQ;AACN,QAAAH,EAAYzyB,EAAE,6BAA6B,CAAC;AAAA,MAC9C;AAAA,EACF,GAAG,CAACuxB,GAAYvxB,GAAG4yB,CAAa,CAAC;AAMjC,SAJApzB,GAAU,MAAM;AACd,IAAAozB,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC,GAEd1xB,IAEA,gBAAAsD,EAAC,SAAI,WAAU,4BACb,4BAACsB,GAAA,EAAQ,WAAU,qDAAoD,EAAA,CACzE,IAIA0sB,IAEA,gBAAA7sB,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsD,IAAA,EAAY,WAAU,mCAAA,CAAmC;AAAA,MAC1D,gBAAAtD,EAAC,QAAA,EAAK,WAAU,iCAAiC,UAAAguB,EAAA,CAAS;AAAA,IAAA,GAC5D;AAAA,IACA,gBAAAhuB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMouB,EAAA;AAAA,QACf,WAAU;AAAA,QAET,YAAE,qBAAqB;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1B,GACF,IAKF,gBAAAjtB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,4CACX,UAAA;AAAA,MAAA3F,EAAE,oBAAoB;AAAA,MAAE;AAAA,MAAG0yB,EAAU;AAAA,MAAO;AAAA,IAAA,GAC/C;AAAA,IAECA,EAAU,WAAW,IACpB,gBAAA/sB,EAAC,OAAA,EAAI,WAAU,0IACb,UAAA;AAAA,MAAA,gBAAAnB,EAACuuB,IAAA,EAAM,WAAU,kCAAA,CAAkC;AAAA,MACnD,gBAAAvuB,EAAC,KAAA,EAAG,UAAAxE,EAAE,0BAA0B,EAAA,CAAE;AAAA,IAAA,EAAA,CACpC,IAEA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,8HACZ,UAAAkuB,EAAU,IAAI,CAAAM,MACb,gBAAArtB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,YAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,0CAA0C,UAAAwuB,EAAS,cAAa;AAAA,YAC7E,gBAAAxuB,EAAC,KAAA,EAAE,WAAU,iDAAiD,YAAS,aAAA,CAAa;AAAA,UAAA,GACtF;AAAA,UACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAW,qDACfwuB,EAAS,WACL,sDACA,uDACN,IACG,UAAAA,EAAS,WAAWhzB,EAAE,qBAAqB,IAAIA,EAAE,uBAAuB,GAC3E;AAAA,YACA,gBAAAwE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMquB,EAAaG,EAAS,UAAU;AAAA,gBAC/C,WAAU;AAAA,gBAET,YAAE,qBAAqB;AAAA,cAAA;AAAA,YAAA;AAAA,UAC1B,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,MArBKA,EAAS;AAAA,IAAA,CAuBjB,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AC5eO,SAASC,KAAoC;AAClD,QAAM,EAAE,GAAAjzB,EAAA,IAAMC,GAAe,OAAO,GAC9BC,IAAWC,GAAA,GACX,CAACqW,GAAWuC,CAAY,IAAIxZ,EAA8B,CAAA,CAAE,GAC5D,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAEhDia,IAAgB1W,EAAY,YAAY;AAC5C,QAAI;AACF,MAAA3B,EAAW,EAAI;AACf,YAAMgI,IAAO,MAAMnG,EAAS,UAAU,OAAA;AACtC,MAAA+V,EAAa5P,CAAI,GACjB7G,EAAS,IAAI;AAAA,IACf,QAAQ;AACN,MAAAA,EAAStC,EAAE,oCAAoC,CAAC;AAAA,IAClD,UAAA;AACE,MAAAmB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACnB,CAAC,CAAC;AAEN,EAAAR,GAAU,MAAM;AACd,IAAAga,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC;AAElB,QAAM0Z,IAAkB,CAAC3B,MAAuB;AAC9C,IAAArxB,EAAS,oCAAoCqxB,CAAU,EAAE;AAAA,EAC3D,GAEM4B,IAAkB3c,EAAU,OAAO,CAAAxW,MAAKA,EAAE,SAAS,GACnDozB,IAAkB5c,EAAU,OAAO,CAAAxW,MAAK,CAACA,EAAE,SAAS;AAE1D,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,wBAAwB,EAAA;AAAA,QAAE;AAAA,MACvC;AAAA,IAAA;AAAA,IAGF,gBAAAwE;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO5H,EAAE,wBAAwB;AAAA,QACjC,UAAUA,EAAE,2BAA2B;AAAA,QACvC,MAAM,gBAAAwE,EAAC6uB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,QACrC,SACE,gBAAA1tB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMzF,EAAS,yCAAyC;AAAA,YACjE,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAsE,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cACzBjY,EAAE,iCAAiC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACtC;AAAA,IAAA;AAAA,IAIHqC,uBACE,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAsD,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAA7f,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,IAAA,EAAA,CACf,EAAA,CACF;AAAA,IAGDnB,uBACE,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAsD,EAACsB,GAAA,EAAQ,WAAU,oDAAA,CAAoD,EAAA,CACzE;AAAA,IAED,CAAC5E,KAAWsV,EAAU,WAAW,KAChC,gBAAAhS,EAAC,OAAA,EAAI,WAAU,0IACZ,UAAAxE,EAAE,8BAA8B,EAAA,CACnC;AAAA,IAED,CAACkB,KAAWsV,EAAU,SAAS,KAC9B,gBAAA7Q,EAAC,OAAA,EAAI,WAAU,aAEZ,UAAA;AAAA,MAAAwtB,EAAgB,SAAS,KACxB,gBAAAxtB,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,yDACX,UAAAxE,EAAE,kCAAkC,GACvC;AAAA,0BACC,OAAA,EAAI,WAAU,yCACZ,UAAAmzB,EAAgB,IAAI,CAAAvB,MACnB,gBAAAptB;AAAA,UAAC8uB;AAAA,UAAA;AAAA,YAEC,UAAA1B;AAAA,YACA,SAAS,MAAMsB,EAAgBtB,EAAS,EAAE;AAAA,YAC1C,GAAA5xB;AAAA,UAAA;AAAA,UAHK4xB,EAAS;AAAA,QAAA,CAKjB,EAAA,CACH;AAAA,MAAA,GACF;AAAA,MAIDwB,EAAgB,SAAS,KACxB,gBAAAztB,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,yDACX,UAAAxE,EAAE,kCAAkC,GACvC;AAAA,0BACC,OAAA,EAAI,WAAU,yCACZ,UAAAozB,EAAgB,IAAI,CAAAxB,MACnB,gBAAAptB;AAAA,UAAC+uB;AAAA,UAAA;AAAA,YAEC,UAAA3B;AAAA,YACA,SAAS,MAAMsB,EAAgBtB,EAAS,EAAE;AAAA,YAC1C,GAAA5xB;AAAA,UAAA;AAAA,UAHK4xB,EAAS;AAAA,QAAA,CAKjB,EAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS0B,GAAmB;AAAA,EAC1B,UAAA1B;AAAA,EACA,SAAA4B;AAAA,EACA,GAAAxzB;AACF,GAIG;AACD,QAAMigB,IAAgB2R,EAAS,qBAAqB,aAAahyB,KAAOC;AAExE,SACE,gBAAA2E;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAgvB;AAAA,MACA,WAAU;AAAA,MAEV,UAAA,gBAAA7tB,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAI,WAAU,iEACb,4BAACyb,GAAA,EAAc,WAAU,uCAAsC,EAAA,CACjE;AAAA,YACA,gBAAAta,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAotB,EAAS,qBAAqB,aAC3B5xB,EAAE,gCAAgC,IAClCA,EAAE,gCAAgC,EAAA,CACxC;AAAA,cACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,iDAAiD,YAAS,KAAA,CAAK;AAAA,YAAA,EAAA,CAC9E;AAAA,UAAA,GACF;AAAA,UACA,gBAAAmB,EAAC,QAAA,EAAK,WAAU,2IACd,UAAA;AAAA,YAAA,gBAAAnB,EAAC0T,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YACzBlY,EAAE,0BAA0B;AAAA,UAAA,EAAA,CAC/B;AAAA,QAAA,GACF;AAAA,QAGA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAotB,EAAS,qBAAqB,aAC3B5xB,EAAE,sCAAsC,IACxCA,EAAE,sCAAsC,EAAA,CAC9C;AAAA,QAGA,gBAAAwE,EAAC,SAAI,WAAU,2BACb,4BAAC,QAAA,EAAK,WAAW,qDACfotB,EAAS,WACL,sDACA,uDACN,IACG,YAAS,WAAW5xB,EAAE,kBAAkB,IAAIA,EAAE,oBAAoB,EAAA,CACrE,EAAA,CACF;AAAA,QAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC8C,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,gCACtD,QAAA,EAAK,WAAU,uCAAuC,UAAAtH,EAAE,+BAA+B,EAAA,CAAE;AAAA,YAAA,GAC5F;AAAA,YACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,gDAAgD,YAAS,iBAAA,CAAiB;AAAA,UAAA,GAC3F;AAAA,UACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,gCACtD,QAAA,EAAK,WAAU,uCAAuC,UAAAlG,EAAE,0BAA0B,EAAA,CAAE;AAAA,YAAA,GACvF;AAAA,YACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,gDAAgD,YAAS,YAAA,CAAY;AAAA,UAAA,EAAA,CACtF;AAAA,QAAA,GACF;AAAA,QAGA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YAET,UAAA;AAAA,cAAA3F,EAAE,4BAA4B;AAAA,cAC/B,gBAAAwE,EAAC2T,IAAA,EAAW,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACtC,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAASob,GAAmB;AAAA,EAC1B,UAAA3B;AAAA,EACA,SAAA4B;AAAA,EACA,GAAAxzB;AACF,GAIG;AACD,QAAMigB,IAAgB2R,EAAS,qBAAqB,aAAahyB,KAAOC;AAExE,SACE,gBAAA2E;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAgvB;AAAA,MACA,WAAU;AAAA,MAEV,UAAA,gBAAA7tB,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAI,WAAU,iEACb,4BAACyb,GAAA,EAAc,WAAU,wCAAuC,EAAA,CAClE;AAAA,YACA,gBAAAta,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,oDACX,UAAAotB,EAAS,MACZ;AAAA,cACA,gBAAAptB,EAAC,KAAA,EAAE,WAAU,iDAAiD,YAAS,KAAA,CAAK;AAAA,YAAA,EAAA,CAC9E;AAAA,UAAA,GACF;AAAA,4BACC,QAAA,EAAK,WAAW,mEACfotB,EAAS,WACL,sDACA,uDACN,IACG,UAAAA,EAAS,WAAW5xB,EAAE,kBAAkB,IAAIA,EAAE,oBAAoB,EAAA,CACrE;AAAA,QAAA,GACF;AAAA,QAGC4xB,EAAS,eACR,gBAAAptB,EAAC,OAAE,WAAU,wCACV,YAAS,aACZ;AAAA,0BAID,OAAA,EAAI,WAAU,2BACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,iGACb,UAAAotB,EAAS,qBAAqB,aAC3B5xB,EAAE,uBAAuB,IACzBA,EAAE,uBAAuB,GAC/B,GACF;AAAA,QAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC8C,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,gCACtD,QAAA,EAAK,WAAU,uCAAuC,UAAAtH,EAAE,+BAA+B,EAAA,CAAE;AAAA,YAAA,GAC5F;AAAA,YACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,gDAAgD,YAAS,iBAAA,CAAiB;AAAA,UAAA,GAC3F;AAAA,UACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,+DACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,gCACtD,QAAA,EAAK,WAAU,uCAAuC,UAAAlG,EAAE,0BAA0B,EAAA,CAAE;AAAA,YAAA,GACvF;AAAA,YACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,gDAAgD,YAAS,YAAA,CAAY;AAAA,UAAA,EAAA,CACtF;AAAA,QAAA,GACF;AAAA,QAGA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YAET,UAAA;AAAA,cAAA3F,EAAE,4BAA4B;AAAA,cAC/B,gBAAAwE,EAAC2T,IAAA,EAAW,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACtC,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;ACnSO,SAASsb,KAAyC;AACvD,QAAM,EAAE,GAAAzzB,EAAA,IAAMC,GAAe,OAAO,GAC9BC,IAAWC,GAAA,GAEX,CAACuzB,GAAMC,CAAO,IAAIp0B,EAAS,EAAE,GAC7B,CAAC8pB,GAAMI,CAAO,IAAIlqB,EAAS,EAAE,GAC7B,CAACqqB,GAAaC,CAAc,IAAItqB,EAAS,EAAE,GAC3C,CAACq0B,GAAkBC,CAAmB,IAAIt0B,EAAqB,UAAU,GACzE,CAACggB,GAAQC,CAAS,IAAIjgB,EAAS,EAAK,GACpC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAEhDgsB,IAAe,OAAO1lB,MAAuB;AAEjD,QADAA,EAAE,eAAA,GACE,GAAC6tB,EAAK,KAAA,KAAU,CAACrK,EAAK,SAE1B;AAAA,MAAA7J,EAAU,EAAI,GACdld,EAAS,IAAI;AACb,UAAI;AACF,cAAMS,IAAS,MAAMC,EAAS,UAAU,OAAO;AAAA,UAC7C,MAAM0wB,EAAK,KAAA;AAAA,UACX,MAAMrK,EAAK,KAAA;AAAA,UACX,aAAaO,EAAY,KAAA,KAAU;AAAA,UACnC,kBAAAgK;AAAA,QAAA,CACD;AACD,QAAA1zB,EAAS,oCAAoC6C,EAAO,EAAE,EAAE;AAAA,MAC1D,SAASE,GAAK;AACZ,gBAAQ,MAAM,8BAA8BA,CAAG;AAC/C,cAAM0Z,IAAa1Z;AACnB,QAAI0Z,EAAW,UAAU,WAAW,MAClCra,EAASqa,EAAW,SAAS,MAAM,WAAW3c,EAAE,wCAAwC,CAAC,IAEzFsC,EAAStC,EAAE,sCAAsC,CAAC;AAAA,MAEtD,UAAA;AACE,QAAAwf,EAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF;AAEA,SACE,gBAAA7Z,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,wBAAwB,GAAG,MAAM,mCAAA;AAAA,UAC5C,EAAE,OAAOA,EAAE,8BAA8B,EAAA;AAAA,QAAE;AAAA,MAC7C;AAAA,IAAA;AAAA,IAGF,gBAAAwE;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO5H,EAAE,8BAA8B;AAAA,QACvC,UAAUA,EAAE,iCAAiC;AAAA,QAC7C,MAAM,gBAAAwE,EAAC6uB,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGtChxB,uBACE,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAsD,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAA7f,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,IAAA,EAAA,CACf,EAAA,CACF;AAAA,IAGF,gBAAAsD,EAAC,QAAA,EAAK,UAAU4lB,GAAc,WAAU,uBACtC,UAAA;AAAA,MAAA,gBAAA5lB,EAAC,OAAA,EAAI,WAAU,sGAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,6DACd,UAAA;AAAA,YAAA3F,EAAE,uBAAuB;AAAA,YAAE;AAAA,UAAA,GAC9B;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOkvB;AAAA,cACP,UAAU,CAAC7tB,MAAM8tB,EAAQ9tB,EAAE,OAAO,KAAK;AAAA,cACvC,aAAY;AAAA,cACZ,WAAU;AAAA,cACV,UAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACV,GACF;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAF,EAAC,SAAA,EAAM,WAAU,6DACd,UAAA;AAAA,YAAA3F,EAAE,uBAAuB;AAAA,YAAE;AAAA,UAAA,GAC9B;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO6kB;AAAA,cACP,UAAU,CAACxjB,MAAM4jB,EAAQ5jB,EAAE,OAAO,KAAK;AAAA,cACvC,aAAa7F,EAAE,kCAAkC;AAAA,cACjD,WAAU;AAAA,cACV,UAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACV,GACF;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAwE,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,oBAAoB,GACzB;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOolB;AAAA,cACP,UAAU,CAAC/jB,MAAMgkB,EAAehkB,EAAE,OAAO,KAAK;AAAA,cAC9C,MAAM;AAAA,cACN,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAF,EAAC,SAAA,EAAM,WAAU,6DACd,UAAA;AAAA,YAAA3F,EAAE,6BAA6B;AAAA,YAAE;AAAA,UAAA,GACpC;AAAA,UACA,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAOiuB;AAAA,cACP,UAAU,CAAC/tB,MAAMguB,EAAoBhuB,EAAE,OAAO,KAAmB;AAAA,cACjE,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAArB,EAAC,UAAA,EAAO,OAAM,YAAY,UAAAxE,EAAE,uBAAuB,GAAE;AAAA,kCACpD,UAAA,EAAO,OAAM,YAAY,UAAAA,EAAE,uBAAuB,EAAA,CAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACvD,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMtE,EAAS,kCAAkC;AAAA,YAC1D,WAAU;AAAA,YAET,YAAE,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpB,gBAAAyF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU,CAAC+tB,EAAK,KAAA,KAAU,CAACrK,EAAK,UAAU9J;AAAA,YAC1C,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,IACC,gBAAA/a,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAE1C,gBAAAtB,EAACwY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAE5Bhd,EAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACpB,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AC5JO,SAAS8zB,KAAoC;AAClD,SAAO,gBAAAtvB,EAACzE,IAAA,EAAY,YAAW,WAAA,CAAW;AAC5C;ACFO,SAASg0B,KAAoC;AAClD,SAAO,gBAAAvvB,EAACzE,IAAA,EAAY,YAAW,WAAA,CAAW;AAC5C;ACFO,SAASi0B,KAAiC;AAC/C,2BAAQj0B,IAAA,EAAY,cAAc,CAAC,YAAY,UAAU,GAAG;AAC9D;ACKA,MAAMk0B,KAAiB,CAAC,OAAO,WAAW,YAAY,QAAQ;AAEvD,SAASC,KAAyC;AACvD,QAAM,EAAE,GAAAl0B,EAAA,IAAMC,GAAe,OAAO,GAC9B,CAACk0B,GAAUC,CAAW,IAAI70B,EAA0B,CAAA,CAAE,GACtD,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC80B,GAAcC,CAAe,IAAI/0B,EAAiB,KAAK,GAExDg1B,IAAezxB,EAAY,YAAY;AAC3C,IAAA3B,EAAW,EAAI;AACf,QAAI;AACF,YAAM0D,IAASwvB,MAAiB,QAAQ,SAAYA,GAC9ClrB,IAAO,MAAMqrB,GAAkB,eAAe3vB,CAAM;AAC1D,MAAAuvB,EAAY,MAAM,QAAQjrB,CAAI,IAAIA,IAAO,CAAA,CAAE;AAAA,IAC7C,QAAQ;AACN,MAAAirB,EAAY,CAAA,CAAE;AAAA,IAChB,UAAA;AACE,MAAAjzB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACkzB,CAAY,CAAC;AAEjB,EAAA70B,GAAU,MAAM;AACd,IAAA+0B,EAAA;AAAA,EACF,GAAG,CAACA,CAAY,CAAC;AAEjB,QAAMrwB,IAAQ;AAAA,IACZ,SAASiwB,EAAS,OAAO,OAAKtoB,EAAE,WAAW,SAAS,EAAE;AAAA,IACtD,UAAUsoB,EAAS,OAAO,OAAKtoB,EAAE,WAAW,UAAU,EAAE;AAAA,IACxD,QAAQsoB,EAAS,OAAO,OAAKtoB,EAAE,WAAW,QAAQ,EAAE;AAAA,EAAA;AAGtD,SACE,gBAAAlG,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,cAAc,GAAG,MAAM,kBAAA;AAAA,UAClC,EAAE,OAAOA,EAAE,eAAe,GAAG,MAAM,+BAAA;AAAA,UACnC,EAAE,OAAOA,EAAE,0BAA0B,EAAA;AAAA,QAAE;AAAA,MACzC;AAAA,IAAA;AAAA,IAGF,gBAAAwE;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO5H,EAAE,0BAA0B;AAAA,QACnC,MAAM,gBAAAwE,EAAC4sB,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAIzC,gBAAAzrB,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8FACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAN,EAAM,SAAQ;AAAA,0BAC7E,OAAA,EAAI,WAAU,wCAAwC,UAAAlE,EAAE,8BAA8B,EAAA,CAAE;AAAA,MAAA,GAC3F;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,8FACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAN,EAAM,UAAS;AAAA,0BAC9E,OAAA,EAAI,WAAU,wCAAwC,UAAAlE,EAAE,+BAA+B,EAAA,CAAE;AAAA,MAAA,GAC5F;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,4FACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,+CAA+C,UAAAN,EAAM,QAAO;AAAA,0BAC1E,OAAA,EAAI,WAAU,wCAAwC,UAAAlE,EAAE,6BAA6B,EAAA,CAAE;AAAA,MAAA,EAAA,CAC1F;AAAA,IAAA,GACF;AAAA,IAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAnB,EAACyD,IAAA,EAAO,WAAU,uCAAA,CAAuC;AAAA,wBACxD,OAAA,EAAI,WAAU,cACZ,UAAAgsB,GAAe,IAAI,CAACpvB,MACnB,gBAAAL;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM8vB,EAAgBzvB,CAAM;AAAA,UACrC,WAAW,oFACTwvB,MAAiBxvB,IACb,4CACA,kFACN;AAAA,UAEC,UACG7E,EADH6E,MAAW,QACN,8BACA,yBAAyBA,EAAO,YAAA,CAAa,EADlB;AAAA,QACoB;AAAA,QAVhDA;AAAA,MAAA,CAYR,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGC3D,IACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,yCACb,4BAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,EAAA,CAC3E,IAEA,gBAAAtB;AAAA,MAACgiB;AAAA,MAAA;AAAA,QACC,UAAA2N;AAAA,QACA,SAAS;AAAA,QACT,UAAUI;AAAA,QACV,kBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAClB,GAEJ;AAEJ;ACzDA,MAAME,KAAoB;AAAA,EACxB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR,GAGMC,KAAmB;AAAA,EACvB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AACV,GAGMC,KAAuB;AAAA,EAC3B,EAAE,MAAM,iBAAiB,gBAAgB,cAAA;AAAA,EACzC,EAAE,MAAM,kBAAkB,gBAAgB,eAAA;AAAA,EAC1C,EAAE,MAAM,wBAAwB,gBAAgB,qBAAA;AAClD,GAGMC,KAAa;AAAA,EACjB,EAAE,IAAI,UAAU,UAAU,oBAAoB,gBAAgB,+BAA+B,WAAW,GAAA;AAAA,EACxG,EAAE,IAAI,SAAS,UAAU,mBAAmB,gBAAgB,8BAA8B,WAAW,GAAA;AACvG,GAEMC,KAAuB,CAACC,MAA4B;AACxD,QAAMC,IAAM,KAAK,IAAA,GACXC,IAAQF,EAAU,QAAA,GAClBG,IAAc,KAAK,OAAOF,IAAMC,KAAS,GAAI,GAC7CjE,IAAU,KAAK,MAAMkE,IAAc,EAAE,GACrCnE,IAAUmE,IAAc;AAC9B,SAAO,GAAGlE,EAAQ,SAAA,EAAW,SAAS,GAAG,GAAG,CAAC,IAAID,EAAQ,SAAA,EAAW,SAAS,GAAG,GAAG,CAAC;AACtF,GAEMoE,KAA0B,CAC9BC,GACAC,GACAjV,MACG;AACH,EAAIgV,EAAa,SAAST,GAAiB,UACzCU,EAAqB;AAAA,IACnB,WAAWD,EAAa,mBAAmB;AAAA,IAC3C,WAAW,IAAI,KAAKA,EAAa,SAAS;AAAA,EAAA,CAC3C,KACQA,EAAa,SAAST,GAAiB,aAAaS,EAAa,SAAST,GAAiB,YACpGU,EAAqB,IAAI,GACzBjV,EAAA;AAEJ;AA4BA,SAASkV,GAAY,EAAE,MAAMC,GAAM,OAAAC,GAAO,aAAA3L,GAAa,QAAAhmB,GAAQ,UAAA4xB,GAAU,WAAAC,IAAY,MAAwB;AAC3G,SACE,gBAAA9vB,EAAC,OAAA,EAAI,WAAW,kHAAkH8vB,CAAS,IACzI,UAAA;AAAA,IAAA,gBAAAjxB,EAAC,SAAI,WAAU,6EACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAU,wGACb,4BAAC8wB,GAAA,EAAK,WAAU,0CAAyC,EAAA,CAC3D;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA9wB,EAAC,MAAA,EAAG,WAAU,sDAAsD,UAAA+wB,GAAM;AAAA,UACzE3L,KACC,gBAAAplB,EAAC,KAAA,EAAE,WAAU,8CAA8C,UAAAolB,EAAA,CAAY;AAAA,QAAA,EAAA,CAE3E;AAAA,MAAA,GACF;AAAA,MACChmB;AAAA,IAAA,EAAA,CACH,EAAA,CACF;AAAA,IACA,gBAAAY,EAAC,OAAA,EAAI,WAAU,OACZ,UAAAgxB,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAUA,SAASE,GAAO,EAAE,SAAAC,GAAS,UAAAC,GAAU,OAAA9F,GAAO,aAAAlG,GAAa,UAAAiM,KAAyB;AAChF,SACE,gBAAAlwB,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,kDAAkD,UAAAsrB,GAAM;AAAA,MACxElG,KACC,gBAAAplB,EAAC,KAAA,EAAE,WAAU,8CAA8C,UAAAolB,EAAA,CAAY;AAAA,IAAA,GAE3E;AAAA,IACA,gBAAAplB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAcmxB;AAAA,QACd,SAASC;AAAA,QACT,UAAAC;AAAA,QACA,WAAW,0QACTF,IAAU,iCAAiC,yBAC7C;AAAA,QAEA,UAAA,gBAAAnxB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,uFACTmxB,IAAU,kBAAkB,eAC9B;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEA,MAAMG,KAAc,CAACt3B,MACdA,IACa,kEACD,KAAKA,CAAK,IAFR,IAsBfu3B,KAAoB,CAAC,EAAE,QAAA9f,GAAQ,SAAA/U,GAAS,SAAA80B,GAAS,WAAA1d,GAAW,QAAA2d,GAAQ,GAAAj2B,EAAA,MAQxE,gBAAAwE;AAAA,EAAC6wB;AAAAA,EAAA;AAAA,IACC,MAAMa;AAAA,IACN,OAAOl2B,EAAE,yCAAyC;AAAA,IAClD,aAAaA,EAAE,+CAA+C;AAAA,IAC9D,QACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iEACZ,UAAA;AAAA,MAAAqwB,KACC,gBAAArwB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASswB;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAzxB,EAACkT,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,8BAC7B,QAAA,EAAK,WAAU,aAAa,UAAA1X,EAAE,wCAAwC,EAAA,CAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAG7E,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS2S;AAAA,UACT,UAAUpX;AAAA,UACV,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAsD,EAACoV,MAAU,WAAW,WAAW1Y,IAAU,iBAAiB,EAAE,IAAI;AAAA,8BACjE,QAAA,EAAK,WAAU,aAAa,UAAAlB,EAAE,gBAAgB,EAAA,CAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACnD,GACF;AAAA,IAGD,UAAAiW,IACC,gBAAAtQ,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,yHACZ,UAAAyR,EAAO,eACN,gBAAAtQ,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,0BAC3D,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAvd,EAAC,KAAA,EAAE,WAAU,0CACV,UAAAxE,EAAE,8CAA8C,GACnD;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAxE,EAAE,iDAAiD,EAAE,UAAUiW,EAAO,SAAA,CAAU,EAAA,CACnF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF,IAEA,gBAAAtQ,EAAAkC,IAAA,EACE,UAAA;AAAA,QAAA,gBAAArD,EAAC4S,IAAA,EAAK,WAAU,qCAAA,CAAqC;AAAA,0BACpD,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA5S,EAAC,KAAA,EAAE,WAAU,0CACV,UAAAxE,EAAE,iDAAiD,GACtD;AAAA,4BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,qDAAqD,EAAA,CAC1D;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CAEJ;AAAA,MAECiW,EAAO,gBACN,gBAAAtQ,EAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wGACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,oDAAA,CAAoD;AAAA,8BACpE,QAAA,EAAK,WAAU,kDACb,UAAA/G,EAAE,8CAA8C,EAAA,CACnD;AAAA,UAAA,GACF;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAyR,EAAO,cACJjW,EAAE,+CAA+C,IACjDA,EAAE,gDAAgD,EAAA,CACxD;AAAA,QAAA,GACF;AAAA,QAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,wGACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAnB,EAACkT,IAAA,EAAS,WAAU,oDAAA,CAAoD;AAAA,8BACvE,QAAA,EAAK,WAAU,kDACb,UAAA1X,EAAE,gDAAgD,EAAA,CACrD;AAAA,UAAA,GACF;AAAA,UACA,gBAAA2F,EAAC,KAAA,EAAE,WAAU,wCACV,UAAA;AAAA,YAAAsQ,EAAO;AAAA,YAAoB;AAAA,YAAEjW,EAAE,gBAAgB;AAAA,UAAA,EAAA,CAClD;AAAA,QAAA,GACF;AAAA,QAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,oIACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC2xB,IAAA,EAAS,WAAU,oDAAA,CAAoD;AAAA,8BACvE,QAAA,EAAK,WAAU,kDACb,UAAAn2B,EAAE,sDAAsD,EAAA,CAC3D;AAAA,UAAA,GACF;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAxE,EAAE,sCAAsCiW,EAAO,2BAA2B,YAAA,KAAiB,cAAc,EAAE,EAAA,CAC9G;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GAEJ,IAEA,gBAAAzR,EAAC,KAAA,EAAE,WAAU,wCACV,UAAAxE,EAAE,0CAA0C,EAAA,CAC/C;AAAA,EAAA;AAEJ;AAGF,SAASo2B,GAAU,EAAE,QAAAngB,GAAQ,SAAA/U,GAAS,SAAA80B,GAAS,WAAA1d,GAAW,iBAAA+d,GAAiB,GAAAr2B,GAAG,UAAAs2B,KAA4B;AACxG,QAAM,CAACC,GAASC,CAAU,IAAIj3B,EAAS,EAAK,GACtC,CAACggB,GAAQC,CAAS,IAAIjgB,EAAS,EAAK,GACpC,CAACk3B,GAASC,CAAU,IAAIn3B,EAAS,EAAK,GACtC,CAACo3B,GAAYC,CAAa,IAAIr3B,EAAsC,IAAI,GACxE,CAACs3B,GAAYC,CAAa,IAAIv3B,EAAS,EAAK,GAC5C,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkgB,GAASC,CAAU,IAAIngB,EAAwB,IAAI,GACpD,CAACw3B,GAAkBC,CAAmB,IAAIz3B,EAAwB,IAAI,GACtE,CAAC03B,GAAmBC,CAAoB,IAAI33B,EAAS0W,GAAQ,mBAAmB,EAAK,GACrF,CAACkhB,GAAkBC,CAAmB,IAAI73B,EAAmD,CAAA,CAAE,GAE/F,CAAC83B,GAAaC,CAAc,IAAI/3B,EAAS;AAAA,IAC7C,UAAU0W,GAAQ,YAAY;AAAA,IAC9B,UAAUA,GAAQ,YAAY;AAAA,IAC9B,cAAc;AAAA,EAAA,CACf,GAEK,CAACshB,GAAcC,EAAe,IAAIj4B,EAAS;AAAA,IAC/C,aAAa0W,GAAQ,eAAe;AAAA,IACpC,qBAAqBA,GAAQ,uBAAuB;AAAA,IACpD,cAAcA,GAAQ,gBAAgB;AAAA,IACtC,2BAA4BA,GAAQ,6BAA6B;AAAA,IACjE,sBAAsBA,GAAQ,wBAAwB;AAAA,IACtD,qBAAqBA,GAAQ,uBAAuB;AAAA,IACpD,eAAeA,GAAQ,iBAAiB;AAAA,EAAA,CACzC;AAED,EAAAzW,GAAU,MAAM;AACd,IAAKyW,MACLqhB,EAAe;AAAA,MACb,UAAUrhB,EAAO,YAAY;AAAA,MAC7B,UAAUA,EAAO,YAAY;AAAA,MAC7B,cAAc;AAAA,IAAA,CACf,GACDihB,EAAqBjhB,EAAO,eAAe,GAC3CuhB,GAAgB;AAAA,MACd,aAAavhB,EAAO;AAAA,MACpB,qBAAqBA,EAAO;AAAA,MAC5B,cAAcA,EAAO;AAAA,MACrB,2BAA2BA,EAAO;AAAA,MAClC,sBAAsBA,EAAO;AAAA,MAC7B,qBAAqBA,EAAO,uBAAuB;AAAA,MACnD,eAAeA,EAAO,iBAAiB;AAAA,IAAA,CACxC;AAAA,EACH,GAAG,CAACA,CAAM,CAAC;AAEX,QAAMwhB,KAAgB,CAACC,GAAgCl5B,MAAkB;AACvE,UAAMm5B,IAAY7B,GAAYt3B,CAAK,IAA4C,SAAxCwB,EAAE,kCAAkC;AAC3E,IAAAo3B,EAAoB,CAAA9zB,QAAS,EAAE,GAAGA,IAAM,CAACo0B,CAAK,GAAGC,IAAW;AAAA,EAC9D,GAEMC,IAAyB,CAACF,GAAiCl5B,MAAkB;AACjF,IAAA84B,EAAe,CAAAh0B,OAAS,EAAE,GAAGA,GAAM,CAACo0B,CAAK,GAAGl5B,IAAQ,IAChDk5B,MAAU,cAAcA,MAAU,eACpCD,GAAcC,GAAOl5B,CAAK;AAAA,EAE9B,GAEMq5B,IAAsB,GAAQV,EAAiB,YAAYA,EAAiB,WAC5EW,KAAoB,CAACrB,KAAW,CAACoB,KAAuBR,EAAY,YAAYA,EAAY,aAAaA,EAAY,gBAAgBJ,IACrIc,IAAqB,CAACxY,KAAU,CAACsY,KAAuBR,EAAY,YAAYA,EAAY,YAAYA,EAAY,cAEpHW,IAAuB,OAAOtE,MAAiB;AACnD,QAAI;AACF,YAAM,UAAU,UAAU,UAAUA,CAAI,GACxCsD,EAAoBtD,CAAI,GACxB,WAAW,MAAMsD,EAAoB,IAAI,GAAG,GAAI;AAAA,IAClD,SAAS/zB,GAAK;AACZ,cAAQ,MAAM,mBAAmBA,aAAe,QAAQA,EAAI,UAAU,eAAe;AAAA,IACvF;AAAA,EACF,GAEMg1B,IAAuB,YAAY;AACvC,QAAKH,IACL;AAAA,MAAApB,EAAW,EAAI,GACfE,EAAc,IAAI,GAClBt0B,EAAS,IAAI,GACbod,EAAW,IAAI;AACf,UAAI;AACF,cAAM3c,IAASs0B,EAAY,eACvB,MAAMf,EAAS,SAAS,eAAe;AAAA,UACrC,UAAUe,EAAY;AAAA,UACtB,UAAUA,EAAY;AAAA,UACtB,cAAcA,EAAY;AAAA,QAAA,CAC3B,IACD,MAAMf,EAAS,SAAS,qBAAA;AAC5B,QAAAM,EAAc7zB,CAAM,GAChBA,EAAO,UACT2c,EAAW1f,EAAE,4BAA4B,CAAC,IAE1CsC,EAASS,EAAO,gBAAgB/C,EAAE,2BAA2B,CAAC;AAAA,MAElE,SAASiD,GAAK;AACZ,gBAAQ,MAAM,2BAA2BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GAC7FX,EAAStC,EAAE,2BAA2B,CAAC;AAAA,MACzC,UAAA;AACE,QAAA02B,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAEMwB,IAAwB,YAAY;AACxC,QAAKH,GACL;AAAA,MAAAvY,EAAU,EAAI,GACdld,EAAS,IAAI,GACbod,EAAW,IAAI;AACf,UAAI;AACF,cAAM4W,EAAS,SAAS,gBAAgB;AAAA,UACtC,UAAUe,EAAY;AAAA,UACtB,UAAUA,EAAY;AAAA,UACtB,cAAcA,EAAY;AAAA,QAAA,CAC3B,GACD3X,EAAW1f,EAAE,iCAAiC,CAAC,GAC/Ck3B,EAAqB,EAAI,GACzBI,EAAe,QAAS,EAAE,GAAGh0B,GAAM,cAAc,KAAK,GACtD+yB,EAAA;AAAA,MACF,SAASpzB,GAAK;AACZ,gBAAQ,MAAM,+BAA+BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GACjGX,EAAStC,EAAE,0BAA0B,CAAC;AAAA,MACxC,UAAA;AACE,QAAAwf,EAAU,EAAK;AAAA,MACjB;AAAA;AAAA,EACF,GAEM2Y,IAAqB,YAAY;AACrC,IAAA3Y,EAAU,EAAI,GACdld,EAAS,IAAI,GACbod,EAAW,IAAI;AACf,QAAI;AACF,YAAM4W,EAAS,SAAS,iBAAiB;AAAA,QACvC,aAAaiB,EAAa;AAAA,QAC1B,qBAAqBA,EAAa;AAAA,QAClC,cAAcA,EAAa;AAAA,QAC3B,2BAA2BA,EAAa;AAAA,QACxC,sBAAsBA,EAAa;AAAA,QACnC,qBAAqBA,EAAa;AAAA,QAClC,eAAeA,EAAa;AAAA,MAAA,CAC7B,GACD7X,EAAW1f,EAAE,8BAA8B,CAAC,GAC5Cq2B,EAAA;AAAA,IACF,SAASpzB,GAAK;AACZ,cAAQ,MAAM,4BAA4BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GAC9FX,EAAStC,EAAE,0BAA0B,CAAC;AAAA,IACxC,UAAA;AACE,MAAAwf,EAAU,EAAK;AAAA,IACjB;AAAA,EACF;AAEA,SAAI,CAACwW,KAAW,CAACO,IACR,gBAAA/xB,EAACuxB,IAAA,EAAkB,QAAA9f,GAAgB,SAAA/U,GAAkB,SAAA80B,GAAkB,WAAA1d,GAAsB,QAAQ,MAAMke,EAAW,EAAI,GAAG,GAAAx2B,EAAA,CAAM,IAK1I,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,SAAI,WAAU,mGACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,MAAA,gBAAAnB,EAACoW,IAAA,EAAO,WAAU,4CAAA,CAA4C;AAAA,MAC9D,gBAAAjV,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,4CACX,UAAAxE,EAAE,wCAAwC,GAC7C;AAAA,UACA,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,WAAU;AAAA,cAET,UAAA;AAAA,gBAAA3F,EAAE,iCAAiC;AAAA,gBACpC,gBAAAwE,EAACwT,IAAA,EAAa,WAAU,cAAA,CAAc;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACxC,GACF;AAAA,0BACC,KAAA,EAAE,WAAU,sDACV,UAAAhY,EAAE,8CAA8C,GACnD;AAAA,0BACC,OAAA,EAAI,WAAU,wBACZ,UAAA20B,GAAqB,IAAI,CAACyD,MACzB,gBAAAzyB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAMqyB,EAAqBI,EAAK,IAAI;AAAA,YAC7C,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA5zB,EAAC,QAAA,EAAK,WAAU,4DAA4D,UAAA4zB,EAAK,MAAK;AAAA,cACrFrB,MAAqBqB,EAAK,OACzB,gBAAA5zB,EAACwY,IAAA,EAAM,WAAU,qCAAA,CAAqC,IAEtD,gBAAAxY,EAAC6zB,IAAA,EAAK,WAAU,qCAAA,CAAqC;AAAA,YAAA;AAAA,UAAA;AAAA,UARlDD,EAAK;AAAA,QAAA,CAWb,EAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAGC/1B,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,MAC5D,gBAAA7f,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAnC,EAAA,CAAM;AAAA,IAAA,GAC5D;AAAA,IAEDod,KACC,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,MAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,MAC5D,gBAAAvd,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAib,EAAA,CAAQ;AAAA,IAAA,GAChE;AAAA,IAGF,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,yCAEb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6wB,IAAA,EAAY,MAAMa,IAAK,OAAOl2B,EAAE,4BAA4B,GAAG,aAAY,wBAC1E,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAa;AAAA,cACb,OAAO6yB,EAAY;AAAA,cACnB,UAAU,CAACxxB,MAAM+xB,EAAuB,YAAY/xB,EAAE,OAAO,KAAK;AAAA,cAClE,aAAY;AAAA,cACZ,WAAW,4OACTsxB,EAAiB,WAAW,kEAAkE,mEAChG;AAAA,YAAA;AAAA,UAAA;AAAA,UAEDA,EAAiB,YAChB,gBAAA3yB,EAAC,OAAE,WAAU,2CAA2C,YAAiB,SAAA,CAAS;AAAA,QAAA,GAEtF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,yBAAyB,GAC9B;AAAA,UACA,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAa;AAAA,cACb,OAAO6yB,EAAY;AAAA,cACnB,UAAU,CAACxxB,MAAM+xB,EAAuB,YAAY/xB,EAAE,OAAO,KAAK;AAAA,cAClE,aAAY;AAAA,cACZ,WAAW,4OACTsxB,EAAiB,WAAW,kEAAkE,mEAChG;AAAA,YAAA;AAAA,UAAA;AAAA,UAEDA,EAAiB,YAChB,gBAAA3yB,EAAC,OAAE,WAAU,2CAA2C,YAAiB,SAAA,CAAS;AAAA,QAAA,GAEtF;AAAA,0BAEC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAA;AAAA,YAAA3F,EAAE,6BAA6B;AAAA,YAC/Bi3B,KACC,gBAAAtxB,EAAC,QAAA,EAAK,WAAU,0EACd,UAAA;AAAA,cAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,cAChC/hB,EAAE,mBAAmB;AAAA,YAAA,EAAA,CACxB;AAAA,UAAA,GAEJ;AAAA,UACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,YAAA,gBAAAnB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAMqyB,IAAa,SAAS;AAAA,gBAC5B,cAAa;AAAA,gBACb,OAAOQ,EAAY;AAAA,gBACnB,UAAU,CAACxxB,MAAM+xB,EAAuB,gBAAgB/xB,EAAE,OAAO,KAAK;AAAA,gBACtE,aAAaoxB,IAAoB,qBAAqB;AAAA,gBACtD,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAEZ,gBAAAzyB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAMsyB,EAAc,CAACD,CAAU;AAAA,gBACxC,WAAU;AAAA,gBAET,UAAAA,sBAAcyB,IAAA,EAAO,WAAU,WAAU,IAAK,gBAAA9zB,EAACwB,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAC1E,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAEA,gBAAAL,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA;AAAA,UAAA,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASsyB;AAAA,cACT,UAAUxB,KAAWoB,KAAuB,CAACR,EAAY,YAAY,CAACA,EAAY,YAAa,CAACA,EAAY,gBAAgB,CAACJ;AAAA,cAC7H,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAR,IAAU,gBAAAjyB,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAAC+zB,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,gBACvFv4B,EAAE,+BAA+B;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpC,gBAAA2F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASuyB;AAAA,cACT,UAAU3Y,KAAUsY,KAAuB,CAACR,EAAY,YAAY,CAACA,EAAY,YAAY,CAACA,EAAY;AAAA,cAC1G,WAAU;AAAA,cAET,UAAA;AAAA,gBAAA9X,IAAS,gBAAA/a,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwd,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBAClFhiB,EAAE,aAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,GACF;AAAA,QAEC22B,GAAY,WACX,gBAAAhxB,EAAC,OAAA,EAAI,WAAU,sGACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,8BAC3D,QAAA,EAAK,WAAU,0CAA0C,UAAA/hB,EAAE,qCAAqC,EAAA,CAAE;AAAA,UAAA,GACrG;AAAA,UACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,YAAAgxB,EAAW,gCAAe,OAAA,EAAI,UAAA;AAAA,cAAA,gBAAAnyB,EAAC,QAAA,EAAK,WAAU,+BAA8B,UAAA,WAAO;AAAA,cAAO;AAAA,cAAEmyB,EAAW;AAAA,YAAA,GAAW;AAAA,YAClHA,EAAW,cAAc,QAAQ,gBAAAhxB,EAAC,OAAA,EAAI,UAAA;AAAA,cAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,+BAA8B,UAAA,UAAM;AAAA,cAAO;AAAA,cAAEmyB,EAAW;AAAA,YAAA,GAAU;AAAA,YACxHA,EAAW,eAAe,QAAQ,gBAAAhxB,EAAC,OAAA,EAAI,UAAA;AAAA,cAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,+BAA8B,UAAA,WAAO;AAAA,cAAO;AAAA,cAAEmyB,EAAW;AAAA,YAAA,EAAA,CAAW;AAAA,UAAA,EAAA,CAC9H;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CAEJ,EAAA,CACF;AAAA,MAGA,gBAAAhxB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC6wB,IAAA,EAAY,MAAMtuB,IAAO,OAAO/G,EAAE,6BAA6B,GAAG,aAAY,4BAC7E,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAACkxB;AAAAA,YAAA;AAAA,cACC,SAAS6B,EAAa;AAAA,cACtB,UAAU,MAAMC,GAAgB,CAAAl0B,OAAS,EAAE,GAAGA,GAAM,aAAa,CAACA,EAAK,YAAA,EAAc;AAAA,cACrF,OAAOtD,EAAE,4BAA4B;AAAA,cACrC,aAAaA,EAAE,gCAAgC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEjD,gBAAA2F,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,6BAA6B,GAClC;AAAA,YACA,gBAAA2F;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO4xB,EAAa;AAAA,gBACpB,UAAU,CAAC1xB,MAAM2xB,GAAgB,QAAS,EAAE,GAAGl0B,GAAM,qBAAqB,OAAOuC,EAAE,OAAO,KAAK,IAAI;AAAA,gBACnG,WAAU;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAF,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAI3F,EAAE,gBAAgB;AAAA,kBAAA,GAAE;AAAA,kBAC3G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAI3F,EAAE,gBAAgB;AAAA,kBAAA,GAAE;AAAA,kBAC3G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAG3F,EAAE,aAAa;AAAA,kBAAA,GAAE;AAAA,kBACvG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAG3F,EAAE,cAAc;AAAA,kBAAA,GAAE;AAAA,kBACzG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAG3F,EAAE,cAAc;AAAA,kBAAA,GAAE;AAAA,kBACzG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAI3F,EAAE,cAAc;AAAA,kBAAA,GAAE;AAAA,kBAC1G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,MAAM,WAAU,uDAAsD,UAAA;AAAA,oBAAA;AAAA,oBAAI3F,EAAE,cAAc;AAAA,kBAAA,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC7G,GACF;AAAA,UACA,gBAAAwE;AAAA,YAACkxB;AAAAA,YAAA;AAAA,cACC,SAAS6B,EAAa;AAAA,cACtB,UAAU,MAAMC,GAAgB,CAAAl0B,OAAS,EAAE,GAAGA,GAAM,cAAc,CAACA,EAAK,aAAA,EAAe;AAAA,cACvF,OAAOtD,EAAE,6BAA6B;AAAA,cACtC,aAAaA,EAAE,iCAAiC;AAAA,YAAA;AAAA,UAAA;AAAA,QAClD,EAAA,CACF,EAAA,CACF;AAAA,QAEA,gBAAAwE,EAAC6wB,MAAY,MAAMc,IAAU,OAAOn2B,EAAE,mCAAmC,GAAG,aAAY,iBACtF,UAAA,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO4xB,EAAa;AAAA,YACpB,UAAU,CAAC1xB,MAAM2xB,GAAgB,CAAAl0B,OAAS,EAAE,GAAGA,GAAM,2BAA2BuC,EAAE,OAAO,MAAA,EAAsD;AAAA,YAC/I,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAArB,EAAC,YAAO,OAAM,gBAAe,WAAU,uDAAuD,UAAAxE,EAAE,iDAAiD,GAAE;AAAA,cACnJ,gBAAAwE,EAAC,YAAO,OAAM,aAAY,WAAU,uDAAuD,UAAAxE,EAAE,8CAA8C,GAAE;AAAA,cAC7I,gBAAAwE,EAAC,YAAO,OAAM,aAAY,WAAU,uDAAuD,UAAAxE,EAAE,8CAA8C,EAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEjJ;AAAA,QAEA,gBAAAwE,EAAC6wB,IAAA,EAAY,MAAMptB,IAAQ,OAAOjI,EAAE,gCAAgC,GAAG,aAAY,cACjF,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAACkxB;AAAAA,YAAA;AAAA,cACC,SAAS6B,EAAa;AAAA,cACtB,UAAU,MAAMC,GAAgB,CAAAl0B,OAAS,EAAE,GAAGA,GAAM,qBAAqB,CAACA,EAAK,oBAAA,EAAsB;AAAA,cACrG,OAAOtD,EAAE,oCAAoC;AAAA,cAC7C,aAAaA,EAAE,wCAAwC;AAAA,YAAA;AAAA,UAAA;AAAA,4BAExD,OAAA,EAAI,WAAU,yDACZ,UAAA40B,GAAW,IAAI,CAAC4D,MAAa;AAC5B,kBAAMC,IAAgBlB,EAAa,cAAc,MAAM,GAAG,EAAE,IAAI,CAAAtpB,OAAKA,GAAE,KAAA,CAAM,EAAE,OAAO,OAAO,GACvF2S,IAAY6X,EAAc,SAASD,EAAS,EAAE;AACpD,mBACE,gBAAA7yB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW,mGACTib,IAAY,sGAAsG,qFACpH;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAApc;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAASoc;AAAA,sBACT,UAAU,MAAM;AACd,4BAAI8X,KAAW9X,IACX6X,EAAc,OAAO,CAAAz4B,OAAKA,OAAMw4B,EAAS,EAAE,IAC3C,CAAC,GAAGC,GAAeD,EAAS,EAAE;AAClC,wBAAIE,GAAS,WAAW,MAAGA,KAAW,CAAC,QAAQ,IAC/ClB,GAAgB,CAAAl0B,QAAS,EAAE,GAAGA,IAAM,eAAeo1B,GAAS,KAAK,GAAG,EAAA,EAAI;AAAA,sBAC1E;AAAA,sBACA,WAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEZ,gBAAAl0B,EAAC,UAAK,WAAU,kDACb,YAAE,kBAAkBg0B,EAAS,QAAQ,EAAE,EAAA,CAC1C;AAAA,gBAAA;AAAA,cAAA;AAAA,cAnBKA,EAAS;AAAA,YAAA;AAAA,UAsBpB,CAAC,EAAA,CACH;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,QAEA,gBAAA7yB,EAAC,OAAA,EAAI,WAAU,kFACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMgyB,EAAW,EAAK;AAAA,cAC/B,WAAU;AAAA,cAET,YAAE,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,gBAAA7wB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASwyB;AAAA,cACT,UAAU5Y;AAAA,cACV,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAA,IAAS,gBAAA/a,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwd,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,gBAClFhiB,EAAE,aAAa;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AAMA,MAAM24B,KAAiB;AAAA,EACrB,WAAW,EAAE,IAAI,0BAA0B,MAAM,8BAA8B,MAAM5W,GAAA;AAAA,EACrF,oBAAoB,EAAE,IAAI,0BAA0B,MAAM,8BAA8B,MAAMsC,GAAA;AAAA,EAC9F,QAAQ,EAAE,IAAI,wBAAwB,MAAM,4BAA4B,MAAMA,GAAA;AAAA,EAC9E,YAAY,EAAE,IAAI,gCAAgC,MAAM,kCAAkC,MAAMve,EAAA;AAAA,EAChG,WAAW,EAAE,IAAI,2BAA2B,MAAM,+BAA+B,MAAM8yB,GAAA;AACzF,GAEMC,KAAoB;AAAA,EACxB,SAAS,gBAAAr0B,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,EACrE,QAAQ,gBAAAvd,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,EACpE,SAAS,gBAAA7f,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD;AACpF,GAEMgzB,KAAiB,CAACj0B,GAAgB7E,MAA+B;AACrE,QAAM+4B,IAAQJ,GAAe9zB,CAAqC;AAClE,MAAI,CAACk0B;AACH,WAAO,gBAAAv0B,EAAC,QAAA,EAAK,WAAU,mIAAmI,UAAAK,GAAO;AAEnK,QAAMywB,IAAOyD,EAAM,MACbjJ,IAAQ9vB,EAAE,+BAA+B6E,EAAO,YAAA,CAAa,EAAE;AACrE,SAAO,gBAAAc,EAAC,UAAK,WAAW,+EAA+EozB,EAAM,EAAE,IAAIA,EAAM,IAAI,IAAI,UAAA;AAAA,IAAA,gBAAAv0B,EAAC8wB,KAAK,WAAWyD,EAAM,SAASjzB,IAAU,yBAAyB,WAAW;AAAA,IAAE;AAAA,IAAEgqB;AAAA,EAAA,GAAM;AAC3N,GAEMkJ,KAAoB,CAACn0B,MAClBg0B,GAAkBh0B,CAAwC,KAAK,gBAAAL,EAACuC,IAAA,EAAM,WAAU,uCAAsC,GAsBzH8pB,KAAiB,CAACiE,GAAmBmE,MAAuC;AAChF,MAAI,CAACA,EAAa,QAAO;AACzB,QAAMjE,IAAQ,IAAI,KAAKF,CAAS,EAAE,QAAA,GAE5BoE,IADM,IAAI,KAAKD,CAAW,EAAE,QAAA,IACbjE;AACrB,SAAIkE,IAAS,MAAa,GAAGA,CAAM,OAC/BA,IAAS,MAAc,GAAG,KAAK,MAAMA,IAAS,GAAI,CAAC,MAChD,GAAG,KAAK,MAAMA,IAAS,GAAK,CAAC;AACtC,GAEMC,KAAkB,MAAM;AAC5B,QAAM,CAACC,GAASC,CAAU,IAAI95B,EAAS,EAAK,GACtC,CAAC+5B,GAAgBC,CAAiB,IAAIh6B,EAAoC,IAAI,GAC9E,CAACi6B,GAAWC,CAAY,IAAIl6B,EAAwB,IAAI,GACxD,CAACm6B,GAASC,CAAU,IAAIp6B,EAAgC,CAAA,CAAE,GAC1D,CAACq6B,GAAgBC,CAAiB,IAAIt6B,EAAS,EAAK,GACpD,CAACu6B,GAAaC,CAAc,IAAIx6B,EAAS,CAAC,GAC1C,CAACy6B,GAAmBC,CAAoB,IAAI16B,EAAS,CAAC,GACtD,CAAC26B,GAAqBC,CAAsB,IAAI56B,EAAwB,IAAI;AAElF,SAAO;AAAA,IACL,SAAA65B;AAAA,IAAS,YAAAC;AAAA,IAAY,gBAAAC;AAAA,IAAgB,mBAAAC;AAAA,IAAmB,WAAAC;AAAA,IAAW,cAAAC;AAAA,IACnE,SAAAC;AAAA,IAAS,YAAAC;AAAA,IAAY,gBAAAC;AAAA,IAAgB,mBAAAC;AAAA,IAAmB,aAAAC;AAAA,IAAa,gBAAAC;AAAA,IACrE,mBAAAC;AAAA,IAAmB,sBAAAC;AAAA,IAAsB,qBAAAC;AAAA,IAAqB,wBAAAC;AAAA,EAAA;AAElE;AAEA,SAASC,GAAQ,EAAE,QAAAnkB,GAAQ,WAAAokB,GAAW,YAAAC,GAAY,SAAAp5B,GAAS,SAAAq5B,GAAS,WAAAjiB,GAAW,mBAAAkiB,GAAmB,WAAAC,GAAW,eAAAC,GAAe,iBAAAC,GAAiB,mBAAAC,GAAmB,GAAA56B,KAAmB;AACjL,QAAM;AAAA,IACJ,SAAAo5B;AAAA,IAAS,YAAAC;AAAA,IAAY,gBAAAC;AAAA,IAAgB,mBAAAC;AAAA,IAAmB,WAAAC;AAAA,IAAW,cAAAC;AAAA,IACnE,SAAAC;AAAA,IAAS,YAAAC;AAAA,IAAY,gBAAAC;AAAA,IAAgB,mBAAAC;AAAA,IAAmB,aAAAC;AAAA,IAAa,gBAAAC;AAAA,IACrE,mBAAAC;AAAA,IAAmB,sBAAAC;AAAA,IAAsB,qBAAAC;AAAA,IAAqB,wBAAAC;AAAA,EAAA,IAC5DhB,GAAA,GACE0B,IAAkB,GAElBC,IAAch4B,EAAY,OAAOf,MAAiB;AACtD,IAAA83B,EAAkB,EAAI;AACtB,QAAI;AACF,YAAM92B,IAAS,MAAM23B,EAAc34B,GAAM84B,CAAe;AACxD,UAAI,CAAC93B,EAAQ;AACb,MAAA42B,EAAW52B,EAAO,QAAQ,GAC1Bk3B,EAAqBl3B,EAAO,UAAU,GACtCg3B,EAAeh4B,CAAI;AAAA,IACrB,SAASkB,GAAK;AACZ,cAAQ,MAAM,2BAA2BA,CAAG;AAAA,IAC9C,UAAA;AACE,MAAA42B,EAAkB,EAAK;AAAA,IACzB;AAAA,EACF,GAAG,CAACa,CAAa,CAAC;AAElB,EAAAl7B,GAAU,MAAM;AACd,IAAIyW,GAAQ,gBACV6kB,EAAY,CAAC;AAAA,EAEjB,GAAG,CAAC7kB,GAAQ,cAAc6kB,CAAW,CAAC;AAEtC,QAAMC,KAAgB,YAAY;AAChC,IAAA1B,EAAW,EAAI,GACfI,EAAa,IAAI,GACjBF,EAAkB,IAAI;AACtB,QAAI;AACF,YAAMx2B,IAAS,MAAM03B,EAAA;AACrB,UAAI,CAAC13B,EAAQ;AACb,MAAAw2B,EAAkBx2B,CAAM,GACxBuV,EAAA,GACAwiB,EAAY,CAAC;AAAA,IACf,SAAS73B,GAAK;AACZ,cAAQ,MAAM,gBAAgBA,aAAe,QAAQA,EAAI,UAAU,eAAe,GAClFw2B,EAAaz5B,EAAE,qCAAqC,CAAC;AAAA,IACvD,UAAA;AACE,MAAAq5B,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAEM2B,KAAsB,OAAOC,MAAsB;AACvD,IAAAd,EAAuBc,CAAS;AAChC,QAAI;AAEF,MADgB,MAAMN,EAAgBM,CAAS,KAE7CH,EAAYhB,CAAW;AAAA,IAE3B,SAAS72B,GAAK;AACZ,cAAQ,MAAM,6BAA6BA,aAAe,QAAQA,EAAI,UAAU,eAAe;AAAA,IACjG,UAAA;AACE,MAAAk3B,EAAuB,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,SAAKlkB,GAAQ,eAYX,gBAAAtQ,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAAC6wB;AAAAA,MAAA;AAAA,QACC,MAAM6F;AAAA,QACN,OAAOl7B,EAAE,uCAAuC;AAAA,QAChD,aAAaA,EAAE,6CAA6C;AAAA,QAE5D,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,YAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAASo1B;AAAA,gBACT,UAAU3B,KAAWwB,MAAsB,QAAQ,CAACL;AAAA,gBACpD,WAAU;AAAA,gBAET,UAAA;AAAA,kBAAAnB,KAAWwB,sBACT90B,GAAA,EAAQ,WAAU,wBAAuB,IAE1C,gBAAAtB,EAAC02B,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,kBAEIl7B,EAA/Bo5B,KAAWwB,IAAsB,qCAAwC,kCAAN;AAAA,gBAAwC;AAAA,cAAA;AAAA,YAAA;AAAA,YAE7G,CAACL,KACA,gBAAA/1B,EAAC,QAAA,EAAK,WAAU,uCACb,UAAAxE,EAAE,2CAA2C,EAAA,CAChD;AAAA,UAAA,GAEJ;AAAA,UAGCw5B,KACC,gBAAA7zB,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,YAC5D,gBAAA7f,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAg1B,EAAA,CAAU;AAAA,UAAA,GAChE;AAAA,UAIDF,uBACE,OAAA,EAAI,WAAW,2CAA2CA,EAAe,UAAU,0DAA0D,mDAAmD,IAC/L,UAAA;AAAA,YAAA,gBAAA3zB,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,cAAA2zB,EAAe,4BACbvX,IAAA,EAAY,WAAU,sCAAqC,IAE5D,gBAAAvd,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,gCAE7D,QAAA,EAAK,WAAW,eAAeiV,EAAe,UAAU,+BAA+B,0BAA0B,IAC/G,UAAAA,EAAe,UAAUt5B,EAAE,sCAAsC,IAAIA,EAAE,qCAAqC,EAAA,CAC/G;AAAA,YAAA,GACF;AAAA,YACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,gBACnG,gBAAA2F,EAAC,KAAA,EAAE,WAAU,4CAA2C,UAAA;AAAA,kBAAA;AAAA,kBAAE2zB,EAAe;AAAA,gBAAA,EAAA,CAAQ;AAAA,cAAA,GACnF;AAAA,cACA,gBAAA3zB,EAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,gBACnG,gBAAA2F,EAAC,KAAA,EAAE,WAAU,gDAA+C,UAAA;AAAA,kBAAA;AAAA,kBAAE2zB,EAAe;AAAA,gBAAA,EAAA,CAAQ;AAAA,cAAA,GACvF;AAAA,cACA,gBAAA3zB,EAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,gBACnG,gBAAA2F,EAAC,KAAA,EAAE,WAAU,0CAAyC,UAAA;AAAA,kBAAA;AAAA,kBAAE2zB,EAAe;AAAA,gBAAA,EAAA,CAAQ;AAAA,cAAA,GACjF;AAAA,cACA,gBAAA3zB,EAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,gBACnG,gBAAAwE,EAAC,KAAA,EAAE,WAAU,8CAA8C,YAAe,QAAA,CAAQ;AAAA,cAAA,GACpF;AAAA,cACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,6HACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,oCAAoC,GAAE;AAAA,gBACrG,gBAAAwE,EAAC,KAAA,EAAE,WAAW,iBAAiB80B,EAAe,YAAY,IAAI,+BAA+B,4BAA4B,IAAK,UAAAA,EAAe,UAAA,CAAU;AAAA,cAAA,EAAA,CACzJ;AAAA,YAAA,GACF;AAAA,YACCA,EAAe,gBACd,gBAAA90B,EAAC,OAAE,WAAU,yCAAyC,YAAe,aAAA,CAAa;AAAA,UAAA,EAAA,CAEtF;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,gBAAAA;AAAA,MAAC6wB;AAAAA,MAAA;AAAA,QACC,MAAM1J;AAAA,QACN,OAAO3rB,EAAE,sCAAsC;AAAA,QAC/C,aAAaA,EAAE,4CAA4C;AAAA,QAC3D,QACE,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS2S;AAAA,YACT,UAAUpX;AAAA,YACV,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAsD,EAACoV,MAAU,WAAW,WAAW1Y,IAAU,iBAAiB,EAAE,IAAI;AAAA,cACjElB,EAAE,gBAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAItB,UAAAs6B,EAAW,SAAS,IACnB,gBAAA91B,EAAC,OAAA,EAAI,WAAU,yCACZ,UAAA81B,EAAW,IAAI,CAACz1B,MACf,gBAAAc;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,kDACb,UAAAxE,EAAE,uBAAuB6E,EAAO,aAAa,YAAA,CAAa,EAAE,EAAA,CAC/D;AAAA,gBACCm0B,GAAkBn0B,EAAO,MAAM;AAAA,cAAA,GAClC;AAAA,cACA,gBAAAc,EAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,KAAA,EAAG,YAAE,wCAAwC,EAAE,OAAOK,EAAO,iBAAA,CAAkB,GAAE;AAAA,gBACjFA,EAAO,kBACN,gBAAAL,EAAC,KAAA,EAAG,UAAAxE,EAAE,qCAAqC,EAAE,MAAM,IAAI,KAAK6E,EAAO,cAAc,EAAE,mBAAA,EAAmB,CAAG,EAAA,CAAE;AAAA,cAAA,EAAA,CAE/G;AAAA,YAAA;AAAA,UAAA;AAAA,UAdKA,EAAO;AAAA,QAAA,CAgBf,GACH,IAEA,gBAAAL,EAAC,OAAE,WAAU,wCACV,UAAAxE,EAAE,mCAAmC,EAAA,CACxC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIJ,gBAAAwE;AAAA,MAAC6wB;AAAAA,MAAA;AAAA,QACC,MAAMhR;AAAA,QACN,OAAOrkB,EAAE,qCAAqC;AAAA,QAC9C,aAAaA,EAAE,6CAA6C,EAAE,OAAOq6B,EAAU,QAAQ;AAAA,QAEtF,YAAU,WAAW,IACpB,gBAAA10B,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAI,WAAU,+FACb,4BAACud,IAAA,EAAY,WAAU,sCAAqC,EAAA,CAC9D;AAAA,4BACC,MAAA,EAAG,WAAU,yDACX,UAAA/hB,EAAE,6BAA6B,GAClC;AAAA,4BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,wCAAwC,EAAA,CAC7C;AAAA,QAAA,EAAA,CACF,sBAEC,OAAA,EAAI,WAAU,aACZ,UAAAq6B,EAAU,IAAI,CAACc,MACd,gBAAA32B;AAAA,UAAC42B;AAAA,UAAA;AAAA,YAEC,UAAAD;AAAA,YACA,WAAWX;AAAA,UAAA;AAAA,UAFNW,EAAS;AAAA,QAAA,CAIjB,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,IAKJ,gBAAAx1B;AAAA,MAAC0vB;AAAAA,MAAA;AAAA,QACC,MAAMgG;AAAA,QACN,OAAOr7B,EAAE,mCAAmC;AAAA,QAC5C,aAAaA,EAAE,yCAAyC;AAAA,QACxD,QACE,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMm1B,EAAYhB,CAAW;AAAA,YACtC,UAAUF;AAAA,YACV,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAAp1B,EAACoV,MAAU,WAAW,WAAWggB,IAAiB,iBAAiB,EAAE,IAAI;AAAA,cACxE55B,EAAE,gBAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAItB,UAAA;AAAA,UAAA45B,KAAkBF,EAAQ,WAAW,KACpC,gBAAAl1B,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAACsB,GAAA,EAAQ,WAAU,sDAAA,CAAsD,GAC3E;AAAA,UAED,EAAE8zB,KAAkBF,EAAQ,WAAW,MAAMA,EAAQ,WAAW,KAC/D,gBAAA/zB,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,SAAI,WAAU,gGACb,4BAAC62B,IAAA,EAAQ,WAAU,uCAAsC,EAAA,CAC3D;AAAA,8BACC,KAAA,EAAE,WAAU,wCACV,UAAAr7B,EAAE,uCAAuC,EAAA,CAC5C;AAAA,UAAA,GACF;AAAA,UAED05B,EAAQ,SAAS,KAChB,gBAAA/zB,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,YAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,6BACZ,UAAAk1B,EAAQ,IAAI,CAAC4B,MACZ,gBAAA31B,EAAC,OAAA,EAAqB,WAAU,iGAC9B,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,kBAAA21B,EAAQ,aACP,gBAAA92B,EAAC,QAAA,EAAK,WAAU,2FAA2F,UAAAxE,EAAE,sCAAsC,EAAA,CAAE,sBAEpJ,QAAA,EAAK,WAAU,oFAAoF,UAAAA,EAAE,uCAAuC,GAAE;AAAA,kBAEhJ84B,GAAewC,EAAQ,QAAQt7B,CAAC;AAAA,gBAAA,GACnC;AAAA,gBACCs7B,EAAQ,WAAW,gBAAgBf,KAClC,gBAAA50B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAMq1B,GAAoBM,EAAQ,EAAE;AAAA,oBAC7C,UAAUpB,MAAwBoB,EAAQ;AAAA,oBAC1C,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAApB,MAAwBoB,EAAQ,KAAK,gBAAA92B,EAACsB,GAAA,EAAQ,WAAU,wBAAuB,IAAK,gBAAAtB,EAACo0B,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,sBAChH54B,EAAE,eAAe;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACpB,GAEJ;AAAA,cACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,4CACZ,UAAA;AAAA,gBAAA,IAAI,KAAK21B,EAAQ,SAAS,EAAE,eAAA;AAAA,gBAAiB;AAAA,gBAAIzK,GAAeyK,EAAQ,WAAWA,EAAQ,WAAW;AAAA,cAAA,GACzG;AAAA,cACA,gBAAA31B,EAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,kBACnG,gBAAA2F,EAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA;AAAA,oBAAA;AAAA,oBAAE21B,EAAQ;AAAA,kBAAA,EAAA,CAAQ;AAAA,gBAAA,GAC7E;AAAA,gBACA,gBAAA31B,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,kBACnG,gBAAA2F,EAAC,QAAA,EAAK,WAAU,8CAA6C,UAAA;AAAA,oBAAA;AAAA,oBAAE21B,EAAQ;AAAA,kBAAA,EAAA,CAAQ;AAAA,gBAAA,GACjF;AAAA,gBACA,gBAAA31B,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,kBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CAA6C,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,kBACnG,gBAAA2F,EAAC,QAAA,EAAK,WAAU,wCAAuC,UAAA;AAAA,oBAAA;AAAA,oBAAE21B,EAAQ;AAAA,kBAAA,EAAA,CAAQ;AAAA,gBAAA,EAAA,CAC3E;AAAA,cAAA,GACF;AAAA,cACA,gBAAA92B,EAAC,OAAA,EAAI,WAAU,yFACZ,UAAA82B,EAAQ,gBAAgB,WACvB,gBAAA31B,EAAC,QAAA,EAAK,WAAU,2BACd,UAAA;AAAA,gBAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gBAC1Bo1B,EAAQ,uBAAuBt7B,EAAE,yCAAyC;AAAA,cAAA,EAAA,CAC7E,IAEA,gBAAA2F,EAAC,QAAA,EAAK,WAAU,uDACd,UAAA;AAAA,gBAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,gBAC1B/G,EAAE,uCAAuC;AAAA,cAAA,EAAA,CAC5C,EAAA,CAEJ;AAAA,YAAA,EAAA,GAlDQs7B,EAAQ,EAmDlB,CACD,GACH;AAAA,8BAGC,OAAA,EAAI,WAAU,mCACb,UAAA,gBAAA31B,EAAC,SAAA,EAAM,WAAU,kBACf,UAAA;AAAA,cAAA,gBAAAnB,EAAC,SAAA,EACC,UAAA,gBAAAmB,EAAC,MAAA,EAAG,WAAU,yCACZ,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,gEAAgE,UAAAxE,EAAE,kCAAkC,GAAE;AAAA,kCACnH,MAAA,EAAG,WAAU,gEAAgE,UAAAA,EAAE,kCAAkC,GAAE;AAAA,kCACnH,MAAA,EAAG,WAAU,gEAAgE,UAAAA,EAAE,oCAAoC,GAAE;AAAA,kCACrH,MAAA,EAAG,WAAU,iEAAiE,UAAAA,EAAE,sCAAsC,GAAE;AAAA,kCACxH,MAAA,EAAG,WAAU,iEAAiE,UAAAA,EAAE,kCAAkC,GAAE;AAAA,kCACpH,MAAA,EAAG,WAAU,iEAAiE,UAAAA,EAAE,kCAAkC,GAAE;AAAA,kCACpH,MAAA,EAAG,WAAU,iEAAiE,UAAAA,EAAE,kCAAkC,GAAE;AAAA,kCACpH,MAAA,EAAG,WAAU,gEAAgE,UAAAA,EAAE,yCAAyC,GAAE;AAAA,kCAC1H,MAAA,EAAG,WAAU,kEAAkE,UAAAA,EAAE,sBAAsB,EAAA,CAAE;AAAA,cAAA,EAAA,CAC5G,EAAA,CACF;AAAA,cACA,gBAAAwE,EAAC,WACE,UAAAk1B,EAAQ,IAAI,CAAC4B,MACZ,gBAAA31B,EAAC,MAAA,EAAoB,WAAU,yEAC7B,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,MAAA,EAAG,WAAU,wCACX,UAAA,IAAI,KAAK82B,EAAQ,SAAS,EAAE,eAAA,EAAe,CAC9C;AAAA,gBACA,gBAAA92B,EAAC,MAAA,EAAG,WAAU,aACZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,0CACb,UAAA82B,EAAQ,aACP,gBAAA92B,EAAC,QAAA,EAAK,WAAU,mFAAmF,UAAAxE,EAAE,sCAAsC,EAAA,CAAE,IAE7I,gBAAAwE,EAAC,QAAA,EAAK,WAAU,4EAA4E,UAAAxE,EAAE,uCAAuC,EAAA,CAAE,EAAA,CAE3I,GACF;AAAA,gBACA,gBAAAwE,EAAC,QAAG,WAAU,aACX,aAAe82B,EAAQ,QAAQt7B,CAAC,GACnC;AAAA,gBACA,gBAAAwE,EAAC,QAAG,WAAU,qDACX,aAAe82B,EAAQ,WAAWA,EAAQ,WAAW,EAAA,CACxD;AAAA,gBACA,gBAAA31B,EAAC,MAAA,EAAG,WAAU,+DAA8D,UAAA;AAAA,kBAAA;AAAA,kBACxE21B,EAAQ;AAAA,gBAAA,GACZ;AAAA,gBACA,gBAAA31B,EAAC,MAAA,EAAG,WAAU,mEAAkE,UAAA;AAAA,kBAAA;AAAA,kBAC5E21B,EAAQ;AAAA,gBAAA,GACZ;AAAA,gBACA,gBAAA31B,EAAC,MAAA,EAAG,WAAU,6DAA4D,UAAA;AAAA,kBAAA;AAAA,kBACtE21B,EAAQ;AAAA,gBAAA,GACZ;AAAA,gBACA,gBAAA92B,EAAC,MAAA,EAAG,WAAU,0CACX,UAAA82B,EAAQ,gBAAgB,WACvB,gBAAA31B,EAAC,QAAA,EAAK,WAAU,2BACd,UAAA;AAAA,kBAAA,gBAAAnB,EAAC0B,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,kBAC1Bo1B,EAAQ,uBAAuBt7B,EAAE,yCAAyC;AAAA,gBAAA,EAAA,CAC7E,IAEA,gBAAA2F,EAAC,QAAA,EAAK,WAAU,uDACd,UAAA;AAAA,kBAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,kBAC1B/G,EAAE,uCAAuC;AAAA,gBAAA,EAAA,CAC5C,EAAA,CAEJ;AAAA,kCACC,MAAA,EAAG,WAAU,yBACX,UAAAs7B,EAAQ,WAAW,gBAAgBf,KAClC,gBAAA50B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAMq1B,GAAoBM,EAAQ,EAAE;AAAA,oBAC7C,UAAUpB,MAAwBoB,EAAQ;AAAA,oBAC1C,WAAU;AAAA,oBACV,OAAOt7B,EAAE,wCAAwC;AAAA,oBAEhD,UAAA;AAAA,sBAAAk6B,MAAwBoB,EAAQ,KAC/B,gBAAA92B,EAACsB,GAAA,EAAQ,WAAU,wBAAuB,IAE1C,gBAAAtB,EAACo0B,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,sBAE7B54B,EAAE,eAAe;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA,EACpB,CAEJ;AAAA,cAAA,KAzDOs7B,EAAQ,EA0DjB,CACD,EAAA,CACH;AAAA,YAAA,EAAA,CACF,EAAA,CACF;AAAA,YAGCtB,IAAoBa,KACnB,gBAAAl1B,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,uCACb,UAAAxE,EAAE,uCAAuC;AAAA,gBACxC,OAAO85B,IAAc,KAAKe,IAAkB;AAAA,gBAC5C,IAAI,KAAK,IAAIf,IAAce,GAAiBb,CAAiB;AAAA,gBAC7D,OAAOA;AAAA,cAAA,CACR,GACH;AAAA,cACA,gBAAAr0B,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAA,gBAAAnB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAMs2B,EAAYhB,IAAc,CAAC;AAAA,oBAC1C,UAAUA,MAAgB,KAAKF;AAAA,oBAC/B,WAAU;AAAA,oBAET,YAAE,iBAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEtB,gBAAAp1B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS,MAAMs2B,EAAYhB,IAAc,CAAC;AAAA,oBAC1C,UAAUA,IAAce,KAAmBb,KAAqBJ;AAAA,oBAChE,WAAU;AAAA,oBAET,YAAE,aAAa;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAClB,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ,GACF,IAjXE,gBAAAj0B,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,qCAAA,CAAqC;AAAA,sBACpD,QAAA,EAAK,WAAU,sCACb,UAAApX,EAAE,yCAAyC,EAAA,CAC9C;AAAA,EAAA,GACF;AA8WN;AAWA,SAASu7B,GAAS,EAAE,QAAAtlB,GAAQ,GAAAjW,KAAoB;AAC9C,SAAKiW,GAAQ,eAYX,gBAAAzR;AAAA,IAAC6wB;AAAAA,IAAA;AAAA,MACC,MAAMnvB;AAAA,MACN,OAAOlG,EAAE,iCAAiC;AAAA,MAC1C,aAAaA,EAAE,uCAAuC;AAAA,MAEtD,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAU,iGACb,4BAAC0B,IAAA,EAAM,WAAU,uCAAsC,EAAA,CACzD;AAAA,0BACC,MAAA,EAAG,WAAU,yDACX,UAAAlG,EAAE,sCAAsC,GAC3C;AAAA,0BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,iDAAiD,EAAA,CACtD;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA,IAzBA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,qCAAA,CAAqC;AAAA,sBACpD,QAAA,EAAK,WAAU,sCACb,UAAApX,EAAE,0CAA0C,EAAA,CAC/C;AAAA,EAAA,GACF;AAuBN;AAWA,SAASw7B,GAAU,EAAE,QAAAvlB,GAAQ,GAAAjW,KAAqB;AAChD,SAAKiW,GAAQ,eAYX,gBAAAzR;AAAA,IAAC6wB;AAAAA,IAAA;AAAA,MACC,MAAMpwB;AAAA,MACN,OAAOjF,EAAE,kCAAkC;AAAA,MAC3C,aAAaA,EAAE,wCAAwC;AAAA,MAEvD,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAU,iGACb,4BAACS,IAAA,EAAU,WAAU,uCAAsC,EAAA,CAC7D;AAAA,0BACC,MAAA,EAAG,WAAU,yDACX,UAAAjF,EAAE,uCAAuC,GAC5C;AAAA,0BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,kDAAkD,EAAA,CACvD;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA,IAzBA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC4S,IAAA,EAAK,WAAU,qCAAA,CAAqC;AAAA,sBACpD,QAAA,EAAK,WAAU,sCACb,UAAApX,EAAE,2CAA2C,EAAA,CAChD;AAAA,EAAA,GACF;AAuBN;AAMO,SAASy7B,GAAe,EAAE,UAAAjzB,GAAU,YAAAkzB,KAAiD;AAC1F,QAAM,EAAE,GAAA17B,MAAMC,GAAe,CAAC,SAAS,SAAS,QAAQ,CAAC,GACnD,EAAE,eAAA07B,EAAA,IAAkBC,GAAA,GACpB,EAAE,aAAAC,GAAa,gBAAAC,EAAA,IAAmBC,GAAA,GAClC,CAACC,GAAcC,CAAe,IAAI18B,EAAmB,QAAQ,GAC7D,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAIhD+2B,IAAWr3B,GAAQ,MAAMi9B,GAAeR,CAAU,GAAG,CAACA,CAAU,CAAC,GAGjE,CAACzlB,GAAQkmB,CAAS,IAAI58B,EAAuC,IAAI,GACjE,CAAC86B,GAAW+B,CAAY,IAAI78B,EAAiC,CAAA,CAAE,GAC/D,CAAC+6B,GAAY+B,CAAa,IAAI98B,EAA+B,CAAA,CAAE,GAC/D,CAAC+8B,GAAkBC,CAAmB,IAAIh9B,EAAsC,IAAI,GACpF,CAACi9B,GAAWC,CAAY,IAAIl9B,EAAS,EAAK,GAG1C,CAACq7B,GAAmBxF,CAAoB,IAAI71B,EAAwD,IAAI,GACxG,CAACm9B,GAAiBC,CAAkB,IAAIp9B,EAAiB,OAAO,GAGhEq9B,IAAqBC,GAA+B,IAAI,GACxDC,IAAeD,GAAO,EAAK,GAG3BE,IAAUpB,EAAclH,GAAkB,IAAI,GAC9CuB,KAAU2F,EAAclH,GAAkB,MAAM,GAChD8F,KAAUoB,EAAclH,GAAkB,IAAI,GAU9CuI,IAPoB;AAAA,IACxB,EAAE,IAAI,UAAU,OAAOh9B,EAAE,iCAAiC,GAAG,MAAMk2B,IAAK,YAAYzB,GAAkB,KAAA;AAAA,IACtG,EAAE,IAAI,QAAQ,OAAOz0B,EAAE,+BAA+B,GAAG,MAAM2rB,IAAK,YAAY8I,GAAkB,KAAA;AAAA,IAClG,EAAE,IAAI,SAAS,OAAOz0B,EAAE,gCAAgC,GAAG,MAAMkG,IAAO,YAAYuuB,GAAkB,KAAA;AAAA,IACtG,EAAE,IAAI,UAAU,OAAOz0B,EAAE,iCAAiC,GAAG,MAAMiF,IAAW,YAAYwvB,GAAkB,KAAA;AAAA,EAAK,EAGrF,OAAO,CAACnO,MAAQqV,EAAcrV,EAAI,UAAU,CAAC;AAE3E,EAAA9mB,GAAU,MAAM;AACd,IAAIw9B,EAAc,SAAS,KAAK,CAACA,EAAc,KAAK,CAAC1W,MAAQA,EAAI,OAAO0V,CAAY,KAClFC,EAAgBe,EAAc,CAAC,EAAE,EAAE;AAAA,EAEvC,GAAG,CAACA,GAAehB,CAAY,CAAC;AAEhC,QAAM7b,KAAWrd,EAAY,YAAY;AACvC,QAAI,CAAAg6B,EAAa,SAEjB;AAAA,UAAI,CAACC,GAAS;AACZ,QAAA57B,EAAW,EAAK;AAChB;AAAA,MACF;AAEA,MAAIy7B,EAAmB,WACrBA,EAAmB,QAAQ,MAAA,GAG7BA,EAAmB,UAAU,IAAI,gBAAA,GACjCE,EAAa,UAAU,IACvB37B,EAAW,EAAI,GACfmB,EAAS,IAAI;AAEb,UAAI;AACF,cAAM,CAAC26B,GAAYC,GAAeC,CAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,UACpE7G,EAAS,SAAS,iBAAA;AAAA,UAClBA,EAAS,UAAU,OAAA;AAAA,UACnBA,EAAS,UAAU,cAAA;AAAA,QAAc,CAClC;AAED,QAAA6F,EAAUc,KAAc,IAAI,GAC5Bb,EAAa,MAAM,QAAQc,CAAa,IAAIA,IAAgB,CAAA,CAAE,GAC9Db,EAAc,MAAM,QAAQc,CAAc,IAAIA,IAAiB,CAAA,CAAE;AAAA,MACnE,SAASl6B,GAAK;AACZ,YAAIA,aAAe,SAASA,EAAI,SAAS,aAAc;AACvD,gBAAQ,MAAM,8BAA8BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GAChGX,EAAStC,EAAE,+BAA+B,CAAC;AAAA,MAC7C,UAAA;AACE,QAAA88B,EAAa,UAAU,IACvB37B,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF,GAAG,CAACm1B,GAAUt2B,GAAG+8B,CAAO,CAAC;AAEzB,EAAAv9B,GAAU,OACR2gB,GAAA,GACO,MAAM;AACX,IAAIyc,EAAmB,WACrBA,EAAmB,QAAQ,MAAA;AAAA,EAE/B,IACC,CAACzc,IAAU3X,CAAQ,CAAC,GAGvBhJ,GAAU,MACYs8B,EAAe,CAAC3G,MAAyC;AAC3E,IAAAD,GAAwBC,GAAcC,GAAsBjV,EAAQ;AAAA,EACtE,CAAC,GAGA,CAAC2b,GAAgB3b,EAAQ,CAAC,GAG7B3gB,GAAU,MAAM;AACd,QAAI,CAACo7B,GAAmB;AACtB,MAAA+B,EAAmB,OAAO;AAC1B;AAAA,IACF;AAEA,IAAAA,EAAmB9H,GAAqB+F,EAAkB,SAAS,CAAC;AACpE,UAAMwC,IAAW,YAAY,MAAM;AACjC,MAAAT,EAAmB9H,GAAqB+F,EAAkB,SAAS,CAAC;AAAA,IACtE,GAAG,GAAI;AAEP,WAAO,MAAM,cAAcwC,CAAQ;AAAA,EACrC,GAAG,CAACxC,CAAiB,CAAC;AAEtB,QAAMyC,IAAgBv6B,EAAY,OAAOw6B,GAAkDC,MAAmB;AAC5G,QAAI,GAACjB,KAAoBE,IAEzB;AAAA,MAAAC,EAAa,EAAI;AACjB,UAAI;AACF,cAAMnG,EAAS,UAAU,QAAQgG,EAAiB,IAAI;AAAA,UACpD,YAAAgB;AAAA,UACA,OAAOC,KAAS;AAAA,QAAA,CACjB,GACDhB,EAAoB,IAAI,GACxB,MAAMpc,GAAA;AAAA,MACR,SAASld,GAAK;AACZ,gBAAQ,MAAM,+BAA+BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GACjGX,EAAStC,EAAE,8BAA8B,CAAC;AAAA,MAC5C,UAAA;AACE,QAAAy8B,EAAa,EAAK;AAAA,MACpB;AAAA;AAAA,EACF,GAAG,CAACnG,GAAUgG,GAAkBE,GAAWrc,IAAUngB,CAAC,CAAC,GAEjDw9B,IAAgB16B,EAAY,YAAgD;AAChF,QAAI;AAEF,aADe,MAAMwzB,EAAS,KAAK,QAAA;AAAA,IAErC,SAASrzB,GAAK;AACZ,oBAAQ,MAAM,oBAAoBA,aAAe,QAAQA,EAAI,UAAU,eAAe,GAChFA;AAAA,IACR;AAAA,EACF,GAAG,CAACqzB,CAAQ,CAAC,GAEPmH,IAAoB36B,EAAY,OAAOf,GAAc27B,MAA8F;AACvJ,QAAI;AAEF,aADe,MAAMpH,EAAS,KAAK,WAAWv0B,GAAM27B,CAAQ;AAAA,IAE9D,SAASz6B,GAAK;AACZ,qBAAQ,MAAM,2BAA2BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GACtF;AAAA,IACT;AAAA,EACF,GAAG,CAACqzB,CAAQ,CAAC,GAEP0E,IAAsBl4B,EAAY,OAAOm4B,MAAwC;AACrF,QAAI;AACF,mBAAM3E,EAAS,KAAK,cAAc2E,CAAS,GACpC;AAAA,IACT,SAASh4B,GAAK;AACZ,qBAAQ,MAAM,6BAA6BA,aAAe,QAAQA,EAAI,UAAU,eAAe,GACxF;AAAA,IACT;AAAA,EACF,GAAG,CAACqzB,CAAQ,CAAC;AAEb,SAAIp1B,IAEA,gBAAAsD,EAAC,SAAI,WAAU,0CACb,4BAACsB,GAAA,EAAQ,WAAU,uDAAsD,EAAA,CAC3E,IAIAk3B,EAAc,WAAW,IAEzB,gBAAAr3B,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC2Y,IAAA,EAAK,WAAU,mCAAA,CAAmC;AAAA,sBAClD,QAAA,EAAK,WAAU,oCACb,UAAAnd,EAAE,kCAAkC,EAAA,CACvC;AAAA,EAAA,GACF,IAKF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAAtD,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,MAC5D,gBAAA7f,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAnC,GAAM;AAAA,MAC1D,gBAAAmC,EAAC,YAAO,SAAS,MAAMlC,EAAS,IAAI,GAAG,WAAU,qDAAoD,UAAA,IAAA,CAAC;AAAA,IAAA,GACxG;AAAA,IAIDs4B,KACC,gBAAAj1B,EAAC,OAAA,EAAI,WAAU,+OACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,QAAA,gBAAAnB,EAACoV,IAAA,EAAU,WAAU,oEAAA,CAAoE;AAAA,QACzF,gBAAAjU,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,KAAA,EAAE,WAAU,kFACV,UAAAxE,EAAE,yCAAyC,GAC9C;AAAA,4BACC,KAAA,EAAE,WAAU,uFACV,UAAAA,EAAE,oDAAoD,EAAA,CACzD;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,wBACC,OAAA,EAAI,WAAU,iDACb,UAAA,gBAAA2F,EAAC,QAAA,EAAK,WAAU,sLAAqL,UAAA;AAAA,QAAA;AAAA,QAChM+2B;AAAA,MAAA,EAAA,CACL,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAIF,gBAAA/2B,EAAC,OAAA,EAAI,WAAU,+JACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAI,WAAU,4CACZ,UAAAw4B,EAAc,IAAI,CAAC1W,MAAQ;AAC1B,cAAMgP,IAAOhP,EAAI,MACXrC,IAAW+X,MAAiB1V,EAAI,IAEhCqX,IAAoBrX,EAAI,OAAO,UAAU+T,EAAU,SAAS;AAClE,eACE,gBAAA10B;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAMs2B,EAAgB3V,EAAI,EAAE;AAAA,YACrC,WAAW,mKACTrC,IACI,6DACA,6FACN;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAzf,EAAC8wB,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cAC1B,gBAAA9wB,EAAC,QAAA,EAAK,WAAU,oBAAoB,YAAI,OAAM;AAAA,cAC7Cm5B,KACC,gBAAAn5B,EAAC,QAAA,EAAK,WAAU,uGACb,YAAU,OAAA,CACb;AAAA,YAAA;AAAA,UAAA;AAAA,UAbG8hB,EAAI;AAAA,QAAA;AAAA,MAiBf,CAAC,EAAA,CACH;AAAA,MAEA,gBAAA9hB,EAAC,OAAA,EAAI,WAAU,8JACZ,UAAAq3B,IACC,gBAAAl2B,EAAC,QAAA,EAAK,WAAU,gEAA+D,OAAO3F,EAAE,uCAAuC,GAC7H,UAAA;AAAA,QAAA,gBAAAwE,EAAC,QAAA,EAAK,WAAU,8DAAA,CAA8D;AAAA,0BAC7E,QAAA,EAAK,WAAU,oBAAoB,UAAAxE,EAAE,aAAa,EAAA,CAAE;AAAA,MAAA,EAAA,CACvD,sBAEC,QAAA,EAAK,WAAU,iEAAgE,OAAOA,EAAE,0CAA0C,GACjI,UAAA;AAAA,QAAA,gBAAAwE,EAAC,QAAA,EAAK,WAAU,iDAAA,CAAiD;AAAA,0BAChE,QAAA,EAAK,WAAU,oBAAoB,UAAAxE,EAAE,gBAAgB,EAAA,CAAE;AAAA,MAAA,EAAA,CAC1D,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAGCg8B,MAAiB,YAChB,gBAAAx3B;AAAA,MAAC4xB;AAAA,MAAA;AAAA,QACC,QAAAngB;AAAA,QACA,SAAA/U;AAAA,QACA,SAAA80B;AAAA,QACA,WAAW7V;AAAA,QACX,iBAAiBA;AAAA,QACjB,GAAAngB;AAAA,QACA,UAAAs2B;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH0F,MAAiB,UAChB,gBAAAx3B;AAAA,MAAC41B;AAAA,MAAA;AAAA,QACC,QAAAnkB;AAAA,QACA,WAAAokB;AAAA,QACA,YAAAC;AAAA,QACA,SAAAp5B;AAAA,QACA,SAAAq5B;AAAA,QACA,WAAWpa;AAAA,QACX,mBAAmBoc;AAAA,QACnB,WAAWiB;AAAA,QACX,eAAeC;AAAA,QACf,iBAAiBzC;AAAA,QACjB,mBAAAJ;AAAA,QACA,GAAA56B;AAAA,MAAA;AAAA,IAAA;AAAA,IAGHg8B,MAAiB,WAAW,gBAAAx3B,EAAC+2B,IAAA,EAAS,QAAAtlB,GAAgB,GAAAjW,GAAM;AAAA,IAC5Dg8B,MAAiB,YAAY,gBAAAx3B,EAACg3B,IAAA,EAAU,QAAAvlB,GAAgB,GAAAjW,GAAM;AAAA,IAG9Ds8B,KACC,gBAAA93B;AAAA,MAACo5B;AAAA,MAAA;AAAA,QACC,UAAUtB;AAAA,QACV,SAAS,MAAMC,EAAoB,IAAI;AAAA,QACvC,WAAWc;AAAA,QACX,WAAAb;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;ACtmDA,SAASqB,GAAmBC,GAMzB7nB,GAAgDjW,GAAsC;AACvF,QAAM+9B,IAAiC,CAAA;AAEvC,MAAI,CAACD,EAAO,YAAY;AACtB,IAAAC,EAAO,cAAc/9B,EAAE,oDAAoD;AAAA;AAE3E,QAAI;AACF,UAAI,IAAI89B,EAAO,WAAW;AAAA,IAC5B,QAAQ;AACN,MAAAC,EAAO,cAAc/9B,EAAE,mDAAmD;AAAA,IAC5E;AAEF,SAAK89B,EAAO,aAAa,WACvBC,EAAO,eAAe/9B,EAAE,qDAAqD,IAE3E,CAAC89B,EAAO,oBAAoB,CAAC7nB,GAAQ,wBACvC8nB,EAAO,mBAAmB/9B,EAAE,yDAAyD,IAElF89B,EAAO,aAAa,WACvBC,EAAO,eAAe/9B,EAAE,qDAAqD,IAE3E,CAAC89B,EAAO,gBAAgB,CAAC7nB,GAAQ,oBACnC8nB,EAAO,eAAe/9B,EAAE,qDAAqD,IAGxE+9B;AACT;AAEA,SAASC,GAAqBF,GAQ3BG,GAAkBC,GAAsBC,GAAgE;AACzG,QAAMltB,IAA6C;AAAA,IACjD,UAAAgtB;AAAA,IACA,aAAAC;AAAA,IACA,qBAAAC;AAAA,EAAA;AAGF,SAAIF,MAAa,WACfhtB,EAAQ,cAAc6sB,EAAO,aAC7B7sB,EAAQ,eAAe6sB,EAAO,cAC1BA,EAAO,qBACT7sB,EAAQ,mBAAmB6sB,EAAO,mBAEpC7sB,EAAQ,eAAe6sB,EAAO,cAC1BA,EAAO,iBACT7sB,EAAQ,eAAe6sB,EAAO,eAE5BA,EAAO,iBACT7sB,EAAQ,eAAe,OAAO6sB,EAAO,YAAY,IAE/CA,EAAO,sBACT7sB,EAAQ,oBAAoB,OAAO6sB,EAAO,iBAAiB,KAIxD7sB;AACT;AAmBA,SAASokB,GAAY,EAAE,MAAMC,GAAM,OAAAC,GAAO,aAAA3L,GAAa,QAAAhmB,GAAQ,UAAA4xB,KAA8B;AAC3F,SACE,gBAAA7vB,EAAC,OAAA,EAAI,WAAU,kHACb,UAAA;AAAA,IAAA,gBAAAnB,EAAC,SAAI,WAAU,6EACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAU,wGACb,4BAAC8wB,GAAA,EAAK,WAAU,0CAAyC,EAAA,CAC3D;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA9wB,EAAC,MAAA,EAAG,WAAU,sDAAsD,UAAA+wB,GAAM;AAAA,UACzE3L,KACC,gBAAAplB,EAAC,KAAA,EAAE,WAAU,8CAA8C,UAAAolB,EAAA,CAAY;AAAA,QAAA,EAAA,CAE3E;AAAA,MAAA,GACF;AAAA,MACChmB;AAAA,IAAA,EAAA,CACH,EAAA,CACF;AAAA,IACA,gBAAAY,EAAC,OAAA,EAAI,WAAU,OACZ,UAAAgxB,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAUA,SAASE,GAAO,EAAE,SAAAC,GAAS,UAAAC,GAAU,OAAA9F,GAAO,aAAAlG,GAAa,UAAAiM,KAAyB;AAChF,SACE,gBAAAlwB,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,kDAAkD,UAAAsrB,GAAM;AAAA,MACxElG,KACC,gBAAAplB,EAAC,KAAA,EAAE,WAAU,8CAA8C,UAAAolB,EAAA,CAAY;AAAA,IAAA,GAE3E;AAAA,IACA,gBAAAplB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAcmxB;AAAA,QACd,SAASC;AAAA,QACT,UAAAC;AAAA,QACA,WAAW,0QACTF,IAAU,iCAAiC,yBAC7C;AAAA,QAEA,UAAA,gBAAAnxB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,uFACTmxB,IAAU,kBAAkB,eAC9B;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEA,SAASyI,GAAW,EAAE,MAAAC,KAA0B;AAC9C,SACE,gBAAA75B;AAAA,IAAC8qB;AAAAA,IAAA;AAAA,MACC,SACE,gBAAA9qB,EAAC,QAAA,EAAK,WAAU,+CAA+C,UAAA65B,GAAK;AAAA,MAEtE,UAAS;AAAA,MACT,SAAQ;AAAA,MACR,OAAO;AAAA,MACP,WAAU;AAAA,MAEV,UAAA,gBAAA75B,EAAC4S,IAAA,EAAK,WAAU,kGAAA,CAAkG;AAAA,IAAA;AAAA,EAAA;AAGxH;AAMO,SAASknB,GAAyB,EAAE,UAAA91B,GAAU,YAAA1E,KAA2D;AAC9G,QAAM,EAAE,GAAA9D,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAG1C,CAACiB,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAACggB,GAAQC,CAAS,IAAIjgB,EAAS,EAAK,GACpC,CAACk3B,GAASC,CAAU,IAAIn3B,EAAS,EAAK,GACtC,CAAC65B,GAASC,CAAU,IAAI95B,EAAS,EAAK,GACtC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkgB,GAASC,CAAU,IAAIngB,EAAwB,IAAI,GACpD,CAACg/B,GAAaC,CAAc,IAAIj/B,EAAS,EAAK,GAC9C,CAAC0W,GAAQkmB,CAAS,IAAI58B,EAAiD,IAAI,GAC3E,CAAC+5B,GAAgBC,CAAiB,IAAIh6B,EAAwC,IAAI,GAClF,CAACo3B,GAAYC,CAAa,IAAIr3B,EAAoE,IAAI,GACtG,CAACk/B,GAAaC,CAAc,IAAIn/B,EAAiC,CAAA,CAAE,GAGnE,CAAC0+B,GAAUU,CAAW,IAAIp/B,EAAiB,YAAY,GACvD,CAACq/B,GAAaC,CAAc,IAAIt/B,EAAS,EAAE,GAC3C,CAACu/B,GAAcC,EAAe,IAAIx/B,EAAS,EAAE,GAC7C,CAACy/B,IAAkBC,CAAmB,IAAI1/B,EAAS,EAAE,GACrD,CAAC2/B,GAAcC,EAAe,IAAI5/B,EAAS,EAAE,GAC7C,CAAC6/B,GAAcC,CAAe,IAAI9/B,EAAS,EAAE,GAC7C,CAAC+/B,GAAcC,CAAe,IAAIhgC,EAAiB,EAAE,GACrD,CAACigC,GAAmBC,CAAoB,IAAIlgC,EAAiB,EAAE,GAC/D,CAAC2+B,GAAawB,CAAc,IAAIngC,EAAS,EAAK,GAC9C,CAAC4+B,IAAqBwB,EAAsB,IAAIpgC,EAAS,EAAE,GAE3DqgC,KAAS3B,MAAa,QAEtB4B,KAAkB,CAACnI,MACvB+G,EAAY/G,CAAK,IAAI,mEAAmE,gCAEpFoI,KAAoBh9B,EAAY,YAAY;AAChD,IAAA3B,EAAW,EAAI,GACfmB,EAAS,IAAI;AACb,QAAI;AACF,YAAM6G,IAAO,MAAMoQ,GAAa,iBAAiB/Q,CAAQ;AACzD,MAAA2zB,EAAUhzB,CAAI,GACdw1B,EAAYx1B,EAAK,YAAY,YAAY,GACzC01B,EAAe11B,EAAK,eAAe,EAAE,GACrC41B,GAAgB51B,EAAK,gBAAgB,EAAE,GACvC81B,EAAoB,EAAE,GACtBE,GAAgBh2B,EAAK,gBAAgB,EAAE,GACvCk2B,EAAgB,EAAE,GAClBE,EAAgBp2B,EAAK,gBAAgB,OAAO,OAAOA,EAAK,YAAY,IAAI,EAAE,GAC1Es2B,EAAqBt2B,EAAK,qBAAqB,OAAO,OAAOA,EAAK,iBAAiB,IAAI,EAAE,GACzFu2B,EAAev2B,EAAK,WAAW,GAC/Bw2B,GAAuBx2B,EAAK,mBAAmB;AAAA,IACjD,QAAQ;AAEN,MAAAgzB,EAAU,IAAI;AAAA,IAChB,UAAA;AACE,MAAAh7B,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACqH,CAAQ,CAAC;AAEb,EAAAhJ,GAAU,MAAM;AACd,IAAAsgC,GAAA;AAAA,EACF,GAAG,CAACA,EAAiB,CAAC;AAEtB,QAAMC,KAAe,MAAe;AAClC,QAAI,CAACH;AACH,aAAAlB,EAAe,CAAA,CAAE,GACV;AAGT,UAAMX,IAASF,GAAmB;AAAA,MAChC,aAAAe;AAAA,MACA,cAAAE;AAAA,MACA,kBAAAE;AAAA,MACA,cAAAE;AAAA,MACA,cAAAE;AAAA,IAAA,GACCnpB,GAAQjW,CAAC;AAEZ,WAAA0+B,EAAeX,CAAM,GACd,OAAO,KAAKA,CAAM,EAAE,WAAW;AAAA,EACxC,GAEM3c,IAAa,YAAY;AAC7B,QAAI,CAAC2e,KAAgB;AAErB,IAAAvgB,EAAU,EAAI,GACdld,EAAS,IAAI,GACbod,EAAW,IAAI;AAEf,UAAMzO,IAAU+sB,GAAqB;AAAA,MACnC,aAAAY;AAAA,MACA,cAAAE;AAAA,MACA,kBAAAE;AAAA,MACA,cAAAE;AAAA,MACA,cAAAE;AAAA,MACA,cAAAE;AAAA,MACA,mBAAAE;AAAA,IAAA,GACCvB,GAAUC,GAAaC,EAAmB;AAE7C,QAAI;AACF,YAAM6B,IAAU,MAAMzmB,GAAa,kBAAkB/Q,GAAUyI,CAAO;AACtE,MAAAkrB,EAAU6D,CAAO,GACjBf,EAAoB,EAAE,GACtBI,EAAgB,EAAE,GAClB3f,EAAW1f,EAAE,qCAAqC,CAAC;AAAA,IACrD,QAAQ;AACN,MAAAsC,EAAStC,EAAE,oCAAoC,CAAC;AAAA,IAClD,UAAA;AACE,MAAAwf,EAAU,EAAK;AAAA,IACjB;AAAA,EACF,GAEMyY,KAAuB,YAAY;AACvC,IAAAvB,EAAW,EAAI,GACfE,EAAc,IAAI,GAClBt0B,EAAS,IAAI,GACbod,EAAW,IAAI;AACf,QAAI;AACF,YAAM3c,IAAS,MAAMwW,GAAa,eAAe/Q,GAAU;AAAA,QACzD,aAAAo2B;AAAA,QACA,cAAAE;AAAA,QACA,kBAAkBE,MAAoB;AAAA,QACtC,cAAAE;AAAA,QACA,cAAcE,KAAgB;AAAA,MAAA,CAC/B;AACD,MAAAxI,EAAc7zB,CAAM,GAChBA,EAAO,UACT2c,EAAW1f,EAAE,qCAAqC,CAAC,IAEnDsC,EAASS,EAAO,gBAAgB/C,EAAE,oCAAoC,CAAC;AAAA,IAE3E,QAAQ;AACN,MAAAsC,EAAStC,EAAE,oCAAoC,CAAC;AAAA,IAClD,UAAA;AACE,MAAA02B,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAEMqE,KAAgB,YAAY;AAChC,IAAA1B,EAAW,EAAI,GACfE,EAAkB,IAAI,GACtBj3B,EAAS,IAAI,GACbod,EAAW,IAAI;AACf,QAAI;AACF,YAAM3c,IAAS,MAAMwW,GAAa,YAAY/Q,CAAQ;AACtD,MAAA+wB,EAAkBx2B,CAAM,GACpBA,EAAO,UACT2c,EAAW1f,EAAE,uCAAuC,EAAE,OAAO+C,EAAO,eAAA,CAAgB,CAAC,IAErFT,EAASS,EAAO,gBAAgB/C,EAAE,oCAAoC,CAAC,GAEzE,MAAM8/B,GAAA;AAAA,IACR,QAAQ;AACN,MAAAx9B,EAAStC,EAAE,oCAAoC,CAAC;AAAA,IAClD,UAAA;AACE,MAAAq5B,EAAW,EAAK;AAAA,IAClB;AAAA,EACF;AAEA,SAAIn4B,IAEA,gBAAAsD,EAAC,SAAI,WAAU,0CACb,4BAACsB,GAAA,EAAQ,WAAU,uDAAsD,EAAA,CAC3E,IAKF,gBAAAH,EAAC,OAAA,EAAI,WAAU,aAEZ,UAAA;AAAA,IAAAtD,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,MAC5D,gBAAA7f,EAAC,QAAA,EAAK,WAAU,oCAAoC,UAAAnC,GAAM;AAAA,MAC1D,gBAAAmC,EAAC,YAAO,SAAS,MAAMlC,EAAS,IAAI,GAAG,WAAU,qDAAoD,UAAA,IAAA,CAErG;AAAA,IAAA,GACF;AAAA,IAEDmd,KACC,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,yHACb,UAAA;AAAA,MAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,MAC5D,gBAAAvd,EAAC,QAAA,EAAK,WAAU,sCAAsC,UAAAib,GAAQ;AAAA,MAC9D,gBAAAjb,EAAC,YAAO,SAAS,MAAMkb,EAAW,IAAI,GAAG,WAAU,uDAAsD,UAAA,IAAA,CAEzG;AAAA,IAAA,GACF;AAAA,IAGF,gBAAA/Z,EAAC,OAAA,EAAI,WAAU,yCAEb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAAC6wB;AAAA,QAAA;AAAA,UACC,MAAM3d;AAAA,UACN,OAAO1X,EAAE,wCAAwC;AAAA,UACjD,aAAaA,EAAE,gDAAgD,EAAE,YAAA8D,GAAY;AAAA,UAE7E,UAAA,gBAAA6B,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,wCAAwC,GAC7C;AAAA,cACA,gBAAA2F;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOs4B;AAAA,kBACP,UAAU,CAACp4B,MAAM;AACf,0BAAMo6B,IAAcp6B,EAAE,OAAO;AAC7B,oBAAA84B,EAAYsB,CAAW,GACnBA,MAAgB,UAClBP,EAAe,EAAK;AAAA,kBAExB;AAAA,kBACA,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA,gBAAAl7B,EAAC,UAAA,EAAO,OAAM,cAAa,WAAU,uDAAsD,UAAA,cAE3F;AAAA,sCACC,UAAA,EAAO,OAAM,QAAO,WAAU,uDAAsD,UAAA,OAAA,CAErF;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAAA,EAAC,KAAA,EAAE,WAAU,kEACV,UACGxE,EADH4/B,KACK,8CACA,iDAD2C,EACM,CACzD;AAAA,YAAA,GACF;AAAA,YAGCA,MACC,gBAAAj6B,EAAAkC,IAAA,EAEE,UAAA;AAAA,cAAA,gBAAAlC,EAAC,OAAA,EAAI,WAAU,kHACb,UAAA;AAAA,gBAAA,gBAAAnB,EAACwT,IAAA,EAAa,WAAU,uDAAA,CAAuD;AAAA,gBAC/E,gBAAArS,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,QAAA,EAAM,UAAA;AAAA,oBAAA3F,EAAE,sCAAsC;AAAA,oBAAE;AAAA,kBAAA,GAAC;AAAA,kBAClD,gBAAAwE;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,KAAI;AAAA,sBACJ,WAAU;AAAA,sBAET,YAAE,sCAAsC;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC3C,EAAA,CACF;AAAA,cAAA,GACF;AAAA,gCAEC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,sCAAsC;AAAA,kBACzC,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,0CAA0C,EAAA,CAAG;AAAA,gBAAA,GACnE;AAAA,gBACA,gBAAAwE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAOo6B;AAAA,oBACP,UAAU,CAAC/4B,MAAM;AAAE,sBAAAg5B,EAAeh5B,EAAE,OAAO,KAAK,GAAG64B,EAAe,CAAAp7B,MAAQ;AAAE,8BAAM,EAAE,aAAa6qB,GAAG,GAAG+R,OAAS58B;AAAM,+BAAO48B;AAAA,sBAAM,CAAC;AAAA,oBAAG;AAAA,oBACvI,aAAY;AAAA,oBACZ,WAAW,2DAA2DL,GAAgB,aAAa,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAErGpB,EAAY,eAAe,gBAAAj6B,EAAC,OAAE,WAAU,yCAAyC,YAAY,YAAA,CAAY;AAAA,cAAA,GAC5G;AAAA,gCAEC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,uCAAuC;AAAA,kBAC1C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,2CAA2C,EAAA,CAAG;AAAA,gBAAA,GACpE;AAAA,gBACA,gBAAAwE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAOs6B;AAAA,oBACP,UAAU,CAACj5B,MAAM;AAAE,sBAAAk5B,GAAgBl5B,EAAE,OAAO,KAAK,GAAG64B,EAAe,CAAAp7B,MAAQ;AAAE,8BAAM,EAAE,cAAc6qB,GAAG,GAAG+R,OAAS58B;AAAM,+BAAO48B;AAAA,sBAAM,CAAC;AAAA,oBAAG;AAAA,oBACzI,aAAalgC,EAAE,kDAAkD;AAAA,oBACjE,WAAW,2DAA2D6/B,GAAgB,cAAc,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEtGpB,EAAY,gBAAgB,gBAAAj6B,EAAC,OAAE,WAAU,yCAAyC,YAAY,aAAA,CAAa;AAAA,cAAA,GAC9G;AAAA,gCAEC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,2CAA2C;AAAA,kBAC9C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,+CAA+C,EAAA,CAAG;AAAA,kBACrEiW,GAAQ,uBACP,gBAAAtQ,EAAC,QAAA,EAAK,WAAU,qEACd,UAAA;AAAA,oBAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,oBAChC/hB,EAAE,mBAAmB;AAAA,kBAAA,EAAA,CACxB;AAAA,gBAAA,GAEJ;AAAA,gBACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,kBAAA,gBAAAnB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAM+5B,IAAc,SAAS;AAAA,sBAC7B,cAAa;AAAA,sBACb,OAAOS;AAAA,sBACP,UAAU,CAACn5B,MAAM;AAAE,wBAAAo5B,EAAoBp5B,EAAE,OAAO,KAAK,GAAG64B,EAAe,CAAAp7B,MAAQ;AAAE,gCAAM,EAAE,kBAAkB6qB,GAAG,GAAG+R,OAAS58B;AAAM,iCAAO48B;AAAA,wBAAM,CAAC;AAAA,sBAAG;AAAA,sBACjJ,aAAajqB,GAAQ,sBAAsB,qBAAqBjW,EAAE,sDAAsD;AAAA,sBACxH,WAAW,iEAAiE6/B,GAAgB,kBAAkB,CAAC;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEjH,gBAAAr7B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAMg6B,EAAe,CAACD,CAAW;AAAA,sBAC1C,WAAU;AAAA,sBAET,UAAAA,sBAAejG,IAAA,EAAO,WAAU,WAAU,IAAK,gBAAA9zB,EAACwB,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC3E,GACF;AAAA,gBACCy4B,EAAY,oBAAoB,gBAAAj6B,EAAC,OAAE,WAAU,yCAAyC,YAAY,iBAAA,CAAiB;AAAA,cAAA,GACtH;AAAA,gCAEC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,uCAAuC;AAAA,kBAC1C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,2CAA2C,EAAA,CAAG;AAAA,gBAAA,GACpE;AAAA,gBACA,gBAAAwE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO06B;AAAA,oBACP,UAAU,CAACr5B,MAAM;AAAE,sBAAAs5B,GAAgBt5B,EAAE,OAAO,KAAK,GAAG64B,EAAe,CAAAp7B,MAAQ;AAAE,8BAAM,EAAE,cAAc6qB,GAAG,GAAG+R,OAAS58B;AAAM,+BAAO48B;AAAA,sBAAM,CAAC;AAAA,oBAAG;AAAA,oBACzI,aAAalgC,EAAE,kDAAkD;AAAA,oBACjE,WAAW,2DAA2D6/B,GAAgB,cAAc,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEtGpB,EAAY,gBAAgB,gBAAAj6B,EAAC,OAAE,WAAU,yCAAyC,YAAY,aAAA,CAAa;AAAA,cAAA,GAC9G;AAAA,gCAEC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,uCAAuC;AAAA,kBAC1C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,2CAA2C,EAAA,CAAG;AAAA,kBACjEiW,GAAQ,mBACP,gBAAAtQ,EAAC,QAAA,EAAK,WAAU,qEACd,UAAA;AAAA,oBAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,oBAChC/hB,EAAE,mBAAmB;AAAA,kBAAA,EAAA,CACxB;AAAA,gBAAA,GAEJ;AAAA,gBACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,kBAAA,gBAAAnB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAM+5B,IAAc,SAAS;AAAA,sBAC7B,cAAa;AAAA,sBACb,OAAOa;AAAA,sBACP,UAAU,CAACv5B,MAAM;AAAE,wBAAAw5B,EAAgBx5B,EAAE,OAAO,KAAK,GAAG64B,EAAe,CAAAp7B,MAAQ;AAAE,gCAAM,EAAE,cAAc6qB,GAAG,GAAG+R,OAAS58B;AAAM,iCAAO48B;AAAA,wBAAM,CAAC;AAAA,sBAAG;AAAA,sBACzI,aAAajqB,GAAQ,kBAAkB,qBAAqBjW,EAAE,kDAAkD;AAAA,sBAChH,WAAW,iEAAiE6/B,GAAgB,cAAc,CAAC;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAE7G,gBAAAr7B;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAMg6B,EAAe,CAACD,CAAW;AAAA,sBAC1C,WAAU;AAAA,sBAET,UAAAA,sBAAejG,IAAA,EAAO,WAAU,WAAU,IAAK,gBAAA9zB,EAACwB,IAAA,EAAI,WAAU,UAAA,CAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC3E,GACF;AAAA,gBACCy4B,EAAY,gBAAgB,gBAAAj6B,EAAC,OAAE,WAAU,yCAAyC,YAAY,aAAA,CAAa;AAAA,cAAA,GAC9G;AAAA,gCAGC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAmB,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,uCAAuC;AAAA,kBAC1C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,2CAA2C,EAAA,CAAG;AAAA,gBAAA,GACpE;AAAA,gBACA,gBAAAwE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,OAAO86B;AAAA,oBACP,UAAU,CAACz5B,MAAM05B,EAAgB15B,EAAE,OAAO,KAAK;AAAA,oBAC/C,aAAa7F,EAAE,kDAAkD;AAAA,oBACjE,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ,GACF;AAAA,gCAGC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAU,iFACd,UAAA;AAAA,kBAAA3F,EAAE,4CAA4C;AAAA,kBAC/C,gBAAAwE,EAAC45B,IAAA,EAAW,MAAMp+B,EAAE,gDAAgD,EAAA,CAAG;AAAA,gBAAA,GACzE;AAAA,gBACA,gBAAAwE;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,OAAOg7B;AAAA,oBACP,UAAU,CAAC35B,MAAM45B,EAAqB55B,EAAE,OAAO,KAAK;AAAA,oBACpD,aAAa7F,EAAE,uDAAuD;AAAA,oBACtE,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ,GACF;AAAA,cAGA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA,gBAAAmB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAASsyB;AAAA,kBACT,UAAUxB,KAAW,CAACmI,KAAe,CAACE,KAAiB,CAACE,MAAoB,CAAC/oB,GAAQ,uBAAwB,CAACipB,KAAiB,CAACE,KAAgB,CAACnpB,GAAQ;AAAA,kBACzJ,WAAU;AAAA,kBAET,UAAA;AAAA,oBAAAwgB,IAAU,gBAAAjyB,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAAC+zB,IAAA,EAAS,WAAU,UAAA,CAAU;AAAA,oBACvFv4B,EAAE,wCAAwC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA,GAE/C;AAAA,cAGC22B,uBACE,OAAA,EAAI,WAAW,2CACdA,EAAW,UACP,0DACA,mDACN,IACE,UAAA;AAAA,gBAAA,gBAAAhxB,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,kBAAAgxB,EAAW,4BACT5U,IAAA,EAAY,WAAU,sCAAqC,IAE5D,gBAAAvd,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,oCAE7D,QAAA,EAAK,WAAW,eAAesS,EAAW,UAAU,+BAA+B,0BAA0B,IAC3G,UAAAA,EAAW,UACR32B,EAAE,8CAA8C,IAChDA,EAAE,0CAA0C,EAAA,CAClD;AAAA,gBAAA,GACF;AAAA,gBACC,CAAC22B,EAAW,WAAWA,EAAW,kCAChC,KAAA,EAAE,WAAU,yCAAyC,UAAAA,EAAW,aAAA,CAAa;AAAA,cAAA,EAAA,CAElF;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAIF,gBAAAhxB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC6wB;AAAA,UAAA;AAAA,YACC,MAAMtuB;AAAA,YACN,OAAO/G,EAAE,oCAAoC;AAAA,YAC7C,aAAaA,EAAE,0CAA0C;AAAA,YAEzD,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,cAAA,gBAAAnB;AAAA,gBAACkxB;AAAA,gBAAA;AAAA,kBACC,SAASwI;AAAA,kBACT,UAAU,MAAMwB,EAAe,CAACxB,CAAW;AAAA,kBAC3C,OAAOl+B,EAAE,2CAA2C;AAAA,kBACpD,aAAaA,EAAE,iDAAiD;AAAA,kBAChE,UAAU,CAAC4/B;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEb,gBAAAj6B,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,gBAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,6DACd,UAAAxE,EAAE,4CAA4C,GACjD;AAAA,gBACA,gBAAA2F;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAOw4B;AAAA,oBACP,UAAU,CAACt4B,MAAM85B,GAAuB,OAAO95B,EAAE,OAAO,KAAK,CAAC;AAAA,oBAC9D,UAAU,CAAC+5B,MAAU,CAAC1B;AAAA,oBACtB,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAA,gBAAAv4B,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAI3F,EAAE,gBAAgB;AAAA,sBAAA,GAAE;AAAA,sBAC3G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAI3F,EAAE,gBAAgB;AAAA,sBAAA,GAAE;AAAA,sBAC3G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,IAAI,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAG3F,EAAE,aAAa;AAAA,sBAAA,GAAE;AAAA,sBACvG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAG3F,EAAE,cAAc;AAAA,sBAAA,GAAE;AAAA,sBACzG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAG3F,EAAE,cAAc;AAAA,sBAAA,GAAE;AAAA,sBACzG,gBAAA2F,EAAC,UAAA,EAAO,OAAO,KAAK,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAI3F,EAAE,cAAc;AAAA,sBAAA,GAAE;AAAA,sBAC1G,gBAAA2F,EAAC,UAAA,EAAO,OAAO,MAAM,WAAU,uDAAsD,UAAA;AAAA,wBAAA;AAAA,wBAAI3F,EAAE,cAAc;AAAA,sBAAA,EAAA,CAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC7G,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAIDiW,GAAQ,gBAAgB2pB,MACvB,gBAAAp7B;AAAA,UAAC6wB;AAAA,UAAA;AAAA,YACC,MAAM1J;AAAA,YACN,OAAO3rB,EAAE,0CAA0C;AAAA,YACnD,aAAaA,EAAE,gDAAgD;AAAA,YAC/D,QACE,gBAAA2F;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAASo1B;AAAA,gBACT,UAAU3B;AAAA,gBACV,WAAU;AAAA,gBAET,UAAA;AAAA,kBAAAA,IAAU,gBAAA50B,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACoV,IAAA,EAAU,WAAU,UAAA,CAAU;AAAA,kBACxF5Z,EAAE,4CAA4C;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAInD,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iGACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,oBAAA,gBAAAnB,EAACuC,IAAA,EAAM,WAAU,sCAAA,CAAsC;AAAA,sCACtD,QAAA,EAAK,WAAU,kDACb,UAAA/G,EAAE,6CAA6C,EAAA,CAClD;AAAA,kBAAA,GACF;AAAA,kBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCACV,YAAO,aACJ,IAAI,KAAKyR,EAAO,UAAU,EAAE,eAAA,IAC5BjW,EAAE,0CAA0C,EAAA,CAClD;AAAA,gBAAA,GACF;AAAA,gBAEA,gBAAA2F,EAAC,SAAI,WAAW,2CACdsQ,EAAO,gBACH,sDACA,uDACN,IACE,UAAA;AAAA,kBAAA,gBAAAtQ,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,oBAAAsQ,EAAO,kCACLoO,IAAA,EAAc,WAAU,oCAAmC,IAE5D,gBAAA7f,EAACud,IAAA,EAAY,WAAU,qCAAA,CAAqC;AAAA,oBAE9D,gBAAAvd,EAAC,QAAA,EAAK,WAAW,uBACfyR,EAAO,gBAAgB,6BAA6B,4BACtD,IACG,UAAAjW,EAAE,2CAA2C,EAAA,CAChD;AAAA,kBAAA,GACF;AAAA,kBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAW,WACZyR,EAAO,gBAAgB,6BAA6B,4BACtD,IACG,UAAAA,EAAO,iBAAiBjW,EAAE,4CAA4C,EAAA,CACzE;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA,GACF;AAAA,cAGCs5B,uBACE,OAAA,EAAI,WAAW,2CACdA,EAAe,UACX,0DACA,mDACN,IACE,UAAA;AAAA,gBAAA,gBAAA3zB,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,kBAAA2zB,EAAe,4BACbvX,IAAA,EAAY,WAAU,sCAAqC,IAE5D,gBAAAvd,EAAC6f,IAAA,EAAc,WAAU,mCAAA,CAAmC;AAAA,oCAE7D,QAAA,EAAK,WAAW,eAAeiV,EAAe,UAAU,+BAA+B,0BAA0B,IAC/G,UAAAA,EAAe,UACZt5B,EAAE,gDAAgD,IAClDA,EAAE,+CAA+C,EAAA,CACvD;AAAA,gBAAA,GACF;AAAA,gBACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2EACb,UAAA;AAAA,oBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CACb,UAAAxE,EAAE,mDAAmD,GACxD;AAAA,oBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,4CAA4C,YAAe,eAAA,CAAe;AAAA,kBAAA,GACzF;AAAA,kBACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2EACb,UAAA;AAAA,oBAAA,gBAAAnB,EAAC,QAAA,EAAK,WAAU,6CACb,UAAAxE,EAAE,kDAAkD,GACvD;AAAA,oBACA,gBAAAwE,EAAC,KAAA,EAAE,WAAW,iBAAiB80B,EAAe,gBAAgB,IAAI,6BAA6B,4BAA4B,IACxH,UAAAA,EAAe,cAAA,CAClB;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,GACF;AAAA,gBACCA,EAAe,gBACd,gBAAA90B,EAAC,OAAE,WAAU,yCAAyC,YAAe,aAAA,CAAa;AAAA,cAAA,EAAA,CAEtF;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,QAKJ,gBAAAA,EAAC,OAAA,EAAI,WAAU,kFACb,UAAA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASyb;AAAA,YACT,UAAU7B;AAAA,YACV,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,IAAS,gBAAA/a,EAACsB,KAAQ,WAAU,uBAAA,CAAuB,IAAK,gBAAAtB,EAACwd,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,cAClFhiB,EAAE,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EAClB,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACtvBA,MAAMykB,KAAa,CAAC,SAAS,SAAS;AAG/B,SAAS0b,KAAmC;AACjD,QAAM,EAAE,GAAAngC,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1C,EAAE,IAAIuI,EAAA,IAAamc,GAAA,GACnBzkB,IAAWC,GAAA,GACX,EAAE,WAAAykB,GAAW,cAAAC,EAAA,IAAiBC,GAA0B,SAASL,EAAU,GAE3EQ,IAAe1c,GAAgBC,CAAQ;AAU7C,MARAhJ,GAAU,MAAM;AACd,QAAI,CAACgJ,GAAU;AACb,MAAAtI,EAAS,yBAAyB;AAClC;AAAA,IACF;AACA,IAAA+kB,EAAa,WAAA;AAAA,EACf,GAAG,CAACzc,CAAQ,CAAC,GAETyc,EAAa;AACf,6BACG,OAAA,EAAI,WAAU,qDACb,UAAA,gBAAAtf,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsB,GAAA,EAAQ,WAAU,iEAAA,CAAiE;AAAA,wBACnF,KAAA,EAAE,WAAU,gCAAgC,UAAA9F,EAAE,gBAAgB,EAAA,CAAE;AAAA,IAAA,EAAA,CACnE,EAAA,CACF;AAIJ,MAAI,CAACilB,EAAa;AAChB,WACE,gBAAAtf,EAAC,OAAA,EAAI,WAAU,OACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAACmD;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,YACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,0BAAA;AAAA,UAA0B;AAAA,QACrE;AAAA,MAAA;AAAA,wBAED,OAAA,EAAI,WAAU,kGACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,0BAClC,QAAA,EAAM,UAAAY,EAAa,SAASjlB,EAAE,wBAAwB,EAAA,CAAE;AAAA,MAAA,EAAA,CAC3D,EAAA,CACF;AAAA,IAAA,GACF;AAIJ,QAAMwD,IAASyhB,EAAa;AAE5B,SACE,gBAAAtf,EAAC,OAAA,EAAI,WAAU,iBAEb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,0BAAA;AAAA,UACzC,EAAE,OAAOwD,EAAO,MAAM,MAAM,2BAA2BgF,CAAQ,GAAA;AAAA,UAC/D,EAAE,OAAOxI,EAAE,8BAA8B,EAAA;AAAA,QAAE;AAAA,MAC7C;AAAA,IAAA;AAAA,IAIF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMtE,EAAS,2BAA2BsI,CAAQ,EAAE;AAAA,UAC7D,WAAU;AAAA,UAEV,UAAA,gBAAAhE,EAAC6hB,IAAA,EAAU,WAAU,uCAAA,CAAuC;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9D,gBAAA1gB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,SAAI,WAAU,+DACb,4BAACkT,IAAA,EAAS,WAAU,0CAAyC,EAAA,CAC/D;AAAA,0BACC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAlT,EAAC,MAAA,EAAG,WAAU,4DACX,UAAAxE,EAAE,8BAA8B,GACnC;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,wCAAwC,YAAO,KAAA,CAAK;AAAA,QAAA,EAAA,CACnE;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGCygB,EAAa,SACZ,gBAAAzgB,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAA7f,EAAC,QAAA,EAAM,UAAAygB,EAAa,MAAA,CAAM;AAAA,IAAA,EAAA,CAC5B,EAAA,CACF;AAAA,IAIF,gBAAAzgB,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAAC,SAAI,WAAU,qBACZ,UAAAigB,GAAW,IAAI,CAAA6B,MACd,gBAAA9hB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMqgB,EAAayB,CAAG;AAAA,QAC/B,WAAW,0CACT1B,MAAc0B,IACV,8DACA,kFACN;AAAA,QAEC,UAAAtmB,EAAE,+BAA+BsmB,CAAG,EAAE;AAAA,MAAA;AAAA,MARlCA;AAAA,IAAA,CAUR,GACH,EAAA,CACF;AAAA,sBAGC,OAAA,EACE,UAAA;AAAA,MAAA1B,MAAc,WAAWpc,KACxB,gBAAAhE;AAAA,QAACi3B;AAAA,QAAA;AAAA,UACC,UAAAjzB;AAAA,UACA,YAAYhF,EAAO;AAAA,UACnB,YAAYA,EAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAItBohB,MAAc,aAAapc,KAC1B,gBAAAhE;AAAA,QAAC85B;AAAA,QAAA;AAAA,UACC,UAAA91B;AAAA,UACA,YAAYhF,EAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AC3HO,SAAS48B,KAAuC;AACrD,QAAM,EAAE,GAAApgC,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAE1C,CAACogC,GAAUC,CAAW,IAAI/gC,EAAkC,CAAA,CAAE,GAC9D,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkgB,GAASC,CAAU,IAAIngB,EAAwB,IAAI,GACpD,CAACghC,GAAYC,CAAa,IAAIjhC,EAAwC,CAAA,CAAE,GACxE,CAACkhC,GAAYC,CAAa,IAAInhC,EAA4B,IAAI,GAE9DohC,IAAe79B,EAAY,YAAY;AAC3C,QAAI;AACF,MAAA3B,EAAW,EAAI,GACfmB,EAAS,IAAI;AACb,YAAM6G,IAAO,MAAMy3B,GAAsB,OAAA;AACzC,MAAAN,EAAYn3B,CAAI;AAEhB,YAAM03B,IAAwC,CAAA;AAC9C,iBAAW5yB,KAAK9E;AACd,QAAA03B,EAAO5yB,EAAE,IAAI,IAAI;AAAA,UACf,MAAMA,EAAE;AAAA,UACR,UAAUA,EAAE;AAAA,UACZ,OAAOA,EAAE;AAAA,UACT,aAAaA,EAAE;AAAA,UACf,aAAaA,EAAE,eAAe;AAAA,QAAA;AAGlC,MAAAuyB,EAAcK,CAAM;AAAA,IACtB,QAAQ;AACN,MAAAv+B,EAAStC,EAAE,oCAAoC,CAAC;AAAA,IAClD,UAAA;AACE,MAAAmB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACnB,CAAC,CAAC;AAEN,EAAAR,GAAU,MAAM;AACd,IAAAmhC,EAAA;AAAA,EACF,GAAG,CAACA,CAAY,CAAC;AAEjB,QAAMvf,IAAa,OAAO0K,MAAqB;AAC7C,UAAMgV,IAAQP,EAAWzU,CAAI;AAC7B,QAAKgV;AAEL,UAAI;AACF,QAAAJ,EAAc5U,CAAI,GAClBxpB,EAAS,IAAI;AACb,cAAM2O,IAA2C;AAAA,UAC/C,MAAM6vB,EAAM;AAAA,UACZ,UAAUA,EAAM;AAAA,UAChB,OAAOA,EAAM;AAAA,UACb,aAAaA,EAAM;AAAA,UACnB,aAAaA,EAAM,eAAe;AAAA,QAAA;AAEpC,cAAMF,GAAsB,OAAO9U,GAAM7a,CAAO,GAChDyO,EAAW1f,EAAE,sCAAsC,CAAC,GACpD,WAAW,MAAM0f,EAAW,IAAI,GAAG,GAAI,GACvC,MAAMihB,EAAA;AAAA,MACR,QAAQ;AACN,QAAAr+B,EAAStC,EAAE,oCAAoC,CAAC;AAAA,MAClD,UAAA;AACE,QAAA0gC,EAAc,IAAI;AAAA,MACpB;AAAA,EACF,GAEMK,IAAkB,CAACjV,GAAc4L,GAA4Bl5B,MAAkB;AACnF,IAAAgiC,EAAc,CAACl9B,OAAU;AAAA,MACvB,GAAGA;AAAA,MACH,CAACwoB,CAAI,GAAG,EAAE,GAAGxoB,EAAKwoB,CAAI,GAAG,CAAC4L,CAAK,GAAGl5B,EAAA;AAAA,IAAM,EACxC;AAAA,EACJ,GAEMwiC,IAAa,CAAClV,MAA0B;AAC5C,UAAMmV,IAAWZ,EAAS,KAAK,CAACpyB,MAAMA,EAAE,SAAS6d,CAAI,GAC/CoV,IAAUX,EAAWzU,CAAI;AAC/B,WAAI,CAACmV,KAAY,CAACC,IAAgB,KAEhCD,EAAS,SAASC,EAAQ,QAC1BD,EAAS,UAAUC,EAAQ,SAC3BD,EAAS,gBAAgBC,EAAQ,gBAChCD,EAAS,eAAe,QAAQC,EAAQ;AAAA,EAE7C;AAEA,SAAIhgC,IAEA,gBAAAsD,EAAC,SAAI,WAAU,sDACb,4BAACsB,GAAA,EAAQ,WAAU,uDAAsD,EAAA,CAC3E,IAKF,gBAAAH,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,0BAAA;AAAA,UACzC,EAAE,OAAOA,EAAE,gCAAgC,EAAA;AAAA,QAAE;AAAA,MAC/C;AAAA,IAAA;AAAA,IAGF,gBAAAwE;AAAA,MAACoD;AAAA,MAAA;AAAA,QACC,OAAO5H,EAAE,gCAAgC;AAAA,QACzC,UAAUA,EAAE,mCAAmC;AAAA,QAC/C,MAAM,gBAAAwE,EAAC28B,IAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGpC9+B,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,qCAAA,CAAqC;AAAA,MAC9D,gBAAA7f,EAAC,KAAA,EAAE,WAAU,gBAAgB,UAAAnC,EAAA,CAAM;AAAA,IAAA,GACrC;AAAA,IAGDod,KACC,gBAAA9Z,EAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,MAAA,gBAAAnB,EAACud,IAAA,EAAY,WAAU,uCAAA,CAAuC;AAAA,MAC9D,gBAAAvd,EAAC,KAAA,EAAE,WAAU,kBAAkB,UAAAib,EAAA,CAAQ;AAAA,IAAA,GACzC;AAAA,sBAGD,OAAA,EAAI,WAAU,yCACZ,UAAA4gB,EAAS,IAAI,CAACe,MAAY;AACzB,YAAMN,IAAQP,EAAWa,EAAQ,IAAI;AACrC,UAAI,CAACN,EAAO,QAAO;AAEnB,YAAMO,IAAc56B,GAAcq6B,EAAM,IAAI,GACtCQ,IAAgB36B,GAAgBm6B,EAAM,KAAK;AAEjD,aACE,gBAAAn7B;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAGV,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAW,yDAAyD88B,EAAc,EAAE,IACvF,UAAA,gBAAA98B,EAAC68B,GAAA,EAAY,WAAW,WAAWC,EAAc,IAAI,IAAI,GAC3D;AAAA,gCACC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAA98B,EAAC,MAAA,EAAG,WAAU,oDAAoD,UAAAs8B,EAAM,aAAY;AAAA,gBACpF,gBAAAt8B,EAAC,KAAA,EAAE,WAAU,uCAAuC,YAAQ,KAAA,CAAK;AAAA,cAAA,EAAA,CACnE;AAAA,YAAA,GACF;AAAA,8BAGC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,sCAAsC,GAC3C;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOs8B,EAAM;AAAA,kBACb,UAAU,CAACj7B,MAAMk7B,EAAgBK,EAAQ,MAAM,eAAev7B,EAAE,OAAO,KAAK;AAAA,kBAC5E,WAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACZ,GACF;AAAA,8BAGC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAArB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,+BAA+B,GACpC;AAAA,cACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,gBAAA,gBAAAnB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAOs8B,EAAM;AAAA,oBACb,UAAU,CAACj7B,MAAMk7B,EAAgBK,EAAQ,MAAM,QAAQv7B,EAAE,OAAO,KAAK;AAAA,oBACrE,WAAU;AAAA,oBAET,UAAA07B,GAAA,EAAwB,IAAI,CAAClY,MAC5B,gBAAA7kB,EAAC,UAAA,EAAkB,OAAO6kB,GAAO,UAAAA,EAAA,GAApBA,CAAyB,CACvC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEH,gBAAA7kB,EAACwD,IAAA,EAAY,WAAU,8GAAA,CAA8G;AAAA,cAAA,EAAA,CACvI;AAAA,YAAA,GACF;AAAA,8BAGC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAxD,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,gCAAgC,GACrC;AAAA,cACA,gBAAAwE,EAAC,SAAI,WAAU,wBACZ,eAAqB,IAAI,CAACwrB,MAAU;AACnC,sBAAMwR,IAAe76B,GAAgBqpB,CAAK;AAC1C,uBACE,gBAAAxrB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,SAAS,MAAMu8B,EAAgBK,EAAQ,MAAM,SAASpR,CAAK;AAAA,oBAC3D,WAAW,wEAAwEwR,EAAa,EAAE,IAChGV,EAAM,UAAU9Q,IAAQ,wDAAwD,EAClF;AAAA,oBACA,OAAOA;AAAA,oBAEP,UAAA,gBAAAxrB,EAAC,OAAA,EAAI,WAAW,wBAAwBg9B,EAAa,KAAK,QAAQ,SAAS,KAAK,CAAC,GAAA,CAAI;AAAA,kBAAA;AAAA,kBAPhFxR;AAAA,gBAAA;AAAA,cAUX,CAAC,EAAA,CACH;AAAA,YAAA,GACF;AAAA,8BAGC,OAAA,EACC,UAAA;AAAA,cAAA,gBAAAxrB,EAAC,SAAA,EAAM,WAAU,+DACd,UAAAxE,EAAE,sCAAsC,GAC3C;AAAA,cACA,gBAAAwE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOs8B,EAAM;AAAA,kBACb,UAAU,CAACj7B,MAAMk7B,EAAgBK,EAAQ,MAAM,eAAev7B,EAAE,OAAO,KAAK;AAAA,kBAC5E,MAAM;AAAA,kBACN,WAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACZ,GACF;AAAA,YAGA,gBAAAF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMyb,EAAWggB,EAAQ,IAAkB;AAAA,gBACpD,UAAU,CAACJ,EAAWI,EAAQ,IAAI,KAAKX,MAAeW,EAAQ;AAAA,gBAC9D,WAAU;AAAA,gBAET,UAAA;AAAA,kBAAAX,MAAeW,EAAQ,OACtB,gBAAA58B,EAACsB,GAAA,EAAQ,WAAU,wBAAuB,IAE1C,gBAAAtB,EAACwd,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,kBAE3BhiB,EAAE,aAAa;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAClB;AAAA,QAAA;AAAA,QA/FKohC,EAAQ;AAAA,MAAA;AAAA,IAkGnB,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;ACzPA,MAAMK,KAAiG;AAAA,EACrG,SAAS;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAEf;AAEO,SAASC,KAAsC;AACpD,QAAM,EAAE,GAAA1hC,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1CC,IAAWC,GAAA,GAEX,CAACwhC,GAAeC,CAAgB,IAAIriC,EAAoC,CAAA,CAAE,GAC1E,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACwC,GAAMC,CAAO,IAAIzC,EAAS,CAAC,GAC5B,CAACm+B,CAAQ,IAAIn+B,EAAS,EAAE,GACxB,CAAC0C,GAAYC,CAAa,IAAI3C,EAAS,CAAC,GACxC,CAACyV,GAAQ6sB,CAAS,IAAItiC,EAAS,EAAE,GACjC,CAACuiC,GAAoBC,CAAqB,IAAIxiC,EAAqC,KAAK,GAExFyiC,IAAoBl/B,EAAY,OAAOm/B,MAAyB;AACpE,IAAA9gC,EAAW,EAAI,GACfmB,EAAS,IAAI;AACb,QAAI;AACF,YAAMS,IAAS,MAAMC,EAAS,cAAc,OAAO;AAAA,QACjD,MAAAjB;AAAA,QACA,UAAA27B;AAAA,QACA,QAAQ1oB,KAAU;AAAA,QAClB,oBAAoB8sB,MAAuB,QAAQA,IAAqB;AAAA,MAAA,CACzE;AACD,MAAKG,GAAQ,YACXL,EAAiB7+B,EAAO,KAAK,GAC7Bb,EAAc,KAAK,KAAKa,EAAO,aAAa26B,CAAQ,CAAC;AAAA,IAEzD,SAASz6B,GAAK;AACZ,MAAKg/B,GAAQ,YACX,QAAQ,MAAM,iCAAiCh/B,CAAG,GAClDX,EAAStC,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,IAEnD,UAAA;AACE,MAAKiiC,GAAQ,WACX9gC,EAAW,EAAK;AAAA,IAEpB;AAAA,EACF,GAAG,CAACY,GAAM27B,GAAU1oB,GAAQ8sB,GAAoB9hC,CAAC,CAAC;AAElD,EAAAR,GAAU,MAAM;AACd,UAAM0iC,IAAkB,IAAI,gBAAA;AAC5B,WAAAF,EAAkBE,EAAgB,MAAM,GACjC,MAAMA,EAAgB,MAAA;AAAA,EAC/B,GAAG,CAACF,CAAiB,CAAC;AAEtB,QAAMG,IAAqB,CAACt8B,MAA2C;AACrE,IAAAg8B,EAAUh8B,EAAE,OAAO,KAAK,GACxB7D,EAAQ,CAAC;AAAA,EACX,GAEMogC,IAAgD,CAAC,OAAO,WAAW,YAAY,UAAU,GAEzF5nB,IAAsD;AAAA,IAC1D;AAAA,MACE,KAAK;AAAA,MACL,OAAOxa,EAAE,oCAAoC,MAAM;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ,CAACopB,MACP,gBAAAzjB,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,0CAA0C,UAAA4kB,EAAI,MAAK;AAAA,QACjEA,EAAI,aACH,gBAAA5kB,EAAC,SAAI,WAAU,wCAAwC,YAAI,UAAA,CAAU;AAAA,MAAA,EAAA,CAEzE;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,uCAAuC,SAAS;AAAA,MACzD,UAAU;AAAA,IAAA;AAAA,IAEZ;AAAA,MACE,KAAK;AAAA,MACL,OAAOA,EAAE,0CAA0C,aAAa;AAAA,MAChE,UAAU;AAAA,MACV,QAAQ,CAACopB,MACP,gBAAA5kB,EAAC,UAAK,WAAU,wCAAwC,YAAI,mBAAA,CAAmB;AAAA,IAAA;AAAA,IAGnF;AAAA,MACE,KAAK;AAAA,MACL,OAAOxE,EAAE,sCAAsC,QAAQ;AAAA,MACvD,UAAU;AAAA,MACV,QAAQ,CAACopB,MACP,gBAAA5kB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,4EACTi9B,GAA2BrY,EAAI,kBAAkB,EAAE,OACrD,IAAIqY,GAA2BrY,EAAI,kBAAkB,EAAE,SAAS;AAAA,UAE/D,UAAAppB;AAAA,YACC,8BAA8BopB,EAAI,mBAAmB,YAAA,CAAa;AAAA,YAClEA,EAAI;AAAA,UAAA;AAAA,QACN;AAAA,MAAA;AAAA,IACF;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOppB,EAAE,uCAAuC,SAAS;AAAA,MACzD,UAAU;AAAA,MACV,QAAQ,CAACopB,MACP,gBAAA5kB,EAAC,QAAA,EAAK,WAAU,gCACb,UAAA,IAAI,KAAK4kB,EAAI,SAAS,EAAE,qBAAmB,CAC9C;AAAA,IAAA;AAAA,IAGJ;AAAA,MACE,KAAK;AAAA,MACL,OAAOppB,EAAE,uCAAuC,SAAS;AAAA,MACzD,OAAO;AAAA,MACP,QAAQ,CAACopB,MACP,gBAAAzjB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,CAACE,MAAM;AACd,YAAAA,EAAE,gBAAA,GACF3F,EAAS,0DAA0DkpB,EAAI,EAAE,EAAE;AAAA,UAC7E;AAAA,UACA,WAAU;AAAA,UACV,OAAOppB,EAAE,oCAAoC,yCAAyC;AAAA,UAEtF,UAAA;AAAA,YAAA,gBAAAwE,EAAC3E,IAAA,EAAS,WAAU,cAAA,CAAc;AAAA,YACjCG,EAAE,0CAA0C,eAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9D;AAAA,EAEJ;AAGF,SACE,gBAAA2F,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,UACzC,EAAE,OAAOA,EAAE,6BAA6B,eAAe,EAAA;AAAA,QAAE;AAAA,MAC3D;AAAA,IAAA;AAAA,IAGF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,QAAG,WAAU,iDACX,UAAAxE,EAAE,6BAA6B,eAAe,GACjD;AAAA,0BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,mCAAmC,+CAA+C,EAAA,CACvF;AAAA,MAAA,GACF;AAAA,MACA,gBAAA2F;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMzF,EAAS,8CAA8C;AAAA,UACtE,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAsE,EAACyT,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YACzBjY,EAAE,iBAAiB,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9B,GACF;AAAA,IAEA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAaxE,EAAE,iBAAiB,QAAQ;AAAA,YACxC,OAAOgV;AAAA,YACP,UAAUmtB;AAAA,YACV,WAAU;AAAA,UAAA;AAAA,QAAA,GAEd;AAAA,0BAEC,OAAA,EAAI,WAAU,wBACZ,UAAAC,EAAc,IAAI,CAACv9B,MAClB,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,cAAAu9B,EAAsBl9B,CAAM,GAC5B7C,EAAQ,CAAC;AAAA,YACX;AAAA,YACA,WAAW,qEACT8/B,MAAuBj9B,IACnB,4CACA,gFACN;AAAA,YAEC,UAAAA,MAAW,QAAQ7E,EAAE,cAAc,KAAK,IAAIA,EAAE,8BAA8B6E,EAAO,YAAA,CAAa,IAAIA,CAAM;AAAA,UAAA;AAAA,UAXtGA;AAAA,QAAA,CAaR,EAAA,CACH;AAAA,MAAA,GACF;AAAA,MAECxC,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,UACnC,gBAAA7f,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,QAAA,GACf;AAAA,QACA,gBAAAmC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMw9B,EAAA;AAAA,YACf,WAAU;AAAA,YAET,UAAAhiC,EAAE,gBAAgB,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5B,GACF;AAAA,MAGF,gBAAAwE;AAAA,QAACyW;AAAA,QAAA;AAAA,UACC,MAAM0mB;AAAA,UACN,SAAAnnB;AAAA,UACA,SAAAtZ;AAAA,UACA,WAAW,CAACutB,MAASA,EAAK;AAAA,UAC1B,YAAY,CAACA,MAASvuB,EAAS,yCAAyCuuB,EAAK,EAAE,EAAE;AAAA,UACjF,cAAczuB,EAAE,6BAA6B,wBAAwB;AAAA,QAAA;AAAA,MAAA;AAAA,MAGtE,CAACkB,KAAWygC,EAAc,SAAS,KAClC,gBAAAh8B,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,UAAA3F,EAAE,eAAe,MAAM;AAAA,UAAE;AAAA,UAAE+B;AAAA,UAAK;AAAA,UAAE/B,EAAE,aAAa,IAAI;AAAA,UAAE;AAAA,UAAEiC;AAAA,QAAA,GAC5D;AAAA,QACA,gBAAA0D,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMxC,EAAQ,KAAK,IAAI,GAAGD,IAAO,CAAC,CAAC;AAAA,cAC5C,UAAUA,MAAS;AAAA,cACnB,WAAU;AAAA,cAET,UAAA/B,EAAE,mBAAmB,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAElC,gBAAAwE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAMxC,EAAQ,KAAK,IAAIC,GAAYF,IAAO,CAAC,CAAC;AAAA,cACrD,UAAUA,KAAQE;AAAA,cAClB,WAAU;AAAA,cAET,UAAAjC,EAAE,eAAe,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1B,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AC5PA,MAAMyhC,KAAiG;AAAA,EACrG,SAAS;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAEf,GAGMhd,KAAwB,CAAC,QAAQ,WAAW,SAAS;AAEpD,SAAS4d,KAAuC;AACrD,QAAM,EAAE,GAAAriC,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1C,EAAE,IAAIqiC,EAAA,IAAU3d,GAAA,GAChBzkB,IAAWC,GAAA,GACX,CAACC,GAAcC,CAAe,IAAIC,GAAA,GAElC,CAACgrB,GAAciX,CAAe,IAAIhjC,EAAiC,IAAI,GACvE,CAAC2B,GAASC,CAAU,IAAI5B,EAAS,EAAI,GACrC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAACkC,GAAeC,CAAgB,IAAInC,EAAS,EAAK,GAGlDijC,IAAgB,MAAe;AACnC,UAAMC,IAAWriC,EAAa,IAAI,KAAK;AACvC,WAAIqiC,KAAYhe,GAAW,SAASge,CAAmB,IAC9CA,IAEF;AAAA,EACT,GAEM,CAAC7d,GAAWC,CAAY,IAAItlB,EAAkBijC,CAAa,GAG3D,CAACE,GAAaC,CAAc,IAAIpjC,EAA2C;AAAA,IAC/E,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,CACR,GACK,CAACqjC,GAAaC,CAAc,IAAItjC,EAA4C;AAAA,IAChF,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT;AAGD,EAAAC,GAAU,MAAM;AACd,IAAIolB,MAAc,SACZxkB,EAAa,IAAI,KAAK,MACxBA,EAAa,OAAO,KAAK,GACzBC,EAAgBD,GAAc,EAAE,SAAS,GAAA,CAAM,KAExCA,EAAa,IAAI,KAAK,MAAMwkB,KACrCvkB,EAAgB,EAAE,KAAKukB,EAAA,GAAa,EAAE,SAAS,IAAM;AAAA,EAEzD,GAAG,CAACA,GAAWxkB,GAAcC,CAAe,CAAC;AAE7C,QAAMyiC,IAAmBhgC,EAAY,YAAY;AAC/C,QAAI,CAACw/B,GAAO;AACV,MAAApiC,EAAS,uCAAuC;AAChD;AAAA,IACF;AACA,IAAAiB,EAAW,EAAI,GACfmB,EAAS,IAAI;AACb,QAAI;AACF,YAAM6G,IAAO,MAAMnG,EAAS,cAAc,QAAQs/B,CAAK;AACvD,MAAAC,EAAgBp5B,CAAI;AAAA,IACtB,SAASlG,GAAK;AACZ,cAAQ,MAAM,gCAAgCA,CAAG,GACjDX,EAAStC,EAAE,iCAAiC,6BAA6B,CAAC;AAAA,IAC5E,UAAA;AACE,MAAAmB,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACmhC,GAAOpiC,GAAUF,CAAC,CAAC;AAEvB,EAAAR,GAAU,MAAM;AACd,IAAAsjC,EAAA;AAAA,EACF,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAMC,IAAe,YAAY;AAC/B,QAAKzX,GACL;AAAA,MAAA5pB,EAAiB,EAAI;AACrB,UAAI;AACF,cAAMs+B,IAAU,MAAMh9B,EAAS,cAAc,OAAOsoB,EAAa,IAAIoX,EAAY,SAAS,MAAS;AACnG,QAAAH,EAAgBvC,CAAO,GACvB2C,EAAe,EAAE,MAAM,IAAO,OAAO,IAAI;AAAA,MAC3C,SAAS1/B,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG,GACnDX,EAAStC,EAAE,mCAAmC,+BAA+B,CAAC;AAAA,MAChF,UAAA;AACE,QAAA0B,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAEMshC,IAAe,YAAY;AAC/B,QAAK1X,GACL;AAAA,MAAA5pB,EAAiB,EAAI;AACrB,UAAI;AACF,cAAMs+B,IAAU,MAAMh9B,EAAS,cAAc,OAAOsoB,EAAa,IAAIsX,EAAY,MAAM;AACvF,QAAAL,EAAgBvC,CAAO,GACvB6C,EAAe,EAAE,MAAM,IAAO,QAAQ,IAAI;AAAA,MAC5C,SAAS5/B,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG,GACnDX,EAAStC,EAAE,mCAAmC,+BAA+B,CAAC;AAAA,MAChF,UAAA;AACE,QAAA0B,EAAiB,EAAK;AAAA,MACxB;AAAA;AAAA,EACF,GAEMuhC,IAAiB3X,MAAiBA,EAAa,SAASA,EAAa,SAASA,EAAa;AAEjG,MAAIpqB;AACF,6BACG,OAAA,EAAI,WAAU,sDACb,UAAA,gBAAAyE,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAnB,EAACsB,GAAA,EAAQ,WAAU,iEAAA,CAAiE;AAAA,wBACnF,KAAA,EAAE,WAAU,gCAAgC,UAAA9F,EAAE,kBAAkB,SAAS,EAAA,CAAE;AAAA,IAAA,EAAA,CAC9E,EAAA,CACF;AAIJ,MAAI,CAACsrB;AACH,WACE,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,OACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAACmD;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,YACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,YACzC,EAAE,OAAOA,EAAE,6BAA6B,eAAe,GAAG,MAAM,wCAAA;AAAA,UAAwC;AAAA,QAC1G;AAAA,MAAA;AAAA,MAEF,gBAAA2F,EAAC,OAAA,EAAI,WAAU,kGACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,4BAClC,QAAA,EAAM,UAAAhiB,KAASrC,EAAE,gCAAgC,wBAAwB,EAAA,CAAE;AAAA,QAAA,GAC9E;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASs+B;AAAA,YACT,WAAU;AAAA,YAET,UAAA9iC,EAAE,gBAAgB,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5B,EAAA,CACF;AAAA,IAAA,GACF;AAIJ,QAAM4G,IAAe66B,GAA2BnW,EAAa,kBAAkB;AAE/E,SACE,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,UACzC,EAAE,OAAOA,EAAE,6BAA6B,eAAe,GAAG,MAAM,wCAAA;AAAA,UAChE,EAAE,OAAOsrB,EAAa,KAAA;AAAA,QAAK;AAAA,MAC7B;AAAA,IAAA;AAAA,IAGF,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMtE,EAAS,uCAAuC;AAAA,YAC/D,WAAU;AAAA,YAEV,UAAA,gBAAAsE,EAAC6hB,IAAA,EAAU,WAAU,uCAAA,CAAuC;AAAA,UAAA;AAAA,QAAA;AAAA,0BAE7D,OAAA,EACC,UAAA;AAAA,UAAA,gBAAA7hB,EAAC,MAAA,EAAG,WAAU,iDAAiD,UAAA8mB,EAAa,MAAK;AAAA,UACjF,gBAAA9mB,EAAC,KAAA,EAAE,WAAU,wCAAwC,YAAa,mBAAA,CAAmB;AAAA,QAAA,EAAA,CACvF;AAAA,MAAA,GACF;AAAA,wBACC,QAAA,EAAK,WAAW,+DAA+DoC,EAAa,OAAO,IAAIA,EAAa,SAAS,IAC3H,UAAA5G,EAAE,8BAA8BsrB,EAAa,mBAAmB,YAAA,CAAa,IAAIA,EAAa,kBAAkB,EAAA,CACnH;AAAA,IAAA,GACF;AAAA,IAECjpB,KACC,gBAAAsD,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,QACnC,gBAAA7f,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,MAAA,GACf;AAAA,MACA,gBAAAmC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASs+B;AAAA,UACT,WAAU;AAAA,UAET,UAAA9iC,EAAE,gBAAgB,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAC5B,GACF;AAAA,IAGF,gBAAAwE,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACZ,UAAAigB,GAAW,IAAI,CAAC6B,MACf,gBAAA9hB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMqgB,EAAayB,CAAG;AAAA,QAC/B,WAAW,0CACT1B,MAAc0B,IACV,8DACA,kFACN;AAAA,QAEC,UAAAtmB,EAAE,4BAA4BsmB,CAAG,IAAIA,CAAG;AAAA,MAAA;AAAA,MARpCA;AAAA,IAAA,CAUR,GACH,EAAA,CACF;AAAA,IAEC1B,MAAc,UACb,gBAAAjf,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,iCAAiC,mBAAmB,GACzD;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,KAAA,CAAK;AAAA,QAAA,GACpE;AAAA,QACC8mB,EAAa,aACZ,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,sCAAsC,YAAY,GACvD;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,UAAA,CAAU;AAAA,QAAA,GACzE;AAAA,QAEF,gBAAAmB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,oCAAoC,SAAS,GAClD;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,YAAA,CAAY;AAAA,QAAA,GAC3E;AAAA,QACA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,SAAA,EAAM,WAAU,8EACd,UAAA8mB,EAAa,wBAChB;AAAA,UACA,gBAAA9mB,EAAC,KAAA,EAAE,WAAU,6CAA6C,YAAa,mBAAA,CAAmB;AAAA,QAAA,GAC5F;AAAA,QACC8mB,EAAa,aACZ,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,UAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,sCAAsC,YAAY,GACvD;AAAA,UACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,UAAA,CAAU;AAAA,QAAA,EAAA,CACzE;AAAA,MAAA,GAEJ;AAAA,MAEC8mB,EAAa,uBAAuB,cACnC,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,mBACX,UAAA;AAAA,SAAA2lB,EAAa,uBAAuB,aAAaA,EAAa,uBAAuB,eACrF,gBAAA3lB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMg9B,EAAe,EAAE,MAAM,IAAM,OAAO,IAAI;AAAA,YACvD,UAAUlhC;AAAA,YACV,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA+C,EAACwY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,cAC1Bhd,EAAE,8BAA8B,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAG5CsrB,EAAa,uBAAuB,aACnC,gBAAA3lB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMk9B,EAAe,EAAE,MAAM,IAAM,QAAQ,IAAI;AAAA,YACxD,UAAUphC;AAAA,YACV,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,gBAAA+C,EAACwS,IAAA,EAAE,WAAU,UAAA,CAAU;AAAA,cACtBhX,EAAE,8BAA8B,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC3C,EAAA,CAEJ;AAAA,IAAA,GAEJ;AAAA,IAGD4kB,MAAc,cACbqe,IACE,gBAAAt9B,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,MAAA2lB,EAAa,SACZ,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,kCAAkC,OAAO,GAC9C;AAAA,QACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,MAAA,CAAM;AAAA,MAAA,GACrE;AAAA,MAED8mB,EAAa,SACZ,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,kCAAkC,OAAO,GAC9C;AAAA,QACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAa,MAAA,CAAM;AAAA,MAAA,GACrE;AAAA,MAED8mB,EAAa,WACZ,gBAAA3lB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,oCAAoC,SAAS,GAClD;AAAA,QACA,gBAAAwE,EAAC,KAAA,EAAE,WAAU,6CAA6C,YAAa,QAAA,CAAQ;AAAA,MAAA,EAAA,CACjF;AAAA,IAAA,EAAA,CAEJ,sBAEC,OAAA,EAAI,WAAU,kDACZ,UAAAxE,EAAE,iCAAiC,kCAAkC,EAAA,CACxE;AAAA,IAIH4kB,MAAc,cACb0G,EAAa,UACX,gBAAA9mB,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAnB,EAAC,WAAM,WAAU,8EACd,UAAAxE,EAAE,oCAAoC,SAAS,GAClD;AAAA,0BACC,KAAA,EAAE,WAAU,8BAA8B,UAAAsrB,EAAa,QAAQ,QAAO;AAAA,QACtEA,EAAa,QAAQ,WACpB,gBAAA9mB,EAAC,OAAE,WAAU,8BAA8B,UAAA8mB,EAAa,QAAQ,QAAA,CAAQ;AAAA,MAAA,GAE5E;AAAA,wBACC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAA3lB,EAAC,KAAA,EAAE,WAAU,8BACV,UAAA;AAAA,UAAA2lB,EAAa,QAAQ;AAAA,UAAW;AAAA,UAAEA,EAAa,QAAQ;AAAA,QAAA,GAC1D;AAAA,QACCA,EAAa,QAAQ,SACpB,gBAAA9mB,EAAC,OAAE,WAAU,8BAA8B,UAAA8mB,EAAa,QAAQ,MAAA,CAAM;AAAA,MAAA,GAE1E;AAAA,MACA,gBAAA9mB,EAAC,OAAA,EACC,UAAA,gBAAAmB,EAAC,KAAA,EAAE,WAAU,8BACV,UAAA;AAAA,QAAA2lB,EAAa,QAAQ;AAAA,QAAQ;AAAA,QAAGA,EAAa,QAAQ;AAAA,QAAY;AAAA,MAAA,EAAA,CACpE,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF,IAEA,gBAAA9mB,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAAxE,EAAE,iCAAiC,kCAAkC,EAAA,CACxE;AAAA,IAIH0iC,EAAY,QACX,gBAAAl+B,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,QAAG,WAAU,qDACX,UAAAxE,EAAE,mCAAmC,qBAAqB,GAC7D;AAAA,MACA,gBAAAwE,EAAC,OAAA,EAAI,WAAU,kBACb,4BAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAA,EAAC,WAAM,WAAU,mDACd,UAAAxE,EAAE,mCAAmC,kBAAkB,GAC1D;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOk+B,EAAY;AAAA,YACnB,UAAU,CAAC78B,MAAM88B,EAAe,EAAE,GAAGD,GAAa,OAAO78B,EAAE,OAAO,OAAO;AAAA,YACzE,WAAU;AAAA,YACV,MAAM;AAAA,YACN,aAAa7F,EAAE,8CAA8C,8BAA8B;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7F,EAAA,CACF,EAAA,CACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMm+B,EAAe,EAAE,MAAM,IAAO,OAAO,IAAI;AAAA,YACxD,WAAU;AAAA,YAET,UAAA3iC,EAAE,iBAAiB,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9B,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASu+B;AAAA,YACT,UAAUthC;AAAA,YACV,WAAU;AAAA,YAET,cAAgBzB,EAAE,iBAAiB,QAAQ,IAAIA,EAAE,8BAA8B,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1F,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAGD4iC,EAAY,QACX,gBAAAp+B,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC,QAAG,WAAU,qDACX,UAAAxE,EAAE,mCAAmC,qBAAqB,GAC7D;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,QAAA,gBAAAnB,EAAC,WAAM,WAAU,mDACd,UAAAxE,EAAE,oCAAoC,QAAQ,GACjD;AAAA,QACA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOo+B,EAAY;AAAA,YACnB,UAAU,CAAC/8B,MAAMg9B,EAAe,EAAE,GAAGD,GAAa,QAAQ/8B,EAAE,OAAO,OAAO;AAAA,YAC1E,WAAU;AAAA,YACV,MAAM;AAAA,YACN,aAAa7F,EAAE,+CAA+C,2CAA2C;AAAA,UAAA;AAAA,QAAA;AAAA,MAC3G,GACF;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAMq+B,EAAe,EAAE,MAAM,IAAO,QAAQ,IAAI;AAAA,YACzD,WAAU;AAAA,YAET,UAAA7iC,EAAE,iBAAiB,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9B,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASw+B;AAAA,YACT,UAAUvhC;AAAA,YACV,WAAU;AAAA,YAET,cAAgBzB,EAAE,iBAAiB,QAAQ,IAAIA,EAAE,8BAA8B,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MAC1F,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;ACtaA,MAAMkjC,KAKD;AAAA,EACH,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,aAAa,WAAW,SAAS,eAAe,WAAW,OAAA;AAAA,EACrF,IAAI,EAAE,OAAO,CAAC,SAAS,OAAO,GAAG,aAAa,SAAS,SAAS,UAAU,WAAW,MAAA;AAAA,EACrF,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,GAAG,aAAa,OAAO,SAAS,WAAW,WAAW,MAAA;AAAA,EAChF,IAAI,EAAE,OAAO,CAAC,SAAS,GAAG,aAAa,WAAW,SAAS,WAAW,WAAW,MAAA;AAAA,EACjF,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,aAAa,OAAO,SAAS,eAAe,WAAW,MAAA;AAAA,EAC7E,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,aAAa,OAAO,SAAS,SAAS,WAAW,MAAA;AAAA,EACvE,IAAI,EAAE,OAAO,CAAC,YAAY,GAAG,aAAa,cAAc,SAAS,SAAS,WAAW,MAAA;AAAA,EACrF,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,aAAa,OAAO,SAAS,kBAAkB,WAAW,MAAA;AAClF;AA2CO,SAASC,GAAuB;AAAA,EACrC,MAAAh6B;AAAA,EACA,UAAAysB;AAAA,EACA,uBAAAwN;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,WAAA7N,IAAY;AACd,GAA8C;AAC5C,QAAM,EAAE,GAAAz1B,GAAG,MAAAujC,EAAA,IAAStjC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAGhD,CAACwU,GAAeC,CAAgB,IAAInV,EAAS,EAAK,GAClD,CAACoV,GAAaC,CAAc,IAAIrV,EAAwB,IAAI,GAC5D,CAACsV,GAAeC,CAAgB,IAAIvV,EAAS,EAAK,GAGlDiW,IAAkB,CAAChX,MAA0B;AACjD,UAAMiX,IAAUjX,EAAM,YAAA,EAAc,QAAQ,cAAc,EAAE;AAC5D,QAAIkX,IAASD,EAAQ,WAAW,KAAK,IAAIA,EAAQ,MAAM,CAAC,IAAIA,EAAQ,QAAQ,WAAW,EAAE;AAGzF,WAFAC,IAASA,EAAO,MAAM,GAAG,CAAC,GAEtBA,EAAO,WAAW,IAAU,SAC5BA,EAAO,UAAU,IAAU,OAAOA,CAAM,KACxCA,EAAO,UAAU,IAAU,OAAOA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,CAAC,CAAC,KACpE,OAAOA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,IAAIA,EAAO,MAAM,CAAC,CAAC;AAAA,EAC3E,GAGM8tB,IAAe,MAAc;AAEjC,YADaD,EAAK,UAAU,UAAU,GAAG,CAAC,EAAE,YAAA,GACpC;AAAA,MACN,KAAK;AAAM,eAAO;AAAA,MAClB,KAAK;AAAM,eAAO;AAAA,MAClB,KAAK;AAAM,eAAO;AAAA,MAClB;AAAS,eAAO;AAAA,IAAA;AAAA,EAEpB,GAEM5tB,IAAyB,CAACnX,MAAkB;AAChD,QAAIilC,IAAWjlC;AACf,IAAI2K,EAAK,gBAAgB,SACvBs6B,IAAWjuB,EAAgBhX,CAAK,IAElCo3B,EAAS,EAAE,GAAGzsB,GAAM,oBAAoBs6B,GAAU,gBAAgB,IAAO,GACzE7uB,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAAA,EACxB,GAEMiB,IAAsB,CAACC,MAAwB;AACnD,UAAMC,IAASitB,GAAuBltB,CAAW;AACjD,IAAIC,KACF2f,EAAS;AAAA,MACP,GAAGzsB;AAAA,MACH,aAAA6M;AAAA,MACA,wBAAwBC,EAAO;AAAA,MAC/B,oBAAoBD,MAAgB,OAAO,SAAS;AAAA,MACpD,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,GAAG7M,EAAK;AAAA,QACR,aAAA6M;AAAA,QACA,SAASC,EAAO;AAAA,MAAA;AAAA,IAClB,CACD,GAEHrB,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAAA,EACxB;AAGA,EAAAtV,GAAU,MAAM;AACd,IAAI2J,EAAK,gBAAgB,SAAS,CAACA,EAAK,sBAAsBA,EAAK,uBAAuB,OACxFysB,EAAS,EAAE,GAAGzsB,GAAM,oBAAoB,QAAQ;AAAA,EAEpD,GAAG,CAACA,EAAK,WAAW,CAAC;AAErB,QAAMgiB,IAAe,YAAY;AAC/B,UAAMtV,IAAY1M,EAAK,mBAAmB,QAAQ,WAAW,EAAE;AAC/D,QAAI,CAACA,EAAK,sBAAsB0M,EAAU,SAAS,KAAK1M,EAAK,gBAAgB,MAAM;AACjF,MAAAyL,EAAe5U,EAAE,+CAA+C,+CAA+C,CAAC;AAChH;AAAA,IACF;AAEA,IAAA0U,EAAiB,EAAI,GACrBE,EAAe,IAAI,GACnBE,EAAiB,EAAK;AAEtB,QAAI;AACF,YAAM/R,IAAS,MAAMC,EAAS,cAAc,OAAOmG,EAAK,aAAaA,EAAK,kBAAkB,GAGtFu6B,IAAoC;AAAA,QACxC,GAAGv6B;AAAA,QACH,MAAMpG,EAAO,QAAQoG,EAAK;AAAA,QAC1B,WAAWpG,EAAO,aAAaoG,EAAK;AAAA,QACpC,WAAWpG,EAAO,YAAY,GAAGA,EAAO,SAAS,IAAIygC,EAAA,CAAc,KAAKr6B,EAAK;AAAA,QAC7E,OAAOpG,EAAO,SAASoG,EAAK;AAAA,QAC5B,OAAOpG,EAAO,SAASoG,EAAK;AAAA,QAC5B,SAASpG,EAAO,WAAWoG,EAAK;AAAA,QAChC,gBAAgB;AAAA,QAChB,SAAS;AAAA,UACP,QAAQpG,EAAO,UAAUoG,EAAK,QAAQ;AAAA,UACtC,SAASpG,EAAO,WAAWoG,EAAK,QAAQ;AAAA,UACxC,YAAYpG,EAAO,cAAcoG,EAAK,QAAQ;AAAA,UAC9C,MAAMpG,EAAO,QAAQoG,EAAK,QAAQ;AAAA,UAClC,OAAOpG,EAAO,SAASoG,EAAK,QAAQ;AAAA,UACpC,SAASpG,EAAO,WAAWoG,EAAK,QAAQ;AAAA,UACxC,aAAapG,EAAO,eAAeoG,EAAK,QAAQ;AAAA,QAAA;AAAA,MAClD;AAGF,MAAAysB,EAAS8N,CAAW,GAGhBN,KAAyBrgC,EAAO,QAClCqgC,EAAsBrgC,EAAO,IAAI,GAGnC+R,EAAiB,EAAI,GACrB,WAAW,MAAMA,EAAiB,EAAK,GAAG,GAAI;AAAA,IAChD,SAAS7R,GAAc;AACrB,cAAQ,MAAM,0BAA0BA,CAAG;AAC3C,YAAM6S,IAAe7S,aAAe,QAAQA,EAAI,UAAU;AAC1D,MAAI6S,EAAa,SAAS,KAAK,KAAKA,EAAa,SAAS,WAAW,IACnElB,EAAe5U,EAAE,2CAA2C,+BAA+B,CAAC,IACnF8V,EAAa,SAAS,aAAa,KAAKA,EAAa,SAAS,KAAK,IAC5ElB,EAAe5U,EAAE,8CAA8C,iCAAiC,CAAC,IAEjG4U,EAAe5U,EAAE,2CAA2C,+BAA+B,CAAC;AAAA,IAEhG,UAAA;AACE,MAAA0U,EAAiB,EAAK;AAAA,IACxB;AAAA,EACF,GAEMivB,IAAaN,IACf,gNACA,qPAEEO,IAAkB,8DAElBC,IAAa,CAACC,MAClBA,IAAW,GAAGH,CAAU,IAAIC,CAAe,KAAKD,GAE5CI,IAAa;AAEnB,SACE,gBAAAp+B,EAAC,OAAA,EAAI,WAAW,aAAa8vB,CAAS,IAEpC,UAAA;AAAA,IAAA,gBAAA9vB,EAAC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAA,EAAC,SAAA,EAAM,WAAWo+B,GACf,UAAA;AAAA,QAAA/jC,EAAE,wCAAwC,mBAAmB;AAAA,QAAE;AAAA,MAAA,GAClE;AAAA,MACA,gBAAAwE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO2E,EAAK;AAAA,UACZ,UAAU,CAACtD,MAAM+vB,EAAS,EAAE,GAAGzsB,GAAM,MAAMtD,EAAE,OAAO,OAAO;AAAA,UAC3D,WAAWg+B,EAAWP,KAAa,CAACn6B,EAAK,KAAK,MAAM;AAAA,UACpD,aAAanJ,EAAE,mDAAmD,yBAAyB;AAAA,QAAA;AAAA,MAAA;AAAA,MAE5FsjC,KAAa,CAACn6B,EAAK,KAAK,KAAA,KACvB,gBAAA3E,EAAC,KAAA,EAAE,WAAU,yCAAyC,UAAAxE,EAAE,8BAA8B,wBAAwB,EAAA,CAAE;AAAA,IAAA,GAEpH;AAAA,sBAGC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAWo+B,GACf,UAAA;AAAA,QAAA/jC,EAAE,2CAA2C,SAAS;AAAA,QAAE;AAAA,MAAA,GAC3D;AAAA,MACA,gBAAAwE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO2E,EAAK;AAAA,UACZ,UAAU,CAACtD,MAAMkQ,EAAoBlQ,EAAE,OAAO,KAAK;AAAA,UACnD,WAAW89B;AAAA,UAEV,UAAA,OAAO,QAAQT,EAAsB,EAAE,IAAI,CAAC,CAACxP,GAAMzd,CAAM,MACxD,gBAAAtQ,EAAC,UAAA,EAAkB,OAAO+tB,GAAO,UAAA;AAAA,YAAAzd,EAAO;AAAA,YAAQ;AAAA,YAAGyd;AAAA,YAAK;AAAA,UAAA,EAAA,GAA3CA,CAA4C,CAC1D;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GACF;AAAA,sBAGC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAA/tB,EAAC,SAAA,EAAM,WAAWo+B,GACf,UAAA;AAAA,QAAA56B,EAAK;AAAA,QAAuB;AAAA,MAAA,GAC/B;AAAA,MACA,gBAAAxD,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO2E,EAAK;AAAA,YACZ,UAAU,CAACtD,MAAM8P,EAAuB9P,EAAE,OAAO,KAAK;AAAA,YACtD,WAAW,UAAU89B,CAAU;AAAA,YAC/B,aAAax6B,EAAK,gBAAgB,OAAO,oBAAoBnJ,EAAE,yDAAyD,kBAAkB;AAAA,UAAA;AAAA,QAAA;AAAA,QAG3ImJ,EAAK,gBAAgB,QACpB,gBAAA3E;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS2mB;AAAA,YACT,UAAU1W,KAAiB,CAACtL,EAAK,sBAAsBA,EAAK,mBAAmB,QAAQ,WAAW,EAAE,EAAE,SAAS;AAAA,YAC/G,WAAU;AAAA,YACV,OAAOnJ,EAAE,0CAA0C,oBAAoB;AAAA,YAEtE,UAAAyU,sBACE3O,GAAA,EAAQ,WAAU,wBAAuB,IAE1C,gBAAAtB,EAACuD,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAEhC,GAEJ;AAAA,MAEC4M,KACC,gBAAAhP,EAAC,KAAA,EAAE,WAAU,iEACX,UAAA;AAAA,QAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,QAClC1P;AAAA,MAAA,GACH;AAAA,MAEDE,KACC,gBAAAlP,EAAC,KAAA,EAAE,WAAU,mEACX,UAAA;AAAA,QAAA,gBAAAnB,EAACwY,IAAA,EAAM,WAAU,UAAA,CAAU;AAAA,QAC1Bhd,EAAE,4CAA4C,oCAAoC;AAAA,MAAA,GACrF;AAAA,MAEDmJ,EAAK,gBAAgB,QAAQ,CAACwL,KAAe,CAACE,KAC7C,gBAAArQ,EAAC,KAAA,EAAE,WAAU,4CACV,UAAA2E,EAAK,mBAAmB,QAAQ,WAAW,EAAE,EAAE,SAAS,IACrDnJ,EAAE,mDAAmD,uCAAuC,IAC5FA,EAAE,yCAAyC,6CAA6C,EAAA,CAC9F;AAAA,IAAA,GAEJ;AAAA,IAGA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,SAAA,EAAM,WAAWo+B,GACf,UAAA;AAAA,QAAA/jC,EAAE,2CAA2C,SAAS;AAAA,QAAE;AAAA,MAAA,GAC3D;AAAA,wBACC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAwE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO2E,EAAK,QAAQ;AAAA,YACpB,UAAU,CAACtD,MAAM+vB,EAAS,EAAE,GAAGzsB,GAAM,SAAS,EAAE,GAAGA,EAAK,SAAS,QAAQtD,EAAE,OAAO,MAAA,GAAS;AAAA,YAC3F,WAAWg+B,EAAWP,KAAa,CAACn6B,EAAK,QAAQ,OAAO,MAAM;AAAA,YAC9D,aAAanJ,EAAE,qDAAqD,gBAAgB;AAAA,UAAA;AAAA,QAAA;AAAA,QAErFsjC,KAAa,CAACn6B,EAAK,QAAQ,OAAO,KAAA,KACjC,gBAAA3E,EAAC,KAAA,EAAE,WAAU,yCAAyC,UAAAxE,EAAE,8BAA8B,wBAAwB,EAAA,CAAE;AAAA,MAAA,GAEpH;AAAA,MACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO2E,EAAK,QAAQ;AAAA,cACpB,UAAU,CAACtD,MAAM+vB,EAAS,EAAE,GAAGzsB,GAAM,SAAS,EAAE,GAAGA,EAAK,SAAS,YAAYtD,EAAE,OAAO,MAAA,GAAS;AAAA,cAC/F,WAAWg+B,EAAWP,KAAa,CAACn6B,EAAK,QAAQ,WAAW,MAAM;AAAA,cAClE,aAAanJ,EAAE,yDAAyD,aAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAEtFsjC,KAAa,CAACn6B,EAAK,QAAQ,WAAW,KAAA,KACrC,gBAAA3E,EAAC,KAAA,EAAE,WAAU,yCAAyC,UAAAxE,EAAE,8BAA8B,wBAAwB,EAAA,CAAE;AAAA,QAAA,GAEpH;AAAA,QACA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,UAAA,gBAAAnB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO2E,EAAK,QAAQ;AAAA,cACpB,UAAU,CAACtD,MAAM+vB,EAAS,EAAE,GAAGzsB,GAAM,SAAS,EAAE,GAAGA,EAAK,SAAS,MAAMtD,EAAE,OAAO,MAAA,GAAS;AAAA,cACzF,WAAWg+B,EAAWP,KAAa,CAACn6B,EAAK,QAAQ,KAAK,MAAM;AAAA,cAC5D,aAAanJ,EAAE,mDAAmD,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAEzEsjC,KAAa,CAACn6B,EAAK,QAAQ,KAAK,KAAA,KAC/B,gBAAA3E,EAAC,KAAA,EAAE,WAAU,yCAAyC,UAAAxE,EAAE,8BAA8B,wBAAwB,EAAA,CAAE;AAAA,QAAA,EAAA,CAEpH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,sBAGC,OAAA,EACC,UAAA;AAAA,MAAA,gBAAA2F,EAAC,SAAA,EAAM,WAAWo+B,GACf,UAAA;AAAA,QAAA/jC,EAAE,6CAA6C,YAAY;AAAA,QAAE;AAAA,QAAGA,EAAE,mBAAmB,UAAU;AAAA,QAAE;AAAA,MAAA,GACpG;AAAA,MACA,gBAAAwE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO2E,EAAK,aAAa;AAAA,UACzB,UAAU,CAACtD,MAAM+vB,EAAS,EAAE,GAAGzsB,GAAM,WAAWtD,EAAE,OAAO,SAAS,OAAA,CAAW;AAAA,UAC7E,WAAW89B;AAAA,UACX,aAAax6B,EAAK,gBAAgB,OAAO,mBAAmBq6B,EAAA,CAAc,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhFr6B,EAAK,gBAAgB,QACpB,gBAAA3E,EAAC,KAAA,EAAE,WAAU,4CACV,UAAAxE,EAAE,sCAAsC,yEAAyE,EAAA,CACpH;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAGO,SAASgkC,KAAsD;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;AAGO,SAASC,GAA4B96B,GAAuD;AACjG,SAAO;AAAA,IACL,MAAMA,EAAK;AAAA,IACX,WAAWA,EAAK;AAAA,IAChB,aAAaA,EAAK;AAAA,IAClB,wBAAwBA,EAAK;AAAA,IAC7B,oBAAoBA,EAAK;AAAA,IACzB,WAAWA,EAAK;AAAA,IAChB,OAAOA,EAAK;AAAA,IACZ,OAAOA,EAAK;AAAA,IACZ,SAASA,EAAK;AAAA,IACd,gBAAgBA,EAAK,kBAAkB;AAAA,IACvC,SAAS;AAAA,MACP,QAAQA,EAAK,QAAQ;AAAA,MACrB,SAASA,EAAK,QAAQ,WAAW;AAAA,MACjC,YAAYA,EAAK,QAAQ;AAAA,MACzB,MAAMA,EAAK,QAAQ;AAAA,MACnB,OAAOA,EAAK,QAAQ,SAAS;AAAA,MAC7B,SAASA,EAAK,QAAQ;AAAA,MACtB,aAAaA,EAAK,QAAQ;AAAA,IAAA;AAAA,EAC5B;AAEJ;AChZO,SAAS+6B,KAAuC;AACrD,QAAM,EAAE,GAAAlkC,EAAA,IAAMC,GAAe,CAAC,SAAS,QAAQ,CAAC,GAC1CC,IAAWC,GAAA,GAEX,CAACgkC,GAAUC,CAAW,IAAI7kC,EAA+BykC,IAA+B,GACxF,CAAC9iC,GAASC,CAAU,IAAI5B,EAAS,EAAK,GACtC,CAAC8C,GAAOC,CAAQ,IAAI/C,EAAwB,IAAI,GAChD,CAAC+jC,GAAWe,CAAY,IAAI9kC,EAAS,EAAK,GAE1C+kC,IAAUH,EAAS,KAAK,UAAUA,EAAS,QAAQ,OAAO,KAAA,KAAUA,EAAS,QAAQ,KAAK,KAAA,KAAUA,EAAS,QAAQ,WAAW,KAAA,GAEhI5Y,IAAe,OAAO1lB,MAAuB;AAIjD,QAHAA,EAAE,eAAA,GACFw+B,EAAa,EAAI,GAEb,EAACC,GAEL;AAAA,MAAAnjC,EAAW,EAAI,GACfmB,EAAS,IAAI;AAEb,UAAI;AACF,cAAM2O,IAAUgzB,GAA4BE,CAAQ,GAC9C1nB,IAAU,MAAMzZ,EAAS,cAAc,OAAOiO,CAAO;AAC3D,QAAA/Q,EAAS,yCAAyCuc,EAAQ,EAAE,EAAE;AAAA,MAChE,SAASxZ,GAAK;AACZ,gBAAQ,MAAM,kCAAkCA,CAAG,GACnDX;AAAA,UACEW,aAAe,QACXA,EAAI,UACJjD,EAAE,mCAAmC,+BAA+B;AAAA,QAAA;AAAA,MAE5E,UAAA;AACE,QAAAmB,EAAW,EAAK;AAAA,MAClB;AAAA;AAAA,EACF;AAEA,SACE,gBAAAwE,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,gBAAAnB;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,EAAE,OAAO3H,EAAE,oBAAoB,GAAG,MAAM,kBAAA;AAAA,UACxC,EAAE,OAAOA,EAAE,qBAAqB,GAAG,MAAM,+BAAA;AAAA,UACzC,EAAE,OAAOA,EAAE,6BAA6B,eAAe,GAAG,MAAM,wCAAA;AAAA,UAChE,EAAE,OAAOA,EAAE,iBAAiB,QAAQ,EAAA;AAAA,QAAE;AAAA,MACxC;AAAA,IAAA;AAAA,sBAGD,OAAA,EAAI,WAAU,2CACb,UAAA,gBAAA2F,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,MAAMtE,EAAS,uCAAuC;AAAA,UAC/D,WAAU;AAAA,UAEV,UAAA,gBAAAsE,EAAC6hB,IAAA,EAAU,WAAU,uCAAA,CAAuC;AAAA,QAAA;AAAA,MAAA;AAAA,wBAE7D,OAAA,EACC,UAAA;AAAA,QAAA,gBAAA7hB,EAAC,QAAG,WAAU,iDACX,UAAAxE,EAAE,8BAA8B,qBAAqB,GACxD;AAAA,0BACC,KAAA,EAAE,WAAU,wCACV,UAAAA,EAAE,yCAAyC,sCAAsC,EAAA,CACpF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAECqC,uBACE,OAAA,EAAI,WAAU,6FACb,UAAA,gBAAAsD,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAnB,EAAC6f,IAAA,EAAc,WAAU,UAAA,CAAU;AAAA,MACnC,gBAAA7f,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,IAAA,EAAA,CACf,EAAA,CACF;AAAA,IAGF,gBAAAsD,EAAC,QAAA,EAAK,UAAU4lB,GAAc,WAAU,aACtC,UAAA;AAAA,MAAA,gBAAA/mB,EAAC,OAAA,EAAI,WAAU,4FACb,UAAA,gBAAAA,EAAC2+B,IAAA,EAAuB,MAAMgB,GAAU,UAAUC,GAAa,WAAAd,EAAA,CAAsB,EAAA,CACvF;AAAA,MAEA,gBAAA39B,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAnB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAMtE,EAAS,uCAAuC;AAAA,YAC/D,WAAU;AAAA,YAET,UAAAF,EAAE,iBAAiB,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9B,gBAAA2F;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAUzE;AAAA,YACV,WAAU;AAAA,YAET,UAAA;AAAA,cAAAA,KAAW,gBAAAsD,EAACsB,GAAA,EAAQ,WAAU,uBAAA,CAAuB;AAAA,cACrD5E,IAAUlB,EAAE,iBAAiB,QAAQ,IAAIA,EAAE,iBAAiB,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACvE,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}